Update atomic and functional paths for snoops as well

--HG--
extra : convert_revision : 566d73438efb87ca683e4dee23454d880db3dfc7
This commit is contained in:
Ron Dreslinski 2006-11-14 01:38:42 -05:00
parent ac309071af
commit 8155e61a60
2 changed files with 19 additions and 16 deletions

View file

@ -331,17 +331,19 @@ Bus::findSnoopPorts(Addr addr, int id)
} }
Tick Tick
Bus::atomicSnoop(PacketPtr pkt) Bus::atomicSnoop(PacketPtr pkt, Port *responder)
{ {
std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc()); std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc());
Tick response_time = 0; Tick response_time = 0;
while (!ports.empty()) while (!ports.empty())
{ {
Tick response = interfaces[ports.back()]->sendAtomic(pkt); if (interfaces[ports.back()] != responder) {
if (response) { Tick response = interfaces[ports.back()]->sendAtomic(pkt);
assert(!response_time); //Multiple responders if (response) {
response_time = response; assert(!response_time); //Multiple responders
response_time = response;
}
} }
ports.pop_back(); ports.pop_back();
} }
@ -349,7 +351,7 @@ Bus::atomicSnoop(PacketPtr pkt)
} }
void void
Bus::functionalSnoop(PacketPtr pkt) Bus::functionalSnoop(PacketPtr pkt, Port *responder)
{ {
std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc()); std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc());
@ -357,7 +359,8 @@ Bus::functionalSnoop(PacketPtr pkt)
int id = pkt->getSrc(); int id = pkt->getSrc();
while (!ports.empty() && pkt->result != Packet::Success) while (!ports.empty() && pkt->result != Packet::Success)
{ {
interfaces[ports.back()]->sendFunctional(pkt); if (interfaces[ports.back()] != responder)
interfaces[ports.back()]->sendFunctional(pkt);
ports.pop_back(); ports.pop_back();
pkt->setSrc(id); pkt->setSrc(id);
} }
@ -394,12 +397,13 @@ Bus::recvAtomic(PacketPtr pkt)
// some clock skew issues yet again... // some clock skew issues yet again...
pkt->finishTime = curTick + clock; pkt->finishTime = curTick + clock;
Tick snoopTime = atomicSnoop(pkt); Port *port = findPort(pkt->getAddr(), pkt->getSrc());
Tick snoopTime = atomicSnoop(pkt, port);
if (snoopTime) if (snoopTime)
return snoopTime; //Snoop satisfies it return snoopTime; //Snoop satisfies it
else else
return findPort(pkt->getAddr(), pkt->getSrc())->sendAtomic(pkt); return port->sendAtomic(pkt);
} }
/** Function called by the port when the bus is receiving a Functional /** Function called by the port when the bus is receiving a Functional
@ -412,13 +416,12 @@ Bus::recvFunctional(PacketPtr pkt)
assert(pkt->getDest() == Packet::Broadcast); assert(pkt->getDest() == Packet::Broadcast);
pkt->flags |= SNOOP_COMMIT; pkt->flags |= SNOOP_COMMIT;
functionalSnoop(pkt); Port* port = findPort(pkt->getAddr(), pkt->getSrc());
functionalSnoop(pkt, port ? port : interfaces[pkt->getSrc()]);
// 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 && port) {
Port* port = findPort(pkt->getAddr(), pkt->getSrc()); port->sendFunctional(pkt);
if (port)
port->sendFunctional(pkt);
} }
} }

View file

@ -109,10 +109,10 @@ class Bus : public MemObject
std::vector<int> findSnoopPorts(Addr addr, int id); std::vector<int> findSnoopPorts(Addr addr, int id);
/** Snoop all relevant ports atomicly. */ /** Snoop all relevant ports atomicly. */
Tick atomicSnoop(PacketPtr pkt); Tick atomicSnoop(PacketPtr pkt, Port* responder);
/** Snoop all relevant ports functionally. */ /** Snoop all relevant ports functionally. */
void functionalSnoop(PacketPtr pkt); void functionalSnoop(PacketPtr pkt, Port *responder);
/** Call snoop on caches, be sure to set SNOOP_COMMIT bit if you want /** Call snoop on caches, be sure to set SNOOP_COMMIT bit if you want
* the snoop to happen * the snoop to happen