]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Read PMUVer as unsigned
authorJames Clark <james.clark@linaro.org>
Thu, 5 Mar 2026 16:28:17 +0000 (16:28 +0000)
committerWill Deacon <will@kernel.org>
Tue, 24 Mar 2026 12:33:48 +0000 (12:33 +0000)
ID_AA64DFR0_EL1.PMUVer is an unsigned field, so this skips
initialization of host_data_ptr(nr_event_counters) for PMUv3 for Armv8.8
onwards as they appear as negative values.

Fix it by reading it as unsigned. Now ID_AA64DFR0_EL1_PMUVer_IMP_DEF
needs to be special cased, so use pmuv3_implemented() which already does
it.

Fixes: 2417218f2f23 ("KVM: arm64: Get rid of __kvm_get_mdcr_el2() and related warts")
Signed-off-by: James Clark <james.clark@linaro.org>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Colton Lewis <coltonlewis@google.com>
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/kvm/debug.c

index 3ad6b7c6e4ba747e897260248905128d28859819..f4d7b12045e8f20deca9cbf1d7f88e799e4dc9c7 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/kvm_host.h>
 #include <linux/hw_breakpoint.h>
 
+#include <asm/arm_pmuv3.h>
 #include <asm/debug-monitors.h>
 #include <asm/kvm_asm.h>
 #include <asm/kvm_arm.h>
@@ -75,8 +76,10 @@ static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
 void kvm_init_host_debug_data(void)
 {
        u64 dfr0 = read_sysreg(id_aa64dfr0_el1);
+       unsigned int pmuver = cpuid_feature_extract_unsigned_field(dfr0,
+                                                                  ID_AA64DFR0_EL1_PMUVer_SHIFT);
 
-       if (cpuid_feature_extract_signed_field(dfr0, ID_AA64DFR0_EL1_PMUVer_SHIFT) > 0)
+       if (pmuv3_implemented(pmuver))
                *host_data_ptr(nr_event_counters) = FIELD_GET(ARMV8_PMU_PMCR_N,
                                                              read_sysreg(pmcr_el0));