从臂上的协处理器读取64位值

时间:2019-05-10 21:35:48

标签: assembly arm

我正在尝试从ARM芯片(Cortex-A72)芯片中读取pmcntr变量。我可以阅读以下32位版本:

asm volatile ("mrc p15, 0, %0, c9, c13, 0" : "=r" (pmccntr));

但是我不确定如何将其读取为64位。在arm documentation中,它具有下表:

0x0F8   c9   0   c13 0  PMCCNTR[31:0]   RW  32-bit  Performance Monitors Cycle Count Register a
0x0FC   -    -   -   -  PMCCNTR[63:32]
-       -    0   c9  -  PMCCNTR[63:0]       64-bit

但是我不确定如何读取64位值。我认为它与mrc2mrrc有关,但是我找不到关于它们如何使用或与mrc有何不同的任何好的文档... < / p>

1 个答案:

答案 0 :(得分:1)

  

我认为它与... mrrc有关,但是我找不到关于它们的使用方式或与mrc的区别的良好文档。

根据ARMv8 reference manual,第4102和4103页,mrc用于访问32位系统(在较旧的ARM体系结构中为协处理器)寄存器;根据第4104和4105页,mrrc用于访问64位系统寄存器。

语法为:MRRC <coproc>, #<opc1>, <Rt>, <Rt2>, <CRm>,而CPU寄存器<Rt>将接收64位系统寄存器的低32位,而CPU寄存器<Rt2>将接收64位系统寄存器的高32位。

  

我认为这与mrc2 ...

有关

ARMv8手册偶然提到了mrc2指令,但没有描述该指令。但是,ARMv7手册可以:

mrc2指令似乎是针对由使用ARM内核生产微控制器的半导体制造商设计的第三方扩展。

mrc2指令仅适用于具有此类扩展名的微控制器。