}
 
 
-
 void
 BaseCache::CachePort::recvStatusChange(Port::Status status)
 {
     }
 }
 
-void
-BaseCache::CachePort::getDeviceAddressRanges(AddrRangeList &resp, bool &snoop)
-{
-    AddrRangeList dummy;
-    otherPort->getPeerAddressRanges(resp, dummy);
-}
-
 int
 BaseCache::CachePort::deviceBlockSize()
 {
 
 
         virtual void recvStatusChange(Status status);
 
-        virtual void getDeviceAddressRanges(AddrRangeList &resp,
-                                            bool &snoop);
-
         virtual int deviceBlockSize();
 
         bool recvRetryCommon();
 
         void processRequestEvent();
         void processResponseEvent();
 
+        virtual void getDeviceAddressRanges(AddrRangeList &resp,
+                                            bool &snoop);
+
         virtual bool recvTiming(PacketPtr pkt);
 
         virtual void recvRetry();
         void processRequestEvent();
         void processResponseEvent();
 
+        virtual void getDeviceAddressRanges(AddrRangeList &resp,
+                                            bool &snoop);
+
         virtual bool recvTiming(PacketPtr pkt);
 
         virtual void recvRetry();
 
 }
 
 
+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)
 }
 
 
+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)