1. PMCCFILTR_EL0, Performance Monitors Cycle Count Filter Register
作用
决定循环计数器PMCCNTR_EL0的增长模式
位图
-
RES0
保留位 -
P, bit[31]
0b0 计算EL1中的周期
0b1 不计算EL1中的周期
如果实现了EL3的话,那么是否在EL1进行计数将会进一步的由NSK位进行控制 -
U, bit[30]
0b0 计算EL0中的周期
0b1 不计算EL0中的周期
如果实现了EL3的话,那么是否在EL0进行计数将会进一步的由NSU位进行控制 -
NSK, bit[29]
在实现了EL3的情况下:如果值与P相同则计算EL1中的周期,否则不。 -
NSU, bit[28]
在实现了EL3的情况下:如果值与U相同则计算EL0中的周期,否则不。 -
NSH, bit[27]
在实现了EL2的情况下:
0b0 不计算EL2中的周期
0b1 计算EL2中的周期
如果实现了EL2和EL3的话,那么是否在EL2进行计数将会进一步的由SH位进行控制 -
M, bi[26]
在实现了EL3的情况下:如果值与P相同则计算EL3中的周期,否则不。 -
SH, bi[24]
在实现了EL3和FEAT_SEL2的情况下:如果值与NSH不相同则计算EL2中的周期,否则不。
读MRS/写MSR
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1110 | 0b1111 | 0b111 |
2. PMCCNTR_EL0, Performance Monitors Cycle Count Register
作用
统计进程的时钟周期
只有实现了FEAT_PMUv3,此计数器才存在。并且PMCCNTR的计数还会受到时钟频率的改变的影响,例如时钟被WFI和WFE指令暂停了。
位图
-
CCNT, bits[63:0]
可以每一个时钟周期计数一次,也可以每64个时钟周期计数一次,具体由PMCR_EL0.D控制
如果给PMCR_EL0.C设为1的话可以重置此计数器为0
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1101 | 0b000 |
3. PMCEID0_EL0, Performance Monitors Common Event Identification register 0
作用
表明哪些通用架构事件和通用微架构事件被实现/计数,PMU事件编号从0x0000到0x001F和0x4000到0x401F
位图
-
IDhi<n>, bit[n+32], for n = 31 to 0
只有实现了FEAT_PMUv3p1,这些位才有效,对应事件0x4000+n
0b0 该位代表的事件没有实现或不会被计数
0b1 该位代表的事件被实现了且会被计数 -
ID<n>, bit[n], for n = 31 to 0
对应事件0x0000+n
0b0 该位代表的事件没有实现或不会被计数
0b1 该位代表的事件被实现了且会被计数
只读
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b110 |
4. PMCEID1_EL0, Performance Monitors Common Event Identification register 1
作用
表明哪些通用架构事件和通用微架构事件被实现/计数,PMU事件编号从0x0020到0x003F和0x4020到0x403F
位图
-
IDhi<n>, bit[n+32], for n = 31 to 0
只有实现了FEAT_PMUv3p1,这些位才有效,对应事件0x4020+n
0b0 该位代表的事件没有实现或不会被计数
0b1 该位代表的事件被实现了且会被计数 -
ID<n>, bit[n], for n = 31 to 0
对应事件0x0020+n
0b0 该位代表的事件没有实现或不会被计数
0b1 该位代表的事件被实现了且会被计数
只读
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b111 |
5. PMCNTENCLR_EL0, Performance Monitors Count Enable Clear register
作用
可以使计数器去使能。直接读的话表明哪些计数器使能了。
位图
-
RES0
保留位 -
C, bit[31]
0b0 读:表明PMCCNTR未使能。写:无意义。
0b1 读:表明PMCCNTR使能了。写:PMCCNTR去使能。(这里写1,到clr寄存器里面的值最后应该是0) -
Pn, bit[n], for n = 30 to 0
0b0 读:表明PMEVCNTR<n>_EL0未使能。写:无意义。
0b1 读:表明PMEVCNTR<n>_EL0使能了。写:PMEVCNTR<n>_EL0去使能。
注:当EL2在当前安全状态下实现并启用时,则在EL1和EL0中,N是MDCR_EL2.HPMN中的值。否则N是PMCR_EL0.N的值。且如果N小于31,则[N,30]的位都是RAZ/WI(Read-As-Zero/Writes Ignored)的。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b010 |
6. PMCNTENSET_EL0, Performance Monitors Count Enable Set register
作用
使能计数器。直接读的话表明哪些计数器使能了。
位图
-
RES0
保留位 -
C, bit[31]
0b0 读:表明PMCCNTR未使能。写:无意义。
0b1 读:表明PMCCNTR使能了。写:使能PMCCNTR。(这里写1,到set寄存器里面的值最后应该是1,注意与clr寄存器的区别) -
Pn, bit[n], for n = 30 to 0
0b0 读:表明PMEVCNTR<n>_EL0未使能。写:无意义。
0b1 读:表明PMEVCNTR<n>_EL0使能了。写:使能PMEVCNTR<n>_EL0。
注:当EL2在当前安全状态下实现并启用时,则在EL1和EL0中,N是MDCR_EL2.HPMN中的值。否则N是PMCR_EL0.N的值。且如果N小于31,则[N,30]的位都是RAZ/WI(Read-As-Zero/Writes Ignored)的。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b001 |
7. PMCR_EL0, Performance Monitors Control Register
作用
描述了性能监控的实现细节,包括实现的计数器的数量、用来配置和控制计数器等。
位图
-
RES0
保留 -
FZS, bit[32]
只有实现了FEAT_SPEv1p2的情况下这个位才有意义
全称Freeze-on-SPE event(freeze on Statistical Profiling Buffer Management event)
0b0 不要冻结统计分析缓冲区管理事件。
0b1 事件计数器在统计分析缓冲区管理事件之后不计数。(需要PMBLIMITR_EL1.{PMFZ,E} == {1,1}和PMBSR_EL1.S == 1)
如果实现了EL2的情况下,这个位只影响编号0到MDCR_EL2.HPMN-1的计数器,而MDCR_EL2.HPMN到PMCR_EL0.N-1的计数器(MDCR_EL2.HPMN小于PMCR_EL0.N的时候)以及PMCCNTR不受影响 -
IMP, bits[31:24]
IMP,Implementer code。
只读字段,且不建议使用此字段。
只有在FEAT_PMUv3p7没有实现的情况下这个字段才有意义,否则是RAZ的。
值为0,则IDCODE是保留字段,并且软件必须使用MIDR_EL1来标识PE。
值为其他,这个字段和IDCODE一起标识PMU是由软件实现的。实现的代码由arm分配。且非零值的含义和MIDR_EL1.Implementer一样。 -
IDCODE, bits[23:16]
IDCODE,Identification code。
只读字段,且不建议使用此字段。
只有在PMCR_EL0.IMP != 0x00时此字段才有意义 -
N, bits[15:11]
只读字段
表示实现了多少个pmu事件计数器,取值范围是0b00000-0b11111
当实现了并使能了EL2的情况下,在EL1和EL0下读取此值,返回的是MDCR_EL2.HPMN的值。 -
FZO, bit[9]
FZO,Freeze-on-overflow。
只有在实现了FEAT_PMUv3p7的情况下此位才有意义,否则为保留字段
0b0 在发生溢出时也不暂停计数器
0b1 在PMOVSCLR_EL0[(N-1):0]非零的情况下,暂停事件计数器。
如果实现了EL2,且MDCR_EL2.HPMN小于PMCR_EL0.N的情况下,此位忽略PMOVSCLR_EL0[(PMCR_EL0.N-1):MDCR_EL2.HPMN]的非零,且编号从MDCR_EL2.HPMN到PMCR_EL0.N的事件计数器不受影响。
PMCCNTR不收此位影响。 -
LP, bit[7]
只有在实现了FEAT_PMUv3p5的情况下此位才有意义,否则为保留字段
此位决定溢出标识寄存器什么时候记录事件计数器发生了无符号溢出。
0b0 导致PMEVCNTR<n>_EL0[31:0]溢出时
0b1 导致PMEVCNTR<n>_EL0[63:0]溢出时
这里n的大小取决于EL2的实现,以及MDCR_EL2.HPMN和PMCR_EL0.N的大小。 -
LC, bit[6]
只有在EL0支持AArch32的情况下此位才有意义,否则为保留字段
此位决定溢出标识寄存器什么时候记录PMCCNTR发生了无符号溢出。
0b0 导致PMEVCNTR<n>_EL0[31:0]溢出时
0b1 导致PMEVCNTR<n>_EL0[63:0]溢出时
Arm不建议使用0b0 -
DP, bit[5]
此位只有在实现了EL3或者(FEAT_PMUv3p1和EL2都实现)的情况下才有意义,否则为保留字段。
0b0 无影响
0b1 当[0..(MDCR_EL2.HPMN-1)]的事件计数器被禁用时,PMCCNTR被禁用 -
X, bit[4]
export
此位只有实现了PMU事件导出总线的情况下才有意义,否则为RAZ/WI的
在已经实现的PMU事件导出总线中启用事件导出功能
0b0 不导出事件
0b1 当计数没有被禁止时导出事件 -
D, bit[3]
只有在EL0支持AArch32的情况下此位才有意义,否则为保留字段
0b0 控制PMCCNTR每一个时钟周期计数一次
0b1 控制PMCCNTR每64个时钟周期计数一次
当PMCR_EL0.LC == 1时,此位无效且PMCCNTR每一个时钟周期计数一次
Arm不建议使用0b1 -
C, bit[2]
此位是WO/RAZ
0b0 无影响
0b1 重置PMCCNTR为0
重置PMCCNTR为0不影响对应的PMCCNTR的溢出标识位。
如果实现了FEAT_PMUv3p5,PMCR_EL0.LC的影响会被忽略,则bit[63:0]会被重置。 -
P, bit[1]
此位是WO/RAZ
0b0 无影响
0b1 重置当前异常等级下可访问的所有事件计数器为0,不包括PMCCNTR
在EL0或者EL1下:如果实现并使能了EL2,且MDCR_EL2.HPMN小于PMCR_EL0.N的话,则此位写0b1对[MDCR_EL2.HPMN..(PMCR_EL0.N-1)]没影响,否则重置所有计数器。
在EL2和EL3下:此位写0b1直接重置所有计数器
重置为0不影响对应的计数器的溢出标识位。
如果实现了FEAT_PMUv3p5,MDCR_EL2.HLP和PMCR_EL0.LP的影响会被忽略,则所有计数器的bit[63:0]会被重置。 -
E, bit[0]
0b0 所有计数器[0..(PMN-1)],包括PMCCNTR都是不可用的
0b1 所有计数器[0..(PMN-1)],包括PMCCNTR都由PMCNTENSET_EL0来使能。
如果实现了EL2,则:PMN = HDCR.HPMN(EL2是AArch32);PMN = MDCR_EL2.HPMN(EL2是AArch64);PMN < PMCR_EL0.N的话,此位对[PMN..(PMCR_EL0.N-1)]没有影响。
如果没有实现EL2,则PMN = PMCR_EL0.N。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b000 |
8. PMEVCNTR<n>_EL0, Performance Monitors Event Count Registers, n = 0 - 30
作用
用来事件计数的计数器,n从0到30
位图
-
Bits
如果实现了FEAT_PMUv3p5,则是[63:0],否则为[31:0],多余的是保留位
访问
可以直接访问计数器n,也可以将PMSELR_EL0.SEL置为n,然后通过PMXEVCNTR_EL0间接访问。
如果访问的时候用的n的值大于实现的计数器的数量的话,此行为将会是未定义的行为。
EL0想要访问的话,取决于PMUSERENR_EL0.{ER,EN}
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1110 | 0b10:n[4:3] | n[2:0] |
这里假设要访问的是编号为7的计数器,对应的五位二进制是00111,所以上诉的n[4:3]就是00,n[2:0]就是111
9. PMEVTYPER<n>_EL0, Performance Monitors Event Type Registers, n = 0 - 30
作用
事件类型寄存器n用来配置对应的计数器n。功能类似于PMCCFILTR_EL0对PMCCNTR的控制一样。
位图
-
MT, bit[25]
只有当实现了FEAT_MTPMU(见ID_AA64DFR0_EL1.MTPMU)或实现了一个定义的多线程PMU扩展时此位才有效,否则为保留位
0b0 仅在控制PE上进行事件计数
0b1 对来自任何在级别1及以上的,且与当前PE具有相同亲和性的PE的事件进行计数 -
evtCount[15:10], bits[15:10]
只有实现了FEAT_PMUv3p1时,此字段才有意义,否则为保留字段
此时扩展到字段[9:0],详情见[9:0] -
evtCount[9:0], bits[9:0]
记录要计数的事件编号
软件必须要使用PE支持的事件来编程此字段。
(没看懂这字段的含义,读者可以自行查阅Arm手册) -
其他
其他位的功能都和PMCCFILTR_EL0一样,不再赘述
访问
可以直接访问计数器n,也可以将PMSELR_EL0.SEL置为n,然后通过PMXEVTYPER_EL0间接访问。
如果访问的时候用的n的值大于实现的计数器的数量的话,此行为将会是未定义的行为。
EL0想要访问的话,取决于PMUSERENR_EL0.{ER,EN}。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1110 | 0b11:n[4:3] | n[2:0] |
10. PMINTENCLR_EL1, Performance Monitors Interrupt Enable Clear register
作用
禁用计数器的溢出中断请求功能
位图
-
RES0
保留位 -
C. bit[31]
0b0 读:表示PMCCNTR溢出中断请求被禁用;写:无影响
0b1 读:表示PMCCNTR溢出中断请求启用;写:禁用PMCCNTR溢出中断请求 -
P<n>, bit[n], for n = 30 to 0
0b0 读:表示PMEVCNTR<n>_EL0溢出中断请求被禁用;写:无影响
0b1 读:表示PMEVCNTR<n>_EL0溢出中断请求启用;写:禁用PMEVCNTR<n>_EL0溢出中断请求
当实现并使能了EL2,则在EL1中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是RAZ/WI的。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b000 | 0b1001 | 0b1110 | 0b010 |
11. PMINTENSET_EL1, Performance Monitors Interrupt Enable Set register
作用
使能计数器的溢出中断请求功能
位图
-
RES0
保留位 -
C. bit[31]
0b0 读:表示PMCCNTR溢出中断请求被禁用;写:无影响
0b1 读:表示PMCCNTR溢出中断请求启用;写:使能PMCCNTR溢出中断请求 -
P<n>, bit[n], for n = 30 to 0
0b0 读:表示PMEVCNTR<n>_EL0溢出中断请求被禁用;写:无影响
0b1 读:表示PMEVCNTR<n>_EL0溢出中断请求启用;写:使能PMEVCNTR<n>_EL0溢出中断请求
当实现并使能了EL2,则在EL1中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是RAZ/WI的。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b000 | 0b1001 | 0b1110 | 0b001 |
12. PMMIR_EL1, Performance Monitors Machine Identification Register
作用
描述特定于软件实现的性能监视器参数。
仅当实现FEAT_PMUv3p4时,此寄存器才存在。否则,对PMMI_EL1的直接访问是未定义的。
位图
-
RES0
保留位 -
BUS_WIDTH, bits[19:16]
总线宽度。表明每个BUS_ACCESS事件相关的字节数。对应取值如下:
0b0000 信息不可用
0b0011-0b1100,每增加一,字节数翻倍,0b0011表示4字节,0b1100表示2048字节,其他值是保留值。
每次传输都达到此字节数。但是访问可能小于总线宽度。
(没看懂,读者可自行查阅Arm手册) -
BUS_SLOTS, bits[15:8]
总线计数。当此字段为非零时,BUS_ACCESS事件在单个BUS_CERS周期中可能递增的最大值为此值。 -
SLOTS, bits[7:0]
操作宽度。STALL_SLOT事件在单个周期中可能递增的最大值。如果未实现STALL_SLOT事件,则此字段可能为RAZ。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b000 | 0b1001 | 0b1110 | 0b110 |
13. PMOVSCLR_EL0, Performance Monitors Overflow Flag Status Clear Register
作用
保存有计数器溢出的状态标识。写此寄存器可以重置溢出状态。
位图
-
RES0
保留位 -
C, bit[31]
0b0 读:自上一次这个位被重置以来,PMCCNTR计数器没有溢出;写:无影响
0b1 读:自上一次这个位被重置以来,PMCCNTR计数器溢出了;写:重置此位为0。 -
P<n>, bit[n], for n = 30 to 0
0b0 读:自上一次这个位被重置以来,PMEVCNTR<n>_EL0没有溢出;写:无影响
0b1 读:自上一次这个位被重置以来,PMEVCNTR<n>_EL0计数器溢出了;写:重置此位为0。
当实现并使能了EL2,则在EL1和EL0中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是RAZ/WI的。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b011 |
14. PMOVSSET_EL0, Performance Monitors Overflow Flag Status Set register
作用
当对应计数器溢出时,设置对应的位,表明溢出
位图
-
RES0
保留位 -
C, bit[31]
0b0 读:自上一次这个位被重置以来,PMCCNTR计数器没有溢出;写:无影响
0b1 读:自上一次这个位被重置以来,PMCCNTR计数器溢出了;写:置为1。 -
P<n>, bit[n], for n = 30 to 0
0b0 读:自上一次这个位被重置以来,PMEVCNTR<n>_EL0没有溢出;写:无影响
0b1 读:自上一次这个位被重置以来,PMEVCNTR<n>_EL0计数器溢出了;写:重为1。
当实现并使能了EL2,则在EL1和EL0中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是RAZ/WI的。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1110 | 0b011 |
15. PMSELR_EL0, Performance Monitors Event Counter Selection Register
作用
用来选择对应编号的计数器。
可以和PMXEVCNTR_EL0一起配合使用,来决定选择的计数器的值。
也可以和PMXEVTYPER_EL0一起配合使用,来决定选择的计数器的计数事件,计数模式等。
位图
-
RES0
保留位 -
SEL, bits[4:0]
取值为0b00000到0b11111,其中0b11111代表计数器PMCCNTR,其余的代表PMEVCNTR<n>_EL0。
当值为0b11111:则读写PMXEVTYPER_EL0,实际上是在读写PMCCFILTR_EL0
当值为剩下的:则读写PMXEVTYPER_EL0,实际上是在读写PMEVTYPER<n>_EL0
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b101 |
16. PMSWINC_EL0, Performance Monitors Software Increment register
作用
当某个PMEVCNTR<n>_EL0计数器被配置用来作为计算软件自增事件(事件编号0x00)的计数器时,将它的计数增加一。
位图
-
RES0
保留位 -
P<n>, bit[n], for n = 30 to 0
0b0 无影响,写操作被忽略
0b1 如果有某个已经使能的计数器被配置来计算软件自增事件的,则给那个计数器增加一,否则无影响,写操作被忽略。
当实现并使能了EL2,则在EL1和EL0中N的值是MDCR_EL2.HPMN,否则N是PMCR_EL0.N。如果N小于31,则[30:N]是WI的。
只写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b100 |
17. PMUSERENR_EL0, Performance Monitors User Enable Register
作用
决定EL0是否可以访问性能监视器
位图
-
RES0
保留位 -
ER, bit[3]
Event counter Read。EL0对事件计数器的访问会被trap到EL1或者EL2(实现并使能了EL2,且HCR_EL2.TGE是1)
0b0 当PMUSERENR_EL0.EN也是0时,EL0读取PMXEVCNTR_EL0和PMEVCNTR<n>_EL0会被trap。
0b1 覆盖PMUSERENR_EL0.EN并使能:在EL0对PMXEVCNTR_EL0和PMEVCNTR<n>_EL0的只读功能;在EL0对PMSELR_EL0的读写能力;在EL0对PMSELR的读写能力。 -
CR, bit[2]
Cycle counter Read。EL0对PMCCNTR的访问会被trap到EL1或者EL2(实现并使能了EL2,且HCR_EL2.TGE是1)
0b0 当PMUSERENR_EL0.EN也是0时,EL0读取PMCCNTR会被trap。
0b1 覆盖PMUSERENR_EL0.EN并使能:在EL0对PMCCNTR的读写能力。 -
SW, bit[2]
EL0对软件自增的写操作会被trap到EL1或者EL2(实现并使能了EL2,且HCR_EL2.TGE是1)
0b0 当PMUSERENR_EL0.EN也是0时,EL0写PMSWINC_EL0会被trap。
0b1 覆盖PMUSERENR_EL0.EN并使能:在EL0对PMSWINC_EL0的写能力。 -
EN, bit[0]
0b0 制EL0访问寄存器会被trap,除非被PMUSERENR_EL0.{ER, CR, SW}覆盖
0b1 在EL0,软件可以访问所有指定的寄存器。
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1110 | 0b000 |
18. PMXEVCNTR_EL0, Performance Monitors Selected Event Count Register
作用
读或者写某个计数器,计数器是由PMSELR_EL0.SEL的值决定的
位图
如果实现了FEAT_PMUv3p5
否则为
-
RES0
保留位 -
PMEVCNTR<n>
对应于由PMSELR_EL0.SEL决定的计数器的值
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1101 | 0b010 |
19. PMXEVTYPER_EL0, Performance Monitors Selected Event Type Register
作用
读或者写PMEVTYPER<n>_EL0或者PMCCFILTR_EL0,由PMSELR_EL0.SEL选择的计数器决定。
位图
-
RES0
保留位 -
Event type register or PMCCFILTR_EL0
值为0-30,此寄存器映射的是PMEVTYPER<n>_EL0
值为31,此寄存器映射的是PMCCFILTR_EL0
读写
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1101 | 0b001 |