From: Benjamin Berg <benjamin.b...@intel.com> In preparation to add tests that use it.
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__ + #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