diff options
Diffstat (limited to 'src/target')
-rw-r--r-- | src/target/xscale.c | 53 | ||||
-rw-r--r-- | src/target/xscale.h | 4 |
2 files changed, 51 insertions, 6 deletions
diff --git a/src/target/xscale.c b/src/target/xscale.c index 91078927..59f1795e 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -3506,18 +3506,63 @@ int xscale_handle_trace_image_command(struct command_context_s *cmd_ctx, char *c return ERROR_OK; } -int xscale_handle_dump_trace_buffer_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +int xscale_handle_dump_trace_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { target_t *target = get_current_target(cmd_ctx); armv4_5_common_t *armv4_5; xscale_common_t *xscale; - + xscale_trace_data_t *trace_data; + fileio_t file; + if (xscale_get_arch_pointers(target, &armv4_5, &xscale) != ERROR_OK) { command_print(cmd_ctx, "target isn't an XScale target"); return ERROR_OK; } + if (target->state != TARGET_HALTED) + { + command_print(cmd_ctx, "target must be stopped for \"%s\" command", cmd); + return ERROR_OK; + } + + if (argc < 1) + { + command_print(cmd_ctx, "usage: xscale dump_trace <file>"); + return ERROR_OK; + } + + trace_data = xscale->trace.data; + + if (!trace_data) + { + command_print(cmd_ctx, "no trace data collected"); + return ERROR_OK; + } + + if (fileio_open(&file, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK) + { + command_print(cmd_ctx, "file open error: %s", file.error_str); + return ERROR_OK; + } + + while (trace_data) + { + int i; + + fileio_write_u32(&file, trace_data->chkpt0); + fileio_write_u32(&file, trace_data->chkpt1); + fileio_write_u32(&file, trace_data->last_instruction); + fileio_write_u32(&file, trace_data->depth); + + for (i = 0; i < trace_data->depth; i++) + fileio_write_u32(&file, trace_data->entries[i].data | ((trace_data->entries[i].type & 0xffff) << 16)); + + trace_data = trace_data->next; + } + + fileio_close(&file); + return ERROR_OK; } @@ -3555,9 +3600,9 @@ int xscale_register_commands(struct command_context_s *cmd_ctx) register_command(cmd_ctx, xscale_cmd, "vector_catch", xscale_handle_idcache_command, COMMAND_EXEC, "<mask> of vectors that should be catched"); - register_command(cmd_ctx, xscale_cmd, "trace_buffer", xscale_handle_trace_buffer_command, COMMAND_EXEC, "<enable|disable> ['fill'|'wrap']"); + register_command(cmd_ctx, xscale_cmd, "trace_buffer", xscale_handle_trace_buffer_command, COMMAND_EXEC, "<enable|disable> ['fill' [n]|'wrap']"); - register_command(cmd_ctx, xscale_cmd, "dump_trace_buffer", xscale_handle_dump_trace_buffer_command, COMMAND_EXEC, "dump content of trace buffer"); + register_command(cmd_ctx, xscale_cmd, "dump_trace", xscale_handle_dump_trace_command, COMMAND_EXEC, "dump content of trace buffer to <file>"); register_command(cmd_ctx, xscale_cmd, "analyze_trace", xscale_handle_analyze_trace_buffer_command, COMMAND_EXEC, "analyze content of trace buffer"); register_command(cmd_ctx, xscale_cmd, "trace_image", xscale_handle_trace_image_command, COMMAND_EXEC, "load image from <file> [base address]"); diff --git a/src/target/xscale.h b/src/target/xscale.h index 86acfbde..8d1c25cc 100644 --- a/src/target/xscale.h +++ b/src/target/xscale.h @@ -51,8 +51,8 @@ enum xscale_debug_reason enum xscale_trace_entry_type { - XSCALE_TRACE_MESSAGE, - XSCALE_TRACE_ADDRESS, + XSCALE_TRACE_MESSAGE = 0x0, + XSCALE_TRACE_ADDRESS = 0x1, }; typedef struct xscale_trace_entry_s |