Remove BUILD_TARGET64
[fw/openocd] / src / target / target.c
index 5295dd626815ee86dacb4698218014c0b8303168..538831b5b300aa45581d6339dd1bb42c45ac73b7 100644 (file)
@@ -94,6 +94,7 @@ extern struct target_type cortexr4_target;
 extern struct target_type arm11_target;
 extern struct target_type ls1_sap_target;
 extern struct target_type mips_m4k_target;
+extern struct target_type mips_mips64_target;
 extern struct target_type avr_target;
 extern struct target_type dsp563xx_target;
 extern struct target_type dsp5680xx_target;
@@ -110,6 +111,7 @@ extern struct target_type stm8_target;
 extern struct target_type riscv_target;
 extern struct target_type mem_ap_target;
 extern struct target_type esirisc_target;
+extern struct target_type arcv2_target;
 
 static struct target_type *target_types[] = {
        &arm7tdmi_target,
@@ -145,9 +147,9 @@ static struct target_type *target_types[] = {
        &riscv_target,
        &mem_ap_target,
        &esirisc_target,
-#if BUILD_TARGET64
+       &arcv2_target,
        &aarch64_target,
-#endif
+       &mips_mips64_target,
        NULL,
 };
 
@@ -201,6 +203,8 @@ static const Jim_Nvp nvp_target_event[] = {
        { .value = TARGET_EVENT_RESUMED, .name = "resumed" },
        { .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
        { .value = TARGET_EVENT_RESUME_END, .name = "resume-end" },
+       { .value = TARGET_EVENT_STEP_START, .name = "step-start" },
+       { .value = TARGET_EVENT_STEP_END, .name = "step-end" },
 
        { .name = "gdb-start", .value = TARGET_EVENT_GDB_START },
        { .name = "gdb-end", .value = TARGET_EVENT_GDB_END },
@@ -215,6 +219,7 @@ static const Jim_Nvp nvp_target_event[] = {
        { .value = TARGET_EVENT_RESET_END,           .name = "reset-end" },
 
        { .value = TARGET_EVENT_EXAMINE_START, .name = "examine-start" },
+       { .value = TARGET_EVENT_EXAMINE_FAIL, .name = "examine-fail" },
        { .value = TARGET_EVENT_EXAMINE_END, .name = "examine-end" },
 
        { .value = TARGET_EVENT_DEBUG_HALTED, .name = "debug-halted" },
@@ -375,12 +380,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 +639,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 +663,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;
        }
 
@@ -710,13 +709,17 @@ static int default_check_reset(struct target *target)
        return ERROR_OK;
 }
 
+/* Equvivalent Tcl code arp_examine_one is in src/target/startup.tcl
+ * Keep in sync */
 int target_examine_one(struct target *target)
 {
        target_call_event_callbacks(target, TARGET_EVENT_EXAMINE_START);
 
        int retval = target->type->examine(target);
-       if (retval != ERROR_OK)
+       if (retval != ERROR_OK) {
+               target_call_event_callbacks(target, TARGET_EVENT_EXAMINE_FAIL);
                return retval;
+       }
 
        target_call_event_callbacks(target, TARGET_EVENT_EXAMINE_END);
 
@@ -1221,7 +1224,24 @@ int target_get_gdb_reg_list(struct target *target,
                struct reg **reg_list[], int *reg_list_size,
                enum target_register_class reg_class)
 {
-       return target->type->get_gdb_reg_list(target, reg_list, reg_list_size, reg_class);
+       int result = target->type->get_gdb_reg_list(target, reg_list,
+                       reg_list_size, reg_class);
+       if (result != ERROR_OK) {
+               *reg_list = NULL;
+               *reg_list_size = 0;
+       }
+       return result;
+}
+
+int target_get_gdb_reg_list_noread(struct target *target,
+               struct reg **reg_list[], int *reg_list_size,
+               enum target_register_class reg_class)
+{
+       if (target->type->get_gdb_reg_list_noread &&
+                       target->type->get_gdb_reg_list_noread(target, reg_list,
+                               reg_list_size, reg_class) == ERROR_OK)
+               return ERROR_OK;
+       return target_get_gdb_reg_list(target, reg_list, reg_list_size, reg_class);
 }
 
 bool target_supports_gdb_connection(struct target *target)
@@ -1236,7 +1256,17 @@ bool target_supports_gdb_connection(struct target *target)
 int target_step(struct target *target,
                int current, target_addr_t address, int handle_breakpoints)
 {
-       return target->type->step(target, current, address, handle_breakpoints);
+       int retval;
+
+       target_call_event_callbacks(target, TARGET_EVENT_STEP_START);
+
+       retval = target->type->step(target, current, address, handle_breakpoints);
+       if (retval != ERROR_OK)
+               return retval;
+
+       target_call_event_callbacks(target, TARGET_EVENT_STEP_END);
+
+       return retval;
 }
 
 int target_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info)
@@ -1593,8 +1623,9 @@ int target_call_event_callbacks(struct target *target, enum target_event event)
                target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
        }
 
-       LOG_DEBUG("target event %i (%s)", event,
-                       Jim_Nvp_value2name_simple(nvp_target_event, event)->name);
+       LOG_DEBUG("target event %i (%s) for core %s", event,
+                       Jim_Nvp_value2name_simple(nvp_target_event, event)->name,
+                       target_name(target));
 
        target_handle_event(target, event);
 
@@ -1668,7 +1699,7 @@ static int target_call_timer_callbacks_check_time(int checktime)
         * next item; initially, that's a standalone "root of the
         * list" variable. */
        struct target_timer_callback **callback = &target_timer_callbacks;
-       while (*callback) {
+       while (callback && *callback) {
                if ((*callback)->removed) {
                        struct target_timer_callback *p = *callback;
                        *callback = (*callback)->next;
@@ -2028,6 +2059,8 @@ static void target_destroy(struct target *target)
                target->smp = 0;
        }
 
+       rtos_destroy(target);
+
        free(target->gdb_port_override);
        free(target->type);
        free(target->trace_info);
@@ -2267,7 +2300,7 @@ static int target_read_buffer_default(struct target *target, target_addr_t addre
        return ERROR_OK;
 }
 
-int target_checksum_memory(struct target *target, target_addr_t address, uint32_t size, uint32_tcrc)
+int target_checksum_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t *crc)
 {
        uint8_t *buffer;
        int retval;
@@ -2578,23 +2611,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 +2637,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 +2645,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 +2660,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 +2870,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 +2881,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 +2890,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 +2922,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 +2948,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 +2963,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 +2974,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 +2984,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 +3112,7 @@ COMMAND_HANDLER(handle_reset_command)
        }
 
        /* reset *all* targets */
-       return target_process_reset(CMD_CTX, reset_mode);
+       return target_process_reset(CMD, reset_mode);
 }
 
 
@@ -3122,10 +3155,10 @@ COMMAND_HANDLER(handle_step_command)
 
        struct target *target = get_current_target(CMD_CTX);
 
-       return target->type->step(target, current_pc, addr, 1);
+       return target_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 +3216,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 +3273,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);
 
