48c48,49
< : SimObject(name), size(s), usedEntries(0), cacheValid(false)
---
> : SimObject(name), size(s), usedEntries(0), lastReplaced(0),
> cacheValid(false)
55a57,59
>
> for (int x = 0; x < size; x++)
> freeList.push_back(&tlb[x]);
62c66
< for (i = lookupTable.begin(); i != lookupTable.end();) {
---
> for (i = lookupTable.begin(); i != lookupTable.end(); i++) {
79a84
> TlbRange tr;
82a88,92
> tr.va = va;
> tr.size = PTE.size() - 1;
> tr.contextId = context_id;
> tr.partitionId = partition_id;
> tr.real = real;
84,85d93
< DPRINTF(TLB, "TLB: Inserting TLB Entry; va=%#x pa=%#x pid=%d cid=%d r=%d\n",
< va, PTE.paddr(), partition_id, context_id, (int)real);
86a95,112
> DPRINTF(TLB, "TLB: Inserting TLB Entry; va=%#x pa=%#x pid=%d cid=%d r=%d entryid=%d\n",
> va, PTE.paddr(), partition_id, context_id, (int)real, entry);
>
> // Demap any entry that conflicts
> i = lookupTable.find(tr);
> if (i != lookupTable.end()) {
> i->second->valid = false;
> if (i->second->used) {
> i->second->used = false;
> usedEntries--;
> }
> freeList.push_front(i->second);
> DPRINTF(TLB, "TLB: Found conflicting entry %#X , deleting it\n",
> i->second);
> lookupTable.erase(i);
> }
>
>
90a117,132
> if (!freeList.empty()) {
> new_entry = freeList.front();
> } else {
> x = lastReplaced;
> do {
> ++x;
> if (x == size)
> x = 0;
> if (x == lastReplaced)
> goto insertAllLocked;
> } while (tlb[x].pte.locked());
> lastReplaced = x;
> new_entry = &tlb[x];
> lookupTable.erase(new_entry->range);
> }
> /*
96c138
< }
---
> }*/
98a141
> insertAllLocked:
100c143
< if (!new_entry)
---
> if (!new_entry) {
101a145,146
> lookupTable.erase(new_entry->range);
> }
102a148,150
> freeList.remove(new_entry);
> DPRINTF(TLB, "Using entry: %#X\n", new_entry);
>
105c153
< new_entry->range.size = PTE.size();
---
> new_entry->range.size = PTE.size() - 1;
115,125d162
< // Demap any entry that conflicts
< i = lookupTable.find(new_entry->range);
< if (i != lookupTable.end()) {
< i->second->valid = false;
< if (i->second->used) {
< i->second->used = false;
< usedEntries--;
< }
< DPRINTF(TLB, "TLB: Found conflicting entry, deleting it\n");
< lookupTable.erase(i);
< }
221a259,260
> freeList.push_front(i->second);
> DPRINTF(TLB, "Freeing TLB entry : %#X\n", i->second);
235a275,278
> if (tlb[x].valid == true) {
> freeList.push_front(&tlb[x]);
> DPRINTF(TLB, "Freeing TLB entry : %#X\n", &tlb[x]);
> }
253a297,300
> if (tlb[x].valid == true){
> freeList.push_front(&tlb[x]);
> DPRINTF(TLB, "Freeing TLB entry : %#X\n", &tlb[x]);
> }
269a317
> freeList.clear();
270a319,320
> if (tlb[x].valid == true)
> freeList.push_back(&tlb[x]);
277a328,330
> if (entry >= size)
> panic("entry: %d\n", entry);
>
279c332,335
< return tlb[entry].pte();
---
> if (tlb[entry].valid)
> return tlb[entry].pte();
> else
> return (uint64_t)-1ll;
285a342,343
> if (!tlb[entry].valid)
> return (uint64_t)-1ll;
287,288c345,347
< tag = tlb[entry].range.contextId | tlb[entry].range.va |
< (uint64_t)tlb[entry].range.partitionId << 61;
---
> tag = tlb[entry].range.contextId;
> tag |= tlb[entry].range.va;
> tag |= (uint64_t)tlb[entry].range.partitionId << 61;
504c563
< cacheEntry[0]->range.va + cacheEntry[0]->range.size >= vaddr) {
---
> cacheEntry[0]->range.va + cacheEntry[0]->range.size > vaddr) {
510c569
< cacheEntry[1]->range.va + cacheEntry[1]->range.size >= vaddr) {
---
> cacheEntry[1]->range.va + cacheEntry[1]->range.size > vaddr) {
670d728
< cacheValid = true;
671a730,734
> if (!cacheValid) {
> cacheEntry[1] = NULL;
> cacheEntry[0] = NULL;
> }
>
680c743
<
---
> cacheValid = true;
699c762
< if (priv && vaddr & 0xF || vaddr > 0x3f8 || vaddr < 0x3c0) {
---
> if (!hpriv && vaddr & 0xF || vaddr > 0x3f8 || vaddr < 0x3c0) {