]> git.karo-electronics.de Git - linux-beck.git/commitdiff
KVM: s390: enable SRS only if enabled for the guest
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Fri, 4 Mar 2016 11:23:55 +0000 (12:23 +0100)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Mon, 9 May 2016 11:33:55 +0000 (13:33 +0200)
If we don't have SIGP SENSE RUNNING STATUS enabled for the guest, let's
not enable interpretation so we can correctly report an invalid order.

Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/include/asm/sigp.h
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/sigp.c

index ec60cf7fa0a247ec7f13d70480c3312386823096..1c8f33fca356ebae01ad04271f2f4f7d54278903 100644 (file)
@@ -27,6 +27,7 @@
 
 /* SIGP cpu status bits */
 
+#define SIGP_STATUS_INVALID_ORDER      0x00000002UL
 #define SIGP_STATUS_CHECK_STOP         0x00000010UL
 #define SIGP_STATUS_STOPPED            0x00000040UL
 #define SIGP_STATUS_EXT_CALL_PENDING   0x00000080UL
index 13b3f5eb49be7b85ca17482a07777932a3a8d5f6..e1e375c8010cc2d20414cf4f8f336a0e1062d866 100644 (file)
@@ -1645,7 +1645,9 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
 
        kvm_s390_vcpu_setup_model(vcpu);
 
-       vcpu->arch.sie_block->ecb   = 6;
+       vcpu->arch.sie_block->ecb = 0x02;
+       if (test_kvm_facility(vcpu->kvm, 9))
+               vcpu->arch.sie_block->ecb |= 0x04;
        if (test_kvm_facility(vcpu->kvm, 50) && test_kvm_facility(vcpu->kvm, 73))
                vcpu->arch.sie_block->ecb |= 0x10;
 
index 77c22d685c7a150a8ecfdccbfca1ec60f08698af..28ea0cab1f1b50c3f3b12ce63055f4c30ebc5293 100644 (file)
@@ -240,6 +240,12 @@ static int __sigp_sense_running(struct kvm_vcpu *vcpu,
        struct kvm_s390_local_interrupt *li;
        int rc;
 
+       if (!test_kvm_facility(vcpu->kvm, 9)) {
+               *reg &= 0xffffffff00000000UL;
+               *reg |= SIGP_STATUS_INVALID_ORDER;
+               return SIGP_CC_STATUS_STORED;
+       }
+
        li = &dst_vcpu->arch.local_int;
        if (atomic_read(li->cpuflags) & CPUSTAT_RUNNING) {
                /* running */