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.
This commit is contained in:
parent
c8b919aba2
commit
1a45a8c5d3
2 changed files with 8 additions and 2 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue