Re: [m5-dev] changeset in m5: Mem: Finish half-baked support for mmaping file...

2011-01-11 Thread Lisa Hsu
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...

2011-01-11 Thread nathan binkert
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...

2010-12-09 Thread Beckmann, Brad
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...

2010-11-08 Thread Ali Saidi
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