diff options
-rw-r--r-- | src/mem/cache/cache_impl.hh | 19 | ||||
-rw-r--r-- | src/mem/packet.hh | 1 |
2 files changed, 14 insertions, 6 deletions
diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh index 03593554a..040b49464 100644 --- a/src/mem/cache/cache_impl.hh +++ b/src/mem/cache/cache_impl.hh @@ -400,7 +400,9 @@ Cache::access(PacketPtr pkt, CacheBlk *&blk, Cycles &lat, } } blk->status |= BlkDirty; - if (pkt->isSupplyExclusive()) { + // if shared is not asserted we got the writeback in modified + // state, if it is asserted we are in the owned state + if (!pkt->sharedAsserted()) { blk->status |= BlkWritable; } // nothing else to do; writeback doesn't expect response @@ -1475,8 +1477,14 @@ Cache::writebackBlk(CacheBlk *blk) PacketPtr writeback = new Packet(writebackReq, MemCmd::Writeback); if (blk->isWritable()) { - writeback->setSupplyExclusive(); + // not asserting shared means we pass the block in modified + // state, mark our own block non-writeable + blk->status &= ~BlkWritable; + } else { + // we are in the owned state, tell the receiver + writeback->assertShared(); } + writeback->allocate(); std::memcpy(writeback->getPtr<uint8_t>(), blk->data, blkSize); @@ -1998,9 +2006,10 @@ Cache::recvTimingSnoopReq(PacketPtr pkt) pkt->assertMemInhibit(); if (!pkt->needsExclusive()) { pkt->assertShared(); - // the writeback is no longer the exclusive copy in - // the system - wb_pkt->clearSupplyExclusive(); + // the writeback is no longer passing exclusivity (the + // receiving cache should consider the block owned + // rather than modified) + wb_pkt->assertShared(); } else { // if we're not asserting the shared line, we need to // invalidate our copy. we'll do that below as long as diff --git a/src/mem/packet.hh b/src/mem/packet.hh index fe5e10d0a..d1774e5a8 100644 --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -500,7 +500,6 @@ class Packet : public Printable void setExpressSnoop() { flags.set(EXPRESS_SNOOP); } bool isExpressSnoop() const { return flags.isSet(EXPRESS_SNOOP); } void setSupplyExclusive() { flags.set(SUPPLY_EXCLUSIVE); } - void clearSupplyExclusive() { flags.clear(SUPPLY_EXCLUSIVE); } bool isSupplyExclusive() const { return flags.isSet(SUPPLY_EXCLUSIVE); } void setSuppressFuncError() { flags.set(SUPPRESS_FUNC_ERROR); } bool suppressFuncError() const { return flags.isSet(SUPPRESS_FUNC_ERROR); } |