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

Reply via email to