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:
Jason Lowe-Power
2024-02-21 11:27:43 -08:00
committed by GitHub
3 changed files with 256 additions and 64 deletions

View File

@@ -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)

View File

@@ -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",

View File

@@ -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;