From 642489740985f2804e8229c69edeb46f2432d8f9 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sat, 17 Aug 2019 00:30:46 -0700 Subject: cpu, mem: Add new getSendFunctional method to the base CPU. This returns a sendFunctional delegate references which can be used to send functional accesses directly, or more likely when constructing a PortProxy subclass. In those cases only the functional capabilities of those ports are needed so there's no reason to require a full port which supports all three protocols. Also, this removes the last remaining use of get(Data|Inst)Port which relies on those returning a port which supports the gem5 protocols, except the default implementations of this new function. If a CPU doesn't have traditional gem5 style ports, it can override this function to do whatever other behavior is necessary and return its real ports through get(Data|Inst)Port. Change-Id: Ide4da81e3bc679662cd85902ba6bd537cce54a53 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20237 Tested-by: kokoro Reviewed-by: Andreas Sandberg Maintainer: Gabe Black --- src/cpu/base.hh | 10 ++++++++++ src/cpu/thread_state.cc | 6 +++--- src/mem/fs_translating_port_proxy.cc | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/cpu/base.hh b/src/cpu/base.hh index 1ca1ca10c..00373a655 100644 --- a/src/cpu/base.hh +++ b/src/cpu/base.hh @@ -160,6 +160,16 @@ class BaseCPU : public ClockedObject */ virtual MasterPort &getDataPort() = 0; + /** + * Returns a sendFunctional delegate for use with port proxies. + */ + virtual PortProxy::SendFunctionalFunc + getSendFunctional() + { + MasterPort &port = getDataPort(); + return [&port](PacketPtr pkt)->void { port.sendFunctional(pkt); }; + } + /** * Purely virtual method that returns a reference to the instruction * port. All subclasses must implement this method. diff --git a/src/cpu/thread_state.cc b/src/cpu/thread_state.cc index dc4a624a7..cb9a87ca8 100644 --- a/src/cpu/thread_state.cc +++ b/src/cpu/thread_state.cc @@ -109,15 +109,15 @@ ThreadState::initMemProxies(ThreadContext *tc) assert(physProxy == NULL); // This cannot be done in the constructor as the thread state // itself is created in the base cpu constructor and the - // getDataPort is a virtual function - physProxy = new PortProxy(baseCpu->getDataPort(), + // getSendFunctional is a virtual function + physProxy = new PortProxy(baseCpu->getSendFunctional(), baseCpu->cacheLineSize()); assert(virtProxy == NULL); virtProxy = new FSTranslatingPortProxy(tc); } else { assert(virtProxy == NULL); - virtProxy = new SETranslatingPortProxy(baseCpu->getDataPort(), + virtProxy = new SETranslatingPortProxy(baseCpu->getSendFunctional(), process, SETranslatingPortProxy::NextPage); } diff --git a/src/mem/fs_translating_port_proxy.cc b/src/mem/fs_translating_port_proxy.cc index d12af13af..2ef48b098 100644 --- a/src/mem/fs_translating_port_proxy.cc +++ b/src/mem/fs_translating_port_proxy.cc @@ -55,7 +55,7 @@ #include "sim/system.hh" FSTranslatingPortProxy::FSTranslatingPortProxy(ThreadContext *tc) - : PortProxy(tc->getCpuPtr()->getDataPort(), + : PortProxy(tc->getCpuPtr()->getSendFunctional(), tc->getSystemPtr()->cacheLineSize()), _tc(tc) { } -- cgit v1.2.3