从用户空间读取Cortex A15性能计数器

时间:2016-04-08 18:20:21

标签: arm kernel-module performancecounter cortex-a

我正在尝试读取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);
`

0 个答案:

没有答案