在Cortex-A9 PMU计数器上获得零

时间:2014-03-21 19:28:13

标签: android linux kernel cortex-a

不确定这是否是正确的地方,但我真的需要帮助。

我正在尝试收集有关Galaxy Nexus i9250 Android v4.3 CPU ARMv7的一些数据。我正在尝试使用ARM Streamline,但它提供了以下错误:

已检测到ARM处理器PMU事件计数器,但事件计数器正在读取零。事件计数器包括核心名称下的计数器配置选项对话框中列出的那些计数器,但不包括循环计数器(时钟:循环),因为它由专用计数器控制。 PMU配置位DBGEN可能尚未启用,计数器值随后将始终读为零。要解决此问题,请更新固件或Linux内核以启用DBGEN。

经过一番搜索,我发现了类似的问题:https://community.freescale.com/thread/302685

建议对SDER安全调试启用寄存器安全扩展进行一些修改。

我不知道该怎么做,所以我在内核源代码中发现了一个文件perf_event,但不知道从哪里开始。

我在这里发现http://infocenter.arm.com/help/topic/com.arm.doc.dai0195b/DAI0195B_arm11_performance_monitor_unit.pdf对于ARM11我应该使用

enter code here

// MRC p15, 0, <Rd>, CRn, CRm, opCode_2 ; base

MRC p15, 0, <Rd>, c15, c12, 0 ; Read Performance Monitor Control Register

MCR p15, 0, <Rd>, c15, c12, 0 ; Write Performance Monitor Control Register

这是在perf_event_v6.c内核文件夹中,如下所示:

static inline unsigned long
armv6_pmcr_read(void)
{
    u32 val;
    asm volatile("mrc   p15, 0, %0, c15, c12, 0" : "=r"(val));
    return val;
}

因为我使用版本arm7所以我应该修改perf_event_v7.c 我猜我应该使用c9而不是c15,因为这是在那里使用的选项,并在EX的Cortex参考手册中提到:

c9注册 表4-10显示了当CRn为c9时可以访问的CP15系统控制寄存器。 表4-10 c9寄存器汇总 Op1 CRm Op2名称类型重置说明 0 c12 0 PMCR RW 0x41093000性能监视器控制寄存器         1 PMCNTENSET RW 0x00000000计数使能设置寄存器         2 PMCNTENCLR RW 0x00000000计数使能清除寄存器         3 PMOVSR RW - 溢出标志状态寄存器         4 PMSWINC WO - 软件增量寄存器         5 PMSELR RW 0x00000000事件计数器选择寄存器

所以它应该是:     MRC p15,0,c9,c12,0;读性能监视器控制寄存器

MCR p15, 0, <Rd>, c9, c12, 0 ; Write Performance Monitor Control Register

和     MRC p15,0,c9,c12,5;阅读PMSELR寄存器

MCR p15, 0, <Rd>, c9, c12, 5 ; Write PMSELR Register

并选择活动:

  EXPORT  pmn_config
  ; Sets the event for a programmable counter to record
  ; void pmn_config(unsigned counter, uint32_t event)
  ; counter (in r0) = Which counter to program (e.g. 0 for PMN0, 1 for PMN1)
  ; event   (in r1) = The event code (from appropriate TRM or ARM Architecture  Reference Manual)
  pmn_config PROC
  AND     r0, r0, #0x1F          ; Mask to leave only bits 4:0
  MCR     p15, 0, r0, c9, c12, 5 ; Write PMSELR Register
  ISB                            ; Synchronize context
  MCR     p15, 0, r1, c9, c13, 1 ; Write PMXEVTYPER Register
  BX      lr
  ENDP

我应遵循的步骤如下: 应遵循以下程序:

Disable performance counters
Set what each event counter will count
Set cycle counter tick rate
Reset performance counters
Enable performance counters
Call function to profile
Disable performance counters
Read out performance counters
Check that performance counters did not overflow

但我仍然不知道该怎么做。

任何帮助?

1 个答案:

答案 0 :(得分:2)

此链接可能对您有所帮助 - &gt; https://code.google.com/p/mycodespot/wiki/DirectPMUCodeGCC

这个链接有PMU头和汇编代码以及如何使用代码和编译的应用程序示例。