From 3610f2f09b1ff20c9de265848129111ce87aa3b4 Mon Sep 17 00:00:00 2001 From: Oleksij Rempel Date: Sat, 20 Apr 2013 14:27:39 +0200 Subject: [PATCH] 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 Reviewed-on: http://openocd.zylin.com/1353 Tested-by: jenkins Reviewed-by: Spencer Oliver --- src/target/mips32_pracc.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/target/mips32_pracc.c b/src/target/mips32_pracc.c index bce31ba5..d0ecba2f 100644 --- a/src/target/mips32_pracc.c +++ b/src/target/mips32_pracc.c @@ -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; } -- 2.39.5