diff options
Diffstat (limited to 'src/mem/cache/mshr.cc')
-rw-r--r-- | src/mem/cache/mshr.cc | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/mem/cache/mshr.cc b/src/mem/cache/mshr.cc index e2141a429..1d18a2861 100644 --- a/src/mem/cache/mshr.cc +++ b/src/mem/cache/mshr.cc @@ -115,6 +115,9 @@ MSHR::TargetList::add(PacketPtr pkt, Tick readyTime, 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"); @@ -125,6 +128,19 @@ replaceUpgrade(PacketPtr pkt) pkt->cmd = MemCmd::StoreCondFailReq; DPRINTF(Cache, "Replacing StoreCondReq with StoreCondFailReq\n"); } + + if (!has_data) { + // there is no sensible way of setting the data field if the + // new command actually would carry data + assert(!pkt->hasData()); + + if (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(); + } + } } |