summaryrefslogtreecommitdiff
path: root/src/sim
diff options
context:
space:
mode:
Diffstat (limited to 'src/sim')
-rw-r--r--src/sim/System.py6
-rw-r--r--src/sim/system.cc31
-rw-r--r--src/sim/system.hh30
3 files changed, 29 insertions, 38 deletions
diff --git a/src/sim/System.py b/src/sim/System.py
index 88485fcf8..f680e64bf 100644
--- a/src/sim/System.py
+++ b/src/sim/System.py
@@ -33,7 +33,7 @@ from m5.defines import buildEnv
from m5.params import *
from m5.proxy import *
-from PhysicalMemory import *
+from SimpleMemory import *
class MemoryMode(Enum): vals = ['invalid', 'atomic', 'timing']
@@ -52,9 +52,9 @@ class System(MemObject):
void setMemoryMode(Enums::MemoryMode mode);
''')
- physmem = Param.PhysicalMemory("Physical Memory")
+ memories = VectorParam.AbstractMemory(Self.all,
+ "All memories in the system")
mem_mode = Param.MemoryMode('atomic', "The mode the memory system is in")
- memories = VectorParam.PhysicalMemory(Self.all, "All memories is the system")
work_item_id = Param.Int(-1, "specific work item id")
num_work_ids = Param.Int(16, "Number of distinct work item types")
work_begin_cpu_id_exit = Param.Int(-1,
diff --git a/src/sim/system.cc b/src/sim/system.cc
index 2c5d4e44b..40f5ea0ce 100644
--- a/src/sim/system.cc
+++ b/src/sim/system.cc
@@ -73,7 +73,6 @@ int System::numSystemsRunning = 0;
System::System(Params *p)
: MemObject(p), _systemPort("system_port", this),
- physmem(p->physmem),
_numContexts(0),
pagePtr(0),
init_param(p->init_param),
@@ -81,6 +80,7 @@ System::System(Params *p)
virtProxy(_systemPort),
loadAddrMask(p->load_addr_mask),
nextPID(0),
+ physmem(p->memories),
memoryMode(p->mem_mode),
workItemsBegin(0),
workItemsEnd(0),
@@ -92,16 +92,6 @@ System::System(Params *p)
// add self to global system list
systemList.push_back(this);
- /** Keep track of all memories we can execute code out of
- * in our system
- */
- for (int x = 0; x < p->memories.size(); x++) {
- if (!p->memories[x])
- continue;
- memRanges.push_back(RangeSize(p->memories[x]->start(),
- p->memories[x]->size()));
- }
-
if (FullSystem) {
kernelSymtab = new SymbolTable;
if (!debugSymbolTable)
@@ -308,32 +298,27 @@ System::allocPhysPages(int npages)
{
Addr return_addr = pagePtr << LogVMPageSize;
pagePtr += npages;
- if (pagePtr > physmem->size())
+ if (pagePtr > physmem.totalSize())
fatal("Out of memory, please increase size of physical memory.");
return return_addr;
}
Addr
-System::memSize()
+System::memSize() const
{
- return physmem->size();
+ return physmem.totalSize();
}
Addr
-System::freeMemSize()
+System::freeMemSize() const
{
- return physmem->size() - (pagePtr << LogVMPageSize);
+ return physmem.totalSize() - (pagePtr << LogVMPageSize);
}
bool
-System::isMemory(const Addr addr) const
+System::isMemAddr(Addr addr) const
{
- std::list<Range<Addr> >::const_iterator i;
- for (i = memRanges.begin(); i != memRanges.end(); i++) {
- if (*i == addr)
- return true;
- }
- return false;
+ return physmem.isMemAddr(addr);
}
void
diff --git a/src/sim/system.hh b/src/sim/system.hh
index d5e45fa0d..7b5ba998e 100644
--- a/src/sim/system.hh
+++ b/src/sim/system.hh
@@ -59,13 +59,13 @@
#include "mem/fs_translating_port_proxy.hh"
#include "mem/mem_object.hh"
#include "mem/port.hh"
+#include "mem/physical.hh"
#include "params/System.hh"
class BaseCPU;
class BaseRemoteGDB;
class GDBListener;
class ObjectFile;
-class PhysicalMemory;
class Platform;
class ThreadContext;
@@ -138,7 +138,6 @@ class System : public MemObject
*/
void setMemoryMode(Enums::MemoryMode mode);
- PhysicalMemory *physmem;
PCEventQueue pcEventQueue;
std::vector<ThreadContext *> threadContexts;
@@ -159,14 +158,6 @@ class System : public MemObject
* system. These threads could be Active or Suspended. */
int numRunningContexts();
- /** List to store ranges of memories in this system */
- AddrRangeList memRanges;
-
- /** check if an address points to valid system memory
- * and thus we can fetch instructions out of it
- */
- bool isMemory(const Addr addr) const;
-
Addr pagePtr;
uint64_t init_param;
@@ -208,13 +199,28 @@ class System : public MemObject
return nextPID++;
}
+ /** Get a pointer to access the physical memory of the system */
+ PhysicalMemory& getPhysMem() { return physmem; }
+
/** Amount of physical memory that is still free */
- Addr freeMemSize();
+ Addr freeMemSize() const;
/** Amount of physical memory that exists */
- Addr memSize();
+ Addr memSize() const;
+
+ /**
+ * Check if a physical address is within a range of a memory that
+ * is part of the global address map.
+ *
+ * @param addr A physical address
+ * @return Whether the address corresponds to a memory
+ */
+ bool isMemAddr(Addr addr) const;
protected:
+
+ PhysicalMemory physmem;
+
Enums::MemoryMode memoryMode;
uint64_t workItemsBegin;
uint64_t workItemsEnd;