mem: Maintain a back door into the AbstractMem's backing store.
authorGabe Black <gabeblack@google.com>
Tue, 26 Mar 2019 01:04:50 +0000 (18:04 -0700)
committerGabe Black <gabeblack@google.com>
Sun, 14 Apr 2019 01:01:47 +0000 (01:01 +0000)
The backing store pointer is added to the back door when it's set,
assuming that the range isn't interleaved. If it is interleaved, then
there isn't a way to get a flat pointer to the backing store.

Depending on how the backing store is set up, it may be possible to
return a larger backdoor which applies to all interleaved memories at
the same time and to avoid problems with interleaving. I'm leaving this
as a todo.

Change-Id: I0e531c22835ec10954ab39f761b3d87666b59220
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17668
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/mem/abstract_mem.cc
src/mem/abstract_mem.hh

index 581fc14cc68805ea18a233686ce89c505cbc2b0c..f0d626940274294412e49ec1fafdfcd57771a7f0 100644 (file)
@@ -58,6 +58,9 @@ using namespace std;
 
 AbstractMemory::AbstractMemory(const Params *p) :
     MemObject(p), range(params()->range), pmemAddr(NULL),
+    backdoor(params()->range, nullptr,
+             (MemBackdoor::Flags)(MemBackdoor::Readable |
+                                  MemBackdoor::Writeable)),
     confTableReported(p->conf_table_reported), inAddrMap(p->in_addr_map),
     kvmMap(p->kvm_map), _system(NULL)
 {
@@ -75,6 +78,13 @@ AbstractMemory::init()
 void
 AbstractMemory::setBackingStore(uint8_t* pmem_addr)
 {
+    // If there was an existing backdoor, let everybody know it's going away.
+    if (backdoor.ptr())
+        backdoor.invalidate();
+
+    // The back door can't handle interleaved memory.
+    backdoor.ptr(range.interleaved() ? nullptr : pmem_addr);
+
     pmemAddr = pmem_addr;
 }
 
index 4dd255f5f2c4c283ad9f78e604217078c2966ebe..cf9ca74396ae14c7d6a3d40f00005c843f6cb8af 100644 (file)
@@ -49,6 +49,7 @@
 #ifndef __MEM_ABSTRACT_MEMORY_HH__
 #define __MEM_ABSTRACT_MEMORY_HH__
 
+#include "mem/backdoor.hh"
 #include "mem/mem_object.hh"
 #include "params/AbstractMemory.hh"
 #include "sim/stats.hh"
@@ -110,6 +111,9 @@ class AbstractMemory : public MemObject
     // Pointer to host memory used to implement this memory
     uint8_t* pmemAddr;
 
+    // Backdoor to access this memory.
+    MemBackdoor backdoor;
+
     // Enable specific memories to be reported to the configuration table
     const bool confTableReported;