arm64: KVM: Fix perf cycle counter support for VHE
authorAndrew Murray <andrew.murray@arm.com>
Mon, 29 Apr 2019 19:13:05 +0000 (20:13 +0100)
committerMarc Zyngier <marc.zyngier@arm.com>
Tue, 30 Apr 2019 09:11:49 +0000 (10:11 +0100)
The kvm_vcpu_pmu_{read,write}_evtype_direct functions do not handle
the cycle counter use-case, this leads to inaccurate counts and a
WARN message when using perf with the cycle counter (-e cycle).

Let's fix this by adding a use case for pmccfiltr_el0.

Fixes: 39e3406a090a ("arm64: KVM: Avoid isb's by using direct pmxevtyper sysreg")
Reported-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Andrew Murray <andrew.murray@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
arch/arm64/kvm/pmu.c

index cd49db845ef4bf91c6e618b545e7e1f3197d56b6..3da94a5bb6b747ed0b27fc6246e280ae6882a1a8 100644 (file)
@@ -134,12 +134,15 @@ void __hyp_text __pmu_switch_to_host(struct kvm_cpu_context *host_ctxt)
        PMEVTYPER_##readwrite##_CASE(30)
 
 /*
- * Read a value direct from PMEVTYPER<idx>
+ * Read a value direct from PMEVTYPER<idx> where idx is 0-30
+ * or PMCCFILTR_EL0 where idx is ARMV8_PMU_CYCLE_IDX (31).
  */
 static u64 kvm_vcpu_pmu_read_evtype_direct(int idx)
 {
        switch (idx) {
        PMEVTYPER_CASES(READ);
+       case ARMV8_PMU_CYCLE_IDX:
+               return read_sysreg(pmccfiltr_el0);
        default:
                WARN_ON(1);
        }
@@ -148,12 +151,16 @@ static u64 kvm_vcpu_pmu_read_evtype_direct(int idx)
 }
 
 /*
- * Write a value direct to PMEVTYPER<idx>
+ * Write a value direct to PMEVTYPER<idx> where idx is 0-30
+ * or PMCCFILTR_EL0 where idx is ARMV8_PMU_CYCLE_IDX (31).
  */
 static void kvm_vcpu_pmu_write_evtype_direct(int idx, u32 val)
 {
        switch (idx) {
        PMEVTYPER_CASES(WRITE);
+       case ARMV8_PMU_CYCLE_IDX:
+               write_sysreg(val, pmccfiltr_el0);
+               break;
        default:
                WARN_ON(1);
        }