qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 32/41] linux-user/openrisc: Adjust signal for EXCP_RANGE,


From: Stafford Horne
Subject: Re: [PATCH v4 32/41] linux-user/openrisc: Adjust signal for EXCP_RANGE, EXCP_FPE
Date: Thu, 7 Oct 2021 05:52:21 +0900

On Wed, Oct 06, 2021 at 10:22:58AM -0700, Richard Henderson wrote:
> The kernel vectors both of these through unhandled_exception, which
> results in force_sig(SIGSEGV).  This isn't very useful for userland
> when enabling overflow traps or fpu traps, but c'est la vie.

Thanks for looking into it.  I am happy to accept kernel patches ;), otherwise
these are now on my todo list.  The FPU support is already something I am
looking to take care of as mentioned before, but that is after I finish getting
the glibc port upstreamed.

That said,

Reviewed-by: Stafford Horne <shorne@gmail.com>

> Cc: Stafford Horne <shorne@gmail.com>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/openrisc/cpu_loop.c | 13 +++++--------
>  1 file changed, 5 insertions(+), 8 deletions(-)
> 
> diff --git a/linux-user/openrisc/cpu_loop.c b/linux-user/openrisc/cpu_loop.c
> index f6360db47c..de5417a262 100644
> --- a/linux-user/openrisc/cpu_loop.c
> +++ b/linux-user/openrisc/cpu_loop.c
> @@ -56,13 +56,17 @@ void cpu_loop(CPUOpenRISCState *env)
>              break;
>          case EXCP_DPF:
>          case EXCP_IPF:
> -        case EXCP_RANGE:
>              info.si_signo = TARGET_SIGSEGV;
>              info.si_errno = 0;
>              info.si_code = TARGET_SEGV_MAPERR;
>              info._sifields._sigfault._addr = env->pc;
>              queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
>              break;
> +        case EXCP_RANGE:
> +        case EXCP_FPE:
> +            /* ??? The kernel vectors both of these to unhandled_exception. 
> */
> +            force_sig(TARGET_SIGSEGV);
> +            break;
>          case EXCP_ALIGN:
>              info.si_signo = TARGET_SIGBUS;
>              info.si_errno = 0;
> @@ -77,13 +81,6 @@ void cpu_loop(CPUOpenRISCState *env)
>              info._sifields._sigfault._addr = env->pc;
>              queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
>              break;
> -        case EXCP_FPE:
> -            info.si_signo = TARGET_SIGFPE;
> -            info.si_errno = 0;
> -            info.si_code = 0;
> -            info._sifields._sigfault._addr = env->pc;
> -            queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> -            break;
>          case EXCP_INTERRUPT:
>              /* We processed the pending cpu work above.  */
>              break;
> -- 
> 2.25.1
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]