This is an automated email from Gerrit.

"Antonio Borneo <borneo.anto...@gmail.com>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/6851

-- gerrit

commit f9177a65b3bed946efc4d486a850b63421cecf57
Author: Antonio Borneo <borneo.anto...@gmail.com>
Date:   Fri Feb 18 17:25:58 2022 +0100

    openocd: add post-init and pre-shutdown helpers
    
    It is a common requirement to automatically execute some command
    after "init".
    This can be achieved, either in scripts or through OpenOCD command
    line, by explicitly calling "init" followed by the commands.
    But this approach fails if the request for post-init commands is
    spread across configuration files; only one of the files can split
    pre-init and post-init status by calling "init".
    The common workaround is to "rename" the command "init" and
    replace it with a TCL proc that calls the original "init" and the
    post-init commands. E.g. in Zephyr script [1].
    
    To simplify and formalize the post-init execution, use a TCL list
    that contains the list of commands to be executed. Every script
    can contribute adding new commands, e.g. using "lappend".
    
    In the same way, formalize the pre-shutdown execution with a TCL
    list of user commands to be executed before OpenOCD exit.
    
    Document them and add trivial examples.
    
    Drop from documentation the suggestion to rename "shutdown".
    
    Change-Id: I9464fb40ccede3e7760d425873adca363b49a64f
    Signed-off-by: Antonio Borneo <borneo.anto...@gmail.com>
    Link: [1] 
https://github.com/zephyrproject-rtos/zephyr/blob/zephyr-v2.7.1/boards/arm/nucleo_h743zi/support/openocd.cfg#L15

diff --git a/doc/openocd.texi b/doc/openocd.texi
index fd4a81da2..2765ee9d4 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -2120,6 +2120,14 @@ corresponding subsystems:
 @deffnx {Config Command} {pld init}
 @deffnx {Command} {tpiu init}
 @end deffn
+
+At last, @command{init} executes all the commands that are specified in
+the TCL list @var{post_init_commands}. The commands are executed in the
+same order they occupy in the list.
+@example
+lappend post_init_commands {echo "OpenOCD successfully initialized."}
+lappend post_init_commands {echo "Have fun with OpenOCD !"}
+@end example
 @end deffn
 
 @deffn {Config Command} {noinit}
@@ -8383,18 +8391,15 @@ Close the OpenOCD server, disconnecting all clients 
(GDB, telnet,
 other). If option @option{error} is used, OpenOCD will return a
 non-zero exit code to the parent process.
 
-Like any TCL commands, also @command{shutdown} can be redefined, e.g.:
+It is possible to specify, in the TCL list @var{pre_shutdown_commands} , a
+set of commands to be automatically executed before @command{shutdown} , e.g.:
 @example
-# redefine shutdown
-rename shutdown original_shutdown
-proc shutdown @{@} @{
-    puts "This is my implementation of shutdown"
-    # my own stuff before exit OpenOCD
-    original_shutdown
-@}
+lappend pre_shutdown_commands {echo "Goodbye, my friend ..."}
+lappend pre_shutdown_commands {echo "see you soon !"}
 @end example
-If user types CTRL-C or kills OpenOCD, either the command @command{shutdown}
-or its replacement will be automatically executed before OpenOCD exits.
+If user types CTRL-C or kills OpenOCD, the command @command{shutdown} is
+invoked and the commands in the list will be executed (in the same order
+they occupy in the list) before OpenOCD exits.
 @end deffn
 
 @anchor{debuglevel}
diff --git a/src/helper/startup.tcl b/src/helper/startup.tcl
index 71f489dd5..6389262a3 100644
--- a/src/helper/startup.tcl
+++ b/src/helper/startup.tcl
@@ -28,4 +28,26 @@ proc script {filename} {
 add_help_text script "filename of OpenOCD script (tcl) to run"
 add_usage_text script "<file>"
 
+# Run a list of post-init commands
+# Each command should be added with 'lappend post_init_commands command'
+lappend _telnet_autocomplete_skip _run_post_init_commands
+proc _run_post_init_commands {} {
+       if {[info exists ::post_init_commands]} {
+               foreach cmd $::post_init_commands {
+                       eval $cmd
+               }
+       }
+}
+
+# Run a list of pre-shutdown commands
+# Each command should be added with 'lappend pre_shutdown_commands command'
+lappend _telnet_autocomplete_skip _run_pre_shutdown_commands
+proc _run_pre_shutdown_commands {} {
+       if {[info exists ::pre_shutdown_commands]} {
+               foreach cmd $::pre_shutdown_commands {
+                       eval $cmd
+               }
+       }
+}
+
 #########
diff --git a/src/openocd.c b/src/openocd.c
index 3c96d3214..fdc4a874b 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -182,6 +182,9 @@ COMMAND_HANDLER(handle_init_command)
 
        target_register_event_callback(log_target_callback_event_handler, 
CMD_CTX);
 
+       if (command_run_line(CMD_CTX, "_run_post_init_commands") != ERROR_OK)
+               return ERROR_FAIL;
+
        return ERROR_OK;
 }
 
diff --git a/src/server/server.c b/src/server/server.c
index 1569f5a2c..68b58e319 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -758,6 +758,8 @@ COMMAND_HANDLER(handle_shutdown_command)
 
        shutdown_openocd = SHUTDOWN_REQUESTED;
 
+       command_run_line(CMD_CTX, "_run_pre_shutdown_commands");
+
        if (CMD_ARGC == 1) {
                if (!strcmp(CMD_ARGV[0], "error")) {
                        shutdown_openocd = SHUTDOWN_WITH_ERROR_CODE;

-- 

Reply via email to