diff options
author | Ron Dreslinski <rdreslin@umich.edu> | 2006-10-17 15:05:21 -0400 |
---|---|---|
committer | Ron Dreslinski <rdreslin@umich.edu> | 2006-10-17 15:05:21 -0400 |
commit | 288b98eb695f7ee508df523e87431181ee878d66 (patch) | |
tree | adcfa90d913616479317090d489c3f580e10df61 /src/mem/cache/base_cache.cc | |
parent | db6cc97e31c992edd53f2b519aae9e0634ffc8fc (diff) | |
download | gem5-288b98eb695f7ee508df523e87431181ee878d66.tar.xz |
Fix it so that the cache does not assume to gave the packet it sent out via sendTiming.
Still need to fix upgrades to use this path
src/mem/cache/base_cache.cc:
Copy the pkt to the MSHR before issuing the sendTiming where it may be changed/consumed
src/mem/cache/cache_impl.hh:
Use copy of packet, because sendTiming may have changed the pkt
Also, delete the copy when the time comes
--HG--
extra : convert_revision : 635cde6b4f08d010affde310c46b1caf50fbe424
Diffstat (limited to 'src/mem/cache/base_cache.cc')
-rw-r--r-- | src/mem/cache/base_cache.cc | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/mem/cache/base_cache.cc b/src/mem/cache/base_cache.cc index 938bd8786..30c996d4f 100644 --- a/src/mem/cache/base_cache.cc +++ b/src/mem/cache/base_cache.cc @@ -36,6 +36,7 @@ #include "mem/cache/base_cache.hh" #include "cpu/smt.hh" #include "cpu/base.hh" +#include "mem/cache/miss/mshr.hh" using namespace std; @@ -179,6 +180,10 @@ BaseCache::CachePort::recvRetry() } pkt = cache->getPacket(); MSHR* mshr = (MSHR*)pkt->senderState; + //Copy the packet, it may be modified/destroyed elsewhere + Packet * copyPkt = new Packet(*pkt); + copyPkt->dataStatic<uint8_t>(pkt->getPtr<uint8_t>()); + mshr->pkt = copyPkt; bool success = sendTiming(pkt); DPRINTF(Cache, "Address %x was %s in sending the timing request\n", pkt->getAddr(), success ? "succesful" : "unsuccesful"); @@ -288,6 +293,11 @@ BaseCache::CacheEvent::process() pkt = cachePort->cache->getPacket(); MSHR* mshr = (MSHR*) pkt->senderState; + //Copy the packet, it may be modified/destroyed elsewhere + Packet * copyPkt = new Packet(*pkt); + copyPkt->dataStatic<uint8_t>(pkt->getPtr<uint8_t>()); + mshr->pkt = copyPkt; + bool success = cachePort->sendTiming(pkt); DPRINTF(Cache, "Address %x was %s in sending the timing request\n", pkt->getAddr(), success ? "succesful" : "unsuccesful"); |