MCPcopy Create free account
hub / github.com/LPC4/Full-Stack / flush_and_invalidate

Method flush_and_invalidate

crates/virtual-machine/src/memory/cache.rs:95–118  ·  view source on GitHub ↗

Flush all dirty lines to the next level, then invalidate everything.

(&mut self)

Source from the content-addressed store, hash-verified

93 let (need_flush, tag) = {
94 let line = &self.sets[set_idx].ways[way_idx];
95 (line.valid && line.dirty, line.tag)
96 };
97 if need_flush {
98 let data = self.sets[set_idx].ways[way_idx].data.clone();
99 let base = self.line_base_address(tag, set_idx as u64);
100 for (i, &byte) in data.iter().enumerate() {
101 let _ = self.next.write_byte(base + i as u64, byte);
102 }
103 }
104 let line = &mut self.sets[set_idx].ways[way_idx];
105 line.valid = false;
106 line.dirty = false;
107 line.tag = 0;
108 line.lru_age = 0;
109 }
110 }
111 self.stats = CacheStats::default();
112 self.access_tick = 0;
113 }
114
115 fn address_fields(&self, addr: u64) -> (u64, u64, u64) {
116 let tag = addr >> (self.block_bits + self.set_bits);
117 let index = (addr >> self.block_bits) & ((1u64 << self.set_bits) - 1);
118 let offset = addr & ((1u64 << self.block_bits) - 1);
119 (tag, index, offset)
120 }
121

Callers 1

cold_cache_resetMethod · 0.80

Calls 3

line_base_addressMethod · 0.80
cloneMethod · 0.45
write_byteMethod · 0.45

Tested by

no test coverage detected