From cb6ebced3df72668091d5920fef3fbc46ddbc7ac Mon Sep 17 00:00:00 2001
From: drath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Thu, 16 Aug 2007 13:12:48 +0000
Subject: [PATCH] - update jtag_speed setting when changing it during runtime
 with a FT2232 based interface - use 'etm trigger_percent' setting when
 programming ETB trigger count - fixed some small bugs in ETM trace analysis -
 fixed minor bug in flash writing (thanks to Pavel Chromy)

git-svn-id: svn://svn.berlios.de/openocd/trunk@197 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/flash/flash.c |  9 ++++++---
 src/jtag/ft2232.c |  2 ++
 src/openocd.c     |  2 +-
 src/target/etb.c  |  5 ++++-
 src/target/etm.c  | 40 +++++++++++++++++++++++++++++++++++-----
 src/target/etm.h  |  1 +
 6 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/src/flash/flash.c b/src/flash/flash.c
index 19d5c3c58..9ca5f157b 100644
--- a/src/flash/flash.c
+++ b/src/flash/flash.c
@@ -797,10 +797,13 @@ int flash_write(target_t *target, image_t *image, u32 *written, char **error_str
 		while ((run_address + run_size < c->base + c->size)
 				&& (section_last + 1 < image->num_sections))
 		{
-			if (image->sections[section_last + 1].base_address > (run_address + run_size))
-				break;
 			if (image->sections[section_last + 1].base_address < (run_address + run_size))
+			{
 				WARNING("section %d out of order", section_last + 1);
+				break;
+			}
+			if (image->sections[section_last + 1].base_address != (run_address + run_size))
+				break;
 			run_size += image->sections[++section_last].size;
 		}
 
@@ -836,8 +839,8 @@ int flash_write(target_t *target, image_t *image, u32 *written, char **error_str
 				if (retval != ERROR_OK)
 					snprintf(*error_str, FLASH_MAX_ERROR_STR, "error reading from image: %s", image->error_str);
 				else
-					
 					snprintf(*error_str, FLASH_MAX_ERROR_STR, "error reading from image");
+				
 				return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE;
 			}
 
diff --git a/src/jtag/ft2232.c b/src/jtag/ft2232.c
index 339e77dae..b1acee58b 100644
--- a/src/jtag/ft2232.c
+++ b/src/jtag/ft2232.c
@@ -256,6 +256,8 @@ int ft2232_speed(int speed)
 		ERROR("couldn't set FT2232 TCK speed");
 		return retval;
 	}
+
+	jtag_speed = speed;
 	
 	return ERROR_OK;
 }
diff --git a/src/openocd.c b/src/openocd.c
index 7e85c82b6..4965d52f3 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-14 12:00 CEST)"
+#define OPENOCD_VERSION "Open On-Chip Debugger (2007-08-16 15:00 CEST)"
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
diff --git a/src/target/etb.c b/src/target/etb.c
index 81e20af01..f145f3021 100644
--- a/src/target/etb.c
+++ b/src/target/etb.c
@@ -636,6 +636,7 @@ int etb_start_capture(etm_context_t *etm_ctx)
 {
 	etb_t *etb = etm_ctx->capture_driver_priv;
 	u32 etb_ctrl_value = 0x1;
+	u32 trigger_count;
 
 	if ((etm_ctx->portmode & ETM_PORT_MODE_MASK) == ETM_PORT_DEMUXED)
 	{
@@ -650,7 +651,9 @@ int etb_start_capture(etm_context_t *etm_ctx)
 	if ((etm_ctx->portmode & ETM_PORT_MODE_MASK) == ETM_PORT_MUXED)
 		return ERROR_ETM_PORTMODE_NOT_SUPPORTED;
 	
-	etb_write_reg(&etb->reg_cache->reg_list[ETB_TRIGGER_COUNTER], 0x600);
+	trigger_count = (etb->ram_depth * etm_ctx->trigger_percent) / 100;
+	
+	etb_write_reg(&etb->reg_cache->reg_list[ETB_TRIGGER_COUNTER], trigger_count);
 	etb_write_reg(&etb->reg_cache->reg_list[ETB_RAM_WRITE_POINTER], 0x0);
 	etb_write_reg(&etb->reg_cache->reg_list[ETB_CTRL], etb_ctrl_value);
 	jtag_execute_queue();
diff --git a/src/target/etm.c b/src/target/etm.c
index cbe3db593..3f7bbbf13 100644
--- a/src/target/etm.c
+++ b/src/target/etm.c
@@ -762,6 +762,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx)
 		u32 old_index = ctx->pipe_index;
 		u32 last_instruction = ctx->last_instruction;
 		u32 cycles = 0;
+		int current_pc_ok = ctx->pc_ok;
 		
 		if (ctx->trace_data[ctx->pipe_index].flags & ETMV1_TRIGGER_CYCLE)
 		{
@@ -836,6 +837,16 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx)
 					break;
 				case 0x4:	/* periodic synchronization point */
 					next_pc = ctx->last_branch;
+					/* if we had no valid PC prior to this synchronization point,
+					 * we have to move on with the next trace cycle
+					 */
+					if (!current_pc_ok)
+					{
+						command_print(cmd_ctx, "--- periodic synchronization point at 0x%8.8x ---", next_pc);
+						ctx->current_pc = next_pc;
+						ctx->pipe_index++;
+						continue;
+					}
 					break;
 				default:	/* reserved */
 					ERROR("BUG: branch reason code 0x%x is reserved", ctx->last_branch_reason);		
@@ -883,7 +894,9 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx)
 				}
 				else if (retval == ERROR_TRACE_INSTRUCTION_UNAVAILABLE)
 				{
-					/* TODO: handle incomplete images */
+					/* TODO: handle incomplete images 
+					 * for now we just quit the analsysis*/
+					return retval;
 				}
 			}
 			
