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:
Giacomo Travaglini
2022-07-06 15:55:47 +01:00
parent e4ab0bb5cf
commit f118b5755a
4 changed files with 463 additions and 465 deletions

View File

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

View File

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

View File

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

View File

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