Hi Thomas,

On Fri, 2025-08-01 at 17:09 +0200, Thomas Weißschuh wrote:
> On 2025-07-31 22:12:25+0200, Benjamin Berg wrote:
> > From: Benjamin Berg <[email protected]>
> > 
> > Add support for sigaction() using the rt_sigaction syscall and implement
> > the normal sa_mask helpers.
> > 
> > For the uapi definitions, everything is copied into nolibc. This avoids
> > issues with kernel architecture headers that are not usable with the
> > rt_sigaction syscall.
> > 
> > Signed-off-by: Benjamin Berg <[email protected]>
> > 
> > ---
> > 
> > v3:
> > - put everything into signal.h and the new asm-signal.h
> 
> Hm, did we decide on that? We don't want the per-architecture include
> dance, but static overrides should still be fine I think.
> Keeping the architecture ifdeffery inside the respective arch header.
> And all the generic stuff in a shared header.

I probably just didn't really understand what you meant :-)

You are right, we can have the common definitions in signal.h and just
skip them if the architecture header did already define them.

I think I'll also drop asm-signal.h again, see below.

> > - split out sigset_t tests
> > - actually mark signal_check static
> > - remove unused string.h include
> > - fix SIGUSR2 reset
> > - Use integer for signal_check as the signals are emitted from the
> >   syscall context.
> 
> I don't understand this point, isn't it a signal handler?

My reasoning is, that the signal emission by the kernel happens from
the kill syscall or function return. Both cases implicitly act as a
memory barrier. So in this specific case we do not actually need an
atomic variable.

> > v2:
> > - Use newly added macros to check signal emission order
> > - Add tests for sigset handling
> > - Restore the default handler after signal test
> > - make signal_check variable static
> > 
> > v1:
> > - Update architecture support (adding sh)
> > - Move sparc sys_rt_sigaction logic into its header
> > - Add sig_atomic_t
> > - Use new BITSET_* macros
> > - Move test into syscall suite
> > - Various other small changes
> > ---
> >  tools/include/nolibc/Makefile                |   1 +
> >  tools/include/nolibc/arch-s390.h             |   4 +-
> >  tools/include/nolibc/asm-signal.h            | 237 +++++++++++++++++++
> >  tools/include/nolibc/signal.h                | 179 ++++++++++++++
> >  tools/include/nolibc/sys.h                   |   2 +-
> >  tools/include/nolibc/sys/wait.h              |   1 +
> >  tools/include/nolibc/time.h                  |   2 +-
> >  tools/include/nolibc/types.h                 |   9 +
> >  tools/testing/selftests/nolibc/nolibc-test.c | 134 +++++++++++
> >  9 files changed, 566 insertions(+), 3 deletions(-)
> >  create mode 100644 tools/include/nolibc/asm-signal.h
> 
> (...)
> 
> > diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h
> > index 295e71d34aba..a790e816565b 100644
> > --- a/tools/include/nolibc/sys.h
> > +++ b/tools/include/nolibc/sys.h
> > @@ -14,7 +14,6 @@
> >  
> >  /* system includes */
> >  #include <linux/unistd.h>
> > -#include <linux/signal.h>  /* for SIGCHLD */
> >  #include <linux/termios.h>
> >  #include <linux/mman.h>
> >  #include <linux/fs.h>
> > @@ -28,6 +27,7 @@
> >  #include "errno.h"
> >  #include "stdarg.h"
> >  #include "types.h"
> > +#include "asm-signal.h" /* for SIGCHLD */
> 
> #include "signal.h"

Right, this and asm-signal.h happened because signal.h uses sys_kill()
for raise(), resulting in a circular dependency.

The simplest solution is probably to avoid the circular include by
implementing raise() as:

int raise(int signal);
__attribute__((weak,unused,section(".text.nolibc_raise")))
int raise(int signal)
{
        return my_syscall2(__NR_kill, my_syscall0(__NR_getpid), signal);
}

> >  /* Syscall return helper: takes the syscall value in argument and checks 
> > for an
> > diff --git a/tools/include/nolibc/sys/wait.h 
> > b/tools/include/nolibc/sys/wait.h
> > index 56ddb806da7f..e2aa90cc3cf3 100644
> > --- a/tools/include/nolibc/sys/wait.h
> > +++ b/tools/include/nolibc/sys/wait.h
> > @@ -10,6 +10,7 @@
> >  #ifndef _NOLIBC_SYS_WAIT_H
> >  #define _NOLIBC_SYS_WAIT_H
> >  
> > +#include <asm/siginfo.h>
> 
> #include "signal.h"
> 
> The asm/ usage should be hidden.
> 
> >  #include "../arch.h"
> >  #include "../std.h"
> >  #include "../types.h"
> 
> (...)
> 
> > diff --git a/tools/testing/selftests/nolibc/nolibc-test.c 
> > b/tools/testing/selftests/nolibc/nolibc-test.c
> > index 180f0436127a..75b96eaa4c65 100644
> > --- a/tools/testing/selftests/nolibc/nolibc-test.c
> > +++ b/tools/testing/selftests/nolibc/nolibc-test.c
> > @@ -1269,6 +1269,138 @@ int test_namespace(void)
> >     return ret;
> >  }
> >  
> > +int test_sigset_t(int test_idx)
> > +{
> > +   int llen;
> > +   int ret = 0;
> > +
> > +#ifdef NOLIBC
> > +   if (is_nolibc) {
> 
> This looks unnecessary. The #ifdef should be sufficient.
> 
> > +           sigset_t sigset;
> > +
> 
> (...)
> 
> 
> Looks nice, thanks!

Great, thanks for the reviews!

Benjamin
Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Sean Fennelly, Jeffrey Schneiderman, Tiffany Doon Silva
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

Reply via email to