提交 d6eedb6d 编写于 作者: W Wei Li 提交者: Xie XiuQi

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: NWei Li <liwei391@huawei.com>
Reviewed-by: NCheng Jian <cj.chengjian@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 7e812066
...@@ -606,8 +606,10 @@ static inline void armv8pmu_select_counter(int idx) ...@@ -606,8 +606,10 @@ static inline void armv8pmu_select_counter(int idx)
static inline u32 armv8pmu_read_evcntr(int idx) static inline u32 armv8pmu_read_evcntr(int idx)
{ {
u32 counter = ARMV8_IDX_TO_COUNTER(idx);
if (pmu_nmi_enable) if (pmu_nmi_enable)
return read_pmevcntrn(idx); return read_pmevcntrn(counter);
armv8pmu_select_counter(idx); armv8pmu_select_counter(idx);
return read_sysreg(pmxevcntr_el0); return read_sysreg(pmxevcntr_el0);
...@@ -644,8 +646,10 @@ static inline u64 armv8pmu_read_counter(struct perf_event *event) ...@@ -644,8 +646,10 @@ static inline u64 armv8pmu_read_counter(struct perf_event *event)
static inline void armv8pmu_write_evcntr(int idx, u32 value) static inline void armv8pmu_write_evcntr(int idx, u32 value)
{ {
u32 counter = ARMV8_IDX_TO_COUNTER(idx);
if (pmu_nmi_enable) { if (pmu_nmi_enable) {
write_pmevcntrn(idx, value); write_pmevcntrn(counter, value);
} else { } else {
armv8pmu_select_counter(idx); armv8pmu_select_counter(idx);
write_sysreg(value, pmxevcntr_el0); write_sysreg(value, pmxevcntr_el0);
...@@ -690,9 +694,11 @@ static inline void armv8pmu_write_counter(struct perf_event *event, u64 value) ...@@ -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) static inline void armv8pmu_write_evtype(int idx, u32 val)
{ {
u32 counter = ARMV8_IDX_TO_COUNTER(idx);
if (pmu_nmi_enable) { if (pmu_nmi_enable) {
val &= ARMV8_PMU_EVTYPE_MASK; val &= ARMV8_PMU_EVTYPE_MASK;
write_pmevtypern(idx, val); write_pmevtypern(counter, val);
} else { } else {
armv8pmu_select_counter(idx); armv8pmu_select_counter(idx);
val &= ARMV8_PMU_EVTYPE_MASK; val &= ARMV8_PMU_EVTYPE_MASK;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册