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 ec60cf7..1c8f33f 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 13b3f5e..e1e375c 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 77c22d6..28ea0ca 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 */