add jim_handler to command_registration
[openocd.git] / src / target / target.c
index 88fea1778f21ae0165c07be8ba15368d0cd366b9..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);
                }
 
 
@@ -1650,26 +1658,26 @@ COMMAND_HANDLER(handle_targets_command)
 
        if (CMD_ARGC == 1)
        {
-               target = get_target(args[0]);
+               target = get_target(CMD_ARGV[0]);
                if (target == NULL) {
-                       command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0]);
+                       command_print(CMD_CTX,"Target: %s is unknown, try one of:\n", CMD_ARGV[0]);
                        goto DumpTargets;
                }
                if (!target->tap->enabled) {
-                       command_print(cmd_ctx,"Target: TAP %s is disabled, "
+                       command_print(CMD_CTX,"Target: TAP %s is disabled, "
                                        "can't be the current target\n",
                                        target->tap->dotted_name);
                        return ERROR_FAIL;
                }
 
-               cmd_ctx->current_target = target->target_number;
+               CMD_CTX->current_target = target->target_number;
                return ERROR_OK;
        }
 DumpTargets:
 
        target = all_targets;
-       command_print(cmd_ctx, "    TargetName         Type       Endian TapName            State       ");
-       command_print(cmd_ctx, "--  ------------------ ---------- ------ ------------------ ------------");
+       command_print(CMD_CTX, "    TargetName         Type       Endian TapName            State       ");
+       command_print(CMD_CTX, "--  ------------------ ---------- ------ ------------------ ------------");
        while (target)
        {
                const char *state;
@@ -1680,11 +1688,11 @@ DumpTargets:
                else
                        state = "tap-disabled";
 
-               if (cmd_ctx->current_target == target->target_number)
+               if (CMD_CTX->current_target == target->target_number)
                        marker = '*';
 
                /* keep columns lined up to match the headers above */
-               command_print(cmd_ctx, "%2d%c %-18s %-10s %-6s %-18s %s",
+               command_print(CMD_CTX, "%2d%c %-18s %-10s %-6s %-18s %s",
                                          target->target_number,
                                          marker,
                                          target->cmd_name,
@@ -1860,12 +1868,12 @@ COMMAND_HANDLER(handle_reg_command)
 {
        struct target *target;
        struct reg *reg = NULL;
-       int count = 0;
+       unsigned count = 0;
        char *value;
 
        LOG_DEBUG("-");
 
-       target = get_current_target(cmd_ctx);
+       target = get_current_target(CMD_CTX);
 
        /* list all available registers for the current target */
        if (CMD_ARGC == 0)
@@ -1875,9 +1883,9 @@ COMMAND_HANDLER(handle_reg_command)
                count = 0;
                while (cache)
                {
-                       int i;
+                       unsigned i;
 
-                       command_print(cmd_ctx, "===== %s", cache->name);
+                       command_print(CMD_CTX, "===== %s", cache->name);
 
                        for (i = 0, reg = cache->reg_list;
                                        i < cache->num_regs;
@@ -1887,7 +1895,7 @@ COMMAND_HANDLER(handle_reg_command)
                                if (reg->valid) {
                                        value = buf_to_str(reg->value,
                                                        reg->size, 16);
-                                       command_print(cmd_ctx,
+                                       command_print(CMD_CTX,
                                                        "(%i) %s (/%" PRIu32 "): 0x%s%s",
                                                        count, reg->name,
                                                        reg->size, value,
@@ -1896,7 +1904,7 @@ COMMAND_HANDLER(handle_reg_command)
                                                                : "");
                                        free(value);
                                } else {
-                                       command_print(cmd_ctx, "(%i) %s (/%" PRIu32 ")",
+                                       command_print(CMD_CTX, "(%i) %s (/%" PRIu32 ")",
                                                          count, reg->name,
                                                          reg->size) ;
                                }
@@ -1908,19 +1916,19 @@ COMMAND_HANDLER(handle_reg_command)
        }
 
        /* access a single register by its ordinal number */
-       if ((args[0][0] >= '0') && (args[0][0] <= '9'))
+       if ((CMD_ARGV[0][0] >= '0') && (CMD_ARGV[0][0] <= '9'))
        {
                unsigned num;
-               COMMAND_PARSE_NUMBER(uint, args[0], num);
+               COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], num);
 
                struct reg_cache *cache = target->reg_cache;
                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;
@@ -1933,24 +1941,24 @@ COMMAND_HANDLER(handle_reg_command)
 
                if (!reg)
                {
-                       command_print(cmd_ctx, "%i is out of bounds, the current target has only %i registers (0 - %i)", num, count, count - 1);
+                       command_print(CMD_CTX, "%i is out of bounds, the current target has only %i registers (0 - %i)", num, count, count - 1);
                        return ERROR_OK;
                }
        } else /* access a single register by its name */
        {
-               reg = register_get_by_name(target->reg_cache, args[0], 1);
+               reg = register_get_by_name(target->reg_cache, CMD_ARGV[0], 1);
 
                if (!reg)
                {
-                       command_print(cmd_ctx, "register %s not found in current target", args[0]);
+                       command_print(CMD_CTX, "register %s not found in current target", CMD_ARGV[0]);
                        return ERROR_OK;
                }
        }
 
        /* display a register */
-       if ((CMD_ARGC == 1) || ((CMD_ARGC == 2) && !((args[1][0] >= '0') && (args[1][0] <= '9'))))
+       if ((CMD_ARGC == 1) || ((CMD_ARGC == 2) && !((CMD_ARGV[1][0] >= '0') && (CMD_ARGV[1][0] <= '9'))))
        {
-               if ((CMD_ARGC == 2) && (strcmp(args[1], "force") == 0))
+               if ((CMD_ARGC == 2) && (strcmp(CMD_ARGV[1], "force") == 0))
                        reg->valid = 0;
 
                if (reg->valid == 0)
@@ -1958,7 +1966,7 @@ COMMAND_HANDLER(handle_reg_command)
                        reg->type->get(reg);
                }
                value = buf_to_str(reg->value, reg->size, 16);
-               command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
+               command_print(CMD_CTX, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
                free(value);
                return ERROR_OK;
        }
@@ -1967,12 +1975,12 @@ COMMAND_HANDLER(handle_reg_command)
        if (CMD_ARGC == 2)
        {
                uint8_t *buf = malloc(DIV_ROUND_UP(reg->size, 8));
-               str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0);
+               str_to_buf(CMD_ARGV[1], strlen(CMD_ARGV[1]), buf, reg->size, 0);
 
                reg->type->set(reg, buf);
 
                value = buf_to_str(reg->value, reg->size, 16);
-               command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
+               command_print(CMD_CTX, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
                free(value);
 
                free(buf);
@@ -1980,7 +1988,7 @@ COMMAND_HANDLER(handle_reg_command)
                return ERROR_OK;
        }
 
-       command_print(cmd_ctx, "usage: reg <#|name> [value]");
+       command_print(CMD_CTX, "usage: reg <#|name> [value]");
 
        return ERROR_OK;
 }
@@ -1988,13 +1996,13 @@ COMMAND_HANDLER(handle_reg_command)
 COMMAND_HANDLER(handle_poll_command)
 {
        int retval = ERROR_OK;
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
 
        if (CMD_ARGC == 0)
        {
-               command_print(cmd_ctx, "background polling: %s",
+               command_print(CMD_CTX, "background polling: %s",
                                jtag_poll_get_enabled() ? "on" : "off");
-               command_print(cmd_ctx, "TAP: %s (%s)",
+               command_print(CMD_CTX, "TAP: %s (%s)",
                                target->tap->dotted_name,
                                target->tap->enabled ? "enabled" : "disabled");
                if (!target->tap->enabled)
@@ -2003,23 +2011,14 @@ COMMAND_HANDLER(handle_poll_command)
                        return retval;
                if ((retval = target_arch_state(target)) != ERROR_OK)
                        return retval;
-
        }
        else if (CMD_ARGC == 1)
        {
-               if (strcmp(args[0], "on") == 0)
-               {
-                       jtag_poll_set_enabled(true);
-               }
-               else if (strcmp(args[0], "off") == 0)
-               {
-                       jtag_poll_set_enabled(false);
-               }
-               else
-               {
-                       command_print(cmd_ctx, "arg is \"on\" or \"off\"");
-               }
-       } else
+               bool enable;
+               COMMAND_PARSE_ON_OFF(CMD_ARGV[0], enable);
+               jtag_poll_set_enabled(enable);
+       }
+       else
        {
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
@@ -2035,17 +2034,17 @@ COMMAND_HANDLER(handle_wait_halt_command)
        unsigned ms = 5000;
        if (1 == CMD_ARGC)
        {
-               int retval = parse_uint(args[0], &ms);
+               int retval = parse_uint(CMD_ARGV[0], &ms);
                if (ERROR_OK != retval)
                {
-                       command_print(cmd_ctx, "usage: %s [seconds]", CMD_NAME);
+                       command_print(CMD_CTX, "usage: %s [seconds]", CMD_NAME);
                        return ERROR_COMMAND_SYNTAX_ERROR;
                }
                // convert seconds (given) to milliseconds (needed)
                ms *= 1000;
        }
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
        return target_wait_state(target, TARGET_HALTED, ms);
 }
 
@@ -2098,7 +2097,7 @@ COMMAND_HANDLER(handle_halt_command)
 {
        LOG_DEBUG("-");
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
        int retval = target_halt(target);
        if (ERROR_OK != retval)
                return retval;
@@ -2106,7 +2105,7 @@ COMMAND_HANDLER(handle_halt_command)
        if (CMD_ARGC == 1)
        {
                unsigned wait;
-               retval = parse_uint(args[0], &wait);
+               retval = parse_uint(CMD_ARGV[0], &wait);
                if (ERROR_OK != retval)
                        return ERROR_COMMAND_SYNTAX_ERROR;
                if (!wait)
@@ -2118,7 +2117,7 @@ COMMAND_HANDLER(handle_halt_command)
 
 COMMAND_HANDLER(handle_soft_reset_halt_command)
 {
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
 
        LOG_USER("requesting target halt and executing a soft reset");
 
@@ -2136,7 +2135,7 @@ COMMAND_HANDLER(handle_reset_command)
        if (CMD_ARGC == 1)
        {
                const Jim_Nvp *n;
-               n = Jim_Nvp_name2value_simple(nvp_reset_modes, args[0]);
+               n = Jim_Nvp_name2value_simple(nvp_reset_modes, CMD_ARGV[0]);
                if ((n->name == NULL) || (n->value == RESET_UNKNOWN)) {
                        return ERROR_COMMAND_SYNTAX_ERROR;
                }
@@ -2144,7 +2143,7 @@ COMMAND_HANDLER(handle_reset_command)
        }
 
        /* reset *all* targets */
-       return target_process_reset(cmd_ctx, reset_mode);
+       return target_process_reset(CMD_CTX, reset_mode);
 }
 
 
@@ -2154,16 +2153,16 @@ COMMAND_HANDLER(handle_resume_command)
        if (CMD_ARGC > 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
        target_handle_event(target, TARGET_EVENT_OLD_pre_resume);
 
-       /* with no args, resume from current pc, addr = 0,
-        * with one arguments, addr = args[0],
+       /* with no CMD_ARGV, resume from current pc, addr = 0,
+        * with one arguments, addr = CMD_ARGV[0],
         * handle breakpoints, not debugging */
        uint32_t addr = 0;
        if (CMD_ARGC == 1)
        {
-               COMMAND_PARSE_NUMBER(u32, args[0], addr);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
                current = 0;
        }
 
@@ -2177,18 +2176,18 @@ COMMAND_HANDLER(handle_step_command)
 
        LOG_DEBUG("-");
 
-       /* with no args, step from current pc, addr = 0,
-        * with one argument addr = args[0],
+       /* with no CMD_ARGV, step from current pc, addr = 0,
+        * with one argument addr = CMD_ARGV[0],
         * handle breakpoints, debugging */
        uint32_t addr = 0;
        int current_pc = 1;
        if (CMD_ARGC == 1)
        {
-               COMMAND_PARSE_NUMBER(u32, args[0], addr);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
                current_pc = 0;
        }
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
 
        return target->type->step(target, current_pc, addr, 1);
 }
@@ -2248,21 +2247,20 @@ COMMAND_HANDLER(handle_md_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        unsigned size = 0;
-       const char *cmd_name = CMD_NAME;
-       switch (cmd_name[6]) {
+       switch (CMD_NAME[2]) {
        case 'w': size = 4; break;
        case 'h': size = 2; break;
        case 'b': size = 1; break;
        default: return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       bool physical=strcmp(args[0], "phys")==0;
+       bool physical=strcmp(CMD_ARGV[0], "phys")==0;
        int (*fn)(struct target *target,
                        uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
        if (physical)
        {
                CMD_ARGC--;
-               args++;
+               CMD_ARGV++;
                fn=target_read_phys_memory;
        } else
        {
@@ -2274,18 +2272,18 @@ COMMAND_HANDLER(handle_md_command)
        }
 
        uint32_t address;
-       COMMAND_PARSE_NUMBER(u32, args[0], address);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], address);
 
        unsigned count = 1;
        if (CMD_ARGC == 2)
-               COMMAND_PARSE_NUMBER(uint, args[1], count);
+               COMMAND_PARSE_NUMBER(uint, CMD_ARGV[1], count);
 
        uint8_t *buffer = calloc(count, size);
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
        int retval = fn(target, address, size, count, buffer);
        if (ERROR_OK == retval)
-               handle_md_output(cmd_ctx, target, address, size, count, buffer);
+               handle_md_output(CMD_CTX, target, address, size, count, buffer);
 
        free(buffer);
 
@@ -2298,14 +2296,13 @@ COMMAND_HANDLER(handle_mw_command)
        {
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
-       bool physical=strcmp(args[0], "phys")==0;
+       bool physical=strcmp(CMD_ARGV[0], "phys")==0;
        int (*fn)(struct target *target,
                        uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
-       const char *cmd_name = CMD_NAME;
        if (physical)
        {
                CMD_ARGC--;
-               args++;
+               CMD_ARGV++;
                fn=target_write_phys_memory;
        } else
        {
@@ -2315,19 +2312,19 @@ COMMAND_HANDLER(handle_mw_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        uint32_t address;
-       COMMAND_PARSE_NUMBER(u32, args[0], address);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], address);
 
        uint32_t value;
-       COMMAND_PARSE_NUMBER(u32, args[1], value);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], value);
 
        unsigned count = 1;
        if (CMD_ARGC == 3)
-               COMMAND_PARSE_NUMBER(uint, args[2], count);
+               COMMAND_PARSE_NUMBER(uint, CMD_ARGV[2], count);
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
        unsigned wordsize;
        uint8_t value_buf[4];
-       switch (cmd_name[6])
+       switch (CMD_NAME[2])
        {
                case 'w':
                        wordsize = 4;
@@ -2357,7 +2354,7 @@ COMMAND_HANDLER(handle_mw_command)
 
 }
 
-static COMMAND_HELPER(parse_load_image_command_args, struct image *image,
+static COMMAND_HELPER(parse_load_image_command_CMD_ARGV, struct image *image,
                uint32_t *min_address, uint32_t *max_address)
 {
        if (CMD_ARGC < 1 || CMD_ARGC > 5)
@@ -2368,7 +2365,7 @@ static COMMAND_HELPER(parse_load_image_command_args, struct image *image,
        if (CMD_ARGC >= 2)
        {
                uint32_t addr;
-               COMMAND_PARSE_NUMBER(u32, args[1], addr);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], addr);
                image->base_address = addr;
                image->base_address_set = 1;
        }
@@ -2379,11 +2376,11 @@ static COMMAND_HELPER(parse_load_image_command_args, struct image *image,
 
        if (CMD_ARGC >= 4)
        {
-               COMMAND_PARSE_NUMBER(u32, args[3], *min_address);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], *min_address);
        }
        if (CMD_ARGC == 5)
        {
-               COMMAND_PARSE_NUMBER(u32, args[4], *max_address);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[4], *max_address);
                // use size (given) to find max (required)
                *max_address += *min_address;
        }
@@ -2404,17 +2401,17 @@ COMMAND_HANDLER(handle_load_image_command)
        int i;
        struct image image;
 
-       int retval = CALL_COMMAND_HANDLER(parse_load_image_command_args,
+       int retval = CALL_COMMAND_HANDLER(parse_load_image_command_CMD_ARGV,
                        &image, &min_address, &max_address);
        if (ERROR_OK != retval)
                return retval;
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
 
        struct duration bench;
        duration_start(&bench);
 
-       if (image_open(&image, args[0], (CMD_ARGC >= 3) ? args[2] : NULL) != ERROR_OK)
+       if (image_open(&image, CMD_ARGV[0], (CMD_ARGC >= 3) ? CMD_ARGV[2] : NULL) != ERROR_OK)
        {
                return ERROR_OK;
        }
@@ -2426,7 +2423,7 @@ COMMAND_HANDLER(handle_load_image_command)
                buffer = malloc(image.sections[i].size);
                if (buffer == NULL)
                {
-                       command_print(cmd_ctx,
+                       command_print(CMD_CTX,
                                                  "error allocating buffer for section (%d bytes)",
                                                  (int)(image.sections[i].size));
                        break;
@@ -2464,7 +2461,7 @@ COMMAND_HANDLER(handle_load_image_command)
                                break;
                        }
                        image_size += length;
-                       command_print(cmd_ctx, "%u bytes written at address 0x%8.8" PRIx32 "",
+                       command_print(CMD_CTX, "%u bytes written at address 0x%8.8" PRIx32 "",
                                                  (unsigned int)length,
                                                  image.sections[i].base_address + offset);
                }
@@ -2474,7 +2471,7 @@ COMMAND_HANDLER(handle_load_image_command)
 
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
-               command_print(cmd_ctx, "downloaded %" PRIu32 " bytes "
+               command_print(CMD_CTX, "downloaded %" PRIu32 " bytes "
                                "in %fs (%0.3f kb/s)", image_size,
                                duration_elapsed(&bench), duration_kbps(&bench, image_size));
        }
@@ -2493,20 +2490,20 @@ COMMAND_HANDLER(handle_dump_image_command)
        int retvaltemp;
 
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
 
        if (CMD_ARGC != 3)
        {
-               command_print(cmd_ctx, "usage: dump_image <filename> <address> <size>");
+               command_print(CMD_CTX, "usage: dump_image <filename> <address> <size>");
                return ERROR_OK;
        }
 
        uint32_t address;
-       COMMAND_PARSE_NUMBER(u32, args[1], address);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], address);
        uint32_t size;
-       COMMAND_PARSE_NUMBER(u32, args[2], size);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], size);
 
-       if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
+       if (fileio_open(&fileio, CMD_ARGV[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
        {
                return ERROR_OK;
        }
@@ -2540,7 +2537,7 @@ COMMAND_HANDLER(handle_dump_image_command)
 
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
-               command_print(cmd_ctx,
+               command_print(CMD_CTX,
                                "dumped %zu bytes in %fs (%0.3f kb/s)", fileio.size,
                                duration_elapsed(&bench), duration_kbps(&bench, fileio.size));
        }
@@ -2560,7 +2557,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
 
        struct image image;
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
 
        if (CMD_ARGC < 1)
        {
@@ -2579,7 +2576,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
        if (CMD_ARGC >= 2)
        {
                uint32_t addr;
-               COMMAND_PARSE_NUMBER(u32, args[1], addr);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], addr);
                image.base_address = addr;
                image.base_address_set = 1;
        }
@@ -2591,7 +2588,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
 
        image.start_address_set = 0;
 
-       if ((retval = image_open(&image, args[0], (CMD_ARGC == 3) ? args[2] : NULL)) != ERROR_OK)
+       if ((retval = image_open(&image, CMD_ARGV[0], (CMD_ARGC == 3) ? CMD_ARGV[2] : NULL)) != ERROR_OK)
        {
                return retval;
        }
@@ -2603,7 +2600,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
                buffer = malloc(image.sections[i].size);
                if (buffer == NULL)
                {
-                       command_print(cmd_ctx,
+                       command_print(CMD_CTX,
                                                  "error allocating buffer for section (%d bytes)",
                                                  (int)(image.sections[i].size));
                        break;
@@ -2631,7 +2628,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
                                /* failed crc checksum, fall back to a binary compare */
                                uint8_t *data;
 
-                               command_print(cmd_ctx, "checksum mismatch - attempting binary compare");
+                               command_print(CMD_CTX, "checksum mismatch - attempting binary compare");
 
                                data = (uint8_t*)malloc(buf_cnt);
 
@@ -2651,7 +2648,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
                                        {
                                                if (data[t] != buffer[t])
                                                {
-                                                       command_print(cmd_ctx,
+                                                       command_print(CMD_CTX,
                                                                                  "Verify operation failed address 0x%08x. Was 0x%02x instead of 0x%02x\n",
                                                                                  (unsigned)(t + image.sections[i].base_address),
                                                                                  data[t],
@@ -2672,7 +2669,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
                        }
                } else
                {
-                       command_print(cmd_ctx, "address 0x%08" PRIx32 " length 0x%08zx",
+                       command_print(CMD_CTX, "address 0x%08" PRIx32 " length 0x%08zx",
                                                  image.sections[i].base_address,
                                                  buf_cnt);
                }
@@ -2683,7 +2680,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
 done:
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
-               command_print(cmd_ctx, "verified %" PRIu32 " bytes "
+               command_print(CMD_CTX, "verified %" PRIu32 " bytes "
                                "in %fs (%0.3f kb/s)", image_size,
                                duration_elapsed(&bench), duration_kbps(&bench, image_size));
        }
@@ -2746,29 +2743,29 @@ static int handle_bp_command_set(struct command_context *cmd_ctx,
 COMMAND_HANDLER(handle_bp_command)
 {
        if (CMD_ARGC == 0)
-               return handle_bp_command_list(cmd_ctx);
+               return handle_bp_command_list(CMD_CTX);
 
        if (CMD_ARGC < 2 || CMD_ARGC > 3)
        {
-               command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
+               command_print(CMD_CTX, "usage: bp <address> <length> ['hw']");
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        uint32_t addr;
-       COMMAND_PARSE_NUMBER(u32, args[0], addr);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
        uint32_t length;
-       COMMAND_PARSE_NUMBER(u32, args[1], length);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
 
        int hw = BKPT_SOFT;
        if (CMD_ARGC == 3)
        {
-               if (strcmp(args[2], "hw") == 0)
+               if (strcmp(CMD_ARGV[2], "hw") == 0)
                        hw = BKPT_HARD;
                else
                        return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       return handle_bp_command_set(cmd_ctx, addr, length, hw);
+       return handle_bp_command_set(CMD_CTX, addr, length, hw);
 }
 
 COMMAND_HANDLER(handle_rbp_command)
@@ -2777,9 +2774,9 @@ COMMAND_HANDLER(handle_rbp_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        uint32_t addr;
-       COMMAND_PARSE_NUMBER(u32, args[0], addr);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
        breakpoint_remove(target, addr);
 
        return ERROR_OK;
@@ -2787,7 +2784,7 @@ COMMAND_HANDLER(handle_rbp_command)
 
 COMMAND_HANDLER(handle_wp_command)
 {
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
 
        if (CMD_ARGC == 0)
        {
@@ -2795,7 +2792,7 @@ COMMAND_HANDLER(handle_wp_command)
 
                while (watchpoint)
                {
-                       command_print(cmd_ctx, "address: 0x%8.8" PRIx32
+                       command_print(CMD_CTX, "address: 0x%8.8" PRIx32
                                        ", len: 0x%8.8" PRIx32
                                        ", r/w/a: %i, value: 0x%8.8" PRIx32
                                        ", mask: 0x%8.8" PRIx32,
@@ -2818,13 +2815,13 @@ COMMAND_HANDLER(handle_wp_command)
        switch (CMD_ARGC)
        {
        case 5:
-               COMMAND_PARSE_NUMBER(u32, args[4], data_mask);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[4], data_mask);
                // fall through
        case 4:
-               COMMAND_PARSE_NUMBER(u32, args[3], data_value);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], data_value);
                // fall through
        case 3:
-               switch (args[2][0])
+               switch (CMD_ARGV[2][0])
                {
                case 'r':
                        type = WPT_READ;
@@ -2836,17 +2833,17 @@ COMMAND_HANDLER(handle_wp_command)
                        type = WPT_ACCESS;
                        break;
                default:
-                       LOG_ERROR("invalid watchpoint mode ('%c')", args[2][0]);
+                       LOG_ERROR("invalid watchpoint mode ('%c')", CMD_ARGV[2][0]);
                        return ERROR_COMMAND_SYNTAX_ERROR;
                }
                // fall through
        case 2:
-               COMMAND_PARSE_NUMBER(u32, args[1], length);
-               COMMAND_PARSE_NUMBER(u32, args[0], addr);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
+               COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
                break;
 
        default:
-               command_print(cmd_ctx, "usage: wp [address length "
+               command_print(CMD_CTX, "usage: wp [address length "
                                "[(r|w|a) [value [mask]]]]");
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
@@ -2865,9 +2862,9 @@ COMMAND_HANDLER(handle_rwp_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        uint32_t addr;
-       COMMAND_PARSE_NUMBER(u32, args[0], addr);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
        watchpoint_remove(target, addr);
 
        return ERROR_OK;
@@ -2886,13 +2883,13 @@ COMMAND_HANDLER(handle_virt2phys_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        uint32_t va;
-       COMMAND_PARSE_NUMBER(u32, args[0], va);
+       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], va);
        uint32_t pa;
 
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
        int retval = target->type->virt2phys(target, va, &pa);
        if (retval == ERROR_OK)
-               command_print(cmd_ctx, "Physical address 0x%08" PRIx32 "", pa);
+               command_print(CMD_CTX, "Physical address 0x%08" PRIx32 "", pa);
 
        return retval;
 }
@@ -3016,7 +3013,7 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filenam
 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
 COMMAND_HANDLER(handle_profile_command)
 {
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(CMD_CTX);
        struct timeval timeout, now;
 
        gettimeofday(&timeout, NULL);
@@ -3025,11 +3022,11 @@ COMMAND_HANDLER(handle_profile_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
        unsigned offset;
-       COMMAND_PARSE_NUMBER(uint, args[0], offset);
+       COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], offset);
 
        timeval_add_time(&timeout, offset, 0);
 
-       command_print(cmd_ctx, "Starting profiling. Halting and resuming the target as often as we can...");
+       command_print(CMD_CTX, "Starting profiling. Halting and resuming the target as often as we can...");
 
        static const int maxSample = 10000;
        uint32_t *samples = malloc(sizeof(uint32_t)*maxSample);
@@ -3061,7 +3058,7 @@ COMMAND_HANDLER(handle_profile_command)
                        }
                } else
                {
-                       command_print(cmd_ctx, "Target not halted or running");
+                       command_print(CMD_CTX, "Target not halted or running");
                        retval = ERROR_OK;
                        break;
                }
@@ -3073,7 +3070,7 @@ COMMAND_HANDLER(handle_profile_command)
                gettimeofday(&now, NULL);
                if ((numSamples >= maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
                {
-                       command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples);
+                       command_print(CMD_CTX, "Profiling completed. %d samples.", numSamples);
                        if ((retval = target_poll(target)) != ERROR_OK)
                        {
                                free(samples);
@@ -3088,8 +3085,8 @@ COMMAND_HANDLER(handle_profile_command)
                                free(samples);
                                return retval;
                        }
-                       writeGmon(samples, numSamples, args[1]);
-                       command_print(cmd_ctx, "Wrote %s", args[1]);
+                       writeGmon(samples, numSamples, CMD_ARGV[1]);
+                       command_print(CMD_CTX, "Wrote %s", CMD_ARGV[1]);
                        break;
                }
        }
@@ -3156,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;
 
@@ -3238,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);
@@ -3279,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;
@@ -3342,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;
 
@@ -3426,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 */
@@ -3465,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;
@@ -4350,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);
@@ -4368,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)
@@ -4543,7 +4556,7 @@ COMMAND_HANDLER(handle_fast_load_image_command)
 
        struct image image;
 
-       int retval = CALL_COMMAND_HANDLER(parse_load_image_command_args,
+       int retval = CALL_COMMAND_HANDLER(parse_load_image_command_CMD_ARGV,
                        &image, &min_address, &max_address);
        if (ERROR_OK != retval)
                return retval;
@@ -4551,7 +4564,7 @@ COMMAND_HANDLER(handle_fast_load_image_command)
        struct duration bench;
        duration_start(&bench);
 
-       if (image_open(&image, args[0], (CMD_ARGC >= 3) ? args[2] : NULL) != ERROR_OK)
+       if (image_open(&image, CMD_ARGV[0], (CMD_ARGC >= 3) ? CMD_ARGV[2] : NULL) != ERROR_OK)
        {
                return ERROR_OK;
        }
@@ -4571,7 +4584,7 @@ COMMAND_HANDLER(handle_fast_load_image_command)
                buffer = malloc(image.sections[i].size);
                if (buffer == NULL)
                {
-                       command_print(cmd_ctx, "error allocating buffer for section (%d bytes)",
+                       command_print(CMD_CTX, "error allocating buffer for section (%d bytes)",
                                                  (int)(image.sections[i].size));
                        break;
                }
@@ -4614,7 +4627,7 @@ COMMAND_HANDLER(handle_fast_load_image_command)
                        fastload[i].length = length;
 
                        image_size += length;
-                       command_print(cmd_ctx, "%u bytes written at address 0x%8.8x",
+                       command_print(CMD_CTX, "%u bytes written at address 0x%8.8x",
                                                  (unsigned int)length,
                                                  ((unsigned int)(image.sections[i].base_address + offset)));
                }
@@ -4624,11 +4637,11 @@ COMMAND_HANDLER(handle_fast_load_image_command)
 
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
-               command_print(cmd_ctx, "Loaded %" PRIu32 " bytes "
+               command_print(CMD_CTX, "Loaded %" PRIu32 " bytes "
                                "in %fs (%0.3f kb/s)", image_size, 
                                duration_elapsed(&bench), duration_kbps(&bench, image_size));
 
-               command_print(cmd_ctx,
+               command_print(CMD_CTX,
                                "WARNING: image has not been loaded to target!"
                                "You can issue a 'fast_load' to finish loading.");
        }
@@ -4658,8 +4671,8 @@ COMMAND_HANDLER(handle_fast_load_command)
        int retval = ERROR_OK;
        for (i = 0; i < fastload_num;i++)
        {
-               struct target *target = get_current_target(cmd_ctx);
-               command_print(cmd_ctx, "Write to 0x%08x, length 0x%08x",
+               struct target *target = get_current_target(CMD_CTX);
+               command_print(CMD_CTX, "Write to 0x%08x, length 0x%08x",
                                          (unsigned int)(fastload[i].address),
                                          (unsigned int)(fastload[i].length));
                if (retval == ERROR_OK)
@@ -4669,7 +4682,7 @@ COMMAND_HANDLER(handle_fast_load_command)
                size += fastload[i].length;
        }
        int after = timeval_ms();
-       command_print(cmd_ctx, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
+       command_print(CMD_CTX, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
        return retval;
 }
 
@@ -4759,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;
@@ -4781,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 args 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)