Update atomic and functional paths for snoops as well
--HG-- extra : convert_revision : 566d73438efb87ca683e4dee23454d880db3dfc7
This commit is contained in:
parent
ac309071af
commit
8155e61a60
2 changed files with 19 additions and 16 deletions
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue