|
@@ -117,6 +117,8 @@ static int prepare_cpuflags(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
|
|
newflags |= cpuflags & CPUSTAT_SM;
|
|
newflags |= cpuflags & CPUSTAT_SM;
|
|
if (test_kvm_cpu_feat(vcpu->kvm, KVM_S390_VM_CPU_FEAT_IBS))
|
|
if (test_kvm_cpu_feat(vcpu->kvm, KVM_S390_VM_CPU_FEAT_IBS))
|
|
newflags |= cpuflags & CPUSTAT_IBS;
|
|
newflags |= cpuflags & CPUSTAT_IBS;
|
|
|
|
+ if (test_kvm_cpu_feat(vcpu->kvm, KVM_S390_VM_CPU_FEAT_KSS))
|
|
|
|
+ newflags |= cpuflags & CPUSTAT_KSS;
|
|
|
|
|
|
atomic_set(&scb_s->cpuflags, newflags);
|
|
atomic_set(&scb_s->cpuflags, newflags);
|
|
return 0;
|
|
return 0;
|
|
@@ -289,7 +291,9 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
|
|
* bits. Therefore we cannot provide interpretation and would later
|
|
* bits. Therefore we cannot provide interpretation and would later
|
|
* have to provide own emulation handlers.
|
|
* have to provide own emulation handlers.
|
|
*/
|
|
*/
|
|
- scb_s->ictl |= ICTL_ISKE | ICTL_SSKE | ICTL_RRBE;
|
|
|
|
|
|
+ if (!(atomic_read(&scb_s->cpuflags) & CPUSTAT_KSS))
|
|
|
|
+ scb_s->ictl |= ICTL_ISKE | ICTL_SSKE | ICTL_RRBE;
|
|
|
|
+
|
|
scb_s->icpua = scb_o->icpua;
|
|
scb_s->icpua = scb_o->icpua;
|
|
|
|
|
|
if (!(atomic_read(&scb_s->cpuflags) & CPUSTAT_SM))
|
|
if (!(atomic_read(&scb_s->cpuflags) & CPUSTAT_SM))
|
|
@@ -627,7 +631,7 @@ static int pin_blocks(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
|
|
rc = set_validity_icpt(scb_s, 0x10b0U);
|
|
rc = set_validity_icpt(scb_s, 0x10b0U);
|
|
if (rc)
|
|
if (rc)
|
|
goto unpin;
|
|
goto unpin;
|
|
- scb_s->sdnxo = hpa;
|
|
|
|
|
|
+ scb_s->sdnxo = hpa | sdnxc;
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
unpin:
|
|
unpin:
|