Fix it so that the cache does not assume to gave the packet it sent out via sendTiming.
authorRon Dreslinski <rdreslin@umich.edu>
Tue, 17 Oct 2006 19:05:21 +0000 (15:05 -0400)
committerRon Dreslinski <rdreslin@umich.edu>
Tue, 17 Oct 2006 19:05:21 +0000 (15:05 -0400)
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

src/mem/cache/base_cache.cc
src/mem/cache/cache_impl.hh

index 938bd8786a4e4b142562bc09eed4f6492669606d..30c996d4f1daafb14b7194cafd745c7c8af6d8ab 100644 (file)
@@ -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");
index 00f93328e625ddecfc3cd91048af2fae07b28ec5..fc559195d05d41a0287b286370cb0dc6af5e6a7d 100644 (file)
@@ -273,9 +273,9 @@ void
 Cache<TagStore,Buffering,Coherence>::sendResult(PacketPtr &pkt, MSHR* mshr, bool success)
 {
     if (success && !(pkt->flags & NACKED_LINE)) {
-        missQueue->markInService(pkt, mshr);
+        missQueue->markInService(mshr->pkt, mshr);
         //Temp Hack for UPGRADES
-        if (pkt->cmd == Packet::UpgradeReq) {
+        if (mshr->pkt->cmd == Packet::UpgradeReq) {
             pkt->flags &= ~CACHE_LINE_FILL;
             BlkType *blk = tags->findBlock(pkt);
             CacheBlk::State old_state = (blk) ? blk->status : 0;
@@ -304,6 +304,8 @@ Cache<TagStore,Buffering,Coherence>::handleResponse(Packet * &pkt)
 {
     BlkType *blk = NULL;
     if (pkt->senderState) {
+        //Delete temp copy in MSHR, restore it.
+        delete ((MSHR*)pkt->senderState)->pkt;
         ((MSHR*)pkt->senderState)->pkt = pkt;
         if (pkt->result == Packet::Nacked) {
             //pkt->reinitFromRequest();