X86: Clear out duplicate TLB entries when adding a new one.

It's possible for two page table walks to overlap which will go in the same
place in the TLB's trie. They would land on top of each other, so this change
adds some code which detects if an address already matches an entry and if so
throws away the new one.
This commit is contained in:
Gabe Black 2012-04-24 00:48:41 -07:00
parent 74ca8a3cd0
commit 64bf90dca3

View file

@ -98,11 +98,16 @@ TLB::evictLRU()
TlbEntry *
TLB::insert(Addr vpn, TlbEntry &entry)
{
//TODO Deal with conflicting entries
// If somebody beat us to it, just use that existing entry.
TlbEntry *newEntry = trie.lookup(vpn);
if (newEntry) {
assert(newEntry->vaddr = vpn);
return newEntry;
}
TlbEntry *newEntry = NULL;
if (freeList.empty())
evictLRU();
newEntry = freeList.front();
freeList.pop_front();
@ -110,7 +115,7 @@ TLB::insert(Addr vpn, TlbEntry &entry)
newEntry->lruSeq = nextSeq();
newEntry->vaddr = vpn;
newEntry->trieHandle =
trie.insert(vpn, TlbEntryTrie::MaxBits - entry.logBytes, newEntry);
trie.insert(vpn, TlbEntryTrie::MaxBits - entry.logBytes, newEntry);
return newEntry;
}