@@ -3324,8 +3357,8 @@ COMMAND_HANDLER(handle_mw_command)
        target_addr_t address;
        COMMAND_PARSE_ADDRESS(CMD_ARGV[0], address);
 
-       target_addr_t value;
-       COMMAND_PARSE_ADDRESS(CMD_ARGV[1], value);
+       uint64_t value;
+       COMMAND_PARSE_NUMBER(u64, CMD_ARGV[1], value);
 
        unsigned count = 1;
        if (CMD_ARGC == 3)
@@ -3413,7 +3446,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 +3483,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 +3492,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 +3553,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 +3618,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;
@@ -3624,26 +3657,19 @@ static COMMAND_HELPER(handle_verify_image_command_internal, enum verify_mode ver
 
                                data = malloc(buf_cnt);
 
-                               /* Can we use 32bit word accesses? */
-                               int size = 1;
-                               int count = buf_cnt;
-                               if ((count % 4) == 0) {
-                                       size *= 4;
-                                       count /= 4;
-                               }
-                               retval = target_read_memory(target, image.sections[i].base_address, size, count, data);
+                               retval = target_read_buffer(target, image.sections[i].base_address, buf_cnt, data);
                                if (retval == ERROR_OK) {
                                        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 +3681,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 +3690,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 +3720,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 +3755,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 +3775,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 +3785,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 +3799,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 +3813,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 +3827,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;
@@ -3813,11 +3839,16 @@ COMMAND_HANDLER(handle_rbp_command)
        if (CMD_ARGC != 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-       target_addr_t addr;
-       COMMAND_PARSE_ADDRESS(CMD_ARGV[0], addr);
-
        struct target *target = get_current_target(CMD_CTX);
-       breakpoint_remove(target, addr);
+
+       if (!strcmp(CMD_ARGV[0], "all")) {
+               breakpoint_remove_all(target);
+       } else {
+               target_addr_t addr;
+               COMMAND_PARSE_ADDRESS(CMD_ARGV[0], addr);
+
+               breakpoint_remove(target, addr);
+       }
 
        return ERROR_OK;
 }
@@ -3830,7 +3861,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 +3953,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 +4146,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;
@@ -4532,6 +4563,7 @@ static int target_array2mem(Jim_Interp *interp, struct target *target,
 void target_handle_event(struct target *target, enum target_event e)
 {
        struct target_event_action *teap;
+       int retval;
 
        for (teap = target->event_action; teap != NULL; teap = teap->next) {
                if (teap->event == e) {
@@ -4550,10 +4582,19 @@ void target_handle_event(struct target *target, enum target_event e)
                        struct command_context *cmd_ctx = current_command_context(teap->interp);
                        struct target *saved_target_override = cmd_ctx->current_target_override;
                        cmd_ctx->current_target_override = target;
+                       retval = Jim_EvalObj(teap->interp, teap->body);
+
+                       if (retval == JIM_RETURN)
+                               retval = teap->interp->returnCode;
 
-                       if (Jim_EvalObj(teap->interp, teap->body) != JIM_OK) {
+                       if (retval != 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;
@@ -4831,7 +4872,7 @@ no_params:
                                if (goi->argc != 0)
                                        goto no_params;
                        }
-                       Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, target->working_area_size));
+                       Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, target->coreid));
                        /* loop for more */
                        break;
 
@@ -4894,6 +4935,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 +4976,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)
 {
@@ -5356,7 +5181,6 @@ static int jim_target_wait_state(Jim_Interp *interp, int argc, Jim_Obj *const *a
                                "target: %s wait %s fails (%#s) %s",
                                target_name(target), n->name,
                                eObj, target_strerror_safe(e));
-               Jim_FreeNewObj(interp, eObj);
                return JIM_ERR;
        }
        return JIM_OK;
@@ -5364,27 +5188,25 @@ static int jim_target_wait_state(Jim_Interp *interp, int argc, Jim_Obj *const *a
 /* List for human, Events defined for this target.
  * scripts/programs should use 'name cget -event NAME'
  */
-static int jim_target_event_list(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+COMMAND_HANDLER(handle_target_event_list)
 {
-       struct command_context *cmd_ctx = current_command_context(interp);
-       assert(cmd_ctx != NULL);
-
-       struct target *target = Jim_CmdPrivData(interp);
+       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***");
-       return JIM_OK;
+       command_print(CMD, "***END***");
+       return ERROR_OK;
 }
 static int jim_target_current_state(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 {
@@ -5419,7 +5241,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 ...]",
@@ -5431,45 +5253,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]",
        },
@@ -5491,9 +5327,10 @@ static const struct command_registration target_instance_command_handlers[] = {
        },
        {
                .name = "eventlist",
+               .handler = handle_target_event_list,
                .mode = COMMAND_EXEC,
-               .jim_handler = jim_target_event_list,
                .help = "displays a table of events defined for this target",
+               .usage = "",
        },
        {
                .name = "curstate",
@@ -5890,6 +5727,7 @@ static const struct command_registration target_subcommand_handlers[] = {
                .mode = COMMAND_CONFIG,
                .handler = handle_target_init_command,
                .help = "initialize targets",
+               .usage = "",
        },
        {
                .name = "create",
@@ -5979,7 +5817,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 +5825,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 +5857,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 +5866,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 +5875,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 +5906,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 +5916,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;
 }
@@ -6096,8 +5934,8 @@ static const struct command_registration target_command_handlers[] = {
                .name = "target",
                .mode = COMMAND_CONFIG,
                .help = "configure target",
-
                .chain = target_subcommand_handlers,
+               .usage = "",
        },
        COMMAND_REGISTRATION_DONE
 };
@@ -6133,7 +5971,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 +5980,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 +6038,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 +6051,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 +6064,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 +6110,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 +6133,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 +6269,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 +6297,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,14 +6326,14 @@ 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",
                .handler = handle_rbp_command,
                .mode = COMMAND_EXEC,
                .help = "remove breakpoint",
-               .usage = "address",
+               .usage = "'all' | address",
        },
        {
                .name = "wp",