mem, cpu: Add assertions to snoop invalidation logic
This patch adds assertions that enforce that only invalidating snoops will ever reach into the logic that tracks in-order load completion and also invalidation of LL/SC (and MONITOR / MWAIT) monitors. Also adds some comments to MSHR::replaceUpgrades().
This commit is contained in:
parent
cabd4768c7
commit
f703160e5a
4 changed files with 16 additions and 2 deletions
|
@ -64,7 +64,10 @@ template <class XC>
|
|||
inline void
|
||||
handleLockedSnoop(XC *xc, PacketPtr pkt, Addr cacheBlockMask)
|
||||
{
|
||||
DPRINTF(LLSC,"%s: handleing snoop for address: %#x locked: %d\n",
|
||||
// Should only every see invalidations / direct writes
|
||||
assert(pkt->isInvalidate() || pkt->isWrite());
|
||||
|
||||
DPRINTF(LLSC,"%s: handling snoop for address: %#x locked: %d\n",
|
||||
xc->getCpuPtr()->name(),pkt->getAddr(),
|
||||
xc->readMiscReg(MISCREG_LOCKFLAG));
|
||||
if (!xc->readMiscReg(MISCREG_LOCKFLAG))
|
||||
|
@ -74,7 +77,7 @@ handleLockedSnoop(XC *xc, PacketPtr pkt, Addr cacheBlockMask)
|
|||
// If no caches are attached, the snoop address always needs to be masked
|
||||
Addr snoop_addr = pkt->getAddr() & cacheBlockMask;
|
||||
|
||||
DPRINTF(LLSC,"%s: handleing snoop for address: %#x locked addr: %#x\n",
|
||||
DPRINTF(LLSC,"%s: handling snoop for address: %#x locked addr: %#x\n",
|
||||
xc->getCpuPtr()->name(),snoop_addr, locked_addr);
|
||||
if (locked_addr == snoop_addr) {
|
||||
DPRINTF(LLSC,"%s: address match, clearing lock and signaling sev\n",
|
||||
|
|
|
@ -435,6 +435,9 @@ template <class Impl>
|
|||
void
|
||||
LSQUnit<Impl>::checkSnoop(PacketPtr pkt)
|
||||
{
|
||||
// Should only ever get invalidations in here
|
||||
assert(pkt->isInvalidate());
|
||||
|
||||
int load_idx = loadHead;
|
||||
DPRINTF(LSQUnit, "Got snoop for address %#x\n", pkt->getAddr());
|
||||
|
||||
|
|
2
src/mem/cache/blk.hh
vendored
2
src/mem/cache/blk.hh
vendored
|
@ -335,6 +335,8 @@ class CacheBlk
|
|||
*/
|
||||
bool checkWrite(PacketPtr pkt)
|
||||
{
|
||||
assert(pkt->isWrite());
|
||||
|
||||
// common case
|
||||
if (!pkt->isLLSC() && lockList.empty())
|
||||
return true;
|
||||
|
|
6
src/mem/cache/mshr.hh
vendored
6
src/mem/cache/mshr.hh
vendored
|
@ -149,7 +149,13 @@ class MSHR : public Packet::SenderState, public Printable
|
|||
bool isReset() const { return !needsWritable && !hasUpgrade; }
|
||||
void add(PacketPtr pkt, Tick readyTime, Counter order,
|
||||
Target::Source source, bool markPending);
|
||||
|
||||
/**
|
||||
* Convert upgrades to the equivalent request if the cache line they
|
||||
* refer to would have been invalid (Upgrade -> ReadEx, SC* -> Fail).
|
||||
* Used to rejig ordering between targets waiting on an MSHR. */
|
||||
void replaceUpgrades();
|
||||
|
||||
void clearDownstreamPending();
|
||||
bool checkFunctional(PacketPtr pkt);
|
||||
void print(std::ostream &os, int verbosity,
|
||||
|
|
Loading…
Reference in a new issue