[PATCH 07/30] bsd-user/arm/target_arch_cpu.h: Use force_sig_fault for EXCP_UDEF

Warner Losh posted 30 patches 4 years ago
There is a newer version of this series
[PATCH 07/30] bsd-user/arm/target_arch_cpu.h: Use force_sig_fault for EXCP_UDEF
Posted by Warner Losh 4 years ago
Use force_sig_fault to implement unknown opcode. This just uninlines
that function, so simplify things by using it. Fold in EXCP_NOCP and
EXCP_INVSTATE, as is done in linux-user.

Signed-off-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/arm/target_arch_cpu.h | 18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/bsd-user/arm/target_arch_cpu.h b/bsd-user/arm/target_arch_cpu.h
index 905f13aa1b9..996a361e3fe 100644
--- a/bsd-user/arm/target_arch_cpu.h
+++ b/bsd-user/arm/target_arch_cpu.h
@@ -51,18 +51,12 @@ static inline void target_cpu_loop(CPUARMState *env)
         process_queued_cpu_work(cs);
         switch (trapnr) {
         case EXCP_UDEF:
-            {
-                /* See arm/arm/undefined.c undefinedinstruction(); */
-                info.si_addr = env->regs[15];
-
-                /* illegal instruction */
-                info.si_signo = TARGET_SIGILL;
-                info.si_errno = 0;
-                info.si_code = TARGET_ILL_ILLOPC;
-                queue_signal(env, info.si_signo, &info);
-
-                /* TODO: What about instruction emulation? */
-            }
+        case EXCP_NOCP:
+        case EXCP_INVSTATE:
+            /*
+             * See arm/arm/undefined.c undefinedinstruction();
+             */
+            force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPC, env->regs[15]);
             break;
         case EXCP_SWI:
             {
-- 
2.33.1


Re: [PATCH 07/30] bsd-user/arm/target_arch_cpu.h: Use force_sig_fault for EXCP_UDEF
Posted by Peter Maydell 4 years ago
On Sun, 9 Jan 2022 at 16:27, Warner Losh <imp@bsdimp.com> wrote:
>
> Use force_sig_fault to implement unknown opcode. This just uninlines
> that function, so simplify things by using it. Fold in EXCP_NOCP and
> EXCP_INVSTATE, as is done in linux-user.
>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> ---
>  bsd-user/arm/target_arch_cpu.h | 18 ++++++------------
>  1 file changed, 6 insertions(+), 12 deletions(-)
>
> diff --git a/bsd-user/arm/target_arch_cpu.h b/bsd-user/arm/target_arch_cpu.h
> index 905f13aa1b9..996a361e3fe 100644
> --- a/bsd-user/arm/target_arch_cpu.h
> +++ b/bsd-user/arm/target_arch_cpu.h
> @@ -51,18 +51,12 @@ static inline void target_cpu_loop(CPUARMState *env)
>          process_queued_cpu_work(cs);
>          switch (trapnr) {
>          case EXCP_UDEF:
> -            {
> -                /* See arm/arm/undefined.c undefinedinstruction(); */
> -                info.si_addr = env->regs[15];
> -
> -                /* illegal instruction */
> -                info.si_signo = TARGET_SIGILL;
> -                info.si_errno = 0;
> -                info.si_code = TARGET_ILL_ILLOPC;
> -                queue_signal(env, info.si_signo, &info);
> -
> -                /* TODO: What about instruction emulation? */
> -            }
> +        case EXCP_NOCP:
> +        case EXCP_INVSTATE:
> +            /*
> +             * See arm/arm/undefined.c undefinedinstruction();
> +             */
> +            force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPC, env->regs[15]);
>              break;

Do you want to keep the TODO comment ?

Either way,
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

(Looks like FreeBSD sends SIGILL/ILL_ILLADR for UNDEF where the PC
is misaligned and we're not in Thumb mode, but that's a pretty oddball
corner case so not really worth emulating.)

thanks
-- PMM

Re: [PATCH 07/30] bsd-user/arm/target_arch_cpu.h: Use force_sig_fault for EXCP_UDEF
Posted by Richard Henderson 4 years ago
On 1/14/22 4:19 AM, Peter Maydell wrote:
> On Sun, 9 Jan 2022 at 16:27, Warner Losh <imp@bsdimp.com> wrote:
>>
>> Use force_sig_fault to implement unknown opcode. This just uninlines
>> that function, so simplify things by using it. Fold in EXCP_NOCP and
>> EXCP_INVSTATE, as is done in linux-user.
>>
>> Signed-off-by: Warner Losh <imp@bsdimp.com>
>> ---
>>   bsd-user/arm/target_arch_cpu.h | 18 ++++++------------
>>   1 file changed, 6 insertions(+), 12 deletions(-)
>>
>> diff --git a/bsd-user/arm/target_arch_cpu.h b/bsd-user/arm/target_arch_cpu.h
>> index 905f13aa1b9..996a361e3fe 100644
>> --- a/bsd-user/arm/target_arch_cpu.h
>> +++ b/bsd-user/arm/target_arch_cpu.h
>> @@ -51,18 +51,12 @@ static inline void target_cpu_loop(CPUARMState *env)
>>           process_queued_cpu_work(cs);
>>           switch (trapnr) {
>>           case EXCP_UDEF:
>> -            {
>> -                /* See arm/arm/undefined.c undefinedinstruction(); */
>> -                info.si_addr = env->regs[15];
>> -
>> -                /* illegal instruction */
>> -                info.si_signo = TARGET_SIGILL;
>> -                info.si_errno = 0;
>> -                info.si_code = TARGET_ILL_ILLOPC;
>> -                queue_signal(env, info.si_signo, &info);
>> -
>> -                /* TODO: What about instruction emulation? */
>> -            }
>> +        case EXCP_NOCP:
>> +        case EXCP_INVSTATE:
>> +            /*
>> +             * See arm/arm/undefined.c undefinedinstruction();
>> +             */
>> +            force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPC, env->regs[15]);
>>               break;
> 
> Do you want to keep the TODO comment ?
> 
> Either way,
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> 
> (Looks like FreeBSD sends SIGILL/ILL_ILLADR for UNDEF where the PC
> is misaligned and we're not in Thumb mode, but that's a pretty oddball
> corner case so not really worth emulating.)

For qemu, that case will never happen: we'll raise EXCP_PREFETCH_ABORT with fsr=1 
(Alignment).  The freebsd kernel might have this code because the behaviour with real hw 
is CONSTRAINED UNPREDICTABLE (iirc).

Anyway,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~