diff -r 2fd64ea0a7cb -r 52df7c56508b src/arch/x86/tlb.cc --- a/src/arch/x86/tlb.cc Tue Mar 08 17:51:02 2016 -0500 +++ b/src/arch/x86/tlb.cc Fri Mar 25 15:42:42 2016 +0000 @@ -101,10 +101,23 @@ { // If somebody beat us to it, just use that existing entry. TlbEntry *newEntry = trie.lookup(vpn); - if (newEntry) { + if (newEntry && newEntry->logBytes == entry.logBytes) { assert(newEntry->vaddr == vpn); return newEntry; } + // We have at least one matching entry with a different mask, + // remove it before inserting the new one. + if (newEntry && newEntry->trieHandle) { + for (unsigned i = 0; i < size; i++) { + if (tlb[i].trieHandle && + tlb[i].trieHandle == newEntry->trieHandle) { + + trie.remove(tlb[i].trieHandle); + tlb[i].trieHandle = NULL; + freeList.push_back(&tlb[i]); + } + } + } if (freeList.empty()) evictLRU();