diff --git a/src/mem/abstract_mem.cc b/src/mem/abstract_mem.cc index 3600f34fb4..7e098327a6 100644 --- a/src/mem/abstract_mem.cc +++ b/src/mem/abstract_mem.cc @@ -269,6 +269,7 @@ AbstractMemory::trackLoadLocked(PacketPtr pkt) DPRINTF(LLSC, "Adding lock record: context %d addr %#x\n", req->contextId(), paddr); lockedAddrList.push_front(LockedAddr(req)); + backdoor.invalidate(); } diff --git a/src/mem/abstract_mem.hh b/src/mem/abstract_mem.hh index cd18e0f966..1a3c01930e 100644 --- a/src/mem/abstract_mem.hh +++ b/src/mem/abstract_mem.hh @@ -227,16 +227,31 @@ class AbstractMemory : public ClockedObject */ void setBackingStore(uint8_t* pmem_addr); + void + getBackdoor(MemBackdoorPtr &bd_ptr) + { + if (lockedAddrList.empty() && backdoor.ptr()) + bd_ptr = &backdoor; + } + /** * Get the list of locked addresses to allow checkpointing. */ - const std::list& getLockedAddrList() const - { return lockedAddrList; } + const std::list & + getLockedAddrList() const + { + return lockedAddrList; + } /** * Add a locked address to allow for checkpointing. */ - void addLockedAddr(LockedAddr addr) { lockedAddrList.push_back(addr); } + void + addLockedAddr(LockedAddr addr) + { + backdoor.invalidate(); + lockedAddrList.push_back(addr); + } /** read the system pointer * Implemented for completeness with the setter diff --git a/src/mem/simple_mem.cc b/src/mem/simple_mem.cc index 3ed3d04f3a..327a32622c 100644 --- a/src/mem/simple_mem.cc +++ b/src/mem/simple_mem.cc @@ -80,9 +80,7 @@ Tick SimpleMemory::recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &_backdoor) { Tick latency = recvAtomic(pkt); - - if (backdoor.ptr()) - _backdoor = &backdoor; + getBackdoor(_backdoor); return latency; }