Commit ca76ec9c authored by Janosch Frank's avatar Janosch Frank Committed by Christian Borntraeger

KVM: s390: Fix skey emulation permission check

All skey functions call skey_check_enable at their start, which checks
if we are in the PSTATE and injects a privileged operation exception
if we are.

Unfortunately they continue processing afterwards and perform the
operation anyhow as skey_check_enable does not deliver an error if the
exception injection was successful.

Let's move the PSTATE check into the skey functions and exit them on
such an occasion, also we now do not enable skey handling anymore in
such a case.
Signed-off-by: default avatarJanosch Frank <frankja@linux.vnet.ibm.com>
Reviewed-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Fixes: a7e19ab5 ("KVM: s390: handle missing storage-key facility")
Cc: <stable@vger.kernel.org> # v4.8+
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Reviewed-by: default avatarThomas Huth <thuth@redhat.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent bb64da9a
...@@ -232,8 +232,6 @@ static int try_handle_skey(struct kvm_vcpu *vcpu) ...@@ -232,8 +232,6 @@ static int try_handle_skey(struct kvm_vcpu *vcpu)
VCPU_EVENT(vcpu, 4, "%s", "retrying storage key operation"); VCPU_EVENT(vcpu, 4, "%s", "retrying storage key operation");
return -EAGAIN; return -EAGAIN;
} }
if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
return 0; return 0;
} }
...@@ -244,6 +242,9 @@ static int handle_iske(struct kvm_vcpu *vcpu) ...@@ -244,6 +242,9 @@ static int handle_iske(struct kvm_vcpu *vcpu)
int reg1, reg2; int reg1, reg2;
int rc; int rc;
if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
rc = try_handle_skey(vcpu); rc = try_handle_skey(vcpu);
if (rc) if (rc)
return rc != -EAGAIN ? rc : 0; return rc != -EAGAIN ? rc : 0;
...@@ -273,6 +274,9 @@ static int handle_rrbe(struct kvm_vcpu *vcpu) ...@@ -273,6 +274,9 @@ static int handle_rrbe(struct kvm_vcpu *vcpu)
int reg1, reg2; int reg1, reg2;
int rc; int rc;
if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
rc = try_handle_skey(vcpu); rc = try_handle_skey(vcpu);
if (rc) if (rc)
return rc != -EAGAIN ? rc : 0; return rc != -EAGAIN ? rc : 0;
...@@ -308,6 +312,9 @@ static int handle_sske(struct kvm_vcpu *vcpu) ...@@ -308,6 +312,9 @@ static int handle_sske(struct kvm_vcpu *vcpu)
int reg1, reg2; int reg1, reg2;
int rc; int rc;
if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
rc = try_handle_skey(vcpu); rc = try_handle_skey(vcpu);
if (rc) if (rc)
return rc != -EAGAIN ? rc : 0; return rc != -EAGAIN ? rc : 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment