mem-cache: Fix FALRU data block seg fault
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Thu, 22 Mar 2018 10:24:54 +0000 (11:24 +0100)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Fri, 30 Mar 2018 18:41:11 +0000 (18:41 +0000)
FALRU didn't initialize the blocks' data, causing seg faults.
This patch does not make FALRU functional yet.

Change-Id: I10cbcf5afc3f8bc357eeb8b7cb46789dec47ba8b
Reviewed-on: https://gem5-review.googlesource.com/9302
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>

src/mem/cache/tags/base.cc
src/mem/cache/tags/base.hh
src/mem/cache/tags/base_set_assoc.cc
src/mem/cache/tags/base_set_assoc.hh
src/mem/cache/tags/fa_lru.cc

index 8b52b746eaa2809080b0acba1331219a8acd15fd..d2d6e8eef389369bb3d1597a0b33feaa74d031e0 100644 (file)
@@ -63,7 +63,8 @@ BaseTags::BaseTags(const Params *p)
                     std::max(p->tag_latency, p->data_latency)),
       cache(nullptr),
       warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)),
-      warmedUp(false), numBlocks(p->size / p->block_size)
+      warmedUp(false), numBlocks(p->size / p->block_size),
+      dataBlks(new uint8_t[p->size]) // Allocate data storage in one big chunk
 {
 }
 
index 74fc7e0d0914464812d402b4cf7baaf830fe3958..3370de284b898d418115c7b61308e0283ad59cee 100644 (file)
@@ -94,6 +94,9 @@ class BaseTags : public ClockedObject
     /** the number of blocks in the cache */
     const unsigned numBlocks;
 
+    /** The data blocks, 1 per cache block. */
+    std::unique_ptr<uint8_t[]> dataBlks;
+
     // Statistics
     /**
      * TODO: It would be good if these stats were acquired after warmup.
index 2475e6fc01bdd7361615d5dcffcd5ec4d06a5041..0ab806ee95ef03467c8ae6c19eeecc7e3dc46ad1 100644 (file)
@@ -57,7 +57,6 @@ using namespace std;
 BaseSetAssoc::BaseSetAssoc(const Params *p)
     :BaseTags(p), assoc(p->assoc), allocAssoc(p->assoc),
      blks(p->size / p->block_size),
-     dataBlks(new uint8_t[p->size]), // Allocate data storage in one big chunk
      numSets(p->size / (p->block_size * p->assoc)),
      sequentialAccess(p->sequential_access),
      sets(p->size / (p->block_size * p->assoc)),
index f7b386a92ed83413601768b49fb0df5ff59c3866..3bc275b281191036004ea3ad42d8f82b62e79fc9 100644 (file)
@@ -76,7 +76,6 @@ class BaseSetAssoc : public BaseTags
     /** Typedef the set type used in this tag store. */
     typedef CacheSet<CacheBlk> SetType;
 
-
   protected:
     /** The associativity of the cache. */
     const unsigned assoc;
@@ -85,8 +84,6 @@ class BaseSetAssoc : public BaseTags
 
     /** The cache blocks. */
     std::vector<BlkType> blks;
-    /** The data blocks, 1 per cache block. */
-    std::unique_ptr<uint8_t[]> dataBlks;
 
     /** The number of sets in the cache. */
     const unsigned numSets;
index a38d0bf341966935c574e0df1f0a356b4d912b69..1f2909e31c3d0fdc632449d3665da3723ff73f0a 100644 (file)
@@ -80,10 +80,12 @@ FALRU::FALRU(const Params *p)
     head->prev = nullptr;
     head->next = &(blks[1]);
     head->inCache = cacheMask;
+    head->data = &dataBlks[0];
 
     tail->prev = &(blks[numBlocks-2]);
     tail->next = nullptr;
     tail->inCache = 0;
+    tail->data = &dataBlks[(numBlocks-1)*blkSize];
 
     unsigned index = (1 << 17) / blkSize;
     unsigned j = 0;
@@ -100,6 +102,9 @@ FALRU::FALRU(const Params *p)
         blks[i].next = &(blks[i+1]);
         blks[i].set = 0;
         blks[i].way = i;
+
+        // Associate a data chunk to the block
+        blks[i].data = &dataBlks[blkSize*i];
     }
     assert(j == numCaches);
     assert(index == numBlocks);