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/generic | |
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/generic')
-rw-r--r-- | src/arch/generic/tlb.hh | 96 |
1 files changed, 56 insertions, 40 deletions
diff --git a/src/arch/generic/tlb.hh b/src/arch/generic/tlb.hh index aef52a120..e0becf727 100644 --- a/src/arch/generic/tlb.hh +++ b/src/arch/generic/tlb.hh @@ -60,32 +60,6 @@ class BaseTLB : public SimObject public: enum Mode { Read, Write, Execute }; - public: - virtual void demapPage(Addr vaddr, uint64_t asn) = 0; - - /** - * Remove all entries from the TLB - */ - virtual void flushAll() = 0; - - /** - * Take over from an old tlb context - */ - virtual void takeOverFrom(BaseTLB *otlb) = 0; - - /** - * Get the table walker master port if present. This is used for - * migrating port connections during a CPU takeOverFrom() - * call. For architectures that do not have a table walker, NULL - * is returned, hence the use of a pointer rather than a - * reference. - * - * @return A pointer to the walker master port or NULL if not present - */ - virtual BaseMasterPort* getMasterPort() { return NULL; } - - void memInvalidate() { flushAll(); } - class Translation { public: @@ -113,22 +87,20 @@ class BaseTLB : public SimObject */ virtual bool squashed() const { return false; } }; -}; - -class GenericTLB : public BaseTLB -{ - protected: - GenericTLB(const Params *p) - : BaseTLB(p) - {} public: - void demapPage(Addr vaddr, uint64_t asn) override; - - Fault translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode); - void translateTiming(RequestPtr req, ThreadContext *tc, - Translation *translation, Mode mode); + virtual void demapPage(Addr vaddr, uint64_t asn) = 0; + virtual Fault translateAtomic( + RequestPtr req, ThreadContext *tc, Mode mode) = 0; + virtual void translateTiming( + RequestPtr req, ThreadContext *tc, + Translation *translation, Mode mode) = 0; + virtual Fault + translateFunctional(RequestPtr req, ThreadContext *tc, Mode mode) + { + panic("Not implemented.\n"); + } /** * Do post-translation physical address finalization. @@ -144,7 +116,51 @@ class GenericTLB : public BaseTLB * @param mode Request type (read/write/execute). * @return A fault on failure, NoFault otherwise. */ - Fault finalizePhysical(RequestPtr req, ThreadContext *tc, Mode mode) const; + virtual Fault finalizePhysical( + RequestPtr req, ThreadContext *tc, Mode mode) const = 0; + + /** + * Remove all entries from the TLB + */ + virtual void flushAll() = 0; + + /** + * Take over from an old tlb context + */ + virtual void takeOverFrom(BaseTLB *otlb) = 0; + + /** + * Get the table walker master port if present. This is used for + * migrating port connections during a CPU takeOverFrom() + * call. For architectures that do not have a table walker, NULL + * is returned, hence the use of a pointer rather than a + * reference. + * + * @return A pointer to the walker master port or NULL if not present + */ + virtual BaseMasterPort* getMasterPort() { return NULL; } + + void memInvalidate() { flushAll(); } +}; + +class GenericTLB : public BaseTLB +{ + protected: + GenericTLB(const Params *p) + : BaseTLB(p) + {} + + public: + void demapPage(Addr vaddr, uint64_t asn) override; + + 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; }; #endif // __ARCH_GENERIC_TLB_HH__ |