|
@@ -117,10 +117,16 @@ long kvm_arch_dev_ioctl(struct file *filp,
|
|
|
|
|
|
int kvm_dev_ioctl_check_extension(long ext)
|
|
int kvm_dev_ioctl_check_extension(long ext)
|
|
{
|
|
{
|
|
|
|
+ int r;
|
|
|
|
+
|
|
switch (ext) {
|
|
switch (ext) {
|
|
|
|
+ case KVM_CAP_S390_PSW:
|
|
|
|
+ r = 1;
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
- return 0;
|
|
|
|
|
|
+ r = 0;
|
|
}
|
|
}
|
|
|
|
+ return r;
|
|
}
|
|
}
|
|
|
|
|
|
/* Section: vm related */
|
|
/* 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);
|
|
vcpu_load(vcpu);
|
|
if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING)
|
|
if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING)
|
|
rc = -EBUSY;
|
|
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);
|
|
vcpu_put(vcpu);
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
@@ -509,9 +517,6 @@ rerun_vcpu:
|
|
|
|
|
|
switch (kvm_run->exit_reason) {
|
|
switch (kvm_run->exit_reason) {
|
|
case KVM_EXIT_S390_SIEIC:
|
|
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_UNKNOWN:
|
|
case KVM_EXIT_INTR:
|
|
case KVM_EXIT_INTR:
|
|
case KVM_EXIT_S390_RESET:
|
|
case KVM_EXIT_S390_RESET:
|
|
@@ -520,6 +525,9 @@ rerun_vcpu:
|
|
BUG();
|
|
BUG();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
|
|
|
|
+ vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
|
|
|
|
+
|
|
might_fault();
|
|
might_fault();
|
|
|
|
|
|
do {
|
|
do {
|
|
@@ -539,8 +547,6 @@ rerun_vcpu:
|
|
/* intercept cannot be handled in-kernel, prepare kvm-run */
|
|
/* intercept cannot be handled in-kernel, prepare kvm-run */
|
|
kvm_run->exit_reason = KVM_EXIT_S390_SIEIC;
|
|
kvm_run->exit_reason = KVM_EXIT_S390_SIEIC;
|
|
kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
|
|
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.ipa = vcpu->arch.sie_block->ipa;
|
|
kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
|
|
kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
|
|
rc = 0;
|
|
rc = 0;
|
|
@@ -552,6 +558,9 @@ rerun_vcpu:
|
|
rc = 0;
|
|
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)
|
|
if (vcpu->sigset_active)
|
|
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
|
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
|
|
|
|