refactor code for the packet, get rid of packet_impl.hh
[gem5.git] / src / mem / cache / cache_impl.hh
index c4acc03e7b34f34f29366d4340b2dbc0fba3e16f..ea30dbba67d7cb62b9d52426751e05e97a86f0b0 100644 (file)
@@ -585,7 +585,7 @@ Cache<TagStore,Buffering,Coherence>::probe(Packet * &pkt, bool update,
                         pkt_data = pkt->getPtr<uint8_t>() + offset;
                         write_data = target->getPtr<uint8_t>();
                         data_size = pkt->getSize() - offset;
-                        assert(data_size > pkt->getSize());
+                        assert(data_size >= pkt->getSize());
                         if (data_size > target->getSize())
                             data_size = target->getSize();
                     }
@@ -593,6 +593,8 @@ Cache<TagStore,Buffering,Coherence>::probe(Packet * &pkt, bool update,
                     if (pkt->isWrite()) {
                         memcpy(pkt_data, write_data, data_size);
                     } else {
+                        pkt->flags |= SATISFIED;
+                        pkt->result = Packet::Success;
                         memcpy(write_data, pkt_data, data_size);
                     }
                 }
@@ -618,7 +620,7 @@ Cache<TagStore,Buffering,Coherence>::probe(Packet * &pkt, bool update,
                     pkt_data = pkt->getPtr<uint8_t>() + offset;
                     write_data = write->getPtr<uint8_t>();
                     data_size = pkt->getSize() - offset;
-                    assert(data_size > pkt->getSize());
+                    assert(data_size >= pkt->getSize());
                     if (data_size > write->getSize())
                         data_size = write->getSize();
                 }
@@ -626,11 +628,19 @@ Cache<TagStore,Buffering,Coherence>::probe(Packet * &pkt, bool update,
                 if (pkt->isWrite()) {
                     memcpy(pkt_data, write_data, data_size);
                 } else {
+                    pkt->flags |= SATISFIED;
+                    pkt->result = Packet::Success;
                     memcpy(write_data, pkt_data, data_size);
                 }
 
             }
         }
+        if (pkt->isRead()
+            && pkt->result != Packet::Success
+            && otherSidePort == memSidePort) {
+            otherSidePort->sendFunctional(pkt);
+            assert(pkt->result == Packet::Success);
+        }
         return 0;
     } else if (!blk) {
         // update the cache state and statistics