diff options
author | Gabe Black <gabeblack@google.com> | 2017-12-22 01:07:55 -0800 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2017-12-22 23:16:03 +0000 |
commit | b7618c69a511e3fde5cdb674a91e5683f92e770f (patch) | |
tree | e7f472f1014db9e41a98a5b7df759d88db917742 /src/arch/sparc | |
parent | 4ac0a01e2fdeee8f17d15636409acd7208d9187e (diff) | |
download | gem5-b7618c69a511e3fde5cdb674a91e5683f92e770f.tar.xz |
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 <gabeblack@google.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/arch/sparc')
-rw-r--r-- | src/arch/sparc/faults.cc | 8 | ||||
-rw-r--r-- | src/arch/sparc/mmapped_ipr.hh | 4 | ||||
-rw-r--r-- | src/arch/sparc/tlb.cc | 24 | ||||
-rw-r--r-- | src/arch/sparc/tlb.hh | 15 | ||||
-rw-r--r-- | src/arch/sparc/vtophys.cc | 4 |
5 files changed, 23 insertions, 32 deletions
diff --git a/src/arch/sparc/faults.cc b/src/arch/sparc/faults.cc index 13e9c19f6..5466115d0 100644 --- a/src/arch/sparc/faults.cc +++ b/src/arch/sparc/faults.cc @@ -669,8 +669,8 @@ FastInstructionAccessMMUMiss::invoke(ThreadContext *tc, // false for syscall emulation mode regardless of whether the // address is real in preceding code. Not sure sure that this is // correct, but also not sure if it matters at all. - tc->getITBPtr()->insert(alignedvaddr, partition_id, context_id, - false, entry.pte); + dynamic_cast<TLB *>(tc->getITBPtr())-> + insert(alignedvaddr, partition_id, context_id, false, entry.pte); } } @@ -757,8 +757,8 @@ FastDataAccessMMUMiss::invoke(ThreadContext *tc, const StaticInstPtr &inst) // false for syscall emulation mode regardless of whether the // address is real in preceding code. Not sure sure that this is // correct, but also not sure if it matters at all. - tc->getDTBPtr()->insert(alignedvaddr, partition_id, context_id, - false, entry.pte); + dynamic_cast<TLB *>(tc->getDTBPtr())-> + insert(alignedvaddr, partition_id, context_id, false, entry.pte); } } diff --git a/src/arch/sparc/mmapped_ipr.hh b/src/arch/sparc/mmapped_ipr.hh index e7d27eed5..35e4d891b 100644 --- a/src/arch/sparc/mmapped_ipr.hh +++ b/src/arch/sparc/mmapped_ipr.hh @@ -51,7 +51,7 @@ handleIprRead(ThreadContext *xc, Packet *pkt) if (GenericISA::isGenericIprAccess(pkt)) return GenericISA::handleGenericIprRead(xc, pkt); else - return xc->getDTBPtr()->doMmuRegRead(xc, pkt); + return dynamic_cast<TLB *>(xc->getDTBPtr())->doMmuRegRead(xc, pkt); } inline Cycles @@ -60,7 +60,7 @@ handleIprWrite(ThreadContext *xc, Packet *pkt) if (GenericISA::isGenericIprAccess(pkt)) return GenericISA::handleGenericIprWrite(xc, pkt); else - return xc->getDTBPtr()->doMmuRegWrite(xc, pkt); + return dynamic_cast<TLB *>(xc->getDTBPtr())->doMmuRegWrite(xc, pkt); } diff --git a/src/arch/sparc/tlb.cc b/src/arch/sparc/tlb.cc index 51eb83ac2..997bfe991 100644 --- a/src/arch/sparc/tlb.cc +++ b/src/arch/sparc/tlb.cc @@ -849,13 +849,6 @@ TLB::translateTiming(RequestPtr req, ThreadContext *tc, } Fault -TLB::translateFunctional(RequestPtr req, ThreadContext *tc, Mode mode) -{ - panic("Not implemented\n"); - return NoFault; -} - -Fault TLB::finalizePhysical(RequestPtr req, ThreadContext *tc, Mode mode) const { return NoFault; @@ -871,7 +864,7 @@ TLB::doMmuRegRead(ThreadContext *tc, Packet *pkt) DPRINTF(IPR, "Memory Mapped IPR Read: asi=%#X a=%#x\n", (uint32_t)pkt->req->getArchFlags(), pkt->getAddr()); - TLB *itb = tc->getITBPtr(); + TLB *itb = dynamic_cast<TLB *>(tc->getITBPtr()); switch (asi) { case ASI_LSU_CONTROL_REG: @@ -1067,7 +1060,7 @@ TLB::doMmuRegWrite(ThreadContext *tc, Packet *pkt) DPRINTF(IPR, "Memory Mapped IPR Write: asi=%#X a=%#x d=%#X\n", (uint32_t)asi, va, data); - TLB *itb = tc->getITBPtr(); + TLB *itb = dynamic_cast<TLB *>(tc->getITBPtr()); switch (asi) { case ASI_LSU_CONTROL_REG: @@ -1171,8 +1164,8 @@ TLB::doMmuRegWrite(ThreadContext *tc, Packet *pkt) real_insert = bits(va, 9,9); pte.populate(data, bits(va,10,10) ? PageTableEntry::sun4v : PageTableEntry::sun4u); - tc->getITBPtr()->insert(va_insert, part_insert, ct_insert, real_insert, - pte, entry_insert); + itb->insert(va_insert, part_insert, ct_insert, real_insert, + pte, entry_insert); break; case ASI_DTLB_DATA_ACCESS_REG: entry_insert = bits(va, 8,3); @@ -1209,15 +1202,14 @@ TLB::doMmuRegWrite(ThreadContext *tc, Packet *pkt) switch (bits(va,7,6)) { case 0: // demap page if (!ignore) - tc->getITBPtr()->demapPage(mbits(va,63,13), part_id, - bits(va,9,9), ctx_id); + itb->demapPage(mbits(va,63,13), part_id, bits(va,9,9), ctx_id); break; case 1: // demap context if (!ignore) - tc->getITBPtr()->demapContext(part_id, ctx_id); + itb->demapContext(part_id, ctx_id); break; case 2: - tc->getITBPtr()->demapAll(part_id); + itb->demapAll(part_id); break; default: panic("Invalid type for IMMU demap\n"); @@ -1303,7 +1295,7 @@ void TLB::GetTsbPtr(ThreadContext *tc, Addr addr, int ctx, Addr *ptrs) { uint64_t tag_access = mbits(addr,63,13) | mbits(ctx,12,0); - TLB * itb = tc->getITBPtr(); + TLB *itb = dynamic_cast<TLB *>(tc->getITBPtr()); ptrs[0] = MakeTsbPtr(Ps0, tag_access, c0_tsb_ps0, c0_config, diff --git a/src/arch/sparc/tlb.hh b/src/arch/sparc/tlb.hh index 12d5ef738..7437ec3e6 100644 --- a/src/arch/sparc/tlb.hh +++ b/src/arch/sparc/tlb.hh @@ -163,14 +163,13 @@ class TLB : public BaseTLB void dumpAll(); - Fault translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode); - void translateTiming(RequestPtr req, ThreadContext *tc, - Translation *translation, Mode mode); - /** Stub function for compilation support with CheckerCPU. SPARC ISA - * does not support the Checker model at the moment - */ - Fault translateFunctional(RequestPtr req, ThreadContext *tc, Mode mode); - Fault finalizePhysical(RequestPtr req, ThreadContext *tc, Mode mode) const; + Fault translateAtomic( + RequestPtr req, ThreadContext *tc, Mode mode) override; + void translateTiming( + RequestPtr req, ThreadContext *tc, + Translation *translation, Mode mode) override; + Fault finalizePhysical( + RequestPtr req, ThreadContext *tc, Mode mode) const override; Cycles doMmuRegRead(ThreadContext *tc, Packet *pkt); Cycles doMmuRegWrite(ThreadContext *tc, Packet *pkt); void GetTsbPtr(ThreadContext *tc, Addr addr, int ctx, Addr *ptrs); diff --git a/src/arch/sparc/vtophys.cc b/src/arch/sparc/vtophys.cc index 6ba62eb9c..88f1c4ace 100644 --- a/src/arch/sparc/vtophys.cc +++ b/src/arch/sparc/vtophys.cc @@ -83,8 +83,8 @@ vtophys(ThreadContext *tc, Addr addr) // int sec_context = bits(tlbdata,63,48); PortProxy &mem = tc->getPhysProxy(); - TLB* itb = tc->getITBPtr(); - TLB* dtb = tc->getDTBPtr(); + TLB* itb = dynamic_cast<TLB *>(tc->getITBPtr()); + TLB* dtb = dynamic_cast<TLB *>(tc->getDTBPtr()); TlbEntry* tbe; PageTableEntry pte; Addr tsbs[4]; |