Reported by Marcus Erlandsson
When using GDB with Or1ksim via its JTAG interface, the "stepi" command appears to ignore branch instructions.
I can reproduce the bug, which is long-standing in the code. The fix is to modify function mtspr() in sprs.c, so that it takes no action if asked to set the NPC to the value it already holds.<br> <br> The following code change is suggested within that function:<br> <br> case SPR_NPC:<br> {<br> / The debugger has redirected us to a new address /<br> / This is usually done to reissue an instruction<br> which just caused a breakpoint exception. /<br> <br> / JPB patch. When GDB stepi, this may be used to set the PC to the<br> value it is already at. If this is the case, then we do nothing (in<br> particular we do not trash a delayed branch) /<br> <br> if (value != cpu_state.pc)<br> {<br> cpu_state.pc = value;<br> <br> if(!value && config.sim.verbose)<br> PRINTF("WARNING: PC just set to 0!\n");<br> <br> / Clear any pending delay slot jumps also /<br> cpu_state.delay_insn = 0;<br> pcnext = value + 4;<br> }<br> }<br> break;<br> <br> This change will be included in the next release
Fixed in Or1ksim 0.3.0rc3