All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Richard Henderson <richard.henderson@linaro.org>
Cc: qemu-devel@nongnu.org, 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 09:58:35 +0000	[thread overview]
Message-ID: <8736chm46s.fsf@linaro.org> (raw)
In-Reply-To: <20200114210921.11216-3-richard.henderson@linaro.org>


Richard Henderson <richard.henderson@linaro.org> writes:

> 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>

Reviewed-by: Alex Bennée <alex.bennee@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);


-- 
Alex Bennée


  parent reply	other threads:[~2020-01-15  9:59 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é
2020-01-15  9:58   ` Alex Bennée [this message]
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=8736chm46s.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --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.