fa_lru.hh revision 7612:917946898102
1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Erik Hallnor 29 */ 30 31/** 32 * @file 33 * Declaration of a fully associative LRU tag store. 34 */ 35 36#ifndef __MEM_CACHE_TAGS_FA_LRU_HH__ 37#define __MEM_CACHE_TAGS_FA_LRU_HH__ 38 39#include <list> 40 41#include "base/hashmap.hh" 42#include "mem/cache/blk.hh" 43#include "mem/cache/tags/base.hh" 44#include "mem/packet.hh" 45 46/** 47 * A fully associative cache block. 48 */ 49class FALRUBlk : public CacheBlk 50{ 51public: 52 /** The previous block in LRU order. */ 53 FALRUBlk *prev; 54 /** The next block in LRU order. */ 55 FALRUBlk *next; 56 /** Has this block been touched? */ 57 bool isTouched; 58 59 /** 60 * A bit mask of the sizes of cache that this block is resident in. 61 * Each bit represents a power of 2 in MB size cache. 62 * If bit 0 is set, this block is in a 1MB cache 63 * If bit 2 is set, this block is in a 4MB cache, etc. 64 * There is one bit for each cache smaller than the full size (default 65 * 16MB). 66 */ 67 int inCache; 68}; 69 70/** 71 * A fully associative LRU cache. Keeps statistics for accesses to a number of 72 * cache sizes at once. 73 */ 74class FALRU : public BaseTags 75{ 76 public: 77 /** Typedef the block type used in this class. */ 78 typedef FALRUBlk BlkType; 79 /** Typedef a list of pointers to the local block type. */ 80 typedef std::list<FALRUBlk*> BlkList; 81 82 protected: 83 /** The block size of the cache. */ 84 const unsigned blkSize; 85 /** The size of the cache. */ 86 const unsigned size; 87 /** The hit latency of the cache. */ 88 const unsigned hitLatency; 89 90 /** Array of pointers to blocks at the cache size boundaries. */ 91 FALRUBlk **cacheBoundaries; 92 /** A mask for the FALRUBlk::inCache bits. */ 93 int cacheMask; 94 /** The number of different size caches being tracked. */ 95 unsigned numCaches; 96 97 /** The cache blocks. */ 98 FALRUBlk *blks; 99 100 /** The MRU block. */ 101 FALRUBlk *head; 102 /** The LRU block. */ 103 FALRUBlk *tail; 104 105 /** Hash table type mapping addresses to cache block pointers. */ 106 typedef m5::hash_map<Addr, FALRUBlk *, m5::hash<Addr> > hash_t; 107 /** Iterator into the address hash table. */ 108 typedef hash_t::const_iterator tagIterator; 109 110 /** The address hash table. */ 111 hash_t tagHash; 112 113 /** 114 * Find the cache block for the given address. 115 * @param addr The address to find. 116 * @return The cache block of the address, if any. 117 */ 118 FALRUBlk * hashLookup(Addr addr) const; 119 120 /** 121 * Move a cache block to the MRU position. 122 * @param blk The block to promote. 123 */ 124 void moveToHead(FALRUBlk *blk); 125 126 /** 127 * Check to make sure all the cache boundaries are still where they should 128 * be. Used for debugging. 129 * @return True if everything is correct. 130 */ 131 bool check(); 132 133 /** 134 * @defgroup FALRUStats Fully Associative LRU specific statistics 135 * The FA lru stack lets us track multiple cache sizes at once. These 136 * statistics track the hits and misses for different cache sizes. 137 * @{ 138 */ 139 140 /** Hits in each cache size >= 128K. */ 141 Stats::Vector hits; 142 /** Misses in each cache size >= 128K. */ 143 Stats::Vector misses; 144 /** Total number of accesses. */ 145 Stats::Scalar accesses; 146 147 /** 148 * @} 149 */ 150 151public: 152 /** 153 * Construct and initialize this cache tagstore. 154 * @param blkSize The block size of the cache. 155 * @param size The size of the cache. 156 * @param hit_latency The hit latency of the cache. 157 */ 158 FALRU(unsigned blkSize, unsigned size, unsigned hit_latency); 159 160 /** 161 * Register the stats for this object. 162 * @param name The name to prepend to the stats name. 163 */ 164 void regStats(const std::string &name); 165 166 /** 167 * Invalidate a cache block. 168 * @param blk The block to invalidate. 169 */ 170 void invalidateBlk(BlkType *blk); 171 172 /** 173 * Access block and update replacement data. May not succeed, in which case 174 * NULL pointer is returned. This has all the implications of a cache 175 * access and should only be used as such. 176 * Returns the access latency and inCache flags as a side effect. 177 * @param addr The address to look for. 178 * @param asid The address space ID. 179 * @param lat The latency of the access. 180 * @param inCache The FALRUBlk::inCache flags. 181 * @return Pointer to the cache block. 182 */ 183 FALRUBlk* accessBlock(Addr addr, int &lat, int context_src, int *inCache = 0); 184 185 /** 186 * Find the block in the cache, do not update the replacement data. 187 * @param addr The address to look for. 188 * @param asid The address space ID. 189 * @return Pointer to the cache block. 190 */ 191 FALRUBlk* findBlock(Addr addr) const; 192 193 /** 194 * Find a replacement block for the address provided. 195 * @param pkt The request to a find a replacement candidate for. 196 * @param writebacks List for any writebacks to be performed. 197 * @return The block to place the replacement in. 198 */ 199 FALRUBlk* findVictim(Addr addr, PacketList & writebacks); 200 201 void insertBlock(Addr addr, BlkType *blk, int context_src); 202 203 /** 204 * Return the hit latency of this cache. 205 * @return The hit latency. 206 */ 207 int getHitLatency() const 208 { 209 return hitLatency; 210 } 211 212 /** 213 * Return the block size of this cache. 214 * @return The block size. 215 */ 216 unsigned 217 getBlockSize() const 218 { 219 return blkSize; 220 } 221 222 /** 223 * Return the subblock size of this cache, always the block size. 224 * @return The block size. 225 */ 226 unsigned 227 getSubBlockSize() const 228 { 229 return blkSize; 230 } 231 232 /** 233 * Align an address to the block size. 234 * @param addr the address to align. 235 * @return The aligned address. 236 */ 237 Addr blkAlign(Addr addr) const 238 { 239 return (addr & ~(Addr)(blkSize-1)); 240 } 241 242 /** 243 * Generate the tag from the addres. For fully associative this is just the 244 * block address. 245 * @param addr The address to get the tag from. 246 * @return The tag. 247 */ 248 Addr extractTag(Addr addr) const 249 { 250 return blkAlign(addr); 251 } 252 253 /** 254 * Return the set of an address. Only one set in a fully associative cache. 255 * @param addr The address to get the set from. 256 * @return 0. 257 */ 258 int extractSet(Addr addr) const 259 { 260 return 0; 261 } 262 263 /** 264 * Calculate the block offset of an address. 265 * @param addr the address to get the offset of. 266 * @return the block offset. 267 */ 268 int extractBlkOffset(Addr addr) const 269 { 270 return (addr & (Addr)(blkSize-1)); 271 } 272 273 /** 274 * Regenerate the block address from the tag and the set. 275 * @param tag The tag of the block. 276 * @param set The set the block belongs to. 277 * @return the block address. 278 */ 279 Addr regenerateBlkAddr(Addr tag, int set) const 280 { 281 return (tag); 282 } 283 284 /** 285 *iterated through all blocks and clear all locks 286 *Needed to clear all lock tracking at once 287 */ 288 virtual void clearLocks(); 289}; 290 291#endif // __MEM_CACHE_TAGS_FA_LRU_HH__ 292