changeset bf08fb8ccf4b in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=bf08fb8ccf4b
description:
ruby: Implement SwapReq support
This implements SwapReq for Ruby memory.
A SwapReq should be treated like a write, except that the response
packet contains the overwritten data.
Note that, in particular, the conditional checking for isStore/isLoad
needs to be reversed, as a SwapReq is both.
diffstat:
src/mem/ruby/system/Sequencer.cc | 27 +++++++++++++++++++++------
1 files changed, 21 insertions(+), 6 deletions(-)
diffs (51 lines):
diff -r 7e0f869f8f7e -r bf08fb8ccf4b src/mem/ruby/system/Sequencer.cc
--- a/src/mem/ruby/system/Sequencer.cc Thu Jun 02 20:34:39 2016 +0100
+++ b/src/mem/ruby/system/Sequencer.cc Fri Jun 03 16:20:08 2016 -0400
@@ -478,6 +478,16 @@
data.getData(getOffset(request_address), pkt->getSize()),
pkt->getSize());
DPRINTF(RubySequencer, "read data %s\n", data);
+ } else if (pkt->req->isSwap()) {
+ std::vector<uint8_t> overwrite_val(pkt->getSize());
+ memcpy(&overwrite_val[0], pkt->getConstPtr<uint8_t>(),
+ pkt->getSize());
+ memcpy(pkt->getPtr<uint8_t>(),
+ data.getData(getOffset(request_address), pkt->getSize()),
+ pkt->getSize());
+ data.setData(&overwrite_val[0],
+ getOffset(request_address), pkt->getSize());
+ DPRINTF(RubySequencer, "swap data %s\n", data);
} else {
data.setData(pkt->getConstPtr<uint8_t>(),
getOffset(request_address), pkt->getSize());
@@ -565,7 +575,17 @@
}
secondary_type = RubyRequestType_ST;
} else {
- if (pkt->isRead()) {
+ //
+ // To support SwapReq, we need to check isWrite() first: a SwapReq
+ // should always be treated like a write, but since a SwapReq implies
+ // both isWrite() and isRead() are true, check isWrite() first here.
+ //
+ if (pkt->isWrite()) {
+ //
+ // Note: M5 packets do not differentiate ST from RMW_Write
+ //
+ primary_type = secondary_type = RubyRequestType_ST;
+ } else if (pkt->isRead()) {
if (pkt->req->isInstFetch()) {
primary_type = secondary_type = RubyRequestType_IFETCH;
} else {
@@ -583,11 +603,6 @@
primary_type = secondary_type = RubyRequestType_LD;
}
}
- } else if (pkt->isWrite()) {
- //
- // Note: M5 packets do not differentiate ST from RMW_Write
- //
- primary_type = secondary_type = RubyRequestType_ST;
} else if (pkt->isFlush()) {
primary_type = secondary_type = RubyRequestType_FLUSH;
} else {
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev