diff -r fbc330c4dd8b -r cabe32e23f17 src/mem/cache/cache.cc --- a/src/mem/cache/cache.cc Tue Dec 29 16:36:53 2015 +0000 +++ b/src/mem/cache/cache.cc Tue Dec 29 16:43:30 2015 +0000 @@ -185,7 +185,11 @@ if (pkt->isLLSC()) { blk->trackLoadLocked(pkt); } + + // all read responses have a data payload + assert(pkt->hasRespData()); pkt->setDataFromBlock(blk->data, blkSize); + // determine if this read is from a (coherent) cache, or not // by looking at the command type; we could potentially add a // packet attribute such as 'FromCache' to make this check a @@ -796,10 +800,7 @@ } pkt->makeTimingResponse(); - // for debugging, set all the bits in the response data - // (also keeps valgrind from complaining when debugging settings - // print out instruction results) - std::memset(pkt->getPtr(), 0xFF, pkt->getSize()); + // request_time is used here, taking into account lat and the delay // charged if the packet comes from the xbar. cpuSidePort->schedTimingResp(pkt, request_time, true); @@ -2039,7 +2040,10 @@ doTimingSupplyResponse(pkt, blk->data, is_deferred, pending_inval); } else { pkt->makeAtomicResponse(); - pkt->setDataFromBlock(blk->data, blkSize); + // packets such as upgrades do not actually have any data + // payload + if (pkt->hasData()) + pkt->setDataFromBlock(blk->data, blkSize); } } diff -r fbc330c4dd8b -r cabe32e23f17 src/mem/cache/mshr.cc --- a/src/mem/cache/mshr.cc Tue Dec 29 16:36:53 2015 +0000 +++ b/src/mem/cache/mshr.cc Tue Dec 29 16:43:30 2015 +0000 @@ -115,16 +115,26 @@ static void replaceUpgrade(PacketPtr pkt) { + // remember if the current packet has data allocated + bool has_data = pkt->hasData() || pkt->hasRespData(); if (pkt->cmd == MemCmd::UpgradeReq) { pkt->cmd = MemCmd::ReadExReq; DPRINTF(Cache, "Replacing UpgradeReq with ReadExReq\n"); } else if (pkt->cmd == MemCmd::SCUpgradeReq) { pkt->cmd = MemCmd::SCUpgradeFailReq; + // same as above, we need to allocate space DPRINTF(Cache, "Replacing SCUpgradeReq with SCUpgradeFailReq\n"); } else if (pkt->cmd == MemCmd::StoreCondReq) { pkt->cmd = MemCmd::StoreCondFailReq; DPRINTF(Cache, "Replacing StoreCondReq with StoreCondFailReq\n"); } + + if (!has_data && (pkt->hasData() || pkt->hasRespData())) { + // we went from a packet that had no data (neither request, + // nor response), to one that does, and therefore we need to + // actually allocate space for the data payload + pkt->allocate(); + } } diff -r fbc330c4dd8b -r cabe32e23f17 src/mem/packet.hh --- a/src/mem/packet.hh Tue Dec 29 16:36:53 2015 +0000 +++ b/src/mem/packet.hh Tue Dec 29 16:43:30 2015 +0000 @@ -521,6 +521,11 @@ bool isEviction() const { return cmd.isEviction(); } bool isWriteback() const { return cmd.isWriteback(); } bool hasData() const { return cmd.hasData(); } + bool hasRespData() const + { + MemCmd resp_cmd = cmd.responseCommand(); + return resp_cmd.hasData(); + } bool isLLSC() const { return cmd.isLLSC(); } bool isError() const { return cmd.isError(); } bool isPrint() const { return cmd.isPrint(); } @@ -1071,9 +1076,13 @@ void allocate() { - assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA)); - flags.set(DYNAMIC_DATA); - data = new uint8_t[getSize()]; + // if either this command or the response command has a data + // payload, actually allocate space + if (hasData() || hasRespData()) { + assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA)); + flags.set(DYNAMIC_DATA); + data = new uint8_t[getSize()]; + } } /** @} */