From b7618c69a511e3fde5cdb674a91e5683f92e770f Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 22 Dec 2017 01:07:55 -0800 Subject: arch,cpu: "virtualize" the TLB interface. CPUs have historically instantiated the architecture specific version of the TLBs to avoid a virtual function call, making them a little bit more dependent on what the current ISA is. Some simple performance measurement, the x86 twolf regression on the atomic CPU, shows that there isn't actually any performance benefit, and if anything the simulator goes slightly faster (although still within margin of error) when the TLB functions are virtual. This change switches everything outside of the architectures themselves to use the generic BaseTLB type, and then inside the ISA for them to cast that to their architecture specific type to call into architecture specific interfaces. The ARM TLB needed the most adjustment since it was using non-standard translation function signatures. Specifically, they all took an extra "type" parameter which defaulted to normal, and translateTiming returned a Fault. translateTiming actually doesn't need to return a Fault because everywhere that consumed it just stored it into a structure which it then deleted(?), and the fault is stored in the Translation object when the translation is done. A little more work is needed to fully obviate the arch/tlb.hh header, so the TheISA::TLB type is still visible outside of the ISAs. Specifically, the TlbEntry type is used in the generic PageTable which lives in src/mem. Change-Id: I51b68ee74411f9af778317eff222f9349d2ed575 Reviewed-on: https://gem5-review.googlesource.com/6921 Maintainer: Gabe Black Reviewed-by: Jason Lowe-Power --- src/arch/x86/isa.cc | 12 ++++++------ src/arch/x86/remote_gdb.cc | 3 ++- src/arch/x86/tlb.cc | 7 ------- src/arch/x86/tlb.hh | 14 ++++++-------- src/arch/x86/vtophys.cc | 2 +- 5 files changed, 15 insertions(+), 23 deletions(-) (limited to 'src/arch/x86') diff --git a/src/arch/x86/isa.cc b/src/arch/x86/isa.cc index f092f4418..28c50f358 100644 --- a/src/arch/x86/isa.cc +++ b/src/arch/x86/isa.cc @@ -216,8 +216,8 @@ ISA::setMiscReg(int miscReg, MiscReg val, ThreadContext * tc) } } if (toggled.pg) { - tc->getITBPtr()->flushAll(); - tc->getDTBPtr()->flushAll(); + dynamic_cast(tc->getITBPtr())->flushAll(); + dynamic_cast(tc->getDTBPtr())->flushAll(); } //This must always be 1. newCR0.et = 1; @@ -233,15 +233,15 @@ ISA::setMiscReg(int miscReg, MiscReg val, ThreadContext * tc) case MISCREG_CR2: break; case MISCREG_CR3: - tc->getITBPtr()->flushNonGlobal(); - tc->getDTBPtr()->flushNonGlobal(); + dynamic_cast(tc->getITBPtr())->flushNonGlobal(); + dynamic_cast(tc->getDTBPtr())->flushNonGlobal(); break; case MISCREG_CR4: { CR4 toggled = regVal[miscReg] ^ val; if (toggled.pae || toggled.pse || toggled.pge) { - tc->getITBPtr()->flushAll(); - tc->getDTBPtr()->flushAll(); + dynamic_cast(tc->getITBPtr())->flushAll(); + dynamic_cast(tc->getDTBPtr())->flushAll(); } } break; diff --git a/src/arch/x86/remote_gdb.cc b/src/arch/x86/remote_gdb.cc index 79613971a..a6fdabd73 100644 --- a/src/arch/x86/remote_gdb.cc +++ b/src/arch/x86/remote_gdb.cc @@ -72,7 +72,8 @@ bool RemoteGDB::acc(Addr va, size_t len) { if (FullSystem) { - Walker *walker = context->getDTBPtr()->getWalker(); + Walker *walker = dynamic_cast( + context->getDTBPtr())->getWalker(); unsigned logBytes; Fault fault = walker->startFunctional(context, va, logBytes, BaseTLB::Read); diff --git a/src/arch/x86/tlb.cc b/src/arch/x86/tlb.cc index e954c9c73..0b1df9e21 100644 --- a/src/arch/x86/tlb.cc +++ b/src/arch/x86/tlb.cc @@ -440,13 +440,6 @@ TLB::translateTiming(RequestPtr req, ThreadContext *tc, translation->finish(fault, req, tc, mode); } -Fault -TLB::translateFunctional(RequestPtr req, ThreadContext *tc, Mode mode) -{ - panic("Not implemented\n"); - return NoFault; -} - Walker * TLB::getWalker() { diff --git a/src/arch/x86/tlb.hh b/src/arch/x86/tlb.hh index d036b74d6..c3dc83bb2 100644 --- a/src/arch/x86/tlb.hh +++ b/src/arch/x86/tlb.hh @@ -122,13 +122,11 @@ namespace X86ISA return ++lruSeq; } - Fault translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode); - void translateTiming(RequestPtr req, ThreadContext *tc, - Translation *translation, Mode mode); - /** Stub function for compilation support of CheckerCPU. x86 ISA does - * not support Checker model at the moment - */ - Fault translateFunctional(RequestPtr req, ThreadContext *tc, Mode mode); + Fault translateAtomic( + RequestPtr req, ThreadContext *tc, Mode mode) override; + void translateTiming( + RequestPtr req, ThreadContext *tc, + Translation *translation, Mode mode) override; /** * Do post-translation physical address finalization. @@ -144,7 +142,7 @@ namespace X86ISA * @return A fault on failure, NoFault otherwise. */ Fault finalizePhysical(RequestPtr req, ThreadContext *tc, - Mode mode) const; + Mode mode) const override; TlbEntry * insert(Addr vpn, TlbEntry &entry); diff --git a/src/arch/x86/vtophys.cc b/src/arch/x86/vtophys.cc index 9b76d89a5..d0287f2ce 100644 --- a/src/arch/x86/vtophys.cc +++ b/src/arch/x86/vtophys.cc @@ -60,7 +60,7 @@ namespace X86ISA Addr vtophys(ThreadContext *tc, Addr vaddr) { - Walker *walker = tc->getDTBPtr()->getWalker(); + Walker *walker = dynamic_cast(tc->getDTBPtr())->getWalker(); unsigned logBytes; Addr addr = vaddr; Fault fault = walker->startFunctional( -- cgit v1.2.3