diff mbox series

[v2,01/15] target/m68k: Raise the TRAPn exception with the correct pc

Message ID 20211202204900.50973-2-richard.henderson@linaro.org
State New
Headers show
Series target/m68k: Conditional traps + trap cleanup | expand

Commit Message

Richard Henderson Dec. 2, 2021, 8:48 p.m. UTC
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(-)

Comments

Laurent Vivier Dec. 3, 2021, 9:04 a.m. UTC | #1
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 mbox series

Patch

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)