diff -r 24b06cbf2d67 -r 26f7c7e2a933 src/arch/x86/tlb.cc --- a/src/arch/x86/tlb.cc Sun Apr 22 05:20:44 2012 -0700 +++ b/src/arch/x86/tlb.cc Sun Apr 22 23:26:55 2012 -0700 @@ -98,11 +98,16 @@ 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 @@ 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; }