From 1bf944be6213163279e114412a7f3cc804b5846a Mon Sep 17 00:00:00 2001 From: Steve Reinhardt Date: Wed, 25 Aug 2010 21:55:55 -0700 Subject: cache: fix a bug in atomic multilevel snoops --- src/mem/cache/cache_impl.hh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src/mem/cache') diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh index d471b293a..c930a886d 100644 --- a/src/mem/cache/cache_impl.hh +++ b/src/mem/cache/cache_impl.hh @@ -1099,6 +1099,12 @@ Cache::handleSnoop(PacketPtr pkt, BlkType *blk, assert(!(pending_inval && !is_deferred)); assert(pkt->isRequest()); + // the packet may get modified if we or a forwarded snooper + // responds in atomic mode, so remember a few things about the + // original packet up front + bool invalidate = pkt->isInvalidate(); + bool needs_exclusive = pkt->needsExclusive(); + if (forwardSnoops) { // first propagate snoop upward to see if anyone above us wants to // handle it. save & restore packet src since it will get @@ -1141,10 +1147,9 @@ Cache::handleSnoop(PacketPtr pkt, BlkType *blk, // and then do it later bool respond = blk->isDirty() && pkt->needsResponse(); bool have_exclusive = blk->isWritable(); - bool invalidate = pkt->isInvalidate(); - if (pkt->isRead() && !pkt->isInvalidate()) { - assert(!pkt->needsExclusive()); + if (pkt->isRead() && !invalidate) { + assert(!needs_exclusive); pkt->assertShared(); int bits_to_clear = BlkWritable; const bool haveOwnershipState = true; // for now -- cgit v1.2.3