From 8be5be68587bb763805e1b61469d364f5df7af22 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 4 Nov 2020 00:59:14 -0800 Subject: [PATCH] mem: Minor refactor of how the abstract mem backdoor is exposed. Previously the SimpleMem depended on the fact that it inherited from the AbstractMem in order to access and export it's back door. Now, the AbstractMem has a method which will set a back door pointer if appropriate, which the SimpleMem can use, or anything else which uses an AbstractMem as its backing store. Also, make the AbstractMem invalidate any existing back doors and refuse to give out any new ones while some bit of memory is locked. That's because if the storage is accessed directly, the AbstractMem will have no change to manage its bookkeeping, and locking won't work properly. Change-Id: If8c2a63e0827bb88b583f27ab4151d6b761e116e Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/36977 Maintainer: Gabe Black Tested-by: kokoro Reviewed-by: Nikos Nikoleris Reviewed-by: Daniel Carvalho Reviewed-by: Jason Lowe-Power --- src/mem/abstract_mem.cc | 1 + src/mem/abstract_mem.hh | 21 ++++++++++++++++++--- src/mem/simple_mem.cc | 4 +--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/mem/abstract_mem.cc b/src/mem/abstract_mem.cc index 3600f34fb..7e098327a 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 cd18e0f96..1a3c01930 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 3ed3d04f3..327a32622 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; } -- 2.30.2