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:
Richard Henderson 2018-05-22 15:15:12 -07:00 committed by Stafford Horne
parent 64e46c9581
commit e0a369cf88
1 changed files with 17 additions and 18 deletions

View File

@ -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();
} }
} }