• Mark Rutland's avatar
    KVM: arm64: Fix caching of host MDCR_EL2 value · f1df7654
    Mark Rutland authored
    commit da5a3ce6 upstream.
    
    At boot time, KVM stashes the host MDCR_EL2 value, but only does this
    when the kernel is not running in hyp mode (i.e. is non-VHE). In these
    cases, the stashed value of MDCR_EL2.HPMN happens to be zero, which can
    lead to CONSTRAINED UNPREDICTABLE behaviour.
    
    Since we use this value to derive the MDCR_EL2 value when switching
    to/from a guest, after a guest have been run, the performance counters
    do not behave as expected. This has been observed to result in accesses
    via PMXEVTYPER_EL0 and PMXEVCNTR_EL0 not affecting the relevant
    counters, resulting in events not being counted. In these cases, only
    the fixed-purpose cycle counter appears to work as expected.
    
    Fix this by always stashing the host MDCR_EL2 value, regardless of VHE.
    
    Cc: Christopher Dall <christoffer.dall@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: stable@vger.kernel.org
    Fixes: 1e947bad ("arm64: KVM: Skip HYP setup when already running in HYP")
    Tested-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f1df7654
arm.c 32.7 KB