@@ -910,7 +923,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx)
 				
 				do {
 					if ((retval = etmv1_next_packet(ctx, &packet, 0)) != 0)
-						return -1;
+						return ERROR_ETM_ANALYSIS_FAILED;
 					ctx->last_ptr &= ~(0x7f << shift);
 					ctx->last_ptr |= (packet & 0x7f) << shift;
 					shift += 7;
@@ -936,7 +949,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx)
 						{
 							u32 data;
 							if (etmv1_data(ctx, 4, &data) != 0)
-								return -1;
+								return ERROR_ETM_ANALYSIS_FAILED;
 							command_print(cmd_ctx, "data: 0x%8.8x", data);
 						}
 					}
@@ -945,7 +958,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx)
 				{
 					u32 data;
 					if (etmv1_data(ctx, arm_access_size(&instruction), &data) != 0)
-						return -1;
+						return ERROR_ETM_ANALYSIS_FAILED;
 					command_print(cmd_ctx, "data: 0x%8.8x", data);
 				}
 			}
@@ -1771,6 +1784,7 @@ int handle_etm_analyze_command(struct command_context_s *cmd_ctx, char *cmd, cha
 	armv4_5_common_t *armv4_5;
 	arm7_9_common_t *arm7_9;
 	etm_context_t *etm_ctx;
+	int retval;
 
 	target = get_current_target(cmd_ctx);
 	
@@ -1786,7 +1800,23 @@ int handle_etm_analyze_command(struct command_context_s *cmd_ctx, char *cmd, cha
 		return ERROR_OK;
 	}
 	
-	etmv1_analyze_trace(etm_ctx, cmd_ctx);
+	if ((retval = etmv1_analyze_trace(etm_ctx, cmd_ctx)) != ERROR_OK)
+	{
+		switch(retval)
+		{
+			case ERROR_ETM_ANALYSIS_FAILED:
+				command_print(cmd_ctx, "further analysis failed (corrupted trace data or just end of data");
+				break;
+			case ERROR_TRACE_INSTRUCTION_UNAVAILABLE:
+				command_print(cmd_ctx, "no instruction for current address available, analysis aborted");
+				break;
+			case ERROR_TRACE_IMAGE_UNAVAILABLE:
+				command_print(cmd_ctx, "no image available for trace analysis");
+				break;
+			default:
+				command_print(cmd_ctx, "unknown error: %i", retval);
+		}
+	}
 	
 	return ERROR_OK;
 }
diff --git a/src/target/etm.h b/src/target/etm.h
index bcaf25132..bfa1252b7 100644
--- a/src/target/etm.h
+++ b/src/target/etm.h
@@ -209,5 +209,6 @@ extern etm_context_t* etm_create_context(etm_portmode_t portmode, char *capture_
 #define ERROR_ETM_INVALID_DRIVER	(-1300)
 #define ERROR_ETM_PORTMODE_NOT_SUPPORTED	(-1301)
 #define ERROR_ETM_CAPTURE_INIT_FAILED	(-1302)
+#define ERROR_ETM_ANALYSIS_FAILED	(-1303)
 
 #endif /* ETM_H */
-- 
GitLab