aboutsummaryrefslogtreecommitdiff
path: root/src/helper/command.h
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2017-11-21 22:57:39 +0100
committerMatthias Welwarsky <matthias@welwarsky.de>2018-03-03 08:40:09 +0000
commitbb9d9c60264a905926e0d15f84842858d0de80b7 (patch)
treecb402f03c09d0c1358c87775eb5d4443b585caf2 /src/helper/command.h
parenteaeb4191e55c3a23582ecb40b852f95c2e0ea917 (diff)
downloadriscv-openocd-bb9d9c60264a905926e0d15f84842858d0de80b7.zip
riscv-openocd-bb9d9c60264a905926e0d15f84842858d0de80b7.tar.gz
riscv-openocd-bb9d9c60264a905926e0d15f84842858d0de80b7.tar.bz2
target: use correct target in target-prefixed commands and event handlers
This change contains an alternative to Matthias Welwarsky's #4130 (target-prefixed commands) and to #4293 (event handlers). get_current_target() must retrieve the target associated to the current command. If no target associated, the current target of the command context is used as a fallback. Many Tcl event handlers work with the current target as if it were the target issuing the event. current_target in command_context is a number and has to be converted to a pointer in every get_current_target() call. The solution: - Replace current_target in command_context by a target pointer - Add another target pointer current_target_override - get_current_target() returns current_target_override if set, otherwise current_target - Save, set and restore current_target_override to the current prefix in run_command() - Save, set and restore current_target_override to the event invoking target in target_handle_event() While on it use calloc when allocating a new command_context. Change-Id: I9a82102e94dcac063743834a1d28da861b2e74ea Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Suggested-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com> Reviewed-on: http://openocd.zylin.com/4295 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
Diffstat (limited to 'src/helper/command.h')
-rw-r--r--src/helper/command.h15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/helper/command.h b/src/helper/command.h
index f696ab8..1a26c06 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -49,7 +49,15 @@ struct command_context {
Jim_Interp *interp;
enum command_mode mode;
struct command *commands;
- int current_target;
+ struct target *current_target;
+ /* The target set by 'targets xx' command or the latest created */
+ struct target *current_target_override;
+ /* If set overrides current_target
+ * It happens during processing of
+ * 1) a target prefixed command
+ * 2) an event handler
+ * Pay attention to reentrancy when setting override.
+ */
command_output_handler_t output_handler;
void *output_handler_priv;
};
@@ -168,6 +176,11 @@ struct command {
command_handler_t handler;
Jim_CmdProc *jim_handler;
void *jim_handler_data;
+ /* Currently used only for target of target-prefixed cmd.
+ * Native OpenOCD commands use jim_handler_data exclusively
+ * as a target override.
+ * Jim handlers outside of target cmd tree can use
+ * jim_handler_data for any handler specific data */
enum command_mode mode;
struct command *next;
};