lkml.org 
[lkml]   [2022]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 160/244] KVM: arm64: Treat PMCR_EL1.LC as RES1 on asymmetric systems
    Date
    From: Oliver Upton <oliver.upton@linux.dev>

    [ Upstream commit f3c6efc72f3b20ec23566e768979802f0a398f04 ]

    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>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20220816192554.1455559-2-oliver.upton@linux.dev
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 fc6ee6c5972d..1713630bf8f5 100644
    --- a/arch/arm64/include/asm/kvm_host.h
    +++ b/arch/arm64/include/asm/kvm_host.h
    @@ -795,6 +795,10 @@ bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu);
    #define kvm_vcpu_has_pmu(vcpu) \
    (test_bit(KVM_ARM_VCPU_PMU_V3, (vcpu)->arch.features))

    +#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 f181527f9d43..4cb265e15361 100644
    --- a/arch/arm64/kvm/arm.c
    +++ b/arch/arm64/kvm/arm.c
    @@ -712,8 +712,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 7c18e429b449..c11612db4a37 100644
    --- a/arch/arm64/kvm/sys_regs.c
    +++ b/arch/arm64/kvm/sys_regs.c
    @@ -649,7 +649,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;
    }
    @@ -698,7 +698,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.35.1


    \
     
     \ /
      Last update: 2022-08-23 12:18    [W:2.613 / U:1.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site