From 73a1c6f06224a7e892c90186ff15567e11ced31c Mon Sep 17 00:00:00 2001
From: David Li 
Date: Tue, 12 Jan 2016 09:07:06 -0700
Subject: Update secondary cache (if applicable) on write
---
 src/shareable_cache.rs | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
(limited to 'src')
diff --git a/src/shareable_cache.rs b/src/shareable_cache.rs
index 9f558cd..9e0725a 100644
--- a/src/shareable_cache.rs
+++ b/src/shareable_cache.rs
@@ -45,6 +45,16 @@ impl<'a> ShareableCache<'a> {
 
         (primary_accessible, secondary_accessible)
     }
+
+    fn snoop(cache: &mut SharedMemory<'a>,
+             address: isa::Address, value: isa::Word) {
+        // Cache snooping: update all cache lines when a write is made
+        if cache.borrow().is_address_accessible(address) {
+            // Depends on invariant: write_word completes instantly
+            // when the address is accessible (in-cache)
+            cache.borrow_mut().write_word(address, value);
+        }
+    }
 }
 
 impl<'a> MemoryInterface for ShareableCache<'a> {
@@ -97,22 +107,27 @@ impl<'a> MemoryInterface for ShareableCache<'a> {
                 self.address_accessible(address);
 
             if primary_accessible {
+                ShareableCache::snoop(&mut self.secondary, address, value);
                 self.primary.borrow_mut().write_word(address, value)
             }
             else if secondary_accessible {
+                ShareableCache::snoop(&mut self.primary, address, value);
                 self.secondary.borrow_mut().write_word(address, value)
             }
             else {
                 self.use_secondary = !self.use_secondary;
                 if self.use_secondary {
+                    ShareableCache::snoop(&mut self.primary, address, value);
                     self.secondary.borrow_mut().write_word(address, value)
                 }
                 else {
+                    ShareableCache::snoop(&mut self.secondary, address, value);
                     self.primary.borrow_mut().write_word(address, value)
                 }
             }
         }
         else {
+            ShareableCache::snoop(&mut self.secondary, address, value);
             self.primary.borrow_mut().write_word(address, value)
         }
     }
-- 
cgit v1.2.3