diff options
author | Andrew Bardsley <Andrew.Bardsley@arm.com> | 2014-09-12 10:22:49 -0400 |
---|---|---|
committer | Andrew Bardsley <Andrew.Bardsley@arm.com> | 2014-09-12 10:22:49 -0400 |
commit | 1a45a8c5d3527f0d96c48e176073d39413b4f990 (patch) | |
tree | 4a75f497aec8b6c5d8c7ceb7c17a60b833db4b8c | |
parent | c8b919aba27a41adb7f75aeace358e4d31c47b76 (diff) | |
download | gem5-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.cc | 4 | ||||
-rw-r--r-- | src/cpu/minor/lsq.hh | 6 |
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 */ |