}
/* 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;
}
goto exit;
}
if (addr != store_addr) {
- LOG_ERROR("Store address mismatch, read: %x expected: %x count: %d",
+ LOG_ERROR("Store address mismatch, read: %" PRIx32 " expected: %" PRIx32 " count: %d",
addr, store_addr, scan_count);
retval = ERROR_FAIL;
goto exit;
goto exit;
}
if (addr != fetch_addr) {
- LOG_ERROR("Fetch addr mismatch, read: %x expected: %x count: %d", addr, fetch_addr, scan_count);
+ LOG_ERROR("Fetch addr mismatch, read: %" PRIx32 " expected: %" PRIx32 " count: %d",
+ addr, fetch_addr, scan_count);
retval = ERROR_FAIL;
goto exit;
}
return retval;
}
-static int mips32_pracc_write_mem_generic(struct mips_ejtag *ejtag_info, uint32_t addr, int size, int count, void *buf)
+static int mips32_pracc_write_mem_generic(struct mips_ejtag *ejtag_info,
+ uint32_t addr, int size, int count, const void *buf)
{
struct pracc_queue_info ctx = {.max_code = 128 * 3 + 6 + 1}; /* alloc memory for the worst case */
pracc_queue_init(&ctx);
if (ctx.retval != ERROR_OK)
goto exit;
- uint32_t *buf32 = buf;
- uint16_t *buf16 = buf;
- uint8_t *buf8 = buf;
+ const uint32_t *buf32 = buf;
+ const uint16_t *buf16 = buf;
+ const uint8_t *buf8 = buf;
while (count) {
ctx.code_count = 0;
return ctx.retval;
}
-int mips32_pracc_write_mem(struct mips_ejtag *ejtag_info, uint32_t addr, int size, int count, void *buf)
+int mips32_pracc_write_mem(struct mips_ejtag *ejtag_info, uint32_t addr, int size, int count, const void *buf)
{
int retval = mips32_pracc_write_mem_generic(ejtag_info, addr, size, count, buf);
if (retval != ERROR_OK)