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;
+
+ 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 ((!checktime&&callback->periodic)||
- (((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
- || (now.tv_sec > callback->when.tv_sec)))
+ 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;
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)
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));
}