[RFC 1/2] tools/nolibc: add sigaction()

Benjamin Berg benjamin at sipsolutions.net
Thu Jun 26 12:57:13 PDT 2025


From: Benjamin Berg <benjamin.berg at intel.com>

In preparation to add tests that use it.

Signed-off-by: Benjamin Berg <benjamin.berg at 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__
+
 #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))
+static void my_sa_restorer(void)
+{
+	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));
+}
+
+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




More information about the linux-um mailing list