diff options
-rw-r--r-- | src/mem/cache/base.cc | 22 | ||||
-rw-r--r-- | src/mem/cache/base.hh | 8 |
2 files changed, 17 insertions, 13 deletions
diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc index a5ad07d6c..e43c3d920 100644 --- a/src/mem/cache/base.cc +++ b/src/mem/cache/base.cc @@ -970,13 +970,12 @@ BaseCache::access(PacketPtr pkt, CacheBlk *&blk, Cycles &lat, if (!blk) { // need to do a replacement - blk = allocateBlock(pkt->getAddr(), pkt->isSecure(), writebacks); + blk = allocateBlock(pkt, writebacks); if (!blk) { // no replaceable block available: give up, fwd to next level. incMissCount(pkt); return false; } - tags->insertBlock(pkt, blk); blk->status |= (BlkValid | BlkReadable); } @@ -1028,15 +1027,13 @@ BaseCache::access(PacketPtr pkt, CacheBlk *&blk, Cycles &lat, return false; } else { // a writeback that misses needs to allocate a new block - blk = allocateBlock(pkt->getAddr(), pkt->isSecure(), - writebacks); + blk = allocateBlock(pkt, writebacks); if (!blk) { // no replaceable block available: give up, fwd to // next level. incMissCount(pkt); return false; } - tags->insertBlock(pkt, blk); blk->status |= (BlkValid | BlkReadable); } @@ -1124,7 +1121,7 @@ BaseCache::handleFill(PacketPtr pkt, CacheBlk *blk, PacketList &writebacks, // need to do a replacement if allocating, otherwise we stick // with the temporary storage - blk = allocate ? allocateBlock(addr, is_secure, writebacks) : nullptr; + blk = allocate ? allocateBlock(pkt, writebacks) : nullptr; if (!blk) { // No replaceable block or a mostly exclusive @@ -1135,8 +1132,6 @@ BaseCache::handleFill(PacketPtr pkt, CacheBlk *blk, PacketList &writebacks, tempBlock->insert(addr, is_secure); DPRINTF(Cache, "using temp block for %#llx (%s)\n", addr, is_secure ? "s" : "ns"); - } else { - tags->insertBlock(pkt, blk); } // we should never be overwriting a valid block @@ -1205,8 +1200,14 @@ BaseCache::handleFill(PacketPtr pkt, CacheBlk *blk, PacketList &writebacks, } CacheBlk* -BaseCache::allocateBlock(Addr addr, bool is_secure, PacketList &writebacks) +BaseCache::allocateBlock(const PacketPtr pkt, PacketList &writebacks) { + // Get address + const Addr addr = pkt->getAddr(); + + // Get secure bit + const bool is_secure = pkt->isSecure(); + // Find replacement victim std::vector<CacheBlk*> evict_blks; CacheBlk *victim = tags->findVictim(addr, is_secure, evict_blks); @@ -1257,6 +1258,9 @@ BaseCache::allocateBlock(Addr addr, bool is_secure, PacketList &writebacks) } } + // Insert new block at victimized entry + tags->insertBlock(pkt, victim); + return victim; } diff --git a/src/mem/cache/base.hh b/src/mem/cache/base.hh index 6600aeba6..4ba256b95 100644 --- a/src/mem/cache/base.hh +++ b/src/mem/cache/base.hh @@ -659,14 +659,14 @@ class BaseCache : public MemObject * * Find a victim block and if necessary prepare writebacks for any * existing data. May return nullptr if there are no replaceable - * blocks. + * blocks. If a replaceable block is found, it inserts the new block in + * its place. The new block, however, is not set as valid yet. * - * @param addr Physical address of the new block - * @param is_secure Set if the block should be secure + * @param pkt Packet holding the address to update * @param writebacks A list of writeback packets for the evicted blocks * @return the allocated block */ - CacheBlk *allocateBlock(Addr addr, bool is_secure, PacketList &writebacks); + CacheBlk *allocateBlock(const PacketPtr pkt, PacketList &writebacks); /** * Evict a cache block. * |