Hi Ali, This is changset 7730 which also breaks all previous checkpoints because it requires phsymem to serialize and unserialize the variable "_size".
Brad > -----Original Message----- > From: [email protected] [mailto:[email protected]] On > Behalf Of Ali Saidi > Sent: Monday, November 08, 2010 11:59 AM > To: [email protected] > Subject: [m5-dev] changeset in m5: Mem: Finish half-baked support for > mmaping file... > > 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 _______________________________________________ m5-dev mailing list [email protected] http://m5sim.org/mailman/listinfo/m5-dev
