Fix problems with snoop ranges not working properly on functional accesses
src/mem/bus.cc: Actually return the snoop list when asked for it. Don't get stuck in infinite functional loops --HG-- extra : convert_revision : 8e6dafbd10b30d48d28b6b5d4b464e8e8f6a3ddc
This commit is contained in:
parent
dfc82bdcfc
commit
6c5c51338d
|
@ -290,7 +290,10 @@ Bus::findPort(Addr addr, int id)
|
||||||
|
|
||||||
|
|
||||||
// we shouldn't be sending this back to where it came from
|
// we shouldn't be sending this back to where it came from
|
||||||
assert(dest_id != id);
|
// only on a functional access and then we should terminate
|
||||||
|
// the cyclical call.
|
||||||
|
if (dest_id == id)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return interfaces[dest_id];
|
return interfaces[dest_id];
|
||||||
}
|
}
|
||||||
|
@ -392,8 +395,11 @@ Bus::recvFunctional(PacketPtr pkt)
|
||||||
functionalSnoop(pkt);
|
functionalSnoop(pkt);
|
||||||
|
|
||||||
// If the snooping found what we were looking for, we're done.
|
// If the snooping found what we were looking for, we're done.
|
||||||
if (pkt->result != Packet::Success)
|
if (pkt->result != Packet::Success) {
|
||||||
findPort(pkt->getAddr(), pkt->getSrc())->sendFunctional(pkt);
|
Port* port = findPort(pkt->getAddr(), pkt->getSrc());
|
||||||
|
if (port)
|
||||||
|
port->sendFunctional(pkt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Function called by the port when the bus is receiving a status change.*/
|
/** Function called by the port when the bus is receiving a status change.*/
|
||||||
|
@ -493,7 +499,7 @@ Bus::addressRanges(AddrRangeList &resp, AddrRangeList &snoop, int id)
|
||||||
for (dflt_iter = defaultRange.begin(); dflt_iter != defaultRange.end();
|
for (dflt_iter = defaultRange.begin(); dflt_iter != defaultRange.end();
|
||||||
dflt_iter++) {
|
dflt_iter++) {
|
||||||
resp.push_back(*dflt_iter);
|
resp.push_back(*dflt_iter);
|
||||||
DPRINTF(BusAddrRanges, " -- %#llx : %#llx\n",dflt_iter->start,
|
DPRINTF(BusAddrRanges, " -- Dflt: %#llx : %#llx\n",dflt_iter->start,
|
||||||
dflt_iter->end);
|
dflt_iter->end);
|
||||||
}
|
}
|
||||||
for (portIter = portList.begin(); portIter != portList.end(); portIter++) {
|
for (portIter = portList.begin(); portIter != portList.end(); portIter++) {
|
||||||
|
@ -519,6 +525,16 @@ Bus::addressRanges(AddrRangeList &resp, AddrRangeList &snoop, int id)
|
||||||
portIter->range.start, portIter->range.end);
|
portIter->range.start, portIter->range.end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (portIter = portSnoopList.begin();
|
||||||
|
portIter != portSnoopList.end(); portIter++)
|
||||||
|
{
|
||||||
|
if (portIter->portId != id) {
|
||||||
|
snoop.push_back(portIter->range);
|
||||||
|
DPRINTF(BusAddrRanges, " -- Snoop: %#llx : %#llx\n",
|
||||||
|
portIter->range.start, portIter->range.end);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
|
|
Loading…
Reference in a new issue