From 2a8aa3b7efb590cabd7ee930dbb68fd64e028099 Mon Sep 17 00:00:00 2001
From: David Brownell <dbrownell@users.sourceforge.net>
Date: Sun, 25 Oct 2009 13:06:47 -0700
Subject: xscale: always reload handler after reset

Remove needless debug handler state.

 - "handler_installed" became wrong as soon as the second TRST+SRST
   reset was issued ... so the handler was never reloaded after the
   reset removed it from the mini-icache.

   This fixes the bug where subsequent resets fail on PXA255 (if the
   first one even worked, which is uncommon).  Other XScale chips
   would have problems too; PXA270 seems to have, IXP425 maybe not.

 - "handler_running" was never tested; it's pointless.

Plus a related bugfix: invalidate OpenOCD's ARM register cache on reset.
It was no more valid than the XScale's mini-icache.  (Though ... such
invalidations might be better done in "SRST asserted" callbacks.)

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
---
 src/target/xscale.c | 28 +++++++++++-----------------
 src/target/xscale.h |  2 --
 2 files changed, 11 insertions(+), 19 deletions(-)

(limited to 'src')

diff --git a/src/target/xscale.c b/src/target/xscale.c
index 640eb01b..ee9d88d6 100644
--- a/src/target/xscale.c
+++ b/src/target/xscale.c
@@ -890,8 +890,6 @@ static int xscale_arch_state(struct target_s *target)
 static int xscale_poll(target_t *target)
 {
 	int retval = ERROR_OK;
-	armv4_5_common_t *armv4_5 = target->arch_info;
-	xscale_common_t *xscale = armv4_5->arch_info;
 
 	if ((target->state == TARGET_RUNNING) || (target->state == TARGET_DEBUG_RUNNING))
 	{
@@ -900,8 +898,6 @@ static int xscale_poll(target_t *target)
 		{
 
 			/* there's data to read from the tx register, we entered debug state */
-			xscale->handler_running = 1;
-
 			target->state = TARGET_HALTED;
 
 			/* process debug entry, fetching current mode regs */
@@ -1365,8 +1361,6 @@ static int xscale_resume(struct target_s *target, int current,
 
 	LOG_DEBUG("target resumed");
 
-	xscale->handler_running = 1;
-
 	return ERROR_OK;
 }
 
@@ -1574,7 +1568,17 @@ static int xscale_deassert_reset(target_t *target)
 		breakpoint = breakpoint->next;
 	}
 
-	if (!xscale->handler_installed)
+	armv4_5_invalidate_core_regs(target);
+
+	/* FIXME mark hardware watchpoints got unset too.  Also,
+	 * at least some of the XScale registers are invalid...
+	 */
+
+	/*
+	 * REVISIT:  *assumes* we had a SRST+TRST reset so the mini-icache
+	 * contents got invalidated.  Safer to force that, so writing new
+	 * contents can't ever fail..
+	 */
 	{
 		uint32_t address;
 		unsigned buf_cnt;
@@ -1599,10 +1603,6 @@ static int xscale_deassert_reset(target_t *target)
 		 * it's using halt mode (not monitor mode), it runs in
 		 * "Special Debug State" for access to registers, memory,
 		 * coprocessors, trace data, etc.
-		 *
-		 * REVISIT:  *assumes* we've had a SRST+TRST reset so the
-		 * mini-icache contents have been invalidated.  Safest to
-		 * force that, so writing new contents is reliable...
 		 */
 		address = xscale->handler_address;
 		for (unsigned binary_size = sizeof xscale_debug_handler - 1;
@@ -1673,10 +1673,6 @@ static int xscale_deassert_reset(target_t *target)
 			xscale_resume(target, 1, 0x0, 1, 0);
 		}
 	}
-	else
-	{
-		jtag_add_reset(0, 0);
-	}
 
 	return ERROR_OK;
 }
@@ -2967,8 +2963,6 @@ static int xscale_init_arch_info(target_t *target,
 	}
 
 	/* the debug handler isn't installed (and thus not running) at this time */
-	xscale->handler_installed = 0;
-	xscale->handler_running = 0;
 	xscale->handler_address = 0xfe000800;
 
 	/* clear the vectors we keep locally for reference */
diff --git a/src/target/xscale.h b/src/target/xscale.h
index a5d83ee6..4b34cf88 100644
--- a/src/target/xscale.h
+++ b/src/target/xscale.h
@@ -86,8 +86,6 @@ typedef struct xscale_common_s
 	reg_cache_t *reg_cache;
 
 	/* current state of the debug handler */
-	int handler_installed;
-	int handler_running;
 	uint32_t handler_address;
 
 	/* target-endian buffers with exception vectors */
-- 
cgit v1.2.3