From patchwork Fri Jan 6 16:41:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Machado X-Patchwork-Id: 18811 Received: (qmail 114007 invoked by alias); 6 Jan 2017 16:41:57 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 113996 invoked by uid 89); 6 Jan 2017 16:41:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, SPF_PASS, URIBL_RED autolearn=ham version=3.3.2 spammy=choosing, ides, layers, Choosing X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 06 Jan 2017 16:41:46 +0000 Received: from svr-orw-fem-02x.mgc.mentorg.com ([147.34.96.206] helo=SVR-ORW-FEM-02.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1cPXaK-00054F-HU from Luis_Gustavo@mentor.com for gdb-patches@sourceware.org; Fri, 06 Jan 2017 08:41:44 -0800 Received: from Opsys.world.mentorg.com (147.34.91.1) by svr-orw-fem-02.mgc.mentorg.com (147.34.96.168) with Microsoft SMTP Server id 14.3.224.2; Fri, 6 Jan 2017 08:41:43 -0800 From: Luis Machado To: Subject: [PATCH] Add command to erase all flash memory regions Date: Fri, 6 Jan 2017 10:41:41 -0600 Message-ID: <1483720901-6516-1-git-send-email-lgustavo@codesourcery.com> MIME-Version: 1.0 X-IsSubscribed: yes 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. Regression tested on Ubuntu 16.04 x86-64. No regressions. Thoughts? gdb/doc/ChangeLog: 2017-01-05 Mike Wrighton Luis Machado * gdb.texinfo (-target-flash-erase): New MI command description. (flash-erase): New CLI command description. gdb/ChangeLog: 2017-01-05 Mike Wrighton Luis Machado * mi/mi-cmds.c (mi_cmd_target_flash_erase): Added 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-memory.c: Include "memattr.h" and "ui-out.h". * target.c (flash_erase_all_command): New function. (initialize_targets): Add new flash-erase command. * target.h (flash_erase_all_command): New declaration. --- gdb/doc/gdb.texinfo | 32 ++++++++++++++++++++++++++++++++ gdb/mi/mi-cmds.c | 1 + gdb/mi/mi-cmds.h | 1 + gdb/mi/mi-main.c | 5 +++++ gdb/target.c | 40 ++++++++++++++++++++++++++++++++++++++++ gdb/target.h | 3 +++ 6 files changed, 82 insertions(+) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index ccb95ad..44ae068 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -19617,6 +19617,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 @@ -31854,6 +31864,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, sorted by +address/size. + +@smallexample +(gdb) +-target-flash-erase +^done,erased-regions=@{address="0x0",size="262144"@} +(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..e432a01 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -552,6 +552,11 @@ mi_cmd_target_detach (char *command, char **argv, int argc) detach_command (NULL, 0); } +void mi_cmd_target_flash_erase (char *command, char **argv, int argc) +{ + flash_erase_all_command (NULL, 0); +} + void mi_cmd_thread_select (char *command, char **argv, int argc) { diff --git a/gdb/target.c b/gdb/target.c index be7367c..82b3187 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -3943,6 +3943,43 @@ do_monitor_command (char *cmd, target_rcmd (cmd, gdb_stdtarg); } +void +flash_erase_all_command (char *cmd, int from_tty) +{ + int i; + int found_flash_region = 0; + struct mem_region *m; + struct mem_attrib *attrib; + struct cleanup *cleanup_tuple; + + VEC(mem_region_s) * mem_regions = target_memory_map (); + + /* Iterate over all memory regions. */ + for (i = 0; VEC_iterate (mem_region_s, mem_regions, i, m); i++) + { + attrib = &m->attrib; + + /* Is this a flash memory region? */ + if (attrib->mode == MEM_FLASH) + { + found_flash_region = 1; + target_flash_erase (m->lo, m->hi - m->lo); + cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (current_uiout, "erasing-regions"); + current_uiout->message ("Erasing flash memory region at address "); + current_uiout->field_fmt ("address", "0x%x", (unsigned int) m->lo); + current_uiout->message (", size = "); + current_uiout->field_fmt ("size", "%lu", (unsigned long) (m->hi - m->lo)); + current_uiout->message ("\n"); + do_cleanups (cleanup_tuple); + } + } + + 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 +4270,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_all_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..e239c2c 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_all_command (char *cmd, int from_tty); + /* Erase the specified flash region. */ void target_flash_erase (ULONGEST address, LONGEST length);