On Thu, Jun 26, 2025 at 09:57:13PM +0200, Benjamin Berg wrote: > From: Benjamin Berg <benjamin.b...@intel.com> > > In preparation to add tests that use it.
I tried to implement signal support in nolibc before but ran into some issues. Unfortunately I don't remember the details. But I guess you know more about signals than me, so let's try it again. In any case this should add some tests to tools/testing/selftests/nolibc/nolibc-test.c. If you test it with qemu-user please be aware that there were issues around SA_RESTORER up until recently [0] [1]. [1] https://lore.kernel.org/qemu-devel/20250202-riscv-sa-restorer-v1-1-6f4bf814a...@t-8ch.de/ [0] https://lore.kernel.org/qemu-devel/mvmed060xc9....@suse.de/ > > Signed-off-by: Benjamin Berg <benjamin.b...@intel.com> > --- > tools/include/nolibc/nolibc.h | 3 +++ > tools/include/nolibc/signal.h | 34 ++++++++++++++++++++++++++++++++++ > 2 files changed, 37 insertions(+) > > diff --git a/tools/include/nolibc/nolibc.h b/tools/include/nolibc/nolibc.h > index c199ade200c2..29e37a755aba 100644 > --- a/tools/include/nolibc/nolibc.h > +++ b/tools/include/nolibc/nolibc.h > @@ -92,6 +92,9 @@ > #ifndef _NOLIBC_H > #define _NOLIBC_H > > +/* So that we do not get compatibility types/defines */ > +#define __KERNEL__ Could you explain this more? The user may have included kernel UAPI headers already before including nolibc, so it doesn't really work. > + > #include "std.h" > #include "arch.h" > #include "types.h" > diff --git a/tools/include/nolibc/signal.h b/tools/include/nolibc/signal.h > index ac13e53ac31d..fa52119e577f 100644 > --- a/tools/include/nolibc/signal.h > +++ b/tools/include/nolibc/signal.h > @@ -14,6 +14,7 @@ > #include "arch.h" > #include "types.h" > #include "sys.h" > +#include <linux/signal.h> > > /* This one is not marked static as it's needed by libgcc for divide by zero > */ > int raise(int signal); > @@ -23,4 +24,37 @@ int raise(int signal) > return sys_kill(sys_getpid(), signal); > } > > +/* > + * sigaction(int signum, const struct sigaction *act, struct sigaction > *oldact) > + */ > + > +#ifdef SA_RESTORER > +__attribute__((naked)) __attribute__((naked)) is not supported everywhere. > +static void my_sa_restorer(void) This should use a name with less potential to conflict with user code. Like __nolibc_sa_restorer(). > +{ > + my_syscall0(__NR_rt_sigreturn); > +} > +#endif > + > +static __attribute__((unused)) > +int sys_sigaction(int signum, const struct sigaction *act, struct sigaction > *oldact) > +{ > + struct sigaction real_act = *act; > +#ifdef SA_RESTORER > + if (!(real_act.sa_flags & SA_RESTORER)) { > + real_act.sa_flags |= SA_RESTORER; > + real_act.sa_restorer = my_sa_restorer; > + } > +#endif > + > + return my_syscall4(__NR_rt_sigaction, signum, &real_act, oldact, > + sizeof(act->sa_mask)); No need for the linebreak. > +} > + > +static __attribute__((unused)) > +int sigaction(int signum, const struct sigaction *act, struct sigaction > *oldact) > +{ > + return __sysret(sys_sigaction(signum, act, oldact)); > +} > + > #endif /* _NOLIBC_SIGNAL_H */ > -- > 2.50.0 >