Skip to content

Commit 0224353

Browse files
author
Marc Zyngier
committed
KVM: arm64: Contextualise the handling of PMCR_EL0.P writes
Contrary to what the comment says in kvm_pmu_handle_pmcr(), writing PMCR_EL0.P==1 has the following effects: <quote> The event counters affected by this field are: * All event counters in the first range. * If any of the following are true, all event counters in the second range: - EL2 is disabled or not implemented in the current Security state. - The PE is executing at EL2 or EL3. </quote> where the "first range" represent the counters in the [0..HPMN-1] range, and the "second range" the counters in the [HPMN..MAX] range. It so appears that writing P from EL2 should nuke all counters, and not just the "guest" view. Just do that, and nuke the misleading comment. Reported-by: Joey Gouly <joey.gouly@arm.com> Reviewed-by: Oliver Upton <oliver.upton@linux.dev> Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent c8823e5 commit 0224353

File tree

1 file changed

+3
-5
lines changed

1 file changed

+3
-5
lines changed

arch/arm64/kvm/pmu-emul.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -608,14 +608,12 @@ void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val)
608608
kvm_pmu_set_counter_value(vcpu, ARMV8_PMU_CYCLE_IDX, 0);
609609

610610
if (val & ARMV8_PMU_PMCR_P) {
611-
/*
612-
* Unlike other PMU sysregs, the controls in PMCR_EL0 always apply
613-
* to the 'guest' range of counters and never the 'hyp' range.
614-
*/
615611
unsigned long mask = kvm_pmu_implemented_counter_mask(vcpu) &
616-
~kvm_pmu_hyp_counter_mask(vcpu) &
617612
~BIT(ARMV8_PMU_CYCLE_IDX);
618613

614+
if (!vcpu_is_el2(vcpu))
615+
mask &= ~kvm_pmu_hyp_counter_mask(vcpu);
616+
619617
for_each_set_bit(i, &mask, 32)
620618
kvm_pmu_set_pmc_value(kvm_vcpu_idx_to_pmc(vcpu, i), 0, true);
621619
}

0 commit comments

Comments
 (0)