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>
This commit is contained in:
parent
0b436497e0
commit
2a8aa3b7ef
|
@ -890,8 +890,6 @@ static int xscale_arch_state(struct target_s *target)
|
||||||
static int xscale_poll(target_t *target)
|
static int xscale_poll(target_t *target)
|
||||||
{
|
{
|
||||||
int retval = ERROR_OK;
|
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))
|
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 */
|
/* there's data to read from the tx register, we entered debug state */
|
||||||
xscale->handler_running = 1;
|
|
||||||
|
|
||||||
target->state = TARGET_HALTED;
|
target->state = TARGET_HALTED;
|
||||||
|
|
||||||
/* process debug entry, fetching current mode regs */
|
/* 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");
|
LOG_DEBUG("target resumed");
|
||||||
|
|
||||||
xscale->handler_running = 1;
|
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1574,7 +1568,17 @@ static int xscale_deassert_reset(target_t *target)
|
||||||
breakpoint = breakpoint->next;
|
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;
|
uint32_t address;
|
||||||
unsigned buf_cnt;
|
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
|
* it's using halt mode (not monitor mode), it runs in
|
||||||
* "Special Debug State" for access to registers, memory,
|
* "Special Debug State" for access to registers, memory,
|
||||||
* coprocessors, trace data, etc.
|
* 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;
|
address = xscale->handler_address;
|
||||||
for (unsigned binary_size = sizeof xscale_debug_handler - 1;
|
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);
|
xscale_resume(target, 1, 0x0, 1, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
jtag_add_reset(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERROR_OK;
|
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 */
|
/* 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;
|
xscale->handler_address = 0xfe000800;
|
||||||
|
|
||||||
/* clear the vectors we keep locally for reference */
|
/* clear the vectors we keep locally for reference */
|
||||||
|
|
|
@ -86,8 +86,6 @@ typedef struct xscale_common_s
|
||||||
reg_cache_t *reg_cache;
|
reg_cache_t *reg_cache;
|
||||||
|
|
||||||
/* current state of the debug handler */
|
/* current state of the debug handler */
|
||||||
int handler_installed;
|
|
||||||
int handler_running;
|
|
||||||
uint32_t handler_address;
|
uint32_t handler_address;
|
||||||
|
|
||||||
/* target-endian buffers with exception vectors */
|
/* target-endian buffers with exception vectors */
|
||||||
|
|
Loading…
Reference in New Issue