Re: [m5-dev] changeset in m5: Mem: Finish half-baked support for mmaping file...
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.comwrote: 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,0x800,+0x800' + \ +' 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
Re: [m5-dev] changeset in m5: Mem: Finish half-baked support for mmaping file...
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,0x800,+0x800' + \ + ' 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
Re: [m5-dev] changeset in m5: Mem: Finish half-baked support for mmaping file...
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,0x800,+0x800' + \ +' 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
[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.pyMon Nov 08 13:58:24 2010 -0600 +++ b/configs/common/FSConfig.pyMon 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,0x800,+0x800' + \ +' 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