diff -r 44058d65a4ca -r 3a541e8c1ff1 src/cpu/testers/rubytest/Check.cc --- a/src/cpu/testers/rubytest/Check.cc Mon Nov 24 12:26:15 2014 +0000 +++ b/src/cpu/testers/rubytest/Check.cc Mon Nov 24 12:26:16 2014 +0000 @@ -110,6 +110,11 @@ req->setThreadContext(index, 0); PacketPtr pkt = new Packet(req, cmd); + // despite the oddity of the 0 size (questionable if this should + // even be allowed), a prefetch is still a read and as such needs + // a place to store the result + uint8_t *data = new uint8_t; + pkt->dataDynamic(data); // push the subblock onto the sender state. The sequencer will // update the subblock on the return diff -r 44058d65a4ca -r 3a541e8c1ff1 src/mem/packet.hh --- a/src/mem/packet.hh Mon Nov 24 12:26:15 2014 +0000 +++ b/src/mem/packet.hh Mon Nov 24 12:26:16 2014 +0000 @@ -846,9 +846,9 @@ */ template T* - getPtr(bool null_ok = false) + getPtr() { - assert(null_ok || flags.isSet(STATIC_DATA|DYNAMIC_DATA)); + assert(flags.isSet(STATIC_DATA|DYNAMIC_DATA)); return (T*)data; } diff -r 44058d65a4ca -r 3a541e8c1ff1 src/mem/ruby/slicc_interface/RubyRequest.cc --- a/src/mem/ruby/slicc_interface/RubyRequest.cc Mon Nov 24 12:26:15 2014 +0000 +++ b/src/mem/ruby/slicc_interface/RubyRequest.cc Mon Nov 24 12:26:16 2014 +0000 @@ -72,7 +72,7 @@ Addr mBase = m_PhysicalAddress.getAddress(); Addr mTail = mBase + m_Size; - uint8_t * pktData = pkt->getPtr(true); + uint8_t * pktData = pkt->getPtr(); Addr cBase = std::max(wBase, mBase); Addr cTail = std::min(wTail, mTail); diff -r 44058d65a4ca -r 3a541e8c1ff1 src/mem/ruby/slicc_interface/RubySlicc_Util.hh --- a/src/mem/ruby/slicc_interface/RubySlicc_Util.hh Mon Nov 24 12:26:15 2014 +0000 +++ b/src/mem/ruby/slicc_interface/RubySlicc_Util.hh Mon Nov 24 12:26:16 2014 +0000 @@ -107,7 +107,7 @@ lineAddr.makeLineAddress(); if (pktLineAddr == lineAddr) { - uint8_t *data = pkt->getPtr(true); + uint8_t *data = pkt->getPtr(); unsigned int size_in_bytes = pkt->getSize(); unsigned startByte = pkt->getAddr() - lineAddr.getAddress(); @@ -135,7 +135,7 @@ lineAddr.makeLineAddress(); if (pktLineAddr == lineAddr) { - uint8_t *data = pkt->getPtr(true); + uint8_t *data = pkt->getPtr(); unsigned int size_in_bytes = pkt->getSize(); unsigned startByte = pkt->getAddr() - lineAddr.getAddress(); diff -r 44058d65a4ca -r 3a541e8c1ff1 src/mem/ruby/system/DMASequencer.cc --- a/src/mem/ruby/system/DMASequencer.cc Mon Nov 24 12:26:15 2014 +0000 +++ b/src/mem/ruby/system/DMASequencer.cc Mon Nov 24 12:26:16 2014 +0000 @@ -235,7 +235,7 @@ } uint64_t paddr = pkt->getAddr(); - uint8_t* data = pkt->getPtr(true); + uint8_t* data = pkt->getPtr(); int len = pkt->getSize(); bool write = pkt->isWrite(); diff -r 44058d65a4ca -r 3a541e8c1ff1 src/mem/ruby/system/Sequencer.cc --- a/src/mem/ruby/system/Sequencer.cc Mon Nov 24 12:26:15 2014 +0000 +++ b/src/mem/ruby/system/Sequencer.cc Mon Nov 24 12:26:16 2014 +0000 @@ -524,28 +524,23 @@ llscSuccess ? "Done" : "SC_Failed", "", "", request_address, total_latency); - // update the data + // update the data unless it is a non-data-carrying flush if (g_system_ptr->m_warmup_enabled) { - assert(pkt->getPtr(false) != NULL); - data.setData(pkt->getPtr(false), + data.setData(pkt->getPtr(), request_address.getOffset(), pkt->getSize()); - } else if (pkt->getPtr(true) != NULL) { + } else if (!pkt->isFlush()) { if ((type == RubyRequestType_LD) || (type == RubyRequestType_IFETCH) || (type == RubyRequestType_RMW_Read) || (type == RubyRequestType_Locked_RMW_Read) || (type == RubyRequestType_Load_Linked)) { - memcpy(pkt->getPtr(true), + memcpy(pkt->getPtr(), data.getData(request_address.getOffset(), pkt->getSize()), pkt->getSize()); } else { - data.setData(pkt->getPtr(true), + data.setData(pkt->getPtr(), request_address.getOffset(), pkt->getSize()); } - } else { - DPRINTF(MemoryAccess, - "WARNING. Data not transfered from Ruby to M5 for type %s\n", - RubyRequestType_to_string(type)); } // If using the RubyTester, update the RubyTester sender state's @@ -679,9 +674,12 @@ pc = pkt->req->getPC(); } + // check if the packet has data as for example prefetch and flush + // requests do not std::shared_ptr msg = std::make_shared(clockEdge(), pkt->getAddr(), - pkt->getPtr(true), + pkt->isFlush() ? + nullptr : pkt->getPtr(), pkt->getSize(), pc, secondary_type, RubyAccessMode_Supervisor, pkt, PrefetchBit_No, proc_id);