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, &reg_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

Reply via email to