Go to the documentation of this file.
48 #include "debug/TLB.hh"
49 #include "debug/TLBVerbose.hh"
57 using namespace ArmISA;
61 itbStage2(
p.stage2_itb), dtbStage2(
p.stage2_dtb),
62 itbWalker(
p.itb_walker), dtbWalker(
p.dtb_walker),
63 itbStage2Walker(
p.stage2_itb_walker),
64 dtbStage2Walker(
p.stage2_dtb_walker),
67 s1State(this, false), s2State(this, true),
114 if (
static_cast<TLB*
>(
tlb)->walkCache())
118 if (
static_cast<TLB*
>(
tlb)->walkCache())
122 if (
static_cast<TLB*
>(
tlb)->walkCache())
185 lookup_data.
inHost =
false;
208 const Addr paddr = req->getPaddr();
213 req->setLocalAccessor(
218 pseudo_inst::pseudoInst<RegABI64>(tc, func, ret);
220 pseudo_inst::pseudoInst<RegABI32>(tc, func, ret);
236 Translation *translation,
bool &delay,
bool timing,
240 Addr vaddr_tainted = req->getVaddr();
246 vaddr = vaddr_tainted;
257 return std::make_shared<DataAbort>(
269 if (!
p->pTable->translate(
vaddr, paddr))
270 return std::make_shared<GenericPageTableFault>(vaddr_tainted);
271 req->setPaddr(paddr);
289 if (req->isCacheMaintenance()) {
307 if (
state.isStage2 && req->isPTWalk() &&
state.hcr.ptw &&
309 return std::make_shared<DataAbort>(
312 state.isStage2, tranMethod);
321 return std::make_shared<DataAbort>(
329 if (
te->nonCacheable) {
331 if (req->isPrefetch()) {
334 return std::make_shared<PrefetchAbort>(
336 state.isStage2, tranMethod);
340 if (!
te->longDescFormat) {
341 switch ((
state.dacr >> (
static_cast<uint8_t
>(
te->domain) * 2)) & 0x3) {
344 DPRINTF(
TLB,
"TLB Fault: Data abort on domain. DACR: %#x"
345 " domain: %#x write:%d\n",
state.dacr,
346 static_cast<uint8_t
>(
te->domain), is_write);
351 return std::make_shared<PrefetchAbort>(
354 state.isStage2, tranMethod);
356 return std::make_shared<DataAbort>(
359 state.isStage2, tranMethod);
364 panic(
"UNPRED domain\n");
371 uint8_t ap =
te->longDescFormat ?
te->ap << 1 :
te->ap;
372 uint8_t hap =
te->hap;
374 if (
state.sctlr.afe == 1 ||
te->longDescFormat)
378 bool isWritable =
true;
382 if (
state.isStage2) {
387 DPRINTF(
TLB,
"Access permissions 0, checking rs:%#x\n",
388 (
int)
state.sctlr.rs);
389 if (!
state.sctlr.xp) {
390 switch ((
int)
state.sctlr.rs) {
395 abt = is_write || !is_priv;
411 abt = !is_priv && is_write;
412 isWritable = is_priv;
418 panic(
"UNPRED premissions\n");
420 abt = !is_priv || is_write;
429 panic(
"Unknown permissions %#x\n", ap);
433 bool hapAbt = is_write ? !(hap & 2) : !(hap & 1);
434 bool xn =
te->xn || (isWritable &&
state.sctlr.wxn) ||
435 (ap == 3 &&
state.sctlr.uwxn && is_priv);
436 if (is_fetch && (
abt || xn ||
437 (
te->longDescFormat &&
te->pxn && is_priv) ||
440 DPRINTF(
TLB,
"TLB Fault: Prefetch abort on permission check. AP:%d "
441 "priv:%d write:%d ns:%d sif:%d sctlr.afe: %d \n",
442 ap, is_priv, is_write,
te->ns,
446 return std::make_shared<PrefetchAbort>(
449 state.isStage2, tranMethod);
450 }
else if (
abt | hapAbt) {
452 DPRINTF(
TLB,
"TLB Fault: Data abort on permission check. AP:%d priv:%d"
453 " write:%d\n", ap, is_priv, is_write);
454 return std::make_shared<DataAbort>(
473 assert(
state.aarch64);
480 if (req->isCacheClean() &&
state.aarch64EL !=
EL0 && !
state.isStage2) {
484 Addr vaddr_tainted = req->getVaddr();
491 bool is_write = !req->isCacheClean() &&
mode ==
Write;
492 bool is_atomic = req->isAtomic();
500 if (
state.isStage2 && req->isPTWalk() &&
state.hcr.ptw &&
502 return std::make_shared<DataAbort>(
503 vaddr_tainted,
te->domain, is_write,
514 return std::make_shared<DataAbort>(
517 is_atomic ?
false : is_write,
524 if (
te->nonCacheable) {
526 if (req->isPrefetch()) {
529 return std::make_shared<PrefetchAbort>(
541 bool grant_read =
true;
543 if (
state.isStage2) {
545 (!is_write && !is_fetch), is_write, is_fetch);
548 (!is_write && !is_fetch), is_write, is_fetch);
554 DPRINTF(
TLB,
"TLB Fault: Prefetch abort on permission check. "
555 "ns:%d scr.sif:%d sctlr.afe: %d\n",
559 return std::make_shared<PrefetchAbort>(
565 DPRINTF(
TLB,
"TLB Fault: Data abort on permission check."
567 return std::make_shared<DataAbort>(
568 vaddr_tainted,
te->domain,
569 (is_atomic && !grant_read) ?
false : is_write,
588 bool grant_read =
te->hap & 0b01;
589 bool grant_write =
te->hap & 0
b10;
592 uint8_t pxn =
te->pxn;
600 "Checking S2 permissions: hap:%d, xn:%d, pxn:%d, r:%d, "
601 "w:%d, x:%d\n",
te->hap, xn, pxn,
r,
w,
x);
604 grant = grant_read && !xn;
605 }
else if (req->isAtomic()) {
606 grant = grant_read || grant_write;
612 panic(
"Invalid Operation\n");
615 return std::make_pair(grant, grant_read);
622 bool grant =
false, grant_read =
true, grant_write =
true, grant_exec =
true;
624 const uint8_t ap =
te->ap & 0
b11;
625 const bool is_priv =
state.isPriv && !(req->getFlags() &
UserMode);
629 uint8_t pxn =
te->pxn;
631 DPRINTF(TLBVerbose,
"Checking S1 permissions: ap:%d, xn:%d, pxn:%d, r:%d, "
632 "w:%d, x:%d, is_priv: %d, wxn: %d\n", ap, xn,
633 pxn,
r,
w,
x, is_priv,
wxn);
636 return std::make_pair(
false,
false);
648 pr = 1; pw = 1; ur = 0;
uw = 0;
651 pr = 1; pw = 1; ur = 1;
uw = 1;
654 pr = 1; pw = 0; ur = 0;
uw = 0;
657 pr = 1; pw = 0; ur = 1;
uw = 0;
662 const bool px = !(pxn ||
uw);
665 grant_read = is_priv ?
pr : ur;
666 grant_write = is_priv ? pw :
uw;
667 grant_exec = is_priv ?
px :
ux;
669 switch (
bits(ap, 1)) {
671 grant_read = 1; grant_write = 1;
674 grant_read = 1; grant_write = 0;
682 grant_exec = grant_exec && !(
wxn && grant_write);
685 grant_exec = grant_exec && !
state.scr.sif;
690 }
else if (req->isAtomic()) {
691 grant = grant_read && grant_write;
698 return std::make_pair(grant, grant_read);
728 bool exception =
false;
729 switch (
state.aarch64EL) {
761 if (
HaveExt(tc, ArmExtension::FEAT_PAN) &&
state.cpsr.pan && (ap & 0x1) &&
764 if (req->isCacheMaintenance() &&
768 }
else if (!is_priv && !(
state.hcr.e2h && !
state.hcr.tge)) {
782 const bool selbit =
bits(vaddr_tainted, 55);
785 const auto topbit =
state.computeAddrTop(tc, selbit, is_inst, tcr,
el);
796 bool is_atomic = req->isAtomic();
797 req->setPaddr(
vaddr);
811 f = std::make_shared<PrefetchAbort>(
vaddr,
815 f = std::make_shared<DataAbort>(
vaddr,
825 if (long_desc_format ||
state.sctlr.tre == 0 ||
state.nmrr.ir0 == 0 ||
826 state.nmrr.or0 == 0 ||
state.prrr.tr0 != 0x2) {
827 if (!req->isCacheMaintenance()) {
836 bool dc = (
HaveExt(tc, ArmExtension::FEAT_VHE) &&
838 bool i_cacheability =
state.sctlr.i && !
state.sctlr.m;
844 temp_te.
innerAttrs = i_cacheability? 0x2: 0x0;
845 temp_te.
outerAttrs = i_cacheability? 0x2: 0x0;
856 DPRINTF(TLBVerbose,
"(No MMU) setting memory attributes: shareable: "
857 "%d, innerAttrs: %d, outerAttrs: %d, stage2: %d\n",
867 Translation *translation,
bool &delay,
bool timing,
876 Addr vaddr_tainted = req->getVaddr();
879 functional, &mergeTe,
state);
888 "Setting memory attributes: shareable: %d, innerAttrs: %d, "
889 "outerAttrs: %d, mtype: %d, stage2: %d\n",
890 te->shareable,
te->innerAttrs,
te->outerAttrs,
891 static_cast<uint8_t
>(
te->mtype),
state.isStage2);
894 if (
te->nonCacheable && !req->isCacheMaintenance())
906 if (
state.isSecure && !
te->ns) {
909 if (!is_fetch && fault ==
NoFault &&
916 return std::make_shared<DataAbort>(
939 Translation *translation,
bool &delay,
bool timing,
944 assert(!(timing && functional));
946 Addr vaddr_tainted = req->getVaddr();
952 vaddr = vaddr_tainted;
963 "CPSR is priv:%d UserMode:%d secure:%d S1S2NsTran:%d\n",
967 DPRINTF(
TLB,
"translateFs addr %#x, mode %d, st2 %d, scr %#x sctlr %#x "
968 "flags %#lx tranType 0x%x\n", vaddr_tainted,
mode,
971 if (!
state.isStage2) {
972 if ((req->isInstFetch() && (!
state.sctlr.i)) ||
973 ((!req->isInstFetch()) && (!
state.sctlr.c))){
974 if (!req->isCacheMaintenance()) {
984 return std::make_shared<DataAbort>(
994 if (
HaveExt(tc, ArmExtension::FEAT_VHE) &&
997 else if (
state.hcr.dc == 1)
1004 long_desc_format,
state);
1006 DPRINTF(TLBVerbose,
"Translating %s=%#x context=%d\n",
1007 state.isStage2 ?
"IPA" :
"VA", vaddr_tainted,
state.asid);
1016 if (
sd->enabled() && fault ==
NoFault) {
1017 fault =
sd->testDebug(tc, req,
mode);
1040 tran_type,
false,
state);
1070 tran_type,
true,
state);
1084 assert(translation);
1107 fault =
translateFs(req, tc,
mode, translation, delay,
true, tran_type,
1112 DPRINTF(TLBVerbose,
"Translation returning delay=%d fault=%d\n", delay,
1121 if (translation && (call_from_s2 || !
state.stage2Req || req->hasPaddr() ||
1138 switch (mmfr1.vmidbits) {
1153 panic(
"Reserved ID_AA64MMFR1_EL1.VMIDBits value: %#x",
1170 ((tran_type ==
state.curTranType) || stage2)) {
1173 DPRINTF(TLBVerbose,
"TLB variables changed!\n");
1174 state.updateMiscReg(tc, tran_type);
1192 if (
state.directToStage2) {
1218 switch (aarch64EL) {
1220 if (
HaveExt(tc, ArmExtension::FEAT_VHE) &&
1221 hcr.tge == 1 && hcr.e2h == 1) {
1225 uint64_t ttbr_asid = ttbcr.a1 ?
1229 (mmu->haveLargeAsid64 && ttbcr.as) ? 63 : 55, 48);
1234 uint64_t ttbr_asid = ttbcr.a1 ?
1238 (mmu->haveLargeAsid64 && ttbcr.as) ? 63 : 55, 48);
1246 uint64_t ttbr_asid = ttbcr.a1 ?
1250 (mmu->haveLargeAsid64 && ttbcr.as) ? 63 : 55, 48);
1258 uint64_t ttbr_asid = ttbcr.a1 ?
1262 (mmu->haveLargeAsid64 && ttbcr.as) ? 63 : 55, 48);
1275 isPriv = aarch64EL !=
EL0;
1276 if (mmu->release()->has(ArmExtension::VIRTUALIZATION)) {
1278 isHyp = aarch64EL ==
EL2;
1281 isHyp &= (tran_type &
S1CTran) == 0;
1283 if (
HaveExt(tc, ArmExtension::FEAT_VHE) &&
1284 hcr.e2h == 1 && hcr.tge ==1) {
1288 if (hcr.e2h == 1 && (aarch64EL ==
EL2
1289 || (hcr.tge ==1 && aarch64EL ==
EL0))) {
1291 directToStage2 =
false;
1293 stage2DescReq =
false;
1299 stage2Req = isStage2 ||
1300 (
vm && !isHyp && sec &&
1301 !(tran_type &
S1CTran) && (aarch64EL <
EL2) &&
1303 stage2DescReq = isStage2 || (
vm && !isHyp && sec &&
1305 directToStage2 = !isStage2 && stage2Req && !sctlr.m;
1310 directToStage2 =
false;
1312 stage2DescReq =
false;
1330 asid = context_id.asid;
1340 if (mmu->release()->has(ArmExtension::VIRTUALIZATION)) {
1345 isHyp &= (tran_type &
S1CTran) == 0;
1353 stage2Req = hcr.vm && !isStage2 && !isHyp && sec &&
1355 stage2DescReq = hcr.vm && !isStage2 && !isHyp && sec;
1356 directToStage2 = stage2Req && !sctlr.m;
1361 directToStage2 =
false;
1362 stage2DescReq =
false;
1365 miscRegValid =
true;
1366 curTranType = tran_type;
1394 panic(
"Unknown translation mode!\n");
1400 Translation *translation,
bool timing,
bool functional,
1404 return getTE(
te, req, tc,
mode, translation, timing, functional,
1417 lookup_data.
va =
va;
1420 lookup_data.
vmid = vmid;
1422 lookup_data.
secure = secure;
1425 lookup_data.
inHost = in_host;
1428 return tlb->multiLookup(lookup_data);
1433 Translation *translation,
bool timing,
bool functional,
1439 if (
state.isStage2) {
1443 Addr vaddr_tainted = req->getVaddr();
1446 if (
state.aarch64) {
1450 vaddr = vaddr_tainted;
1454 false, target_el,
false,
state.isStage2,
mode);
1457 if (req->isPrefetch()) {
1462 return std::make_shared<PrefetchAbort>(
1469 "TLB Miss: Starting hardware table walker for %#x(%d:%d)\n",
1475 translation, timing, functional, is_secure,
1476 tran_type,
state.stage2DescReq, *
te);
1479 if (timing || fault !=
NoFault) {
1484 true,
false, target_el,
false,
state.isStage2,
mode);
1493 Translation *translation,
bool timing,
bool functional,
1498 if (
state.isStage2) {
1503 fault =
getTE(&s2_te, req, tc,
mode, translation, timing, functional,
1518 Addr vaddr_tainted = req->getVaddr();
1521 fault =
getTE(&s1_te, req, tc,
mode, translation, timing, functional,
1532 req, translation,
mode, timing, functional,
state.isSecure,
1534 fault = s2_lookup->
getTe(tc, mergeTe);
1548 if (
state.isStage2) {
1549 DPRINTF(TLBVerbose,
"s2TLB: reqVa %#x, reqPa %#x, fault %p\n",
1550 vaddr_tainted, req->hasPaddr() ? req->getPaddr() : ~0,
1553 auto arm_fault =
reinterpret_cast<ArmFault*
>(fault.get());
1567 return entry && !entry->
partial;
1575 auto *ommu =
dynamic_cast<MMU*
>(old_mmu);
1578 _attr = ommu->_attr;
1591 fatal_if(!
ti,
"%s is not a valid ARM TLB tester\n", _ti->
name());
1600 if (!
test || !req->hasSize() || req->getSize() == 0 ||
1601 req->isCacheMaintenance()) {
1631 : statistics::
Group(parent),
1633 "Number of MMU faults due to alignment restrictions"),
1635 "Number of MMU faults due to prefetch"),
1637 "Number of MMU faults due to domain restrictions"),
1639 "Number of MMU faults due to permissions restrictions")
uint8_t physAddrRange() const
Returns the supported physical address range in bits.
Fault finalizePhysical(const RequestPtr &req, ThreadContext *tc, Mode mode) const override
Addr maskTaggedAddr(Addr addr, ThreadContext *tc, ExceptionLevel el, int topbit)
virtual RegVal readMiscReg(RegIndex misc_reg)=0
constexpr decltype(nullptr) NoFault
bool ELIs64(ThreadContext *tc, ExceptionLevel el)
Addr start() const
Get the start address of the range.
enums::ArmLookupLevel LookupLevel
std::pair< bool, bool > s2PermBits64(TlbEntry *te, const RequestPtr &req, Mode mode, ThreadContext *tc, CachedState &state, bool r, bool w, bool x)
statistics::Scalar domainFaults
Fault getTE(TlbEntry **te, const RequestPtr &req, ThreadContext *tc, Mode mode, Translation *translation, bool timing, bool functional, bool is_secure, ArmTranslationType tran_type, bool stage2)
bool contains(const Addr &a) const
Determine if the range contains an address.
TableWalker * dtbStage2Walker
virtual void markDelayed()=0
Signal that the translation has been delayed due to a hw page table walk.
void updateMiscReg(ThreadContext *tc, ArmTranslationType tran_type)
bool haveLargeAsid64() const
Returns true if ASID is 16 bits in AArch64 (ARMv8)
virtual ContextID contextId() const =0
Fault getResultTe(TlbEntry **te, const RequestPtr &req, ThreadContext *tc, Mode mode, Translation *translation, bool timing, bool functional, TlbEntry *mergeTe, CachedState &state)
void init() override
Called at init time, this method is traversing the TLB hierarchy and pupulating the instruction/data/...
void setAttributes(bool lpae)
Addr purifyTaggedAddr(Addr vaddr_tainted, ThreadContext *tc, ExceptionLevel el, TCR tcr, bool is_inst, CachedState &state)
bool inAArch64(ThreadContext *tc)
ArmISA::TLB * getDTBPtr() const
@ CACHE_BLOCK_ZERO
This is a write that is targeted and zeroing an entire cache block.
Fault walk(const RequestPtr &req, ThreadContext *tc, uint16_t asid, vmid_t _vmid, bool hyp, BaseMMU::Mode mode, BaseMMU::Translation *_trans, bool timing, bool functional, bool secure, MMU::ArmTranslationType tran_type, bool stage2, const TlbEntry *walk_entry)
Fault testWalk(Addr pa, Addr size, Addr va, bool is_secure, Mode mode, TlbEntry::DomainType domain, LookupLevel lookup_level, bool stage2)
@ STRICT_ORDER
The request is required to be strictly ordered by CPU models and is non-speculative.
MMU(const ArmMMUParams &p)
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
statistics::Scalar permsFaults
TableWalker * itbStage2Walker
Fault translateFs(const RequestPtr &req, ThreadContext *tc, Mode mode, Translation *translation, bool &delay, bool timing, ArmTranslationType tran_type, bool functional, CachedState &state)
Cycles is a wrapper class for representing cycle counts, i.e.
Fault translateComplete(const RequestPtr &req, ThreadContext *tc, Translation *translation, Mode mode, ArmTranslationType tran_type, bool call_from_s2)
TableWalker * getTableWalker(BaseMMU::Mode mode, bool stage2) const
statistics::Scalar prefetchFaults
ThreadContext is the external interface to all thread state for anything outside of the CPU.
void setTestInterface(SimObject *ti)
virtual std::string name() const
std::shared_ptr< FaultBase > Fault
std::set< BaseTLB * > unified
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
static ExceptionLevel tranTypeEL(CPSR cpsr, ArmTranslationType type)
Determine the EL to use for the purpose of a translation given a specific translation type.
Fault translateSe(const RequestPtr &req, ThreadContext *tc, Mode mode, Translation *translation, bool &delay, bool timing, CachedState &state)
static bool hasUnprivRegime(ExceptionLevel el, bool e2h)
std::shared_ptr< Request > RequestPtr
Memoizer< int, ThreadContext *, bool, bool, TCR, ExceptionLevel > computeAddrTop
Fault translateAtomic(const RequestPtr &req, ThreadContext *tc, Mode mode) override
void drainResume() override
Resume execution after a successful drain.
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
Abstract superclass for simulation objects.
@ UNCACHEABLE
The request is to an uncacheable address.
static void decodeAddrOffset(Addr offset, uint8_t &func)
@ MISCREG_ID_AA64MMFR1_EL1
Fault translateMmuOff(ThreadContext *tc, const RequestPtr &req, Mode mode, ArmTranslationType tran_type, Addr vaddr, bool long_desc_format, CachedState &state)
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
void setVMID(vmid_t _vmid)
bool isSecure(ThreadContext *tc)
bool checkWalkCache() const
std::set< BaseTLB * > instruction
It is possible from the MMU to traverse the entire hierarchy of TLBs, starting from the DTB and ITB (...
ExceptionLevel currEL(const ThreadContext *tc)
Returns the current Exception Level (EL) of the provided ThreadContext.
bool faultPAN(ThreadContext *tc, uint8_t ap, const RequestPtr &req, Mode mode, const bool is_priv, CachedState &state)
virtual Process * getProcessPtr()=0
ArmISA::TLB * getITBPtr() const
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
TLB * getTlb(BaseMMU::Mode mode, bool stage2) const
void translateTiming(const RequestPtr &req, ThreadContext *tc, Translation *translation, Mode mode) override
bool IsSecureEL2Enabled(ThreadContext *tc)
Fault getTe(ThreadContext *tc, TlbEntry *destTe)
Fault testTranslation(const RequestPtr &req, Mode mode, TlbEntry::DomainType domain, CachedState &state)
TranslationGenPtr translateFunctional(Addr start, Addr size, ThreadContext *tc, Mode mode, Request::Flags flags) override
Returns a translation generator for a region of virtual addresses, instead of directly translating a ...
void setTableWalker(TableWalker *table_walker)
bool checkPAN(ThreadContext *tc, uint8_t ap, const RequestPtr &req, Mode mode, const bool is_priv, CachedState &state)
SelfDebug * getSelfDebug() const
static const RegId & hyp(unsigned index)
@ SECURE
The request targets the secure memory space.
vmid_t getVMID(ThreadContext *tc) const
Returns the current VMID (information stored in the VTTBR_EL2 register)
Fault checkPermissions(TlbEntry *te, const RequestPtr &req, Mode mode, bool stage2)
bool longDescFormatInUse(ThreadContext *tc)
virtual void annotate(AnnotationIDs id, uint64_t val)
CachedState & updateMiscReg(ThreadContext *tc, ArmTranslationType tran_type, bool stage2)
const ArmRelease * releaseFS() const
void setAttr(uint64_t attr)
Accessor functions for memory attributes for last accessed TLB entry.
int snsBankedIndex(MiscRegIndex reg, ThreadContext *tc)
void setLE(T v)
Set the value in the data pointer to v as little endian.
void takeOverFrom(BaseMMU *old_mmu) override
static bool haveEL(ThreadContext *tc, ArmISA::ExceptionLevel el)
Return true if the system implements a specific exception level.
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Fault translateMmuOn(ThreadContext *tc, const RequestPtr &req, Mode mode, Translation *translation, bool &delay, bool timing, bool functional, Addr vaddr, ArmFault::TranMethod tranMethod, CachedState &state)
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
int computeAddrTop(ThreadContext *tc, bool selbit, bool is_instr, TCR tcr, ExceptionLevel el)
const ArmRelease * _release
virtual void takeOverFrom(BaseMMU *old_mmu)
gem5::ArmISA::MMU::Stats stats
bool isCompleteTranslation(TlbEntry *te) const
virtual void finish(const Fault &fault, const RequestPtr &req, ThreadContext *tc, BaseMMU::Mode mode)=0
Stats(statistics::Group *parent)
bool HaveExt(ThreadContext *tc, ArmExtension ext)
Returns true if the provided ThreadContext supports the ArmExtension passed as a second argument.
statistics::Scalar alignFaults
TlbEntry * lookup(Addr vpn, uint16_t asn, vmid_t vmid, bool hyp, bool secure, bool functional, bool ignore_asn, ExceptionLevel target_el, bool in_host, bool stage2, BaseMMU::Mode mode)
Lookup an entry in the TLB.
std::set< BaseTLB * > data
static const RegId & abt(unsigned index)
#define panic(...)
This implements a cprintf based panic() function.
Fault checkPermissions64(TlbEntry *te, const RequestPtr &req, Mode mode, ThreadContext *tc, bool stage2)
std::pair< bool, bool > s1PermBits64(TlbEntry *te, const RequestPtr &req, Mode mode, ThreadContext *tc, CachedState &state, bool r, bool w, bool x)
Generated on Sun Jul 30 2023 01:56:49 for gem5 by doxygen 1.8.17