return ERROR_FAIL;
}
+ /* disable polling during reset to make reset event scripts
+ * more predictable, i.e. dr/irscan & pathmove in events will
+ * not have JTAG operations injected into the middle of a sequence.
+ */
+ int save_poll = target_continous_poll;
+ target_continous_poll = 0;
+
sprintf( buf, "ocd_process_reset %s", n->name );
retval = Jim_Eval( interp, buf );
+ target_continous_poll = save_poll;
+
if(retval != JIM_OK) {
Jim_PrintErrorMessage(interp);
return ERROR_FAIL;
int target_examine(void)
{
int retval = ERROR_OK;
- target_t *target = all_targets;
- while (target)
+ target_t *target;
+
+ for (target = all_targets; target; target = target->next)
{
+ if (!target->tap->enabled)
+ continue;
if ((retval = target_examine_one(target)) != ERROR_OK)
return retval;
- target = target->next;
}
return retval;
}
return ERROR_OK;
}
-static int target_call_timer_callbacks_check_time(int checktime)
+static int target_timer_callback_periodic_restart(
+ target_timer_callback_t *cb, struct timeval *now)
{
- target_timer_callback_t *callback = target_timer_callbacks;
- target_timer_callback_t *next_callback;
- struct timeval now;
+ int time_ms = cb->time_ms;
+ cb->when.tv_usec = now->tv_usec + (time_ms % 1000) * 1000;
+ time_ms -= (time_ms % 1000);
+ cb->when.tv_sec = now->tv_sec + time_ms / 1000;
+ if (cb->when.tv_usec > 1000000)
+ {
+ cb->when.tv_usec = cb->when.tv_usec - 1000000;
+ cb->when.tv_sec += 1;
+ }
+ return ERROR_OK;
+}
+static int target_call_timer_callback(target_timer_callback_t *cb,
+ struct timeval *now)
+{
+ cb->callback(cb->priv);
+
+ if (cb->periodic)
+ return target_timer_callback_periodic_restart(cb, now);
+
+ return target_unregister_timer_callback(cb->callback, cb->priv);
+}
+
+static int target_call_timer_callbacks_check_time(int checktime)
+{
keep_alive();
+ struct timeval now;
gettimeofday(&now, NULL);
+ target_timer_callback_t *callback = target_timer_callbacks;
while (callback)
{
- next_callback = callback->next;
+ // cleaning up may unregister and free this callback
+ target_timer_callback_t *next_callback = callback->next;
- if ((!checktime&&callback->periodic)||
- (((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
- || (now.tv_sec > callback->when.tv_sec)))
+ bool call_it = callback->callback &&
+ ((!checktime && callback->periodic) ||
+ now.tv_sec > callback->when.tv_sec ||
+ (now.tv_sec == callback->when.tv_sec &&
+ now.tv_usec >= callback->when.tv_usec));
+
+ if (call_it)
{
- if(callback->callback != NULL)
- {
- callback->callback(callback->priv);
- if (callback->periodic)
- {
- int time_ms = callback->time_ms;
- callback->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
- time_ms -= (time_ms % 1000);
- callback->when.tv_sec = now.tv_sec + time_ms / 1000;
- if (callback->when.tv_usec > 1000000)
- {
- callback->when.tv_usec = callback->when.tv_usec - 1000000;
- callback->when.tv_sec += 1;
- }
- }
- else
- {
- int retval;
- if((retval = target_unregister_timer_callback(callback->callback, callback->priv)) != ERROR_OK)
- return retval;
- }
- }
+ int retval = target_call_timer_callback(callback, &now);
+ if (retval != ERROR_OK)
+ return retval;
}
callback = next_callback;
command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0] );
goto DumpTargets;
}
+ if (!target->tap->enabled) {
+ command_print(cmd_ctx,"Target: TAP %s is disabled, "
+ "can't be the current target\n",
+ target->tap->dotted_name);
+ return ERROR_FAIL;
+ }
cmd_ctx->current_target = target->target_number;
return ERROR_OK;
DumpTargets:
target = all_targets;
- command_print(cmd_ctx, " CmdName Type Endian AbsChainPos Name State ");
- command_print(cmd_ctx, "-- ---------- ---------- ---------- ----------- ------------- ----------");
+ command_print(cmd_ctx, " TargetName Type Endian TapName State ");
+ command_print(cmd_ctx, "-- ------------------ ---------- ------ ------------------ ------------");
while (target)
{
- /* XX: abcdefghij abcdefghij abcdefghij abcdefghij */
- command_print(cmd_ctx, "%2d: %-10s %-10s %-10s %10d %14s %s",
+ const char *state;
+ char marker = ' ';
+
+ if (target->tap->enabled)
+ state = Jim_Nvp_value2name_simple(nvp_target_state,
+ target->state)->name;
+ else
+ state = "tap-disabled";
+
+ if (cmd_ctx->current_target == target->target_number)
+ marker = '*';
+
+ /* keep columns lined up to match the headers above */
+ command_print(cmd_ctx, "%2d%c %-18s %-10s %-6s %-18s %s",
target->target_number,
+ marker,
target->cmd_name,
target_get_name(target),
- Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness )->name,
- target->tap->abs_chain_position,
+ Jim_Nvp_value2name_simple(nvp_target_endian,
+ target->endianness)->name,
target->tap->dotted_name,
- Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name );
+ state);
target = target->next;
}
if (argc == 0)
{
- if((retval = target_poll(target)) != ERROR_OK)
+ command_print(cmd_ctx, "background polling: %s",
+ target_continous_poll ? "on" : "off");
+ if ((retval = target_poll(target)) != ERROR_OK)
return retval;
- if((retval = target_arch_state(target)) != ERROR_OK)
+ if ((retval = target_arch_state(target)) != ERROR_OK)
return retval;
}
static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- const Jim_Nvp *n;
- enum target_reset_mode reset_mode = RESET_RUN;
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
- if (argc >= 1)
+ enum target_reset_mode reset_mode = RESET_RUN;
+ if (argc == 1)
{
+ const Jim_Nvp *n;
n = Jim_Nvp_name2value_simple( nvp_reset_modes, args[0] );
if( (n->name == NULL) || (n->value == RESET_UNKNOWN) ){
return ERROR_COMMAND_SYNTAX_ERROR;
static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- int retval;
- target_t *target = get_current_target(cmd_ctx);
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
- target_handle_event( target, TARGET_EVENT_OLD_pre_resume );
+ target_t *target = get_current_target(cmd_ctx);
+ target_handle_event(target, TARGET_EVENT_OLD_pre_resume);
- if (argc == 0)
- retval = target_resume(target, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
- else if (argc == 1)
- retval = target_resume(target, 0, strtoul(args[0], NULL, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
- else
- {
- retval = ERROR_COMMAND_SYNTAX_ERROR;
- }
+ /* with no args, resume from current pc, addr = 0,
+ * with one arguments, addr = args[0],
+ * handle breakpoints, not debugging */
+ u32 addr = 0;
+ if (argc == 1)
+ addr = strtoul(args[0], NULL, 0);
- return retval;
+ return target_resume(target, 0, addr, 1, 0);
}
static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- target_t *target = get_current_target(cmd_ctx);
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
LOG_DEBUG("-");
- if (argc == 0)
- return target->type->step(target, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
-
+ /* with no args, step from current pc, addr = 0,
+ * with one argument addr = args[0],
+ * handle breakpoints, debugging */
+ u32 addr = 0;
if (argc == 1)
- return target->type->step(target, 0, strtoul(args[0], NULL, 0), 1); /* addr = args[0], handle breakpoints */
+ addr = strtoul(args[0], NULL, 0);
- return ERROR_OK;
+ target_t *target = get_current_target(cmd_ctx);
+ return target->type->step(target, 0, addr, 1);
}
static void handle_md_output(struct command_context_s *cmd_ctx,
return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 0);
}
-static int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_bp_command_list(struct command_context_s *cmd_ctx)
{
- int retval;
target_t *target = get_current_target(cmd_ctx);
-
- if (argc == 0)
+ breakpoint_t *breakpoint = target->breakpoints;
+ while (breakpoint)
{
- breakpoint_t *breakpoint = target->breakpoints;
-
- while (breakpoint)
+ if (breakpoint->type == BKPT_SOFT)
{
- if (breakpoint->type == BKPT_SOFT)
- {
- char* buf = buf_to_str(breakpoint->orig_instr, breakpoint->length, 16);
- command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint->address, breakpoint->length, breakpoint->set, buf);
- free(buf);
- }
- else
- {
- command_print(cmd_ctx, "0x%8.8x, 0x%x, %i", breakpoint->address, breakpoint->length, breakpoint->set);
- }
- breakpoint = breakpoint->next;
- }
- }
- else if (argc >= 2)
- {
- int hw = BKPT_SOFT;
- u32 length = 0;
-
- length = strtoul(args[1], NULL, 0);
-
- if (argc >= 3)
- if (strcmp(args[2], "hw") == 0)
- hw = BKPT_HARD;
-
- if ((retval = breakpoint_add(target, strtoul(args[0], NULL, 0), length, hw)) != ERROR_OK)
- {
- LOG_ERROR("Failure setting breakpoints");
+ char* buf = buf_to_str(breakpoint->orig_instr,
+ breakpoint->length, 16);
+ command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s",
+ breakpoint->address, breakpoint->length,
+ breakpoint->set, buf);
+ free(buf);
}
else
{
- command_print(cmd_ctx, "breakpoint added at address 0x%8.8lx",
- strtoul(args[0], NULL, 0));
+ command_print(cmd_ctx, "0x%8.8x, 0x%x, %i",
+ breakpoint->address, breakpoint->length, breakpoint->set);
}
+
+ breakpoint = breakpoint->next;
}
+ return ERROR_OK;
+}
+
+static int handle_bp_command_set(struct command_context_s *cmd_ctx,
+ u32 addr, u32 length, int hw)
+{
+ target_t *target = get_current_target(cmd_ctx);
+ int retval = breakpoint_add(target, addr, length, hw);
+ if (ERROR_OK == retval)
+ command_print(cmd_ctx, "breakpoint set at 0x%8.8x", addr);
else
+ LOG_ERROR("Failure setting breakpoint");
+ return retval;
+}
+
+static int handle_bp_command(struct command_context_s *cmd_ctx,
+ char *cmd, char **args, int argc)
+{
+ if (argc == 0)
+ return handle_bp_command_list(cmd_ctx);
+
+ if (argc < 2 || argc > 3)
{
command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
- return ERROR_OK;
+ u32 addr = strtoul(args[0], NULL, 0);
+ u32 length = strtoul(args[1], NULL, 0);
+
+ int hw = BKPT_SOFT;
+ if (argc == 3)
+ {
+ if (strcmp(args[2], "hw") == 0)
+ hw = BKPT_HARD;
+ else
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ }
+
+ return handle_bp_command_set(cmd_ctx, addr, length, hw);
}
static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- target_t *target = get_current_target(cmd_ctx);
+ if (argc != 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
- if (argc > 0)
- watchpoint_remove(target, strtoul(args[0], NULL, 0));
+ target_t *target = get_current_target(cmd_ctx);
+ watchpoint_remove(target, strtoul(args[0], NULL, 0));
return ERROR_OK;
}
-static int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
-{
- int retval;
- target_t *target = get_current_target(cmd_ctx);
- u32 va;
- u32 pa;
+/**
+ * Translate a virtual address to a physical address.
+ *
+ * The low-level target implementation must have logged a detailed error
+ * which is forwarded to telnet/GDB session.
+ */
+static int handle_virt2phys_command(command_context_t *cmd_ctx,
+ char *cmd, char **args, int argc)
+{
if (argc != 1)
- {
return ERROR_COMMAND_SYNTAX_ERROR;
- }
- va = strtoul(args[0], NULL, 0);
- retval = target->type->virt2phys(target, va, &pa);
+ target_t *target = get_current_target(cmd_ctx);
+ u32 va = strtoul(args[0], NULL, 0);
+ u32 pa;
+
+ int retval = target->type->virt2phys(target, va, &pa);
if (retval == ERROR_OK)
- {
command_print(cmd_ctx, "Physical address 0x%08x", pa);
- }
- else
- {
- /* lower levels will have logged a detailed error which is
- * forwarded to telnet/GDB session.
- */
- }
+
return retval;
}
static void writeData(FILE *f, const void *data, size_t len)
{
- size_t written = fwrite(data, len, 1, f);
+ size_t written = fwrite(data, 1, len, f);
if (written != len)
LOG_ERROR("failed to write %zu bytes: %s", len, strerror(errno));
}
goto no_params;
}
}
- Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
+ Jim_SetResult(interp, Jim_NewIntObj(goi->interp, target->backup_working_area));
/* loop for more e*/
break;
Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
return JIM_ERR;
}
+ if (!target->tap->enabled)
+ goto err_tap_disabled;
e = target->type->examine( target );
if( e != ERROR_OK ){
Jim_SetResult_sprintf( interp, "examine-fails: %d", e );
Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
return JIM_ERR;
}
+ if (!target->tap->enabled)
+ goto err_tap_disabled;
if( !(target_was_examined(target)) ){
e = ERROR_TARGET_NOT_EXAMINED;
} else {
if( e != JIM_OK ){
return e;
}
+ if (!target->tap->enabled)
+ goto err_tap_disabled;
/* determine if we should halt or not. */
target->reset_halt = !!a;
/* When this happens - all workareas are invalid. */
Jim_WrongNumArgs( goi.interp, 0, argv, "halt [no parameters]");
return JIM_ERR;
}
+ if (!target->tap->enabled)
+ goto err_tap_disabled;
target->type->halt( target );
return JIM_OK;
case TS_CMD_WAITSTATE:
if( e != JIM_OK ){
return e;
}
+ if (!target->tap->enabled)
+ goto err_tap_disabled;
e = target_wait_state( target, n->value, a );
if( e != ERROR_OK ){
Jim_SetResult_sprintf( goi.interp,
return JIM_OK;
}
return JIM_ERR;
+
+err_tap_disabled:
+ Jim_SetResult_sprintf(interp, "[TAP is disabled]");
+ return JIM_ERR;
}
static int target_create( Jim_GetOptInfo *goi )