Note: Please also Cc the patches to LKML in the future.
On 2025-08-02 10:26:34+0000, Berg, Benjamin wrote:
> 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.
Sounds good to me.
> 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.
Ok. Given that the code is doing a read-modify-write, the guarantees of
sig_atomic_t are probably not enough anyways.
What about volatile?
> > > 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);
> }
Also sounds good. Or add local declarations sys_kill() and sys_getpid().
(...)