47 #include "debug/TLB.hh" 60 bool uncacheBit39 =
false;
61 bool uncacheBit40 =
false;
64 #define MODE2MASK(X) (1 << (X)) 67 :
BaseTLB(p), table(p->size), nlu(0)
92 .
desc(
"ITB accesses");
98 .
desc(
"DTB read hits")
103 .
desc(
"DTB read misses")
108 .
desc(
"DTB read access violations")
113 .
desc(
"DTB read accesses")
118 .
desc(
"DTB write hits")
123 .
desc(
"DTB write misses")
128 .
desc(
"DTB write access violations")
133 .
desc(
"DTB write accesses")
148 .
desc(
"DTB access violations")
153 .
desc(
"DTB accesses")
183 if (retval == NULL) {
186 while (i->first == vpn) {
187 int index = i->second;
189 assert(entry->
valid);
190 if (vpn == entry->
tag && (entry->
asma || entry->
asn == asn)) {
200 DPRINTF(
TLB,
"lookup %#x, asn %#x -> %s ppn %#x\n", vpn, (
int)asn,
201 retval ?
"hit" :
"miss", retval ? retval->
ppn : 0);
224 return std::make_shared<UnimpFault>(
225 "IPR memory space not implemented!");
237 if (req->isUncacheable() && itb)
238 return std::make_shared<UnimpFault>(
239 "CPU trying to fetch from uncached I/O");
257 panic(
"TLB entry not found in lookupTable");
260 while ((index = i->second) !=
nlu) {
261 if (
table[index].tag != oldvpn)
262 panic(
"TLB entry not found in lookupTable");
276 table[
nlu].valid =
true;
299 int index = i->second;
301 assert(entry->
valid);
305 PageTable::iterator cur =
i;
309 DPRINTF(
TLB,
"flush @%d: %#x -> %#x\n", index,
311 entry->
valid =
false;
328 int index = i->second;
330 assert(entry->
valid);
332 if (vaddr.
vpn() == entry->
tag && (entry->
asma || entry->
asn == asn)) {
333 DPRINTF(
TLB,
"flushaddr @%d: %#x -> %#x\n", index, vaddr.
vpn(),
337 entry->
valid =
false;
350 const unsigned size(
table.size());
354 for (
int i = 0;
i < size;
i++)
366 for (
int i = 0;
i < size;
i++) {
381 if (
PcPAL(req->getPC())) {
389 req->setPaddr(req->getVaddr());
394 return std::make_shared<ItbAcvFault>(req->getVaddr());
405 return std::make_shared<ItbAcvFault>(req->getVaddr());
412 req->setPaddr(req->getPaddr() |
ULL(0xf0000000000));
414 req->setPaddr(req->getPaddr() &
ULL(0xffffffffff));
423 return std::make_shared<ItbPageFault>(req->getVaddr());
426 req->setPaddr((entry->ppn <<
PageShift) +
435 return std::make_shared<ItbAcvFault>(req->getVaddr());
444 return std::make_shared<MachineCheckFault>();
460 if (req->getVaddr() & (req->getSize() - 1)) {
461 DPRINTF(
TLB,
"Alignment Fault on %#x, size = %d\n", req->getVaddr(),
464 return std::make_shared<DtbAlignmentFault>(req->getVaddr(),
469 if (
PcPAL(req->getPC())) {
477 req->setPaddr(req->getVaddr());
485 return std::make_shared<DtbPageFault>(req->getVaddr(),
499 return std::make_shared<DtbAcvFault>(req->getVaddr(),
508 req->setPaddr(req->getPaddr() |
ULL(0xf0000000000));
510 req->setPaddr(req->getPaddr() &
ULL(0xffffffffff));
528 (
Fault)(std::make_shared<PDtbMissFault>(req->getVaddr(),
531 (
Fault)(std::make_shared<NDtbMissFault>(req->getVaddr(),
536 req->setPaddr((entry->ppn <<
PageShift) +
546 return std::make_shared<DtbPageFault>(req->getVaddr(),
553 return std::make_shared<DtbPageFault>(req->getVaddr(),
562 return std::make_shared<DtbAcvFault>(req->getVaddr(),
569 return std::make_shared<DtbPageFault>(req->getVaddr(),
584 return std::make_shared<MachineCheckFault>();
628 AlphaTLBParams::create()
const uint64_t MM_STAT_WR_MASK
#define panic(...)
This implements a cprintf based panic() function.
Fault translateData(const RequestPtr &req, ThreadContext *tc, bool write)
The request is to an uncacheable address.
int DTB_ASN_ASN(uint64_t reg)
decltype(nullptr) constexpr NoFault
void serializeSection(CheckpointOut &cp, const char *name) const
Serialize an object into a new section.
Stats::Formula fetch_accesses
static const ArchFlagsType ALTMODE
Use the alternate mode bits in ALPHA.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
std::shared_ptr< Request > RequestPtr
static Fault checkCacheability(const RequestPtr &req, bool itb=false)
const Addr PAddrUncachedBit40
Stats::Formula data_misses
The request is required to be strictly ordered by CPU models and is non-speculative.
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
virtual void regStats()
Callback to set stat parameters.
Overload hash function for BasicBlockRange type.
const uint64_t MM_STAT_BAD_VA_MASK
uint64_t ALT_MODE_AM(uint64_t reg)
const uint64_t MM_STAT_DTB_MISS_MASK
bool PAddrIprSpace(Addr a)
std::vector< TlbEntry > table
TlbEntry & index(bool advance=true)
ThreadContext is the external interface to all thread state for anything outside of the CPU...
void translateTiming(const RequestPtr &req, ThreadContext *tc, Translation *translation, Mode mode) override
Addr VAddrSpaceEV6(Addr a)
Stats::Scalar write_misses
Stats::Scalar fetch_misses
#define UNSERIALIZE_SCALAR(scalar)
uint64_t DTB_CM_CM(uint64_t reg)
std::string csprintf(const char *format, const Args &...args)
void flushAll() override
Remove all entries from the TLB.
void serialize(CheckpointOut &cp) const override
Serialize an object.
virtual void finish(const Fault &fault, const RequestPtr &req, ThreadContext *tc, Mode mode)=0
static const ArchFlagsType VPTE
The request is an ALPHA VPTE pal access (hw_ld).
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Declaration of IniFile object.
#define ULL(N)
uint64_t constant
virtual const std::string name() const
Fault finalizePhysical(const RequestPtr &req, ThreadContext *tc, Mode mode) const override
Do post-translation physical address finalization.
TlbEntry * updateCache(TlbEntry *entry)
Stats::Scalar read_accesses
void flushAddr(Addr addr, uint8_t asn)
#define SERIALIZE_SCALAR(scalar)
Stats::Scalar write_accesses
Derived & name(const std::string &name)
Set the name and marks this stat to print at the end of simulation.
const uint64_t MM_STAT_FONW_MASK
const Addr PAddrUncachedBit43
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
static bool validVirtualAddress(Addr vaddr)
std::ostream CheckpointOut
TlbEntry * lookup(Addr vpn, uint8_t asn)
Stats::Scalar read_misses
void insert(Addr vaddr, TlbEntry &entry)
Fault translateInst(const RequestPtr &req, ThreadContext *tc)
const uint64_t MM_STAT_ACV_MASK
const Addr PAddrUncachedMask
Stats::Formula data_accesses
Fault translateAtomic(const RequestPtr &req, ThreadContext *tc, Mode mode) override
Derived & desc(const std::string &_desc)
Set the description and marks this stat to print at the end of simulation.
uint64_t ICM_CM(uint64_t reg)
The virtual address is also the physical address.
std::shared_ptr< FaultBase > Fault
const uint64_t MM_STAT_FONR_MASK
void regStats() override
Callback to set stat parameters.