From: drath Date: Fri, 17 Aug 2007 08:58:40 +0000 (+0000) Subject: - renamed "xscale dump_trace_buffer" to "xscale dump_trace" and added code for it X-Git-Tag: v0.1.0~1081 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=0eb8621bf2a27191fbfb66159a0927ab6820800f;ds=sidebyside - renamed "xscale dump_trace_buffer" to "xscale dump_trace" and added code for it git-svn-id: svn://svn.berlios.de/openocd/trunk@198 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- diff --git a/src/openocd.c b/src/openocd.c index 4965d52f31..30e63adcdf 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -18,7 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#define OPENOCD_VERSION "Open On-Chip Debugger (2007-08-16 15:00 CEST)" +#define OPENOCD_VERSION "Open On-Chip Debugger (2007-08-17 11:00 CEST)" #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/src/target/xscale.c b/src/target/xscale.c index 91078927a7..59f1795e26 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 "); + 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, " of vectors that should be catched"); - register_command(cmd_ctx, xscale_cmd, "trace_buffer", xscale_handle_trace_buffer_command, COMMAND_EXEC, " ['fill'|'wrap']"); + register_command(cmd_ctx, xscale_cmd, "trace_buffer", xscale_handle_trace_buffer_command, COMMAND_EXEC, " ['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 "); 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 [base address]"); diff --git a/src/target/xscale.h b/src/target/xscale.h index 86acfbdee7..8d1c25cca8 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