63c63,64
< TLB::TLB(const Params *p) : BaseTLB(p), configAddress(0), size(p->size)
---
> TLB::TLB(const Params *p) : BaseTLB(p), configAddress(0), size(p->size),
> lruSeq(0)
64a66,67
> if (!size)
> fatal("TLBs must have a non-zero size.\n");
68c71,72
< for (int x = 0; x < size; x++)
---
> for (int x = 0; x < size; x++) {
> tlb[x].trieHandle = NULL;
69a74
> }
74a80,97
> void
> TLB::evictLRU()
> {
> // Find the entry with the lowest (and hence least recently updated)
> // sequence number.
>
> unsigned lru = 0;
> for (unsigned i = 1; i < size; i++) {
> if (tlb[i].lruSeq < tlb[lru].lruSeq)
> lru = i;
> }
>
> assert(tlb[lru].trieHandle);
> trie.remove(tlb[lru].trieHandle);
> tlb[lru].trieHandle = NULL;
> freeList.push_back(&tlb[lru]);
> }
>
81,87c104,108
< if (!freeList.empty()) {
< newEntry = freeList.front();
< freeList.pop_front();
< } else {
< newEntry = entryList.back();
< entryList.pop_back();
< }
---
> if (freeList.empty())
> evictLRU();
> newEntry = freeList.front();
> freeList.pop_front();
>
88a110
> newEntry->lruSeq = nextSeq();
90c112,113
< entryList.push_front(newEntry);
---
> newEntry->trieHandle =
> trie.insert(vpn, TlbEntryTrie::MaxBits - entry.logBytes, newEntry);
94,113d116
< TLB::EntryList::iterator
< TLB::lookupIt(Addr va, bool update_lru)
< {
< //TODO make this smarter at some point
< EntryList::iterator entry;
< for (entry = entryList.begin(); entry != entryList.end(); entry++) {
< if ((*entry)->vaddr <= va && (*entry)->vaddr + (*entry)->size > va) {
< DPRINTF(TLB, "Matched vaddr %#x to entry starting at %#x "
< "with size %#x.\n", va, (*entry)->vaddr, (*entry)->size);
< if (update_lru) {
< entryList.push_front(*entry);
< entryList.erase(entry);
< entry = entryList.begin();
< }
< break;
< }
< }
< return entry;
< }
<
117,121c120,123
< EntryList::iterator entry = lookupIt(va, update_lru);
< if (entry == entryList.end())
< return NULL;
< else
< return *entry;
---
> TlbEntry *entry = trie.lookup(va);
> if (entry && update_lru)
> entry->lruSeq = nextSeq();
> return entry;
128,131c130,135
< while (!entryList.empty()) {
< TlbEntry *entry = entryList.front();
< entryList.pop_front();
< freeList.push_back(entry);
---
> for (unsigned i = 0; i < size; i++) {
> if (tlb[i].trieHandle) {
> trie.remove(tlb[i].trieHandle);
> tlb[i].trieHandle = NULL;
> freeList.push_back(&tlb[i]);
> }
145,151c149,153
< EntryList::iterator entryIt;
< for (entryIt = entryList.begin(); entryIt != entryList.end();) {
< if (!(*entryIt)->global) {
< freeList.push_back(*entryIt);
< entryList.erase(entryIt++);
< } else {
< entryIt++;
---
> for (unsigned i = 0; i < size; i++) {
> if (tlb[i].trieHandle && !tlb[i].global) {
> trie.remove(tlb[i].trieHandle);
> tlb[i].trieHandle = NULL;
> freeList.push_back(&tlb[i]);
159,162c161,165
< EntryList::iterator entry = lookupIt(va, false);
< if (entry != entryList.end()) {
< freeList.push_back(*entry);
< entryList.erase(entry);
---
> TlbEntry *entry = trie.lookup(va);
> if (entry) {
> trie.remove(entry->trieHandle);
> entry->trieHandle = NULL;
> freeList.push_back(entry);
348c351
< Addr paddr = entry->paddr | (vaddr & (entry->size-1));
---
> Addr paddr = entry->paddr | (vaddr & mask(entry->logBytes));