diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/remote-sim.c | 18 | ||||
-rw-r--r-- | include/gdb/ChangeLog | 4 | ||||
-rw-r--r-- | include/gdb/remote-sim.h | 9 | ||||
-rw-r--r-- | sim/common/ChangeLog | 4 | ||||
-rw-r--r-- | sim/common/sim-core.c | 57 |
6 files changed, 98 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f3357d5..02c561d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2021-01-07 Mike Frysinger <vapier@gentoo.org> + + * remote-sim.c: Include memory-map.h. + (gdbsim_target): Define memory_map override. + (gdbsim_target::memory_map): Define. + 2021-01-07 Tom Tromey <tromey@adacore.com> * ada-lang.c (do_full_match): Conditionally skip "_ada_" prefix. diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c index c4f3913..b21a4e8 100644 --- a/gdb/remote-sim.c +++ b/gdb/remote-sim.c @@ -42,6 +42,7 @@ #include "readline/readline.h" #include "gdbthread.h" #include "gdbsupport/byte-vector.h" +#include "memory-map.h" /* Prototypes */ @@ -164,6 +165,7 @@ struct gdbsim_target final bool has_all_memory () override; bool has_memory () override; + std::vector<mem_region> memory_map () override; private: sim_inferior_data *get_inferior_data_by_ptid (ptid_t ptid, @@ -1270,6 +1272,22 @@ gdbsim_target::has_memory () return true; } +/* Get memory map from the simulator. */ + +std::vector<mem_region> +gdbsim_target::memory_map () +{ + struct sim_inferior_data *sim_data + = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED); + std::vector<mem_region> result; + gdb::unique_xmalloc_ptr<char> text (sim_memory_map (sim_data->gdbsim_desc)); + + if (text != nullptr) + result = parse_memory_map (text.get ()); + + return result; +} + void _initialize_remote_sim (); void _initialize_remote_sim () diff --git a/include/gdb/ChangeLog b/include/gdb/ChangeLog index 0ae9e0b..27efbaf 100644 --- a/include/gdb/ChangeLog +++ b/include/gdb/ChangeLog @@ -1,3 +1,7 @@ +2021-01-07 Mike Frysinger <vapier@gentoo.org> + + * remote-sim.h (sim_memory_map): Define. + 2016-07-15 John Baldwin <jhb@FreeBSD.org> * signals.def: Add GDB_SIGNAL_LIBRT. diff --git a/include/gdb/remote-sim.h b/include/gdb/remote-sim.h index 73fb670..a3ba3aa 100644 --- a/include/gdb/remote-sim.h +++ b/include/gdb/remote-sim.h @@ -213,6 +213,15 @@ int sim_store_register (SIM_DESC sd, int regno, unsigned char *buf, int length); void sim_info (SIM_DESC sd, int verbose); +/* Return a memory map in XML format. + + The caller must free the returned string. + + For details on the format, see GDB's Memory Map Format documentation. */ + +char *sim_memory_map (SIM_DESC sd); + + /* Run (or resume) the simulated program. STEP, when non-zero indicates that only a single simulator cycle 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, |