I haven't followed this thread closely, but I don't understand this response.
Nate > Yes, because if you're mmapping a file, it's likely that the file is > slightly smaller than the size of memory allocated. > > Ali > On Jan 11, 2011, at 5:50 PM, Lisa Hsu wrote: > > 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 > > > _______________________________________________ > 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