diff options
Diffstat (limited to 'src/sim')
-rw-r--r-- | src/sim/System.py | 6 | ||||
-rw-r--r-- | src/sim/system.cc | 31 | ||||
-rw-r--r-- | src/sim/system.hh | 30 |
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; |