KVM: s390: Avoid endless loops of specification exceptions
authorThomas Huth <thuth@linux.vnet.ibm.com>
Thu, 17 Apr 2014 07:57:10 +0000 (09:57 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 16 May 2014 12:57:19 +0000 (14:57 +0200)
If the new PSW for program interrupts is invalid, the VM ends up
in an endless loop of specification exceptions. Since there is not
much left we can do in this case, we should better drop to userspace
instead so that the crash can be reported to the user.

Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/kvm/intercept.c

index bd607cf01a5d2459202e43ac0d46ea9e652c13b8..ddc69f5f5e1992066358cd6f38a74e2e89ef72d1 100644 (file)
@@ -195,6 +195,7 @@ static int handle_itdb(struct kvm_vcpu *vcpu)
 static int handle_prog(struct kvm_vcpu *vcpu)
 {
        struct kvm_s390_pgm_info pgm_info;
+       psw_t psw;
        int rc;
 
        vcpu->stat.exit_program_interruption++;
@@ -207,7 +208,14 @@ static int handle_prog(struct kvm_vcpu *vcpu)
        }
 
        trace_kvm_s390_intercept_prog(vcpu, vcpu->arch.sie_block->iprcc);
-
+       if (vcpu->arch.sie_block->iprcc == PGM_SPECIFICATION) {
+               rc = read_guest_lc(vcpu, __LC_PGM_NEW_PSW, &psw, sizeof(psw_t));
+               if (rc)
+                       return rc;
+               /* Avoid endless loops of specification exceptions */
+               if (!is_valid_psw(&psw))
+                       return -EOPNOTSUPP;
+       }
        rc = handle_itdb(vcpu);
        if (rc)
                return rc;