mips32_pracc: jump to 0xff20.0200 if cpu reads wrong addr53/1353/6
authorOleksij Rempel <bug-track@fisher-privat.net>
Sat, 20 Apr 2013 12:27:39 +0000 (20 14:27 +0200)
committerSpencer Oliver <spen@spen-soft.co.uk>
Wed, 17 Jul 2013 14:33:24 +0000 (17 14:33 +0000)
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>
src/target/mips32_pracc.c

index bce31ba..d0ecba2 100644 (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;
        }