qemu-stable
[Top][All Lists]
Advanced

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

Re: [PATCH] linux-user: xtensa: fix signal delivery in FDPIC


From: Max Filippov
Subject: Re: [PATCH] linux-user: xtensa: fix signal delivery in FDPIC
Date: Sun, 12 Nov 2023 09:02:21 -0800

On Sun, Nov 12, 2023 at 8:51 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> On 11/11/23 03:22, Max Filippov wrote:
> > In FDPIC signal handlers are passed around as FD pointers. Actual code
> > address and GOT pointer must be fetched from memory by the QEMU code
> > that implements kernel signal delivery functionality. This change is
> > equivalent to the following kernel change:
> > 9c2cc74fb31e ("xtensa: fix signal delivery to FDPIC process")
> >
> > Cc: qemu-stable@nongnu.org
> > Fixes: d2796be69d7c ("linux-user: add support for xtensa FDPIC")
> > Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
> > ---
> >   linux-user/xtensa/signal.c | 28 ++++++++++++++++++++++++++--
> >   1 file changed, 26 insertions(+), 2 deletions(-)
> >
> > diff --git a/linux-user/xtensa/signal.c b/linux-user/xtensa/signal.c
> > index f5fb8b5cbebe..32dcfa522919 100644
> > --- a/linux-user/xtensa/signal.c
> > +++ b/linux-user/xtensa/signal.c
> > @@ -157,6 +157,9 @@ void setup_rt_frame(int sig, struct target_sigaction 
> > *ka,
> >   {
> >       abi_ulong frame_addr;
> >       struct target_rt_sigframe *frame;
> > +    int is_fdpic = info_is_fdpic(((TaskState *)thread_cpu->opaque)->info);
> > +    abi_ulong handler = 0;
> > +    abi_ulong handler_fdpic_GOT = 0;
> >       uint32_t ra;
> >       bool abi_call0;
> >       unsigned base;
> > @@ -165,6 +168,17 @@ void setup_rt_frame(int sig, struct target_sigaction 
> > *ka,
> >       frame_addr = get_sigframe(ka, env, sizeof(*frame));
> >       trace_user_setup_rt_frame(env, frame_addr);
> >
> > +    if (is_fdpic) {
> > +        abi_ulong funcdesc_ptr = ka->_sa_handler;
> > +
> > +        if (get_user_ual(handler, funcdesc_ptr)
> > +            || get_user_ual(handler_fdpic_GOT, funcdesc_ptr + 4)) {
> > +            goto give_sigsegv;
> > +        }
> > +    } else {
> > +        handler = ka->_sa_handler;
> > +    }
>
> This part is ok, with the last hunk, because it's taking care of the fd for 
> the handler.
>
> > @@ -185,14 +199,21 @@ void setup_rt_frame(int sig, struct target_sigaction 
> > *ka,
> >       }
> >
> >       if (ka->sa_flags & TARGET_SA_RESTORER) {
> > -        ra = ka->sa_restorer;
> > +        if (is_fdpic) {
> > +            if (get_user_ual(ra, ka->sa_restorer)) {
> > +                unlock_user_struct(frame, frame_addr, 0);
> > +                goto give_sigsegv;
> > +            }
> > +        } else {
> > +            ra = ka->sa_restorer;
> > +        }
>
> This part is questionable.  It does match the kernel, so as far as that goes,
>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>
> However, it does not handle the GOT register for the restorer, like we do on 
> ARM.  That
> said, I can't find any libc sources for xtensa, or at least that aren't out 
> of date by a

It's WIP, available at https://github.com/jcmvbkbc/uclibc-ng-xtensa
branch xtensa-1.0.44-fdpic

> decade, so I can't tell if libc *knows* the got register won't be loaded, and 
> it doesn't
> matter because it only uses the sigreturn syscall.

That's the case. AFAU the restorer field is not for public use and the function
used as a restorer by the uclibc does not care about the GOT pointer.

-- 
Thanks.
-- Max



reply via email to

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