physmem: Add a null option to physical memory so it doesn't store data.
This commit is contained in:
@@ -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'
|
||||
|
||||
@@ -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 §ion)
|
||||
{
|
||||
if (!pmemAddr)
|
||||
return;
|
||||
|
||||
gzFile compressedMem;
|
||||
long *tempPage;
|
||||
long *pmem_current;
|
||||
@@ -487,7 +497,6 @@ PhysicalMemory::unserialize(Checkpoint *cp, const string §ion)
|
||||
uint32_t bytesRead;
|
||||
const int chunkSize = 16384;
|
||||
|
||||
|
||||
string filename;
|
||||
|
||||
UNSERIALIZE_SCALAR(filename);
|
||||
|
||||
Reference in New Issue
Block a user