From dda3ee47155f14182478a55fc01d0633b259a9e3 Mon Sep 17 00:00:00 2001 From: GNU Libc Maintainers Date: Sun, 16 Dec 2018 17:25:59 +0000 Subject: [PATCH] submitted-sigaction-sa-restorer 2018-12-12 Adhemerval Zanella [BZ #23960] * sysdeps/unix/sysv/linux/kernel_sigaction.h (HAS_SA_RESTORER): Define if SA_RESTORER is defined. (kernel_sigaction): Define sa_restorer if HAS_SA_RESTORER is defined. (SET_SA_RESTORER, RESET_SA_RESTORER): Define iff the macro are not already defined. * sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h (SA_RESTORER, kernel_sigaction, SET_SA_RESTORER, RESET_SA_RESTORER): Remove definitions. (HAS_SA_RESTORER): Define. * sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h (SA_RESTORER, SET_SA_RESTORER, RESET_SA_RESTORER): Remove definition. (HAS_SA_RESTORER): Define. * sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h: Include generic kernel_sigaction after define SET_SA_RESTORER and RESET_SA_RESTORER. * sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise. Gbp-Pq: Topic any Gbp-Pq: Name submitted-sigaction-sa-restorer.diff --- sysdeps/unix/sysv/linux/kernel_sigaction.h | 12 +++++++-- .../unix/sysv/linux/m68k/kernel_sigaction.h | 26 +++---------------- .../unix/sysv/linux/nios2/kernel_sigaction.h | 3 ++- .../sysv/linux/powerpc/kernel_sigaction.h | 3 ++- .../unix/sysv/linux/s390/kernel_sigaction.h | 2 ++ sysdeps/unix/sysv/linux/sh/kernel_sigaction.h | 3 ++- .../unix/sysv/linux/sparc/kernel_sigaction.h | 7 +---- sysdeps/unix/sysv/linux/x86_64/sigaction.c | 3 ++- 8 files changed, 25 insertions(+), 34 deletions(-) diff --git a/sysdeps/unix/sysv/linux/kernel_sigaction.h b/sysdeps/unix/sysv/linux/kernel_sigaction.h index 2dbec0809..1c36146d4 100644 --- a/sysdeps/unix/sysv/linux/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/kernel_sigaction.h @@ -1,19 +1,27 @@ #ifndef _KERNEL_SIGACTION_H # define _KERNEL_SIGACTION_H +#ifdef SA_RESTORER +# define HAS_SA_RESTORER 1 +#endif + /* This is the sigaction structure from the Linux 3.2 kernel. */ struct kernel_sigaction { __sighandler_t k_sa_handler; unsigned long sa_flags; -#ifdef SA_RESTORER +#ifdef HAS_SA_RESTORER void (*sa_restorer) (void); #endif + /* glibc sigset is larger than kernel expected one, however sigaction + passes the kernel expected size on rt_sigaction syscall. */ sigset_t sa_mask; }; -#ifndef SA_RESTORER +#ifndef SET_SA_RESTORER # define SET_SA_RESTORER(kact, act) +#endif +#ifndef RESET_SA_RESTORER # define RESET_SA_RESTORER(act, kact) #endif diff --git a/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h b/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h index 54972feb1..464b351d6 100644 --- a/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h @@ -1,22 +1,4 @@ -#ifndef _KERNEL_SIGACTION_H -# define _KERNEL_SIGACTION_H - -#include - -#define SA_RESTORER 0x04000000 - -/* This is the sigaction structure from the Linux 3.2 kernel. */ -struct kernel_sigaction -{ - __sighandler_t k_sa_handler; - sigset_t sa_mask; - unsigned long sa_flags; - void (*sa_restorer) (void); -}; - -#define SET_SA_RESTORER(kact, act) \ - (kact)->sa_restorer = (act)->sa_restorer -#define RESET_SA_RESTORER(act, kact) \ - (act)->sa_restorer = (kact)->sa_restorer - -#endif +/* m68k does not define SA_RESTORER, but does have sa_restorer member + on kernel sigaction struct. */ +#define HAS_SA_RESTORER 1 +#include diff --git a/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h b/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h index 4ada32210..89f9bcedf 100644 --- a/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h @@ -1,8 +1,9 @@ /* NIOS2 uses the generic Linux UAPI but defines SA_RESTORER. */ #define SA_RESTORER 0x04000000 -#include #define SET_SA_RESTORER(kact, act) \ (kact)->sa_restorer = (act)->sa_restorer #define RESET_SA_RESTORER(act, kact) \ (act)->sa_restorer = (kact)->sa_restorer + +#include diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h index aef3d5a3b..bac03ee45 100644 --- a/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h @@ -1,9 +1,10 @@ /* powerpc kernel sigaction is similar to generic Linux UAPI one, but the architecture also defines SA_RESTORER. */ #define SA_RESTORER 0x04000000 -#include #define SET_SA_RESTORER(kact, act) \ (kact)->sa_restorer = (act)->sa_restorer #define RESET_SA_RESTORER(act, kact) \ (act)->sa_restorer = (kact)->sa_restorer + +#include diff --git a/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h b/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h index 7a6a2c4f2..14f44c200 100644 --- a/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h @@ -30,3 +30,5 @@ struct kernel_sigaction (kact)->sa_restorer = (act)->sa_restorer #define RESET_SA_RESTORER(act, kact) \ (act)->sa_restorer = (kact)->sa_restorer + +#include diff --git a/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h index 7ebcd08d6..c8dc77a02 100644 --- a/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h @@ -1,8 +1,9 @@ /* SH uses the generic Linux UAPI but defines SA_RESTORER. */ #define SA_RESTORER 0x04000000 -#include #define SET_SA_RESTORER(kact, act) \ (kact)->sa_restorer = (act)->sa_restorer #define RESET_SA_RESTORER(act, kact) \ (act)->sa_restorer = (kact)->sa_restorer + +#include diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h index bee7e9cd0..eb4a52245 100644 --- a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h @@ -1,10 +1,5 @@ /* SPARC 'struct __new_sigaction' is similar to generic Linux UAPI with a sa_restorer field, even though function is passed as an argument to rt_sigaction syscall. */ -#define SA_RESTORER 0x04000000 +#define HAS_SA_RESTORER 1 #include - -#define SET_SA_RESTORER(kact, act) \ - (kact)->sa_restorer = NULL -#define RESET_SA_RESTORER(act, kact) \ - (act)->sa_restorer = (kact)->sa_restorer diff --git a/sysdeps/unix/sysv/linux/x86_64/sigaction.c b/sysdeps/unix/sysv/linux/x86_64/sigaction.c index 4e6d9cc32..9aa2c7f86 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sigaction.c +++ b/sysdeps/unix/sysv/linux/x86_64/sigaction.c @@ -18,7 +18,6 @@ #include #define SA_RESTORER 0x04000000 -#include extern void restore_rt (void) asm ("__restore_rt") attribute_hidden; @@ -29,6 +28,8 @@ extern void restore_rt (void) asm ("__restore_rt") attribute_hidden; #define RESET_SA_RESTORER(act, kact) \ (act)->sa_restorer = (kact)->sa_restorer +#include + #include /* NOTE: Please think twice before making any changes to the bits of -- 2.30.2