All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: Richard Henderson <richard.henderson@linaro.org>, qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
	"Alex Bennée" <alex.bennee@linaro.org>
Subject: Re: [PATCH v2 2/7] linux-user/nios2: Fixes for signal frame setup
Date: Wed, 5 Jan 2022 11:23:49 +0100	[thread overview]
Message-ID: <df922ec0-f469-b716-fec8-fb40421cb026@vivier.eu> (raw)
In-Reply-To: <20211221025012.1057923-3-richard.henderson@linaro.org>

Le 21/12/2021 à 03:50, Richard Henderson a écrit :
> Do not confuse host and guest addresses.  Lock and unlock
> the target_rt_sigframe structure in setup_rt_sigframe.
> 
> Since rt_setup_ucontext always returns 0, drop the return
> value entirely.  This eliminates the only write to the err
> variable in setup_rt_sigframe.
> 
> Always copy the siginfo structure.
> 
> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   linux-user/nios2/signal.c | 49 ++++++++++++++++-----------------------
>   1 file changed, 20 insertions(+), 29 deletions(-)
> 
> diff --git a/linux-user/nios2/signal.c b/linux-user/nios2/signal.c
> index a77e8a40f4..adbffe32e3 100644
> --- a/linux-user/nios2/signal.c
> +++ b/linux-user/nios2/signal.c
> @@ -42,7 +42,7 @@ struct target_rt_sigframe {
>       struct target_ucontext uc;
>   };
>   
> -static int rt_setup_ucontext(struct target_ucontext *uc, CPUNios2State *env)
> +static void rt_setup_ucontext(struct target_ucontext *uc, CPUNios2State *env)
>   {
>       unsigned long *gregs = uc->tuc_mcontext.gregs;
>   
> @@ -75,8 +75,6 @@ static int rt_setup_ucontext(struct target_ucontext *uc, CPUNios2State *env)
>       __put_user(env->regs[R_GP], &gregs[25]);
>       __put_user(env->regs[R_EA], &gregs[27]);
>       __put_user(env->regs[R_SP], &gregs[28]);
> -
> -    return 0;
>   }
>   
>   static int rt_restore_ucontext(CPUNios2State *env, struct target_ucontext *uc,
> @@ -135,8 +133,8 @@ static int rt_restore_ucontext(CPUNios2State *env, struct target_ucontext *uc,
>       return 0;
>   }
>   
> -static void *get_sigframe(struct target_sigaction *ka, CPUNios2State *env,
> -                          size_t frame_size)
> +static abi_ptr get_sigframe(struct target_sigaction *ka, CPUNios2State *env,
> +                            size_t frame_size)
>   {
>       unsigned long usp;
>   
> @@ -144,7 +142,7 @@ static void *get_sigframe(struct target_sigaction *ka, CPUNios2State *env,
>       usp = target_sigsp(get_sp_from_cpustate(env), ka);
>   
>       /* Verify, is it 32 or 64 bit aligned */
> -    return (void *)((usp - frame_size) & -8UL);
> +    return (usp - frame_size) & -8;
>   }
>   
>   void setup_rt_frame(int sig, struct target_sigaction *ka,
> @@ -153,26 +151,25 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
>                       CPUNios2State *env)
>   {
>       struct target_rt_sigframe *frame;
> -    int i, err = 0;
> +    abi_ptr frame_addr;
> +    int i;
>   
> -    frame = get_sigframe(ka, env, sizeof(*frame));
> -
> -    if (ka->sa_flags & SA_SIGINFO) {
> -        tswap_siginfo(&frame->info, info);
> +    frame_addr = get_sigframe(ka, env, sizeof(*frame));
> +    if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
> +        force_sigsegv(sig);
> +        return;
>       }
>   
> +    tswap_siginfo(&frame->info, info);
> +
>       /* Create the ucontext.  */
>       __put_user(0, &frame->uc.tuc_flags);
>       __put_user(0, &frame->uc.tuc_link);
>       target_save_altstack(&frame->uc.tuc_stack, env);
> -    err |= rt_setup_ucontext(&frame->uc, env);
> +    rt_setup_ucontext(&frame->uc, env);
>       for (i = 0; i < TARGET_NSIG_WORDS; i++) {
>           __put_user((abi_ulong)set->sig[i],
> -            (abi_ulong *)&frame->uc.tuc_sigmask.sig[i]);
> -    }
> -
> -    if (err) {
> -        goto give_sigsegv;
> +                   (abi_ulong *)&frame->uc.tuc_sigmask.sig[i]);
>       }
>   
>       /* Set up to return from userspace; jump to fixed address sigreturn
> @@ -180,19 +177,13 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
>       env->regs[R_RA] = (unsigned long) (0x1044);
>   
>       /* Set up registers for signal handler */
> -    env->regs[R_SP] = (unsigned long) frame;
> -    env->regs[4] = (unsigned long) sig;
> -    env->regs[5] = (unsigned long) &frame->info;
> -    env->regs[6] = (unsigned long) &frame->uc;
> -    env->regs[R_EA] = (unsigned long) ka->_sa_handler;
> -    return;
> +    env->regs[R_SP] = frame_addr;
> +    env->regs[4] = sig;
> +    env->regs[5] = frame_addr + offsetof(struct target_rt_sigframe, info);
> +    env->regs[6] = frame_addr + offsetof(struct target_rt_sigframe, uc);
> +    env->regs[R_EA] = ka->_sa_handler;
>   
> -give_sigsegv:
> -    if (sig == TARGET_SIGSEGV) {
> -        ka->_sa_handler = TARGET_SIG_DFL;
> -    }
> -    force_sigsegv(sig);
> -    return;
> +    unlock_user_struct(frame, frame_addr, 1);
>   }
>   
>   long do_sigreturn(CPUNios2State *env)


Applied to my linux-user-for-7.0 branch.

Thanks,
Laurent


  reply	other threads:[~2022-01-05 10:33 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-21  2:50 [PATCH v2 0/7] linux-user: nios2 fixes Richard Henderson
2021-12-21  2:50 ` [PATCH v2 1/7] linux-user/nios2: Properly emulate EXCP_TRAP Richard Henderson
2021-12-22 18:52   ` Laurent Vivier
2022-01-05 10:23   ` Laurent Vivier
2021-12-21  2:50 ` [PATCH v2 2/7] linux-user/nios2: Fixes for signal frame setup Richard Henderson
2022-01-05 10:23   ` Laurent Vivier [this message]
2021-12-21  2:50 ` [PATCH v2 3/7] linux-user/elfload: Rename ARM_COMMPAGE to HI_COMMPAGE Richard Henderson
2022-01-05 10:24   ` Laurent Vivier
2021-12-21  2:50 ` [PATCH v2 4/7] linux-user/nios2: Map a real kuser page Richard Henderson
2021-12-22 20:18   ` Laurent Vivier
2022-01-05 10:24   ` Laurent Vivier
2021-12-21  2:50 ` [PATCH v2 5/7] linux-user/nios2: Fix EA vs PC confusion Richard Henderson
2021-12-22 20:20   ` Laurent Vivier
2022-01-05 10:24   ` Laurent Vivier
2021-12-21  2:50 ` [PATCH v2 6/7] linux-user/nios2: Fix sigmask in setup_rt_frame Richard Henderson
2022-01-05 10:24   ` Laurent Vivier
2021-12-21  2:50 ` [PATCH v2 7/7] linux-user/nios2: Use set_sigmask in do_rt_sigreturn Richard Henderson
2022-01-05 10:24   ` Laurent Vivier

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=df922ec0-f469-b716-fec8-fb40421cb026@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=alex.bennee@linaro.org \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /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.