#endif
#include "target.h"
+#include "target_type.h"
#include "target_request.h"
#include "time_support.h"
#include "register.h"
#include "image.h"
#include "jtag.h"
-#include <inttypes.h>
-
static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
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;
}
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,
const char *value_fmt;
switch (size) {
- case 4: value_fmt = "%8.8x"; break;
- case 2: value_fmt = "%4.2x"; break;
- case 1: value_fmt = "%2.2x"; break;
+ case 4: value_fmt = "%8.8x "; break;
+ case 2: value_fmt = "%4.2x "; break;
+ case 1: value_fmt = "%2.2x "; break;
default:
LOG_ERROR("invalid memory read size: %u", size);
exit(-1);
"0x%8.8x: ", address + (i*size));
}
- u32 value;
+ u32 value=0;
const u8 *value_ptr = buffer + i * size;
switch (size) {
case 4: value = target_buffer_get_u32(target, value_ptr); break;
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;
}
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;
if( e != JIM_OK ){
return e;
}
- tap = jtag_TapByJimObj( goi->interp, o );
+ tap = jtag_tap_by_jim_obj( goi->interp, o );
if( tap == NULL ){
return JIM_ERR;
}
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 )