changeset 982b4c6c1470 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=982b4c6c1470
description:
Mem: Finish half-baked support for mmaping file in physmem.
Physmem has a parameter to be able to mem map a file, however
it isn't actually used. This changeset utilizes the parameter
so a file can be mmapped.
diffstat:
configs/common/FSConfig.py | 8 ++++++-
src/mem/physical.cc | 48 +++++++++++++++++++++++++++++++--------------
src/mem/physical.hh | 8 +++---
3 files changed, 44 insertions(+), 20 deletions(-)
diffs (176 lines):
diff -r d3c006ecccd3 -r 982b4c6c1470 configs/common/FSConfig.py
--- a/configs/common/FSConfig.py Mon Nov 08 13:58:24 2010 -0600
+++ b/configs/common/FSConfig.py Mon Nov 08 13:58:24 2010 -0600
@@ -200,9 +200,12 @@
self.membus.badaddr_responder.warn_access = "warn"
self.bridge = Bridge(delay='50ns', nack_delay='4ns')
self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()), zero = True)
+ self.diskmem = PhysicalMemory(range = AddrRange(Addr('128MB'), size =
'128MB'),
+ file = disk('ael-arm.ext2'))
self.bridge.side_a = self.iobus.port
self.bridge.side_b = self.membus.port
self.physmem.port = self.membus.port
+ self.diskmem.port = self.membus.port
self.mem_mode = mem_mode
@@ -224,7 +227,10 @@
self.intrctrl = IntrControl()
self.terminal = Terminal()
- self.boot_osflags = 'earlyprintk mem=128MB console=ttyAMA0 lpj=19988480
norandmaps'
+ self.kernel = binary('vmlinux.arm')
+ self.boot_osflags = 'earlyprintk mem=128MB console=ttyAMA0 lpj=19988480' +
\
+ ' norandmaps slram=slram0,0x8000000,+0x8000000' +
\
+ ' mtdparts=slram0:- rw loglevel=8 root=/dev/mtdblock0'
return self
diff -r d3c006ecccd3 -r 982b4c6c1470 src/mem/physical.cc
--- a/src/mem/physical.cc Mon Nov 08 13:58:24 2010 -0600
+++ b/src/mem/physical.cc Mon Nov 08 13:58:24 2010 -0600
@@ -31,6 +31,7 @@
#include <sys/types.h>
#include <sys/mman.h>
+#include <sys/user.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
@@ -41,6 +42,7 @@
#include <string>
#include "arch/registers.hh"
+#include "base/intmath.hh"
#include "base/misc.hh"
#include "base/random.hh"
#include "base/types.hh"
@@ -56,26 +58,39 @@
PhysicalMemory::PhysicalMemory(const Params *p)
: MemObject(p), pmemAddr(NULL), pagePtr(0),
lat(p->latency), lat_var(p->latency_var),
- cachedSize(params()->range.size()), cachedStart(params()->range.start)
+ _size(params()->range.size()), _start(params()->range.start)
{
- if (params()->range.size() % TheISA::PageBytes != 0)
+ if (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);
+
+ if (params()->file == "") {
+ int map_flags = MAP_ANON | MAP_PRIVATE;
+ pmemAddr = (uint8_t *)mmap(NULL, size(),
+ PROT_READ | PROT_WRITE, map_flags, -1, 0);
+ } else {
+ int map_flags = MAP_PRIVATE;
+ int fd = open(params()->file.c_str(), O_RDONLY);
+ _size = lseek(fd, 0, SEEK_END);
+ lseek(fd, 0, SEEK_SET);
+ pmemAddr = (uint8_t *)mmap(NULL, roundUp(size(), PAGE_SIZE),
+ PROT_READ | PROT_WRITE, map_flags, fd, 0);
+ }
if (pmemAddr == (void *)MAP_FAILED) {
perror("mmap");
- fatal("Could not mmap!\n");
+ if (params()->file == "")
+ fatal("Could not mmap!\n");
+ else
+ fatal("Could not find file: %s\n", params()->file);
}
//If requested, initialize all the memory to 0
if (p->zero)
- memset(pmemAddr, 0, p->range.size());
+ memset(pmemAddr, 0, size());
}
void
@@ -94,8 +109,7 @@
PhysicalMemory::~PhysicalMemory()
{
if (pmemAddr)
- munmap((char*)pmemAddr, params()->range.size());
- //Remove memPorts?
+ munmap((char*)pmemAddr, size());
}
Addr
@@ -408,7 +422,7 @@
{
snoop = false;
resp.clear();
- resp.push_back(RangeSize(start(), params()->range.size()));
+ resp.push_back(RangeSize(start(), size()));
}
unsigned
@@ -463,6 +477,7 @@
string filename = name() + ".physmem";
SERIALIZE_SCALAR(filename);
+ SERIALIZE_SCALAR(_size);
// write memory file
string thefile = Checkpoint::dir() + "/" + filename.c_str();
@@ -477,8 +492,7 @@
fatal("Insufficient memory to allocate compression state for %s\n",
filename);
- if (gzwrite(compressedMem, pmemAddr, params()->range.size()) !=
- (int)params()->range.size()) {
+ if (gzwrite(compressedMem, pmemAddr, size()) != (int)size()) {
fatal("Write failed on physical memory checkpoint file '%s'\n",
filename);
}
@@ -522,9 +536,13 @@
// unmap file that was mmaped in the constructor
// This is done here to make sure that gzip and open don't muck with our
// nice large space of memory before we reallocate it
- munmap((char*)pmemAddr, params()->range.size());
+ munmap((char*)pmemAddr, size());
- pmemAddr = (uint8_t *)mmap(NULL, params()->range.size(),
+ UNSERIALIZE_SCALAR(_size);
+ if (size() > params()->range.size())
+ fatal("Memory size has changed!\n");
+
+ pmemAddr = (uint8_t *)mmap(NULL, size(),
PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
if (pmemAddr == (void *)MAP_FAILED) {
@@ -538,7 +556,7 @@
fatal("Unable to malloc memory to read file %s\n", filename);
/* Only copy bytes that are non-zero, so we don't give the VM system hell
*/
- while (curSize < params()->range.size()) {
+ while (curSize < size()) {
bytesRead = gzread(compressedMem, tempPage, chunkSize);
if (bytesRead == 0)
break;
diff -r d3c006ecccd3 -r 982b4c6c1470 src/mem/physical.hh
--- a/src/mem/physical.hh Mon Nov 08 13:58:24 2010 -0600
+++ b/src/mem/physical.hh Mon Nov 08 13:58:24 2010 -0600
@@ -149,12 +149,12 @@
std::vector<MemoryPort*> ports;
typedef std::vector<MemoryPort*>::iterator PortIterator;
- uint64_t cachedSize;
- uint64_t cachedStart;
+ uint64_t _size;
+ uint64_t _start;
public:
Addr new_page();
- uint64_t size() { return cachedSize; }
- uint64_t start() { return cachedStart; }
+ uint64_t size() { return _size; }
+ uint64_t start() { return _start; }
public:
typedef PhysicalMemoryParams Params;
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev