arch-arm: Add FEAT_FGT trapping for debug registers (#873)
We already implemented FEAT_FGT but we were missing trapping capabilities for trapping debug registers accesses
This commit is contained in:
@@ -1162,6 +1162,8 @@ std::unordered_map<MiscRegNum64, MiscRegIndex> 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 },
|
||||
@@ -1298,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
|
||||
*
|
||||
@@ -1355,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
|
||||
*
|
||||
@@ -1805,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)
|
||||
@@ -3917,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)
|
||||
@@ -4262,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);
|
||||
@@ -6176,6 +6342,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)
|
||||
|
||||
@@ -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",
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user