diff -r 3ad80c3ab77b -r 8aa1e72960a6 src/mem/packet.hh --- a/src/mem/packet.hh Mon Jan 10 15:50:51 2011 -0800 +++ b/src/mem/packet.hh Mon Jan 10 16:00:49 2011 -0800 @@ -768,6 +768,12 @@ data = new uint8_t[getSize()]; } + /** Identifies whether static or dynamic data has been allocated. */ + bool + hasDataAllocated() + { + return flags.isSet(STATIC_DATA|DYNAMIC_DATA); + } /** * Check a functional request against a memory value represented diff -r 3ad80c3ab77b -r 8aa1e72960a6 src/mem/ruby/system/DMASequencer.cc --- a/src/mem/ruby/system/DMASequencer.cc Mon Jan 10 15:50:51 2011 -0800 +++ b/src/mem/ruby/system/DMASequencer.cc Mon Jan 10 16:00:49 2011 -0800 @@ -97,8 +97,10 @@ msg->getLen() = (offset + len) <= RubySystem::getBlockSizeBytes() ? len : RubySystem::getBlockSizeBytes() - offset; - if (write) { - msg->getDataBlk().setData(data, offset, msg->getLen()); + if (write && (data != NULL)) { + if (active_request.data != NULL) { + msg->getDataBlk().setData(data, offset, msg->getLen()); + } } assert(m_mandatory_q_ptr != NULL); @@ -160,8 +162,10 @@ if (active_request.bytes_completed == 0) offset = active_request.start_paddr & m_data_block_mask; assert(active_request.write == false); - memcpy(&active_request.data[active_request.bytes_completed], - dblk.getData(offset, len), len); + if (active_request.data != NULL) { + memcpy(&active_request.data[active_request.bytes_completed], + dblk.getData(offset, len), len); + } issueNext(); } diff -r 3ad80c3ab77b -r 8aa1e72960a6 src/mem/ruby/system/RubyPort.cc --- a/src/mem/ruby/system/RubyPort.cc Mon Jan 10 15:50:51 2011 -0800 +++ b/src/mem/ruby/system/RubyPort.cc Mon Jan 10 16:00:49 2011 -0800 @@ -245,7 +245,12 @@ } } - RubyRequest ruby_request(pkt->getAddr(), pkt->getPtr(), + uint8_t* ruby_data = NULL; + if (pkt->hasDataAllocated()) { + ruby_data = pkt->getPtr(); + } + + RubyRequest ruby_request(pkt->getAddr(), ruby_data, pkt->getSize(), pc, type, RubyAccessMode_Supervisor, pkt);