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

Arm 从用户空间读取Cortex A15性能计数器,arm,kernel-module,performancecounter,cortex-a,Arm,Kernel Module,Performancecounter,Cortex A,我正在尝试读取我的ARM big.LITTLE的性能计数器(循环和事件计数寄存器)。它由4个皮质A7和4个皮质A 15核组成。如果我在A7内核上设置测试任务,那么读取性能计数器的值没有问题,但是如果我想在Cortex A15上测试同一任务,我会得到一条“非法指令”。我把启用计数器的代码放在下面。 我认为这是因为我的内核模块只启用了A7的性能计数器来访问用户空间。但我不知道如何将A15的计数器启用到用户空间。 有人知道我该怎么做吗? 谢谢你的帮助 #定义性能定义选项(1 | 16) #定义DRVR

我正在尝试读取我的ARM big.LITTLE的性能计数器(循环和事件计数寄存器)。它由4个皮质A7和4个皮质A 15核组成。如果我在A7内核上设置测试任务,那么读取性能计数器的值没有问题,但是如果我想在Cortex A15上测试同一任务,我会得到一条“非法指令”。我把启用计数器的代码放在下面。 我认为这是因为我的内核模块只启用了A7的性能计数器来访问用户空间。但我不知道如何将A15的计数器启用到用户空间。 有人知道我该怎么做吗? 谢谢你的帮助

#定义性能定义选项(1 | 16)

#定义DRVR\u名称“启用arm\u pmu”


假设这是Linux,只需确保您的内核是使用
配置性能事件构建的,并使用现有的性能子系统-尝试从头开始改造它并不是一个很好的时间利用。它是Linux 3.10,但我不能只使用性能子系统,因为它是一个大学项目。该项目即将完成,唯一缺少的是A15核心的测量,我看不出我缺少什么。我在相应的ARM技术参考手册中查找了寄存器,但它们是相同的,因此如果从用户空间启用它们,应该可以正常工作。您的系统是运行HMP(同时运行所有8个内核)还是旧的群集交换方案(bL切换器仅向Linux提供4个“虚拟”内核)?如果是后者,那么您将不得不处理所有可怕的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);
`