|
@@ -147,8 +147,21 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void __skey_check_enable(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE)))
|
|
|
+ return;
|
|
|
+
|
|
|
+ s390_enable_skey();
|
|
|
+ trace_kvm_s390_skey_related_inst(vcpu);
|
|
|
+ vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static int handle_skey(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
+ __skey_check_enable(vcpu);
|
|
|
+
|
|
|
vcpu->stat.instruction_storage_key++;
|
|
|
|
|
|
if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
|
|
@@ -618,6 +631,7 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
|
|
|
}
|
|
|
|
|
|
if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
|
|
|
+ __skey_check_enable(vcpu);
|
|
|
if (set_guest_storage_key(current->mm, useraddr,
|
|
|
vcpu->run->s.regs.gprs[reg1] & PFMF_KEY,
|
|
|
vcpu->run->s.regs.gprs[reg1] & PFMF_NQ))
|