Cache: Fix the LRU policy for classic memory hierarchy
[gem5.git] / src / mem / cache / tags / lru.hh
index 7b6e95e846d4d3453846d7c26f984f62d62c6547..4eb66b708d043d8a0e32041ef9a65c7478eb9c0e 100644 (file)
  * Declaration of a LRU tag store.
  */
 
-#ifndef __LRU_HH__
-#define __LRU_HH__
+#ifndef __MEM_CACHE_TAGS_LRU_HH__
+#define __MEM_CACHE_TAGS_LRU_HH__
 
+#include <cassert>
 #include <cstring>
 #include <list>
 
-#include "mem/cache/blk.hh" // base class
-#include "mem/packet.hh" // for inlined functions
-#include <assert.h>
 #include "mem/cache/tags/base.hh"
+#include "mem/cache/blk.hh"
+#include "mem/packet.hh"
 
 class BaseCache;
+class CacheSet;
 
-/**
- * LRU cache block.
- */
-class LRUBlk : public CacheBlk {
-  public:
-    /** Has this block been touched? Used to aid calculation of warmup time. */
-    bool isTouched;
-};
-
-/**
- * An associative set of cache blocks.
- */
-class CacheSet
-{
-  public:
-    /** The associativity of this set. */
-    int assoc;
-
-    /** Cache blocks in this set, maintained in LRU order 0 = MRU. */
-    LRUBlk **blks;
-
-    /**
-     * Find a block matching the tag in this set.
-     * @param asid The address space ID.
-     * @param tag The Tag to find.
-     * @return Pointer to the block if found.
-     */
-    LRUBlk* findBlk(Addr tag) const;
-
-    /**
-     * Move the given block to the head of the list.
-     * @param blk The block to move.
-     */
-    void moveToHead(LRUBlk *blk);
-};
 
 /**
  * A LRU cache tag store.
@@ -89,24 +55,25 @@ class LRU : public BaseTags
 {
   public:
     /** Typedef the block type used in this tag store. */
-    typedef LRUBlk BlkType;
+    typedef CacheBlk BlkType;
     /** Typedef for a list of pointers to the local block class. */
-    typedef std::list<LRUBlk*> BlkList;
+    typedef std::list<BlkType*> BlkList;
+
   protected:
     /** The number of sets in the cache. */
-    const int numSets;
+    const unsigned numSets;
     /** The number of bytes in a block. */
-    const int blkSize;
+    const unsigned blkSize;
     /** The associativity of the cache. */
-    const int assoc;
+    const unsigned assoc;
     /** The hit latency. */
-    const int hitLatency;
+    const unsigned hitLatency;
 
     /** The cache sets. */
     CacheSet *sets;
 
     /** The cache blocks. */
-    LRUBlk *blks;
+    BlkType *blks;
     /** The data blocks, 1 per cache block. */
     uint8_t *dataBlks;
 
@@ -127,7 +94,8 @@ public:
      * @param _assoc The associativity of the cache.
      * @param _hit_latency The latency in cycles for a hit.
      */
-    LRU(int _numSets, int _blkSize,     int _assoc, int _hit_latency);
+    LRU(unsigned _numSets, unsigned _blkSize, unsigned _assoc,
+        unsigned _hit_latency);
 
     /**
      * Destructor
@@ -138,7 +106,8 @@ public:
      * Return the block size.
      * @return the block size.
      */
-    int getBlockSize()
+    unsigned
+    getBlockSize() const
     {
         return blkSize;
     }
@@ -148,7 +117,8 @@ public:
      * size.
      * @return The block size.
      */
-    int getSubBlockSize()
+    unsigned
+    getSubBlockSize() const
     {
         return blkSize;
     }
@@ -168,7 +138,7 @@ public:
      * @param lat The access latency.
      * @return Pointer to the cache block if found.
      */
-    LRUBlk* accessBlock(Addr addr, int &lat);
+    BlkType* accessBlock(Addr addr, int &lat, int context_src);
 
     /**
      * Finds the given address in the cache, do not update replacement data.
@@ -177,7 +147,7 @@ public:
      * @param asid The address space ID.
      * @return Pointer to the cache block if found.
      */
-    LRUBlk* findBlock(Addr addr) const;
+    BlkType* findBlock(Addr addr) const;
 
     /**
      * Find a block to evict for the address provided.
@@ -185,7 +155,7 @@ public:
      * @param writebacks List for any writebacks to be performed.
      * @return The candidate block.
      */
-    LRUBlk* findVictim(Addr addr, PacketList &writebacks);
+    BlkType* findVictim(Addr addr, PacketList &writebacks);
 
     /**
      * Insert the new block into the cache.  For LRU this means inserting into
@@ -193,7 +163,7 @@ public:
      * @param addr The address to update.
      * @param blk The block to update.
      */
-     void insertBlock(Addr addr, BlkType *blk);
+     void insertBlock(Addr addr, BlkType *blk, int context_src);
 
     /**
      * Generate the tag from the given address.
@@ -254,6 +224,11 @@ public:
     {
         return hitLatency;
     }
+    /**
+     *iterated through all blocks and clear all locks
+     *Needed to clear all lock tracking at once
+     */
+    virtual void clearLocks();
 
     /**
      * Called at end of simulation to complete average block reference stats.
@@ -261,4 +236,4 @@ public:
     virtual void cleanupRefs();
 };
 
-#endif
+#endif // __MEM_CACHE_TAGS_LRU_HH__