diff options
author | Andrew Bardsley <Andrew.Bardsley@arm.com> | 2014-10-29 23:18:24 -0500 |
---|---|---|
committer | Andrew Bardsley <Andrew.Bardsley@arm.com> | 2014-10-29 23:18:24 -0500 |
commit | 536c72333f71f6e816d4b5e95e39754638bd76ea (patch) | |
tree | e154bd79e430e29dec7869f721c0b55023fd21da | |
parent | 4024fab7fc16223018a48af4a19efeec865c889b (diff) | |
download | gem5-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.cc | 10 |
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; } |