I just had this break a few checkpoints myself - and it's not a big deal really because it's easily fixup-able...but I wonder whether you really want to serialize the size of the physmem - let's say you run a checkpointing run with physmem N gigs and then you restore with physmem M gigs...I don't see why the size of the physmem needs to be serialized or unserialized at all and overwrite the simulation-configured size. Is there a compelling reason to do so?
Lisa On Thu, Dec 9, 2010 at 8:51 PM, Beckmann, Brad <brad.beckm...@amd.com>wrote: > 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: m5-dev-boun...@m5sim.org [mailto:m5-dev-boun...@m5sim.org] On > > Behalf Of Ali Saidi > > Sent: Monday, November 08, 2010 11:59 AM > > To: m5-dev@m5sim.org > > 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 > > m5-dev@m5sim.org > > http://m5sim.org/mailman/listinfo/m5-dev > > > _______________________________________________ > m5-dev mailing list > m5-dev@m5sim.org > http://m5sim.org/mailman/listinfo/m5-dev > >
_______________________________________________ m5-dev mailing list m5-dev@m5sim.org http://m5sim.org/mailman/listinfo/m5-dev