From 9061c08aa7c8a6fb26fb798ef8a7671d5bc1c36d Mon Sep 17 00:00:00 2001 From: drath Date: Tue, 31 Jul 2007 16:39:06 +0000 Subject: [PATCH] - cleaned up cycle counting in ETM analysis - fixed broken OpenOCD version string git-svn-id: svn://svn.berlios.de/openocd/trunk@188 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/openocd.c | 2 +- src/target/etm.c | 19 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/openocd.c b/src/openocd.c index 1bdbb1cac..57d2dc4ba 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-07-31 12:00 CEST) +#define OPENOCD_VERSION "Open On-Chip Debugger (2007-07-31 19:00 CEST)" #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/src/target/etm.c b/src/target/etm.c index 52e4b3d62..cbe3db593 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -760,18 +760,21 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) u32 old_data_index = ctx->data_index; u32 old_data_half = ctx->data_half; u32 old_index = ctx->pipe_index; + u32 last_instruction = ctx->last_instruction; u32 cycles = 0; if (ctx->trace_data[ctx->pipe_index].flags & ETMV1_TRIGGER_CYCLE) { command_print(cmd_ctx, "--- trigger ---"); } + + /* instructions execute in IE/D or BE/D cycles */ + if ((pipestat == STAT_IE) || (pipestat == STAT_ID)) + ctx->last_instruction = ctx->pipe_index; /* if we don't have a valid pc skip until we reach an indirect branch */ if ((!ctx->pc_ok) && (pipestat != STAT_BE)) { - if (pipestat == STAT_IE) - ctx->last_instruction = ctx->pipe_index; ctx->pipe_index++; continue; } @@ -787,6 +790,8 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) */ old_data_index = ctx->data_index; old_data_half = ctx->data_half; + + ctx->last_instruction = ctx->pipe_index; if ((retval = etmv1_branch_address(ctx)) != 0) { @@ -810,32 +815,27 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) { case 0x0: /* normal PC change */ next_pc = ctx->last_branch; - ctx->last_instruction = old_index; break; case 0x1: /* tracing enabled */ command_print(cmd_ctx, "--- tracing enabled at 0x%8.8x ---", ctx->last_branch); ctx->current_pc = ctx->last_branch; ctx->pipe_index++; - ctx->last_instruction = old_index; continue; break; case 0x2: /* trace restarted after FIFO overflow */ command_print(cmd_ctx, "--- trace restarted after FIFO overflow at 0x%8.8x ---", ctx->last_branch); ctx->current_pc = ctx->last_branch; ctx->pipe_index++; - ctx->last_instruction = old_index; continue; break; case 0x3: /* exit from debug state */ command_print(cmd_ctx, "--- exit from debug state at 0x%8.8x ---", ctx->last_branch); ctx->current_pc = ctx->last_branch; ctx->pipe_index++; - ctx->last_instruction = old_index; continue; break; case 0x4: /* periodic synchronization point */ next_pc = ctx->last_branch; - ctx->last_instruction = old_index; break; default: /* reserved */ ERROR("BUG: branch reason code 0x%x is reserved", ctx->last_branch_reason); @@ -854,8 +854,6 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) if (((ctx->last_branch >= 0x0) && (ctx->last_branch <= 0x20)) || ((ctx->last_branch >= 0xffff0000) && (ctx->last_branch <= 0xffff0020))) { - ctx->last_instruction = old_index; - if ((ctx->last_branch & 0xff) == 0x10) { command_print(cmd_ctx, "data abort"); @@ -889,8 +887,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) } } - cycles = old_index - ctx->last_instruction; - ctx->last_instruction = old_index; + cycles = old_index - last_instruction; } if ((pipestat == STAT_ID) || (pipestat == STAT_BD))