arch-arm: Move lookUpMiscReg vector out of the ISA class
Our plan is to consolidate the lookUpMiscReg vector with the miscRegInfo one into a single metadata vector Change-Id: I07b5a63a8da6d9b48593a904f6912b84a2afdd2c Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/61673 Reviewed-by: Richard Cooper <richard.cooper@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
This commit is contained in:
@@ -127,8 +127,6 @@ ISA::ISA(const Params &p) : BaseISA(p), system(NULL),
|
||||
clear();
|
||||
}
|
||||
|
||||
std::vector<struct ISA::MiscRegLUTEntry> ISA::lookUpMiscReg(NUM_MISCREGS);
|
||||
|
||||
void
|
||||
ISA::clear()
|
||||
{
|
||||
@@ -2230,18 +2228,6 @@ ISA::addressTranslation(MMU::ArmTranslationType tran_type,
|
||||
return;
|
||||
}
|
||||
|
||||
ISA::MiscRegLUTEntryInitializer::chain
|
||||
ISA::MiscRegLUTEntryInitializer::highest(ArmSystem *const sys) const
|
||||
{
|
||||
switch (FullSystem ? sys->highestEL() : EL1) {
|
||||
case EL0:
|
||||
case EL1: priv(); break;
|
||||
case EL2: hyp(); break;
|
||||
case EL3: mon(); break;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class XC>
|
||||
static inline void
|
||||
lockedSnoopHandler(ThreadContext *tc, XC *xc, PacketPtr pkt,
|
||||
|
||||
@@ -107,456 +107,6 @@ namespace ArmISA
|
||||
|
||||
SelfDebug * selfDebug;
|
||||
|
||||
/** MiscReg metadata **/
|
||||
struct MiscRegLUTEntry
|
||||
{
|
||||
uint32_t lower; // Lower half mapped to this register
|
||||
uint32_t upper; // Upper half mapped to this register
|
||||
uint64_t _reset; // value taken on reset (i.e. initialization)
|
||||
uint64_t _res0; // reserved
|
||||
uint64_t _res1; // reserved
|
||||
uint64_t _raz; // read as zero (fixed at 0)
|
||||
uint64_t _rao; // read as one (fixed at 1)
|
||||
public:
|
||||
MiscRegLUTEntry() :
|
||||
lower(0), upper(0),
|
||||
_reset(0), _res0(0), _res1(0), _raz(0), _rao(0) {}
|
||||
uint64_t reset() const { return _reset; }
|
||||
uint64_t res0() const { return _res0; }
|
||||
uint64_t res1() const { return _res1; }
|
||||
uint64_t raz() const { return _raz; }
|
||||
uint64_t rao() const { return _rao; }
|
||||
// raz/rao implies writes ignored
|
||||
uint64_t wi() const { return _raz | _rao; }
|
||||
};
|
||||
|
||||
/** Metadata table accessible via the value of the register */
|
||||
static std::vector<struct MiscRegLUTEntry> lookUpMiscReg;
|
||||
|
||||
class MiscRegLUTEntryInitializer
|
||||
{
|
||||
struct MiscRegLUTEntry &entry;
|
||||
std::bitset<NUM_MISCREG_INFOS> &info;
|
||||
typedef const MiscRegLUTEntryInitializer& chain;
|
||||
public:
|
||||
chain
|
||||
mapsTo(uint32_t l, uint32_t u = 0) const
|
||||
{
|
||||
entry.lower = l;
|
||||
entry.upper = u;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
res0(uint64_t mask) const
|
||||
{
|
||||
entry._res0 = mask;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
res1(uint64_t mask) const
|
||||
{
|
||||
entry._res1 = mask;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
raz(uint64_t mask) const
|
||||
{
|
||||
entry._raz = mask;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
rao(uint64_t mask) const
|
||||
{
|
||||
entry._rao = mask;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
implemented(bool v = true) const
|
||||
{
|
||||
info[MISCREG_IMPLEMENTED] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
unimplemented() const
|
||||
{
|
||||
return implemented(false);
|
||||
}
|
||||
chain
|
||||
unverifiable(bool v = true) const
|
||||
{
|
||||
info[MISCREG_UNVERIFIABLE] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
warnNotFail(bool v = true) const
|
||||
{
|
||||
info[MISCREG_WARN_NOT_FAIL] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
mutex(bool v = true) const
|
||||
{
|
||||
info[MISCREG_MUTEX] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
banked(bool v = true) const
|
||||
{
|
||||
info[MISCREG_BANKED] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
banked64(bool v = true) const
|
||||
{
|
||||
info[MISCREG_BANKED64] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
bankedChild(bool v = true) const
|
||||
{
|
||||
info[MISCREG_BANKED_CHILD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
userNonSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_USR_NS_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
userNonSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_USR_NS_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
userSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_USR_S_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
userSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_USR_S_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
user(bool v = true) const
|
||||
{
|
||||
userNonSecureRead(v);
|
||||
userNonSecureWrite(v);
|
||||
userSecureRead(v);
|
||||
userSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privNonSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_PRI_NS_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privNonSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_PRI_NS_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privNonSecure(bool v = true) const
|
||||
{
|
||||
privNonSecureRead(v);
|
||||
privNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_PRI_S_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_PRI_S_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privSecure(bool v = true) const
|
||||
{
|
||||
privSecureRead(v);
|
||||
privSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
priv(bool v = true) const
|
||||
{
|
||||
privSecure(v);
|
||||
privNonSecure(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privRead(bool v = true) const
|
||||
{
|
||||
privSecureRead(v);
|
||||
privNonSecureRead(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_E2H_S_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HNonSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_E2H_NS_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HRead(bool v = true) const
|
||||
{
|
||||
hypE2HSecureRead(v);
|
||||
hypE2HNonSecureRead(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_E2H_S_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HNonSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_E2H_NS_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HWrite(bool v = true) const
|
||||
{
|
||||
hypE2HSecureWrite(v);
|
||||
hypE2HNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2H(bool v = true) const
|
||||
{
|
||||
hypE2HRead(v);
|
||||
hypE2HWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_S_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypNonSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_NS_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypRead(bool v = true) const
|
||||
{
|
||||
hypE2HRead(v);
|
||||
hypSecureRead(v);
|
||||
hypNonSecureRead(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_S_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypNonSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_NS_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypWrite(bool v = true) const
|
||||
{
|
||||
hypE2HWrite(v);
|
||||
hypSecureWrite(v);
|
||||
hypNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypSecure(bool v = true) const
|
||||
{
|
||||
hypE2HSecureRead(v);
|
||||
hypE2HSecureWrite(v);
|
||||
hypSecureRead(v);
|
||||
hypSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hyp(bool v = true) const
|
||||
{
|
||||
hypRead(v);
|
||||
hypWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monE2HRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_MON_E2H_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monE2HWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_MON_E2H_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monE2H(bool v = true) const
|
||||
{
|
||||
monE2HRead(v);
|
||||
monE2HWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monSecureRead(bool v = true) const
|
||||
{
|
||||
monE2HRead(v);
|
||||
info[MISCREG_MON_NS0_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monSecureWrite(bool v = true) const
|
||||
{
|
||||
monE2HWrite(v);
|
||||
info[MISCREG_MON_NS0_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monNonSecureRead(bool v = true) const
|
||||
{
|
||||
monE2HRead(v);
|
||||
info[MISCREG_MON_NS1_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monNonSecureWrite(bool v = true) const
|
||||
{
|
||||
monE2HWrite(v);
|
||||
info[MISCREG_MON_NS1_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
mon(bool v = true) const
|
||||
{
|
||||
monSecureRead(v);
|
||||
monSecureWrite(v);
|
||||
monNonSecureRead(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monSecure(bool v = true) const
|
||||
{
|
||||
monSecureRead(v);
|
||||
monSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monNonSecure(bool v = true) const
|
||||
{
|
||||
monNonSecureRead(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
allPrivileges(bool v = true) const
|
||||
{
|
||||
userNonSecureRead(v);
|
||||
userNonSecureWrite(v);
|
||||
userSecureRead(v);
|
||||
userSecureWrite(v);
|
||||
privNonSecureRead(v);
|
||||
privNonSecureWrite(v);
|
||||
privSecureRead(v);
|
||||
privSecureWrite(v);
|
||||
hypRead(v);
|
||||
hypWrite(v);
|
||||
monSecureRead(v);
|
||||
monSecureWrite(v);
|
||||
monNonSecureRead(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
nonSecure(bool v = true) const
|
||||
{
|
||||
userNonSecureRead(v);
|
||||
userNonSecureWrite(v);
|
||||
privNonSecureRead(v);
|
||||
privNonSecureWrite(v);
|
||||
hypRead(v);
|
||||
hypWrite(v);
|
||||
monNonSecureRead(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
secure(bool v = true) const
|
||||
{
|
||||
userSecureRead(v);
|
||||
userSecureWrite(v);
|
||||
privSecureRead(v);
|
||||
privSecureWrite(v);
|
||||
monSecureRead(v);
|
||||
monSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
reads(bool v) const
|
||||
{
|
||||
userNonSecureRead(v);
|
||||
userSecureRead(v);
|
||||
privNonSecureRead(v);
|
||||
privSecureRead(v);
|
||||
hypRead(v);
|
||||
monSecureRead(v);
|
||||
monNonSecureRead(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
writes(bool v) const
|
||||
{
|
||||
userNonSecureWrite(v);
|
||||
userSecureWrite(v);
|
||||
privNonSecureWrite(v);
|
||||
privSecureWrite(v);
|
||||
hypWrite(v);
|
||||
monSecureWrite(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
exceptUserMode() const
|
||||
{
|
||||
user(0);
|
||||
return *this;
|
||||
}
|
||||
chain highest(ArmSystem *const sys) const;
|
||||
MiscRegLUTEntryInitializer(struct MiscRegLUTEntry &e,
|
||||
std::bitset<NUM_MISCREG_INFOS> &i)
|
||||
: entry(e),
|
||||
info(i)
|
||||
{
|
||||
// force unimplemented registers to be thusly declared
|
||||
implemented(1);
|
||||
}
|
||||
};
|
||||
|
||||
const MiscRegLUTEntryInitializer
|
||||
InitReg(uint32_t reg)
|
||||
{
|
||||
|
||||
@@ -803,6 +803,7 @@ canWriteAArch64SysReg(MiscRegIndex reg, HCR hcr, SCR scr, CPSR cpsr,
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<struct MiscRegLUTEntry> lookUpMiscReg(NUM_MISCREGS);
|
||||
std::bitset<NUM_MISCREG_INFOS> miscRegInfo[NUM_MISCREGS]; // initialized below
|
||||
|
||||
namespace {
|
||||
@@ -1328,6 +1329,18 @@ encodeAArch64SysReg(MiscRegIndex misc_reg)
|
||||
}
|
||||
}
|
||||
|
||||
MiscRegLUTEntryInitializer::chain
|
||||
MiscRegLUTEntryInitializer::highest(ArmSystem *const sys) const
|
||||
{
|
||||
switch (FullSystem ? sys->highestEL() : EL1) {
|
||||
case EL0:
|
||||
case EL1: priv(); break;
|
||||
case EL2: hyp(); break;
|
||||
case EL3: mon(); break;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
void
|
||||
ISA::initializeMiscRegMetadata()
|
||||
{
|
||||
|
||||
@@ -53,9 +53,9 @@
|
||||
namespace gem5
|
||||
{
|
||||
|
||||
class ArmSystem;
|
||||
class ThreadContext;
|
||||
|
||||
|
||||
namespace ArmISA
|
||||
{
|
||||
enum MiscRegIndex
|
||||
@@ -1152,6 +1152,455 @@ namespace ArmISA
|
||||
NUM_MISCREG_INFOS
|
||||
};
|
||||
|
||||
/** MiscReg metadata **/
|
||||
struct MiscRegLUTEntry
|
||||
{
|
||||
uint32_t lower; // Lower half mapped to this register
|
||||
uint32_t upper; // Upper half mapped to this register
|
||||
uint64_t _reset; // value taken on reset (i.e. initialization)
|
||||
uint64_t _res0; // reserved
|
||||
uint64_t _res1; // reserved
|
||||
uint64_t _raz; // read as zero (fixed at 0)
|
||||
uint64_t _rao; // read as one (fixed at 1)
|
||||
public:
|
||||
MiscRegLUTEntry() :
|
||||
lower(0), upper(0),
|
||||
_reset(0), _res0(0), _res1(0), _raz(0), _rao(0) {}
|
||||
uint64_t reset() const { return _reset; }
|
||||
uint64_t res0() const { return _res0; }
|
||||
uint64_t res1() const { return _res1; }
|
||||
uint64_t raz() const { return _raz; }
|
||||
uint64_t rao() const { return _rao; }
|
||||
// raz/rao implies writes ignored
|
||||
uint64_t wi() const { return _raz | _rao; }
|
||||
};
|
||||
|
||||
/** Metadata table accessible via the value of the register */
|
||||
class MiscRegLUTEntryInitializer
|
||||
{
|
||||
struct MiscRegLUTEntry &entry;
|
||||
std::bitset<NUM_MISCREG_INFOS> &info;
|
||||
typedef const MiscRegLUTEntryInitializer& chain;
|
||||
public:
|
||||
chain
|
||||
mapsTo(uint32_t l, uint32_t u = 0) const
|
||||
{
|
||||
entry.lower = l;
|
||||
entry.upper = u;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
res0(uint64_t mask) const
|
||||
{
|
||||
entry._res0 = mask;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
res1(uint64_t mask) const
|
||||
{
|
||||
entry._res1 = mask;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
raz(uint64_t mask) const
|
||||
{
|
||||
entry._raz = mask;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
rao(uint64_t mask) const
|
||||
{
|
||||
entry._rao = mask;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
implemented(bool v = true) const
|
||||
{
|
||||
info[MISCREG_IMPLEMENTED] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
unimplemented() const
|
||||
{
|
||||
return implemented(false);
|
||||
}
|
||||
chain
|
||||
unverifiable(bool v = true) const
|
||||
{
|
||||
info[MISCREG_UNVERIFIABLE] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
warnNotFail(bool v = true) const
|
||||
{
|
||||
info[MISCREG_WARN_NOT_FAIL] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
mutex(bool v = true) const
|
||||
{
|
||||
info[MISCREG_MUTEX] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
banked(bool v = true) const
|
||||
{
|
||||
info[MISCREG_BANKED] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
banked64(bool v = true) const
|
||||
{
|
||||
info[MISCREG_BANKED64] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
bankedChild(bool v = true) const
|
||||
{
|
||||
info[MISCREG_BANKED_CHILD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
userNonSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_USR_NS_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
userNonSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_USR_NS_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
userSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_USR_S_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
userSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_USR_S_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
user(bool v = true) const
|
||||
{
|
||||
userNonSecureRead(v);
|
||||
userNonSecureWrite(v);
|
||||
userSecureRead(v);
|
||||
userSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privNonSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_PRI_NS_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privNonSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_PRI_NS_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privNonSecure(bool v = true) const
|
||||
{
|
||||
privNonSecureRead(v);
|
||||
privNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_PRI_S_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_PRI_S_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privSecure(bool v = true) const
|
||||
{
|
||||
privSecureRead(v);
|
||||
privSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
priv(bool v = true) const
|
||||
{
|
||||
privSecure(v);
|
||||
privNonSecure(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
privRead(bool v = true) const
|
||||
{
|
||||
privSecureRead(v);
|
||||
privNonSecureRead(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_E2H_S_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HNonSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_E2H_NS_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HRead(bool v = true) const
|
||||
{
|
||||
hypE2HSecureRead(v);
|
||||
hypE2HNonSecureRead(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_E2H_S_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HNonSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_E2H_NS_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2HWrite(bool v = true) const
|
||||
{
|
||||
hypE2HSecureWrite(v);
|
||||
hypE2HNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypE2H(bool v = true) const
|
||||
{
|
||||
hypE2HRead(v);
|
||||
hypE2HWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_S_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypNonSecureRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_NS_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypRead(bool v = true) const
|
||||
{
|
||||
hypE2HRead(v);
|
||||
hypSecureRead(v);
|
||||
hypNonSecureRead(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_S_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypNonSecureWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_HYP_NS_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypWrite(bool v = true) const
|
||||
{
|
||||
hypE2HWrite(v);
|
||||
hypSecureWrite(v);
|
||||
hypNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hypSecure(bool v = true) const
|
||||
{
|
||||
hypE2HSecureRead(v);
|
||||
hypE2HSecureWrite(v);
|
||||
hypSecureRead(v);
|
||||
hypSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
hyp(bool v = true) const
|
||||
{
|
||||
hypRead(v);
|
||||
hypWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monE2HRead(bool v = true) const
|
||||
{
|
||||
info[MISCREG_MON_E2H_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monE2HWrite(bool v = true) const
|
||||
{
|
||||
info[MISCREG_MON_E2H_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monE2H(bool v = true) const
|
||||
{
|
||||
monE2HRead(v);
|
||||
monE2HWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monSecureRead(bool v = true) const
|
||||
{
|
||||
monE2HRead(v);
|
||||
info[MISCREG_MON_NS0_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monSecureWrite(bool v = true) const
|
||||
{
|
||||
monE2HWrite(v);
|
||||
info[MISCREG_MON_NS0_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monNonSecureRead(bool v = true) const
|
||||
{
|
||||
monE2HRead(v);
|
||||
info[MISCREG_MON_NS1_RD] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monNonSecureWrite(bool v = true) const
|
||||
{
|
||||
monE2HWrite(v);
|
||||
info[MISCREG_MON_NS1_WR] = v;
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
mon(bool v = true) const
|
||||
{
|
||||
monSecureRead(v);
|
||||
monSecureWrite(v);
|
||||
monNonSecureRead(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monSecure(bool v = true) const
|
||||
{
|
||||
monSecureRead(v);
|
||||
monSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
monNonSecure(bool v = true) const
|
||||
{
|
||||
monNonSecureRead(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
allPrivileges(bool v = true) const
|
||||
{
|
||||
userNonSecureRead(v);
|
||||
userNonSecureWrite(v);
|
||||
userSecureRead(v);
|
||||
userSecureWrite(v);
|
||||
privNonSecureRead(v);
|
||||
privNonSecureWrite(v);
|
||||
privSecureRead(v);
|
||||
privSecureWrite(v);
|
||||
hypRead(v);
|
||||
hypWrite(v);
|
||||
monSecureRead(v);
|
||||
monSecureWrite(v);
|
||||
monNonSecureRead(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
nonSecure(bool v = true) const
|
||||
{
|
||||
userNonSecureRead(v);
|
||||
userNonSecureWrite(v);
|
||||
privNonSecureRead(v);
|
||||
privNonSecureWrite(v);
|
||||
hypRead(v);
|
||||
hypWrite(v);
|
||||
monNonSecureRead(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
secure(bool v = true) const
|
||||
{
|
||||
userSecureRead(v);
|
||||
userSecureWrite(v);
|
||||
privSecureRead(v);
|
||||
privSecureWrite(v);
|
||||
monSecureRead(v);
|
||||
monSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
reads(bool v) const
|
||||
{
|
||||
userNonSecureRead(v);
|
||||
userSecureRead(v);
|
||||
privNonSecureRead(v);
|
||||
privSecureRead(v);
|
||||
hypRead(v);
|
||||
monSecureRead(v);
|
||||
monNonSecureRead(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
writes(bool v) const
|
||||
{
|
||||
userNonSecureWrite(v);
|
||||
userSecureWrite(v);
|
||||
privNonSecureWrite(v);
|
||||
privSecureWrite(v);
|
||||
hypWrite(v);
|
||||
monSecureWrite(v);
|
||||
monNonSecureWrite(v);
|
||||
return *this;
|
||||
}
|
||||
chain
|
||||
exceptUserMode() const
|
||||
{
|
||||
user(0);
|
||||
return *this;
|
||||
}
|
||||
chain highest(ArmSystem *const sys) const;
|
||||
MiscRegLUTEntryInitializer(struct MiscRegLUTEntry &e,
|
||||
std::bitset<NUM_MISCREG_INFOS> &i)
|
||||
: entry(e),
|
||||
info(i)
|
||||
{
|
||||
// force unimplemented registers to be thusly declared
|
||||
implemented(1);
|
||||
}
|
||||
};
|
||||
|
||||
extern std::vector<struct MiscRegLUTEntry> lookUpMiscReg;
|
||||
extern std::bitset<NUM_MISCREG_INFOS> miscRegInfo[NUM_MISCREGS];
|
||||
|
||||
struct MiscRegNum32
|
||||
|
||||
Reference in New Issue
Block a user