physmem: Add a null option to physical memory so it doesn't store data.
authorNathan Binkert <nate@binkert.org>
Mon, 16 Jun 2008 04:39:29 +0000 (21:39 -0700)
committerNathan Binkert <nate@binkert.org>
Mon, 16 Jun 2008 04:39:29 +0000 (21:39 -0700)
src/mem/PhysicalMemory.py
src/mem/physical.cc

index 4e8a830def66cee1a89349fffadfb1d862430475..e512cea1c22a2362fc2bff8c182d3418b8a63f88 100644 (file)
@@ -38,6 +38,7 @@ class PhysicalMemory(MemObject):
     latency = Param.Latency('1t', "latency of an access")
     latency_var = Param.Latency('0ns', "access variablity")
     zero = Param.Bool(False, "zero initialize memory")
+    null = Param.Bool(False, "do not store data, always return zero")
 
 class DRAMMemory(PhysicalMemory):
     type = 'DRAMMemory'
index c06dd3170afa70ed181757129a9b46219512a0ad..325606eb1b6c4b531001e5b4f25f0ee9bcd92ef9 100644 (file)
@@ -52,12 +52,16 @@ using namespace std;
 using namespace TheISA;
 
 PhysicalMemory::PhysicalMemory(const Params *p)
-    : MemObject(p), pmemAddr(NULL), lat(p->latency),
-      lat_var(p->latency_var)
+    : MemObject(p), pmemAddr(NULL), pagePtr(0),
+      lat(p->latency), lat_var(p->latency_var),
+      cachedSize(params()->range.size()), cachedStart(params()->range.start)
 {
     if (params()->range.size() % TheISA::PageBytes != 0)
         panic("Memory Size not divisible by page size\n");
 
+    if (params()->null)
+        return;
+
     int map_flags = MAP_ANON | MAP_PRIVATE;
     pmemAddr = (uint8_t *)mmap(NULL, params()->range.size(),
                                PROT_READ | PROT_WRITE, map_flags, -1, 0);
@@ -70,12 +74,6 @@ PhysicalMemory::PhysicalMemory(const Params *p)
     //If requested, initialize all the memory to 0
     if (p->zero)
         memset(pmemAddr, 0, p->range.size());
-
-    pagePtr = 0;
-
-    cachedSize = params()->range.size();
-    cachedStart = params()->range.start;
-
 }
 
 void
@@ -257,6 +255,8 @@ PhysicalMemory::doAtomicAccess(PacketPtr pkt)
         uint64_t condition_val64;
         uint32_t condition_val32;
 
+        if (!pmemAddr)
+            panic("Swap only works if there is real memory (i.e. null=False)");
         assert(sizeof(IntReg) >= pkt->getSize());
 
         overwrite_mem = true;
@@ -287,11 +287,13 @@ PhysicalMemory::doAtomicAccess(PacketPtr pkt)
         if (pkt->isLocked()) {
             trackLoadLocked(pkt);
         }
-        memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
+        if (pmemAddr)
+            memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
         TRACE_PACKET("Read");
     } else if (pkt->isWrite()) {
         if (writeOK(pkt)) {
-            memcpy(hostAddr, pkt->getPtr<uint8_t>(), pkt->getSize());
+            if (pmemAddr)
+                memcpy(hostAddr, pkt->getPtr<uint8_t>(), pkt->getSize());
             TRACE_PACKET("Write");
         }
     } else if (pkt->isInvalidate()) {
@@ -320,11 +322,13 @@ PhysicalMemory::doFunctionalAccess(PacketPtr pkt)
     uint8_t *hostAddr = pmemAddr + pkt->getAddr() - start();
 
     if (pkt->isRead()) {
-        memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
+        if (pmemAddr)
+            memcpy(pkt->getPtr<uint8_t>(), hostAddr, pkt->getSize());
         TRACE_PACKET("Read");
         pkt->makeAtomicResponse();
     } else if (pkt->isWrite()) {
-        memcpy(hostAddr, pkt->getPtr<uint8_t>(), pkt->getSize());
+        if (pmemAddr)
+            memcpy(hostAddr, pkt->getPtr<uint8_t>(), pkt->getSize());
         TRACE_PACKET("Write");
         pkt->makeAtomicResponse();
     } else if (pkt->isPrint()) {
@@ -448,6 +452,9 @@ PhysicalMemory::drain(Event *de)
 void
 PhysicalMemory::serialize(ostream &os)
 {
+    if (!pmemAddr)
+        return;
+
     gzFile compressedMem;
     string filename = name() + ".physmem";
 
@@ -480,6 +487,9 @@ PhysicalMemory::serialize(ostream &os)
 void
 PhysicalMemory::unserialize(Checkpoint *cp, const string &section)
 {
+    if (!pmemAddr)
+        return;
+
     gzFile compressedMem;
     long *tempPage;
     long *pmem_current;
@@ -487,7 +497,6 @@ PhysicalMemory::unserialize(Checkpoint *cp, const string &section)
     uint32_t bytesRead;
     const int chunkSize = 16384;
 
-
     string filename;
 
     UNSERIALIZE_SCALAR(filename);