diff --git a/src/arch/arm/isa.cc b/src/arch/arm/isa.cc index 69ca4f1aa2..a31f27b449 100644 --- a/src/arch/arm/isa.cc +++ b/src/arch/arm/isa.cc @@ -127,8 +127,6 @@ ISA::ISA(const Params &p) : BaseISA(p), system(NULL), clear(); } -std::vector 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 static inline void lockedSnoopHandler(ThreadContext *tc, XC *xc, PacketPtr pkt, diff --git a/src/arch/arm/isa.hh b/src/arch/arm/isa.hh index 3aacff7f87..faa12454e1 100644 --- a/src/arch/arm/isa.hh +++ b/src/arch/arm/isa.hh @@ -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 lookUpMiscReg; - - class MiscRegLUTEntryInitializer - { - struct MiscRegLUTEntry &entry; - std::bitset &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 &i) - : entry(e), - info(i) - { - // force unimplemented registers to be thusly declared - implemented(1); - } - }; - const MiscRegLUTEntryInitializer InitReg(uint32_t reg) { diff --git a/src/arch/arm/regs/misc.cc b/src/arch/arm/regs/misc.cc index e5cf50cca0..c8ea5ed99f 100644 --- a/src/arch/arm/regs/misc.cc +++ b/src/arch/arm/regs/misc.cc @@ -803,6 +803,7 @@ canWriteAArch64SysReg(MiscRegIndex reg, HCR hcr, SCR scr, CPSR cpsr, } } +std::vector lookUpMiscReg(NUM_MISCREGS); std::bitset 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() { diff --git a/src/arch/arm/regs/misc.hh b/src/arch/arm/regs/misc.hh index e9a83c4628..2d1ad3be61 100644 --- a/src/arch/arm/regs/misc.hh +++ b/src/arch/arm/regs/misc.hh @@ -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 &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 &i) + : entry(e), + info(i) + { + // force unimplemented registers to be thusly declared + implemented(1); + } + }; + + extern std::vector lookUpMiscReg; extern std::bitset miscRegInfo[NUM_MISCREGS]; struct MiscRegNum32