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:
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user