mem: Add packet sanity checks to cache and MSHRs
authorAndreas Hansson <andreas.hansson@arm.com>
Thu, 9 Oct 2014 21:51:56 +0000 (17:51 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Thu, 9 Oct 2014 21:51:56 +0000 (17:51 -0400)
This patch adds a number of asserts to the cache, checking basic
assumptions about packets being requests or responses.

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

index 12fb3b0f0ce4bee46eb759833018e95fed585a78..b9a9a7823ae3568f06bf975dec8ebc0eaecce89c 100644 (file)
@@ -380,7 +380,7 @@ class Cache : public BaseCache
      * are successfully sent.
      * @param pkt The request that was sent on the bus.
      */
-    void markInService(MSHR *mshr, PacketPtr pkt = 0);
+    void markInService(MSHR *mshr, PacketPtr pkt = NULL);
 
     /**
      * Return whether there are any outstanding misses.
index 5cfe7c0cfd7c7a0ddfa466b8c3536fd411eb8ab4..24e3eec15e3864583668c5fca62b71bcbf2bd9c0 100644 (file)
@@ -107,6 +107,8 @@ template<class TagStore>
 void
 Cache<TagStore>::cmpAndSwap(BlkType *blk, PacketPtr pkt)
 {
+    assert(pkt->isRequest());
+
     uint64_t overwrite_val;
     bool overwrite_mem;
     uint64_t condition_val64;
@@ -149,6 +151,8 @@ Cache<TagStore>::satisfyCpuSideRequest(PacketPtr pkt, BlkType *blk,
                                        bool deferred_response,
                                        bool pending_downgrade)
 {
+    assert(pkt->isRequest());
+
     assert(blk && blk->isValid());
     // Occasionally this is not true... if we are a lower-level cache
     // satisfying a string of Read and ReadEx requests from
@@ -247,6 +251,8 @@ template<class TagStore>
 void
 Cache<TagStore>::markInService(MSHR *mshr, PacketPtr pkt)
 {
+    // packet can be either a request or response
+
     markInServiceInternal(mshr, pkt);
 #if 0
         if (mshr->originalCmd == MemCmd::HardPFReq) {
@@ -295,6 +301,9 @@ bool
 Cache<TagStore>::access(PacketPtr pkt, BlkType *&blk,
                         Cycles &lat, PacketList &writebacks)
 {
+    // sanity check
+    assert(pkt->isRequest());
+
     DPRINTF(Cache, "%s for %s address %x size %d\n", __func__,
             pkt->cmdString(), pkt->getAddr(), pkt->getSize());
     if (pkt->req->isUncacheable()) {
@@ -1431,6 +1440,7 @@ typename Cache<TagStore>::BlkType*
 Cache<TagStore>::handleFill(PacketPtr pkt, BlkType *blk,
                             PacketList &writebacks)
 {
+    assert(pkt->isResponse());
     Addr addr = pkt->getAddr();
     bool is_secure = pkt->isSecure();
 #if TRACING_ON
@@ -1516,6 +1526,9 @@ Cache<TagStore>::
 doTimingSupplyResponse(PacketPtr req_pkt, uint8_t *blk_data,
                        bool already_copied, bool pending_inval)
 {
+    // sanity check
+    assert(req_pkt->isRequest());
+
     DPRINTF(Cache, "%s for %s address %x size %d\n", __func__,
             req_pkt->cmdString(), req_pkt->getAddr(), req_pkt->getSize());
     // timing-mode snoop responses require a new packet, unless we
index df3045a2fbfc3d033cb3e1f482d63f13d2ac44ec..79a91da2be0552090e3c276f97b677e4bb4e501c 100644 (file)
@@ -247,6 +247,8 @@ MSHR::markInService(PacketPtr pkt)
         popTarget();
         return true;
     }
+
+    assert(pkt != NULL);
     inService = true;
     pendingDirty = (targets.needsExclusive ||
                     (!pkt->sharedAsserted() && pkt->memInhibitAsserted()));