This is an automated email from Gerrit. Marc Schink ([email protected]) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/5313
-- gerrit commit ccc1fa4d70c3fbc67389abf21050afe1d24c249c Author: Marc Schink <[email protected]> Date: Wed Jul 10 07:30:46 2019 +0200 target/tcl: Add array2reg function Change-Id: I97a01b93046cb7af289792489f77f5580312585a Signed-off-by: Marc Schink <[email protected]> diff --git a/doc/openocd.texi b/doc/openocd.texi index 4193d02..e41af89 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -4644,6 +4644,15 @@ numbers and their corresponding values. @end itemize @end deffn +@deffn Command {$target_name array2reg} arrayname +Write register values from a Tcl array to the target. The array must contain +register numbers and their corresponding values. + +@itemize +@item @var{arrayname} ... name of an array variable +@end itemize +@end deffn + @deffn Command {$target_name cget} queryparm Each configuration parameter accepted by @command{$target_name configure} diff --git a/src/target/target.c b/src/target/target.c index 6c73dd6..fefaf1e 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -69,6 +69,8 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, Jim_Obj * const *argv); static int target_reg2array(Jim_Interp *interp, struct target *target, int argc, Jim_Obj * const *argv); +static int target_array2reg(Jim_Interp *interp, struct target *target, + int argc, Jim_Obj * const *argv); static int target_register_user_commands(struct command_context *cmd_ctx); static int target_get_gdb_fileio_info_default(struct target *target, struct gdb_fileio_info *fileio_info); @@ -4351,6 +4353,23 @@ static int jim_reg2array(Jim_Interp *interp, int argc, Jim_Obj * const *argv) return target_reg2array(interp, target, argc - 1, argv + 1); } +static int jim_array2reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv) +{ + struct command_context *context; + struct target *target; + + context = current_command_context(interp); + assert(context != NULL); + + target = get_current_target(context); + if (target == NULL) { + LOG_ERROR("array2reg: no current target"); + return JIM_ERR; + } + + return target_array2reg(interp, target, argc - 1, argv + 1); +} + static int target_reg2array(Jim_Interp *interp, struct target *target, int argc, Jim_Obj * const *argv) { @@ -4600,6 +4619,66 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, return e; } +static int target_array2reg(Jim_Interp *interp, struct target *target, + int argc, Jim_Obj * const *argv) +{ + if (argc != 1) { + Jim_WrongNumArgs(interp, 0, argv, "arrayname"); + return JIM_ERR; + } + + int len; + const char *varname = Jim_GetString(argv[0], &len); + Jim_Obj *dict_name = Jim_NewStringObj(interp, varname, -1); + Jim_Obj *dict_var = Jim_GetVariable(interp, dict_name, JIM_ERRMSG); + + if (!dict_var) { + Jim_FreeNewObj(interp, dict_name); + Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); + Jim_AppendStrings(interp, Jim_GetResult(interp), + "array2reg: variable name does not exist", NULL); + return JIM_ERR; + } + + int n; + Jim_Obj **reg_dict = NULL; + + if (Jim_DictPairs(interp, dict_var, ®_dict, &n) != JIM_OK) { + Jim_FreeNewObj(interp, dict_name); + return JIM_ERR; + } + + Jim_FreeNewObj(interp, dict_name); + + for (int i = 0; i < n; i = i + 2) { + long tmp; + + if (Jim_GetLong(interp, reg_dict[i], &tmp) != JIM_OK) { + Jim_Free(reg_dict); + return JIM_ERR; + } + + uint32_t register_index = tmp; + + if (Jim_GetLong(interp, reg_dict[i + 1], &tmp) != JIM_OK) { + Jim_Free(reg_dict); + return JIM_ERR; + } + + uint32_t value = tmp; + struct reg *reg = register_get_by_number(target->reg_cache, + register_index, true); + + if (reg) { + buf_set_u32(reg->value, 0, 32, value); + reg->dirty = true; + } + } + + Jim_Free(reg_dict); + + return ERROR_OK; +} /* FIX? should we propagate errors here rather than printing them * and continuing? */ @@ -5033,6 +5112,13 @@ static int jim_target_reg2array(Jim_Interp *interp, return target_reg2array(interp, target, argc - 1, argv + 1); } +static int jim_target_array2reg(Jim_Interp *interp, + int argc, Jim_Obj * const *argv) +{ + struct target *target = Jim_CmdPrivData(interp); + return target_array2reg(interp, target, argc - 1, argv + 1); +} + static int jim_target_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { @@ -5384,6 +5470,13 @@ static const struct command_registration target_instance_command_handlers[] = { .usage = "arrayname register [register ...]", }, { + .name = "array2reg", + .mode = COMMAND_EXEC, + .jim_handler = jim_target_array2reg, + .help = "Write register values from a Tcl array to the target", + .usage = "arrayname", + }, + { .name = "eventlist", .handler = handle_target_event_list, .mode = COMMAND_EXEC, @@ -6446,6 +6539,13 @@ static const struct command_registration target_exec_command_handlers[] = { .usage = "arrayname register [register ...]", }, { + .name = "array2reg", + .mode = COMMAND_EXEC, + .jim_handler = jim_array2reg, + .help = "Write register values from a Tcl array to the target", + .usage = "arrayname", + }, + { .name = "mem2array", .mode = COMMAND_EXEC, .jim_handler = jim_mem2array, -- _______________________________________________ OpenOCD-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openocd-devel
