[PATCH v2 13/13] KVM: arm64: Force guest's HCR_EL2.E2H RES1 when NV1 is not implemented
Suzuki K Poulose
suzuki.poulose at arm.com
Wed Nov 22 10:06:17 PST 2023
On 20/11/2023 12:37, Marc Zyngier wrote:
> If NV1 isn't supported on a system, make sure we always evaluate
> the guest's HCR_EL2.E2H as RES1, irrespective of what the guest
> may have written there.
>
> Signed-off-by: Marc Zyngier <maz at kernel.org>
Reviewed-by: Suzuki K Poulose <suzuki.poulose at arm.com>
> ---
> arch/arm64/include/asm/kvm_emulate.h | 3 ++-
> arch/arm64/kvm/sys_regs.c | 12 +++++++++++-
> 2 files changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h
> index 78a550537b67..7b10a44189d0 100644
> --- a/arch/arm64/include/asm/kvm_emulate.h
> +++ b/arch/arm64/include/asm/kvm_emulate.h
> @@ -213,7 +213,8 @@ static inline bool vcpu_is_el2(const struct kvm_vcpu *vcpu)
>
> static inline bool __vcpu_el2_e2h_is_set(const struct kvm_cpu_context *ctxt)
> {
> - return ctxt_sys_reg(ctxt, HCR_EL2) & HCR_E2H;
> + return (cpus_have_final_cap(ARM64_HCR_NV1_RES0) ||
> + (ctxt_sys_reg(ctxt, HCR_EL2) & HCR_E2H));
> }
>
> static inline bool vcpu_el2_e2h_is_set(const struct kvm_vcpu *vcpu)
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index ff2e66f0bda1..9e1e3da2ed4a 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -2022,6 +2022,16 @@ static bool access_spsr(struct kvm_vcpu *vcpu,
> return true;
> }
>
> +static u64 reset_hcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
> +{
> + u64 val = r->val;
> +
> + if (cpus_have_final_cap(ARM64_HCR_NV1_RES0))
> + val |= HCR_E2H;
> +
> + return __vcpu_sys_reg(vcpu, r->reg) = val;
> +}
> +
> /*
> * Architected system registers.
> * Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2
> @@ -2513,7 +2523,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
> EL2_REG(VMPIDR_EL2, access_rw, reset_unknown, 0),
> EL2_REG(SCTLR_EL2, access_rw, reset_val, SCTLR_EL2_RES1),
> EL2_REG(ACTLR_EL2, access_rw, reset_val, 0),
> - EL2_REG(HCR_EL2, access_rw, reset_val, 0),
> + EL2_REG(HCR_EL2, access_rw, reset_hcr, 0),
> EL2_REG(MDCR_EL2, access_rw, reset_val, 0),
> EL2_REG(CPTR_EL2, access_rw, reset_val, CPTR_NVHE_EL2_RES1),
> EL2_REG(HSTR_EL2, access_rw, reset_val, 0),
More information about the linux-arm-kernel
mailing list