From 49507982685b4e807e612ff176fb67901415a2ce Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Mon, 12 Nov 2007 14:39:07 -0800 Subject: X86: Implement tlb invalidation and make it happen some of the times it should. --HG-- extra : convert_revision : 376516d33cd539fa526c834ef2b2c33069af3040 --- src/arch/x86/tlb.cc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/arch/x86/tlb.cc') diff --git a/src/arch/x86/tlb.cc b/src/arch/x86/tlb.cc index 704ab3027..1184bf9de 100644 --- a/src/arch/x86/tlb.cc +++ b/src/arch/x86/tlb.cc @@ -380,6 +380,7 @@ TLB::Walker::start(ThreadContext * _tc, Addr vaddr) } } } + nextState = Ready; entry.vaddr = vaddr; @@ -595,11 +596,27 @@ TLB::lookup(Addr va, bool update_lru) void TLB::invalidateAll() { + DPRINTF(TLB, "Invalidating all entries.\n"); + while (!entryList.empty()) { + TlbEntry *entry = entryList.front(); + entryList.pop_front(); + freeList.push_back(entry); + } } void TLB::invalidateNonGlobal() { + DPRINTF(TLB, "Invalidating all non global entries.\n"); + EntryList::iterator entryIt; + for (entryIt = entryList.begin(); entryIt != entryList.end();) { + if (!(*entryIt)->global) { + freeList.push_back(*entryIt); + entryList.erase(entryIt++); + } else { + entryIt++; + } + } } void -- cgit v1.2.3