From d6eedb6d3827d8c2eff89d996526e9224441bd94 Mon Sep 17 00:00:00 2001 From: Wei Li Date: Thu, 28 Mar 2019 14:27:04 +0800 Subject: [PATCH] arm64: perf: fix wrong event counter index hulk inclusion category: bugfix bugzilla: 12832 CVE: NA ------------------------------------------------- We missed doing the ARMV8_IDX_TO_COUNTER() before accessing these counters. It will access the wrong counters and may even cause undefinstr exception. Add it as armv8pmu_select_counter() do before. Fix: commit 2f10f935b6a6 ("arm64: perf: avoid PMXEV* indirection") Signed-off-by: Wei Li Reviewed-by: Cheng Jian Signed-off-by: Yang Yingliang --- arch/arm64/kernel/perf_event.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 2345b8e9613e..669a28daf548 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c @@ -606,8 +606,10 @@ static inline void armv8pmu_select_counter(int idx) static inline u32 armv8pmu_read_evcntr(int idx) { + u32 counter = ARMV8_IDX_TO_COUNTER(idx); + if (pmu_nmi_enable) - return read_pmevcntrn(idx); + return read_pmevcntrn(counter); armv8pmu_select_counter(idx); return read_sysreg(pmxevcntr_el0); @@ -644,8 +646,10 @@ static inline u64 armv8pmu_read_counter(struct perf_event *event) static inline void armv8pmu_write_evcntr(int idx, u32 value) { + u32 counter = ARMV8_IDX_TO_COUNTER(idx); + if (pmu_nmi_enable) { - write_pmevcntrn(idx, value); + write_pmevcntrn(counter, value); } else { armv8pmu_select_counter(idx); write_sysreg(value, pmxevcntr_el0); @@ -690,9 +694,11 @@ static inline void armv8pmu_write_counter(struct perf_event *event, u64 value) static inline void armv8pmu_write_evtype(int idx, u32 val) { + u32 counter = ARMV8_IDX_TO_COUNTER(idx); + if (pmu_nmi_enable) { val &= ARMV8_PMU_EVTYPE_MASK; - write_pmevtypern(idx, val); + write_pmevtypern(counter, val); } else { armv8pmu_select_counter(idx); val &= ARMV8_PMU_EVTYPE_MASK; -- GitLab