Only respond if the pkt needs a response.

Fix an issue with memory handling writebacks.

src/mem/cache/base_cache.hh:
src/mem/tport.cc:
    Only respond if the pkt needs a response.
src/mem/physical.cc:
    Make physical memory respond to writebacks, set satisfied for invalidates/upgrades.

--HG--
extra : convert_revision : 7601987a7923e54a6d1a168def4f8133d8de19fd
This commit is contained in:
Ron Dreslinski 2006-10-08 19:05:48 -04:00
parent 8a539a774f
commit e65f0cef3c
3 changed files with 23 additions and 13 deletions

View file

@ -516,9 +516,11 @@ class BaseCache : public MemObject
*/ */
void respond(Packet *pkt, Tick time) void respond(Packet *pkt, Tick time)
{ {
if (pkt->needsResponse()) {
CacheEvent *reqCpu = new CacheEvent(cpuSidePort, pkt); CacheEvent *reqCpu = new CacheEvent(cpuSidePort, pkt);
reqCpu->schedule(time); reqCpu->schedule(time);
} }
}
/** /**
* Send a reponse to the slave interface and calculate miss latency. * Send a reponse to the slave interface and calculate miss latency.
@ -530,9 +532,11 @@ class BaseCache : public MemObject
if (!pkt->req->isUncacheable()) { if (!pkt->req->isUncacheable()) {
missLatency[pkt->cmdToIndex()][0/*pkt->req->getThreadNum()*/] += time - pkt->time; missLatency[pkt->cmdToIndex()][0/*pkt->req->getThreadNum()*/] += time - pkt->time;
} }
if (pkt->needsResponse()) {
CacheEvent *reqCpu = new CacheEvent(cpuSidePort, pkt); CacheEvent *reqCpu = new CacheEvent(cpuSidePort, pkt);
reqCpu->schedule(time); reqCpu->schedule(time);
} }
}
/** /**
* Suppliess the data if cache to cache transfers are enabled. * Suppliess the data if cache to cache transfers are enabled.
@ -542,6 +546,7 @@ class BaseCache : public MemObject
{ {
// assert("Implement\n" && 0); // assert("Implement\n" && 0);
// mi->respond(pkt,curTick + hitLatency); // mi->respond(pkt,curTick + hitLatency);
assert (pkt->needsResponse());
CacheEvent *reqMem = new CacheEvent(memSidePort, pkt); CacheEvent *reqMem = new CacheEvent(memSidePort, pkt);
reqMem->schedule(time); reqMem->schedule(time);
} }

View file

@ -197,22 +197,25 @@ PhysicalMemory::doFunctionalAccess(Packet *pkt)
{ {
assert(pkt->getAddr() + pkt->getSize() < params()->addrRange.size()); assert(pkt->getAddr() + pkt->getSize() < params()->addrRange.size());
switch (pkt->cmd) { if (pkt->isRead()) {
case Packet::ReadReq:
if (pkt->req->isLocked()) { if (pkt->req->isLocked()) {
trackLoadLocked(pkt->req); trackLoadLocked(pkt->req);
} }
memcpy(pkt->getPtr<uint8_t>(), memcpy(pkt->getPtr<uint8_t>(),
pmemAddr + pkt->getAddr() - params()->addrRange.start, pmemAddr + pkt->getAddr() - params()->addrRange.start,
pkt->getSize()); pkt->getSize());
break; }
case Packet::WriteReq: else if (pkt->isWrite()) {
if (writeOK(pkt->req)) { if (writeOK(pkt->req)) {
memcpy(pmemAddr + pkt->getAddr() - params()->addrRange.start, memcpy(pmemAddr + pkt->getAddr() - params()->addrRange.start,
pkt->getPtr<uint8_t>(), pkt->getSize()); pkt->getPtr<uint8_t>(), pkt->getSize());
} }
break; }
default: else if (pkt->isInvalidate()) {
//upgrade or invalidate
pkt->flags |= SATISFIED;
}
else {
panic("unimplemented"); panic("unimplemented");
} }

View file

@ -47,9 +47,11 @@ SimpleTimingPort::recvTiming(Packet *pkt)
// if we ever added it back. // if we ever added it back.
assert(pkt->result != Packet::Nacked); assert(pkt->result != Packet::Nacked);
Tick latency = recvAtomic(pkt); Tick latency = recvAtomic(pkt);
// turn packet around to go back to requester // turn packet around to go back to requester if response expected
if (pkt->needsResponse()) {
pkt->makeTimingResponse(); pkt->makeTimingResponse();
sendTimingLater(pkt, latency); sendTimingLater(pkt, latency);
}
return true; return true;
} }