【发布时间】:2026-01-27 19:00:01
【问题描述】:
ARM Cortex-A7 支持多少个事件计数器,如何选择/读取/写入这些计数器?
例如如果运行:
./perf stat -e L1-dcache-loads,branch-loads sleep 1
它在哪里存储事件计数?
Here你可以看到,{c9,c13,0}代表循环计数寄存器,{c9,c13,2}代表事件计数寄存器,那么执行perf命令后哪个寄存器值会改变c9或c13?
如果你在下面看到这段代码:
static inline int armv7_pmnc_select_counter(int idx)
{
u32 counter = ARMV7_IDX_TO_COUNTER(idx);
asm volatile("mcr p15, 0, %0, c9, c12, 5" : : "r" (counter));
return idx;
}
static inline void armv7pmu_write_counter(struct perf_event *event, u32 value)
{
struct arm_pmu *cpu_pmu = to_arm_pmu(event->pmu);
struct hw_perf_event *hwc = &event->hw;
int idx = hwc->idx;
if (!armv7_pmnc_counter_valid(cpu_pmu, idx))
pr_err("CPU%u writing wrong counter %d\n",smp_processor_id(), idx);
else if (idx == ARMV7_IDX_CYCLE_COUNTER)
asm volatile("mcr p15, 0, %0, c9, c13, 0" : : "r" (value));
else if (armv7_pmnc_select_counter(idx) == idx)
asm volatile("mcr p15, 0, %0, c9, c13, 2" : : "r" (value));
}
对于每个事件计数器,armv7pmu_write_counter 函数设置不同的idx 值与armv7_pmnc_select_counter 但要更新value,它调用相同的mcr 指令,如何?
【问题讨论】:
-
你知道同样的手册也有a chapter all about the PMUs,对吧?