KVM: s390: Make psw available on all exits, not just a subset
[pandora-kernel.git] / arch / s390 / kvm / kvm-s390.c
index 5445058..f8bcaef 100644 (file)
@@ -117,10 +117,16 @@ long kvm_arch_dev_ioctl(struct file *filp,
 
 int kvm_dev_ioctl_check_extension(long ext)
 {
+       int r;
+
        switch (ext) {
+       case KVM_CAP_S390_PSW:
+               r = 1;
+               break;
        default:
-               return 0;
+               r = 0;
        }
+       return r;
 }
 
 /* Section: vm related */
@@ -420,8 +426,10 @@ static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw)
        vcpu_load(vcpu);
        if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING)
                rc = -EBUSY;
-       else
-               vcpu->arch.sie_block->gpsw = psw;
+       else {
+               vcpu->run->psw_mask = psw.mask;
+               vcpu->run->psw_addr = psw.addr;
+       }
        vcpu_put(vcpu);
        return rc;
 }
@@ -509,9 +517,6 @@ rerun_vcpu:
 
        switch (kvm_run->exit_reason) {
        case KVM_EXIT_S390_SIEIC:
-               vcpu->arch.sie_block->gpsw.mask = kvm_run->s390_sieic.mask;
-               vcpu->arch.sie_block->gpsw.addr = kvm_run->s390_sieic.addr;
-               break;
        case KVM_EXIT_UNKNOWN:
        case KVM_EXIT_INTR:
        case KVM_EXIT_S390_RESET:
@@ -520,6 +525,9 @@ rerun_vcpu:
                BUG();
        }
 
+       vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
+       vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
+
        might_fault();
 
        do {
@@ -539,8 +547,6 @@ rerun_vcpu:
                /* intercept cannot be handled in-kernel, prepare kvm-run */
                kvm_run->exit_reason         = KVM_EXIT_S390_SIEIC;
                kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
-               kvm_run->s390_sieic.mask     = vcpu->arch.sie_block->gpsw.mask;
-               kvm_run->s390_sieic.addr     = vcpu->arch.sie_block->gpsw.addr;
                kvm_run->s390_sieic.ipa      = vcpu->arch.sie_block->ipa;
                kvm_run->s390_sieic.ipb      = vcpu->arch.sie_block->ipb;
                rc = 0;
@@ -552,6 +558,9 @@ rerun_vcpu:
                rc = 0;
        }
 
+       kvm_run->psw_mask     = vcpu->arch.sie_block->gpsw.mask;
+       kvm_run->psw_addr     = vcpu->arch.sie_block->gpsw.addr;
+
        if (vcpu->sigset_active)
                sigprocmask(SIG_SETMASK, &sigsaved, NULL);