mips32_pracc: jump to 0xff20.0200 if cpu reads wrong addr

On some CPUs, like bcm7401 with EJTAG v2.0 we can have situation where
CPU do not stops execution. For example, all CP0 commands will have this issue.
In this case we should some hove recover our session. Currently
jump to 0xff20.0200 seems to be good option. If it brake some thing on
newer EJTAG, then check for EJTAG v2.0 should be added.

Change-Id: Icd8841f38a1a85e0f7682b6dc358af8dfaae0744
Signed-off-by: Oleksij Rempel <bug-track@fisher-privat.net>
Reviewed-on: http://openocd.zylin.com/1353
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
__archive__
Oleksij Rempel 2013-04-20 14:27:39 +02:00 committed by Spencer Oliver
parent 6fb232c256
commit 3610f2f09b
1 changed files with 8 additions and 3 deletions

View File

@ -153,10 +153,15 @@ static int mips32_pracc_exec_read(struct mips32_pracc_context *ctx, uint32_t add
}
/* save to our debug stack */
data = ctx->stack[--ctx->stack_offset];
} else if (address >= 0xFF200000) {
/* CPU keeps reading at the end of execution.
* If we after 0xF0000000 address range, we can use
* one shot jump instruction.
* Since this instruction is limited to
* 26bit, we need to do some magic to fit it to our needs. */
LOG_DEBUG("Reading unexpected address. Jump to 0xFF200200\n");
data = MIPS32_J((0x0FFFFFFF & 0xFF200200) >> 2);
} else {
/* TODO: send JMP 0xFF200000 instruction. Hopefully processor jump back
* to start of debug vector */
LOG_ERROR("Error reading unexpected address 0x%8.8" PRIx32 "", address);
return ERROR_JTAG_DEVICE_ERROR;
}