diff --git a/src/mem/cache/prefetch/base.cc b/src/mem/cache/prefetch/base.cc index 8614a7739b..8ecc715e89 100644 --- a/src/mem/cache/prefetch/base.cc +++ b/src/mem/cache/prefetch/base.cc @@ -92,6 +92,13 @@ Base::PrefetchListener::notify(const CacheAccessProbeArg &arg) } } +void +Base::PrefetchEvictListener::notify(const EvictionInfo &info) +{ + if (info.newData.empty()) + parent.notifyEvict(info); +} + Base::Base(const BasePrefetcherParams &p) : ClockedObject(p), listeners(), system(nullptr), probeManager(nullptr), blkSize(p.block_size), lBlkSize(floorLog2(blkSize)), @@ -274,6 +281,8 @@ Base::regProbeListeners() "Fill", true, false)); listeners.push_back(new PrefetchListener(*this, probeManager, "Hit", false, false)); + listeners.push_back(new PrefetchEvictListener(*this, probeManager, + "Data Update")); } } diff --git a/src/mem/cache/prefetch/base.hh b/src/mem/cache/prefetch/base.hh index a30e473505..f4d5cb051b 100644 --- a/src/mem/cache/prefetch/base.hh +++ b/src/mem/cache/prefetch/base.hh @@ -86,7 +86,20 @@ class Base : public ClockedObject const bool miss; }; - std::vector listeners; + using EvictionInfo = CacheDataUpdateProbeArg; + + class PrefetchEvictListener : public ProbeListenerArgBase + { + public: + PrefetchEvictListener(Base &_parent, ProbeManager *pm, + const std::string &name) + : ProbeListenerArgBase(pm, name), parent(_parent) {} + void notify(const EvictionInfo &info) override; + protected: + Base &parent; + }; + + std::vector listeners; public: @@ -381,6 +394,10 @@ class Base : public ClockedObject virtual void notifyFill(const CacheAccessProbeArg &acc) {} + /** Notify prefetcher of cache eviction */ + virtual void notifyEvict(const EvictionInfo &info) + {} + virtual PacketPtr getPacket() = 0; virtual Tick nextPrefetchReadyTime() const = 0;