From 683007c6ca371e56ae3d7386753d9004a004a419 Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Wed, 18 Oct 2023 11:36:08 +0100 Subject: [PATCH 1/2] arch-arm: Add FEAT_FGT Debug Read/Write registers Those are supposed to control trapping for accesses to debug registers Change-Id: I4a25a379e718ea6d5ea8ae22ac7edbeb452d1836 Signed-off-by: Giacomo Travaglini Reviewed-by: Richard Cooper --- src/arch/arm/regs/misc.cc | 8 ++++++++ src/arch/arm/regs/misc.hh | 4 ++++ src/arch/arm/regs/misc_types.hh | 16 ++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/src/arch/arm/regs/misc.cc b/src/arch/arm/regs/misc.cc index 991c1ac85b..8ce5ad00c4 100644 --- a/src/arch/arm/regs/misc.cc +++ b/src/arch/arm/regs/misc.cc @@ -1162,6 +1162,8 @@ std::unordered_map miscRegNumToIdx{ { MiscRegNum64(3, 4, 2, 6, 0), MISCREG_VSTTBR_EL2 }, { MiscRegNum64(3, 4, 2, 6, 2), MISCREG_VSTCR_EL2 }, { MiscRegNum64(3, 4, 3, 0, 0), MISCREG_DACR32_EL2 }, + { MiscRegNum64(3, 4, 3, 1, 4), MISCREG_HDFGRTR_EL2 }, + { MiscRegNum64(3, 4, 3, 1, 5), MISCREG_HDFGWTR_EL2 }, { MiscRegNum64(3, 4, 4, 0, 0), MISCREG_SPSR_EL2 }, { MiscRegNum64(3, 4, 4, 0, 1), MISCREG_ELR_EL2 }, { MiscRegNum64(3, 4, 4, 1, 0), MISCREG_SP_EL1 }, @@ -6176,6 +6178,12 @@ ISA::initializeMiscRegMetadata() InitReg(MISCREG_HFGITR_EL2) .fault(EL2, faultFgtCtrlRegs) .hyp().mon(release->has(ArmExtension::FEAT_FGT)); + InitReg(MISCREG_HDFGRTR_EL2) + .fault(EL2, faultFgtCtrlRegs) + .hyp().mon(release->has(ArmExtension::FEAT_FGT)); + InitReg(MISCREG_HDFGWTR_EL2) + .fault(EL2, faultFgtCtrlRegs) + .hyp().mon(release->has(ArmExtension::FEAT_FGT)); // Dummy registers InitReg(MISCREG_NOP) diff --git a/src/arch/arm/regs/misc.hh b/src/arch/arm/regs/misc.hh index 6b633a7467..fc18e3f8e1 100644 --- a/src/arch/arm/regs/misc.hh +++ b/src/arch/arm/regs/misc.hh @@ -1139,6 +1139,8 @@ namespace ArmISA MISCREG_HFGITR_EL2, MISCREG_HFGRTR_EL2, MISCREG_HFGWTR_EL2, + MISCREG_HDFGRTR_EL2, + MISCREG_HDFGWTR_EL2, // NUM_PHYS_MISCREGS specifies the number of actual physical // registers, not considering the following pseudo-registers @@ -2854,6 +2856,8 @@ namespace ArmISA "hfgitr_el2", "hfgrtr_el2", "hfgwtr_el2", + "hdfgrtr_el2", + "hdfgwtr_el2", "num_phys_regs", diff --git a/src/arch/arm/regs/misc_types.hh b/src/arch/arm/regs/misc_types.hh index 3bc06ac97c..f2b246288a 100644 --- a/src/arch/arm/regs/misc_types.hh +++ b/src/arch/arm/regs/misc_types.hh @@ -1064,6 +1064,22 @@ namespace ArmISA Bitfield<0> afsr0EL1; EndBitUnion(HFGTR) + // HDFGRTR and HDFGWTR + BitUnion64(HDFGTR) + Bitfield<11> osdlrEL1; + Bitfield<10> oseccrEL1; + Bitfield<9> oslsrEL1; + Bitfield<8> oslarEL1; + Bitfield<7> dbgprcrEL1; + Bitfield<6> dbgauthstatusEL1; + Bitfield<5> dbgclaim; + Bitfield<4> mdscrEL1; + Bitfield<3> dbgwvrnEL1; + Bitfield<2> dbgwcrnEL1; + Bitfield<1> dbgbvrnEL1; + Bitfield<0> dbgbcrnEL1; + EndBitUnion(HDFGTR) + BitUnion64(HCRX) Bitfield<15> sctlr2En; Bitfield<14> tcr2En; From 2c0cc0040b591870fd857912433ac304847acb59 Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Wed, 18 Oct 2023 11:48:23 +0100 Subject: [PATCH 2/2] arch-arm: Implement FEAT_FGT Debug trapping Change-Id: I30af2b49ee604bcaa43fd419f6bc69e9ee6d9350 Signed-off-by: Giacomo Travaglini Reviewed-by: Richard Cooper --- src/arch/arm/regs/misc.cc | 292 +++++++++++++++++++++++++++++--------- 1 file changed, 228 insertions(+), 64 deletions(-) diff --git a/src/arch/arm/regs/misc.cc b/src/arch/arm/regs/misc.cc index 8ce5ad00c4..929ccf1169 100644 --- a/src/arch/arm/regs/misc.cc +++ b/src/arch/arm/regs/misc.cc @@ -1300,6 +1300,17 @@ fgtRegister(ThreadContext *tc) } } +template +HDFGTR +fgtDebugRegister(ThreadContext *tc) +{ + if constexpr (read) { + return tc->readMiscReg(MISCREG_HDFGRTR_EL2); + } else { + return tc->readMiscReg(MISCREG_HDFGWTR_EL2); + } +} + /** * Template helper for fine grained traps at EL0 * @@ -1357,6 +1368,24 @@ faultFgtInstEL1(const MiscRegLUTEntry &entry, } } +/** + * Template helper for fine grained traps at EL1 + * + * @tparam read: is this a read access to the register? + * @tparam r_bitfield: register (HFGTR) bitfield + */ +template +Fault +faultFgtDebugEL1(const MiscRegLUTEntry &entry, + ThreadContext *tc, const MiscRegOp64 &inst) +{ + if (fgtEnabled(tc) && fgtDebugRegister(tc).*r_bitfield) { + return inst.generateTrap(EL2); + } else { + return NoFault; + } +} + /** * Template helper for fine grained traps at EL1 * @@ -1807,6 +1836,51 @@ faultDebugEL2(const MiscRegLUTEntry &entry, } } +template +Fault +faultDebugWithFgtEL1(const MiscRegLUTEntry &entry, + ThreadContext *tc, const MiscRegOp64 &inst) +{ + if (auto fault = faultFgtDebugEL1(entry, tc, inst); + fault != NoFault) { + return fault; + } else { + return faultDebugEL1(entry, tc, inst); + } +} + +template +Fault +faultDebugOsEL1(const MiscRegLUTEntry &entry, + ThreadContext *tc, const MiscRegOp64 &inst) +{ + const HDCR mdcr_el2 = tc->readMiscReg(MISCREG_MDCR_EL2); + const HDCR mdcr_el3 = tc->readMiscReg(MISCREG_MDCR_EL3); + + if (auto fault = faultFgtDebugEL1(entry, tc, inst); + fault != NoFault) { + return fault; + } else if (EL2Enabled(tc) && (mdcr_el2.tde || mdcr_el2.tdosa)) { + return inst.generateTrap(EL2); + } else if (ArmSystem::haveEL(tc, EL3) && mdcr_el3.tdosa) { + return inst.generateTrap(EL3); + } else { + return NoFault; + } +} + +Fault +faultDebugOsEL2(const MiscRegLUTEntry &entry, + ThreadContext *tc, const MiscRegOp64 &inst) +{ + const HDCR mdcr_el3 = tc->readMiscReg(MISCREG_MDCR_EL3); + if (ArmSystem::haveEL(tc, EL3) && mdcr_el3.tdosa) { + return inst.generateTrap(EL3); + } else { + return NoFault; + } +} + Fault faultHcrxEL2(const MiscRegLUTEntry &entry, ThreadContext *tc, const MiscRegOp64 &inst) @@ -3919,331 +3993,401 @@ ISA::initializeMiscRegMetadata() .mapsTo(MISCREG_DBGDTRRXext); InitReg(MISCREG_MDSCR_EL1) .allPrivileges().exceptUserMode() + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) + .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGDSCRext); InitReg(MISCREG_OSDTRTX_EL1) .allPrivileges().exceptUserMode() .mapsTo(MISCREG_DBGDTRTXext); InitReg(MISCREG_OSECCR_EL1) .allPrivileges().exceptUserMode() + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) + .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGOSECCR); InitReg(MISCREG_DBGBVR0_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR0, MISCREG_DBGBXVR0); InitReg(MISCREG_DBGBVR1_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR1, MISCREG_DBGBXVR1); InitReg(MISCREG_DBGBVR2_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR2, MISCREG_DBGBXVR2); InitReg(MISCREG_DBGBVR3_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR3, MISCREG_DBGBXVR3); InitReg(MISCREG_DBGBVR4_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR4, MISCREG_DBGBXVR4); InitReg(MISCREG_DBGBVR5_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR5, MISCREG_DBGBXVR5); InitReg(MISCREG_DBGBVR6_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR6, MISCREG_DBGBXVR6); InitReg(MISCREG_DBGBVR7_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR7, MISCREG_DBGBXVR7); InitReg(MISCREG_DBGBVR8_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR8, MISCREG_DBGBXVR8); InitReg(MISCREG_DBGBVR9_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR9, MISCREG_DBGBXVR9); InitReg(MISCREG_DBGBVR10_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR10, MISCREG_DBGBXVR10); InitReg(MISCREG_DBGBVR11_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR11, MISCREG_DBGBXVR11); InitReg(MISCREG_DBGBVR12_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR12, MISCREG_DBGBXVR12); InitReg(MISCREG_DBGBVR13_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR13, MISCREG_DBGBXVR13); InitReg(MISCREG_DBGBVR14_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR14, MISCREG_DBGBXVR14); InitReg(MISCREG_DBGBVR15_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBVR15, MISCREG_DBGBXVR15); InitReg(MISCREG_DBGBCR0_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR0); InitReg(MISCREG_DBGBCR1_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR1); InitReg(MISCREG_DBGBCR2_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR2); InitReg(MISCREG_DBGBCR3_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR3); InitReg(MISCREG_DBGBCR4_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR4); InitReg(MISCREG_DBGBCR5_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR5); InitReg(MISCREG_DBGBCR6_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR6); InitReg(MISCREG_DBGBCR7_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR7); InitReg(MISCREG_DBGBCR8_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR8); InitReg(MISCREG_DBGBCR9_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR9); InitReg(MISCREG_DBGBCR10_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR10); InitReg(MISCREG_DBGBCR11_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR11); InitReg(MISCREG_DBGBCR12_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR12); InitReg(MISCREG_DBGBCR13_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR13); InitReg(MISCREG_DBGBCR14_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR14); InitReg(MISCREG_DBGBCR15_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGBCR15); InitReg(MISCREG_DBGWVR0_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR0); InitReg(MISCREG_DBGWVR1_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR1); InitReg(MISCREG_DBGWVR2_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR2); InitReg(MISCREG_DBGWVR3_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR3); InitReg(MISCREG_DBGWVR4_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR4); InitReg(MISCREG_DBGWVR5_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR5); InitReg(MISCREG_DBGWVR6_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR6); InitReg(MISCREG_DBGWVR7_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR7); InitReg(MISCREG_DBGWVR8_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR8); InitReg(MISCREG_DBGWVR9_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR9); InitReg(MISCREG_DBGWVR10_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR10); InitReg(MISCREG_DBGWVR11_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR11); InitReg(MISCREG_DBGWVR12_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR12); InitReg(MISCREG_DBGWVR13_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR13); InitReg(MISCREG_DBGWVR14_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR14); InitReg(MISCREG_DBGWVR15_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWVR15); InitReg(MISCREG_DBGWCR0_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR0); InitReg(MISCREG_DBGWCR1_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR1); InitReg(MISCREG_DBGWCR2_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR2); InitReg(MISCREG_DBGWCR3_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR3); InitReg(MISCREG_DBGWCR4_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR4); InitReg(MISCREG_DBGWCR5_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR5); InitReg(MISCREG_DBGWCR6_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR6); InitReg(MISCREG_DBGWCR7_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR7); InitReg(MISCREG_DBGWCR8_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR8); InitReg(MISCREG_DBGWCR9_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR9); InitReg(MISCREG_DBGWCR10_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR10); InitReg(MISCREG_DBGWCR11_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR11); InitReg(MISCREG_DBGWCR12_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR12); InitReg(MISCREG_DBGWCR13_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR13); InitReg(MISCREG_DBGWCR14_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR14); InitReg(MISCREG_DBGWCR15_EL1) .allPrivileges().exceptUserMode() - .fault(EL1, faultDebugEL1) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGWCR15); InitReg(MISCREG_MDCCSR_EL0) @@ -4264,27 +4408,47 @@ ISA::initializeMiscRegMetadata() .mapsTo(MISCREG_DBGVCR); InitReg(MISCREG_MDRAR_EL1) .allPrivileges().exceptUserMode().writes(0) + .faultRead(EL1, faultDebugEL1) + .faultRead(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGDRAR); InitReg(MISCREG_OSLAR_EL1) .allPrivileges().exceptUserMode().reads(0) + .faultWrite(EL1, faultDebugOsEL1) + .faultWrite(EL2, faultDebugOsEL2) .mapsTo(MISCREG_DBGOSLAR); InitReg(MISCREG_OSLSR_EL1) .allPrivileges().exceptUserMode().writes(0) + .faultRead(EL1, faultDebugOsEL1) + .faultRead(EL2, faultDebugOsEL2) .mapsTo(MISCREG_DBGOSLSR); InitReg(MISCREG_OSDLR_EL1) .allPrivileges().exceptUserMode() + .faultRead(EL1, faultDebugOsEL1) + .faultWrite(EL1, faultDebugOsEL1) + .fault(EL2, faultDebugOsEL2) .mapsTo(MISCREG_DBGOSDLR); InitReg(MISCREG_DBGPRCR_EL1) .allPrivileges().exceptUserMode() + .faultRead(EL1, faultDebugOsEL1) + .faultWrite(EL1, faultDebugOsEL1) + .fault(EL2, faultDebugOsEL2) .mapsTo(MISCREG_DBGPRCR); InitReg(MISCREG_DBGCLAIMSET_EL1) .allPrivileges().exceptUserMode() + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) + .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGCLAIMSET); InitReg(MISCREG_DBGCLAIMCLR_EL1) .allPrivileges().exceptUserMode() + .faultRead(EL1, faultDebugWithFgtEL1) + .faultWrite(EL1, faultDebugWithFgtEL1) + .fault(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGCLAIMCLR); InitReg(MISCREG_DBGAUTHSTATUS_EL1) .allPrivileges().exceptUserMode().writes(0) + .faultRead(EL1, faultDebugWithFgtEL1) + .faultRead(EL2, faultDebugEL2) .mapsTo(MISCREG_DBGAUTHSTATUS); InitReg(MISCREG_TEECR32_EL1); InitReg(MISCREG_TEEHBR32_EL1);