diff options
author | Vladimir Prus <vladimir@codesourcery.com> | 2006-11-21 16:50:16 +0000 |
---|---|---|
committer | Vladimir Prus <vladimir@codesourcery.com> | 2006-11-21 16:50:16 +0000 |
commit | 4b5752d02f5e21329ae17790fd766b5f2df0d362 (patch) | |
tree | 196c10beb13b46ae12ccffd79affbbba5dbbca2c /gdb/memattr.c | |
parent | bce613b9bfac3b56f4f9742776db11aeec875300 (diff) | |
download | gdb-4b5752d02f5e21329ae17790fd766b5f2df0d362.zip gdb-4b5752d02f5e21329ae17790fd766b5f2df0d362.tar.gz gdb-4b5752d02f5e21329ae17790fd766b5f2df0d362.tar.bz2 |
gdb/
* memattr.h (enum mem_access_mode): New value
MEM_NONE.
* memattr.c (unknown_mem_attrib): New.
(inaccessible_by_default): New.
(show_inaccessible_by_default): New.
(lookup_mem_region): Check inaccessible_by_default.
(dummy_cmd): New.
(mem_set_cmdlist, mem_show_cmdlist): New.
(_initialize_mem): Register new "set" and "show"
commands.
* target.c (memory_xfer_partial): If memory type
is MEM_NONE, return an error.
Clip to region size when calling to_xfer_partial.
If upper limit of memory range is 0, don't clip
anything.
gdb/doc/
* gdb.texinfo (Memory Access Checking): New.
Diffstat (limited to 'gdb/memattr.c')
-rw-r--r-- | gdb/memattr.c | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/gdb/memattr.c b/gdb/memattr.c index 889d03a..a114dc1 100644 --- a/gdb/memattr.c +++ b/gdb/memattr.c @@ -40,6 +40,17 @@ const struct mem_attrib default_mem_attrib = -1 /* Flash blocksize not specified. */ }; +const struct mem_attrib unknown_mem_attrib = +{ + MEM_NONE, /* mode */ + MEM_WIDTH_UNSPECIFIED, + 0, /* hwbreak */ + 0, /* cache */ + 0, /* verify */ + -1 /* Flash blocksize not specified. */ +}; + + VEC(mem_region_s) *mem_region_list, *target_mem_region_list; static int mem_number = 0; @@ -53,6 +64,25 @@ static int mem_use_target = 1; empty, then the target can't supply memory regions. */ static int target_mem_regions_valid; +/* If this flag is set, gdb will assume that memory ranges not + specified by the memory map have type MEM_NONE, and will + emit errors on all accesses to that memory. */ +static int inaccessible_by_default = 0; + +static void +show_inaccessible_by_default (struct ui_file *file, int from_tty, + struct cmd_list_element *c, + const char *value) +{ + if (inaccessible_by_default) + fprintf_filtered (file, _("\ +Unknown memory addresses will be treated as inaccessible.\n")); + else + fprintf_filtered (file, _("\ +Unknown memory addresses will be treated as RAM.\n")); +} + + /* Predicate function which returns true if LHS should sort before RHS in a list of memory regions, useful for VEC_lower_bound. */ @@ -215,13 +245,17 @@ lookup_mem_region (CORE_ADDR addr) lo = 0; hi = 0; - /* If we ever want to support a huge list of memory regions, this + /* Either find memory range containing ADDRESS, or set LO and HI + to the nearest boundaries of an existing memory range. + + If we ever want to support a huge list of memory regions, this check should be replaced with a binary search (probably using VEC_lower_bound). */ for (ix = 0; VEC_iterate (mem_region_s, mem_region_list, ix, m); ix++) { if (m->enabled_p == 1) { + /* If the address is in the memory region, return that memory range. */ if (addr >= m->lo && (addr < m->hi || m->hi == 0)) return m; @@ -243,7 +277,15 @@ lookup_mem_region (CORE_ADDR addr) was learned above. */ region.lo = lo; region.hi = hi; - region.attrib = default_mem_attrib; + + /* When no memory map is defined at all, we always return + 'default_mem_attrib', so that we do not make all memory + inaccessible for targets that don't provide a memory map. */ + if (inaccessible_by_default && !VEC_empty (mem_region_s, mem_region_list)) + region.attrib = unknown_mem_attrib; + else + region.attrib = default_mem_attrib; + return ®ion; } @@ -674,9 +716,17 @@ mem_delete_command (char *args, int from_tty) dont_repeat (); } + +static void +dummy_cmd (char *args, int from_tty) +{ +} extern initialize_file_ftype _initialize_mem; /* -Wmissing-prototype */ +static struct cmd_list_element *mem_set_cmdlist; +static struct cmd_list_element *mem_show_cmdlist; + void _initialize_mem (void) { @@ -709,4 +759,25 @@ Do \"info mem\" to see current list of code numbers."), &deletelist); add_info ("mem", mem_info_command, _("Memory region attributes")); + + add_prefix_cmd ("mem", class_vars, dummy_cmd, _("\ +Memory regions settings"), + &mem_set_cmdlist, "set mem ", + 0/* allow-unknown */, &setlist); + add_prefix_cmd ("mem", class_vars, dummy_cmd, _("\ +Memory regions settings"), + &mem_show_cmdlist, "show mem ", + 0/* allow-unknown */, &showlist); + + add_setshow_boolean_cmd ("inaccessible-by-default", no_class, + &inaccessible_by_default, _("\ +Set handling of unknown memory regions."), _("\ +Show handling of unknown memory regions."), _("\ +If on, and some memory map is defined, debugger will emit errors on\n\ +accesses to memory not defined in the memory map. If off, accesses to all\n\ +memory addresses will be allowed."), + NULL, + show_inaccessible_by_default, + &mem_set_cmdlist, + &mem_show_cmdlist); } |