1/* 2 * Copyright (c) 2012-2014 ARM Limited 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 42 unchanged lines hidden (view full) --- 51 52#include "base/intmath.hh" 53#include "sim/core.hh" 54 55using namespace std; 56 57BaseSetAssoc::BaseSetAssoc(const Params *p) 58 :BaseTags(p), assoc(p->assoc), allocAssoc(p->assoc), |
59 blks(p->size / p->block_size), 60 dataBlks(new uint8_t[p->size]), // Allocate data storage in one big chunk |
61 numSets(p->size / (p->block_size * p->assoc)), |
62 sequentialAccess(p->sequential_access), 63 sets(p->size / (p->block_size * p->assoc)) |
64{ 65 // Check parameters 66 if (blkSize < 4 || !isPowerOf2(blkSize)) { 67 fatal("Block size must be at least 4 and a power of 2"); 68 } 69 if (!isPowerOf2(numSets)) { 70 fatal("# of sets must be non-zero and a power of 2"); 71 } 72 if (assoc <= 0) { 73 fatal("associativity must be greater than zero"); 74 } 75 76 setShift = floorLog2(blkSize); 77 setMask = numSets - 1; 78 tagShift = setShift + floorLog2(numSets); 79 |
80 unsigned blkIndex = 0; // index into blks array 81 for (unsigned i = 0; i < numSets; ++i) { 82 sets[i].assoc = assoc; 83 84 sets[i].blks.resize(assoc); 85 86 // link in the data blocks 87 for (unsigned j = 0; j < assoc; ++j) { --- 14 unchanged lines hidden (view full) --- 102 blk->isTouched = false; 103 sets[i].blks[j]=blk; 104 blk->set = i; 105 blk->way = j; 106 } 107 } 108} 109 |
110CacheBlk* 111BaseSetAssoc::findBlock(Addr addr, bool is_secure) const 112{ 113 Addr tag = extractTag(addr); 114 unsigned set = extractSet(addr); 115 BlkType *blk = sets[set].findBlk(tag, is_secure); 116 return blk; 117} --- 68 unchanged lines hidden --- |