diff options
author | Luis Machado <lgustavo@codesourcery.com> | 2017-01-20 08:13:03 -0600 |
---|---|---|
committer | Luis Machado <lgustavo@codesourcery.com> | 2017-01-20 08:13:03 -0600 |
commit | 78cbbba8e0bc8b0288f5ce4360b4689ab893aa13 (patch) | |
tree | c5a8f0de7e5bfc097b12bd94b47808c71628e53f | |
parent | 7f784814df7067396e9c00b5cdc0eff9cd5c68de (diff) | |
download | gdb-78cbbba8e0bc8b0288f5ce4360b4689ab893aa13.zip gdb-78cbbba8e0bc8b0288f5ce4360b4689ab893aa13.tar.gz gdb-78cbbba8e0bc8b0288f5ce4360b4689ab893aa13.tar.bz2 |
Add command to erase all flash memory regions
Changes in v4:
- Replaced phex call with hex_string.
Changes in v3:
- Addressed comments by Pedro.
- Output of memory region size now in hex format.
- Misc formatting fixups.
- Addressed Simon's comments on formatting.
- Adjusted command text in the manual entry.
- Fixed up ChangeLog.
- Renamed flash_erase_all_command to flash_erase_command.
Changes in v2:
- Added NEWS entry.
- Fixed long lines.
- Address printing with paddress.
Years ago we contributed flash programming patches upstream. The following
patch is a leftover one that complements that functionality by adding a new
command to erase all reported flash memory blocks.
The command is most useful when we're dealing with flash-enabled targets
(mostly bare-metal) and we need to reset the board for some reason.
The wiping out of flash memory regions should help the target come up with a
known clean state from which the user can load a new image and resume
debugging. It is convenient enough to do this from the debugger, and there is
also an MI command to expose this functionality to the IDE's.
gdb/doc/ChangeLog:
2017-01-20 Mike Wrighton <mike_wrighton@codesourcery.com>
Luis Machado <lgustavo@codesourcery.com>
* gdb.texinfo (-target-flash-erase): New MI command description.
(flash-erase): New CLI command description.
gdb/ChangeLog:
2017-01-20 Mike Wrighton <mike_wrighton@codesourcery.com>
Luis Machado <lgustavo@codesourcery.com>
* NEWS (New commands): Mention flash-erase.
(New MI commands): Mention target-flash-erase.
* mi/mi-cmds.c (mi_cmd_target_flash_erase): Add target-flash-erase MI
command.
* mi/mi-cmds.h (mi_cmd_target_flash_erase): New declaration.
* mi/mi-main.c (mi_cmd_target_flash_erase): New function.
* target.c (flash_erase_command): New function.
(initialize_targets): Add new flash-erase command.
* target.h (flash_erase_command): New declaration.
-rw-r--r-- | gdb/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/NEWS | 11 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 32 | ||||
-rw-r--r-- | gdb/mi/mi-cmds.c | 1 | ||||
-rw-r--r-- | gdb/mi/mi-cmds.h | 1 | ||||
-rw-r--r-- | gdb/mi/mi-main.c | 6 | ||||
-rw-r--r-- | gdb/target.c | 49 | ||||
-rw-r--r-- | gdb/target.h | 3 |
9 files changed, 122 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fd42635..1aef3f5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2017-01-20 Mike Wrighton <mike_wrighton@codesourcery.com> + Luis Machado <lgustavo@codesourcery.com> + + * NEWS (New commands): Mention flash-erase. + (New MI commands): Mention target-flash-erase. + * mi/mi-cmds.c (mi_cmd_target_flash_erase): Add target-flash-erase MI + command. + * mi/mi-cmds.h (mi_cmd_target_flash_erase): New declaration. + * mi/mi-main.c (mi_cmd_target_flash_erase): New function. + * target.c (flash_erase_command): New function. + (initialize_targets): Add new flash-erase command. + * target.h (flash_erase_command): New declaration. + 2017-01-20 Joel Brobecker <brobecker@adacore.com> * nat/linux-ptrace.c: Only include <sys/procfs.h> if @@ -57,6 +57,17 @@ FreeBSD/mips mips*-*-freebsd Synopsys ARC arc*-*-elf32 FreeBSD/mips mips*-*-freebsd +* New commands + +flash-erase + Erases all the flash memory regions reported by the target. + +* New MI commands + +-target-flash-erase + Erases all the flash memory regions reported by the target. This is + equivalent to the CLI command flash-erase. + *** Changes in GDB 7.12 * GDB and GDBserver now build with a C++ compiler by default. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 4c6e718..4d69e36 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2017-01-20 Mike Wrighton <mike_wrighton@codesourcery.com> + Luis Machado <lgustavo@codesourcery.com> + + * gdb.texinfo (-target-flash-erase): New MI command description. + (flash-erase): New CLI command description. + 2017-01-04 John Baldwin <jhb@FreeBSD.org> * gdb.texinfo (Contributors): Add SRI International and University diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 2b6b654..dcca91b 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -19622,6 +19622,16 @@ load programs into flash memory. @code{load} does not repeat if you press @key{RET} again after using it. @end table +@table @code + +@kindex flash-erase +@item flash-erase +@anchor{flash-erase} + +Erases all known flash memory regions on the target. + +@end table + @node Byte Order @section Choosing Target Byte Order @@ -31859,6 +31869,28 @@ No equivalent. @subsubheading Example N.A. +@subheading The @code{-target-flash-erase} Command +@findex -target-flash-erase + +@subsubheading Synopsis + +@smallexample + -target-flash-erase +@end smallexample + +Erases all known flash memory regions on the target. + +The corresponding @value{GDBN} command is @samp{flash-erase}. + +The output is a list of flash regions that have been erased, with starting +addresses and memory region sizes. + +@smallexample +(gdb) +-target-flash-erase +^done,erased-regions=@{address="0x0",size="0x40000"@} +(gdb) +@end smallexample @subheading The @code{-target-select} Command @findex -target-select diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index cdea008..abb70bd 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -147,6 +147,7 @@ static struct mi_cmd mi_cmds[] = DEF_MI_CMD_MI ("target-file-delete", mi_cmd_target_file_delete), DEF_MI_CMD_MI ("target-file-get", mi_cmd_target_file_get), DEF_MI_CMD_MI ("target-file-put", mi_cmd_target_file_put), + DEF_MI_CMD_MI ("target-flash-erase", mi_cmd_target_flash_erase), DEF_MI_CMD_CLI ("target-select", "target", 1), DEF_MI_CMD_MI ("thread-info", mi_cmd_thread_info), DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids), diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index 8bd947b..d0906e6 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -93,6 +93,7 @@ extern mi_cmd_argv_ftype mi_cmd_target_detach; extern mi_cmd_argv_ftype mi_cmd_target_file_get; extern mi_cmd_argv_ftype mi_cmd_target_file_put; extern mi_cmd_argv_ftype mi_cmd_target_file_delete; +extern mi_cmd_argv_ftype mi_cmd_target_flash_erase; extern mi_cmd_argv_ftype mi_cmd_thread_info; extern mi_cmd_argv_ftype mi_cmd_thread_list_ids; extern mi_cmd_argv_ftype mi_cmd_thread_select; diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 22803cb..57c23eb 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -553,6 +553,12 @@ mi_cmd_target_detach (char *command, char **argv, int argc) } void +mi_cmd_target_flash_erase (char *command, char **argv, int argc) +{ + flash_erase_command (NULL, 0); +} + +void mi_cmd_thread_select (char *command, char **argv, int argc) { enum gdb_rc rc; diff --git a/gdb/target.c b/gdb/target.c index be7367c..3c409f0 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -3943,6 +3943,52 @@ do_monitor_command (char *cmd, target_rcmd (cmd, gdb_stdtarg); } +/* Erases all the memory regions marked as flash. CMD and FROM_TTY are + ignored. */ + +void +flash_erase_command (char *cmd, int from_tty) +{ + /* Used to communicate termination of flash operations to the target. */ + bool found_flash_region = false; + struct mem_region *m; + struct gdbarch *gdbarch = target_gdbarch (); + + VEC(mem_region_s) *mem_regions = target_memory_map (); + + /* Iterate over all memory regions. */ + for (int i = 0; VEC_iterate (mem_region_s, mem_regions, i, m); i++) + { + /* Fetch the memory attribute. */ + struct mem_attrib *attrib = &m->attrib; + + /* Is this a flash memory region? */ + if (attrib->mode == MEM_FLASH) + { + found_flash_region = true; + target_flash_erase (m->lo, m->hi - m->lo); + + struct cleanup *cleanup_tuple + = make_cleanup_ui_out_tuple_begin_end (current_uiout, + "erased-regions"); + + current_uiout->message (_("Erasing flash memory region at address ")); + current_uiout->field_fmt ("address", "%s", paddress (gdbarch, + m->lo)); + current_uiout->message (", size = "); + current_uiout->field_fmt ("size", "%s", hex_string (m->hi - m->lo)); + current_uiout->message ("\n"); + do_cleanups (cleanup_tuple); + } + } + + /* Did we do any flash operations? If so, we need to finalize them. */ + if (found_flash_region) + target_flash_done (); + else + current_uiout->message (_("No flash memory regions found.\n")); +} + /* Print the name of each layers of our target stack. */ static void @@ -4233,6 +4279,9 @@ Otherwise, any attempt to interrupt or stop will be ignored."), set_target_permissions, NULL, &setlist, &showlist); + add_com ("flash-erase", no_class, flash_erase_command, + _("Erase all flash memory regions.")); + add_setshow_boolean_cmd ("auto-connect-native-target", class_support, &auto_connect_native_target, _("\ Set whether GDB may automatically connect to the native target."), _("\ diff --git a/gdb/target.h b/gdb/target.h index f2b9181..8df117e 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -1451,6 +1451,9 @@ extern int target_write_raw_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, is returned. */ VEC(mem_region_s) *target_memory_map (void); +/* Erases all flash memory regions on the target. */ +void flash_erase_command (char *cmd, int from_tty); + /* Erase the specified flash region. */ void target_flash_erase (ULONGEST address, LONGEST length); |