All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@redhat.com>
To: Richard Henderson <richard.henderson@linaro.org>, qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, riku.voipio@iki.fi, laurent@vivier.eu,
	peter.maydell@linaro.org
Subject: Re: [PATCH 2/3] linux-user/i386: Split out gen_signal
Date: Wed, 15 Jan 2020 08:22:06 +0100	[thread overview]
Message-ID: <fce9afbb-71ea-cf46-f14b-d4a3911fa4b5@redhat.com> (raw)
In-Reply-To: <20200114210921.11216-3-richard.henderson@linaro.org>

On 1/14/20 10:09 PM, Richard Henderson wrote:
> This is a bit tidier than open-coding the 5 lines necessary
> to initialize the target_siginfo_t.  In addition, this zeros
> the remaining bytes of the target_siginfo_t, rather than
> passing in garbage.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   linux-user/i386/cpu_loop.c | 93 ++++++++++++++------------------------
>   1 file changed, 33 insertions(+), 60 deletions(-)
> 
> diff --git a/linux-user/i386/cpu_loop.c b/linux-user/i386/cpu_loop.c
> index 024b6f4d58..e217cca5ee 100644
> --- a/linux-user/i386/cpu_loop.c
> +++ b/linux-user/i386/cpu_loop.c
> @@ -81,13 +81,23 @@ static void set_idt(int n, unsigned int dpl)
>   }
>   #endif
>   
> +static void gen_signal(CPUX86State *env, int sig, int code, abi_ptr addr)
> +{
> +    target_siginfo_t info = {
> +        .si_signo = sig,
> +        .si_code = code,
> +        ._sifields._sigfault._addr = addr
> +    };
> +
> +    queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> +}
> +
>   void cpu_loop(CPUX86State *env)
>   {
>       CPUState *cs = env_cpu(env);
>       int trapnr;
>       abi_ulong pc;
>       abi_ulong ret;
> -    target_siginfo_t info;
>   
>       for(;;) {
>           cpu_exec_start(cs);
> @@ -134,70 +144,45 @@ void cpu_loop(CPUX86State *env)
>   #endif
>           case EXCP0B_NOSEG:
>           case EXCP0C_STACK:
> -            info.si_signo = TARGET_SIGBUS;
> -            info.si_errno = 0;
> -            info.si_code = TARGET_SI_KERNEL;
> -            info._sifields._sigfault._addr = 0;
> -            queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> +            gen_signal(env, TARGET_SIGBUS, TARGET_SI_KERNEL, 0);
>               break;
>           case EXCP0D_GPF:
>               /* XXX: potential problem if ABI32 */
>   #ifndef TARGET_X86_64
>               if (env->eflags & VM_MASK) {
>                   handle_vm86_fault(env);
> -            } else
> -#endif
> -            {
> -                info.si_signo = TARGET_SIGSEGV;
> -                info.si_errno = 0;
> -                info.si_code = TARGET_SI_KERNEL;
> -                info._sifields._sigfault._addr = 0;
> -                queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> +                break;
>               }
> +#endif
> +            gen_signal(env, TARGET_SIGSEGV, TARGET_SI_KERNEL, 0);
>               break;
>           case EXCP0E_PAGE:
> -            info.si_signo = TARGET_SIGSEGV;
> -            info.si_errno = 0;
> -            if (!(env->error_code & 1))
> -                info.si_code = TARGET_SEGV_MAPERR;
> -            else
> -                info.si_code = TARGET_SEGV_ACCERR;
> -            info._sifields._sigfault._addr = env->cr[2];
> -            queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> +            gen_signal(env, TARGET_SIGSEGV,
> +                       (env->error_code & 1 ?
> +                        TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR),
> +                       env->cr[2]);
>               break;
>           case EXCP00_DIVZ:
>   #ifndef TARGET_X86_64
>               if (env->eflags & VM_MASK) {
>                   handle_vm86_trap(env, trapnr);
> -            } else
> -#endif
> -            {
> -                /* division by zero */
> -                info.si_signo = TARGET_SIGFPE;
> -                info.si_errno = 0;
> -                info.si_code = TARGET_FPE_INTDIV;
> -                info._sifields._sigfault._addr = env->eip;
> -                queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> +                break;
>               }
> +#endif
> +            gen_signal(env, TARGET_SIGFPE, TARGET_FPE_INTDIV, env->eip);
>               break;
>           case EXCP01_DB:
>           case EXCP03_INT3:
>   #ifndef TARGET_X86_64
>               if (env->eflags & VM_MASK) {
>                   handle_vm86_trap(env, trapnr);
> -            } else
> +                break;
> +            }
>   #endif
> -            {
> -                info.si_signo = TARGET_SIGTRAP;
> -                info.si_errno = 0;
> -                if (trapnr == EXCP01_DB) {
> -                    info.si_code = TARGET_TRAP_BRKPT;
> -                    info._sifields._sigfault._addr = env->eip;
> -                } else {
> -                    info.si_code = TARGET_SI_KERNEL;
> -                    info._sifields._sigfault._addr = 0;
> -                }
> -                queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> +            if (trapnr == EXCP01_DB) {
> +                gen_signal(env, TARGET_SIGTRAP, TARGET_TRAP_BRKPT, env->eip);
> +            } else {
> +                gen_signal(env, TARGET_SIGTRAP, TARGET_SI_KERNEL, 0);
>               }
>               break;
>           case EXCP04_INTO:
> @@ -205,31 +190,19 @@ void cpu_loop(CPUX86State *env)
>   #ifndef TARGET_X86_64
>               if (env->eflags & VM_MASK) {
>                   handle_vm86_trap(env, trapnr);
> -            } else
> -#endif
> -            {
> -                info.si_signo = TARGET_SIGSEGV;
> -                info.si_errno = 0;
> -                info.si_code = TARGET_SI_KERNEL;
> -                info._sifields._sigfault._addr = 0;
> -                queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> +                break;
>               }
> +#endif
> +            gen_signal(env, TARGET_SIGSEGV, TARGET_SI_KERNEL, 0);
>               break;
>           case EXCP06_ILLOP:
> -            info.si_signo = TARGET_SIGILL;
> -            info.si_errno = 0;
> -            info.si_code = TARGET_ILL_ILLOPN;
> -            info._sifields._sigfault._addr = env->eip;
> -            queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> +            gen_signal(env, TARGET_SIGILL, TARGET_ILL_ILLOPN, env->eip);
>               break;
>           case EXCP_INTERRUPT:
>               /* just indicate that signals should be handled asap */
>               break;
>           case EXCP_DEBUG:
> -            info.si_signo = TARGET_SIGTRAP;
> -            info.si_errno = 0;
> -            info.si_code = TARGET_TRAP_BRKPT;
> -            queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
> +            gen_signal(env, TARGET_SIGTRAP, TARGET_TRAP_BRKPT, 0);
>               break;
>           case EXCP_ATOMIC:
>               cpu_exec_step_atomic(cs);
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



  reply	other threads:[~2020-01-15  7:23 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-14 21:09 [PATCH 0/3] linux-user: Implement x86_64 vsyscalls Richard Henderson
2020-01-14 21:09 ` [PATCH 1/3] target/i386: Renumber EXCP_SYSCALL Richard Henderson
2020-01-15  7:22   ` Philippe Mathieu-Daudé
2020-01-15  9:55   ` Alex Bennée
2020-01-14 21:09 ` [PATCH 2/3] linux-user/i386: Split out gen_signal Richard Henderson
2020-01-15  7:22   ` Philippe Mathieu-Daudé [this message]
2020-01-15  9:58   ` Alex Bennée
2020-01-14 21:09 ` [PATCH 3/3] linux-user/i386: Emulate x86_64 vsyscalls Richard Henderson
2020-01-16 10:51   ` Alex Bennée
2020-01-16 16:26   ` Alex Bennée
2020-01-16 18:19     ` Richard Henderson
2020-01-16 18:22       ` Richard Henderson
2020-01-16 20:15       ` Alex Bennée
2020-01-14 23:35 ` [PATCH 0/3] linux-user: Implement " Paolo Bonzini
2020-01-15  7:01 ` Laurent Desnogues
2020-01-15 10:14 ` Laurent Vivier
2020-01-15 17:28   ` Richard Henderson
2020-01-16 14:05 ` Alex Bennée
2020-01-16 19:37   ` Richard Henderson
2020-01-16 14:30 ` Alex Bennée
2020-01-16 18:31   ` Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=fce9afbb-71ea-cf46-f14b-d4a3911fa4b5@redhat.com \
    --to=philmd@redhat.com \
    --cc=laurent@vivier.eu \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=riku.voipio@iki.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.