]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: nv: Honor MDCR_EL2.HPME
authorOliver Upton <oliver.upton@linux.dev>
Fri, 25 Oct 2024 18:23:50 +0000 (18:23 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Thu, 31 Oct 2024 19:00:40 +0000 (19:00 +0000)
When the PMU is configured with split counter ranges, HPME becomes the
enable bit for the counters reserved for EL2.

Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20241025182354.3364124-16-oliver.upton@linux.dev
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kvm/pmu-emul.c

index 03cd1ad7a55a1d278f238d1c8e44bfde2fb5f673..349886f03fd542abaed2da8f575da7addcf72001 100644 (file)
@@ -620,8 +620,15 @@ void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val)
 static bool kvm_pmu_counter_is_enabled(struct kvm_pmc *pmc)
 {
        struct kvm_vcpu *vcpu = kvm_pmc_to_vcpu(pmc);
-       return (kvm_vcpu_read_pmcr(vcpu) & ARMV8_PMU_PMCR_E) &&
-              (__vcpu_sys_reg(vcpu, PMCNTENSET_EL0) & BIT(pmc->idx));
+       unsigned int mdcr = __vcpu_sys_reg(vcpu, MDCR_EL2);
+
+       if (!(__vcpu_sys_reg(vcpu, PMCNTENSET_EL0) & BIT(pmc->idx)))
+               return false;
+
+       if (kvm_pmu_counter_is_hyp(vcpu, pmc->idx))
+               return mdcr & MDCR_EL2_HPME;
+
+       return kvm_vcpu_read_pmcr(vcpu) & ARMV8_PMU_PMCR_E;
 }
 
 static bool kvm_pmc_counts_at_el0(struct kvm_pmc *pmc)