arch-arm: Implement FEAT_FGT Debug trapping
Change-Id: I30af2b49ee604bcaa43fd419f6bc69e9ee6d9350 Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Richard Cooper <richard.cooper@arm.com>
This commit is contained in:
@@ -1300,6 +1300,17 @@ fgtRegister(ThreadContext *tc)
|
||||
}
|
||||
}
|
||||
|
||||
template <bool read>
|
||||
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<bool read, auto r_bitfield>
|
||||
Fault
|
||||
faultFgtDebugEL1(const MiscRegLUTEntry &entry,
|
||||
ThreadContext *tc, const MiscRegOp64 &inst)
|
||||
{
|
||||
if (fgtEnabled(tc) && fgtDebugRegister<read>(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<bool read, auto r_bitfield>
|
||||
Fault
|
||||
faultDebugWithFgtEL1(const MiscRegLUTEntry &entry,
|
||||
ThreadContext *tc, const MiscRegOp64 &inst)
|
||||
{
|
||||
if (auto fault = faultFgtDebugEL1<read, r_bitfield>(entry, tc, inst);
|
||||
fault != NoFault) {
|
||||
return fault;
|
||||
} else {
|
||||
return faultDebugEL1(entry, tc, inst);
|
||||
}
|
||||
}
|
||||
|
||||
template<bool read, auto r_bitfield>
|
||||
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<read, r_bitfield>(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<true, &HDFGTR::mdscrEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::mdscrEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGDSCRext);
|
||||
InitReg(MISCREG_OSDTRTX_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.mapsTo(MISCREG_DBGDTRTXext);
|
||||
InitReg(MISCREG_OSECCR_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::oseccrEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::oseccrEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGOSECCR);
|
||||
InitReg(MISCREG_DBGBVR0_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR0, MISCREG_DBGBXVR0);
|
||||
InitReg(MISCREG_DBGBVR1_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR1, MISCREG_DBGBXVR1);
|
||||
InitReg(MISCREG_DBGBVR2_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR2, MISCREG_DBGBXVR2);
|
||||
InitReg(MISCREG_DBGBVR3_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR3, MISCREG_DBGBXVR3);
|
||||
InitReg(MISCREG_DBGBVR4_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR4, MISCREG_DBGBXVR4);
|
||||
InitReg(MISCREG_DBGBVR5_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR5, MISCREG_DBGBXVR5);
|
||||
InitReg(MISCREG_DBGBVR6_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR6, MISCREG_DBGBXVR6);
|
||||
InitReg(MISCREG_DBGBVR7_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR7, MISCREG_DBGBXVR7);
|
||||
InitReg(MISCREG_DBGBVR8_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR8, MISCREG_DBGBXVR8);
|
||||
InitReg(MISCREG_DBGBVR9_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR9, MISCREG_DBGBXVR9);
|
||||
InitReg(MISCREG_DBGBVR10_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR10, MISCREG_DBGBXVR10);
|
||||
InitReg(MISCREG_DBGBVR11_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR11, MISCREG_DBGBXVR11);
|
||||
InitReg(MISCREG_DBGBVR12_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR12, MISCREG_DBGBXVR12);
|
||||
InitReg(MISCREG_DBGBVR13_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR13, MISCREG_DBGBXVR13);
|
||||
InitReg(MISCREG_DBGBVR14_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR14, MISCREG_DBGBXVR14);
|
||||
InitReg(MISCREG_DBGBVR15_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBVR15, MISCREG_DBGBXVR15);
|
||||
InitReg(MISCREG_DBGBCR0_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR0);
|
||||
InitReg(MISCREG_DBGBCR1_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR1);
|
||||
InitReg(MISCREG_DBGBCR2_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR2);
|
||||
InitReg(MISCREG_DBGBCR3_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR3);
|
||||
InitReg(MISCREG_DBGBCR4_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR4);
|
||||
InitReg(MISCREG_DBGBCR5_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR5);
|
||||
InitReg(MISCREG_DBGBCR6_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR6);
|
||||
InitReg(MISCREG_DBGBCR7_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR7);
|
||||
InitReg(MISCREG_DBGBCR8_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR8);
|
||||
InitReg(MISCREG_DBGBCR9_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR9);
|
||||
InitReg(MISCREG_DBGBCR10_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR10);
|
||||
InitReg(MISCREG_DBGBCR11_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR11);
|
||||
InitReg(MISCREG_DBGBCR12_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR12);
|
||||
InitReg(MISCREG_DBGBCR13_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR13);
|
||||
InitReg(MISCREG_DBGBCR14_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR14);
|
||||
InitReg(MISCREG_DBGBCR15_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgbcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgbcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGBCR15);
|
||||
InitReg(MISCREG_DBGWVR0_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR0);
|
||||
InitReg(MISCREG_DBGWVR1_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR1);
|
||||
InitReg(MISCREG_DBGWVR2_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR2);
|
||||
InitReg(MISCREG_DBGWVR3_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR3);
|
||||
InitReg(MISCREG_DBGWVR4_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR4);
|
||||
InitReg(MISCREG_DBGWVR5_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR5);
|
||||
InitReg(MISCREG_DBGWVR6_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR6);
|
||||
InitReg(MISCREG_DBGWVR7_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR7);
|
||||
InitReg(MISCREG_DBGWVR8_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR8);
|
||||
InitReg(MISCREG_DBGWVR9_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR9);
|
||||
InitReg(MISCREG_DBGWVR10_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR10);
|
||||
InitReg(MISCREG_DBGWVR11_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR11);
|
||||
InitReg(MISCREG_DBGWVR12_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR12);
|
||||
InitReg(MISCREG_DBGWVR13_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR13);
|
||||
InitReg(MISCREG_DBGWVR14_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR14);
|
||||
InitReg(MISCREG_DBGWVR15_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwvrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwvrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWVR15);
|
||||
InitReg(MISCREG_DBGWCR0_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR0);
|
||||
InitReg(MISCREG_DBGWCR1_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR1);
|
||||
InitReg(MISCREG_DBGWCR2_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR2);
|
||||
InitReg(MISCREG_DBGWCR3_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR3);
|
||||
InitReg(MISCREG_DBGWCR4_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR4);
|
||||
InitReg(MISCREG_DBGWCR5_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR5);
|
||||
InitReg(MISCREG_DBGWCR6_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR6);
|
||||
InitReg(MISCREG_DBGWCR7_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR7);
|
||||
InitReg(MISCREG_DBGWCR8_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR8);
|
||||
InitReg(MISCREG_DBGWCR9_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR9);
|
||||
InitReg(MISCREG_DBGWCR10_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR10);
|
||||
InitReg(MISCREG_DBGWCR11_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR11);
|
||||
InitReg(MISCREG_DBGWCR12_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR12);
|
||||
InitReg(MISCREG_DBGWCR13_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR13);
|
||||
InitReg(MISCREG_DBGWCR14_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGWCR14);
|
||||
InitReg(MISCREG_DBGWCR15_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.fault(EL1, faultDebugEL1)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgwcrnEL1>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgwcrnEL1>)
|
||||
.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<false, &HDFGTR::oslarEL1>)
|
||||
.faultWrite(EL2, faultDebugOsEL2)
|
||||
.mapsTo(MISCREG_DBGOSLAR);
|
||||
InitReg(MISCREG_OSLSR_EL1)
|
||||
.allPrivileges().exceptUserMode().writes(0)
|
||||
.faultRead(EL1, faultDebugOsEL1<true, &HDFGTR::oslsrEL1>)
|
||||
.faultRead(EL2, faultDebugOsEL2)
|
||||
.mapsTo(MISCREG_DBGOSLSR);
|
||||
InitReg(MISCREG_OSDLR_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.faultRead(EL1, faultDebugOsEL1<true, &HDFGTR::osdlrEL1>)
|
||||
.faultWrite(EL1, faultDebugOsEL1<false, &HDFGTR::osdlrEL1>)
|
||||
.fault(EL2, faultDebugOsEL2)
|
||||
.mapsTo(MISCREG_DBGOSDLR);
|
||||
InitReg(MISCREG_DBGPRCR_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.faultRead(EL1, faultDebugOsEL1<true, &HDFGTR::dbgprcrEL1>)
|
||||
.faultWrite(EL1, faultDebugOsEL1<false, &HDFGTR::dbgprcrEL1>)
|
||||
.fault(EL2, faultDebugOsEL2)
|
||||
.mapsTo(MISCREG_DBGPRCR);
|
||||
InitReg(MISCREG_DBGCLAIMSET_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgclaim>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgclaim>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGCLAIMSET);
|
||||
InitReg(MISCREG_DBGCLAIMCLR_EL1)
|
||||
.allPrivileges().exceptUserMode()
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgclaim>)
|
||||
.faultWrite(EL1, faultDebugWithFgtEL1<false, &HDFGTR::dbgclaim>)
|
||||
.fault(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGCLAIMCLR);
|
||||
InitReg(MISCREG_DBGAUTHSTATUS_EL1)
|
||||
.allPrivileges().exceptUserMode().writes(0)
|
||||
.faultRead(EL1, faultDebugWithFgtEL1<true, &HDFGTR::dbgauthstatusEL1>)
|
||||
.faultRead(EL2, faultDebugEL2)
|
||||
.mapsTo(MISCREG_DBGAUTHSTATUS);
|
||||
InitReg(MISCREG_TEECR32_EL1);
|
||||
InitReg(MISCREG_TEEHBR32_EL1);
|
||||
|
||||
Reference in New Issue
Block a user