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 <noreply+kokoro@google.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2019-08-17 00:30:46 -07:00
parent 9ad74b7d0c
commit 6424897409
3 changed files with 14 additions and 4 deletions

View File

@@ -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.

View File

@@ -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);
}

View File

@@ -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)
{
}