aboutsummaryrefslogtreecommitdiff
path: root/src/helper/command.h
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2020-05-12 11:52:56 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2021-04-18 15:33:23 +0100
commit428938993742f4f961cdc948593d9553f721c321 (patch)
tree7a0373acf08898f0df43fd6acc726e4c66f54f02 /src/helper/command.h
parent7cd679a2de697065bbd36cde9042516ccf20f0f1 (diff)
downloadriscv-openocd-428938993742f4f961cdc948593d9553f721c321.zip
riscv-openocd-428938993742f4f961cdc948593d9553f721c321.tar.gz
riscv-openocd-428938993742f4f961cdc948593d9553f721c321.tar.bz2
helper/command: override target only on target prefixed cmds
In current code the current target is overridden whenever jim_handler_data is not NULL. This happens not only with target prefixed commands, but also with cti, dap and swo/tpiu prefixed commands. While this is not causing any run-time issue, by now, the behaviour is tricky and makes the code cryptic. Add a specific field to struct command for the target override so the content of jim_handler_data can be restricted to command specific data only (today only cti, dap and swo/tpiu). Extend the API register_commands() to specify the presence of either the command data or the override target. The new API makes obsolete calling command_set_handler_data() to set jim_handler_data, so remove it. Change-Id: Icc323faf754b0546a72208f90abd9e68ff2ef52f Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5667 Tested-by: jenkins Reviewed-by: Oleksij Rempel <linux@rempel-privat.de>
Diffstat (limited to 'src/helper/command.h')
-rw-r--r--src/helper/command.h71
1 files changed, 54 insertions, 17 deletions
diff --git a/src/helper/command.h b/src/helper/command.h
index cb088d7..871c064 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -186,11 +186,9 @@ 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 */
+ /* Command handlers can use it for any handler specific data */
+ struct target *jim_override_target;
+ /* Used only for target of target-prefixed cmd */
enum command_mode mode;
struct command *next;
};
@@ -242,6 +240,10 @@ struct command_registration {
/** Use this as the last entry in an array of command_registration records. */
#define COMMAND_REGISTRATION_DONE { .name = NULL, .chain = NULL }
+int __register_commands(struct command_context *cmd_ctx, struct command *parent,
+ const struct command_registration *cmds, void *data,
+ struct target *override_target);
+
/**
* Register one or more commands in the specified context, as children
* of @c parent (or top-level commends, if NULL). In a registration's
@@ -257,8 +259,53 @@ struct command_registration {
* NULL for all fields.
* @returns ERROR_OK on success; ERROR_FAIL if any registration fails.
*/
-int register_commands(struct command_context *cmd_ctx, struct command *parent,
- const struct command_registration *cmds);
+static inline int register_commands(struct command_context *cmd_ctx, struct command *parent,
+ const struct command_registration *cmds)
+{
+ return __register_commands(cmd_ctx, parent, cmds, NULL, NULL);
+}
+
+/**
+ * Register one or more commands, as register_commands(), plus specify
+ * that command should override the current target
+ *
+ * @param cmd_ctx The command_context in which to register the command.
+ * @param parent Register this command as a child of this, or NULL to
+ * register a top-level command.
+ * @param cmds Pointer to an array of command_registration records that
+ * contains the desired command parameters. The last record must have
+ * NULL for all fields.
+ * @param target The target that has to override current target.
+ * @returns ERROR_OK on success; ERROR_FAIL if any registration fails.
+ */
+static inline int register_commands_override_target(struct command_context *cmd_ctx,
+ struct command *parent, const struct command_registration *cmds,
+ struct target *target)
+{
+ return __register_commands(cmd_ctx, parent, cmds, NULL, target);
+}
+
+/**
+ * Register one or more commands, as register_commands(), plus specify
+ * a pointer to command private data that would be accessible through
+ * the macro CMD_DATA. The private data will not be freed when command
+ * is unregistered.
+ *
+ * @param cmd_ctx The command_context in which to register the command.
+ * @param parent Register this command as a child of this, or NULL to
+ * register a top-level command.
+ * @param cmds Pointer to an array of command_registration records that
+ * contains the desired command parameters. The last record must have
+ * NULL for all fields.
+ * @param data The command private data.
+ * @returns ERROR_OK on success; ERROR_FAIL if any registration fails.
+ */
+static inline int register_commands_with_data(struct command_context *cmd_ctx,
+ struct command *parent, const struct command_registration *cmds,
+ void *data)
+{
+ return __register_commands(cmd_ctx, parent, cmds, data, NULL);
+}
/**
* Unregisters all commands from the specified context.
@@ -272,16 +319,6 @@ int unregister_all_commands(struct command_context *cmd_ctx,
struct command *command_find_in_context(struct command_context *cmd_ctx,
const char *name);
-/**
- * Update the private command data field for a command and all descendents.
- * This is used when creating a new hierarchy of commands that depends
- * on obtaining a dynamically created context. The value will be available
- * in command handlers by using the CMD_DATA macro.
- * @param c The command (group) whose data pointer(s) will be updated.
- * @param p The new data pointer to use for the command or its descendents.
- */
-void command_set_handler_data(struct command *c, void *p);
-
void command_set_output_handler(struct command_context *context,
command_output_handler_t output_handler, void *priv);