From 2c0cc0040b591870fd857912433ac304847acb59 Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Wed, 18 Oct 2023 11:48:23 +0100 Subject: [PATCH] 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);