// flush and invalidate any existing block
CacheBlk *old_blk(tags->findBlock(pkt->getAddr(), pkt->isSecure()));
if (old_blk && old_blk->isValid()) {
- if (old_blk->isDirty() || writebackClean)
- writebacks.push_back(writebackBlk(old_blk));
- else
- writebacks.push_back(cleanEvictBlk(old_blk));
- invalidateBlock(old_blk);
+ evictBlock(old_blk, writebacks);
}
blk = nullptr;
schedule(writebackTempBlockAtomicEvent, curTick());
}
- tempBlockWriteback = (blk->isDirty() || writebackClean) ?
- writebackBlk(blk) : cleanEvictBlk(blk);
- invalidateBlock(blk);
+ tempBlockWriteback = evictBlock(blk);
}
if (pkt->needsResponse()) {
// if we used temp block, check to see if its valid and then clear it out
if (blk == tempBlock && tempBlock->isValid()) {
- PacketPtr wb_pkt = tempBlock->isDirty() || writebackClean ?
- writebackBlk(blk) : cleanEvictBlk(blk);
- writebacks.push_back(wb_pkt);
- invalidateBlock(tempBlock);
+ evictBlock(blk, writebacks);
}
const Tick forward_time = clockEdge(forwardLatency) + pkt->headerDelay;
delete pkt;
}
+PacketPtr
+Cache::evictBlock(CacheBlk *blk)
+{
+ PacketPtr pkt = (blk->isDirty() || writebackClean) ?
+ writebackBlk(blk) : cleanEvictBlk(blk);
+
+ invalidateBlock(blk);
+
+ return pkt;
+}
+
+void
+Cache::evictBlock(CacheBlk *blk, PacketList &writebacks)
+{
+ PacketPtr pkt = evictBlock(blk);
+ if (pkt) {
+ writebacks.push_back(pkt);
+ }
+}
+
PacketPtr
Cache::writebackBlk(CacheBlk *blk)
{
if (blk->wasPrefetched()) {
unusedPrefetches++;
}
- // Will send up Writeback/CleanEvict snoops via isCachedAbove
- // when pushing this writeback list into the write buffer.
- if (blk->isDirty() || writebackClean) {
- // Save writeback packet for handling by caller
- writebacks.push_back(writebackBlk(blk));
- } else {
- writebacks.push_back(cleanEvictBlk(blk));
- }
- invalidateBlock(blk);
+ evictBlock(blk, writebacks);
replacements++;
}
}
uint32_t handleSnoop(PacketPtr pkt, CacheBlk *blk,
bool is_timing, bool is_deferred, bool pending_inval);
+ /**
+ * Evict a cache block.
+ *
+ * Performs a writeback if necesssary and invalidates the block
+ *
+ * @param blk Block to invalidate
+ * @return A packet with the writeback, can be nullptr
+ */
+ M5_NODISCARD virtual PacketPtr evictBlock(CacheBlk *blk);
+
+ /**
+ * Evict a cache block.
+ *
+ * Performs a writeback if necesssary and invalidates the block
+ *
+ * @param blk Block to invalidate
+ * @param writebacks Return a list of packets with writebacks
+ */
+ virtual void evictBlock(CacheBlk *blk, PacketList &writebacks);
+
/**
* Create a writeback request for the given block.
* @param blk The block to writeback.