[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