Go to the documentation of this file.
61 #include "debug/Checkpoint.hh"
62 #include "debug/TLB.hh"
63 #include "debug/TLBVerbose.hh"
67 #include "params/ArmTLB.hh"
75 TLB::TLB(
const ArmTLBParams *
p)
77 isStage2(
p->is_stage2), stage2Req(false), stage2DescReq(false), _attr(0),
78 directToStage2(false), tableWalker(
p->walker), stage2Tlb(NULL),
79 stage2Mmu(NULL),
test(nullptr), stats(this), rangeMRU(1),
81 isHyp(false),
asid(0), vmid(0), hcr(0), dacr(0),
82 miscRegValid(false), miscRegContext(0), curTranType(NormalTran)
138 const Addr paddr = req->getPaddr();
143 req->setLocalAccessor(
147 PseudoInst::pseudoInst<PseudoInstABI>(tc, func, ret);
168 while (retval == NULL &&
x <
size) {
169 if ((!ignore_asn &&
table[
x].match(
va, asn,
vmid, hyp, secure,
false,
170 target_el, in_host)) ||
171 (ignore_asn &&
table[
x].match(
va,
vmid, hyp, secure, target_el,
177 for (
int i =
x;
i > 0;
i--)
179 table[0] = tmp_entry;
189 DPRINTF(TLBVerbose,
"Lookup %#x, asn %#x -> %s vmn 0x%x hyp %d secure %d "
190 "ppn %#x size: %#x pa: %#x ap:%d ns:%d nstid:%d g:%d asid: %d "
192 va, asn, retval ?
"hit" :
"miss",
vmid, hyp, secure,
193 retval ? retval->
pfn : 0, retval ? retval->
size : 0,
194 retval ? retval->
pAddr(
va) : 0, retval ? retval->
ap : 0,
195 retval ? retval->
ns : 0, retval ? retval->
nstid : 0,
196 retval ? retval->
global : 0, retval ? retval->
asid : 0,
197 retval ? retval->
el : 0);
206 DPRINTF(
TLB,
"Inserting entry into TLB with pfn:%#x size:%#x vpn: %#x"
207 " asid:%d vmid:%d N:%d global:%d valid:%d nc:%d xn:%d"
208 " ap:%#x domain:%#x ns:%d nstid:%d isHyp:%d\n", entry.
pfn,
215 DPRINTF(
TLB,
" - Replacing Valid entry %#x, asn %d vmn %d ppn %#x "
216 "size: %#x ap:%d ns:%d nstid:%d g:%d isHyp:%d el: %d\n",
225 for (
int i =
size - 1;
i > 0; --
i)
249 bool ignore_el,
bool in_host)
251 DPRINTF(
TLB,
"Flushing all TLB entries (%s lookup)\n",
252 (secure_lookup ?
"secure" :
"non-secure"));
257 const bool el_match = ignore_el ?
258 true :
te->checkELMatch(target_el, in_host);
259 if (
te->valid && secure_lookup == !
te->nstid &&
260 (
te->vmid ==
vmid || secure_lookup) && el_match) {
281 bool hyp = target_el ==
EL2;
283 DPRINTF(
TLB,
"Flushing all NS TLB entries (%s lookup)\n",
284 (hyp ?
"hyp" :
"non-hyp"));
289 const bool el_match = ignore_el ?
290 true :
te->checkELMatch(target_el,
false);
292 if (
te->valid &&
te->nstid &&
te->isHyp == hyp && el_match) {
313 DPRINTF(
TLB,
"Flushing TLB entries with mva: %#x, asid: %#x "
314 "(%s lookup)\n", mva, asn, (secure_lookup ?
315 "secure" :
"non-secure"));
316 _flushMva(mva, asn, secure_lookup,
false, target_el, in_host);
324 DPRINTF(
TLB,
"Flushing TLB entries with asid: %#x (%s lookup)\n", asn,
325 (secure_lookup ?
"secure" :
"non-secure"));
332 if (
te->valid &&
te->asid == asn && secure_lookup == !
te->nstid &&
333 (
te->vmid ==
vmid || secure_lookup) &&
334 te->checkELMatch(target_el, in_host)) {
349 DPRINTF(
TLB,
"Flushing TLB entries with mva: %#x (%s lookup)\n", mva,
350 (secure_lookup ?
"secure" :
"non-secure"));
351 _flushMva(mva, 0xbeef, secure_lookup,
true, target_el, in_host);
363 bool hyp = target_el ==
EL2;
365 te =
lookup(mva, asn,
vmid, hyp, secure_lookup,
false, ignore_asn,
368 if (secure_lookup == !
te->nstid) {
373 te =
lookup(mva, asn,
vmid, hyp, secure_lookup,
false, ignore_asn,
396 TLB *otlb =
dynamic_cast<TLB*
>(_otlb);
413 panic(
"Incompatible TLB type!");
418 :
Stats::Group(parent),
420 ADD_STAT(instMisses,
"ITB inst misses"),
421 ADD_STAT(readHits,
"DTB read hits"),
422 ADD_STAT(readMisses,
"DTB read misses"),
423 ADD_STAT(writeHits,
"DTB write hits"),
424 ADD_STAT(writeMisses,
"DTB write misses"),
425 ADD_STAT(inserts,
"Number of times an entry is inserted into the TLB"),
426 ADD_STAT(flushTlb,
"Number of times complete TLB was flushed"),
427 ADD_STAT(flushTlbMva,
"Number of times TLB was flushed by MVA"),
428 ADD_STAT(flushTlbMvaAsid,
"Number of times TLB was flushed by MVA & ASID"),
429 ADD_STAT(flushTlbAsid,
"Number of times TLB was flushed by ASID"),
430 ADD_STAT(flushedEntries,
"Number of entries that have been flushed"
432 ADD_STAT(alignFaults,
"Number of TLB faults due to alignment"
434 ADD_STAT(prefetchFaults,
"Number of TLB faults due to prefetch"),
435 ADD_STAT(domainFaults,
"Number of TLB faults due to domain restrictions"),
436 ADD_STAT(permsFaults,
"Number of TLB faults due to permissions"
438 ADD_STAT(readAccesses,
"DTB read accesses", readHits + readMisses),
439 ADD_STAT(writeAccesses,
"DTB write accesses", writeHits + writeMisses),
440 ADD_STAT(instAccesses,
"ITB inst accesses", instHits + instMisses),
441 ADD_STAT(hits,
"Total TLB (inst and data) hits",
442 readHits + writeHits + instHits),
443 ADD_STAT(misses,
"Total TLB (inst and data) misses",
444 readMisses + writeMisses + instMisses),
445 ADD_STAT(accesses,
"Total TLB (inst and data) accesses",
446 readAccesses + writeAccesses + instAccesses)
458 Translation *translation,
bool &delay,
bool timing)
461 Addr vaddr_tainted = req->getVaddr();
467 vaddr = vaddr_tainted;
477 return std::make_shared<DataAbort>(
489 if (!
p->pTable->translate(
vaddr, paddr))
490 return std::make_shared<GenericPageTableFault>(vaddr_tainted);
491 req->setPaddr(paddr);
501 if (req->isCacheMaintenance()) {
521 return std::make_shared<DataAbort>(
533 return std::make_shared<DataAbort>(
541 if (
te->nonCacheable) {
543 if (req->isPrefetch()) {
546 return std::make_shared<PrefetchAbort>(
552 if (!
te->longDescFormat) {
553 switch ((
dacr >> (
static_cast<uint8_t
>(
te->domain) * 2)) & 0x3) {
556 DPRINTF(
TLB,
"TLB Fault: Data abort on domain. DACR: %#x"
557 " domain: %#x write:%d\n",
dacr,
558 static_cast<uint8_t
>(
te->domain), is_write);
563 return std::make_shared<PrefetchAbort>(
568 return std::make_shared<DataAbort>(
576 panic(
"UNPRED domain\n");
583 uint8_t ap =
te->longDescFormat ?
te->ap << 1 :
te->ap;
584 uint8_t hap =
te->hap;
586 if (
sctlr.afe == 1 ||
te->longDescFormat)
590 bool isWritable =
true;
599 DPRINTF(
TLB,
"Access permissions 0, checking rs:%#x\n",
602 switch ((
int)
sctlr.rs) {
607 abt = is_write || !is_priv;
623 abt = !is_priv && is_write;
624 isWritable = is_priv;
630 panic(
"UNPRED premissions\n");
632 abt = !is_priv || is_write;
641 panic(
"Unknown permissions %#x\n", ap);
645 bool hapAbt = is_write ? !(hap & 2) : !(hap & 1);
646 bool xn =
te->xn || (isWritable &&
sctlr.wxn) ||
647 (ap == 3 &&
sctlr.uwxn && is_priv);
648 if (is_fetch && (abt || xn ||
649 (
te->longDescFormat &&
te->pxn && is_priv) ||
652 DPRINTF(
TLB,
"TLB Fault: Prefetch abort on permission check. AP:%d "
653 "priv:%d write:%d ns:%d sif:%d sctlr.afe: %d \n",
654 ap, is_priv, is_write,
te->ns,
scr.sif,
sctlr.afe);
657 return std::make_shared<PrefetchAbort>(
661 }
else if (abt | hapAbt) {
663 DPRINTF(
TLB,
"TLB Fault: Data abort on permission check. AP:%d priv:%d"
664 " write:%d\n", ap, is_priv, is_write);
665 return std::make_shared<DataAbort>(
689 Addr vaddr_tainted = req->getVaddr();
696 bool is_write = !req->isCacheClean() &&
mode ==
Write;
697 bool is_atomic = req->isAtomic();
708 return std::make_shared<DataAbort>(
709 vaddr_tainted,
te->domain, is_write,
720 return std::make_shared<DataAbort>(
723 is_atomic ?
false : is_write,
730 if (
te->nonCacheable) {
732 if (req->isPrefetch()) {
735 return std::make_shared<PrefetchAbort>(
742 uint8_t ap = 0x3 & (
te->ap);
747 uint8_t pxn =
te->pxn;
748 bool r = (!is_write && !is_fetch);
759 bool grant_read =
true;
760 DPRINTF(TLBVerbose,
"Checking permissions: ap:%d, xn:%d, pxn:%d, r:%d, "
761 "w:%d, x:%d, is_priv: %d, wxn: %d\n", ap, xn,
762 pxn,
r,
w,
x, is_priv,
wxn);
769 uint8_t hap = 0x3 &
te->hap;
770 grant_read = hap & 0x1;
774 }
else if (is_atomic) {
777 }
else if (is_write) {
786 grant_read = ap & 0x1;
787 uint8_t
perm = (ap << 2) | (xn << 1) | pxn;
797 grant =
r ||
w || (
x && !
wxn);
824 uint8_t
perm = (ap << 2) | (xn << 1) | pxn;
828 grant =
r ||
w || (
x && !
wxn);
866 uint8_t
perm = (ap & 0x2) | xn;
869 grant =
r ||
w || (
x && !
wxn);
891 DPRINTF(
TLB,
"TLB Fault: Prefetch abort on permission check. "
892 "AP:%d priv:%d write:%d ns:%d sif:%d "
894 ap, is_priv, is_write,
te->ns,
scr.sif,
sctlr.afe);
897 return std::make_shared<PrefetchAbort>(
903 DPRINTF(
TLB,
"TLB Fault: Data abort on permission check. AP:%d "
904 "priv:%d write:%d\n", ap, is_priv, is_write);
905 return std::make_shared<DataAbort>(
906 vaddr_tainted,
te->domain,
907 (is_atomic && !grant_read) ?
false : is_write,
928 (!req->isCacheMaintenance() ||
941 bool is_atomic = req->isAtomic();
942 req->setPaddr(
vaddr);
956 f = std::make_shared<PrefetchAbort>(
vaddr,
959 f = std::make_shared<DataAbort>(
vaddr,
968 if (long_desc_format ||
sctlr.tre == 0 ||
nmrr.ir0 == 0 ||
970 if (!req->isCacheMaintenance()) {
980 &&
hcr.e2h == 1 &&
hcr.tge == 1) ? 0:
hcr.dc;
987 temp_te.
innerAttrs = i_cacheability? 0x2: 0x0;
988 temp_te.
outerAttrs = i_cacheability? 0x2: 0x0;
999 DPRINTF(TLBVerbose,
"(No MMU) setting memory attributes: shareable: "
1000 "%d, innerAttrs: %d, outerAttrs: %d, isStage2: %d\n",
1010 Translation *translation,
bool &delay,
bool timing,
1019 Addr vaddr_tainted = req->getVaddr();
1022 functional, &mergeTe);
1024 if ((
te == NULL) && (fault ==
NoFault)) delay =
true;
1031 "Setting memory attributes: shareable: %d, innerAttrs: %d, "
1032 "outerAttrs: %d, mtype: %d, isStage2: %d\n",
1033 te->shareable,
te->innerAttrs,
te->outerAttrs,
1037 if (
te->nonCacheable && !req->isCacheMaintenance())
1052 if (!is_fetch && fault ==
NoFault &&
1059 return std::make_shared<DataAbort>(
1082 Translation *translation,
bool &delay,
bool timing,
1086 assert(!(timing && functional));
1090 Addr vaddr_tainted = req->getVaddr();
1096 vaddr = vaddr_tainted;
1106 "CPSR is priv:%d UserMode:%d secure:%d S1S2NsTran:%d\n",
1109 DPRINTF(
TLB,
"translateFs addr %#x, mode %d, st2 %d, scr %#x sctlr %#x "
1110 "flags %#lx tranType 0x%x\n", vaddr_tainted,
mode,
isStage2,
1113 if ((req->isInstFetch() && (!
sctlr.i)) ||
1114 ((!req->isInstFetch()) && (!
sctlr.c))){
1115 if (!req->isCacheMaintenance()) {
1124 return std::make_shared<DataAbort>(
1136 else if (
hcr.dc == 1)
1145 DPRINTF(TLBVerbose,
"Translating %s=%#x context=%d\n",
1149 functional,
vaddr, tranMethod);
1155 if (
sd->enabled() && fault ==
NoFault) {
1156 fault =
sd->testDebug(tc, req,
mode);
1197 fault =
translateFs(req, tc,
mode, NULL, delay,
false, tranType,
true);
1216 assert(translation);
1229 fault =
translateFs(req, tc,
mode, translation, delay,
true, tranType);
1232 DPRINTF(TLBVerbose,
"Translation returning delay=%d fault=%d\n", delay, fault !=
1241 if (translation && (callFromS2 || !
stage2Req || req->hasPaddr() ||
1268 DPRINTF(TLBVerbose,
"TLB variables changed!\n");
1289 uint64_t ttbr_asid =
ttbcr.a1 ?
1298 uint64_t ttbr_asid =
ttbcr.a1 ?
1310 uint64_t ttbr_asid =
ttbcr.a1 ?
1322 uint64_t ttbr_asid =
ttbcr.a1 ?
1393 asid = context_id.asid;
1458 panic(
"Unknown translation mode!\n");
1464 Translation *translation,
bool timing,
bool functional,
1475 Addr vaddr_tainted = req->getVaddr();
1482 vaddr = vaddr_tainted;
1487 if (req->isPrefetch()) {
1492 return std::make_shared<PrefetchAbort>(
1505 DPRINTF(
TLB,
"TLB Miss: Starting hardware table walker for %#x(%d:%d)\n",
1509 translation, timing, functional, is_secure,
1512 if (timing || fault !=
NoFault) {
1535 Translation *translation,
bool timing,
bool functional,
1545 fault =
getTE(&s2Te, req, tc,
mode, translation, timing, functional,
1548 if ((s2Te != NULL) && (fault ==
NoFault)) {
1560 Addr vaddr_tainted = req->getVaddr();
1563 fault =
getTE(&s1Te, req, tc,
mode, translation, timing, functional,
1566 if ((s1Te != NULL) && (fault ==
NoFault)) {
1576 fault = s2Lookup->
getTe(tc, mergeTe);
1591 DPRINTF(TLBVerbose,
"s2TLB: reqVa %#x, reqPa %#x, fault %p\n",
1592 vaddr_tainted, req->hasPaddr() ? req->getPaddr() : ~0, fault);
1612 fatal_if(!
ti,
"%s is not a valid ARM TLB tester\n", _ti->
name());
1621 if (!
test || !req->hasSize() || req->getSize() == 0 ||
1622 req->isCacheMaintenance()) {
1643 ArmTLBParams::create()
void flushIpaVmid(Addr ipa, bool secure_lookup, ExceptionLevel target_el)
Invalidate all entries in the stage 2 TLB that match the given ipa and the current VMID.
virtual void finish(const Fault &fault, const RequestPtr &req, ThreadContext *tc, Mode mode)=0
Fault walk(const RequestPtr &req, ThreadContext *tc, uint16_t asid, uint8_t _vmid, bool _isHyp, TLB::Mode mode, TLB::Translation *_trans, bool timing, bool functional, bool secure, TLB::ArmTranslationType tranType, bool _stage2Req)
void flushAllSecurity(bool secure_lookup, ExceptionLevel target_el, bool ignore_el=false, bool in_host=false)
Reset the entire TLB.
int computeAddrTop(ThreadContext *tc, bool selbit, bool isInstr, TCR tcr, ExceptionLevel el)
void setTestInterface(SimObject *ti)
bool HaveVirtHostExt(ThreadContext *tc)
Fault translateFs(const RequestPtr &req, ThreadContext *tc, Mode mode, Translation *translation, bool &delay, bool timing, ArmTranslationType tranType, bool functional=false)
TlbEntry * lookup(Addr vpn, uint16_t asn, uint8_t vmid, bool hyp, bool secure, bool functional, bool ignore_asn, ExceptionLevel target_el, bool in_host)
Lookup an entry in the TLB.
Fault translateSe(const RequestPtr &req, ThreadContext *tc, Mode mode, Translation *translation, bool &delay, bool timing)
Fault translateMmuOn(ThreadContext *tc, const RequestPtr &req, Mode mode, Translation *translation, bool &delay, bool timing, bool functional, Addr vaddr, ArmFault::TranMethod tranMethod)
Fault finalizePhysical(const RequestPtr &req, ThreadContext *tc, Mode mode) const override
Do post-translation physical address finalization.
const AddrRange & m5opRange() const
Range used by memory-mapped m5 pseudo-ops if enabled.
int snsBankedIndex(MiscRegIndex reg, ThreadContext *tc)
Stats::Scalar prefetchFaults
Stats::Scalar flushTlbAsid
Stats::Scalar domainFaults
static ExceptionLevel currEL(const ThreadContext *tc)
bool haveLargeAsid64() const
ProbePointArg generates a point for the class of Arg.
Stats::Scalar writeMisses
void setAttr(uint64_t attr)
Accessor functions for memory attributes for last accessed TLB entry.
void drainResume() override
Resume execution after a successful drain.
bool contains(const Addr &a) const
Determine if the range contains an address.
std::shared_ptr< Request > RequestPtr
ArmISA::TLB::TlbStats stats
static void decodeAddrOffset(Addr offset, uint8_t &func)
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
virtual Process * getProcessPtr()=0
Stats::Scalar flushTlbMva
Stats::Scalar permsFaults
bool haveVirtualization() const
Returns true if this system implements the virtualization Extensions.
bool ELIs64(ThreadContext *tc, ExceptionLevel el)
void _flushMva(Addr mva, uint64_t asn, bool secure_lookup, bool ignore_asn, ExceptionLevel target_el, bool in_host)
Remove any entries that match both a va and asn.
bool IsSecureEL2Enabled(ThreadContext *tc)
Fault translateMmuOff(ThreadContext *tc, const RequestPtr &req, Mode mode, TLB::ArmTranslationType tranType, Addr vaddr, bool long_desc_format)
Fault checkPermissions64(TlbEntry *te, const RequestPtr &req, Mode mode, ThreadContext *tc)
void regProbePoints() override
Register probe points for this object.
@ STRICT_ORDER
The request is required to be strictly ordered by CPU models and is non-speculative.
ArmTranslationType curTranType
virtual void annotate(AnnotationIDs id, uint64_t val)
@ CACHE_BLOCK_ZERO
This is a write that is targeted and zeroing an entire cache block.
TlbStats(Stats::Group *parent)
@ SECURE
The request targets the secure memory space.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
DmaPort & getDMAPort()
Get the port that ultimately belongs to the stage-two MMU, but is used by the two table walkers,...
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
std::shared_ptr< FaultBase > Fault
void flushMva(Addr mva, bool secure_lookup, ExceptionLevel target_el, bool in_host=false)
Remove all entries that match the va regardless of asn.
const unsigned MaxPhysAddrRange
@ MISCREG_ID_AA64MMFR1_EL1
Ports are used to interface objects to each other.
Fault checkPermissions(TlbEntry *te, const RequestPtr &req, Mode mode)
virtual ContextID contextId() const =0
static ExceptionLevel tranTypeEL(CPSR cpsr, ArmTranslationType type)
Determine the EL to use for the purpose of a translation given a specific translation type.
Addr pAddr(Addr va) const
bool haveVirtualization() const
@ UNCACHEABLE
The request is to an uncacheable address.
void setAttributes(bool lpae)
Stats::Scalar flushedEntries
bool longDescFormatInUse(ThreadContext *tc)
constexpr decltype(nullptr) NoFault
bool checkPAN(ThreadContext *tc, uint8_t ap, const RequestPtr &req, Mode mode)
Fault testWalk(Addr pa, Addr size, Addr va, bool is_secure, Mode mode, TlbEntry::DomainType domain, LookupLevel lookup_level)
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
TableWalker * tableWalker
Addr purifyTaggedAddr(Addr addr, ThreadContext *tc, ExceptionLevel el, TCR tcr, bool isInstr)
Removes the tag from tagged addresses if that mode is enabled.
void flushAsid(uint64_t asn, bool secure_lookup, ExceptionLevel target_el, bool in_host=false)
Remove any entries that match the asn.
Fault getTe(ThreadContext *tc, TlbEntry *destTe)
ProbeManager * getProbeManager()
Get the probe manager for this object.
void updateMiscReg(ThreadContext *tc, ArmTranslationType tranType=NormalTran)
void flushMvaAsid(Addr mva, uint64_t asn, bool secure_lookup, ExceptionLevel target_el, bool in_host=false)
Remove any entries that match both a va and asn.
SelfDebug * getSelfDebug() const
virtual const std::string name() const
void setMMU(Stage2MMU *m, RequestorID requestor_id)
virtual void markDelayed()=0
Signal that the translation has been delayed due to a hw page table walk.
void flushAllNs(ExceptionLevel target_el, bool ignore_el=false)
Remove all entries in the non secure world, depending on whether they were allocated in hyp mode or n...
Addr start() const
Get the start address of the range.
Overload hash function for BasicBlockRange type.
void init() override
setup all the back pointers
ProbePoints::PMUUPtr ppRefills
PMU probe for TLB refills.
void takeOverFrom(BaseTLB *otlb) override
Take over from an old tlb context.
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
virtual RegVal readMiscReg(RegIndex misc_reg)=0
static bool haveEL(ThreadContext *tc, ArmISA::ExceptionLevel el)
Return true if the system implements a specific exception level.
Cycles is a wrapper class for representing cycle counts, i.e.
void setLE(T v)
Set the value in the data pointer to v as little endian.
Fault translateAtomic(const RequestPtr &req, ThreadContext *tc, Mode mode, ArmTranslationType tranType)
Port * getTableWalkerPort() override
Get the table walker port.
Fault testTranslation(const RequestPtr &req, Mode mode, TlbEntry::DomainType domain)
Fault getTE(TlbEntry **te, const RequestPtr &req, ThreadContext *tc, Mode mode, Translation *translation, bool timing, bool functional, bool is_secure, ArmTranslationType tranType)
Fault getResultTe(TlbEntry **te, const RequestPtr &req, ThreadContext *tc, Mode mode, Translation *translation, bool timing, bool functional, TlbEntry *mergeTe)
void setMMU(Stage2MMU *m, RequestorID requestor_id)
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Stats::Scalar alignFaults
Stats::Scalar flushTlbMvaAsid
bool translateFunctional(ThreadContext *tc, Addr vaddr, Addr &paddr)
Do a functional lookup on the TLB (for debugging) and don't modify any internal state.
Fault translateComplete(const RequestPtr &req, ThreadContext *tc, Translation *translation, Mode mode, ArmTranslationType tranType, bool callFromS2)
void translateTiming(const RequestPtr &req, ThreadContext *tc, Translation *translation, Mode mode, ArmTranslationType tranType)
bool isSecure(ThreadContext *tc)
#define panic(...)
This implements a cprintf based panic() function.
T bits(T val, int first, int last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
void insert(Addr vaddr, TlbEntry &pte)
Abstract superclass for simulation objects.
Generated on Wed Sep 30 2020 14:01:59 for gem5 by doxygen 1.8.17