sim: allow memory maps to default to mapped files
authorMike Frysinger <vapier@gentoo.org>
Tue, 11 Jan 2011 17:58:56 +0000 (17:58 +0000)
committerMike Frysinger <vapier@gentoo.org>
Tue, 11 Jan 2011 17:58:56 +0000 (17:58 +0000)
I find it annoying when using --memory-mapfile that I also need to look
up and manually specify the file size to the following --memory-region
option.  So make a length of 0 in the following --memory-region trigger
an auto-sizing of the map to the length of the file being mapped.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
sim/common/ChangeLog
sim/common/sim-memopt.c

index b3d600ec7ed699bae04b6f587aa75fd2eb1d3785..2a1f5de9d9a0585d9f793c3a6ed22533619e9601 100644 (file)
@@ -1,3 +1,11 @@
+2011-01-11  Mike Frysinger  <vapier@gentoo.org>
+
+       * sim-memopt.c (do_memopt_add): Set nr_bytes to s.st_size before
+       bytes has been calculated and when mmap_next_fd is valid and
+       nr_bytes is 0.
+       (memory_option_handler): Allow missing size when mmap_next_fd is
+       valid.
+
 2011-01-10  Mike Frysinger  <vapier@gentoo.org>
 
        * aclocal.m4 (SIM_AC_OPTION_HARDWARE): Set $hardware to $2 when $2 is
index 8aa36ffce8769d1590d087335b8bd566d4c31c9a..142f3a634dd33b956637ebaa144e58374fd83191 100644 (file)
@@ -154,7 +154,27 @@ do_memopt_add (SIM_DESC sd,
       /* Allocate new well-aligned buffer, just as sim_core_attach(). */
       void *aligned_buffer;
       int padding = (addr % sizeof (unsigned64));
-      unsigned long bytes = (modulo == 0 ? nr_bytes : modulo) + padding;
+      unsigned long bytes;
+
+#ifdef HAVE_MMAP
+      struct stat s;
+
+      if (mmap_next_fd >= 0)
+       {
+         /* Check that given file is big enough. */
+         int rc = fstat (mmap_next_fd, &s);
+
+         if (rc < 0)
+           sim_io_error (sd, "Error, unable to stat file: %s\n",
+                         strerror (errno));
+
+         /* Autosize the mapping to the file length.  */
+         if (nr_bytes == 0)
+           nr_bytes = s.st_size;
+       }
+#endif
+
+      bytes = (modulo == 0 ? nr_bytes : modulo) + padding;
 
       free_buffer = NULL;
       free_length = bytes;
@@ -163,14 +183,9 @@ do_memopt_add (SIM_DESC sd,
       /* Memory map or malloc(). */
       if (mmap_next_fd >= 0)
        {
-         /* Check that given file is big enough. */
-         struct stat s;
-         int rc;
-
          /* Some kernels will SIGBUS the application if mmap'd file
             is not large enough.  */ 
-         rc = fstat (mmap_next_fd, &s);
-         if (rc < 0 || s.st_size < bytes)
+         if (s.st_size < bytes)
            {
              sim_io_error (sd,
                            "Error, cannot confirm that mmap file is large enough "
@@ -383,10 +398,15 @@ memory_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
        chp = parse_addr (chp, &level, &space, &addr);
        if (*chp != ',')
          {
-           sim_io_eprintf (sd, "Missing size for memory-region\n");
-           return SIM_RC_FAIL;
+           /* let the file autosize */
+           if (mmap_next_fd == -1)
+             {
+               sim_io_eprintf (sd, "Missing size for memory-region\n");
+               return SIM_RC_FAIL;
+             }
          }
-       chp = parse_size (chp + 1, &nr_bytes, &modulo);
+       else
+         chp = parse_size (chp + 1, &nr_bytes, &modulo);
        /* old style */
        if (*chp == ',')
          modulo = strtoul (chp + 1, &chp, 0);