Provides details of the Performance Monitors implementation, including the number of counters implemented, and configures and controls the counters.
AArch64 System register PMCR_EL0 bits [31:0] are architecturally mapped to AArch32 System register PMCR[31:0].
AArch64 System register PMCR_EL0 bits [31:0] are architecturally mapped to External register PMU.PMCR_EL0[31:0].
AArch64 System register PMCR_EL0 bits [63:32] are architecturally mapped to External register PMU.PMCR_EL0[63:32] when FEAT_PMUv3_EXT64 is implemented.
This register is present only when FEAT_PMUv3 is implemented. Otherwise, direct accesses to PMCR_EL0 are UNDEFINED.
PMCR_EL0 is a 64-bit register.
63 | 62 | 61 | 60 | 59 | 58 | 57 | 56 | 55 | 54 | 53 | 52 | 51 | 50 | 49 | 48 | 47 | 46 | 45 | 44 | 43 | 42 | 41 | 40 | 39 | 38 | 37 | 36 | 35 | 34 | 33 | 32 |
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
RES0 | FZS | ||||||||||||||||||||||||||||||
IMP | IDCODE | N | RES0 | FZO | RES0 | LP | LC | DP | X | D | C | P | E |
Reserved, RES0.
Freeze-on-SPE event.
Stop counters when PMBLIMITR_EL1.{PMFZ,E} == {1,1} and PMBSR_EL1.S == 1.
In the description of this field:
FZS | Meaning |
---|---|
0b0 |
Do not freeze on a Statistical Profiling Buffer Management event. |
0b1 |
Affected counters do not count following a Statistical Profiling Buffer Management event. |
The counters affected by this field are:
Other event counters are not affected by this field.
When PMCR_EL0.DP is 0, PMCCNTR_EL0 is not affected by this field.
The reset behavior of this field is:
Freeze-on-SPE event.
Stop counters when PMBLIMITR_EL1.{PMFZ,E} == {1,1} and PMBSR_EL1.S == 1.
In the description of this field:
FZS | Meaning |
---|---|
0b0 |
Do not freeze on a Statistical Profiling Buffer Management event. |
0b1 |
Affected counters do not count following a Statistical Profiling Buffer Management event. |
The counters affected by this field are:
Other event counters and PMCCNTR_EL0 are not affected by this field.
The reset behavior of this field is:
Reserved, RES0.
Implementer code.
If this field is zero, then PMCR_EL0.IDCODE is RES0 and software must use MIDR_EL1 to identify the PE.
Otherwise, this field and PMCR_EL0.IDCODE identify the PMU implementation to software. The implementer codes are allocated by Arm. A nonzero value has the same interpretation as MIDR_EL1.Implementer.
Use of this field is deprecated.
This field has an IMPLEMENTATION DEFINED value.
Access to this field is RO.
Reserved, RAZ.
Identification code. Use of this field is deprecated.
Each implementer must maintain a list of identification codes that are specific to the implementer. A specific implementation is identified by the combination of the implementer code and the identification code.
This field has an IMPLEMENTATION DEFINED value.
Access to this field is RO.
Reserved, RES0.
Indicates the number of event counters implemented. This value is in the range of 0b00000-0b11111. If the value is 0b00000, then only PMCCNTR_EL0 is implemented. If the value is 0b11111, then PMCCNTR_EL0 and 31 event counters are implemented.
When EL2 is implemented and enabled for the current Security state, reads of this field from EL1 and EL0 return the value of MDCR_EL2.HPMN.
This field has an IMPLEMENTATION DEFINED value.
Access to this field is RO.
Reserved, RES0.
Freeze-on-overflow.
Stop event counters on overflow.
In the description of this field:
FZO | Meaning |
---|---|
0b0 |
Do not freeze on overflow. |
0b1 | Affected counters do not count when any of the following applies:
|
The counters affected by this field are:
Other event counters are not affected by this field.
When PMCR_EL0.DP is 0, PMCCNTR_EL0 is not affected by this field.
The reset behavior of this field is:
Reserved, RES0.
Reserved, RES0.
Long event counter enable.
Determines which event counter bit generates an overflow recorded by PMOVSR[n].
In the description of this field:
LP | Meaning |
---|---|
0b0 |
Affected counters overflow on unsigned overflow of PMEVCNTR<n>_EL0[31:0]. |
0b1 |
Affected counters overflow on unsigned overflow of PMEVCNTR<n>_EL0[63:0]. |
When FEAT_EBEP is implemented and the PMU exception is enabled, the Effective value of this field is 1.
The counters affected by this field are:
Other event counters, PMCCNTR_EL0, and, if FEAT_PMUv3_ICNTR is implemented, PMICNTR_EL0 are not affected by this field.
The reset behavior of this field is:
Reserved, RES0.
Long cycle counter enable. Determines when unsigned overflow is recorded by the cycle counter overflow bit.
LC | Meaning |
---|---|
0b0 |
Cycle counter overflow on increment that causes unsigned overflow of PMCCNTR_EL0[31:0]. |
0b1 |
Cycle counter overflow on increment that causes unsigned overflow of PMCCNTR_EL0[63:0]. |
When FEAT_EBEP is implemented and the PMU exception is enabled, the Effective value of this field is 1.
Arm deprecates use of PMCR_EL0.LC = 0.
The reset behavior of this field is:
Reserved, RES1.
Disable cycle counter when event counting is prohibited.
DP | Meaning |
---|---|
0b0 |
Cycle counting by PMCCNTR_EL0 is not affected by this mechanism. |
0b1 | Cycle counting by PMCCNTR_EL0 is disabled in prohibited regions and when event counting is frozen:
|
The conditions when this field disables the cycle counter are the same as when event counting by an event counter PMEVCNTR<n>_EL0 is prohibited or frozen, when either EL2 is not implemented or n is less than MDCR_EL2.HPMN.
If FEAT_PMUv3p7 and FEAT_SPEv1p2 are implemented, meaning PMCR_EL0.FZS is implemented, and FEAT_SPE_DPFZS is not implemented, then cycle counting by PMCCNTR_EL0 is not affected by PMCR_EL0.FZS.
For more information, see 'Prohibiting event and cycle counting'.
The reset behavior of this field is:
Reserved, RES0.
Enable export of events in an IMPLEMENTATION DEFINED PMU event export bus.
X | Meaning |
---|---|
0b0 |
Do not export events. |
0b1 |
Export events where not prohibited. |
This field enables the exporting of events over an IMPLEMENTATION DEFINED PMU event export bus to another device, for example to an OPTIONAL trace unit.
No events are exported when counting is prohibited.
This field does not affect the generation of Performance Monitors overflow interrupt requests or signaling to a cross-trigger interface (CTI) that can be implemented as signals exported from the PE.
The reset behavior of this field is:
Reserved, RAZ/WI.
Clock divider.
D | Meaning |
---|---|
0b0 |
When enabled, PMCCNTR_EL0 counts every clock cycle. |
0b1 |
When enabled, PMCCNTR_EL0 counts once every 64 clock cycles. |
If PMCR_EL0.LC == 1, this bit is ignored and the cycle counter counts every clock cycle.
Arm deprecates use of PMCR_EL0.D = 1.
The reset behavior of this field is:
Reserved, RES0.
Cycle counter reset. The effects of writing to this bit are:
C | Meaning |
---|---|
0b0 |
No action. |
0b1 |
Reset PMCCNTR_EL0 to zero. |
Resetting PMCCNTR_EL0 does not change the cycle counter overflow bit. If FEAT_PMUv3p5 is implemented, the value of PMCR_EL0.LC is ignored, and bits [63:0] of the cycle counter are reset.
Access to this field is WO/RAZ.
Event counter reset.
In the description of this field:
If EL2 is implemented and is using AArch32, then PMN is HDCR.HPMN.
If EL2 is implemented and is using AArch64, then PMN is MDCR_EL2.HPMN.
If EL2 is not implemented, then PMN is PMCR_EL0.N.
P | Meaning |
---|---|
0b0 |
No action. |
0b1 |
If n is in the range of affected event counters, resets each event counter PMEVCNTR<n>_EL0 to zero. |
The effects of writing to this bit are:
Resetting the event counters does not change the event counter overflow bits. If FEAT_PMUv3p5 is implemented, the values of MDCR_EL2.HLP and PMCR_EL0.LP are ignored, and bits [63:0] of all affected event counters are reset.
Access to this field is WO/RAZ.
Enable.
In the description of this field:
E | Meaning |
---|---|
0b0 |
Affected counters are disabled and do not count. |
0b1 |
Affected counters are enabled by PMCNTENSET_EL0. |
The counters affected by this field are:
Other event counters are not affected by this field.
The reset behavior of this field is:
Accesses to this register use the following encodings in the System register encoding space:
MRS <Xt>, PMCR_EL0
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b000 |
if PSTATE.EL == EL0 then if HaveEL(EL3) && EL3SDDUndefPriority() && MDCR_EL3.TPM == '1' then UNDEFINED; elsif PMUSERENR_EL0.EN == '0' || (IsFeatureImplemented(FEAT_PMUv3p9) && PMUSERENR_EL0.UEN == '1') then if EL2Enabled() && HCR_EL2.TGE == '1' then AArch64.SystemAccessTrap(EL2, 0x18); else AArch64.SystemAccessTrap(EL1, 0x18); elsif EL2Enabled() && MDCR_EL2.TPM == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif EL2Enabled() && MDCR_EL2.TPMCR == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif HaveEL(EL3) && MDCR_EL3.TPM == '1' then if EL3SDDUndef() then UNDEFINED; else AArch64.SystemAccessTrap(EL3, 0x18); else X[t, 64] = PMCR_EL0; elsif PSTATE.EL == EL1 then if HaveEL(EL3) && EL3SDDUndefPriority() && MDCR_EL3.TPM == '1' then UNDEFINED; elsif EL2Enabled() && MDCR_EL2.TPM == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif EL2Enabled() && MDCR_EL2.TPMCR == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif HaveEL(EL3) && MDCR_EL3.TPM == '1' then if EL3SDDUndef() then UNDEFINED; else AArch64.SystemAccessTrap(EL3, 0x18); else X[t, 64] = PMCR_EL0; elsif PSTATE.EL == EL2 then if HaveEL(EL3) && EL3SDDUndefPriority() && MDCR_EL3.TPM == '1' then UNDEFINED; elsif HaveEL(EL3) && MDCR_EL3.TPM == '1' then if EL3SDDUndef() then UNDEFINED; else AArch64.SystemAccessTrap(EL3, 0x18); else X[t, 64] = PMCR_EL0; elsif PSTATE.EL == EL3 then X[t, 64] = PMCR_EL0;
MSR PMCR_EL0, <Xt>
op0 | op1 | CRn | CRm | op2 |
---|---|---|---|---|
0b11 | 0b011 | 0b1001 | 0b1100 | 0b000 |
if PSTATE.EL == EL0 then if HaveEL(EL3) && EL3SDDUndefPriority() && MDCR_EL3.TPM == '1' then UNDEFINED; elsif PMUSERENR_EL0.EN == '0' || (IsFeatureImplemented(FEAT_PMUv3p9) && PMUSERENR_EL0.UEN == '1') then if EL2Enabled() && HCR_EL2.TGE == '1' then AArch64.SystemAccessTrap(EL2, 0x18); else AArch64.SystemAccessTrap(EL1, 0x18); elsif EL2Enabled() && !ELIsInHost(EL0) && IsFeatureImplemented(FEAT_FGT) && (!HaveEL(EL3) || SCR_EL3.FGTEn == '1') && HDFGWTR_EL2.PMCR_EL0 == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif EL2Enabled() && MDCR_EL2.TPM == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif EL2Enabled() && MDCR_EL2.TPMCR == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif HaveEL(EL3) && MDCR_EL3.TPM == '1' then if EL3SDDUndef() then UNDEFINED; else AArch64.SystemAccessTrap(EL3, 0x18); else PMCR_EL0 = X[t, 64]; elsif PSTATE.EL == EL1 then if HaveEL(EL3) && EL3SDDUndefPriority() && MDCR_EL3.TPM == '1' then UNDEFINED; elsif EL2Enabled() && IsFeatureImplemented(FEAT_FGT) && (!HaveEL(EL3) || SCR_EL3.FGTEn == '1') && HDFGWTR_EL2.PMCR_EL0 == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif EL2Enabled() && MDCR_EL2.TPM == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif EL2Enabled() && MDCR_EL2.TPMCR == '1' then AArch64.SystemAccessTrap(EL2, 0x18); elsif HaveEL(EL3) && MDCR_EL3.TPM == '1' then if EL3SDDUndef() then UNDEFINED; else AArch64.SystemAccessTrap(EL3, 0x18); else PMCR_EL0 = X[t, 64]; elsif PSTATE.EL == EL2 then if HaveEL(EL3) && EL3SDDUndefPriority() && MDCR_EL3.TPM == '1' then UNDEFINED; elsif HaveEL(EL3) && MDCR_EL3.TPM == '1' then if EL3SDDUndef() then UNDEFINED; else AArch64.SystemAccessTrap(EL3, 0x18); else PMCR_EL0 = X[t, 64]; elsif PSTATE.EL == EL3 then PMCR_EL0 = X[t, 64];