2015-11-04 102 views
0

ARM Cortex-A7支持多少个事件计数器,以及如何选择/读取/写入这些计数器?ARM Cortex-A7中的事件计数器

例如,如果运行:

./perf stat -e L1-dcache-loads,branch-loads sleep 1 

,它存储事件算?你可以看到,{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指令,怎么样?

+0

你知道,同样的手册还具有[一所有关于章节的PMU(http://infocenter.arm.com/help/topic/ com.arm.doc.ddi0464f/BIIIFHEG.html),对吗? – Notlikethat

回答

1

由于第二个数据寄存器允许读取和写入计数器值,而第一个是一个索引寄存器,它选择哪个数据寄存器正在操作的实际计数器。

有这样一个设置的典型原因是,不同的实现可以提供不同数量的寄存器而不会改变整个寄存器映射。在ARMv7 PMU的情况下,对相对有限的系统寄存器编码空间的使用不是很好,它有32个计数寄存器和32个事件类型寄存器,其中大多数寄存器未实现,并且你肯定不希望寄存器移动取决于这个特定的CPU实现了多少个计数器。

如果有帮助,想象这样的事情:

class PMU { 
private: 
    int sel; 
    int counter[NUMBER]; 

public: 
    int num_counters(void) { return NUMBER; }; 

    void select_counter(int i) { sel = i % NUMBER; }; 

    void write_counter(int d) { counter[sel] = d; }; 
    int read_counter(void) { return counter[sel]; }; 
} 
+0

感谢您的回答!现在,我明白了:-) – enfinet

+0

@enfinet您可以通过点击“投票”旁边的**接受**答案,然后计算答案的左侧。这表明你(提问者)认为答案是正确的。此外,它还提供了一些有关堆栈溢出的更多信息。 –

+0

是的,我已经投票了,但它没有公开显示,因为我没有超过15的声望。它会在得分(> = 15)后更新:)。 – enfinet