summaryrefslogtreecommitdiff
path: root/src/mem
diff options
context:
space:
mode:
authorStephan Diestelhorst <stephan.diestelhorst@arm.com>2015-02-16 03:34:47 -0500
committerStephan Diestelhorst <stephan.diestelhorst@arm.com>2015-02-16 03:34:47 -0500
commit93fa8e3cd4033e42869cc4f024e9ad8c8c9427e4 (patch)
tree41c755e316c6643deb0872813900c0e698d12c96 /src/mem
parent661dac1598183f13d83435aa2f8ccf317284a055 (diff)
downloadgem5-93fa8e3cd4033e42869cc4f024e9ad8c8c9427e4.tar.xz
mem: Fix initial value problem with MemChecker
In highly loaded cases, reads might actually overlap with writes to the initial memory state. The mem checker needs to detect such cases and permit the read reading either from the writes (what it is doing now) or read from the initial, unknown value. This patch adds this logic.
Diffstat (limited to 'src/mem')
-rw-r--r--src/mem/mem_checker.cc11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/mem/mem_checker.cc b/src/mem/mem_checker.cc
index 0b8073660..dba4b5025 100644
--- a/src/mem/mem_checker.cc
+++ b/src/mem/mem_checker.cc
@@ -195,6 +195,17 @@ MemChecker::ByteTracker::inExpectedData(Tick start, Tick complete, uint8_t data)
}
// Record non-matching, but possible value
_lastExpectedData.push_back(last_obs.data);
+ } else {
+ // We have not seen any valid observation, and the only writes
+ // observed are overlapping, so anything (in particular the
+ // initialisation value) goes
+ // NOTE: We can overlap with multiple write clusters, here
+ if (!writeClusters.empty() && wc_overlap) {
+ // ensure that all write clusters really overlap this read
+ assert(writeClusters.begin()->start < complete &&
+ writeClusters.rbegin()->complete > start);
+ return true;
+ }
}
if (_lastExpectedData.empty()) {