|
@@ -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) & PSR_AA32_MODE_MASK;
|
|
|
|
|
|
+ u64 mode = (*(u64 *)valp) & PSR_AA32_MODE_MASK;
|
|
switch (mode) {
|
|
switch (mode) {
|
|
case PSR_AA32_MODE_USR:
|
|
case PSR_AA32_MODE_USR:
|
|
|
|
+ if (!system_supports_32bit_el0())
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ break;
|
|
case PSR_AA32_MODE_FIQ:
|
|
case PSR_AA32_MODE_FIQ:
|
|
case PSR_AA32_MODE_IRQ:
|
|
case PSR_AA32_MODE_IRQ:
|
|
case PSR_AA32_MODE_SVC:
|
|
case PSR_AA32_MODE_SVC:
|
|
case PSR_AA32_MODE_ABT:
|
|
case PSR_AA32_MODE_ABT:
|
|
case PSR_AA32_MODE_UND:
|
|
case PSR_AA32_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;
|