diff --git a/src/arch/x86/faults.cc b/src/arch/x86/faults.cc index 36cc47e43c..a50751510d 100644 --- a/src/arch/x86/faults.cc +++ b/src/arch/x86/faults.cc @@ -42,6 +42,7 @@ #include "arch/x86/generated/decoder.hh" #include "arch/x86/isa_traits.hh" +#include "arch/x86/mmu.hh" #include "base/loader/symtab.hh" #include "base/trace.hh" #include "cpu/thread_context.hh" @@ -137,8 +138,7 @@ PageFault::invoke(ThreadContext *tc, const StaticInstPtr &inst) { if (FullSystem) { // Invalidate any matching TLB entries before handling the page fault. - tc->getITBPtr()->demapPage(addr, 0); - tc->getDTBPtr()->demapPage(addr, 0); + tc->getMMUPtr()->demapPage(addr, 0); HandyM5Reg m5reg = tc->readMiscRegNoEffect(MISCREG_M5_REG); X86FaultBase::invoke(tc); // If something bad happens while trying to enter the page fault diff --git a/src/arch/x86/isa.cc b/src/arch/x86/isa.cc index 1b2504abc1..86182879aa 100644 --- a/src/arch/x86/isa.cc +++ b/src/arch/x86/isa.cc @@ -29,7 +29,7 @@ #include "arch/x86/isa.hh" #include "arch/x86/decoder.hh" -#include "arch/x86/tlb.hh" +#include "arch/x86/mmu.hh" #include "cpu/base.hh" #include "cpu/thread_context.hh" #include "params/X86ISA.hh" @@ -239,8 +239,7 @@ ISA::setMiscReg(int miscReg, RegVal val) } } if (toggled.pg) { - dynamic_cast(tc->getITBPtr())->flushAll(); - dynamic_cast(tc->getDTBPtr())->flushAll(); + tc->getMMUPtr()->flushAll(); } //This must always be 1. newCR0.et = 1; @@ -255,15 +254,13 @@ ISA::setMiscReg(int miscReg, RegVal val) case MISCREG_CR2: break; case MISCREG_CR3: - dynamic_cast(tc->getITBPtr())->flushNonGlobal(); - dynamic_cast(tc->getDTBPtr())->flushNonGlobal(); + static_cast(tc->getMMUPtr())->flushNonGlobal(); break; case MISCREG_CR4: { CR4 toggled = regVal[miscReg] ^ val; if (toggled.pae || toggled.pse || toggled.pge) { - dynamic_cast(tc->getITBPtr())->flushAll(); - dynamic_cast(tc->getDTBPtr())->flushAll(); + tc->getMMUPtr()->flushAll(); } } break; diff --git a/src/arch/x86/mmu.hh b/src/arch/x86/mmu.hh index 4f3411a19d..70afea3c3b 100644 --- a/src/arch/x86/mmu.hh +++ b/src/arch/x86/mmu.hh @@ -39,6 +39,7 @@ #define __ARCH_X86_MMU_HH__ #include "arch/generic/mmu.hh" +#include "arch/x86/tlb.hh" #include "params/X86MMU.hh" @@ -50,6 +51,19 @@ class MMU : public BaseMMU MMU(const X86MMUParams &p) : BaseMMU(p) {} + + void + flushNonGlobal() + { + static_cast(itb)->flushNonGlobal(); + static_cast(dtb)->flushNonGlobal(); + } + + Walker* + getDataWalker() + { + return static_cast(dtb)->getWalker(); + } }; } // namespace X86ISA diff --git a/src/arch/x86/remote_gdb.cc b/src/arch/x86/remote_gdb.cc index 9603b90693..2f38fd5f32 100644 --- a/src/arch/x86/remote_gdb.cc +++ b/src/arch/x86/remote_gdb.cc @@ -44,6 +44,7 @@ #include +#include "arch/x86/mmu.hh" #include "arch/x86/pagetable_walker.hh" #include "arch/x86/process.hh" #include "arch/x86/regs/int.hh" @@ -68,8 +69,8 @@ bool RemoteGDB::acc(Addr va, size_t len) { if (FullSystem) { - Walker *walker = dynamic_cast( - context()->getDTBPtr())->getWalker(); + Walker *walker = dynamic_cast( + context()->getMMUPtr())->getDataWalker(); unsigned logBytes; Fault fault = walker->startFunctional(context(), va, logBytes, BaseTLB::Read); diff --git a/src/arch/x86/utility.cc b/src/arch/x86/utility.cc index 33b9371b56..7d891afb71 100644 --- a/src/arch/x86/utility.cc +++ b/src/arch/x86/utility.cc @@ -39,6 +39,7 @@ #include "arch/x86/utility.hh" #include "arch/x86/interrupts.hh" +#include "arch/x86/mmu.hh" #include "arch/x86/registers.hh" #include "arch/x86/x86_traits.hh" #include "cpu/base.hh" @@ -86,8 +87,7 @@ copyMiscRegs(ThreadContext *src, ThreadContext *dest) // CPU switch have different frequencies. dest->setMiscReg(MISCREG_TSC, src->readMiscReg(MISCREG_TSC)); - dest->getITBPtr()->flushAll(); - dest->getDTBPtr()->flushAll(); + dest->getMMUPtr()->flushAll(); } void