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);
|
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)) {
|
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_i32(cpu_dflag, dc->delayed_branch != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tcg_gen_movi_tl(cpu_ppc, dc->base.pc_next - 4);
|
tcg_gen_movi_tl(cpu_ppc, dc->base.pc_next - 4);
|
||||||
if (dc->base.is_jmp == DISAS_NEXT) {
|
switch (dc->base.is_jmp) {
|
||||||
dc->base.is_jmp = DISAS_UPDATE;
|
case DISAS_TOO_MANY:
|
||||||
tcg_gen_movi_tl(cpu_pc, dc->base.pc_next);
|
gen_goto_tb(dc, 0, dc->base.pc_next);
|
||||||
}
|
break;
|
||||||
if (unlikely(dc->base.singlestep_enabled)) {
|
case DISAS_UPDATE:
|
||||||
gen_exception(dc, EXCP_DEBUG);
|
case DISAS_EXIT:
|
||||||
} else {
|
if (unlikely(dc->base.singlestep_enabled)) {
|
||||||
switch (dc->base.is_jmp) {
|
gen_exception(dc, EXCP_DEBUG);
|
||||||
case DISAS_TOO_MANY:
|
} else {
|
||||||
gen_goto_tb(dc, 0, dc->base.pc_next);
|
|
||||||
break;
|
|
||||||
case DISAS_NORETURN:
|
|
||||||
break;
|
|
||||||
case DISAS_UPDATE:
|
|
||||||
case DISAS_EXIT:
|
|
||||||
tcg_gen_exit_tb(NULL, 0);
|
tcg_gen_exit_tb(NULL, 0);
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached();
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue