Fix getDeviceAddressRanges() to get snooping right.
authorSteve Reinhardt <stever@eecs.umich.edu>
Tue, 22 May 2007 14:30:55 +0000 (07:30 -0700)
committerSteve Reinhardt <stever@eecs.umich.edu>
Tue, 22 May 2007 14:30:55 +0000 (07:30 -0700)
--HG--
extra : convert_revision : 2aeab25ef955ab9db7b968786faff227239fbbe4

src/mem/cache/base_cache.cc
src/mem/cache/base_cache.hh
src/mem/cache/cache.hh
src/mem/cache/cache_impl.hh

index d75d35ebb47aa9c3a4ba198ab93a3a6ffef55746..a47c19e60ab35eb04431d9426709ff0917eefe65 100644 (file)
@@ -57,7 +57,6 @@ BaseCache::BaseCache(const std::string &name, Params &params)
 }
 
 
-
 void
 BaseCache::CachePort::recvStatusChange(Port::Status status)
 {
@@ -66,13 +65,6 @@ BaseCache::CachePort::recvStatusChange(Port::Status status)
     }
 }
 
-void
-BaseCache::CachePort::getDeviceAddressRanges(AddrRangeList &resp, bool &snoop)
-{
-    AddrRangeList dummy;
-    otherPort->getPeerAddressRanges(resp, dummy);
-}
-
 int
 BaseCache::CachePort::deviceBlockSize()
 {
index f7107a86afa0eadf9b865b968ac0112feb929340..a27ac1788408f39ef3e43273977291d90ec48326 100644 (file)
@@ -91,9 +91,6 @@ class BaseCache : public MemObject
 
         virtual void recvStatusChange(Status status);
 
-        virtual void getDeviceAddressRanges(AddrRangeList &resp,
-                                            bool &snoop);
-
         virtual int deviceBlockSize();
 
         bool recvRetryCommon();
index 75fb50f4ea9bb51e8bf5d2e7e71282b252129da8..e14b2efe87835dc0ffb2f434b018a2b5d5eaa319 100644 (file)
@@ -89,6 +89,9 @@ class Cache : public BaseCache
         void processRequestEvent();
         void processResponseEvent();
 
+        virtual void getDeviceAddressRanges(AddrRangeList &resp,
+                                            bool &snoop);
+
         virtual bool recvTiming(PacketPtr pkt);
 
         virtual void recvRetry();
@@ -124,6 +127,9 @@ class Cache : public BaseCache
         void processRequestEvent();
         void processResponseEvent();
 
+        virtual void getDeviceAddressRanges(AddrRangeList &resp,
+                                            bool &snoop);
+
         virtual bool recvTiming(PacketPtr pkt);
 
         virtual void recvRetry();
index 56352c110aac3cfd9eb38631ba83b614c11df818..a7f96603ed4c4bf3e441581424efb2f0f8abae0d 100644 (file)
@@ -1139,6 +1139,18 @@ Cache<TagStore,Coherence>::deletePortRefs(Port *p)
 }
 
 
+template<class TagStore, class Coherence>
+void
+Cache<TagStore,Coherence>::CpuSidePort::
+getDeviceAddressRanges(AddrRangeList &resp, bool &snoop)
+{
+    // CPU side port doesn't snoop; it's a target only.
+    bool dummy;
+    otherPort->getPeerAddressRanges(resp, dummy);
+    snoop = false;
+}
+
+
 template<class TagStore, class Coherence>
 bool
 Cache<TagStore,Coherence>::CpuSidePort::recvTiming(PacketPtr pkt)
@@ -1260,6 +1272,18 @@ Cache<TagStore,Coherence>::CpuSidePort::recvFunctional(PacketPtr pkt)
 }
 
 
+template<class TagStore, class Coherence>
+void
+Cache<TagStore,Coherence>::MemSidePort::
+getDeviceAddressRanges(AddrRangeList &resp, bool &snoop)
+{
+    // Memory-side port always snoops.
+    bool dummy;
+    otherPort->getPeerAddressRanges(resp, dummy);
+    snoop = true;
+}
+
+
 template<class TagStore, class Coherence>
 bool
 Cache<TagStore,Coherence>::MemSidePort::recvTiming(PacketPtr pkt)