summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bardsley <Andrew.Bardsley@arm.com>2014-10-29 23:18:24 -0500
committerAndrew Bardsley <Andrew.Bardsley@arm.com>2014-10-29 23:18:24 -0500
commit536c72333f71f6e816d4b5e95e39754638bd76ea (patch)
treee154bd79e430e29dec7869f721c0b55023fd21da
parent4024fab7fc16223018a48af4a19efeec865c889b (diff)
downloadgem5-536c72333f71f6e816d4b5e95e39754638bd76ea.tar.xz
cpu: Fix barrier push to store buffer when full bug in Minor
This patch fixes a bug where a completing load or store which is also a barrier can push a barrier into the store buffer without first checking that there is a free slot. The bug was not fatal but would print a warning that the store buffer was full when inserting.
-rw-r--r--src/cpu/minor/lsq.cc10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/cpu/minor/lsq.cc b/src/cpu/minor/lsq.cc
index 0a473af89..cae0d3666 100644
--- a/src/cpu/minor/lsq.cc
+++ b/src/cpu/minor/lsq.cc
@@ -1370,9 +1370,13 @@ LSQ::findResponse(MinorDynInstPtr inst)
/* Same instruction and complete access or a store that's
* capable of being moved to the store buffer */
if (request->inst->id == inst->id) {
- if (request->isComplete() ||
- (request->state == LSQRequest::StoreToStoreBuffer &&
- storeBuffer.canInsert()))
+ bool complete = request->isComplete();
+ bool can_store = storeBuffer.canInsert();
+ bool to_store_buffer = request->state ==
+ LSQRequest::StoreToStoreBuffer;
+
+ if ((complete && !(request->isBarrier() && !can_store)) ||
+ (to_store_buffer && can_store))
{
ret = request;
}