Message ID | 20211202204900.50973-2-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target/m68k: Conditional traps + trap cleanup | expand |
Le 02/12/2021 à 21:48, Richard Henderson a écrit : > Rather than adjust the PC in all of the consumers, raise > the exception with the correct PC in the first place. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/m68k/cpu_loop.c | 1 - > target/m68k/op_helper.c | 9 --------- > target/m68k/translate.c | 2 +- > 3 files changed, 1 insertion(+), 11 deletions(-) > > diff --git a/linux-user/m68k/cpu_loop.c b/linux-user/m68k/cpu_loop.c > index 790bd558c3..287f24cc60 100644 > --- a/linux-user/m68k/cpu_loop.c > +++ b/linux-user/m68k/cpu_loop.c > @@ -70,7 +70,6 @@ void cpu_loop(CPUM68KState *env) > { > abi_long ret; > n = env->dregs[0]; > - env->pc += 2; > ret = do_syscall(env, > n, > env->dregs[1], > diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c > index cfbc987ba6..36662de149 100644 > --- a/target/m68k/op_helper.c > +++ b/target/m68k/op_helper.c > @@ -216,11 +216,6 @@ static void cf_interrupt_all(CPUM68KState *env, int is_hw) > cpu_loop_exit(cs); > return; > } > - if (cs->exception_index >= EXCP_TRAP0 > - && cs->exception_index <= EXCP_TRAP15) { > - /* Move the PC after the trap instruction. */ > - retaddr += 2; > - } > } > > vector = cs->exception_index << 2; > @@ -303,10 +298,6 @@ static void m68k_interrupt_all(CPUM68KState *env, int is_hw) > /* Return from an exception. */ > m68k_rte(env); > return; > - case EXCP_TRAP0 ... EXCP_TRAP15: > - /* Move the PC after the trap instruction. */ > - retaddr += 2; > - break; > } > } > > diff --git a/target/m68k/translate.c b/target/m68k/translate.c > index af43c8eab8..af3febdd48 100644 > --- a/target/m68k/translate.c > +++ b/target/m68k/translate.c > @@ -4860,7 +4860,7 @@ DISAS_INSN(wdebug) > > DISAS_INSN(trap) > { > - gen_exception(s, s->base.pc_next, EXCP_TRAP0 + (insn & 0xf)); > + gen_exception(s, s->pc, EXCP_TRAP0 + (insn & 0xf)); > } > > static void gen_load_fcr(DisasContext *s, TCGv res, int reg) > Reviewed-by: Laurent Vivier <laurent@vivier.eu>
diff --git a/linux-user/m68k/cpu_loop.c b/linux-user/m68k/cpu_loop.c index 790bd558c3..287f24cc60 100644 --- a/linux-user/m68k/cpu_loop.c +++ b/linux-user/m68k/cpu_loop.c @@ -70,7 +70,6 @@ void cpu_loop(CPUM68KState *env) { abi_long ret; n = env->dregs[0]; - env->pc += 2; ret = do_syscall(env, n, env->dregs[1], diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c index cfbc987ba6..36662de149 100644 --- a/target/m68k/op_helper.c +++ b/target/m68k/op_helper.c @@ -216,11 +216,6 @@ static void cf_interrupt_all(CPUM68KState *env, int is_hw) cpu_loop_exit(cs); return; } - if (cs->exception_index >= EXCP_TRAP0 - && cs->exception_index <= EXCP_TRAP15) { - /* Move the PC after the trap instruction. */ - retaddr += 2; - } } vector = cs->exception_index << 2; @@ -303,10 +298,6 @@ static void m68k_interrupt_all(CPUM68KState *env, int is_hw) /* Return from an exception. */ m68k_rte(env); return; - case EXCP_TRAP0 ... EXCP_TRAP15: - /* Move the PC after the trap instruction. */ - retaddr += 2; - break; } } diff --git a/target/m68k/translate.c b/target/m68k/translate.c index af43c8eab8..af3febdd48 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -4860,7 +4860,7 @@ DISAS_INSN(wdebug) DISAS_INSN(trap) { - gen_exception(s, s->base.pc_next, EXCP_TRAP0 + (insn & 0xf)); + gen_exception(s, s->pc, EXCP_TRAP0 + (insn & 0xf)); } static void gen_load_fcr(DisasContext *s, TCGv res, int reg)
Rather than adjust the PC in all of the consumers, raise the exception with the correct PC in the first place. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/m68k/cpu_loop.c | 1 - target/m68k/op_helper.c | 9 --------- target/m68k/translate.c | 2 +- 3 files changed, 1 insertion(+), 11 deletions(-)