summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/cache/cache_impl.hh19
-rw-r--r--src/mem/packet.hh1
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); }