From 0eb8621bf2a27191fbfb66159a0927ab6820800f Mon Sep 17 00:00:00 2001
From: drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Fri, 17 Aug 2007 08:58:40 +0000
Subject: [PATCH] - 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
---
 src/openocd.c       |  2 +-
 src/target/xscale.c | 53 +++++++++++++++++++++++++++++++++++++++++----
 src/target/xscale.h |  4 ++--
 3 files changed, 52 insertions(+), 7 deletions(-)

diff --git a/src/openocd.c b/src/openocd.c
index 4965d52f3..30e63adcd 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 91078927a..59f1795e2 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 86acfbdee..8d1c25cca 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
-- 
GitLab