target/openrisc: Fix singlestep_enabled
We failed to store to cpu_pc before raising the exception, which caused us to re-execute the same insn that we stepped. Reviewed-by: Stafford Horne <shorne@gmail.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Stafford Horne <shorne@gmail.com>
This commit is contained in:
parent
64e46c9581
commit
e0a369cf88
|
@ -1335,31 +1335,30 @@ static void openrisc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
{
|
||||
DisasContext *dc = container_of(dcbase, DisasContext, base);
|
||||
|
||||
/* If we have already exited the TB, nothing following has effect. */
|
||||
if (dc->base.is_jmp == DISAS_NORETURN) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((dc->tb_flags & TB_FLAGS_DFLAG ? 1 : 0) != (dc->delayed_branch != 0)) {
|
||||
tcg_gen_movi_i32(cpu_dflag, dc->delayed_branch != 0);
|
||||
}
|
||||
|
||||
tcg_gen_movi_tl(cpu_ppc, dc->base.pc_next - 4);
|
||||
if (dc->base.is_jmp == DISAS_NEXT) {
|
||||
dc->base.is_jmp = DISAS_UPDATE;
|
||||
tcg_gen_movi_tl(cpu_pc, dc->base.pc_next);
|
||||
}
|
||||
if (unlikely(dc->base.singlestep_enabled)) {
|
||||
gen_exception(dc, EXCP_DEBUG);
|
||||
} else {
|
||||
switch (dc->base.is_jmp) {
|
||||
case DISAS_TOO_MANY:
|
||||
gen_goto_tb(dc, 0, dc->base.pc_next);
|
||||
break;
|
||||
case DISAS_NORETURN:
|
||||
break;
|
||||
case DISAS_UPDATE:
|
||||
case DISAS_EXIT:
|
||||
switch (dc->base.is_jmp) {
|
||||
case DISAS_TOO_MANY:
|
||||
gen_goto_tb(dc, 0, dc->base.pc_next);
|
||||
break;
|
||||
case DISAS_UPDATE:
|
||||
case DISAS_EXIT:
|
||||
if (unlikely(dc->base.singlestep_enabled)) {
|
||||
gen_exception(dc, EXCP_DEBUG);
|
||||
} else {
|
||||
tcg_gen_exit_tb(NULL, 0);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue