summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/tlb.cc11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/arch/x86/tlb.cc b/src/arch/x86/tlb.cc
index caa3efc1e..8dad84dc4 100644
--- a/src/arch/x86/tlb.cc
+++ b/src/arch/x86/tlb.cc
@@ -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;
}