diff options
author | David Brownell <dbrownell@users.sourceforge.net> | 2009-10-25 13:06:47 -0700 |
---|---|---|
committer | David Brownell <dbrownell@users.sourceforge.net> | 2009-10-25 13:06:47 -0700 |
commit | 2a8aa3b7efb590cabd7ee930dbb68fd64e028099 (patch) | |
tree | e345f77f89b8e9086f2053acf4a458ba3324df32 | |
parent | 0b436497e047a13ff3dbae46af0eb67376ea5acf (diff) | |
download | openocd+libswd-2a8aa3b7efb590cabd7ee930dbb68fd64e028099.tar.gz openocd+libswd-2a8aa3b7efb590cabd7ee930dbb68fd64e028099.tar.bz2 openocd+libswd-2a8aa3b7efb590cabd7ee930dbb68fd64e028099.tar.xz openocd+libswd-2a8aa3b7efb590cabd7ee930dbb68fd64e028099.zip |
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>
-rw-r--r-- | src/target/xscale.c | 28 | ||||
-rw-r--r-- | src/target/xscale.h | 2 |
2 files changed, 11 insertions, 19 deletions
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 */ |