add jim_handler to command_registration
[openocd.git] / src / target / target.c
index f203913cc5d669ca67dcea1e435e807fffc01589..4a9095a6764d8565bdbbcccf6b3ff83ee1894234 100644 (file)
@@ -777,12 +777,14 @@ int target_init(struct command_context *cmd_ctx)
                        target->type->mcr = default_mcr;
                } else
                {
-                       /* FIX! multiple targets will generally register global commands
-                        * multiple times. Only register this one if *one* of the
-                        * targets need the command. Hmm... make it a command on the
-                        * Jim Tcl target object?
-                        */
-                       register_jim(cmd_ctx, "mcr", jim_mcrmrc, "write coprocessor <cpnum> <op1> <op2> <CRn> <CRm> <value>");
+                       const struct command_registration mcr_cmd = {
+                               .name = "mcr",
+                               .mode = COMMAND_EXEC,
+                               .jim_handler = &jim_mcrmrc,
+                               .help = "write coprocessor",
+                               .usage = "<cpnum> <op1> <op2> <CRn> <CRm> <value>",
+                       };
+                       register_command(cmd_ctx, NULL, &mcr_cmd);
                }
 
                if (target->type->mrc == NULL)
@@ -790,7 +792,13 @@ int target_init(struct command_context *cmd_ctx)
                        target->type->mrc = default_mrc;
                } else
                {
-                       register_jim(cmd_ctx, "mrc", jim_mcrmrc, "read coprocessor <cpnum> <op1> <op2> <CRn> <CRm>");
+                       const struct command_registration mrc_cmd = {
+                               .name = "mrc",
+                               .jim_handler = &jim_mcrmrc,
+                               .help = "read coprocessor",
+                               .usage = "<cpnum> <op1> <op2> <CRn> <CRm>",
+                       };
+                       register_command(cmd_ctx, NULL, &mrc_cmd);
                }
 
 
