sim: add --map-info option
authorMike Frysinger <vapier@gentoo.org>
Wed, 15 Dec 2010 11:50:46 +0000 (11:50 +0000)
committerMike Frysinger <vapier@gentoo.org>
Wed, 15 Dec 2010 11:50:46 +0000 (11:50 +0000)
There are options for listing the current device/hw tree and memory
regions, but no way to find out at run time all the current mappings.
So add a new --map-info option akin to the --memory-info option which
displays all the current mappings.

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

index dc6ffef3f6259893fcbe0ec0968c54958768f571..5a368c935afd358ce1a41ab292be12963f553171 100644 (file)
@@ -1,3 +1,9 @@
+2010-12-15  Mike Frysinger  <vapier@gentoo.org>
+
+       * sim-memopt.c (OPTION_MAP_INFO): Define.
+       (memory_options): Handle --map-info.
+       (memory_option_handler): Handle OPTION_MAP_INFO.
+
 2010-11-22  Mike Frysinger  <vapier@gentoo.org>
 
        * sim-profile.c (PROFILE_PC_FREQ, PROFILE_PC_NR_BUCKETS,
index 47b6c9e37dc21742e1c445aa67179de055f79ef6..99e6add3f7162178cd6924d305e5fc8392b87842 100644 (file)
@@ -67,7 +67,8 @@ enum {
   OPTION_MEMORY_ALIAS,
   OPTION_MEMORY_CLEAR,
   OPTION_MEMORY_FILL,
-  OPTION_MEMORY_MAPFILE
+  OPTION_MEMORY_MAPFILE,
+  OPTION_MAP_INFO
 };
 
 static DECLARE_OPTION_HANDLER (memory_option_handler);
@@ -113,6 +114,9 @@ static const OPTION memory_options[] =
   { {"info-memory", no_argument, NULL, OPTION_MEMORY_INFO },
       '\0', NULL, NULL,
       memory_option_handler },
+  { {"map-info", no_argument, NULL, OPTION_MAP_INFO },
+      '\0', NULL, "List mapped regions",
+      memory_option_handler },
 
   { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL }
 };
@@ -520,6 +524,45 @@ memory_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
        break;
       }
 
+    case OPTION_MAP_INFO:
+      {
+       sim_core *memory = STATE_CORE (sd);
+       unsigned nr_map;
+
+       for (nr_map = 0; nr_map < nr_maps; ++nr_map)
+         {
+           sim_core_map *map = &memory->common.map[nr_map];
+           sim_core_mapping *mapping = map->first;
+
+           if (!mapping)
+             continue;
+
+           sim_io_printf (sd, "%s maps:\n", map_to_str (nr_map));
+           do
+             {
+               unsigned modulo;
+
+               sim_io_printf (sd, " map ");
+               if (mapping->space != 0)
+                 sim_io_printf (sd, "0x%x:", mapping->space);
+               sim_io_printf (sd, "0x%08lx", (long) mapping->base);
+               if (mapping->level != 0)
+                 sim_io_printf (sd, "@0x%x", mapping->level);
+               sim_io_printf (sd, ",0x%lx", (long) mapping->nr_bytes);
+               modulo = mapping->mask + 1;
+               if (modulo != 0)
+                 sim_io_printf (sd, "%%0x%x", modulo);
+               sim_io_printf (sd, "\n");
+
+               mapping = mapping->next;
+             }
+           while (mapping);
+         }
+
+       return SIM_RC_OK;
+       break;
+      }
+
     default:
       sim_io_eprintf (sd, "Unknown memory option %d\n", opt);
       return SIM_RC_FAIL;