mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 18:09:56 +00:00
arm64: KVM: Sanitize PSTATE.M when being set from userspace
commit2a3f93459dupstream. Not all execution modes are valid for a guest, and some of them depend on what the HW actually supports. Let's verify that what userspace provides is compatible with both the VM settings and the HW capabilities. Cc: <stable@vger.kernel.org> Fixes:0d854a60b1("arm64: KVM: enable initialization of a 32bit vcpu") Reviewed-by: Christoffer Dall <christoffer.dall@arm.com> Reviewed-by: Mark Rutland <mark.rutland@arm.com> Reviewed-by: Dave Martin <Dave.Martin@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5fddc4cd7a
commit
926415e1e4
@@ -152,17 +152,25 @@ static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (off == KVM_REG_ARM_CORE_REG(regs.pstate)) {
|
if (off == KVM_REG_ARM_CORE_REG(regs.pstate)) {
|
||||||
u32 mode = (*(u32 *)valp) & COMPAT_PSR_MODE_MASK;
|
u64 mode = (*(u64 *)valp) & COMPAT_PSR_MODE_MASK;
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case COMPAT_PSR_MODE_USR:
|
case COMPAT_PSR_MODE_USR:
|
||||||
|
if (!system_supports_32bit_el0())
|
||||||
|
return -EINVAL;
|
||||||
|
break;
|
||||||
case COMPAT_PSR_MODE_FIQ:
|
case COMPAT_PSR_MODE_FIQ:
|
||||||
case COMPAT_PSR_MODE_IRQ:
|
case COMPAT_PSR_MODE_IRQ:
|
||||||
case COMPAT_PSR_MODE_SVC:
|
case COMPAT_PSR_MODE_SVC:
|
||||||
case COMPAT_PSR_MODE_ABT:
|
case COMPAT_PSR_MODE_ABT:
|
||||||
case COMPAT_PSR_MODE_UND:
|
case COMPAT_PSR_MODE_UND:
|
||||||
|
if (!vcpu_el1_is_32bit(vcpu))
|
||||||
|
return -EINVAL;
|
||||||
|
break;
|
||||||
case PSR_MODE_EL0t:
|
case PSR_MODE_EL0t:
|
||||||
case PSR_MODE_EL1t:
|
case PSR_MODE_EL1t:
|
||||||
case PSR_MODE_EL1h:
|
case PSR_MODE_EL1h:
|
||||||
|
if (vcpu_el1_is_32bit(vcpu))
|
||||||
|
return -EINVAL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
|
|||||||
Reference in New Issue
Block a user