@@ -1860,7 +1868,7 @@ COMMAND_HANDLER(handle_reg_command)
 {
        struct target *target;
        struct reg *reg = NULL;
-       int count = 0;
+       unsigned count = 0;
        char *value;
 
        LOG_DEBUG("-");
@@ -1875,7 +1883,7 @@ COMMAND_HANDLER(handle_reg_command)
                count = 0;
                while (cache)
                {
-                       int i;
+                       unsigned i;
 
                        command_print(CMD_CTX, "===== %s", cache->name);
 
@@ -1917,10 +1925,10 @@ COMMAND_HANDLER(handle_reg_command)
                count = 0;
                while (cache)
                {
-                       int i;
+                       unsigned i;
                        for (i = 0; i < cache->num_regs; i++)
                        {
-                               if (count++ == (int)num)
+                               if (count++ == num)
                                {
                                        reg = &cache->reg_list[i];
                                        break;
@@ -3145,7 +3153,6 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc,
        uint32_t count;
        uint32_t v;
        const char *varname;
-       uint8_t buffer[4096];
        int  n, e, retval;
        uint32_t i;
 
@@ -3227,14 +3234,20 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc,
 
        /* index counter */
        n = 0;
+
+       size_t buffersize = 4096;
+       uint8_t *buffer = malloc(buffersize);
+       if (buffer == NULL)
+               return JIM_ERR;
+
        /* assume ok */
        e = JIM_OK;
        while (len) {
                /* Slurp... in buffer size chunks */
 
                count = len; /* in objects.. */
-               if (count > (sizeof(buffer)/width)) {
-                       count = (sizeof(buffer)/width);
+               if (count > (buffersize/width)) {
+                       count = (buffersize/width);
                }
 
                retval = target_read_memory(target, addr, width, count, buffer);
@@ -3268,6 +3281,8 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc,
                }
        }
 
+       free(buffer);
+
        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
 
        return JIM_OK;
@@ -3331,7 +3346,6 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, int argc,
        uint32_t count;
        uint32_t v;
        const char *varname;
-       uint8_t buffer[4096];
        int  n, e, retval;
        uint32_t i;
 
@@ -3415,12 +3429,18 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, int argc,
        n = 0;
        /* assume ok */
        e = JIM_OK;
+
+       size_t buffersize = 4096;
+       uint8_t *buffer = malloc(buffersize);
+       if (buffer == NULL)
+               return JIM_ERR;
+
        while (len) {
                /* Slurp... in buffer size chunks */
 
                count = len; /* in objects.. */
-               if (count > (sizeof(buffer)/width)) {
-                       count = (sizeof(buffer)/width);
+               if (count > (buffersize/width)) {
+                       count = (buffersize/width);
                }
 
                v = 0; /* shut up gcc */
@@ -3454,6 +3474,8 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, int argc,
                }
        }
 
+       free(buffer);
+
        Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
 
        return JIM_OK;
@@ -4339,9 +4361,14 @@ static int target_create(Jim_GetOptInfo *goi)
        if (!target->variant)
                target->variant = strdup("");
 
+       cp = Jim_GetString(new_cmd, NULL);
+       target->cmd_name = strdup(cp);
+
        /* create the target specific commands */
-       if (target->type->register_commands) {
-               (*(target->type->register_commands))(cmd_ctx);
+       if (target->type->commands) {
+               e = register_commands(cmd_ctx, NULL, target->type->commands);
+               if (ERROR_OK != e)
+                       LOG_ERROR("unable to register '%s' commands", cp);
        }
        if (target->type->target_create) {
                (*(target->type->target_create))(target, goi->interp);
@@ -4357,18 +4384,15 @@ static int target_create(Jim_GetOptInfo *goi)
                *tpp = target;
        }
 
-       cp = Jim_GetString(new_cmd, NULL);
-       target->cmd_name = strdup(cp);
-
        /* now - create the new target name command */
-       e = Jim_CreateCommand(goi->interp,
-                                                  /* name */
-                                                  cp,
-                                                  tcl_target_func, /* C function */
-                                                  target, /* private data */
-                                                  NULL); /* no del proc */
-
-       return e;
+       const struct command_registration target_command = {
+               .name = cp,
+               .jim_handler = &tcl_target_func,
+               .jim_handler_data = target,
+               .help = "target command group",
+       };
+       struct command *c = register_command(cmd_ctx, NULL, &target_command);
+       return (NULL != c) ? ERROR_OK : ERROR_FAIL;
 }
 
 static int jim_target(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
@@ -4748,19 +4772,232 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        return JIM_OK;
 }
 
+static const struct command_registration target_command_handlers[] = {
+       {
+               .name = "targets",
+               .handler = &handle_targets_command,
+               .mode = COMMAND_ANY,
+               .help = "change current command line target (one parameter) "
+                       "or list targets (no parameters)",
+               .usage = "[<new_current_target>]",
+       },
+       {
+               .name = "target",
+               .mode = COMMAND_CONFIG,
+               .jim_handler = &jim_target,
+               .help = "configure target",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+
 int target_register_commands(struct command_context *cmd_ctx)
 {
-
-       register_command(cmd_ctx, NULL, "targets",
-                       handle_targets_command, COMMAND_EXEC,
-                       "change current command line target (one parameter) "
-                       "or list targets (no parameters)");
-
-       register_jim(cmd_ctx, "target", jim_target, "configure target");
-
-       return ERROR_OK;
+       return register_commands(cmd_ctx, NULL, target_command_handlers);
 }
 
+static const struct command_registration target_exec_command_handlers[] = {
+       {
+               .name = "fast_load_image",
+               .handler = &handle_fast_load_image_command,
+               .mode = COMMAND_ANY,
+               .help = "Load image into memory, mainly for profiling purposes",
+               .usage = "<file> <address> ['bin'|'ihex'|'elf'|'s19'] "
+                       "[min_address] [max_length]",
+       },
+       {
+               .name = "fast_load",
+               .handler = &handle_fast_load_command,
+               .mode = COMMAND_ANY,
+               .help = "loads active fast load image to current target "
+                       "- mainly for profiling purposes",
+       },
+       {
+               .name = "profile",
+               .handler = &handle_profile_command,
+               .mode = COMMAND_EXEC,
+               .help = "profiling samples the CPU PC",
+       },
+       /** @todo don't register virt2phys() unless target supports it */
+       {
+               .name = "virt2phys",
+               .handler = &handle_virt2phys_command,
+               .mode = COMMAND_ANY,
+               .help = "translate a virtual address into a physical address",
+       },
+
+       {
+               .name = "reg",
+               .handler = &handle_reg_command,
+               .mode = COMMAND_EXEC,
+               .help = "display or set a register",
+       },
+
+       {
+               .name = "poll",
+               .handler = &handle_poll_command,
+               .mode = COMMAND_EXEC,
+               .help = "poll target state",
+       },
+       {
+               .name = "wait_halt",
+               .handler = &handle_wait_halt_command,
+               .mode = COMMAND_EXEC,
+               .help = "wait for target halt",
+               .usage = "[time (s)]",
+       },
+       {
+               .name = "halt",
+               .handler = &handle_halt_command,
+               .mode = COMMAND_EXEC,
+               .help = "halt target",
+       },
+       {
+               .name = "resume",
+               .handler = &handle_resume_command,
+               .mode = COMMAND_EXEC,
+               .help = "resume target",
+               .usage = "[<address>]",
+       },
+       {
+               .name = "reset",
+               .handler = &handle_reset_command,
+               .mode = COMMAND_EXEC,
+               .usage = "[run|halt|init]",
+               .help = "Reset all targets into the specified mode."
+                       "Default reset mode is run, if not given.",
+       },
+       {
+               .name = "soft_reset_halt",
+               .handler = &handle_soft_reset_halt_command,
+               .mode = COMMAND_EXEC,
+               .help = "halt the target and do a soft reset",
+       },
+       {
+
+               .name = "step",
+               .handler = &handle_step_command,
+               .mode = COMMAND_EXEC,
+               .help = "step one instruction from current PC or [addr]",
+               .usage = "[<address>]",
+       },
+       {
+
+               .name = "mdw",
+               .handler = &handle_md_command,
+               .mode = COMMAND_EXEC,
+               .help = "display memory words",
+               .usage = "[phys] <addr> [count]",
+       },
+       {
+               .name = "mdh",
+               .handler = &handle_md_command,
+               .mode = COMMAND_EXEC,
+               .help = "display memory half-words",
+               .usage = "[phys] <addr> [count]",
+       },
+       {
+               .name = "mdb",
+               .handler = &handle_md_command,
+               .mode = COMMAND_EXEC,
+               .help = "display memory bytes",
+               .usage = "[phys] <addr> [count]",
+       },
+       {
+
+               .name = "mww",
+               .handler = &handle_mw_command,
+               .mode = COMMAND_EXEC,
+               .help = "write memory word",
+               .usage = "[phys]  <addr> <value> [count]",
+       },
+       {
+               .name = "mwh",
+               .handler = &handle_mw_command,
+               .mode = COMMAND_EXEC,
+               .help = "write memory half-word",
+               .usage = "[phys] <addr> <value> [count]",
+       },
+       {
+               .name = "mwb",
+               .handler = &handle_mw_command,
+               .mode = COMMAND_EXEC,
+               .help = "write memory byte",
+               .usage = "[phys] <addr> <value> [count]",
+       },
+       {
+
+               .name = "bp",
+               .handler = &handle_bp_command,
+               .mode = COMMAND_EXEC,
+               .help = "list or set breakpoint",
+               .usage = "[<address> <length> [hw]]",
+       },
+       {
+               .name = "rbp",
+               .handler = &handle_rbp_command,
+               .mode = COMMAND_EXEC,
+               .help = "remove breakpoint",
+               .usage = "<address>",
+       },
+       {
+
+               .name = "wp",
+               .handler = &handle_wp_command,
+               .mode = COMMAND_EXEC,
+               .help = "list or set watchpoint",
+               .usage = "[<address> <length> <r/w/a> [value] [mask]]",
+       },
+       {
+               .name = "rwp",
+               .handler = &handle_rwp_command,
+               .mode = COMMAND_EXEC,
+               .help = "remove watchpoint",
+               .usage = "<address>",
+
+       },
+       {
+               .name = "load_image",
+               .handler = &handle_load_image_command,
+               .mode = COMMAND_EXEC,
+               .usage = "<file> <address> ['bin'|'ihex'|'elf'|'s19'] "
+                       "[min_address] [max_length]",
+       },
+       {
+               .name = "dump_image",
+               .handler = &handle_dump_image_command,
+               .mode = COMMAND_EXEC,
+               .usage = "<file> <address> <size>",
+       },
+       {
+               .name = "verify_image",
+               .handler = &handle_verify_image_command,
+               .mode = COMMAND_EXEC,
+               .usage = "<file> [offset] [type]",
+       },
+       {
+               .name = "test_image",
+               .handler = &handle_test_image_command,
+               .mode = COMMAND_EXEC,
+               .usage = "<file> [offset] [type]",
+       },
+       {
+               .name = "ocd_mem2array",
+               .mode = COMMAND_EXEC,
+               .jim_handler = &jim_mem2array,
+               .help = "read memory and return as a TCL array "
+                       "for script processing",
+               .usage = "<arrayname> <width=32|16|8> <address> <count>",
+       },
+       {
+               .name = "ocd_array2mem",
+               .mode = COMMAND_EXEC,
+               .jim_handler = &jim_array2mem,
+               .help = "convert a TCL array to memory locations "
+                       "and write the values",
+               .usage = "<arrayname> <width=32|16|8> <address> <count>",
+       },
+       COMMAND_REGISTRATION_DONE
+};
 int target_register_user_commands(struct command_context *cmd_ctx)
 {
        int retval = ERROR_OK;
@@ -4770,108 +5007,6 @@ int target_register_user_commands(struct command_context *cmd_ctx)
        if ((retval = trace_register_commands(cmd_ctx)) != ERROR_OK)
                return retval;
 
-       register_command(cmd_ctx, NULL, "profile",
-                       handle_profile_command, COMMAND_EXEC,
-                       "profiling samples the CPU PC");
-
-       register_jim(cmd_ctx, "ocd_mem2array", jim_mem2array,
-                       "read memory and return as a TCL array for script processing "
-                       "<ARRAYNAME> <WIDTH = 32/16/8> <ADDRESS> <COUNT>");
-
-       register_jim(cmd_ctx, "ocd_array2mem", jim_array2mem,
-                       "convert a TCL array to memory locations and write the values "
-                       "<ARRAYNAME> <WIDTH = 32/16/8> <ADDRESS> <COUNT>");
-
-       register_command(cmd_ctx, NULL, "fast_load_image",
-                       handle_fast_load_image_command, COMMAND_ANY,
-                       "same CMD_ARGV as load_image, image stored in memory "
-                       "- mainly for profiling purposes");
 
-       register_command(cmd_ctx, NULL, "fast_load",
-                       handle_fast_load_command, COMMAND_ANY,
-                       "loads active fast load image to current target "
-                       "- mainly for profiling purposes");
-
-       /** @todo don't register virt2phys() unless target supports it */
-       register_command(cmd_ctx, NULL, "virt2phys",
-                       handle_virt2phys_command, COMMAND_ANY,
-                       "translate a virtual address into a physical address");
-
-       register_command(cmd_ctx,  NULL, "reg",
-                       handle_reg_command, COMMAND_EXEC,
-                       "display or set a register");
-
-       register_command(cmd_ctx,  NULL, "poll",
-                       handle_poll_command, COMMAND_EXEC,
-                       "poll target state");
-       register_command(cmd_ctx,  NULL, "wait_halt",
-                       handle_wait_halt_command, COMMAND_EXEC,
-                       "wait for target halt [time (s)]");
-       register_command(cmd_ctx,  NULL, "halt",
-                       handle_halt_command, COMMAND_EXEC,
-                       "halt target");
-       register_command(cmd_ctx,  NULL, "resume",
-                       handle_resume_command, COMMAND_EXEC,
-                       "resume target [addr]");
-       register_command(cmd_ctx,  NULL, "reset",
-                       handle_reset_command, COMMAND_EXEC,
-                       "reset target [run | halt | init] - default is run");
-       register_command(cmd_ctx,  NULL, "soft_reset_halt",
-                       handle_soft_reset_halt_command, COMMAND_EXEC,
-                       "halt the target and do a soft reset");
-
-       register_command(cmd_ctx,  NULL, "step",
-                       handle_step_command, COMMAND_EXEC,
-                       "step one instruction from current PC or [addr]");
-
-       register_command(cmd_ctx,  NULL, "mdw",
-                       handle_md_command, COMMAND_EXEC,
-                       "display memory words [phys] <addr> [count]");
-       register_command(cmd_ctx,  NULL, "mdh",
-                       handle_md_command, COMMAND_EXEC,
-                       "display memory half-words [phys] <addr> [count]");
-       register_command(cmd_ctx,  NULL, "mdb",
-                       handle_md_command, COMMAND_EXEC,
-                       "display memory bytes [phys] <addr> [count]");
-
-       register_command(cmd_ctx,  NULL, "mww",
-                       handle_mw_command, COMMAND_EXEC,
-                       "write memory word [phys]  <addr> <value> [count]");
-       register_command(cmd_ctx,  NULL, "mwh",
-                       handle_mw_command, COMMAND_EXEC,
-                       "write memory half-word [phys]  <addr> <value> [count]");
-       register_command(cmd_ctx,  NULL, "mwb",
-                       handle_mw_command, COMMAND_EXEC,
-                       "write memory byte [phys] <addr> <value> [count]");
-
-       register_command(cmd_ctx,  NULL, "bp",
-                       handle_bp_command, COMMAND_EXEC,
-                       "list or set breakpoint [<address> <length> [hw]]");
-       register_command(cmd_ctx,  NULL, "rbp",
-                       handle_rbp_command, COMMAND_EXEC,
-                       "remove breakpoint <address>");
-
-       register_command(cmd_ctx,  NULL, "wp",
-                       handle_wp_command, COMMAND_EXEC,
-                       "list or set watchpoint "
-                               "[<address> <length> <r/w/a> [value] [mask]]");
-       register_command(cmd_ctx,  NULL, "rwp",
-                       handle_rwp_command, COMMAND_EXEC,
-                       "remove watchpoint <address>");
-
-       register_command(cmd_ctx,  NULL, "load_image",
-                       handle_load_image_command, COMMAND_EXEC,
-                       "load_image <file> <address> "
-                       "['bin'|'ihex'|'elf'|'s19'] [min_address] [max_length]");
-       register_command(cmd_ctx,  NULL, "dump_image",
-                       handle_dump_image_command, COMMAND_EXEC,
-                       "dump_image <file> <address> <size>");
-       register_command(cmd_ctx,  NULL, "verify_image",
-                       handle_verify_image_command, COMMAND_EXEC,
-                       "verify_image <file> [offset] [type]");
-       register_command(cmd_ctx,  NULL, "test_image",
-                       handle_test_image_command, COMMAND_EXEC,
-                       "test_image <file> [offset] [type]");
-
-       return ERROR_OK;
+       return register_commands(cmd_ctx, NULL, target_exec_command_handlers);
 }

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)