diff options
author | Gabe Black <gabeblack@google.com> | 2019-03-21 17:23:03 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2019-04-10 10:37:27 +0000 |
commit | 64f415f9bf5bb70376859055ec2d96fbb8c998ce (patch) | |
tree | caa8de425655fa20f717d6a796a31da3d98704ca /src/mem/port.cc | |
parent | a8d5dd1c136529e9605066368877d3b8e24dcdba (diff) | |
download | gem5-64f415f9bf5bb70376859055ec2d96fbb8c998ce.tar.xz |
mem: Add sendAtomicBackdoor/recvAtomicBackdoor port methods.
These both perform atomic accesses like their non-backdoor equivalents,
and also request a backdoor corresponding to the access.
The default implementation for recvAtomicBackdoor prints a warning
(once per port instance), calls recvAtomic to do the actual access,
and leaves the backdoor pointer as nullptr. That way if an object
doesn't know how to handle or transfer requests for a back door, it
automatically replies in a safe way that ignores the back door request.
Change-Id: Ia9fbbe9996eb4b71ea62214d203aa039a05f1618
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17590
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/mem/port.cc')
-rw-r--r-- | src/mem/port.cc | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/mem/port.cc b/src/mem/port.cc index 001576fe3..933e98243 100644 --- a/src/mem/port.cc +++ b/src/mem/port.cc @@ -144,6 +144,13 @@ MasterPort::sendAtomic(PacketPtr pkt) return _slavePort->recvAtomic(pkt); } +Tick +MasterPort::sendAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) +{ + assert(pkt->isRequest()); + return _slavePort->recvAtomicBackdoor(pkt, backdoor); +} + void MasterPort::sendFunctional(PacketPtr pkt) { @@ -195,7 +202,8 @@ MasterPort::printAddr(Addr a) * Slave port */ SlavePort::SlavePort(const std::string& name, MemObject* _owner, PortID id) - : BaseSlavePort(name, id), _masterPort(NULL), owner(*_owner) + : BaseSlavePort(name, id), _masterPort(NULL), defaultBackdoorWarned(false), + owner(*_owner) { } @@ -220,6 +228,16 @@ SlavePort::slaveBind(MasterPort& master_port) } Tick +SlavePort::recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) +{ + if (!defaultBackdoorWarned) { + warn("Port %s doesn't support requesting a back door.", name()); + defaultBackdoorWarned = true; + } + return recvAtomic(pkt); +} + +Tick SlavePort::sendAtomicSnoop(PacketPtr pkt) { assert(pkt->isRequest()); |