diff -r 5967db4cff04 -r 0e8fdd280a44 src/mem/ruby/system/Sequencer.cc --- a/src/mem/ruby/system/Sequencer.cc Thu Mar 17 10:34:27 2016 -0700 +++ b/src/mem/ruby/system/Sequencer.cc Sun Mar 20 00:53:28 2016 +0000 @@ -460,6 +460,16 @@ data.getData(getOffset(request_address), pkt->getSize()), pkt->getSize()); DPRINTF(RubySequencer, "read data %s\n", data); + } else if (pkt->req->isSwap()) { + std::vector overwrite_val(pkt->getSize()); + memcpy(&overwrite_val[0], pkt->getConstPtr(), + pkt->getSize()); + memcpy(pkt->getPtr(), + 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(), getOffset(request_address), pkt->getSize()); @@ -547,7 +557,12 @@ } secondary_type = RubyRequestType_ST; } else { - if (pkt->isRead()) { + 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 { @@ -565,11 +580,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 {