aboutsummaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
Diffstat (limited to 'sim')
-rw-r--r--sim/common/ChangeLog4
-rw-r--r--sim/common/sim-core.c57
2 files changed, 61 insertions, 0 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog
index 0898a6f..05948f2 100644
--- a/sim/common/ChangeLog
+++ b/sim/common/ChangeLog
@@ -1,3 +1,7 @@
+2021-01-07 Mike Frysinger <vapier@gentoo.org>
+
+ * sim-core.c (sim_memory_map): Define.
+
2021-01-04 Mike Frysinger <vapier@gentoo.org>
* acinclude.m4 (ACX_BUGURL): Change http:// to https://.
diff --git a/sim/common/sim-core.c b/sim/common/sim-core.c
index 74369aa..5382306 100644
--- a/sim/common/sim-core.c
+++ b/sim/common/sim-core.c
@@ -453,6 +453,63 @@ sim_core_translate (sim_core_mapping *mapping,
#if EXTERN_SIM_CORE_P
+/* See include/gdb/remote-sim.h. */
+char *
+sim_memory_map (SIM_DESC sd)
+{
+ sim_core *core = STATE_CORE (sd);
+ unsigned map;
+ char *s1, *s2, *entry;
+
+ s1 = xstrdup (
+ "<?xml version='1.0'?>\n"
+ "<!DOCTYPE memory-map PUBLIC '+//IDN gnu.org//DTD GDB Memory Map V1.0//EN'"
+ " 'http://sourceware.org/gdb/gdb-memory-map.dtd'>\n"
+ "<memory-map>\n");
+
+ for (map = 0; map < nr_maps; ++map)
+ {
+ sim_core_mapping *mapping;
+
+ for (mapping = core->common.map[map].first;
+ mapping != NULL;
+ mapping = mapping->next)
+ {
+ /* GDB can only handle a single address space. */
+ if (mapping->level != 0)
+ continue;
+
+ entry = xasprintf ("<memory type='ram' start='%#x' length='%#x'/>\n",
+ mapping->base, mapping->nr_bytes);
+ /* The sim memory map is organized by access, not by addresses.
+ So a RWX memory map will have three independent mappings.
+ GDB's format cannot support overlapping regions, so we have
+ to filter those out.
+
+ Further, GDB can only handle RX ("rom") or RWX ("ram") mappings.
+ We just emit "ram" everywhere to keep it simple. If GDB ever
+ gains support for more stuff, we can expand this.
+
+ Using strstr is kind of hacky, but as long as the map is not huge
+ (we're talking <10K), should be fine. */
+ if (strstr (s1, entry) == NULL)
+ {
+ s2 = concat (s1, entry, NULL);
+ free (s1);
+ s1 = s2;
+ }
+ free (entry);
+ }
+ }
+
+ s2 = concat (s1, "</memory-map>", NULL);
+ free (s1);
+ return s2;
+}
+#endif
+
+
+#if EXTERN_SIM_CORE_P
unsigned
sim_core_read_buffer (SIM_DESC sd,
sim_cpu *cpu,