我正在尝试读取ARM big.LITTLE的性能计数器(循环和事件计数寄存器)。它由4个Cortex A7和4个Cortex A 15核心组成。如果我在A7核心上设置我的测试任务,那么读取性能计数器的值没有问题,但是如果我想在Cortex A15上测试相同的任务,我会得到一条非法指令"。我把代码用于启用下面的计数器。 我认为这是因为我的kernelmodule只能将A7的性能计数器用于用户空间。但我无法弄清楚如何启用A15的计数器到用户空间。 有人知道我该怎么办吗? 我感谢任何帮助。
#define PERF_DEF_OPTS (1 | 16)
#define DRVR_NAME "enable_arm_pmu"
static void enable_cpu_counter(void* data){
/*Enable counters to user land*/
__asm__("MCR p15, 0, %0, c9, c14, 0" :: "r"(1));
__asm__("MCR p15, 0, %0, c9, c12, 0" :: "r"(PERF_DEF_OPTS));
__asm__ ("MCR p15, 0, %0, c9, c12, 1" :: "r"(0x8000000f));
}
static void disable_cpu_counter(void* data){
__asm__("MCR p15, 0, %0, c9, c14, 0" :: "r"(0));
__asm__("MCR p15, 0, %0, c9, c12, 0" :: "r"(PERF_DEF_OPTS));
__asm__ ("MCR p15, 0, %0, c9, c12, 1" :: "r"(0x8000000f));
}
static int hello_init(void)
{
printk(KERN_ALERT "Performance counter enable\n");
on_each_cpu(enable_cpu_counter, NULL, 1);
printk(KERN_INFO "[" DRVR_NAME "] initialised");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Performance counter disabled\n");
on_each_cpu(disable_cpu_counter, NULL, 1);
printk(KERN_INFO "[" DRVR_NAME "] unloaded");
}
module_init(hello_init);
module_exit(hello_exit);
`