ID_DFR1, Debug Feature Register 1
The ID_DFR1 characteristics are:
Purpose
Provides top level information about the debug system in AArch32.
For general information about the interpretation of the ID registers see 'Principles of the ID scheme for fields in ID registers' in the Arm® Architecture Reference Manual, Armv8, for Armv8-A architecture profile, section G7.1.3.
Configuration
AArch32 System register ID_DFR1 bits [31:0] are architecturally mapped to AArch64 System register ID_DFR1_EL1[31:0] .
This register is present only when AArch32 is supported at any Exception level. Otherwise, direct accesses to ID_DFR1 are RES0.
Prior to the introduction of the features described by this register, this register was unnamed and reserved, RES0 from EL1, EL2, and EL3.
Attributes
ID_DFR1 is a 32-bit register.
Field descriptions
The ID_DFR1 bit assignments are:
Bits [31:4]
Reserved, RES0.
MTPMU, bits [3:0]
Multi-threaded PMU extension. Defined values are:
MTPMU | Meaning |
---|---|
0b0000 |
ARMv8.6-MTPMU not implemented. If PMUv3 is implemented, it is IMPLEMENTATION DEFINED whether PMEVTYPER<n>.MT are read/write or RES0. |
0b0001 |
ARMv8.6-MTPMU implemented and PMEVTYPER<n>.MT are read/write. When ARMv8.6-MTPMU is disabled, the Effective values of PMEVTYPER<n>.MT are 0. |
0b1111 |
ARMv8.6-MTPMU not implemented. If PMUv3 is implemented, PMEVTYPER<n>.MT are RES0. |
All other values are reserved.
ARMv8.6-MTPMU implements the functionality identified by the value 0b0001.
In an Armv8.6-compliant implementation that includes PMUv3, the value 0b0000 is not permitted.
In an implementation that does not include PMUv3, the value 0b0001 is not permitted.
Accessing the ID_DFR1
Accesses to this register use the following encodings:
MRC{<c>}{<q>} <coproc>, {#}<opc1>, <Rt>, <CRn>, <CRm>{, {#}<opc2>}
coproc | opc1 | CRn | CRm | opc2 |
---|---|---|---|---|
0b1111 | 0b000 | 0b0000 | 0b0011 | 0b101 |
if PSTATE.EL == EL0 then UNDEFINED; elsif PSTATE.EL == EL1 then if EL2Enabled() && !ELUsingAArch32(EL2) && HSTR_EL2.T0 == '1' then AArch64.AArch32SystemAccessTrap(EL2, 0x03); elsif EL2Enabled() && ELUsingAArch32(EL2) && HSTR.T0 == '1' then AArch32.TakeHypTrapException(0x03); elsif EL2Enabled() && !ELUsingAArch32(EL2) && (!IsZero(ID_DFR1) || boolean IMPLEMENTATION_DEFINED "ID_DFR1 trapped by HCR_EL2.TID3") && HCR_EL2.TID3 == '1' then AArch64.AArch32SystemAccessTrap(EL2, 0x03); elsif EL2Enabled() && ELUsingAArch32(EL2) && (!IsZero(ID_DFR1) || boolean IMPLEMENTATION_DEFINED "ID_DFR1 trapped by HCR.TID3") && HCR.TID3 == '1' then AArch32.TakeHypTrapException(0x03); else return ID_DFR1; elsif PSTATE.EL == EL2 then return ID_DFR1; elsif PSTATE.EL == EL3 then return ID_DFR1;