summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bardsley <Andrew.Bardsley@arm.com>2014-09-12 10:22:49 -0400
committerAndrew Bardsley <Andrew.Bardsley@arm.com>2014-09-12 10:22:49 -0400
commit1a45a8c5d3527f0d96c48e176073d39413b4f990 (patch)
tree4a75f497aec8b6c5d8c7ceb7c17a60b833db4b8c
parentc8b919aba27a41adb7f75aeace358e4d31c47b76 (diff)
downloadgem5-1a45a8c5d3527f0d96c48e176073d39413b4f990.tar.xz
cpu: Fix memory access in Minor not setting parent Request flags
This patch fixes cases where uncacheable/memory type flags are not set correctly on a memory op which is split in the LSQ. Without this patch, request->request if freely used to check flags where the flags should actually come from the accumulation of request fragment flags. This patch also fixes a bug where an uncacheable access which passes through tryToSendRequest more than once can increment LSQ::numAccessesInMemorySystem more than once.
-rw-r--r--src/cpu/minor/lsq.cc4
-rw-r--r--src/cpu/minor/lsq.hh6
2 files changed, 8 insertions, 2 deletions
diff --git a/src/cpu/minor/lsq.cc b/src/cpu/minor/lsq.cc
index c5e38c78d..b05ae514c 100644
--- a/src/cpu/minor/lsq.cc
+++ b/src/cpu/minor/lsq.cc
@@ -476,6 +476,8 @@ LSQ::SplitDataRequest::makeFragmentPackets()
makePacketForRequest(*fragment, isLoad, this, request_data);
fragmentPackets.push_back(fragment_packet);
+ /* Accumulate flags in parent request */
+ request.setFlags(fragment->getFlags());
}
/* Might as well make the overall/response packet here */
@@ -1029,7 +1031,7 @@ LSQ::tryToSendToTransfers(LSQRequestPtr request)
/* Remember if this is an access which can't be idly
* discarded by an interrupt */
- if (!bufferable) {
+ if (!bufferable && !request->issuedToMemory) {
numAccessesIssuedToMemory++;
request->issuedToMemory = true;
}
diff --git a/src/cpu/minor/lsq.hh b/src/cpu/minor/lsq.hh
index 0998395e0..183986826 100644
--- a/src/cpu/minor/lsq.hh
+++ b/src/cpu/minor/lsq.hh
@@ -585,7 +585,11 @@ class LSQ : public Named
protected:
/** Count of the number of mem. accesses which have left the
- * requests queue and are in the 'wild' in the memory system. */
+ * requests queue and are in the 'wild' in the memory system and who
+ * *must not* be interrupted as they are not normal cacheable
+ * accesses. This is a count of the number of in-flight requests
+ * with issuedToMemory set who have visited tryToSendRequest at least
+ * once */
unsigned int numAccessesInMemorySystem;
/** Number of requests in the DTLB in the requests queue */