target: make target re-configuration possible again
[openocd.git] / src / target / target.c
index 4395454161911bce553fa61dab1907f8f1eba563..917fb662226db0b3447ed2f670a34e7194adcf34 100644 (file)
@@ -375,12 +375,6 @@ uint16_t target_buffer_get_u16(struct target *target, const uint8_t *buffer)
                return be_to_h_u16(buffer);
 }
 
-/* read a uint8_t from a buffer in target memory endianness */
-static uint8_t target_buffer_get_u8(struct target *target, const uint8_t *buffer)
-{
-       return *buffer & 0x0ff;
-}
-
 /* write a uint64_t to a buffer in target memory endianness */
 void target_buffer_set_u64(struct target *target, uint8_t *buffer, uint64_t value)
 {
@@ -640,7 +634,7 @@ int target_resume(struct target *target, int current, target_addr_t address,
        return retval;
 }
 
-static int target_process_reset(struct command_context *cmd_ctx, enum target_reset_mode reset_mode)
+static int target_process_reset(struct command_invocation *cmd, enum target_reset_mode reset_mode)
 {
        char buf[100];
        int retval;
@@ -664,13 +658,13 @@ static int target_process_reset(struct command_context *cmd_ctx, enum target_res
        jtag_poll_set_enabled(false);
 
        sprintf(buf, "ocd_process_reset %s", n->name);
-       retval = Jim_Eval(cmd_ctx->interp, buf);
+       retval = Jim_Eval(cmd->ctx->interp, buf);
 
        jtag_poll_set_enabled(save_poll);
 
        if (retval != JIM_OK) {
-               Jim_MakeErrorMessage(cmd_ctx->interp);
-               command_print(NULL, "%s\n", Jim_GetString(Jim_GetResult(cmd_ctx->interp), NULL));
+               Jim_MakeErrorMessage(cmd->ctx->interp);
+               command_print(cmd, "%s", Jim_GetString(Jim_GetResult(cmd->ctx->interp), NULL));
                return ERROR_FAIL;
        }
 
@@ -2578,23 +2572,23 @@ int target_write_phys_u8(struct target *target, target_addr_t address, uint8_t v
        return retval;
 }
 
-static int find_target(struct command_context *cmd_ctx, const char *name)
+static int find_target(struct command_invocation *cmd, const char *name)
 {
        struct target *target = get_target(name);
        if (target == NULL) {
-               LOG_ERROR("Target: %s is unknown, try one of:\n", name);
+               command_print(cmd, "Target: %s is unknown, try one of:\n", name);
                return ERROR_FAIL;
        }
        if (!target->tap->enabled) {
-               LOG_USER("Target: TAP %s is disabled, "
+               command_print(cmd, "Target: TAP %s is disabled, "
                         "can't be the current target\n",
                         target->tap->dotted_name);
                return ERROR_FAIL;
        }
 
-       cmd_ctx->current_target = target;
-       if (cmd_ctx->current_target_override)
-               cmd_ctx->current_target_override = target;
+       cmd->ctx->current_target = target;
+       if (cmd->ctx->current_target_override)
+               cmd->ctx->current_target_override = target;
 
        return ERROR_OK;
 }
@@ -2604,7 +2598,7 @@ COMMAND_HANDLER(handle_targets_command)
 {
        int retval = ERROR_OK;
        if (CMD_ARGC == 1) {
-               retval = find_target(CMD_CTX, CMD_ARGV[0]);
+               retval = find_target(CMD, CMD_ARGV[0]);
                if (retval == ERROR_OK) {
                        /* we're done! */
                        return retval;
@@ -2612,8 +2606,8 @@ COMMAND_HANDLER(handle_targets_command)
        }
 
        struct target *target = all_targets;
-       command_print(CMD_CTX, "    TargetName         Type       Endian TapName            State       ");
-       command_print(CMD_CTX, "--  ------------------ ---------- ------ ------------------ ------------");
+       command_print(CMD, "    TargetName         Type       Endian TapName            State       ");
+       command_print(CMD, "--  ------------------ ---------- ------ ------------------ ------------");
        while (target) {
                const char *state;
                char marker = ' ';
@@ -2627,7 +2621,7 @@ COMMAND_HANDLER(handle_targets_command)
                        marker = '*';
 
                /* keep columns lined up to match the headers above */
-               command_print(CMD_CTX,
+               command_print(CMD,
                                "%2d%c %-18s %-10s %-6s %-18s %s",
                                target->target_number,
                                marker,
@@ -2837,7 +2831,7 @@ COMMAND_HANDLER(handle_reg_command)
                while (cache) {
                        unsigned i;
 
-                       command_print(CMD_CTX, "===== %s", cache->name);
+                       command_print(CMD, "===== %s", cache->name);
 
                        for (i = 0, reg = cache->reg_list;
                                        i < cache->num_regs;
@@ -2848,7 +2842,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,
                                                        "(%i) %s (/%" PRIu32 "): 0x%s%s",
                                                        count, reg->name,
                                                        reg->size, value,
@@ -2857,7 +2851,7 @@ COMMAND_HANDLER(handle_reg_command)
                                                                : "");
                                        free(value);
                                } else {
-                                       command_print(CMD_CTX, "(%i) %s (/%" PRIu32 ")",
+                                       command_print(CMD, "(%i) %s (/%" PRIu32 ")",
                                                          count, reg->name,
                                                          reg->size) ;
                                }
@@ -2889,7 +2883,7 @@ COMMAND_HANDLER(handle_reg_command)
                }
 
                if (!reg) {
-                       command_print(CMD_CTX, "%i is out of bounds, the current target "
+                       command_print(CMD, "%i is out of bounds, the current target "
                                        "has only %i registers (0 - %i)", num, count, count - 1);
                        return ERROR_OK;
                }
@@ -2915,7 +2909,7 @@ COMMAND_HANDLER(handle_reg_command)
                if (reg->valid == 0)
                        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, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
                free(value);
                return ERROR_OK;
        }
@@ -2930,7 +2924,7 @@ COMMAND_HANDLER(handle_reg_command)
                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, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
                free(value);
 
                free(buf);
@@ -2941,7 +2935,7 @@ COMMAND_HANDLER(handle_reg_command)
        return ERROR_COMMAND_SYNTAX_ERROR;
 
 not_found:
-       command_print(CMD_CTX, "register %s not found in current target", CMD_ARGV[0]);
+       command_print(CMD, "register %s not found in current target", CMD_ARGV[0]);
        return ERROR_OK;
 }
 
@@ -2951,9 +2945,9 @@ COMMAND_HANDLER(handle_poll_command)
        struct target *target = get_current_target(CMD_CTX);
 
        if (CMD_ARGC == 0) {
-               command_print(CMD_CTX, "background polling: %s",
+               command_print(CMD, "background polling: %s",
                                jtag_poll_get_enabled() ? "on" : "off");
-               command_print(CMD_CTX, "TAP: %s (%s)",
+               command_print(CMD, "TAP: %s (%s)",
                                target->tap->dotted_name,
                                target->tap->enabled ? "enabled" : "disabled");
                if (!target->tap->enabled)
@@ -3079,7 +3073,7 @@ COMMAND_HANDLER(handle_reset_command)
        }
 
        /* reset *all* targets */
-       return target_process_reset(CMD_CTX, reset_mode);
+       return target_process_reset(CMD, reset_mode);
 }
 
 
@@ -3125,7 +3119,7 @@ COMMAND_HANDLER(handle_step_command)
        return target->type->step(target, current_pc, addr, 1);
 }
 
-static void handle_md_output(struct command_context *cmd_ctx,
+void target_handle_md_output(struct command_invocation *cmd,
                struct target *target, target_addr_t address, unsigned size,
                unsigned count, const uint8_t *buffer)
 {
@@ -3183,7 +3177,7 @@ static void handle_md_output(struct command_context *cmd_ctx,
                                value_fmt, value);
 
                if ((i % line_modulo == line_modulo - 1) || (i == count - 1)) {
-                       command_print(cmd_ctx, "%s", output);
+                       command_print(cmd, "%s", output);
                        output_len = 0;
                }
        }
@@ -3240,7 +3234,7 @@ COMMAND_HANDLER(handle_md_command)
        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);
+               target_handle_md_output(CMD, target, address, size, count, buffer);
 
        free(buffer);
 
@@ -3413,7 +3407,7 @@ COMMAND_HANDLER(handle_load_image_command)
        for (i = 0; i < image.num_sections; i++) {
                buffer = malloc(image.sections[i].size);
                if (buffer == NULL) {
-                       command_print(CMD_CTX,
+                       command_print(CMD,
                                                  "error allocating buffer for section (%d bytes)",
                                                  (int)(image.sections[i].size));
                        retval = ERROR_FAIL;
@@ -3450,7 +3444,7 @@ COMMAND_HANDLER(handle_load_image_command)
                                break;
                        }
                        image_size += length;
-                       command_print(CMD_CTX, "%u bytes written at address " TARGET_ADDR_FMT "",
+                       command_print(CMD, "%u bytes written at address " TARGET_ADDR_FMT "",
                                        (unsigned int)length,
                                        image.sections[i].base_address + offset);
                }
@@ -3459,7 +3453,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, "downloaded %" PRIu32 " bytes "
                                "in %fs (%0.3f KiB/s)", image_size,
                                duration_elapsed(&bench), duration_kbps(&bench, image_size));
        }
@@ -3520,7 +3514,7 @@ COMMAND_HANDLER(handle_dump_image_command)
                retval = fileio_size(fileio, &filesize);
                if (retval != ERROR_OK)
                        return retval;
-               command_print(CMD_CTX,
+               command_print(CMD,
                                "dumped %zu bytes in %fs (%0.3f KiB/s)", filesize,
                                duration_elapsed(&bench), duration_kbps(&bench, filesize));
        }
@@ -3585,7 +3579,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, enum verify_mode ver
        for (i = 0; i < image.num_sections; i++) {
                buffer = malloc(image.sections[i].size);
                if (buffer == NULL) {
-                       command_print(CMD_CTX,
+                       command_print(CMD,
                                        "error allocating buffer for section (%d bytes)",
                                        (int)(image.sections[i].size));
                        break;
@@ -3636,14 +3630,14 @@ static COMMAND_HELPER(handle_verify_image_command_internal, enum verify_mode ver
                                        uint32_t t;
                                        for (t = 0; t < buf_cnt; t++) {
                                                if (data[t] != buffer[t]) {
-                                                       command_print(CMD_CTX,
+                                                       command_print(CMD,
                                                                                  "diff %d address 0x%08x. Was 0x%02x instead of 0x%02x",
                                                                                  diffs,
                                                                                  (unsigned)(t + image.sections[i].base_address),
                                                                                  data[t],
                                                                                  buffer[t]);
                                                        if (diffs++ >= 127) {
-                                                               command_print(CMD_CTX, "More than 128 errors, the rest are not printed.");
+                                                               command_print(CMD, "More than 128 errors, the rest are not printed.");
                                                                free(data);
                                                                free(buffer);
                                                                goto done;
@@ -3655,7 +3649,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, enum verify_mode ver
                                free(data);
                        }
                } else {
-                       command_print(CMD_CTX, "address " TARGET_ADDR_FMT " length 0x%08zx",
+                       command_print(CMD, "address " TARGET_ADDR_FMT " length 0x%08zx",
                                                  image.sections[i].base_address,
                                                  buf_cnt);
                }
@@ -3664,12 +3658,12 @@ static COMMAND_HELPER(handle_verify_image_command_internal, enum verify_mode ver
                image_size += buf_cnt;
        }
        if (diffs > 0)
-               command_print(CMD_CTX, "No more differences found.");
+               command_print(CMD, "No more differences found.");
 done:
        if (diffs > 0)
                retval = ERROR_FAIL;
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
-               command_print(CMD_CTX, "verified %" PRIu32 " bytes "
+               command_print(CMD, "verified %" PRIu32 " bytes "
                                "in %fs (%0.3f KiB/s)", image_size,
                                duration_elapsed(&bench), duration_kbps(&bench, image_size));
        }
@@ -3694,32 +3688,32 @@ COMMAND_HANDLER(handle_test_image_command)
        return CALL_COMMAND_HANDLER(handle_verify_image_command_internal, IMAGE_TEST);
 }
 
-static int handle_bp_command_list(struct command_context *cmd_ctx)
+static int handle_bp_command_list(struct command_invocation *cmd)
 {
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(cmd->ctx);
        struct breakpoint *breakpoint = target->breakpoints;
        while (breakpoint) {
                if (breakpoint->type == BKPT_SOFT) {
                        char *buf = buf_to_str(breakpoint->orig_instr,
                                        breakpoint->length, 16);
-                       command_print(cmd_ctx, "IVA breakpoint: " TARGET_ADDR_FMT ", 0x%x, %i, 0x%s",
+                       command_print(cmd, "IVA breakpoint: " TARGET_ADDR_FMT ", 0x%x, %i, 0x%s",
                                        breakpoint->address,
                                        breakpoint->length,
                                        breakpoint->set, buf);
                        free(buf);
                } else {
                        if ((breakpoint->address == 0) && (breakpoint->asid != 0))
-                               command_print(cmd_ctx, "Context breakpoint: 0x%8.8" PRIx32 ", 0x%x, %i",
+                               command_print(cmd, "Context breakpoint: 0x%8.8" PRIx32 ", 0x%x, %i",
                                                        breakpoint->asid,
                                                        breakpoint->length, breakpoint->set);
                        else if ((breakpoint->address != 0) && (breakpoint->asid != 0)) {
-                               command_print(cmd_ctx, "Hybrid breakpoint(IVA): " TARGET_ADDR_FMT ", 0x%x, %i",
+                               command_print(cmd, "Hybrid breakpoint(IVA): " TARGET_ADDR_FMT ", 0x%x, %i",
                                                        breakpoint->address,
                                                        breakpoint->length, breakpoint->set);
-                               command_print(cmd_ctx, "\t|--->linked with ContextID: 0x%8.8" PRIx32,
+                               command_print(cmd, "\t|--->linked with ContextID: 0x%8.8" PRIx32,
                                                        breakpoint->asid);
                        } else
-                               command_print(cmd_ctx, "Breakpoint(IVA): " TARGET_ADDR_FMT ", 0x%x, %i",
+                               command_print(cmd, "Breakpoint(IVA): " TARGET_ADDR_FMT ", 0x%x, %i",
                                                        breakpoint->address,
                                                        breakpoint->length, breakpoint->set);
                }
@@ -3729,17 +3723,17 @@ static int handle_bp_command_list(struct command_context *cmd_ctx)
        return ERROR_OK;
 }
 
-static int handle_bp_command_set(struct command_context *cmd_ctx,
+static int handle_bp_command_set(struct command_invocation *cmd,
                target_addr_t addr, uint32_t asid, uint32_t length, int hw)
 {
-       struct target *target = get_current_target(cmd_ctx);
+       struct target *target = get_current_target(cmd->ctx);
        int retval;
 
        if (asid == 0) {
                retval = breakpoint_add(target, addr, length, hw);
                /* error is always logged in breakpoint_add(), do not print it again */
                if (ERROR_OK == retval)
-                       command_print(cmd_ctx, "breakpoint set at " TARGET_ADDR_FMT "", addr);
+                       command_print(cmd, "breakpoint set at " TARGET_ADDR_FMT "", addr);
 
        } else if (addr == 0) {
                if (target->type->add_context_breakpoint == NULL) {
@@ -3749,7 +3743,7 @@ static int handle_bp_command_set(struct command_context *cmd_ctx,
                retval = context_breakpoint_add(target, asid, length, hw);
                /* error is always logged in context_breakpoint_add(), do not print it again */
                if (ERROR_OK == retval)
-                       command_print(cmd_ctx, "Context breakpoint set at 0x%8.8" PRIx32 "", asid);
+                       command_print(cmd, "Context breakpoint set at 0x%8.8" PRIx32 "", asid);
 
        } else {
                if (target->type->add_hybrid_breakpoint == NULL) {
@@ -3759,7 +3753,7 @@ static int handle_bp_command_set(struct command_context *cmd_ctx,
                retval = hybrid_breakpoint_add(target, addr, asid, length, hw);
                /* error is always logged in hybrid_breakpoint_add(), do not print it again */
                if (ERROR_OK == retval)
-                       command_print(cmd_ctx, "Hybrid breakpoint set at 0x%8.8" PRIx32 "", asid);
+                       command_print(cmd, "Hybrid breakpoint set at 0x%8.8" PRIx32 "", asid);
        }
        return retval;
 }
@@ -3773,13 +3767,13 @@ COMMAND_HANDLER(handle_bp_command)
 
        switch (CMD_ARGC) {
                case 0:
-                       return handle_bp_command_list(CMD_CTX);
+                       return handle_bp_command_list(CMD);
 
                case 2:
                        asid = 0;
                        COMMAND_PARSE_ADDRESS(CMD_ARGV[0], addr);
                        COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
-                       return handle_bp_command_set(CMD_CTX, addr, asid, length, hw);
+                       return handle_bp_command_set(CMD, addr, asid, length, hw);
 
                case 3:
                        if (strcmp(CMD_ARGV[2], "hw") == 0) {
@@ -3787,13 +3781,13 @@ COMMAND_HANDLER(handle_bp_command)
                                COMMAND_PARSE_ADDRESS(CMD_ARGV[0], addr);
                                COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
                                asid = 0;
-                               return handle_bp_command_set(CMD_CTX, addr, asid, length, hw);
+                               return handle_bp_command_set(CMD, addr, asid, length, hw);
                        } else if (strcmp(CMD_ARGV[2], "hw_ctx") == 0) {
                                hw = BKPT_HARD;
                                COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], asid);
                                COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
                                addr = 0;
-                               return handle_bp_command_set(CMD_CTX, addr, asid, length, hw);
+                               return handle_bp_command_set(CMD, addr, asid, length, hw);
                        }
                        /* fallthrough */
                case 4:
@@ -3801,7 +3795,7 @@ COMMAND_HANDLER(handle_bp_command)
                        COMMAND_PARSE_ADDRESS(CMD_ARGV[0], addr);
                        COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], asid);
                        COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], length);
-                       return handle_bp_command_set(CMD_CTX, addr, asid, length, hw);
+                       return handle_bp_command_set(CMD, addr, asid, length, hw);
 
                default:
                        return ERROR_COMMAND_SYNTAX_ERROR;
@@ -3830,7 +3824,7 @@ COMMAND_HANDLER(handle_wp_command)
                struct watchpoint *watchpoint = target->watchpoints;
 
                while (watchpoint) {
-                       command_print(CMD_CTX, "address: " TARGET_ADDR_FMT
+                       command_print(CMD, "address: " TARGET_ADDR_FMT
                                        ", len: 0x%8.8" PRIx32
                                        ", r/w/a: %i, value: 0x%8.8" PRIx32
                                        ", mask: 0x%8.8" PRIx32,
@@ -3922,7 +3916,7 @@ COMMAND_HANDLER(handle_virt2phys_command)
        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 " TARGET_ADDR_FMT "", pa);
+               command_print(CMD, "Physical address " TARGET_ADDR_FMT "", pa);
 
        return retval;
 }
@@ -4115,7 +4109,7 @@ COMMAND_HANDLER(handle_profile_command)
 
        write_gmon(samples, num_of_samples, CMD_ARGV[1],
                   with_range, start_address, end_address, target, duration_ms);
-       command_print(CMD_CTX, "Wrote %s", CMD_ARGV[1]);
+       command_print(CMD, "Wrote %s", CMD_ARGV[1]);
 
        free(samples);
        return retval;
@@ -4553,7 +4547,12 @@ void target_handle_event(struct target *target, enum target_event e)
 
                        if (Jim_EvalObj(teap->interp, teap->body) != JIM_OK) {
                                Jim_MakeErrorMessage(teap->interp);
-                               command_print(NULL, "%s\n", Jim_GetString(Jim_GetResult(teap->interp), NULL));
+                               LOG_USER("Error executing event %s on target %s:\n%s",
+                                                 Jim_Nvp_value2name_simple(nvp_target_event, e)->name,
+                                                 target_name(target),
+                                                 Jim_GetString(Jim_GetResult(teap->interp), NULL));
+                               /* clean both error code and stacktrace before return */
+                               Jim_Eval(teap->interp, "error \"\" \"\"");
                        }
 
                        cmd_ctx->current_target_override = saved_target_override;
@@ -4894,6 +4893,12 @@ no_params:
 
                case TCFG_GDB_PORT:
                        if (goi->isconfigure) {
+                               struct command_context *cmd_ctx = current_command_context(goi->interp);
+                               if (cmd_ctx->mode != COMMAND_CONFIG) {
+                                       Jim_SetResultString(goi->interp, "-gdb-port must be configured before 'init'", -1);
+                                       return JIM_ERR;
+                               }
+
                                const char *s;
                                e = Jim_GetOpt_String(goi, &s, NULL);
                                if (e != JIM_OK)
@@ -4929,228 +4934,6 @@ static int jim_target_configure(Jim_Interp *interp, int argc, Jim_Obj * const *a
        return target_configure(&goi, target);
 }
 
-static int jim_target_mw(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-{
-       const char *cmd_name = Jim_GetString(argv[0], NULL);
-
-       Jim_GetOptInfo goi;
-       Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
-
-       if (goi.argc < 2 || goi.argc > 4) {
-               Jim_SetResultFormatted(goi.interp,
-                               "usage: %s [phys] <address> <data> [<count>]", cmd_name);
-               return JIM_ERR;
-       }
-
-       target_write_fn fn;
-       fn = target_write_memory;
-
-       int e;
-       if (strcmp(Jim_GetString(argv[1], NULL), "phys") == 0) {
-               /* consume it */
-               struct Jim_Obj *obj;
-               e = Jim_GetOpt_Obj(&goi, &obj);
-               if (e != JIM_OK)
-                       return e;
-
-               fn = target_write_phys_memory;
-       }
-
-       jim_wide a;
-       e = Jim_GetOpt_Wide(&goi, &a);
-       if (e != JIM_OK)
-               return e;
-
-       jim_wide b;
-       e = Jim_GetOpt_Wide(&goi, &b);
-       if (e != JIM_OK)
-               return e;
-
-       jim_wide c = 1;
-       if (goi.argc == 1) {
-               e = Jim_GetOpt_Wide(&goi, &c);
-               if (e != JIM_OK)
-                       return e;
-       }
-
-       /* all args must be consumed */
-       if (goi.argc != 0)
-               return JIM_ERR;
-
-       struct target *target = Jim_CmdPrivData(goi.interp);
-       unsigned data_size;
-       if (strcasecmp(cmd_name, "mww") == 0)
-               data_size = 4;
-       else if (strcasecmp(cmd_name, "mwh") == 0)
-               data_size = 2;
-       else if (strcasecmp(cmd_name, "mwb") == 0)
-               data_size = 1;
-       else {
-               LOG_ERROR("command '%s' unknown: ", cmd_name);
-               return JIM_ERR;
-       }
-
-       return (target_fill_mem(target, a, fn, data_size, b, c) == ERROR_OK) ? JIM_OK : JIM_ERR;
-}
-
-/**
-*  @brief Reads an array of words/halfwords/bytes from target memory starting at specified address.
-*
-*  Usage: mdw [phys] <address> [<count>] - for 32 bit reads
-*         mdh [phys] <address> [<count>] - for 16 bit reads
-*         mdb [phys] <address> [<count>] - for  8 bit reads
-*
-*  Count defaults to 1.
-*
-*  Calls target_read_memory or target_read_phys_memory depending on
-*  the presence of the "phys" argument
-*  Reads the target memory in blocks of max. 32 bytes, and returns an array of ints formatted
-*  to int representation in base16.
-*  Also outputs read data in a human readable form using command_print
-*
-*  @param phys if present target_read_phys_memory will be used instead of target_read_memory
-*  @param address address where to start the read. May be specified in decimal or hex using the standard "0x" prefix
-*  @param count optional count parameter to read an array of values. If not specified, defaults to 1.
-*  @returns:  JIM_ERR on error or JIM_OK on success and sets the result string to an array of ascii formatted numbers
-*  on success, with [<count>] number of elements.
-*
-*  In case of little endian target:
-*      Example1: "mdw 0x00000000"  returns "10123456"
-*      Exmaple2: "mdh 0x00000000 1" returns "3456"
-*      Example3: "mdb 0x00000000" returns "56"
-*      Example4: "mdh 0x00000000 2" returns "3456 1012"
-*      Example5: "mdb 0x00000000 3" returns "56 34 12"
-**/
-static int jim_target_md(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-{
-       const char *cmd_name = Jim_GetString(argv[0], NULL);
-
-       Jim_GetOptInfo goi;
-       Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
-
-       if ((goi.argc < 1) || (goi.argc > 3)) {
-               Jim_SetResultFormatted(goi.interp,
-                               "usage: %s [phys] <address> [<count>]", cmd_name);
-               return JIM_ERR;
-       }
-
-       int (*fn)(struct target *target,
-                       target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer);
-       fn = target_read_memory;
-
-       int e;
-       if (strcmp(Jim_GetString(argv[1], NULL), "phys") == 0) {
-               /* consume it */
-               struct Jim_Obj *obj;
-               e = Jim_GetOpt_Obj(&goi, &obj);
-               if (e != JIM_OK)
-                       return e;
-
-               fn = target_read_phys_memory;
-       }
-
-       /* Read address parameter */
-       jim_wide addr;
-       e = Jim_GetOpt_Wide(&goi, &addr);
-       if (e != JIM_OK)
-               return JIM_ERR;
-
-       /* If next parameter exists, read it out as the count parameter, if not, set it to 1 (default) */
-       jim_wide count;
-       if (goi.argc == 1) {
-               e = Jim_GetOpt_Wide(&goi, &count);
-               if (e != JIM_OK)
-                       return JIM_ERR;
-       } else
-               count = 1;
-
-       /* all args must be consumed */
-       if (goi.argc != 0)
-               return JIM_ERR;
-
-       jim_wide dwidth = 1; /* shut up gcc */
-       if (strcasecmp(cmd_name, "mdw") == 0)
-               dwidth = 4;
-       else if (strcasecmp(cmd_name, "mdh") == 0)
-               dwidth = 2;
-       else if (strcasecmp(cmd_name, "mdb") == 0)
-               dwidth = 1;
-       else {
-               LOG_ERROR("command '%s' unknown: ", cmd_name);
-               return JIM_ERR;
-       }
-
-       /* convert count to "bytes" */
-       int bytes = count * dwidth;
-
-       struct target *target = Jim_CmdPrivData(goi.interp);
-       uint8_t  target_buf[32];
-       jim_wide x, y, z;
-       while (bytes > 0) {
-               y = (bytes < 16) ? bytes : 16; /* y = min(bytes, 16); */
-
-               /* Try to read out next block */
-               e = fn(target, addr, dwidth, y / dwidth, target_buf);
-
-               if (e != ERROR_OK) {
-                       Jim_SetResultFormatted(interp, "error reading target @ 0x%08lx", (long)addr);
-                       return JIM_ERR;
-               }
-
-               command_print_sameline(NULL, "0x%08x ", (int)(addr));
-               switch (dwidth) {
-               case 4:
-                       for (x = 0; x < 16 && x < y; x += 4) {
-                               z = target_buffer_get_u32(target, &(target_buf[x]));
-                               command_print_sameline(NULL, "%08x ", (int)(z));
-                       }
-                       for (; (x < 16) ; x += 4)
-                               command_print_sameline(NULL, "         ");
-                       break;
-               case 2:
-                       for (x = 0; x < 16 && x < y; x += 2) {
-                               z = target_buffer_get_u16(target, &(target_buf[x]));
-                               command_print_sameline(NULL, "%04x ", (int)(z));
-                       }
-                       for (; (x < 16) ; x += 2)
-                               command_print_sameline(NULL, "     ");
-                       break;
-               case 1:
-               default:
-                       for (x = 0 ; (x < 16) && (x < y) ; x += 1) {
-                               z = target_buffer_get_u8(target, &(target_buf[x]));
-                               command_print_sameline(NULL, "%02x ", (int)(z));
-                       }
-                       for (; (x < 16) ; x += 1)
-                               command_print_sameline(NULL, "   ");
-                       break;
-               }
-               /* ascii-ify the bytes */
-               for (x = 0 ; x < y ; x++) {
-                       if ((target_buf[x] >= 0x20) &&
-                               (target_buf[x] <= 0x7e)) {
-                               /* good */
-                       } else {
-                               /* smack it */
-                               target_buf[x] = '.';
-                       }
-               }
-               /* space pad  */
-               while (x < 16) {
-                       target_buf[x] = ' ';
-                       x++;
-               }
-               /* terminate */
-               target_buf[16] = 0;
-               /* print - with a newline */
-               command_print_sameline(NULL, "%s\n", target_buf);
-               /* NEXT... */
-               bytes -= 16;
-               addr += 16;
-       }
-       return JIM_OK;
-}
-
 static int jim_target_mem2array(Jim_Interp *interp,
                int argc, Jim_Obj *const *argv)
 {
@@ -5369,19 +5152,19 @@ COMMAND_HANDLER(handle_target_event_list)
        struct target *target = get_current_target(CMD_CTX);
        struct target_event_action *teap = target->event_action;
 
-       command_print(CMD_CTX, "Event actions for target (%d) %s\n",
+       command_print(CMD, "Event actions for target (%d) %s\n",
                                   target->target_number,
                                   target_name(target));
-       command_print(CMD_CTX, "%-25s | Body", "Event");
-       command_print(CMD_CTX, "------------------------- | "
+       command_print(CMD, "%-25s | Body", "Event");
+       command_print(CMD, "------------------------- | "
                        "----------------------------------------");
        while (teap) {
                Jim_Nvp *opt = Jim_Nvp_value2name_simple(nvp_target_event, teap->event);
-               command_print(CMD_CTX, "%-25s | %s",
+               command_print(CMD, "%-25s | %s",
                                opt->name, Jim_GetString(teap->body, NULL));
                teap = teap->next;
        }
-       command_print(CMD_CTX, "***END***");
+       command_print(CMD, "***END***");
        return ERROR_OK;
 }
 static int jim_target_current_state(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
@@ -5417,7 +5200,7 @@ static int jim_target_invoke_event(Jim_Interp *interp, int argc, Jim_Obj *const
 static const struct command_registration target_instance_command_handlers[] = {
        {
                .name = "configure",
-               .mode = COMMAND_CONFIG,
+               .mode = COMMAND_ANY,
                .jim_handler = jim_target_configure,
                .help  = "configure a new target for use",
                .usage = "[target_attribute ...]",
@@ -5429,45 +5212,59 @@ static const struct command_registration target_instance_command_handlers[] = {
                .help  = "returns the specified target attribute",
                .usage = "target_attribute",
        },
+       {
+               .name = "mwd",
+               .handler = handle_mw_command,
+               .mode = COMMAND_EXEC,
+               .help = "Write 64-bit word(s) to target memory",
+               .usage = "address data [count]",
+       },
        {
                .name = "mww",
+               .handler = handle_mw_command,
                .mode = COMMAND_EXEC,
-               .jim_handler = jim_target_mw,
                .help = "Write 32-bit word(s) to target memory",
                .usage = "address data [count]",
        },
        {
                .name = "mwh",
+               .handler = handle_mw_command,
                .mode = COMMAND_EXEC,
-               .jim_handler = jim_target_mw,
                .help = "Write 16-bit half-word(s) to target memory",
                .usage = "address data [count]",
        },
        {
                .name = "mwb",
+               .handler = handle_mw_command,
                .mode = COMMAND_EXEC,
-               .jim_handler = jim_target_mw,
                .help = "Write byte(s) to target memory",
                .usage = "address data [count]",
        },
+       {
+               .name = "mdd",
+               .handler = handle_md_command,
+               .mode = COMMAND_EXEC,
+               .help = "Display target memory as 64-bit words",
+               .usage = "address [count]",
+       },
        {
                .name = "mdw",
+               .handler = handle_md_command,
                .mode = COMMAND_EXEC,
-               .jim_handler = jim_target_md,
                .help = "Display target memory as 32-bit words",
                .usage = "address [count]",
        },
        {
                .name = "mdh",
+               .handler = handle_md_command,
                .mode = COMMAND_EXEC,
-               .jim_handler = jim_target_md,
                .help = "Display target memory as 16-bit half-words",
                .usage = "address [count]",
        },
        {
                .name = "mdb",
+               .handler = handle_md_command,
                .mode = COMMAND_EXEC,
-               .jim_handler = jim_target_md,
                .help = "Display target memory as 8-bit bytes",
                .usage = "address [count]",
        },
@@ -5979,7 +5776,7 @@ COMMAND_HANDLER(handle_fast_load_image_command)
        fastload_num = image.num_sections;
        fastload = malloc(sizeof(struct FastLoad)*image.num_sections);
        if (fastload == NULL) {
-               command_print(CMD_CTX, "out of memory");
+               command_print(CMD, "out of memory");
                image_close(&image);
                return ERROR_FAIL;
        }
@@ -5987,7 +5784,7 @@ COMMAND_HANDLER(handle_fast_load_image_command)
        for (i = 0; i < image.num_sections; i++) {
                buffer = malloc(image.sections[i].size);
                if (buffer == NULL) {
-                       command_print(CMD_CTX, "error allocating buffer for section (%d bytes)",
+                       command_print(CMD, "error allocating buffer for section (%d bytes)",
                                                  (int)(image.sections[i].size));
                        retval = ERROR_FAIL;
                        break;
@@ -6019,7 +5816,7 @@ COMMAND_HANDLER(handle_fast_load_image_command)
                        fastload[i].data = malloc(length);
                        if (fastload[i].data == NULL) {
                                free(buffer);
-                               command_print(CMD_CTX, "error allocating buffer for section (%" PRIu32 " bytes)",
+                               command_print(CMD, "error allocating buffer for section (%" PRIu32 " bytes)",
                                                          length);
                                retval = ERROR_FAIL;
                                break;
@@ -6028,7 +5825,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, "%u bytes written at address 0x%8.8x",
                                                  (unsigned int)length,
                                                  ((unsigned int)(image.sections[i].base_address + offset)));
                }
@@ -6037,11 +5834,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, "Loaded %" PRIu32 " bytes "
                                "in %fs (%0.3f KiB/s)", image_size,
                                duration_elapsed(&bench), duration_kbps(&bench, image_size));
 
-               command_print(CMD_CTX,
+               command_print(CMD,
                                "WARNING: image has not been loaded to target!"
                                "You can issue a 'fast_load' to finish loading.");
        }
@@ -6068,7 +5865,7 @@ 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",
+               command_print(CMD, "Write to 0x%08x, length 0x%08x",
                                          (unsigned int)(fastload[i].address),
                                          (unsigned int)(fastload[i].length));
                retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data);
@@ -6078,7 +5875,7 @@ COMMAND_HANDLER(handle_fast_load_command)
        }
        if (retval == ERROR_OK) {
                int64_t after = timeval_ms();
-               command_print(CMD_CTX, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
+               command_print(CMD, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
        }
        return retval;
 }
@@ -6133,7 +5930,7 @@ COMMAND_HANDLER(handle_ps_command)
        if ((target->rtos) && (target->rtos->type)
                        && (target->rtos->type->ps_command)) {
                display = target->rtos->type->ps_command(target);
-               command_print(CMD_CTX, "%s", display);
+               command_print(CMD, "%s", display);
                free(display);
                return ERROR_OK;
        } else {
@@ -6142,13 +5939,13 @@ COMMAND_HANDLER(handle_ps_command)
        }
 }
 
-static void binprint(struct command_context *cmd_ctx, const char *text, const uint8_t *buf, int size)
+static void binprint(struct command_invocation *cmd, const char *text, const uint8_t *buf, int size)
 {
        if (text != NULL)
-               command_print_sameline(cmd_ctx, "%s", text);
+               command_print_sameline(cmd, "%s", text);
        for (int i = 0; i < size; i++)
-               command_print_sameline(cmd_ctx, " %02x", buf[i]);
-       command_print(cmd_ctx, " ");
+               command_print_sameline(cmd, " %02x", buf[i]);
+       command_print(cmd, " ");
 }
 
 COMMAND_HANDLER(handle_test_mem_access_command)
@@ -6200,7 +5997,7 @@ COMMAND_HANDLER(handle_test_mem_access_command)
                                        read_ref[i] = rand();
                                        read_buf[i] = read_ref[i];
                                }
-                               command_print_sameline(CMD_CTX,
+                               command_print_sameline(CMD,
                                                "Test read %" PRIu32 " x %d @ %d to %saligned buffer: ", count,
                                                size, offset, host_offset ? "un" : "");
 
@@ -6213,10 +6010,10 @@ COMMAND_HANDLER(handle_test_mem_access_command)
                                duration_measure(&bench);
 
                                if (retval == ERROR_TARGET_UNALIGNED_ACCESS) {
-                                       command_print(CMD_CTX, "Unsupported alignment");
+                                       command_print(CMD, "Unsupported alignment");
                                        goto next;
                                } else if (retval != ERROR_OK) {
-                                       command_print(CMD_CTX, "Memory read failed");
+                                       command_print(CMD, "Memory read failed");
                                        goto next;
                                }
 
@@ -6226,13 +6023,13 @@ COMMAND_HANDLER(handle_test_mem_access_command)
                                /* check result */
                                int result = memcmp(read_ref, read_buf, host_bufsiz);
                                if (result == 0) {
-                                       command_print(CMD_CTX, "Pass in %fs (%0.3f KiB/s)",
+                                       command_print(CMD, "Pass in %fs (%0.3f KiB/s)",
                                                        duration_elapsed(&bench),
                                                        duration_kbps(&bench, count * size));
                                } else {
-                                       command_print(CMD_CTX, "Compare failed");
-                                       binprint(CMD_CTX, "ref:", read_ref, host_bufsiz);
-                                       binprint(CMD_CTX, "buf:", read_buf, host_bufsiz);
+                                       command_print(CMD, "Compare failed");
+                                       binprint(CMD, "ref:", read_ref, host_bufsiz);
+                                       binprint(CMD, "buf:", read_buf, host_bufsiz);
                                }
 next:
                                free(read_ref);
@@ -6272,13 +6069,13 @@ out:
 
                                for (size_t i = 0; i < host_bufsiz; i++)
                                        write_buf[i] = rand();
-                               command_print_sameline(CMD_CTX,
+                               command_print_sameline(CMD,
                                                "Test write %" PRIu32 " x %d @ %d from %saligned buffer: ", count,
                                                size, offset, host_offset ? "un" : "");
 
                                retval = target_write_memory(target, wa->address, 1, num_bytes, test_pattern);
                                if (retval != ERROR_OK) {
-                                       command_print(CMD_CTX, "Test pattern write failed");
+                                       command_print(CMD, "Test pattern write failed");
                                        goto nextw;
                                }
 
@@ -6295,30 +6092,30 @@ out:
                                duration_measure(&bench);
 
                                if (retval == ERROR_TARGET_UNALIGNED_ACCESS) {
-                                       command_print(CMD_CTX, "Unsupported alignment");
+                                       command_print(CMD, "Unsupported alignment");
                                        goto nextw;
                                } else if (retval != ERROR_OK) {
-                                       command_print(CMD_CTX, "Memory write failed");
+                                       command_print(CMD, "Memory write failed");
                                        goto nextw;
                                }
 
                                /* read back */
                                retval = target_read_memory(target, wa->address, 1, num_bytes, read_buf);
                                if (retval != ERROR_OK) {
-                                       command_print(CMD_CTX, "Test pattern write failed");
+                                       command_print(CMD, "Test pattern write failed");
                                        goto nextw;
                                }
 
                                /* check result */
                                int result = memcmp(read_ref, read_buf, num_bytes);
                                if (result == 0) {
-                                       command_print(CMD_CTX, "Pass in %fs (%0.3f KiB/s)",
+                                       command_print(CMD, "Pass in %fs (%0.3f KiB/s)",
                                                        duration_elapsed(&bench),
                                                        duration_kbps(&bench, count * size));
                                } else {
-                                       command_print(CMD_CTX, "Compare failed");
-                                       binprint(CMD_CTX, "ref:", read_ref, num_bytes);
-                                       binprint(CMD_CTX, "buf:", read_buf, num_bytes);
+                                       command_print(CMD, "Compare failed");
+                                       binprint(CMD, "ref:", read_ref, num_bytes);
+                                       binprint(CMD, "buf:", read_buf, num_bytes);
                                }
 nextw:
                                free(read_ref);
@@ -6431,7 +6228,7 @@ static const struct command_registration target_exec_command_handlers[] = {
                .name = "mdd",
                .handler = handle_md_command,
                .mode = COMMAND_EXEC,
-               .help = "display memory words",
+               .help = "display memory double-words",
                .usage = "['phys'] address [count]",
        },
        {
@@ -6459,7 +6256,7 @@ static const struct command_registration target_exec_command_handlers[] = {
                .name = "mwd",
                .handler = handle_mw_command,
                .mode = COMMAND_EXEC,
-               .help = "write memory word",
+               .help = "write memory double-word",
                .usage = "['phys'] address value [count]",
        },
        {
@@ -6488,7 +6285,7 @@ static const struct command_registration target_exec_command_handlers[] = {
                .handler = handle_bp_command,
                .mode = COMMAND_EXEC,
                .help = "list or set hardware or software breakpoint",
-               .usage = "<address> [<asid>] <length> ['hw'|'hw_ctx']",
+               .usage = "[<address> [<asid>] <length> ['hw'|'hw_ctx']]",
        },
        {
                .name = "rbp",

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)