}
Tick
-CoherentXBar::recvAtomic(PacketPtr pkt, PortID slave_port_id)
+CoherentXBar::recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
+ MemBackdoorPtr *backdoor)
{
DPRINTF(CoherentXBar, "%s: src %s packet %s\n", __func__,
slavePorts[slave_port_id]->name(), pkt->print());
}
// forward the request to the appropriate destination
- response_latency = masterPorts[master_port_id]->sendAtomic(pkt);
+ auto master = masterPorts[master_port_id];
+ response_latency = backdoor ?
+ master->sendAtomicBackdoor(pkt, *backdoor) :
+ master->sendAtomic(pkt);
} else {
// if it does not need a response we sink the packet above
assert(pkt->needsResponse());
Tick
recvAtomic(PacketPtr pkt) override
{
- return xbar.recvAtomic(pkt, id);
+ return xbar.recvAtomicBackdoor(pkt, id);
+ }
+
+ Tick
+ recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) override
+ {
+ return xbar.recvAtomicBackdoor(pkt, id, &backdoor);
}
void
void forwardTiming(PacketPtr pkt, PortID exclude_slave_port_id,
const std::vector<QueuedSlavePort*>& dests);
- Tick recvAtomic(PacketPtr pkt, PortID slave_port_id);
+ Tick recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
+ MemBackdoorPtr *backdoor=nullptr);
Tick recvAtomicSnoop(PacketPtr pkt, PortID master_port_id);
/**
}
Tick
-NoncoherentXBar::recvAtomic(PacketPtr pkt, PortID slave_port_id)
+NoncoherentXBar::recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
+ MemBackdoorPtr *backdoor)
{
DPRINTF(NoncoherentXBar, "recvAtomic: packet src %s addr 0x%x cmd %s\n",
slavePorts[slave_port_id]->name(), pkt->getAddr(),
transDist[pkt_cmd]++;
// forward the request to the appropriate destination
- Tick response_latency = masterPorts[master_port_id]->sendAtomic(pkt);
+ auto master = masterPorts[master_port_id];
+ Tick response_latency = backdoor ?
+ master->sendAtomicBackdoor(pkt, *backdoor) : master->sendAtomic(pkt);
// add the response data
if (pkt->isResponse()) {
Tick
recvAtomic(PacketPtr pkt) override
{
- return xbar.recvAtomic(pkt, id);
+ return xbar.recvAtomicBackdoor(pkt, id);
+ }
+
+ Tick
+ recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) override
+ {
+ return xbar.recvAtomicBackdoor(pkt, id, &backdoor);
}
void
virtual bool recvTimingReq(PacketPtr pkt, PortID slave_port_id);
virtual bool recvTimingResp(PacketPtr pkt, PortID master_port_id);
void recvReqRetry(PortID master_port_id);
- Tick recvAtomic(PacketPtr pkt, PortID slave_port_id);
+ Tick recvAtomicBackdoor(PacketPtr pkt, PortID slave_port_id,
+ MemBackdoorPtr *backdoor=nullptr);
void recvFunctional(PacketPtr pkt, PortID slave_port_id);
public: