diff options
author | Nikos Nikoleris <nikos.nikoleris@arm.com> | 2017-03-03 16:52:45 +0000 |
---|---|---|
committer | Nikos Nikoleris <nikos.nikoleris@arm.com> | 2017-05-31 18:34:16 +0000 |
commit | 946b5aeede320c4cae1c365e8f5b549aadc468f7 (patch) | |
tree | 043191f9e258b63462aa5db5214d8cefbca82e04 /src | |
parent | 1ccc7025398a78e0483ec5a9706a8de019d83474 (diff) | |
download | gem5-946b5aeede320c4cae1c365e8f5b549aadc468f7.tar.xz |
ruby: Don't set the block data when a store conditional fails
Previously the Sequencer upon a Store Conditional would
unconditionally set the data of the memory location. This change
checks and prevents a failed Store Conditional from modifying any
data.
Change-Id: Id63c9579d8f054f0e95c6d338a7e31aa48762755
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/2902
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Bradford Beckmann <brad.beckmann@amd.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/mem/ruby/system/Sequencer.cc | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc index 7fdd52623..97afa5ec6 100644 --- a/src/mem/ruby/system/Sequencer.cc +++ b/src/mem/ruby/system/Sequencer.cc @@ -489,7 +489,9 @@ Sequencer::hitCallback(SequencerRequest* srequest, DataBlock& data, data.setData(&overwrite_val[0], getOffset(request_address), pkt->getSize()); DPRINTF(RubySequencer, "swap data %s\n", data); - } else { + } else if (type != RubyRequestType_Store_Conditional || llscSuccess) { + // Types of stores set the actual data here, apart from + // failed Store Conditional requests data.setData(pkt->getConstPtr<uint8_t>(), getOffset(request_address), pkt->getSize()); DPRINTF(RubySequencer, "set data %s\n", data); |