Fix several bugs pertaining to upgrades/mem leaks.
src/mem/cache/base_cache.cc:
Fix a bug about not having a request to send
src/mem/cache/base_cache.hh:
Fix a bug with the blocking code
src/mem/cache/cache.hh:
AFix a bug with snoop hits in WB buffer
src/mem/cache/cache_impl.hh:
Fix a bug with snoop hits in WB buffer
Also, add better DPRINTF's
src/mem/cache/miss/miss_queue.cc:
Fix a bug with upgrades (Need to clean it up later)
src/mem/cache/miss/mshr.cc:
Fix a memory leak bug, still some outstanding with writebacks not being deleted
src/mem/cache/miss/mshr_queue.cc:
Fix a bug about upgrades (need to clean up later)
src/mem/packet.hh:
Fix for newly added cmd attribute for upgrades
tests/configs/memtest.py:
More interesting testcase
--HG--
extra : convert_revision : fcb4f17dd58b537bb4f67a8c835f50e455e8c688
This commit is contained in:
42
src/mem/cache/cache_impl.hh
vendored
42
src/mem/cache/cache_impl.hh
vendored
@@ -163,10 +163,8 @@ Cache(const std::string &_name,
|
||||
prefetcher->setCache(this);
|
||||
prefetcher->setTags(tags);
|
||||
prefetcher->setBuffer(missQueue);
|
||||
#if 0
|
||||
invalidatePkt = new Packet;
|
||||
invalidatePkt->cmd = Packet::InvalidateReq;
|
||||
#endif
|
||||
invalidateReq = new Request((Addr) NULL, blkSize, 0);
|
||||
invalidatePkt = new Packet(invalidateReq, Packet::InvalidateReq, 0);
|
||||
}
|
||||
|
||||
template<class TagStore, class Buffering, class Coherence>
|
||||
@@ -267,6 +265,7 @@ template<class TagStore, class Buffering, class Coherence>
|
||||
Packet *
|
||||
Cache<TagStore,Buffering,Coherence>::getPacket()
|
||||
{
|
||||
assert(missQueue->havePending());
|
||||
Packet * pkt = missQueue->getPacket();
|
||||
if (pkt) {
|
||||
if (!pkt->req->isUncacheable()) {
|
||||
@@ -292,7 +291,17 @@ Cache<TagStore,Buffering,Coherence>::sendResult(PacketPtr &pkt, MSHR* mshr, bool
|
||||
//Temp Hack for UPGRADES
|
||||
if (pkt->cmd == Packet::UpgradeReq) {
|
||||
pkt->flags &= ~CACHE_LINE_FILL;
|
||||
handleResponse(pkt);
|
||||
BlkType *blk = tags->findBlock(pkt);
|
||||
CacheBlk::State old_state = (blk) ? blk->status : 0;
|
||||
CacheBlk::State new_state = coherence->getNewState(pkt,old_state);
|
||||
DPRINTF(Cache, "Block for blk addr %x moving from state %i to %i\n",
|
||||
pkt->getAddr() & (((ULL(1))<<48)-1), old_state, new_state);
|
||||
//Set the state on the upgrade
|
||||
memcpy(pkt->getPtr<uint8_t>(), blk->data, blkSize);
|
||||
PacketList writebacks;
|
||||
tags->handleFill(blk, mshr, new_state, writebacks, pkt);
|
||||
assert(writebacks.empty());
|
||||
missQueue->handleResponse(pkt, curTick + hitLatency);
|
||||
}
|
||||
} else if (pkt && !pkt->req->isUncacheable()) {
|
||||
pkt->flags &= ~NACKED_LINE;
|
||||
@@ -402,7 +411,8 @@ Cache<TagStore,Buffering,Coherence>::snoop(Packet * &pkt)
|
||||
assert(!(pkt->flags & SATISFIED));
|
||||
pkt->flags |= SATISFIED;
|
||||
pkt->flags |= NACKED_LINE;
|
||||
warn("NACKs from devices not connected to the same bus not implemented\n");
|
||||
///@todo NACK's from other levels
|
||||
//warn("NACKs from devices not connected to the same bus not implemented\n");
|
||||
//respondToSnoop(pkt, curTick + hitLatency);
|
||||
return;
|
||||
}
|
||||
@@ -416,7 +426,7 @@ Cache<TagStore,Buffering,Coherence>::snoop(Packet * &pkt)
|
||||
//@todo Make it so that a read to a pending read can't be exclusive now.
|
||||
|
||||
//Set the address so find match works
|
||||
panic("Don't have invalidates yet\n");
|
||||
//panic("Don't have invalidates yet\n");
|
||||
invalidatePkt->addrOverride(pkt->getAddr());
|
||||
|
||||
//Append the invalidate on
|
||||
@@ -447,7 +457,7 @@ Cache<TagStore,Buffering,Coherence>::snoop(Packet * &pkt)
|
||||
pkt->flags |= SHARED_LINE;
|
||||
|
||||
assert(pkt->isRead());
|
||||
Addr offset = pkt->getAddr() & ~(blkSize - 1);
|
||||
Addr offset = pkt->getAddr() & (blkSize - 1);
|
||||
assert(offset < blkSize);
|
||||
assert(pkt->getSize() <= blkSize);
|
||||
assert(offset + pkt->getSize() <=blkSize);
|
||||
@@ -468,16 +478,16 @@ Cache<TagStore,Buffering,Coherence>::snoop(Packet * &pkt)
|
||||
CacheBlk::State new_state;
|
||||
bool satisfy = coherence->handleBusRequest(pkt,blk,mshr, new_state);
|
||||
if (satisfy) {
|
||||
DPRINTF(Cache, "Cache snooped a %s request and now supplying data,"
|
||||
DPRINTF(Cache, "Cache snooped a %s request for addr %x and now supplying data,"
|
||||
"new state is %i\n",
|
||||
pkt->cmdString(), new_state);
|
||||
pkt->cmdString(), blk_addr, new_state);
|
||||
|
||||
tags->handleSnoop(blk, new_state, pkt);
|
||||
respondToSnoop(pkt, curTick + hitLatency);
|
||||
return;
|
||||
}
|
||||
if (blk) DPRINTF(Cache, "Cache snooped a %s request, new state is %i\n",
|
||||
pkt->cmdString(), new_state);
|
||||
if (blk) DPRINTF(Cache, "Cache snooped a %s request for addr %x, new state is %i\n",
|
||||
pkt->cmdString(), blk_addr, new_state);
|
||||
tags->handleSnoop(blk, new_state);
|
||||
}
|
||||
|
||||
@@ -695,15 +705,15 @@ Cache<TagStore,Buffering,Coherence>::snoopProbe(PacketPtr &pkt)
|
||||
CacheBlk::State new_state = 0;
|
||||
bool satisfy = coherence->handleBusRequest(pkt,blk,mshr, new_state);
|
||||
if (satisfy) {
|
||||
DPRINTF(Cache, "Cache snooped a %s request and now supplying data,"
|
||||
DPRINTF(Cache, "Cache snooped a %s request for addr %x and now supplying data,"
|
||||
"new state is %i\n",
|
||||
pkt->cmdString(), new_state);
|
||||
pkt->cmdString(), blk_addr, new_state);
|
||||
|
||||
tags->handleSnoop(blk, new_state, pkt);
|
||||
return hitLatency;
|
||||
}
|
||||
if (blk) DPRINTF(Cache, "Cache snooped a %s request, new state is %i\n",
|
||||
pkt->cmdString(), new_state);
|
||||
if (blk) DPRINTF(Cache, "Cache snooped a %s request for addr %x, new state is %i\n",
|
||||
pkt->cmdString(), blk_addr, new_state);
|
||||
tags->handleSnoop(blk, new_state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user