aboutsummaryrefslogtreecommitdiff
path: root/target/m68k
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2022-06-01 18:33:46 -0700
committerLaurent Vivier <laurent@vivier.eu>2022-06-02 09:35:02 +0200
commit02ea42b36ddcd34739c9320ae2262b1d1e814a6d (patch)
treefc8ff10ce7a517f1bd79643c1cf40406f3f2f69b /target/m68k
parent79e1d527e13d35b976c947c48a70c23ef3586e76 (diff)
downloadqemu-02ea42b36ddcd34739c9320ae2262b1d1e814a6d.zip
qemu-02ea42b36ddcd34739c9320ae2262b1d1e814a6d.tar.gz
qemu-02ea42b36ddcd34739c9320ae2262b1d1e814a6d.tar.bz2
target/m68k: Switch over exception type in m68k_interrupt_all
Replace an if ladder with a switch for clarity. Reviewed-by: Laurent Vivier <laurent@vivier.eu> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220602013401.303699-3-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Diffstat (limited to 'target/m68k')
-rw-r--r--target/m68k/op_helper.c49
1 files changed, 30 insertions, 19 deletions
diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
index d30f988..2b94a6e 100644
--- a/target/m68k/op_helper.c
+++ b/target/m68k/op_helper.c
@@ -333,7 +333,8 @@ static void m68k_interrupt_all(CPUM68KState *env, int is_hw)
sp &= ~1;
}
- if (cs->exception_index == EXCP_ACCESS) {
+ switch (cs->exception_index) {
+ case EXCP_ACCESS:
if (env->mmu.fault) {
cpu_abort(cs, "DOUBLE MMU FAULT\n");
}
@@ -391,29 +392,39 @@ static void m68k_interrupt_all(CPUM68KState *env, int is_hw)
"ssw: %08x ea: %08x sfc: %d dfc: %d\n",
env->mmu.ssw, env->mmu.ar, env->sfc, env->dfc);
}
- } else if (cs->exception_index == EXCP_ADDRESS) {
+ break;
+
+ case EXCP_ADDRESS:
do_stack_frame(env, &sp, 2, oldsr, 0, retaddr);
- } else if (cs->exception_index == EXCP_ILLEGAL ||
- cs->exception_index == EXCP_DIV0 ||
- cs->exception_index == EXCP_CHK ||
- cs->exception_index == EXCP_TRAPCC ||
- cs->exception_index == EXCP_TRACE) {
+ break;
+
+ case EXCP_ILLEGAL:
+ case EXCP_DIV0:
+ case EXCP_CHK:
+ case EXCP_TRAPCC:
+ case EXCP_TRACE:
/* FIXME: addr is not only env->pc */
do_stack_frame(env, &sp, 2, oldsr, env->pc, retaddr);
- } else if (is_hw && oldsr & SR_M &&
- cs->exception_index >= EXCP_SPURIOUS &&
- cs->exception_index <= EXCP_INT_LEVEL_7) {
- do_stack_frame(env, &sp, 0, oldsr, 0, retaddr);
- oldsr = sr;
- env->aregs[7] = sp;
- cpu_m68k_set_sr(env, sr &= ~SR_M);
- sp = env->aregs[7];
- if (!m68k_feature(env, M68K_FEATURE_UNALIGNED_DATA)) {
- sp &= ~1;
+ break;
+
+ case EXCP_SPURIOUS ... EXCP_INT_LEVEL_7:
+ if (is_hw && oldsr & SR_M) {
+ do_stack_frame(env, &sp, 0, oldsr, 0, retaddr);
+ oldsr = sr;
+ env->aregs[7] = sp;
+ cpu_m68k_set_sr(env, sr &= ~SR_M);
+ sp = env->aregs[7];
+ if (!m68k_feature(env, M68K_FEATURE_UNALIGNED_DATA)) {
+ sp &= ~1;
+ }
+ do_stack_frame(env, &sp, 1, oldsr, 0, retaddr);
+ break;
}
- do_stack_frame(env, &sp, 1, oldsr, 0, retaddr);
- } else {
+ /* fall through */
+
+ default:
do_stack_frame(env, &sp, 0, oldsr, 0, retaddr);
+ break;
}
env->aregs[7] = sp;