From 578a7f20c647e4051e137bdb219cec450a741ca6 Mon Sep 17 00:00:00 2001 From: Andreas Hansson Date: Tue, 9 Jun 2015 09:21:17 -0400 Subject: mem: Fix snoop packet data allocation bug This patch fixes an issue where the snoop packet did not properly forward the data pointer in case of static data. --- src/mem/cache/cache_impl.hh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/mem/cache') diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh index 734ca826c..9c5070ffa 100644 --- a/src/mem/cache/cache_impl.hh +++ b/src/mem/cache/cache_impl.hh @@ -1610,7 +1610,11 @@ Cache::handleSnoop(PacketPtr pkt, CacheBlk *blk, bool is_timing, // rewritten to be relative to cpu-side bus (if any) bool alreadyResponded = pkt->memInhibitAsserted(); if (is_timing) { - Packet snoopPkt(pkt, true, false); // clear flags, no allocation + // copy the packet so that we can clear any flags before + // forwarding it upwards, we also allocate data (passing + // the pointer along in case of static data), in case + // there is a snoop hit in upper levels + Packet snoopPkt(pkt, true, true); snoopPkt.setExpressSnoop(); snoopPkt.pushSenderState(new ForwardResponseRecord()); // the snoop packet does not need to wait any additional @@ -1622,6 +1626,8 @@ Cache::handleSnoop(PacketPtr pkt, CacheBlk *blk, bool is_timing, assert(!alreadyResponded); pkt->assertMemInhibit(); } else { + // no cache (or anyone else for that matter) will + // respond, so delete the ForwardResponseRecord here delete snoopPkt.popSenderState(); } if (snoopPkt.sharedAsserted()) { -- cgit v1.2.3