* [PATCH 0/2] KVM: arm64: Uphold 64bit-only behavior on asymmetric systems
@ 2022-08-11 17:02 Oliver Upton
2022-08-11 17:02 ` [PATCH 1/2] KVM: arm64: Treat PMCR_EL1.LC as RES1 " Oliver Upton
2022-08-11 17:02 ` [PATCH 2/2] KVM: arm64: Reject 32bit user PSTATE " Oliver Upton
0 siblings, 2 replies; 4+ messages in thread
From: Oliver Upton @ 2022-08-11 17:02 UTC (permalink / raw)
To: kvmarm
Cc: kvm, linux-arm-kernel, maz, james.morse, alexandru.elisei,
suzuki.poulose, will, Oliver Upton
Small series to fix a couple issues around when 64bit-only behavior is
applied. As KVM is more restrictive than the kernel in terms of 32bit
support (no asymmetry), we really needed our own predicate when the
meaning of system_supports_32bit_el0() changed in commit 2122a833316f
("arm64: Allow mismatched 32-bit EL0 support").
Lightly tested as I do not have any asymmetric systems on hand at the
moment. Attention on patch 2 would be appreciated as it affects ABI.
Oliver Upton (2):
KVM: arm64: Treat PMCR_EL1.LC as RES1 on asymmetric systems
KVM: arm64: Reject 32bit user PSTATE on asymmetric systems
arch/arm64/include/asm/kvm_host.h | 4 ++++
arch/arm64/kvm/arm.c | 3 +--
arch/arm64/kvm/guest.c | 2 +-
arch/arm64/kvm/sys_regs.c | 4 ++--
4 files changed, 8 insertions(+), 5 deletions(-)
base-commit: 21f9c8a13bb2a0c24d9c6b86bc0896542a28c197
--
2.37.1.559.g78731f0fdb-goog
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 1/2] KVM: arm64: Treat PMCR_EL1.LC as RES1 on asymmetric systems 2022-08-11 17:02 [PATCH 0/2] KVM: arm64: Uphold 64bit-only behavior on asymmetric systems Oliver Upton @ 2022-08-11 17:02 ` Oliver Upton 2022-08-11 17:08 ` Oliver Upton 2022-08-11 17:02 ` [PATCH 2/2] KVM: arm64: Reject 32bit user PSTATE " Oliver Upton 1 sibling, 1 reply; 4+ messages in thread From: Oliver Upton @ 2022-08-11 17:02 UTC (permalink / raw) To: kvmarm Cc: kvm, linux-arm-kernel, maz, james.morse, alexandru.elisei, suzuki.poulose, will, Oliver Upton KVM does not support AArch32 on asymmetric systems. To that end, enforce AArch64-only behavior on PMCR_EL1.LC when on an asymmetric system. Fixes: 2122a833316f ("arm64: Allow mismatched 32-bit EL0 support") Signed-off-by: Oliver Upton <oliver.upton@linux.dev> --- arch/arm64/include/asm/kvm_host.h | 4 ++++ arch/arm64/kvm/arm.c | 3 +-- arch/arm64/kvm/sys_regs.c | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index f38ef299f13b..e9c9388ccc02 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -929,6 +929,10 @@ bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu); (system_supports_mte() && \ test_bit(KVM_ARCH_FLAG_MTE_ENABLED, &(kvm)->arch.flags)) +#define kvm_supports_32bit_el0() \ + (system_supports_32bit_el0() && \ + !static_branch_unlikely(&arm64_mismatched_32bit_el0)) + int kvm_trng_call(struct kvm_vcpu *vcpu); #ifdef CONFIG_KVM extern phys_addr_t hyp_mem_base; diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 986cee6fbc7f..bef3849c564f 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -757,8 +757,7 @@ static bool vcpu_mode_is_bad_32bit(struct kvm_vcpu *vcpu) if (likely(!vcpu_mode_is_32bit(vcpu))) return false; - return !system_supports_32bit_el0() || - static_branch_unlikely(&arm64_mismatched_32bit_el0); + return kvm_supports_32bit_el0(); } /** diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index c059b259aea6..3234f50b8c4b 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -652,7 +652,7 @@ static void reset_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r) */ val = ((pmcr & ~ARMV8_PMU_PMCR_MASK) | (ARMV8_PMU_PMCR_MASK & 0xdecafbad)) & (~ARMV8_PMU_PMCR_E); - if (!system_supports_32bit_el0()) + if (!kvm_supports_32bit_el0()) val |= ARMV8_PMU_PMCR_LC; __vcpu_sys_reg(vcpu, r->reg) = val; } @@ -701,7 +701,7 @@ static bool access_pmcr(struct kvm_vcpu *vcpu, struct sys_reg_params *p, val = __vcpu_sys_reg(vcpu, PMCR_EL0); val &= ~ARMV8_PMU_PMCR_MASK; val |= p->regval & ARMV8_PMU_PMCR_MASK; - if (!system_supports_32bit_el0()) + if (!kvm_supports_32bit_el0()) val |= ARMV8_PMU_PMCR_LC; __vcpu_sys_reg(vcpu, PMCR_EL0) = val; kvm_pmu_handle_pmcr(vcpu, val); -- 2.37.1.559.g78731f0fdb-goog ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] KVM: arm64: Treat PMCR_EL1.LC as RES1 on asymmetric systems 2022-08-11 17:02 ` [PATCH 1/2] KVM: arm64: Treat PMCR_EL1.LC as RES1 " Oliver Upton @ 2022-08-11 17:08 ` Oliver Upton 0 siblings, 0 replies; 4+ messages in thread From: Oliver Upton @ 2022-08-11 17:08 UTC (permalink / raw) To: kvmarm Cc: kvm, linux-arm-kernel, maz, james.morse, alexandru.elisei, suzuki.poulose, will On Thu, Aug 11, 2022 at 05:02:20PM +0000, Oliver Upton wrote: > KVM does not support AArch32 on asymmetric systems. To that end, enforce > AArch64-only behavior on PMCR_EL1.LC when on an asymmetric system. > > Fixes: 2122a833316f ("arm64: Allow mismatched 32-bit EL0 support") > Signed-off-by: Oliver Upton <oliver.upton@linux.dev> > --- > arch/arm64/include/asm/kvm_host.h | 4 ++++ > arch/arm64/kvm/arm.c | 3 +-- > arch/arm64/kvm/sys_regs.c | 4 ++-- > 3 files changed, 7 insertions(+), 4 deletions(-) > > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h > index f38ef299f13b..e9c9388ccc02 100644 > --- a/arch/arm64/include/asm/kvm_host.h > +++ b/arch/arm64/include/asm/kvm_host.h > @@ -929,6 +929,10 @@ bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu); > (system_supports_mte() && \ > test_bit(KVM_ARCH_FLAG_MTE_ENABLED, &(kvm)->arch.flags)) > > +#define kvm_supports_32bit_el0() \ > + (system_supports_32bit_el0() && \ > + !static_branch_unlikely(&arm64_mismatched_32bit_el0)) > + > int kvm_trng_call(struct kvm_vcpu *vcpu); > #ifdef CONFIG_KVM > extern phys_addr_t hyp_mem_base; > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c > index 986cee6fbc7f..bef3849c564f 100644 > --- a/arch/arm64/kvm/arm.c > +++ b/arch/arm64/kvm/arm.c > @@ -757,8 +757,7 @@ static bool vcpu_mode_is_bad_32bit(struct kvm_vcpu *vcpu) > if (likely(!vcpu_mode_is_32bit(vcpu))) > return false; > > - return !system_supports_32bit_el0() || > - static_branch_unlikely(&arm64_mismatched_32bit_el0); > + return kvm_supports_32bit_el0(); Lol, promised this was lightly tested :) Read the patch once more, this will need to be: return !kvm_supports_32bit_el0(); I'll fix it in v2 but will wait a bit for folks to review. -- Thanks, Oliver > } > > /** > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c > index c059b259aea6..3234f50b8c4b 100644 > --- a/arch/arm64/kvm/sys_regs.c > +++ b/arch/arm64/kvm/sys_regs.c > @@ -652,7 +652,7 @@ static void reset_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r) > */ > val = ((pmcr & ~ARMV8_PMU_PMCR_MASK) > | (ARMV8_PMU_PMCR_MASK & 0xdecafbad)) & (~ARMV8_PMU_PMCR_E); > - if (!system_supports_32bit_el0()) > + if (!kvm_supports_32bit_el0()) > val |= ARMV8_PMU_PMCR_LC; > __vcpu_sys_reg(vcpu, r->reg) = val; > } > @@ -701,7 +701,7 @@ static bool access_pmcr(struct kvm_vcpu *vcpu, struct sys_reg_params *p, > val = __vcpu_sys_reg(vcpu, PMCR_EL0); > val &= ~ARMV8_PMU_PMCR_MASK; > val |= p->regval & ARMV8_PMU_PMCR_MASK; > - if (!system_supports_32bit_el0()) > + if (!kvm_supports_32bit_el0()) > val |= ARMV8_PMU_PMCR_LC; > __vcpu_sys_reg(vcpu, PMCR_EL0) = val; > kvm_pmu_handle_pmcr(vcpu, val); > -- > 2.37.1.559.g78731f0fdb-goog > ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] KVM: arm64: Reject 32bit user PSTATE on asymmetric systems 2022-08-11 17:02 [PATCH 0/2] KVM: arm64: Uphold 64bit-only behavior on asymmetric systems Oliver Upton 2022-08-11 17:02 ` [PATCH 1/2] KVM: arm64: Treat PMCR_EL1.LC as RES1 " Oliver Upton @ 2022-08-11 17:02 ` Oliver Upton 1 sibling, 0 replies; 4+ messages in thread From: Oliver Upton @ 2022-08-11 17:02 UTC (permalink / raw) To: kvmarm Cc: kvm, linux-arm-kernel, maz, james.morse, alexandru.elisei, suzuki.poulose, will, Oliver Upton KVM does not support AArch32 EL0 on asymmetric systems. To that end, prevent userspace from configuring a vCPU in such a state through setting PSTATE. It is already ABI that KVM rejects such a write on a system where AArch32 EL0 is unsupported. Though the kernel's definition of a 32bit system changed in commit 2122a833316f ("arm64: Allow mismatched 32-bit EL0 support"), KVM's did not. Fixes: 2122a833316f ("arm64: Allow mismatched 32-bit EL0 support") Signed-off-by: Oliver Upton <oliver.upton@linux.dev> --- arch/arm64/kvm/guest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c index 8c607199cad1..f802a3b3f8db 100644 --- a/arch/arm64/kvm/guest.c +++ b/arch/arm64/kvm/guest.c @@ -242,7 +242,7 @@ static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) u64 mode = (*(u64 *)valp) & PSR_AA32_MODE_MASK; switch (mode) { case PSR_AA32_MODE_USR: - if (!system_supports_32bit_el0()) + if (!kvm_supports_32bit_el0()) return -EINVAL; break; case PSR_AA32_MODE_FIQ: -- 2.37.1.559.g78731f0fdb-goog ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-08-11 17:17 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-08-11 17:02 [PATCH 0/2] KVM: arm64: Uphold 64bit-only behavior on asymmetric systems Oliver Upton 2022-08-11 17:02 ` [PATCH 1/2] KVM: arm64: Treat PMCR_EL1.LC as RES1 " Oliver Upton 2022-08-11 17:08 ` Oliver Upton 2022-08-11 17:02 ` [PATCH 2/2] KVM: arm64: Reject 32bit user PSTATE " Oliver Upton
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox