From 9d04c02c51550c3654126f5e658bce623ba384d6 Mon Sep 17 00:00:00 2001 From: Curtis Dunham Date: Wed, 6 Dec 2017 16:51:26 -0600 Subject: arch-arm: understandably initialize register permissions Move massive initialization routine to the bottom of miscregs.cc. Additionally, share register metadata across ISA instances by making lookUpMiscReg a static member of the ISA and only initializing it once. Change-Id: I6d6ab26200c4e781151cc6efd97ce2420e2bf4cc Signed-off-by: Curtis Dunham Reviewed-by: Andreas Sandberg Reviewed-by: Jack Travaglini Reviewed-on: https://gem5-review.googlesource.com/6803 Maintainer: Andreas Sandberg --- src/arch/arm/isa.cc | 169 +-- src/arch/arm/isa.hh | 196 +++- src/arch/arm/miscregs.cc | 2823 ++++++++++++++++++++++++++-------------------- 3 files changed, 1790 insertions(+), 1398 deletions(-) diff --git a/src/arch/arm/isa.cc b/src/arch/arm/isa.cc index a9648d203..c917abacf 100644 --- a/src/arch/arm/isa.cc +++ b/src/arch/arm/isa.cc @@ -55,177 +55,12 @@ namespace ArmISA { - -/** - * Some registers alias with others, and therefore need to be translated. - * When two mapping registers are given, they are the 32b lower and - * upper halves, respectively, of the 64b register being mapped. - * aligned with reference documentation ARM DDI 0487A.i pp 1540-1543 - */ -void -ISA::initializeMiscRegMetadata() -{ - InitReg(MISCREG_ACTLR_EL1).mapsTo(MISCREG_ACTLR_NS); - InitReg(MISCREG_AFSR0_EL1).mapsTo(MISCREG_ADFSR_NS); - InitReg(MISCREG_AFSR1_EL1).mapsTo(MISCREG_AIFSR_NS); - InitReg(MISCREG_AMAIR_EL1).mapsTo(MISCREG_AMAIR0_NS, - MISCREG_AMAIR1_NS); - InitReg(MISCREG_CONTEXTIDR_EL1).mapsTo(MISCREG_CONTEXTIDR_NS); - InitReg(MISCREG_CPACR_EL1).mapsTo(MISCREG_CPACR); - InitReg(MISCREG_CSSELR_EL1).mapsTo(MISCREG_CSSELR_NS); - InitReg(MISCREG_DACR32_EL2).mapsTo(MISCREG_DACR_NS); - InitReg(MISCREG_FAR_EL1).mapsTo(MISCREG_DFAR_NS, - MISCREG_IFAR_NS); - // ESR_EL1 -> DFSR - InitReg(MISCREG_HACR_EL2).mapsTo(MISCREG_HACR); - InitReg(MISCREG_ACTLR_EL2).mapsTo(MISCREG_HACTLR); - InitReg(MISCREG_AFSR0_EL2).mapsTo(MISCREG_HADFSR); - InitReg(MISCREG_AFSR1_EL2).mapsTo(MISCREG_HAIFSR); - InitReg(MISCREG_AMAIR_EL2).mapsTo(MISCREG_HAMAIR0, - MISCREG_HAMAIR1); - InitReg(MISCREG_CPTR_EL2).mapsTo(MISCREG_HCPTR); - InitReg(MISCREG_HCR_EL2).mapsTo(MISCREG_HCR /*, - MISCREG_HCR2*/); - InitReg(MISCREG_MDCR_EL2).mapsTo(MISCREG_HDCR); - InitReg(MISCREG_FAR_EL2).mapsTo(MISCREG_HDFAR, - MISCREG_HIFAR); - InitReg(MISCREG_MAIR_EL2).mapsTo(MISCREG_HMAIR0, - MISCREG_HMAIR1); - InitReg(MISCREG_HPFAR_EL2).mapsTo(MISCREG_HPFAR); - InitReg(MISCREG_SCTLR_EL2).mapsTo(MISCREG_HSCTLR); - InitReg(MISCREG_ESR_EL2).mapsTo(MISCREG_HSR); - InitReg(MISCREG_HSTR_EL2).mapsTo(MISCREG_HSTR); - InitReg(MISCREG_TCR_EL2).mapsTo(MISCREG_HTCR); - InitReg(MISCREG_TPIDR_EL2).mapsTo(MISCREG_HTPIDR); - InitReg(MISCREG_TTBR0_EL2).mapsTo(MISCREG_HTTBR); - InitReg(MISCREG_VBAR_EL2).mapsTo(MISCREG_HVBAR); - InitReg(MISCREG_IFSR32_EL2).mapsTo(MISCREG_IFSR_NS); - InitReg(MISCREG_MAIR_EL1).mapsTo(MISCREG_PRRR_NS, - MISCREG_NMRR_NS); - InitReg(MISCREG_PAR_EL1).mapsTo(MISCREG_PAR_NS); - // RMR_EL1 -> RMR - // RMR_EL2 -> HRMR - InitReg(MISCREG_SCTLR_EL1).mapsTo(MISCREG_SCTLR_NS); - InitReg(MISCREG_SDER32_EL3).mapsTo(MISCREG_SDER); - InitReg(MISCREG_TPIDR_EL1).mapsTo(MISCREG_TPIDRPRW_NS); - InitReg(MISCREG_TPIDRRO_EL0).mapsTo(MISCREG_TPIDRURO_NS); - InitReg(MISCREG_TPIDR_EL0).mapsTo(MISCREG_TPIDRURW_NS); - InitReg(MISCREG_TCR_EL1).mapsTo(MISCREG_TTBCR_NS); - InitReg(MISCREG_TTBR0_EL1).mapsTo(MISCREG_TTBR0_NS); - InitReg(MISCREG_TTBR1_EL1).mapsTo(MISCREG_TTBR1_NS); - InitReg(MISCREG_VBAR_EL1).mapsTo(MISCREG_VBAR_NS); - InitReg(MISCREG_VMPIDR_EL2).mapsTo(MISCREG_VMPIDR); - InitReg(MISCREG_VPIDR_EL2).mapsTo(MISCREG_VPIDR); - InitReg(MISCREG_VTCR_EL2).mapsTo(MISCREG_VTCR); - InitReg(MISCREG_VTTBR_EL2).mapsTo(MISCREG_VTTBR); - InitReg(MISCREG_CNTFRQ_EL0).mapsTo(MISCREG_CNTFRQ); - InitReg(MISCREG_CNTHCTL_EL2).mapsTo(MISCREG_CNTHCTL); - InitReg(MISCREG_CNTHP_CTL_EL2).mapsTo(MISCREG_CNTHP_CTL); - InitReg(MISCREG_CNTHP_CVAL_EL2).mapsTo(MISCREG_CNTHP_CVAL); /* 64b */ - InitReg(MISCREG_CNTHP_TVAL_EL2).mapsTo(MISCREG_CNTHP_TVAL); - InitReg(MISCREG_CNTKCTL_EL1).mapsTo(MISCREG_CNTKCTL); - InitReg(MISCREG_CNTP_CTL_EL0).mapsTo(MISCREG_CNTP_CTL_NS); - InitReg(MISCREG_CNTP_CVAL_EL0).mapsTo(MISCREG_CNTP_CVAL_NS); /* 64b */ - InitReg(MISCREG_CNTP_TVAL_EL0).mapsTo(MISCREG_CNTP_TVAL_NS); - InitReg(MISCREG_CNTPCT_EL0).mapsTo(MISCREG_CNTPCT); /* 64b */ - InitReg(MISCREG_CNTV_CTL_EL0).mapsTo(MISCREG_CNTV_CTL); - InitReg(MISCREG_CNTV_CVAL_EL0).mapsTo(MISCREG_CNTV_CVAL); /* 64b */ - InitReg(MISCREG_CNTV_TVAL_EL0).mapsTo(MISCREG_CNTV_TVAL); - InitReg(MISCREG_CNTVCT_EL0).mapsTo(MISCREG_CNTVCT); /* 64b */ - InitReg(MISCREG_CNTVOFF_EL2).mapsTo(MISCREG_CNTVOFF); /* 64b */ - InitReg(MISCREG_DBGAUTHSTATUS_EL1).mapsTo(MISCREG_DBGAUTHSTATUS); - InitReg(MISCREG_DBGBCR0_EL1).mapsTo(MISCREG_DBGBCR0); - InitReg(MISCREG_DBGBCR1_EL1).mapsTo(MISCREG_DBGBCR1); - InitReg(MISCREG_DBGBCR2_EL1).mapsTo(MISCREG_DBGBCR2); - InitReg(MISCREG_DBGBCR3_EL1).mapsTo(MISCREG_DBGBCR3); - InitReg(MISCREG_DBGBCR4_EL1).mapsTo(MISCREG_DBGBCR4); - InitReg(MISCREG_DBGBCR5_EL1).mapsTo(MISCREG_DBGBCR5); - InitReg(MISCREG_DBGBVR0_EL1).mapsTo(MISCREG_DBGBVR0 /*, - MISCREG_DBGBXVR0 */); - InitReg(MISCREG_DBGBVR1_EL1).mapsTo(MISCREG_DBGBVR1 /*, - MISCREG_DBGBXVR1 */); - InitReg(MISCREG_DBGBVR2_EL1).mapsTo(MISCREG_DBGBVR2 /*, - MISCREG_DBGBXVR2 */); - InitReg(MISCREG_DBGBVR3_EL1).mapsTo(MISCREG_DBGBVR3 /*, - MISCREG_DBGBXVR3 */); - InitReg(MISCREG_DBGBVR4_EL1).mapsTo(MISCREG_DBGBVR4 /*, - MISCREG_DBGBXVR4 */); - InitReg(MISCREG_DBGBVR5_EL1).mapsTo(MISCREG_DBGBVR5 /*, - MISCREG_DBGBXVR5 */); - InitReg(MISCREG_DBGCLAIMSET_EL1).mapsTo(MISCREG_DBGCLAIMSET); - InitReg(MISCREG_DBGCLAIMCLR_EL1).mapsTo(MISCREG_DBGCLAIMCLR); - // DBGDTR_EL0 -> DBGDTR{R or T}Xint - // DBGDTRRX_EL0 -> DBGDTRRXint - // DBGDTRTX_EL0 -> DBGDTRRXint - InitReg(MISCREG_DBGPRCR_EL1).mapsTo(MISCREG_DBGPRCR); - InitReg(MISCREG_DBGVCR32_EL2).mapsTo(MISCREG_DBGVCR); - InitReg(MISCREG_DBGWCR0_EL1).mapsTo(MISCREG_DBGWCR0); - InitReg(MISCREG_DBGWCR1_EL1).mapsTo(MISCREG_DBGWCR1); - InitReg(MISCREG_DBGWCR2_EL1).mapsTo(MISCREG_DBGWCR2); - InitReg(MISCREG_DBGWCR3_EL1).mapsTo(MISCREG_DBGWCR3); - InitReg(MISCREG_DBGWVR0_EL1).mapsTo(MISCREG_DBGWVR0); - InitReg(MISCREG_DBGWVR1_EL1).mapsTo(MISCREG_DBGWVR1); - InitReg(MISCREG_DBGWVR2_EL1).mapsTo(MISCREG_DBGWVR2); - InitReg(MISCREG_DBGWVR3_EL1).mapsTo(MISCREG_DBGWVR3); - InitReg(MISCREG_ID_DFR0_EL1).mapsTo(MISCREG_ID_DFR0); - InitReg(MISCREG_MDCCSR_EL0).mapsTo(MISCREG_DBGDSCRint); - InitReg(MISCREG_MDRAR_EL1).mapsTo(MISCREG_DBGDRAR); - InitReg(MISCREG_MDSCR_EL1).mapsTo(MISCREG_DBGDSCRext); - InitReg(MISCREG_OSDLR_EL1).mapsTo(MISCREG_DBGOSDLR); - InitReg(MISCREG_OSDTRRX_EL1).mapsTo(MISCREG_DBGDTRRXext); - InitReg(MISCREG_OSDTRTX_EL1).mapsTo(MISCREG_DBGDTRTXext); - InitReg(MISCREG_OSECCR_EL1).mapsTo(MISCREG_DBGOSECCR); - InitReg(MISCREG_OSLAR_EL1).mapsTo(MISCREG_DBGOSLAR); - InitReg(MISCREG_OSLSR_EL1).mapsTo(MISCREG_DBGOSLSR); - InitReg(MISCREG_PMCCNTR_EL0).mapsTo(MISCREG_PMCCNTR); - InitReg(MISCREG_PMCEID0_EL0).mapsTo(MISCREG_PMCEID0); - InitReg(MISCREG_PMCEID1_EL0).mapsTo(MISCREG_PMCEID1); - InitReg(MISCREG_PMCNTENSET_EL0).mapsTo(MISCREG_PMCNTENSET); - InitReg(MISCREG_PMCNTENCLR_EL0).mapsTo(MISCREG_PMCNTENCLR); - InitReg(MISCREG_PMCR_EL0).mapsTo(MISCREG_PMCR); -/* InitReg(MISCREG_PMEVCNTR0_EL0).mapsTo(MISCREG_PMEVCNTR0); - InitReg(MISCREG_PMEVCNTR1_EL0).mapsTo(MISCREG_PMEVCNTR1); - InitReg(MISCREG_PMEVCNTR2_EL0).mapsTo(MISCREG_PMEVCNTR2); - InitReg(MISCREG_PMEVCNTR3_EL0).mapsTo(MISCREG_PMEVCNTR3); - InitReg(MISCREG_PMEVCNTR4_EL0).mapsTo(MISCREG_PMEVCNTR4); - InitReg(MISCREG_PMEVCNTR5_EL0).mapsTo(MISCREG_PMEVCNTR5); - InitReg(MISCREG_PMEVTYPER0_EL0).mapsTo(MISCREG_PMEVTYPER0); - InitReg(MISCREG_PMEVTYPER1_EL0).mapsTo(MISCREG_PMEVTYPER1); - InitReg(MISCREG_PMEVTYPER2_EL0).mapsTo(MISCREG_PMEVTYPER2); - InitReg(MISCREG_PMEVTYPER3_EL0).mapsTo(MISCREG_PMEVTYPER3); - InitReg(MISCREG_PMEVTYPER4_EL0).mapsTo(MISCREG_PMEVTYPER4); - InitReg(MISCREG_PMEVTYPER5_EL0).mapsTo(MISCREG_PMEVTYPER5); */ - InitReg(MISCREG_PMINTENCLR_EL1).mapsTo(MISCREG_PMINTENCLR); - InitReg(MISCREG_PMINTENSET_EL1).mapsTo(MISCREG_PMINTENSET); -// InitReg(MISCREG_PMOVSCLR_EL0).mapsTo(MISCREG_PMOVSCLR); - InitReg(MISCREG_PMOVSSET_EL0).mapsTo(MISCREG_PMOVSSET); - InitReg(MISCREG_PMSELR_EL0).mapsTo(MISCREG_PMSELR); - InitReg(MISCREG_PMSWINC_EL0).mapsTo(MISCREG_PMSWINC); - InitReg(MISCREG_PMUSERENR_EL0).mapsTo(MISCREG_PMUSERENR); - InitReg(MISCREG_PMXEVCNTR_EL0).mapsTo(MISCREG_PMXEVCNTR); - InitReg(MISCREG_PMXEVTYPER_EL0).mapsTo(MISCREG_PMXEVTYPER); - - InitReg(MISCREG_SCR).res0(0xff40) // [31:16], [6] - .res1(0x0030); // [5:4] - - // from ARM DDI 0487A.i, template text - // "AArch64 System register ___ can be mapped to - // AArch32 System register ___, but this is not - // architecturally mandated." - InitReg(MISCREG_SCR_EL3).mapsTo(MISCREG_SCR); // D7-2005 - // MDCR_EL3 -> SDCR, D7-2108 (the latter is unimpl. in gem5) - InitReg(MISCREG_SPSR_EL1).mapsTo(MISCREG_SPSR_SVC); // C5.2.17 SPSR_EL1 - InitReg(MISCREG_SPSR_EL2).mapsTo(MISCREG_SPSR_HYP); // C5.2.18 SPSR_EL2 - InitReg(MISCREG_SPSR_EL3).mapsTo(MISCREG_SPSR_MON); // C5.2.19 SPSR_EL3 -} - ISA::ISA(Params *p) : SimObject(p), system(NULL), _decoderFlavour(p->decoderFlavour), _vecRegRenameMode(p->vecRegRenameMode), - pmu(p->pmu), - lookUpMiscReg(NUM_MISCREGS) + pmu(p->pmu) { miscRegs[MISCREG_SCTLR_RST] = 0; @@ -261,6 +96,8 @@ ISA::ISA(Params *p) clear(); } +std::vector ISA::lookUpMiscReg(NUM_MISCREGS); + const ArmISAParams * ISA::params() const { diff --git a/src/arch/arm/isa.hh b/src/arch/arm/isa.hh index d903ed06a..1711ee0be 100644 --- a/src/arch/arm/isa.hh +++ b/src/arch/arm/isa.hh @@ -44,6 +44,7 @@ #define __ARCH_ARM_ISA_HH__ #include "arch/arm/isa_device.hh" +#include "arch/arm/miscregs.hh" #include "arch/arm/registers.hh" #include "arch/arm/system.hh" #include "arch/arm/tlb.hh" @@ -112,10 +113,11 @@ namespace ArmISA }; /** Metadata table accessible via the value of the register */ - std::vector lookUpMiscReg; + static std::vector lookUpMiscReg; class MiscRegLUTEntryInitializer { struct MiscRegLUTEntry &entry; + std::bitset &info; typedef const MiscRegLUTEntryInitializer& chain; public: chain mapsTo(uint32_t l, uint32_t u = 0) const { @@ -139,13 +141,197 @@ namespace ArmISA entry._rao = mask; return *this; } - MiscRegLUTEntryInitializer(struct MiscRegLUTEntry &e) - : entry(e) - {} + chain implemented(bool v = true) const { + info[MISCREG_IMPLEMENTED] = v; + return *this; + } + chain unimplemented() const { + return implemented(false); + } + chain unverifiable(bool v = true) const { + info[MISCREG_UNVERIFIABLE] = v; + return *this; + } + chain warnNotFail(bool v = true) const { + info[MISCREG_WARN_NOT_FAIL] = v; + return *this; + } + chain mutex(bool v = true) const { + info[MISCREG_MUTEX] = v; + return *this; + } + chain banked(bool v = true) const { + info[MISCREG_BANKED] = v; + return *this; + } + chain bankedChild(bool v = true) const { + info[MISCREG_BANKED_CHILD] = v; + return *this; + } + chain userNonSecureRead(bool v = true) const { + info[MISCREG_USR_NS_RD] = v; + return *this; + } + chain userNonSecureWrite(bool v = true) const { + info[MISCREG_USR_NS_WR] = v; + return *this; + } + chain userSecureRead(bool v = true) const { + info[MISCREG_USR_S_RD] = v; + return *this; + } + chain userSecureWrite(bool v = true) const { + info[MISCREG_USR_S_WR] = v; + return *this; + } + chain user(bool v = true) const { + userNonSecureRead(v); + userNonSecureWrite(v); + userSecureRead(v); + userSecureWrite(v); + return *this; + } + chain privNonSecureRead(bool v = true) const { + info[MISCREG_PRI_NS_RD] = v; + return *this; + } + chain privNonSecureWrite(bool v = true) const { + info[MISCREG_PRI_NS_WR] = v; + return *this; + } + chain privSecureRead(bool v = true) const { + info[MISCREG_PRI_S_RD] = v; + return *this; + } + chain privSecureWrite(bool v = true) const { + info[MISCREG_PRI_S_WR] = v; + return *this; + } + chain privSecure(bool v = true) const { + privSecureRead(v); + privSecureWrite(v); + return *this; + } + chain hypRead(bool v = true) const { + info[MISCREG_HYP_RD] = v; + return *this; + } + chain hypWrite(bool v = true) const { + info[MISCREG_HYP_WR] = v; + return *this; + } + chain hyp(bool v = true) const { + hypRead(v); + hypWrite(v); + return *this; + } + chain monSecureRead(bool v = true) const { + info[MISCREG_MON_NS0_RD] = v; + return *this; + } + chain monSecureWrite(bool v = true) const { + info[MISCREG_MON_NS0_WR] = v; + return *this; + } + chain monNonSecureRead(bool v = true) const { + info[MISCREG_MON_NS1_RD] = v; + return *this; + } + chain monNonSecureWrite(bool v = true) const { + info[MISCREG_MON_NS1_WR] = v; + return *this; + } + chain mon(bool v = true) const { + monSecureRead(v); + monSecureWrite(v); + monNonSecureRead(v); + monNonSecureWrite(v); + return *this; + } + chain monSecure(bool v = true) const { + monSecureRead(v); + monSecureWrite(v); + return *this; + } + chain monNonSecure(bool v = true) const { + monNonSecureRead(v); + monNonSecureWrite(v); + return *this; + } + chain allPrivileges(bool v = true) const { + userNonSecureRead(v); + userNonSecureWrite(v); + userSecureRead(v); + userSecureWrite(v); + privNonSecureRead(v); + privNonSecureWrite(v); + privSecureRead(v); + privSecureWrite(v); + hypRead(v); + hypWrite(v); + monSecureRead(v); + monSecureWrite(v); + monNonSecureRead(v); + monNonSecureWrite(v); + return *this; + } + chain nonSecure(bool v = true) const { + userNonSecureRead(v); + userNonSecureWrite(v); + privNonSecureRead(v); + privNonSecureWrite(v); + hypRead(v); + hypWrite(v); + monNonSecureRead(v); + monNonSecureWrite(v); + return *this; + } + chain secure(bool v = true) const { + userSecureRead(v); + userSecureWrite(v); + privSecureRead(v); + privSecureWrite(v); + monSecureRead(v); + monSecureWrite(v); + return *this; + } + chain reads(bool v) const { + userNonSecureRead(v); + userSecureRead(v); + privNonSecureRead(v); + privSecureRead(v); + hypRead(v); + monSecureRead(v); + monNonSecureRead(v); + return *this; + } + chain writes(bool v) const { + userNonSecureWrite(v); + userSecureWrite(v); + privNonSecureWrite(v); + privSecureWrite(v); + hypWrite(v); + monSecureWrite(v); + monNonSecureWrite(v); + return *this; + } + chain exceptUserMode() const { + user(0); + return *this; + } + MiscRegLUTEntryInitializer(struct MiscRegLUTEntry &e, + std::bitset &i) + : entry(e), + info(i) + { + // force unimplemented registers to be thusly declared + implemented(1); + } }; const MiscRegLUTEntryInitializer InitReg(uint32_t reg) { - return MiscRegLUTEntryInitializer(lookUpMiscReg[reg]); + return MiscRegLUTEntryInitializer(lookUpMiscReg[reg], + miscRegInfo[reg]); } void initializeMiscRegMetadata(); diff --git a/src/arch/arm/miscregs.cc b/src/arch/arm/miscregs.cc index ece552439..445ba18cf 100644 --- a/src/arch/arm/miscregs.cc +++ b/src/arch/arm/miscregs.cc @@ -128,1233 +128,6 @@ decodeCP14Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2) using namespace std; -bitset miscRegInfo[NUM_MISCREGS] = { - // MISCREG_CPSR - bitset(string("11111111111111000001")), - // MISCREG_SPSR - bitset(string("11111111111111000001")), - // MISCREG_SPSR_FIQ - bitset(string("11111111111111000001")), - // MISCREG_SPSR_IRQ - bitset(string("11111111111111000001")), - // MISCREG_SPSR_SVC - bitset(string("11111111111111000001")), - // MISCREG_SPSR_MON - bitset(string("11111111111111000001")), - // MISCREG_SPSR_ABT - bitset(string("11111111111111000001")), - // MISCREG_SPSR_HYP - bitset(string("11111111111111000001")), - // MISCREG_SPSR_UND - bitset(string("11111111111111000001")), - // MISCREG_ELR_HYP - bitset(string("11111111111111000001")), - // MISCREG_FPSID - bitset(string("11111111111111000001")), - // MISCREG_FPSCR - bitset(string("11111111111111000001")), - // MISCREG_MVFR1 - bitset(string("11111111111111000001")), - // MISCREG_MVFR0 - bitset(string("11111111111111000001")), - // MISCREG_FPEXC - bitset(string("11111111111111000001")), - - // Helper registers - // MISCREG_CPSR_MODE - bitset(string("11111111111111000001")), - // MISCREG_CPSR_Q - bitset(string("11111111111111000001")), - // MISCREG_FPSCR_Q - bitset(string("11111111111111000001")), - // MISCREG_FPSCR_EXC - bitset(string("11111111111111000001")), - // MISCREG_LOCKADDR - bitset(string("11111111111111000001")), - // MISCREG_LOCKFLAG - bitset(string("11111111111111000001")), - // MISCREG_PRRR_MAIR0 - bitset(string("00000000000000011001")), - // MISCREG_PRRR_MAIR0_NS - bitset(string("00000000000000101001")), - // MISCREG_PRRR_MAIR0_S - bitset(string("00000000000000101001")), - // MISCREG_NMRR_MAIR1 - bitset(string("00000000000000011001")), - // MISCREG_NMRR_MAIR1_NS - bitset(string("00000000000000101001")), - // MISCREG_NMRR_MAIR1_S - bitset(string("00000000000000101001")), - // MISCREG_PMXEVTYPER_PMCCFILTR - bitset(string("00000000000000001001")), - // MISCREG_SCTLR_RST - bitset(string("11111111111111000001")), - // MISCREG_SEV_MAILBOX - bitset(string("11111111111111000001")), - - // AArch32 CP14 registers - // MISCREG_DBGDIDR - bitset(string("01011111111111000001")), - // MISCREG_DBGDSCRint - bitset(string("01011111111111000001")), - // MISCREG_DBGDCCINT - bitset(string("11111111111111000000")), - // MISCREG_DBGDTRTXint - bitset(string("11111111111111000000")), - // MISCREG_DBGDTRRXint - bitset(string("11111111111111000000")), - // MISCREG_DBGWFAR - bitset(string("11111111111111000000")), - // MISCREG_DBGVCR - bitset(string("11111111111111000000")), - // MISCREG_DBGDTRRXext - bitset(string("11111111111111000000")), - // MISCREG_DBGDSCRext - bitset(string("11111111111111000100")), - // MISCREG_DBGDTRTXext - bitset(string("11111111111111000000")), - // MISCREG_DBGOSECCR - bitset(string("11111111111111000000")), - // MISCREG_DBGBVR0 - bitset(string("11111111111111000000")), - // MISCREG_DBGBVR1 - bitset(string("11111111111111000000")), - // MISCREG_DBGBVR2 - bitset(string("11111111111111000000")), - // MISCREG_DBGBVR3 - bitset(string("11111111111111000000")), - // MISCREG_DBGBVR4 - bitset(string("11111111111111000000")), - // MISCREG_DBGBVR5 - bitset(string("11111111111111000000")), - // MISCREG_DBGBCR0 - bitset(string("11111111111111000000")), - // MISCREG_DBGBCR1 - bitset(string("11111111111111000000")), - // MISCREG_DBGBCR2 - bitset(string("11111111111111000000")), - // MISCREG_DBGBCR3 - bitset(string("11111111111111000000")), - // MISCREG_DBGBCR4 - bitset(string("11111111111111000000")), - // MISCREG_DBGBCR5 - bitset(string("11111111111111000000")), - // MISCREG_DBGWVR0 - bitset(string("11111111111111000000")), - // MISCREG_DBGWVR1 - bitset(string("11111111111111000000")), - // MISCREG_DBGWVR2 - bitset(string("11111111111111000000")), - // MISCREG_DBGWVR3 - bitset(string("11111111111111000000")), - // MISCREG_DBGWCR0 - bitset(string("11111111111111000000")), - // MISCREG_DBGWCR1 - bitset(string("11111111111111000000")), - // MISCREG_DBGWCR2 - bitset(string("11111111111111000000")), - // MISCREG_DBGWCR3 - bitset(string("11111111111111000000")), - // MISCREG_DBGDRAR - bitset(string("01011111111111000000")), - // MISCREG_DBGBXVR4 - bitset(string("11111111111111000000")), - // MISCREG_DBGBXVR5 - bitset(string("11111111111111000000")), - // MISCREG_DBGOSLAR - bitset(string("10101111111111000000")), - // MISCREG_DBGOSLSR - bitset(string("01011111111111000000")), - // MISCREG_DBGOSDLR - bitset(string("11111111111111000000")), - // MISCREG_DBGPRCR - bitset(string("11111111111111000000")), - // MISCREG_DBGDSAR - bitset(string("01011111111111000000")), - // MISCREG_DBGCLAIMSET - bitset(string("11111111111111000000")), - // MISCREG_DBGCLAIMCLR - bitset(string("11111111111111000000")), - // MISCREG_DBGAUTHSTATUS - bitset(string("01011111111111000000")), - // MISCREG_DBGDEVID2 - bitset(string("01011111111111000000")), - // MISCREG_DBGDEVID1 - bitset(string("01011111111111000000")), - // MISCREG_DBGDEVID0 - bitset(string("01011111111111000000")), - // MISCREG_TEECR - bitset(string("11111111111111000000")), - // MISCREG_JIDR - bitset(string("11111111111111000001")), - // MISCREG_TEEHBR - bitset(string("11111111111111000001")), - // MISCREG_JOSCR - bitset(string("11111111111111000001")), - // MISCREG_JMCR - bitset(string("11111111111111000001")), - - // AArch32 CP15 registers - // MISCREG_MIDR - bitset(string("01010101010000000001")), - // MISCREG_CTR - bitset(string("01010101010000000001")), - // MISCREG_TCMTR - bitset(string("01010101010000000001")), - // MISCREG_TLBTR - bitset(string("01010101010000000001")), - // MISCREG_MPIDR - bitset(string("01010101010000000001")), - // MISCREG_REVIDR - bitset(string("01010101010000000100")), - // MISCREG_ID_PFR0 - bitset(string("01010101010000000001")), - // MISCREG_ID_PFR1 - bitset(string("01010101010000000001")), - // MISCREG_ID_DFR0 - bitset(string("01010101010000000001")), - // MISCREG_ID_AFR0 - bitset(string("01010101010000000001")), - // MISCREG_ID_MMFR0 - bitset(string("01010101010000000001")), - // MISCREG_ID_MMFR1 - bitset(string("01010101010000000001")), - // MISCREG_ID_MMFR2 - bitset(string("01010101010000000001")), - // MISCREG_ID_MMFR3 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR0 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR1 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR2 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR3 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR4 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR5 - bitset(string("01010101010000000001")), - // MISCREG_CCSIDR - bitset(string("01010101010000000001")), - // MISCREG_CLIDR - bitset(string("01010101010000000001")), - // MISCREG_AIDR - bitset(string("01010101010000000001")), - // MISCREG_CSSELR - bitset(string("00000000000000010001")), - // MISCREG_CSSELR_NS - bitset(string("11001111110000100001")), - // MISCREG_CSSELR_S - bitset(string("00110011000000100001")), - // MISCREG_VPIDR - bitset(string("11001100000000000001")), - // MISCREG_VMPIDR - bitset(string("11001100000000000001")), - // MISCREG_SCTLR - bitset(string("00000000000000010001")), - // MISCREG_SCTLR_NS - bitset(string("11001111110000100001")), - // MISCREG_SCTLR_S - bitset(string("00110011000000100001")), - // MISCREG_ACTLR - bitset(string("00000000000000010001")), - // MISCREG_ACTLR_NS - bitset(string("11001111110000100001")), - // MISCREG_ACTLR_S - bitset(string("00110011000000100001")), - // MISCREG_CPACR - bitset(string("11111111110000000001")), - // MISCREG_SCR - bitset(string("11110011000000000001")), - // MISCREG_SDER - bitset(string("11110000000000000001")), - // MISCREG_NSACR - bitset(string("11110111010000000001")), - // MISCREG_HSCTLR - bitset(string("11001100000000000001")), - // MISCREG_HACTLR - bitset(string("11001100000000000001")), - // MISCREG_HCR - bitset(string("11001100000000000001")), - // MISCREG_HDCR - bitset(string("11001100000000000001")), - // MISCREG_HCPTR - bitset(string("11001100000000000001")), - // MISCREG_HSTR - bitset(string("11001100000000000001")), - // MISCREG_HACR - bitset(string("11001100000000000100")), - // MISCREG_TTBR0 - bitset(string("00000000000000010001")), - // MISCREG_TTBR0_NS - bitset(string("11001111110000100001")), - // MISCREG_TTBR0_S - bitset(string("00110011000000100001")), - // MISCREG_TTBR1 - bitset(string("00000000000000010001")), - // MISCREG_TTBR1_NS - bitset(string("11001111110000100001")), - // MISCREG_TTBR1_S - bitset(string("00110011000000100001")), - // MISCREG_TTBCR - bitset(string("00000000000000010001")), - // MISCREG_TTBCR_NS - bitset(string("11001111110000100001")), - // MISCREG_TTBCR_S - bitset(string("00110011000000100001")), - // MISCREG_HTCR - bitset(string("11001100000000000001")), - // MISCREG_VTCR - bitset(string("11001100000000000001")), - // MISCREG_DACR - bitset(string("00000000000000010001")), - // MISCREG_DACR_NS - bitset(string("11001111110000100001")), - // MISCREG_DACR_S - bitset(string("00110011000000100001")), - // MISCREG_DFSR - bitset(string("00000000000000010001")), - // MISCREG_DFSR_NS - bitset(string("11001111110000100001")), - // MISCREG_DFSR_S - bitset(string("00110011000000100001")), - // MISCREG_IFSR - bitset(string("00000000000000010001")), - // MISCREG_IFSR_NS - bitset(string("11001111110000100001")), - // MISCREG_IFSR_S - bitset(string("00110011000000100001")), - // MISCREG_ADFSR - bitset(string("00000000000000010100")), - // MISCREG_ADFSR_NS - bitset(string("11001111110000100100")), - // MISCREG_ADFSR_S - bitset(string("00110011000000100100")), - // MISCREG_AIFSR - bitset(string("00000000000000010100")), - // MISCREG_AIFSR_NS - bitset(string("11001111110000100100")), - // MISCREG_AIFSR_S - bitset(string("00110011000000100100")), - // MISCREG_HADFSR - bitset(string("11001100000000000001")), - // MISCREG_HAIFSR - bitset(string("11001100000000000001")), - // MISCREG_HSR - bitset(string("11001100000000000001")), - // MISCREG_DFAR - bitset(string("00000000000000010001")), - // MISCREG_DFAR_NS - bitset(string("11001111110000100001")), - // MISCREG_DFAR_S - bitset(string("00110011000000100001")), - // MISCREG_IFAR - bitset(string("00000000000000010001")), - // MISCREG_IFAR_NS - bitset(string("11001111110000100001")), - // MISCREG_IFAR_S - bitset(string("00110011000000100001")), - // MISCREG_HDFAR - bitset(string("11001100000000000001")), - // MISCREG_HIFAR - bitset(string("11001100000000000001")), - // MISCREG_HPFAR - bitset(string("11001100000000000001")), - // MISCREG_ICIALLUIS - bitset(string("10101010100000000100")), - // MISCREG_BPIALLIS - bitset(string("10101010100000000100")), - // MISCREG_PAR - bitset(string("00000000000000010001")), - // MISCREG_PAR_NS - bitset(string("11001111110000100001")), - // MISCREG_PAR_S - bitset(string("00110011000000100001")), - // MISCREG_ICIALLU - bitset(string("10101010100000000001")), - // MISCREG_ICIMVAU - bitset(string("10101010100000000100")), - // MISCREG_CP15ISB - bitset(string("10101010101010000001")), - // MISCREG_BPIALL - bitset(string("10101010100000000100")), - // MISCREG_BPIMVA - bitset(string("10101010100000000100")), - // MISCREG_DCIMVAC - bitset(string("10101010100000000100")), - // MISCREG_DCISW - bitset(string("10101010100000000100")), - // MISCREG_ATS1CPR - bitset(string("10101010100000000001")), - // MISCREG_ATS1CPW - bitset(string("10101010100000000001")), - // MISCREG_ATS1CUR - bitset(string("10101010100000000001")), - // MISCREG_ATS1CUW - bitset(string("10101010100000000001")), - // MISCREG_ATS12NSOPR - bitset(string("10101010000000000001")), - // MISCREG_ATS12NSOPW - bitset(string("10101010000000000001")), - // MISCREG_ATS12NSOUR - bitset(string("10101010000000000001")), - // MISCREG_ATS12NSOUW - bitset(string("10101010000000000001")), - // MISCREG_DCCMVAC - bitset(string("10101010100000000001")), - // MISCREG_DCCSW - bitset(string("10101010100000000100")), - // MISCREG_CP15DSB - bitset(string("10101010101010000001")), - // MISCREG_CP15DMB - bitset(string("10101010101010000001")), - // MISCREG_DCCMVAU - bitset(string("10101010100000000100")), - // MISCREG_DCCIMVAC - bitset(string("10101010100000000100")), - // MISCREG_DCCISW - bitset(string("10101010100000000100")), - // MISCREG_ATS1HR - bitset(string("10001000000000000001")), - // MISCREG_ATS1HW - bitset(string("10001000000000000001")), - // MISCREG_TLBIALLIS - bitset(string("10101010100000000001")), - // MISCREG_TLBIMVAIS - bitset(string("10101010100000000001")), - // MISCREG_TLBIASIDIS - bitset(string("10101010100000000001")), - // MISCREG_TLBIMVAAIS - bitset(string("10101010100000000001")), - // MISCREG_TLBIMVALIS - bitset(string("10101010100000000000")), - // MISCREG_TLBIMVAALIS - bitset(string("10101010100000000000")), - // MISCREG_ITLBIALL - bitset(string("10101010100000000001")), - // MISCREG_ITLBIMVA - bitset(string("10101010100000000001")), - // MISCREG_ITLBIASID - bitset(string("10101010100000000001")), - // MISCREG_DTLBIALL - bitset(string("10101010100000000001")), - // MISCREG_DTLBIMVA - bitset(string("10101010100000000001")), - // MISCREG_DTLBIASID - bitset(string("10101010100000000001")), - // MISCREG_TLBIALL - bitset(string("10101010100000000001")), - // MISCREG_TLBIMVA - bitset(string("10101010100000000001")), - // MISCREG_TLBIASID - bitset(string("10101010100000000001")), - // MISCREG_TLBIMVAA - bitset(string("10101010100000000001")), - // MISCREG_TLBIMVAL - bitset(string("10101010100000000000")), - // MISCREG_TLBIMVAAL - bitset(string("10101010100000000000")), - // MISCREG_TLBIIPAS2IS - bitset(string("10001000000000000000")), - // MISCREG_TLBIIPAS2LIS - bitset(string("10001000000000000000")), - // MISCREG_TLBIALLHIS - bitset(string("10001000000000000001")), - // MISCREG_TLBIMVAHIS - bitset(string("10001000000000000001")), - // MISCREG_TLBIALLNSNHIS - bitset(string("10001000000000000001")), - // MISCREG_TLBIMVALHIS - bitset(string("10001000000000000000")), - // MISCREG_TLBIIPAS2 - bitset(string("10001000000000000000")), - // MISCREG_TLBIIPAS2L - bitset(string("10001000000000000000")), - // MISCREG_TLBIALLH - bitset(string("10001000000000000001")), - // MISCREG_TLBIMVAH - bitset(string("10001000000000000001")), - // MISCREG_TLBIALLNSNH - bitset(string("10001000000000000001")), - // MISCREG_TLBIMVALH - bitset(string("10001000000000000000")), - // MISCREG_PMCR - bitset(string("11111111111111000001")), - // MISCREG_PMCNTENSET - bitset(string("11111111111111000001")), - // MISCREG_PMCNTENCLR - bitset(string("11111111111111000001")), - // MISCREG_PMOVSR - bitset(string("11111111111111000001")), - // MISCREG_PMSWINC - bitset(string("11111111111111000001")), - // MISCREG_PMSELR - bitset(string("11111111111111000001")), - // MISCREG_PMCEID0 - bitset(string("11111111111111000001")), - // MISCREG_PMCEID1 - bitset(string("11111111111111000001")), - // MISCREG_PMCCNTR - bitset(string("11111111111111000001")), - // MISCREG_PMXEVTYPER - bitset(string("11111111111111000001")), - // MISCREG_PMCCFILTR - bitset(string("11111111111111000001")), - // MISCREG_PMXEVCNTR - bitset(string("11111111111111000001")), - // MISCREG_PMUSERENR - bitset(string("11111111110101000001")), - // MISCREG_PMINTENSET - bitset(string("11111111110000000001")), - // MISCREG_PMINTENCLR - bitset(string("11111111110000000001")), - // MISCREG_PMOVSSET - bitset(string("11111111111111000000")), - // MISCREG_L2CTLR - bitset(string("11111111110000000001")), - // MISCREG_L2ECTLR - bitset(string("11111111110000000000")), - // MISCREG_PRRR - bitset(string("00000000000000010001")), - // MISCREG_PRRR_NS - bitset(string("11001111110000100001")), - // MISCREG_PRRR_S - bitset(string("00110011000000100001")), - // MISCREG_MAIR0 - bitset(string("00000000000000010001")), - // MISCREG_MAIR0_NS - bitset(string("11001111110000100001")), - // MISCREG_MAIR0_S - bitset(string("00110011000000100001")), - // MISCREG_NMRR - bitset(string("00000000000000010001")), - // MISCREG_NMRR_NS - bitset(string("11001111110000100001")), - // MISCREG_NMRR_S - bitset(string("00110011000000100001")), - // MISCREG_MAIR1 - bitset(string("00000000000000010001")), - // MISCREG_MAIR1_NS - bitset(string("11001111110000100001")), - // MISCREG_MAIR1_S - bitset(string("00110011000000100001")), - // MISCREG_AMAIR0 - bitset(string("00000000000000010001")), - // MISCREG_AMAIR0_NS - bitset(string("11001111110000100001")), - // MISCREG_AMAIR0_S - bitset(string("00110011000000100001")), - // MISCREG_AMAIR1 - bitset(string("00000000000000010001")), - // MISCREG_AMAIR1_NS - bitset(string("11001111110000100001")), - // MISCREG_AMAIR1_S - bitset(string("00110011000000100001")), - // MISCREG_HMAIR0 - bitset(string("11001100000000000001")), - // MISCREG_HMAIR1 - bitset(string("11001100000000000001")), - // MISCREG_HAMAIR0 - bitset(string("11001100000000000100")), - // MISCREG_HAMAIR1 - bitset(string("11001100000000000100")), - // MISCREG_VBAR - bitset(string("00000000000000010001")), - // MISCREG_VBAR_NS - bitset(string("11001111110000100001")), - // MISCREG_VBAR_S - bitset(string("00110011000000100001")), - // MISCREG_MVBAR - bitset(string("11110011000000000001")), - // MISCREG_RMR - bitset(string("11110011000000000000")), - // MISCREG_ISR - bitset(string("01010101010000000001")), - // MISCREG_HVBAR - bitset(string("11001100000000000001")), - // MISCREG_FCSEIDR - bitset(string("11111111110000000100")), - // MISCREG_CONTEXTIDR - bitset(string("00000000000000010001")), - // MISCREG_CONTEXTIDR_NS - bitset(string("11001111110000100001")), - // MISCREG_CONTEXTIDR_S - bitset(string("00110011000000100001")), - // MISCREG_TPIDRURW - bitset(string("00000000000000010001")), - // MISCREG_TPIDRURW_NS - bitset(string("11001111111111100001")), - // MISCREG_TPIDRURW_S - bitset(string("00110011001100100001")), - // MISCREG_TPIDRURO - bitset(string("00000000000000010001")), - // MISCREG_TPIDRURO_NS - bitset(string("11001111110101100001")), - // MISCREG_TPIDRURO_S - bitset(string("00110011000100100001")), - // MISCREG_TPIDRPRW - bitset(string("00000000000000010001")), - // MISCREG_TPIDRPRW_NS - bitset(string("11001111110000100001")), - // MISCREG_TPIDRPRW_S - bitset(string("00110011000000100001")), - // MISCREG_HTPIDR - bitset(string("11001100000000000001")), - // MISCREG_CNTFRQ - bitset(string("11110101010101000011")), - // MISCREG_CNTKCTL - bitset(string("11111111110000000001")), - // MISCREG_CNTP_TVAL - bitset(string("00000000000000010001")), - // MISCREG_CNTP_TVAL_NS - bitset(string("11001111111111100001")), - // MISCREG_CNTP_TVAL_S - bitset(string("00110011001111100000")), - // MISCREG_CNTP_CTL - bitset(string("00000000000000010001")), - // MISCREG_CNTP_CTL_NS - bitset(string("11001111111111100001")), - // MISCREG_CNTP_CTL_S - bitset(string("00110011001111100000")), - // MISCREG_CNTV_TVAL - bitset(string("11111111111111000001")), - // MISCREG_CNTV_CTL - bitset(string("11111111111111000001")), - // MISCREG_CNTHCTL - bitset(string("01001000000000000000")), - // MISCREG_CNTHP_TVAL - bitset(string("01001000000000000000")), - // MISCREG_CNTHP_CTL - bitset(string("01001000000000000000")), - // MISCREG_IL1DATA0 - bitset(string("11111111110000000000")), - // MISCREG_IL1DATA1 - bitset(string("11111111110000000000")), - // MISCREG_IL1DATA2 - bitset(string("11111111110000000000")), - // MISCREG_IL1DATA3 - bitset(string("11111111110000000000")), - // MISCREG_DL1DATA0 - bitset(string("11111111110000000000")), - // MISCREG_DL1DATA1 - bitset(string("11111111110000000000")), - // MISCREG_DL1DATA2 - bitset(string("11111111110000000000")), - // MISCREG_DL1DATA3 - bitset(string("11111111110000000000")), - // MISCREG_DL1DATA4 - bitset(string("11111111110000000000")), - // MISCREG_RAMINDEX - bitset(string("10101010100000000000")), - // MISCREG_L2ACTLR - bitset(string("11111111110000000000")), - // MISCREG_CBAR - bitset(string("01010101010000000000")), - // MISCREG_HTTBR - bitset(string("11001100000000000001")), - // MISCREG_VTTBR - bitset(string("11001100000000000001")), - // MISCREG_CNTPCT - bitset(string("01010101010101000001")), - // MISCREG_CNTVCT - bitset(string("01010101010101000011")), - // MISCREG_CNTP_CVAL - bitset(string("00000000000000010001")), - // MISCREG_CNTP_CVAL_NS - bitset(string("11001111111111100001")), - // MISCREG_CNTP_CVAL_S - bitset(string("00110011001111100000")), - // MISCREG_CNTV_CVAL - bitset(string("11111111111111000001")), - // MISCREG_CNTVOFF - bitset(string("11001100000000000001")), - // MISCREG_CNTHP_CVAL - bitset(string("01001000000000000000")), - // MISCREG_CPUMERRSR - bitset(string("11111111110000000000")), - // MISCREG_L2MERRSR - bitset(string("11111111110000000100")), - - // AArch64 registers (Op0=2) - // MISCREG_MDCCINT_EL1 - bitset(string("11111111111111000001")), - // MISCREG_OSDTRRX_EL1 - bitset(string("11111111111111000001")), - // MISCREG_MDSCR_EL1 - bitset(string("11111111111111000001")), - // MISCREG_OSDTRTX_EL1 - bitset(string("11111111111111000001")), - // MISCREG_OSECCR_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBVR0_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBVR1_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBVR2_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBVR3_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBVR4_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBVR5_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBCR0_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBCR1_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBCR2_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBCR3_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBCR4_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGBCR5_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGWVR0_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGWVR1_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGWVR2_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGWVR3_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGWCR0_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGWCR1_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGWCR2_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGWCR3_EL1 - bitset(string("11111111111111000001")), - // MISCREG_MDCCSR_EL0 - bitset(string("01011111111111000001")), - // MISCREG_MDDTR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_MDDTRTX_EL0 - bitset(string("11111111111111000001")), - // MISCREG_MDDTRRX_EL0 - bitset(string("11111111111111000001")), - // MISCREG_DBGVCR32_EL2 - bitset(string("11111111111111000001")), - // MISCREG_MDRAR_EL1 - bitset(string("01011111111111000001")), - // MISCREG_OSLAR_EL1 - bitset(string("10101111111111000001")), - // MISCREG_OSLSR_EL1 - bitset(string("01011111111111000001")), - // MISCREG_OSDLR_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGPRCR_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGCLAIMSET_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGCLAIMCLR_EL1 - bitset(string("11111111111111000001")), - // MISCREG_DBGAUTHSTATUS_EL1 - bitset(string("01011111111111000001")), - // MISCREG_TEECR32_EL1 - bitset(string("00000000000000000001")), - // MISCREG_TEEHBR32_EL1 - bitset(string("00000000000000000001")), - - // AArch64 registers (Op0=1,3) - // MISCREG_MIDR_EL1 - bitset(string("01010101010000000001")), - // MISCREG_MPIDR_EL1 - bitset(string("01010101010000000001")), - // MISCREG_REVIDR_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_PFR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_PFR1_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_DFR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AFR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_MMFR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_MMFR1_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_MMFR2_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_MMFR3_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR1_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR2_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR3_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR4_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_ISAR5_EL1 - bitset(string("01010101010000000001")), - // MISCREG_MVFR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_MVFR1_EL1 - bitset(string("01010101010000000001")), - // MISCREG_MVFR2_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64PFR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64PFR1_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64DFR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64DFR1_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64AFR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64AFR1_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64ISAR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64ISAR1_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64MMFR0_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ID_AA64MMFR1_EL1 - bitset(string("01010101010000000001")), - // MISCREG_CCSIDR_EL1 - bitset(string("01010101010000000001")), - // MISCREG_CLIDR_EL1 - bitset(string("01010101010000000001")), - // MISCREG_AIDR_EL1 - bitset(string("01010101010000000001")), - // MISCREG_CSSELR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_CTR_EL0 - bitset(string("01010101010101000001")), - // MISCREG_DCZID_EL0 - bitset(string("01010101010101000001")), - // MISCREG_VPIDR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_VMPIDR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_SCTLR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_ACTLR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_CPACR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_SCTLR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_ACTLR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_HCR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_MDCR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_CPTR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_HSTR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_HACR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_SCTLR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_ACTLR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_SCR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_SDER32_EL3 - bitset(string("11110000000000000001")), - // MISCREG_CPTR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_MDCR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_TTBR0_EL1 - bitset(string("11111111110000000001")), - // MISCREG_TTBR1_EL1 - bitset(string("11111111110000000001")), - // MISCREG_TCR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_TTBR0_EL2 - bitset(string("11111100000000000001")), - // MISCREG_TCR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_VTTBR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_VTCR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_TTBR0_EL3 - bitset(string("11110000000000000001")), - // MISCREG_TCR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_DACR32_EL2 - bitset(string("11111100000000000001")), - // MISCREG_SPSR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_ELR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_SP_EL0 - bitset(string("11111111110000000001")), - // MISCREG_SPSEL - bitset(string("11111111110000000001")), - // MISCREG_CURRENTEL - bitset(string("01010101010000000001")), - // MISCREG_NZCV - bitset(string("11111111111111000001")), - // MISCREG_DAIF - bitset(string("11111111111111000001")), - // MISCREG_FPCR - bitset(string("11111111111111000001")), - // MISCREG_FPSR - bitset(string("11111111111111000001")), - // MISCREG_DSPSR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_DLR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_SPSR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_ELR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_SP_EL1 - bitset(string("11111100000000000001")), - // MISCREG_SPSR_IRQ_AA64 - bitset(string("11111100000000000001")), - // MISCREG_SPSR_ABT_AA64 - bitset(string("11111100000000000001")), - // MISCREG_SPSR_UND_AA64 - bitset(string("11111100000000000001")), - // MISCREG_SPSR_FIQ_AA64 - bitset(string("11111100000000000001")), - // MISCREG_SPSR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_ELR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_SP_EL2 - bitset(string("11110000000000000001")), - // MISCREG_AFSR0_EL1 - bitset(string("11111111110000000001")), - // MISCREG_AFSR1_EL1 - bitset(string("11111111110000000001")), - // MISCREG_ESR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_IFSR32_EL2 - bitset(string("11111100000000000001")), - // MISCREG_AFSR0_EL2 - bitset(string("11111100000000000001")), - // MISCREG_AFSR1_EL2 - bitset(string("11111100000000000001")), - // MISCREG_ESR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_FPEXC32_EL2 - bitset(string("11111100000000000001")), - // MISCREG_AFSR0_EL3 - bitset(string("11110000000000000001")), - // MISCREG_AFSR1_EL3 - bitset(string("11110000000000000001")), - // MISCREG_ESR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_FAR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_FAR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_HPFAR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_FAR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_IC_IALLUIS - bitset(string("10101010100000000101")), - // MISCREG_PAR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_IC_IALLU - bitset(string("10101010100000000101")), - // MISCREG_DC_IVAC_Xt - bitset(string("10101010101010000101")), - // MISCREG_DC_ISW_Xt - bitset(string("10101010100000000101")), - // MISCREG_AT_S1E1R_Xt - bitset(string("10101010100000000001")), - // MISCREG_AT_S1E1W_Xt - bitset(string("10101010100000000001")), - // MISCREG_AT_S1E0R_Xt - bitset(string("10101010100000000001")), - // MISCREG_AT_S1E0W_Xt - bitset(string("10101010100000000001")), - // MISCREG_DC_CSW_Xt - bitset(string("10101010100000000101")), - // MISCREG_DC_CISW_Xt - bitset(string("10101010100000000101")), - // MISCREG_DC_ZVA_Xt - bitset(string("10101010100010000101")), - // MISCREG_IC_IVAU_Xt - bitset(string("10101010101010000001")), - // MISCREG_DC_CVAC_Xt - bitset(string("10101010101010000101")), - // MISCREG_DC_CVAU_Xt - bitset(string("10101010101010000101")), - // MISCREG_DC_CIVAC_Xt - bitset(string("10101010101010000101")), - // MISCREG_AT_S1E2R_Xt - bitset(string("10001000000000000001")), - // MISCREG_AT_S1E2W_Xt - bitset(string("10001000000000000001")), - // MISCREG_AT_S12E1R_Xt - bitset(string("10101000000000000001")), - // MISCREG_AT_S12E1W_Xt - bitset(string("10101000000000000001")), - // MISCREG_AT_S12E0R_Xt - bitset(string("10101000000000000001")), - // MISCREG_AT_S12E0W_Xt - bitset(string("10101000000000000001")), - // MISCREG_AT_S1E3R_Xt - bitset(string("10100000000000000001")), - // MISCREG_AT_S1E3W_Xt - bitset(string("10100000000000000001")), - // MISCREG_TLBI_VMALLE1IS - bitset(string("10101010100000000001")), - // MISCREG_TLBI_VAE1IS_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_ASIDE1IS_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_VAAE1IS_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_VALE1IS_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_VAALE1IS_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_VMALLE1 - bitset(string("10101010100000000001")), - // MISCREG_TLBI_VAE1_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_ASIDE1_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_VAAE1_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_VALE1_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_VAALE1_Xt - bitset(string("10101010100000000001")), - // MISCREG_TLBI_IPAS2E1IS_Xt - bitset(string("10101000000000000001")), - // MISCREG_TLBI_IPAS2LE1IS_Xt - bitset(string("10101000000000000001")), - // MISCREG_TLBI_ALLE2IS - bitset(string("10001000000000000001")), - // MISCREG_TLBI_VAE2IS_Xt - bitset(string("10001000000000000001")), - // MISCREG_TLBI_ALLE1IS - bitset(string("10101000000000000001")), - // MISCREG_TLBI_VALE2IS_Xt - bitset(string("10001000000000000001")), - // MISCREG_TLBI_VMALLS12E1IS - bitset(string("10101000000000000001")), - // MISCREG_TLBI_IPAS2E1_Xt - bitset(string("10101000000000000001")), - // MISCREG_TLBI_IPAS2LE1_Xt - bitset(string("10101000000000000001")), - // MISCREG_TLBI_ALLE2 - bitset(string("10001000000000000001")), - // MISCREG_TLBI_VAE2_Xt - bitset(string("10001000000000000001")), - // MISCREG_TLBI_ALLE1 - bitset(string("10101000000000000001")), - // MISCREG_TLBI_VALE2_Xt - bitset(string("10001000000000000001")), - // MISCREG_TLBI_VMALLS12E1 - bitset(string("10101000000000000001")), - // MISCREG_TLBI_ALLE3IS - bitset(string("10100000000000000001")), - // MISCREG_TLBI_VAE3IS_Xt - bitset(string("10100000000000000001")), - // MISCREG_TLBI_VALE3IS_Xt - bitset(string("10100000000000000001")), - // MISCREG_TLBI_ALLE3 - bitset(string("10100000000000000001")), - // MISCREG_TLBI_VAE3_Xt - bitset(string("10100000000000000001")), - // MISCREG_TLBI_VALE3_Xt - bitset(string("10100000000000000001")), - // MISCREG_PMINTENSET_EL1 - bitset(string("11111111110000000001")), - // MISCREG_PMINTENCLR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_PMCR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMCNTENSET_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMCNTENCLR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMOVSCLR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMSWINC_EL0 - bitset(string("10101010101111000001")), - // MISCREG_PMSELR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMCEID0_EL0 - bitset(string("01010101011111000001")), - // MISCREG_PMCEID1_EL0 - bitset(string("01010101011111000001")), - // MISCREG_PMCCNTR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMXEVTYPER_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMCCFILTR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMXEVCNTR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMUSERENR_EL0 - bitset(string("11111111110101000001")), - // MISCREG_PMOVSSET_EL0 - bitset(string("11111111111111000001")), - // MISCREG_MAIR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_AMAIR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_MAIR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_AMAIR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_MAIR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_AMAIR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_L2CTLR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_L2ECTLR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_VBAR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_RVBAR_EL1 - bitset(string("01010101010000000001")), - // MISCREG_ISR_EL1 - bitset(string("01010101010000000001")), - // MISCREG_VBAR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_RVBAR_EL2 - bitset(string("01010100000000000001")), - // MISCREG_VBAR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_RVBAR_EL3 - bitset(string("01010000000000000001")), - // MISCREG_RMR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_CONTEXTIDR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_TPIDR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_TPIDR_EL0 - bitset(string("11111111111111000001")), - // MISCREG_TPIDRRO_EL0 - bitset(string("11111111110101000001")), - // MISCREG_TPIDR_EL2 - bitset(string("11111100000000000001")), - // MISCREG_TPIDR_EL3 - bitset(string("11110000000000000001")), - // MISCREG_CNTKCTL_EL1 - bitset(string("11111111110000000001")), - // MISCREG_CNTFRQ_EL0 - bitset(string("11110101010101000001")), - // MISCREG_CNTPCT_EL0 - bitset(string("01010101010101000001")), - // MISCREG_CNTVCT_EL0 - bitset(string("01010101010101000011")), - // MISCREG_CNTP_TVAL_EL0 - bitset(string("11111111111111000001")), - // MISCREG_CNTP_CTL_EL0 - bitset(string("11111111111111000001")), - // MISCREG_CNTP_CVAL_EL0 - bitset(string("11111111111111000001")), - // MISCREG_CNTV_TVAL_EL0 - bitset(string("11111111111111000001")), - // MISCREG_CNTV_CTL_EL0 - bitset(string("11111111111111000001")), - // MISCREG_CNTV_CVAL_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVCNTR0_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVCNTR1_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVCNTR2_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVCNTR3_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVCNTR4_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVCNTR5_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVTYPER0_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVTYPER1_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVTYPER2_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVTYPER3_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVTYPER4_EL0 - bitset(string("11111111111111000001")), - // MISCREG_PMEVTYPER5_EL0 - bitset(string("11111111111111000001")), - // MISCREG_CNTVOFF_EL2 - bitset(string("11111100000000000001")), - // MISCREG_CNTHCTL_EL2 - bitset(string("01111000000000000100")), - // MISCREG_CNTHP_TVAL_EL2 - bitset(string("01111000000000000000")), - // MISCREG_CNTHP_CTL_EL2 - bitset(string("01111000000000000000")), - // MISCREG_CNTHP_CVAL_EL2 - bitset(string("01111000000000000000")), - // MISCREG_CNTPS_TVAL_EL1 - bitset(string("01111000000000000000")), - // MISCREG_CNTPS_CTL_EL1 - bitset(string("01111000000000000000")), - // MISCREG_CNTPS_CVAL_EL1 - bitset(string("01111000000000000000")), - // MISCREG_IL1DATA0_EL1 - bitset(string("11111111110000000001")), - // MISCREG_IL1DATA1_EL1 - bitset(string("11111111110000000001")), - // MISCREG_IL1DATA2_EL1 - bitset(string("11111111110000000001")), - // MISCREG_IL1DATA3_EL1 - bitset(string("11111111110000000001")), - // MISCREG_DL1DATA0_EL1 - bitset(string("11111111110000000001")), - // MISCREG_DL1DATA1_EL1 - bitset(string("11111111110000000001")), - // MISCREG_DL1DATA2_EL1 - bitset(string("11111111110000000001")), - // MISCREG_DL1DATA3_EL1 - bitset(string("11111111110000000001")), - // MISCREG_DL1DATA4_EL1 - bitset(string("11111111110000000001")), - // MISCREG_L2ACTLR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_CPUACTLR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_CPUECTLR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_CPUMERRSR_EL1 - bitset(string("11111111110000000001")), - // MISCREG_L2MERRSR_EL1 - bitset(string("11111111110000000100")), - // MISCREG_CBAR_EL1 - bitset(string("01010101010000000001")), - // MISCREG_CONTEXTIDR_EL2 - bitset(string("11111100000000000001")), - - // Dummy registers - // MISCREG_NOP - bitset(string("11111111111111000001")), - // MISCREG_RAZ - bitset(string("01010101010000000001")), - // MISCREG_CP14_UNIMPL - bitset(string("00000000000000000100")), - // MISCREG_CP15_UNIMPL - bitset(string("00000000000000000100")), - // MISCREG_A64_UNIMPL - bitset(string("00000000000000000100")), - // MISCREG_UNKNOWN - bitset(string("00000000000000000001")) -}; - MiscRegIndex decodeCP15Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2) { @@ -3561,4 +2334,1600 @@ decodeAArch64SysReg(unsigned op0, unsigned op1, return MISCREG_UNKNOWN; } +bitset miscRegInfo[NUM_MISCREGS]; // initialized below + +void +ISA::initializeMiscRegMetadata() +{ + // the MiscReg metadata tables are shared across all instances of the + // ISA object, so there's no need to initialize them multiple times. + static bool completed = false; + if (completed) + return; + + /** + * Some registers alias with others, and therefore need to be translated. + * When two mapping registers are given, they are the 32b lower and + * upper halves, respectively, of the 64b register being mapped. + * aligned with reference documentation ARM DDI 0487A.i pp 1540-1543 + * + * NAM = "not architecturally mandated", + * from ARM DDI 0487A.i, template text + * "AArch64 System register ___ can be mapped to + * AArch32 System register ___, but this is not + * architecturally mandated." + */ + + InitReg(MISCREG_CPSR) + .allPrivileges(); + InitReg(MISCREG_SPSR) + .allPrivileges(); + InitReg(MISCREG_SPSR_FIQ) + .allPrivileges(); + InitReg(MISCREG_SPSR_IRQ) + .allPrivileges(); + InitReg(MISCREG_SPSR_SVC) + .allPrivileges(); + InitReg(MISCREG_SPSR_MON) + .allPrivileges(); + InitReg(MISCREG_SPSR_ABT) + .allPrivileges(); + InitReg(MISCREG_SPSR_HYP) + .allPrivileges(); + InitReg(MISCREG_SPSR_UND) + .allPrivileges(); + InitReg(MISCREG_ELR_HYP) + .allPrivileges(); + InitReg(MISCREG_FPSID) + .allPrivileges(); + InitReg(MISCREG_FPSCR) + .allPrivileges(); + InitReg(MISCREG_MVFR1) + .allPrivileges(); + InitReg(MISCREG_MVFR0) + .allPrivileges(); + InitReg(MISCREG_FPEXC) + .allPrivileges(); + + // Helper registers + InitReg(MISCREG_CPSR_MODE) + .allPrivileges(); + InitReg(MISCREG_CPSR_Q) + .allPrivileges(); + InitReg(MISCREG_FPSCR_EXC) + .allPrivileges(); + InitReg(MISCREG_FPSCR_QC) + .allPrivileges(); + InitReg(MISCREG_LOCKADDR) + .allPrivileges(); + InitReg(MISCREG_LOCKFLAG) + .allPrivileges(); + InitReg(MISCREG_PRRR_MAIR0) + .mutex() + .banked(); + InitReg(MISCREG_PRRR_MAIR0_NS) + .mutex() + .bankedChild(); + InitReg(MISCREG_PRRR_MAIR0_S) + .mutex() + .bankedChild(); + InitReg(MISCREG_NMRR_MAIR1) + .mutex() + .banked(); + InitReg(MISCREG_NMRR_MAIR1_NS) + .mutex() + .bankedChild(); + InitReg(MISCREG_NMRR_MAIR1_S) + .mutex() + .bankedChild(); + InitReg(MISCREG_PMXEVTYPER_PMCCFILTR) + .mutex(); + InitReg(MISCREG_SCTLR_RST) + .allPrivileges(); + InitReg(MISCREG_SEV_MAILBOX) + .allPrivileges(); + + // AArch32 CP14 registers + InitReg(MISCREG_DBGDIDR) + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); + InitReg(MISCREG_DBGDSCRint) + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); + InitReg(MISCREG_DBGDCCINT) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGDTRTXint) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGDTRRXint) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGWFAR) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGVCR) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGDTRRXext) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGDSCRext) + .unimplemented() + .warnNotFail() + .allPrivileges(); + InitReg(MISCREG_DBGDTRTXext) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGOSECCR) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBVR0) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBVR1) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBVR2) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBVR3) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBVR4) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBVR5) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBCR0) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBCR1) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBCR2) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBCR3) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBCR4) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBCR5) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGWVR0) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGWVR1) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGWVR2) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGWVR3) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGWCR0) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGWCR1) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGWCR2) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGWCR3) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGDRAR) + .unimplemented() + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); + InitReg(MISCREG_DBGBXVR4) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGBXVR5) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGOSLAR) + .unimplemented() + .allPrivileges().monSecureRead(0).monNonSecureRead(0); + InitReg(MISCREG_DBGOSLSR) + .unimplemented() + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); + InitReg(MISCREG_DBGOSDLR) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGPRCR) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGDSAR) + .unimplemented() + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); + InitReg(MISCREG_DBGCLAIMSET) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGCLAIMCLR) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_DBGAUTHSTATUS) + .unimplemented() + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); + InitReg(MISCREG_DBGDEVID2) + .unimplemented() + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); + InitReg(MISCREG_DBGDEVID1) + .unimplemented() + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); + InitReg(MISCREG_DBGDEVID0) + .unimplemented() + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); + InitReg(MISCREG_TEECR) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_JIDR) + .allPrivileges(); + InitReg(MISCREG_TEEHBR) + .allPrivileges(); + InitReg(MISCREG_JOSCR) + .allPrivileges(); + InitReg(MISCREG_JMCR) + .allPrivileges(); + + // AArch32 CP15 registers + InitReg(MISCREG_MIDR) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_CTR) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_TCMTR) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_TLBTR) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_MPIDR) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_REVIDR) + .unimplemented() + .warnNotFail() + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_PFR0) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_PFR1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_DFR0) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AFR0) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_MMFR0) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_MMFR1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_MMFR2) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_MMFR3) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR0) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR2) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR3) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR4) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR5) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_CCSIDR) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_CLIDR) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_AIDR) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_CSSELR) + .banked(); + InitReg(MISCREG_CSSELR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_CSSELR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_VPIDR) + .hyp().monNonSecure(); + InitReg(MISCREG_VMPIDR) + .hyp().monNonSecure(); + InitReg(MISCREG_SCTLR) + .banked(); + InitReg(MISCREG_SCTLR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_SCTLR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_ACTLR) + .banked(); + InitReg(MISCREG_ACTLR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_ACTLR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_CPACR) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_SCR) + .mon().secure().exceptUserMode() + .res0(0xff40) // [31:16], [6] + .res1(0x0030); // [5:4] + InitReg(MISCREG_SDER) + .mon(); + InitReg(MISCREG_NSACR) + .allPrivileges().hypWrite(0).privNonSecureWrite(0).exceptUserMode(); + InitReg(MISCREG_HSCTLR) + .hyp().monNonSecure(); + InitReg(MISCREG_HACTLR) + .hyp().monNonSecure(); + InitReg(MISCREG_HCR) + .hyp().monNonSecure(); + InitReg(MISCREG_HDCR) + .hyp().monNonSecure(); + InitReg(MISCREG_HCPTR) + .hyp().monNonSecure(); + InitReg(MISCREG_HSTR) + .hyp().monNonSecure(); + InitReg(MISCREG_HACR) + .unimplemented() + .warnNotFail() + .hyp().monNonSecure(); + InitReg(MISCREG_TTBR0) + .banked(); + InitReg(MISCREG_TTBR0_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_TTBR0_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_TTBR1) + .banked(); + InitReg(MISCREG_TTBR1_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_TTBR1_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_TTBCR) + .banked(); + InitReg(MISCREG_TTBCR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_TTBCR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_HTCR) + .hyp().monNonSecure(); + InitReg(MISCREG_VTCR) + .hyp().monNonSecure(); + InitReg(MISCREG_DACR) + .banked(); + InitReg(MISCREG_DACR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_DACR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_DFSR) + .banked(); + InitReg(MISCREG_DFSR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_DFSR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_IFSR) + .banked(); + InitReg(MISCREG_IFSR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_IFSR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_ADFSR) + .unimplemented() + .warnNotFail() + .banked(); + InitReg(MISCREG_ADFSR_NS) + .unimplemented() + .warnNotFail() + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_ADFSR_S) + .unimplemented() + .warnNotFail() + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_AIFSR) + .unimplemented() + .warnNotFail() + .banked(); + InitReg(MISCREG_AIFSR_NS) + .unimplemented() + .warnNotFail() + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_AIFSR_S) + .unimplemented() + .warnNotFail() + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_HADFSR) + .hyp().monNonSecure(); + InitReg(MISCREG_HAIFSR) + .hyp().monNonSecure(); + InitReg(MISCREG_HSR) + .hyp().monNonSecure(); + InitReg(MISCREG_DFAR) + .banked(); + InitReg(MISCREG_DFAR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_DFAR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_IFAR) + .banked(); + InitReg(MISCREG_IFAR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_IFAR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_HDFAR) + .hyp().monNonSecure(); + InitReg(MISCREG_HIFAR) + .hyp().monNonSecure(); + InitReg(MISCREG_HPFAR) + .hyp().monNonSecure(); + InitReg(MISCREG_ICIALLUIS) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_BPIALLIS) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_PAR) + .banked(); + InitReg(MISCREG_PAR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_PAR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_ICIALLU) + .writes(1).exceptUserMode(); + InitReg(MISCREG_ICIMVAU) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_CP15ISB) + .writes(1); + InitReg(MISCREG_BPIALL) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_BPIMVA) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_DCIMVAC) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_DCISW) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_ATS1CPR) + .writes(1).exceptUserMode(); + InitReg(MISCREG_ATS1CPW) + .writes(1).exceptUserMode(); + InitReg(MISCREG_ATS1CUR) + .writes(1).exceptUserMode(); + InitReg(MISCREG_ATS1CUW) + .writes(1).exceptUserMode(); + InitReg(MISCREG_ATS12NSOPR) + .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_ATS12NSOPW) + .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_ATS12NSOUR) + .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_ATS12NSOUW) + .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_DCCMVAC) + .writes(1).exceptUserMode(); + InitReg(MISCREG_DCCSW) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_CP15DSB) + .writes(1); + InitReg(MISCREG_CP15DMB) + .writes(1); + InitReg(MISCREG_DCCMVAU) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_DCCIMVAC) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_DCCISW) + .unimplemented() + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_ATS1HR) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_ATS1HW) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIALLIS) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIMVAIS) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIASIDIS) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIMVAAIS) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIMVALIS) + .unimplemented() + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIMVAALIS) + .unimplemented() + .writes(1).exceptUserMode(); + InitReg(MISCREG_ITLBIALL) + .writes(1).exceptUserMode(); + InitReg(MISCREG_ITLBIMVA) + .writes(1).exceptUserMode(); + InitReg(MISCREG_ITLBIASID) + .writes(1).exceptUserMode(); + InitReg(MISCREG_DTLBIALL) + .writes(1).exceptUserMode(); + InitReg(MISCREG_DTLBIMVA) + .writes(1).exceptUserMode(); + InitReg(MISCREG_DTLBIASID) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIALL) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIMVA) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIASID) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIMVAA) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIMVAL) + .unimplemented() + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIMVAAL) + .unimplemented() + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBIIPAS2IS) + .unimplemented() + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIIPAS2LIS) + .unimplemented() + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIALLHIS) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIMVAHIS) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIALLNSNHIS) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIMVALHIS) + .unimplemented() + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIIPAS2) + .unimplemented() + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIIPAS2L) + .unimplemented() + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIALLH) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIMVAH) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIALLNSNH) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBIMVALH) + .unimplemented() + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_PMCR) + .allPrivileges(); + InitReg(MISCREG_PMCNTENSET) + .allPrivileges(); + InitReg(MISCREG_PMCNTENCLR) + .allPrivileges(); + InitReg(MISCREG_PMOVSR) + .allPrivileges(); + InitReg(MISCREG_PMSWINC) + .allPrivileges(); + InitReg(MISCREG_PMSELR) + .allPrivileges(); + InitReg(MISCREG_PMCEID0) + .allPrivileges(); + InitReg(MISCREG_PMCEID1) + .allPrivileges(); + InitReg(MISCREG_PMCCNTR) + .allPrivileges(); + InitReg(MISCREG_PMXEVTYPER) + .allPrivileges(); + InitReg(MISCREG_PMCCFILTR) + .allPrivileges(); + InitReg(MISCREG_PMXEVCNTR) + .allPrivileges(); + InitReg(MISCREG_PMUSERENR) + .allPrivileges().userNonSecureWrite(0).userSecureWrite(0); + InitReg(MISCREG_PMINTENSET) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_PMINTENCLR) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_PMOVSSET) + .unimplemented() + .allPrivileges(); + InitReg(MISCREG_L2CTLR) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_L2ECTLR) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_PRRR) + .banked(); + InitReg(MISCREG_PRRR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_PRRR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_MAIR0) + .banked(); + InitReg(MISCREG_MAIR0_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_MAIR0_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_NMRR) + .banked(); + InitReg(MISCREG_NMRR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_NMRR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_MAIR1) + .banked(); + InitReg(MISCREG_MAIR1_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_MAIR1_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_AMAIR0) + .banked(); + InitReg(MISCREG_AMAIR0_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_AMAIR0_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_AMAIR1) + .banked(); + InitReg(MISCREG_AMAIR1_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_AMAIR1_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_HMAIR0) + .hyp().monNonSecure(); + InitReg(MISCREG_HMAIR1) + .hyp().monNonSecure(); + InitReg(MISCREG_HAMAIR0) + .unimplemented() + .warnNotFail() + .hyp().monNonSecure(); + InitReg(MISCREG_HAMAIR1) + .unimplemented() + .warnNotFail() + .hyp().monNonSecure(); + InitReg(MISCREG_VBAR) + .banked(); + InitReg(MISCREG_VBAR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_VBAR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_MVBAR) + .mon().secure().exceptUserMode(); + InitReg(MISCREG_RMR) + .unimplemented() + .mon().secure().exceptUserMode(); + InitReg(MISCREG_ISR) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_HVBAR) + .hyp().monNonSecure(); + InitReg(MISCREG_FCSEIDR) + .unimplemented() + .warnNotFail() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_CONTEXTIDR) + .banked(); + InitReg(MISCREG_CONTEXTIDR_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_CONTEXTIDR_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_TPIDRURW) + .banked(); + InitReg(MISCREG_TPIDRURW_NS) + .bankedChild() + .allPrivileges().monSecure(0).privSecure(0); + InitReg(MISCREG_TPIDRURW_S) + .bankedChild() + .secure(); + InitReg(MISCREG_TPIDRURO) + .banked(); + InitReg(MISCREG_TPIDRURO_NS) + .bankedChild() + .allPrivileges().secure(0).userNonSecureWrite(0).userSecureRead(1); + InitReg(MISCREG_TPIDRURO_S) + .bankedChild() + .secure().userSecureWrite(0); + InitReg(MISCREG_TPIDRPRW) + .banked(); + InitReg(MISCREG_TPIDRPRW_NS) + .bankedChild() + .nonSecure().exceptUserMode(); + InitReg(MISCREG_TPIDRPRW_S) + .bankedChild() + .secure().exceptUserMode(); + InitReg(MISCREG_HTPIDR) + .hyp().monNonSecure(); + InitReg(MISCREG_CNTFRQ) + .unverifiable() + .reads(1).mon(); + InitReg(MISCREG_CNTKCTL) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_CNTP_TVAL) + .banked(); + InitReg(MISCREG_CNTP_TVAL_NS) + .bankedChild() + .allPrivileges().monSecure(0).privSecure(0); + InitReg(MISCREG_CNTP_TVAL_S) + .unimplemented() + .bankedChild() + .secure().user(1); + InitReg(MISCREG_CNTP_CTL) + .banked(); + InitReg(MISCREG_CNTP_CTL_NS) + .bankedChild() + .allPrivileges().monSecure(0).privSecure(0); + InitReg(MISCREG_CNTP_CTL_S) + .unimplemented() + .bankedChild() + .secure().user(1); + InitReg(MISCREG_CNTV_TVAL) + .allPrivileges(); + InitReg(MISCREG_CNTV_CTL) + .allPrivileges(); + InitReg(MISCREG_CNTHCTL) + .unimplemented() + .hypWrite().monNonSecureRead(); + InitReg(MISCREG_CNTHP_TVAL) + .unimplemented() + .hypWrite().monNonSecureRead(); + InitReg(MISCREG_CNTHP_CTL) + .unimplemented() + .hypWrite().monNonSecureRead(); + InitReg(MISCREG_IL1DATA0) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_IL1DATA1) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_IL1DATA2) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_IL1DATA3) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA0) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA1) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA2) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA3) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA4) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_RAMINDEX) + .unimplemented() + .writes(1).exceptUserMode(); + InitReg(MISCREG_L2ACTLR) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_CBAR) + .unimplemented() + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_HTTBR) + .hyp().monNonSecure(); + InitReg(MISCREG_VTTBR) + .hyp().monNonSecure(); + InitReg(MISCREG_CNTPCT) + .reads(1); + InitReg(MISCREG_CNTVCT) + .unverifiable() + .reads(1); + InitReg(MISCREG_CNTP_CVAL) + .banked(); + InitReg(MISCREG_CNTP_CVAL_NS) + .bankedChild() + .allPrivileges().monSecure(0).privSecure(0); + InitReg(MISCREG_CNTP_CVAL_S) + .unimplemented() + .bankedChild() + .secure().user(1); + InitReg(MISCREG_CNTV_CVAL) + .allPrivileges(); + InitReg(MISCREG_CNTVOFF) + .hyp().monNonSecure(); + InitReg(MISCREG_CNTHP_CVAL) + .unimplemented() + .hypWrite().monNonSecureRead(); + InitReg(MISCREG_CPUMERRSR) + .unimplemented() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_L2MERRSR) + .unimplemented() + .warnNotFail() + .allPrivileges().exceptUserMode(); + + // AArch64 registers (Op0=2); + InitReg(MISCREG_MDCCINT_EL1) + .allPrivileges(); + InitReg(MISCREG_OSDTRRX_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGDTRRXext); + InitReg(MISCREG_MDSCR_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGDSCRext); + InitReg(MISCREG_OSDTRTX_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGDTRTXext); + InitReg(MISCREG_OSECCR_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGOSECCR); + InitReg(MISCREG_DBGBVR0_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBVR0 /*, MISCREG_DBGBXVR0 */); + InitReg(MISCREG_DBGBVR1_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBVR1 /*, MISCREG_DBGBXVR1 */); + InitReg(MISCREG_DBGBVR2_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBVR2 /*, MISCREG_DBGBXVR2 */); + InitReg(MISCREG_DBGBVR3_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBVR3 /*, MISCREG_DBGBXVR3 */); + InitReg(MISCREG_DBGBVR4_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBVR4 /*, MISCREG_DBGBXVR4 */); + InitReg(MISCREG_DBGBVR5_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBVR5 /*, MISCREG_DBGBXVR5 */); + InitReg(MISCREG_DBGBCR0_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBCR0); + InitReg(MISCREG_DBGBCR1_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBCR1); + InitReg(MISCREG_DBGBCR2_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBCR2); + InitReg(MISCREG_DBGBCR3_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBCR3); + InitReg(MISCREG_DBGBCR4_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBCR4); + InitReg(MISCREG_DBGBCR5_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGBCR5); + InitReg(MISCREG_DBGWVR0_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGWVR0); + InitReg(MISCREG_DBGWVR1_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGWVR1); + InitReg(MISCREG_DBGWVR2_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGWVR2); + InitReg(MISCREG_DBGWVR3_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGWVR3); + InitReg(MISCREG_DBGWCR0_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGWCR0); + InitReg(MISCREG_DBGWCR1_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGWCR1); + InitReg(MISCREG_DBGWCR2_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGWCR2); + InitReg(MISCREG_DBGWCR3_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGWCR3); + InitReg(MISCREG_MDCCSR_EL0) + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0) + .mapsTo(MISCREG_DBGDSCRint); + InitReg(MISCREG_MDDTR_EL0) + .allPrivileges(); + InitReg(MISCREG_MDDTRTX_EL0) + .allPrivileges(); + InitReg(MISCREG_MDDTRRX_EL0) + .allPrivileges(); + InitReg(MISCREG_DBGVCR32_EL2) + .allPrivileges() + .mapsTo(MISCREG_DBGVCR); + InitReg(MISCREG_MDRAR_EL1) + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0) + .mapsTo(MISCREG_DBGDRAR); + InitReg(MISCREG_OSLAR_EL1) + .allPrivileges().monSecureRead(0).monNonSecureRead(0) + .mapsTo(MISCREG_DBGOSLAR); + InitReg(MISCREG_OSLSR_EL1) + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0) + .mapsTo(MISCREG_DBGOSLSR); + InitReg(MISCREG_OSDLR_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGOSDLR); + InitReg(MISCREG_DBGPRCR_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGPRCR); + InitReg(MISCREG_DBGCLAIMSET_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGCLAIMSET); + InitReg(MISCREG_DBGCLAIMCLR_EL1) + .allPrivileges() + .mapsTo(MISCREG_DBGCLAIMCLR); + InitReg(MISCREG_DBGAUTHSTATUS_EL1) + .allPrivileges().monSecureWrite(0).monNonSecureWrite(0) + .mapsTo(MISCREG_DBGAUTHSTATUS); + InitReg(MISCREG_TEECR32_EL1); + InitReg(MISCREG_TEEHBR32_EL1); + + // AArch64 registers (Op0=1,3); + InitReg(MISCREG_MIDR_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_MPIDR_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_REVIDR_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_PFR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_PFR1_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_DFR0_EL1) + .allPrivileges().exceptUserMode().writes(0) + .mapsTo(MISCREG_ID_DFR0); + InitReg(MISCREG_ID_AFR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_MMFR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_MMFR1_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_MMFR2_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_MMFR3_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR1_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR2_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR3_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR4_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_ISAR5_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_MVFR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_MVFR1_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_MVFR2_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64PFR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64PFR1_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64DFR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64DFR1_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64AFR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64AFR1_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64ISAR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64ISAR1_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64MMFR0_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ID_AA64MMFR1_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_CCSIDR_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_CLIDR_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_AIDR_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_CSSELR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_CSSELR_NS); + InitReg(MISCREG_CTR_EL0) + .reads(1); + InitReg(MISCREG_DCZID_EL0) + .reads(1); + InitReg(MISCREG_VPIDR_EL2) + .hyp().mon() + .mapsTo(MISCREG_VPIDR); + InitReg(MISCREG_VMPIDR_EL2) + .hyp().mon() + .mapsTo(MISCREG_VMPIDR); + InitReg(MISCREG_SCTLR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_SCTLR_NS); + InitReg(MISCREG_ACTLR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_ACTLR_NS); + InitReg(MISCREG_CPACR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_CPACR); + InitReg(MISCREG_SCTLR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HSCTLR); + InitReg(MISCREG_ACTLR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HACTLR); + InitReg(MISCREG_HCR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HCR /*, MISCREG_HCR2*/); + InitReg(MISCREG_MDCR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HDCR); + InitReg(MISCREG_CPTR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HCPTR); + InitReg(MISCREG_HSTR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HSTR); + InitReg(MISCREG_HACR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HACR); + InitReg(MISCREG_SCTLR_EL3) + .mon(); + InitReg(MISCREG_ACTLR_EL3) + .mon(); + InitReg(MISCREG_SCR_EL3) + .mon() + .mapsTo(MISCREG_SCR); // NAM D7-2005 + InitReg(MISCREG_SDER32_EL3) + .mon() + .mapsTo(MISCREG_SDER); + InitReg(MISCREG_CPTR_EL3) + .mon(); + InitReg(MISCREG_MDCR_EL3) + .mon(); + InitReg(MISCREG_TTBR0_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_TTBR0_NS); + InitReg(MISCREG_TTBR1_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_TTBR1_NS); + InitReg(MISCREG_TCR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_TTBCR_NS); + InitReg(MISCREG_TTBR0_EL2) + .hyp().mon() + .mapsTo(MISCREG_HTTBR); + InitReg(MISCREG_TCR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HTCR); + InitReg(MISCREG_VTTBR_EL2) + .hyp().mon() + .mapsTo(MISCREG_VTTBR); + InitReg(MISCREG_VTCR_EL2) + .hyp().mon() + .mapsTo(MISCREG_VTCR); + InitReg(MISCREG_TTBR0_EL3) + .mon(); + InitReg(MISCREG_TCR_EL3) + .mon(); + InitReg(MISCREG_DACR32_EL2) + .hyp().mon() + .mapsTo(MISCREG_DACR_NS); + InitReg(MISCREG_SPSR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_SPSR_SVC); // NAM C5.2.17 SPSR_EL1 + InitReg(MISCREG_ELR_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_SP_EL0) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_SPSEL) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_CURRENTEL) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_NZCV) + .allPrivileges(); + InitReg(MISCREG_DAIF) + .allPrivileges(); + InitReg(MISCREG_FPCR) + .allPrivileges(); + InitReg(MISCREG_FPSR) + .allPrivileges(); + InitReg(MISCREG_DSPSR_EL0) + .allPrivileges(); + InitReg(MISCREG_DLR_EL0) + .allPrivileges(); + InitReg(MISCREG_SPSR_EL2) + .hyp().mon() + .mapsTo(MISCREG_SPSR_HYP); // NAM C5.2.18 SPSR_EL2 + InitReg(MISCREG_ELR_EL2) + .hyp().mon(); + InitReg(MISCREG_SP_EL1) + .hyp().mon(); + InitReg(MISCREG_SPSR_IRQ_AA64) + .hyp().mon(); + InitReg(MISCREG_SPSR_ABT_AA64) + .hyp().mon(); + InitReg(MISCREG_SPSR_UND_AA64) + .hyp().mon(); + InitReg(MISCREG_SPSR_FIQ_AA64) + .hyp().mon(); + InitReg(MISCREG_SPSR_EL3) + .mon() + .mapsTo(MISCREG_SPSR_MON); // NAM C5.2.19 SPSR_EL3 + InitReg(MISCREG_ELR_EL3) + .mon(); + InitReg(MISCREG_SP_EL2) + .mon(); + InitReg(MISCREG_AFSR0_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_ADFSR_NS); + InitReg(MISCREG_AFSR1_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_AIFSR_NS); + InitReg(MISCREG_ESR_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_IFSR32_EL2) + .hyp().mon() + .mapsTo(MISCREG_IFSR_NS); + InitReg(MISCREG_AFSR0_EL2) + .hyp().mon() + .mapsTo(MISCREG_HADFSR); + InitReg(MISCREG_AFSR1_EL2) + .hyp().mon() + .mapsTo(MISCREG_HAIFSR); + InitReg(MISCREG_ESR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HSR); + InitReg(MISCREG_FPEXC32_EL2) + .hyp().mon(); + InitReg(MISCREG_AFSR0_EL3) + .mon(); + InitReg(MISCREG_AFSR1_EL3) + .mon(); + InitReg(MISCREG_ESR_EL3) + .mon(); + InitReg(MISCREG_FAR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_DFAR_NS, MISCREG_IFAR_NS); + InitReg(MISCREG_FAR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HDFAR, MISCREG_HIFAR); + InitReg(MISCREG_HPFAR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HPFAR); + InitReg(MISCREG_FAR_EL3) + .mon(); + InitReg(MISCREG_IC_IALLUIS) + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_PAR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_PAR_NS); + InitReg(MISCREG_IC_IALLU) + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_DC_IVAC_Xt) + .warnNotFail() + .writes(1); + InitReg(MISCREG_DC_ISW_Xt) + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_AT_S1E1R_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_AT_S1E1W_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_AT_S1E0R_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_AT_S1E0W_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_DC_CSW_Xt) + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_DC_CISW_Xt) + .warnNotFail() + .writes(1).exceptUserMode(); + InitReg(MISCREG_DC_ZVA_Xt) + .warnNotFail() + .writes(1).userSecureWrite(0); + InitReg(MISCREG_IC_IVAU_Xt) + .writes(1); + InitReg(MISCREG_DC_CVAC_Xt) + .warnNotFail() + .writes(1); + InitReg(MISCREG_DC_CVAU_Xt) + .warnNotFail() + .writes(1); + InitReg(MISCREG_DC_CIVAC_Xt) + .warnNotFail() + .writes(1); + InitReg(MISCREG_AT_S1E2R_Xt) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_AT_S1E2W_Xt) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_AT_S12E1R_Xt) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_AT_S12E1W_Xt) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_AT_S12E0R_Xt) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_AT_S12E0W_Xt) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_AT_S1E3R_Xt) + .monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_AT_S1E3W_Xt) + .monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_VMALLE1IS) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_VAE1IS_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_ASIDE1IS_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_VAAE1IS_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_VALE1IS_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_VAALE1IS_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_VMALLE1) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_VAE1_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_ASIDE1_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_VAAE1_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_VALE1_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_VAALE1_Xt) + .writes(1).exceptUserMode(); + InitReg(MISCREG_TLBI_IPAS2E1IS_Xt) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_IPAS2LE1IS_Xt) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_ALLE2IS) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBI_VAE2IS_Xt) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBI_ALLE1IS) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_VALE2IS_Xt) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBI_VMALLS12E1IS) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_IPAS2E1_Xt) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_IPAS2LE1_Xt) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_ALLE2) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBI_VAE2_Xt) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBI_ALLE1) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_VALE2_Xt) + .monNonSecureWrite().hypWrite(); + InitReg(MISCREG_TLBI_VMALLS12E1) + .hypWrite().monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_ALLE3IS) + .monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_VAE3IS_Xt) + .monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_VALE3IS_Xt) + .monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_ALLE3) + .monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_VAE3_Xt) + .monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_TLBI_VALE3_Xt) + .monSecureWrite().monNonSecureWrite(); + InitReg(MISCREG_PMINTENSET_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_PMINTENSET); + InitReg(MISCREG_PMINTENCLR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_PMINTENCLR); + InitReg(MISCREG_PMCR_EL0) + .allPrivileges() + .mapsTo(MISCREG_PMCR); + InitReg(MISCREG_PMCNTENSET_EL0) + .allPrivileges() + .mapsTo(MISCREG_PMCNTENSET); + InitReg(MISCREG_PMCNTENCLR_EL0) + .allPrivileges() + .mapsTo(MISCREG_PMCNTENCLR); + InitReg(MISCREG_PMOVSCLR_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMOVSCLR); + InitReg(MISCREG_PMSWINC_EL0) + .writes(1).user() + .mapsTo(MISCREG_PMSWINC); + InitReg(MISCREG_PMSELR_EL0) + .allPrivileges() + .mapsTo(MISCREG_PMSELR); + InitReg(MISCREG_PMCEID0_EL0) + .reads(1).user() + .mapsTo(MISCREG_PMCEID0); + InitReg(MISCREG_PMCEID1_EL0) + .reads(1).user() + .mapsTo(MISCREG_PMCEID1); + InitReg(MISCREG_PMCCNTR_EL0) + .allPrivileges() + .mapsTo(MISCREG_PMCCNTR); + InitReg(MISCREG_PMXEVTYPER_EL0) + .allPrivileges() + .mapsTo(MISCREG_PMXEVTYPER); + InitReg(MISCREG_PMCCFILTR_EL0) + .allPrivileges(); + InitReg(MISCREG_PMXEVCNTR_EL0) + .allPrivileges() + .mapsTo(MISCREG_PMXEVCNTR); + InitReg(MISCREG_PMUSERENR_EL0) + .allPrivileges().userNonSecureWrite(0).userSecureWrite(0) + .mapsTo(MISCREG_PMUSERENR); + InitReg(MISCREG_PMOVSSET_EL0) + .allPrivileges() + .mapsTo(MISCREG_PMOVSSET); + InitReg(MISCREG_MAIR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_PRRR_NS, MISCREG_NMRR_NS); + InitReg(MISCREG_AMAIR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_AMAIR0_NS, MISCREG_AMAIR1_NS); + InitReg(MISCREG_MAIR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HMAIR0, MISCREG_HMAIR1); + InitReg(MISCREG_AMAIR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HAMAIR0, MISCREG_HAMAIR1); + InitReg(MISCREG_MAIR_EL3) + .mon(); + InitReg(MISCREG_AMAIR_EL3) + .mon(); + InitReg(MISCREG_L2CTLR_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_L2ECTLR_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_VBAR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_VBAR_NS); + InitReg(MISCREG_RVBAR_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_ISR_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_VBAR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HVBAR); + InitReg(MISCREG_RVBAR_EL2) + .mon().hyp().writes(0); + InitReg(MISCREG_VBAR_EL3) + .mon(); + InitReg(MISCREG_RVBAR_EL3) + .mon().writes(0); + InitReg(MISCREG_RMR_EL3) + .mon(); + InitReg(MISCREG_CONTEXTIDR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_CONTEXTIDR_NS); + InitReg(MISCREG_TPIDR_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_TPIDRPRW_NS); + InitReg(MISCREG_TPIDR_EL0) + .allPrivileges() + .mapsTo(MISCREG_TPIDRURW_NS); + InitReg(MISCREG_TPIDRRO_EL0) + .allPrivileges().userNonSecureWrite(0).userSecureWrite(0) + .mapsTo(MISCREG_TPIDRURO_NS); + InitReg(MISCREG_TPIDR_EL2) + .hyp().mon() + .mapsTo(MISCREG_HTPIDR); + InitReg(MISCREG_TPIDR_EL3) + .mon(); + InitReg(MISCREG_CNTKCTL_EL1) + .allPrivileges().exceptUserMode() + .mapsTo(MISCREG_CNTKCTL); + InitReg(MISCREG_CNTFRQ_EL0) + .reads(1).mon() + .mapsTo(MISCREG_CNTFRQ); + InitReg(MISCREG_CNTPCT_EL0) + .reads(1) + .mapsTo(MISCREG_CNTPCT); /* 64b */ + InitReg(MISCREG_CNTVCT_EL0) + .unverifiable() + .reads(1) + .mapsTo(MISCREG_CNTVCT); /* 64b */ + InitReg(MISCREG_CNTP_TVAL_EL0) + .allPrivileges() + .mapsTo(MISCREG_CNTP_TVAL_NS); + InitReg(MISCREG_CNTP_CTL_EL0) + .allPrivileges() + .mapsTo(MISCREG_CNTP_CTL_NS); + InitReg(MISCREG_CNTP_CVAL_EL0) + .allPrivileges() + .mapsTo(MISCREG_CNTP_CVAL_NS); /* 64b */ + InitReg(MISCREG_CNTV_TVAL_EL0) + .allPrivileges() + .mapsTo(MISCREG_CNTV_TVAL); + InitReg(MISCREG_CNTV_CTL_EL0) + .allPrivileges() + .mapsTo(MISCREG_CNTV_CTL); + InitReg(MISCREG_CNTV_CVAL_EL0) + .allPrivileges() + .mapsTo(MISCREG_CNTV_CVAL); /* 64b */ + InitReg(MISCREG_PMEVCNTR0_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVCNTR0); + InitReg(MISCREG_PMEVCNTR1_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVCNTR1); + InitReg(MISCREG_PMEVCNTR2_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVCNTR2); + InitReg(MISCREG_PMEVCNTR3_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVCNTR3); + InitReg(MISCREG_PMEVCNTR4_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVCNTR4); + InitReg(MISCREG_PMEVCNTR5_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVCNTR5); + InitReg(MISCREG_PMEVTYPER0_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVTYPER0); + InitReg(MISCREG_PMEVTYPER1_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVTYPER1); + InitReg(MISCREG_PMEVTYPER2_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVTYPER2); + InitReg(MISCREG_PMEVTYPER3_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVTYPER3); + InitReg(MISCREG_PMEVTYPER4_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVTYPER4); + InitReg(MISCREG_PMEVTYPER5_EL0) + .allPrivileges(); +// .mapsTo(MISCREG_PMEVTYPER5); + InitReg(MISCREG_CNTVOFF_EL2) + .hyp().mon() + .mapsTo(MISCREG_CNTVOFF); /* 64b */ + InitReg(MISCREG_CNTHCTL_EL2) + .unimplemented() + .warnNotFail() + .mon().monNonSecureWrite(0).hypWrite() + .mapsTo(MISCREG_CNTHCTL); + InitReg(MISCREG_CNTHP_TVAL_EL2) + .unimplemented() + .mon().monNonSecureWrite(0).hypWrite() + .mapsTo(MISCREG_CNTHP_TVAL); + InitReg(MISCREG_CNTHP_CTL_EL2) + .unimplemented() + .mon().monNonSecureWrite(0).hypWrite() + .mapsTo(MISCREG_CNTHP_CTL); + InitReg(MISCREG_CNTHP_CVAL_EL2) + .unimplemented() + .mon().monNonSecureWrite(0).hypWrite() + .mapsTo(MISCREG_CNTHP_CVAL); /* 64b */ + InitReg(MISCREG_CNTPS_TVAL_EL1) + .unimplemented() + .mon().monNonSecureWrite(0).hypWrite(); + InitReg(MISCREG_CNTPS_CTL_EL1) + .unimplemented() + .mon().monNonSecureWrite(0).hypWrite(); + InitReg(MISCREG_CNTPS_CVAL_EL1) + .unimplemented() + .mon().monNonSecureWrite(0).hypWrite(); + InitReg(MISCREG_IL1DATA0_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_IL1DATA1_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_IL1DATA2_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_IL1DATA3_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA0_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA1_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA2_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA3_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_DL1DATA4_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_L2ACTLR_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_CPUACTLR_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_CPUECTLR_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_CPUMERRSR_EL1) + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_L2MERRSR_EL1) + .unimplemented() + .warnNotFail() + .allPrivileges().exceptUserMode(); + InitReg(MISCREG_CBAR_EL1) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_CONTEXTIDR_EL2) + .mon().hyp(); + + // Dummy registers + InitReg(MISCREG_NOP) + .allPrivileges(); + InitReg(MISCREG_RAZ) + .allPrivileges().exceptUserMode().writes(0); + InitReg(MISCREG_CP14_UNIMPL) + .unimplemented() + .warnNotFail(); + InitReg(MISCREG_CP15_UNIMPL) + .unimplemented() + .warnNotFail(); + InitReg(MISCREG_A64_UNIMPL) + .unimplemented() + .warnNotFail(); + InitReg(MISCREG_UNKNOWN); + + // Register mappings for some unimplemented registers: + // ESR_EL1 -> DFSR + // RMR_EL1 -> RMR + // RMR_EL2 -> HRMR + // DBGDTR_EL0 -> DBGDTR{R or T}Xint + // DBGDTRRX_EL0 -> DBGDTRRXint + // DBGDTRTX_EL0 -> DBGDTRRXint + // MDCR_EL3 -> SDCR, NAM D7-2108 (the latter is unimpl. in gem5) + + completed = true; +} + } // namespace ArmISA -- cgit v1.2.3