From 23141d76209a3a9818a8112e769915136f6a0ed1 Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Fri, 2 Mar 2018 14:43:42 -0500 Subject: [PATCH] arm: Factor out "generate right kind of step exception" We currently have two places that do: if (dc->ss_active) { gen_step_complete_exception(dc); } else { gen_exception_internal(EXCP_DEBUG); } Factor this out into its own function, as we're about to add a third place that needs the same logic. Backports commit 5425415ebba5fa20558e1ef25e1997a6f5ea4c7c from qemu --- qemu/target/arm/translate.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/qemu/target/arm/translate.c b/qemu/target/arm/translate.c index f277434b..af8d44c0 100644 --- a/qemu/target/arm/translate.c +++ b/qemu/target/arm/translate.c @@ -290,6 +290,19 @@ static void gen_step_complete_exception(DisasContext *s) s->is_jmp = DISAS_EXC; } +static void gen_singlestep_exception(DisasContext *s) +{ + /* Generate the right kind of exception for singlestep, which is + * either the architectural singlestep or EXCP_DEBUG for QEMU's + * gdb singlestepping. + */ + if (s->ss_active) { + gen_step_complete_exception(s); + } else { + gen_exception_internal(s, EXCP_DEBUG); + } +} + static void gen_smul_dual(DisasContext *s, TCGv_i32 a, TCGv_i32 b) { TCGContext *tcg_ctx = s->uc->tcg_ctx; @@ -12222,24 +12235,15 @@ tb_end: gen_set_pc_im(dc, dc->pc); /* fall through */ default: - if (dc->ss_active) { - gen_step_complete_exception(dc); - } else { - /* FIXME: Single stepping a WFI insn will not halt - the CPU. */ - gen_exception_internal(dc, EXCP_DEBUG); - } + /* FIXME: Single stepping a WFI insn will not halt the CPU. */ + gen_singlestep_exception(dc); } if (dc->condjmp) { /* "Condition failed" instruction codepath. */ gen_set_label(tcg_ctx, dc->condlabel); gen_set_condexec(dc); gen_set_pc_im(dc, dc->pc); - if (dc->ss_active) { - gen_step_complete_exception(dc); - } else { - gen_exception_internal(dc, EXCP_DEBUG); - } + gen_singlestep_exception(dc); } } else { /* While branches must always occur at the end of an IT block,