From a894053318f1ca246d13bb9efa65bd702df6b63e Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Mon, 15 Mar 2021 15:23:40 -0300 Subject: signal: Add __libc_sigaction The generic implementation basically handle the system agnostic logic (filtering out the invalid signals) while the __libc_sigaction is the function with implements the system and architecture bits. Checked on x86_64-linux-gnu and i686-linux-gnu. --- sysdeps/unix/sysv/linux/aarch64/libc_sigaction.c | 30 +++++ sysdeps/unix/sysv/linux/aarch64/sigaction.c | 30 ----- sysdeps/unix/sysv/linux/arc/libc_sigaction.c | 31 +++++ sysdeps/unix/sysv/linux/arc/sigaction.c | 31 ----- sysdeps/unix/sysv/linux/arm/libc_sigaction.c | 39 ++++++ sysdeps/unix/sysv/linux/arm/sigaction.c | 39 ------ sysdeps/unix/sysv/linux/i386/libc_sigaction.c | 79 ++++++++++++ sysdeps/unix/sysv/linux/i386/sigaction.c | 79 ------------ sysdeps/unix/sysv/linux/libc_sigaction.c | 72 +++++++++++ sysdeps/unix/sysv/linux/sigaction.c | 74 ------------ .../unix/sysv/linux/sparc/sparc32/libc_sigaction.c | 37 ++++++ sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c | 37 ------ .../unix/sysv/linux/sparc/sparc64/libc_sigaction.c | 32 +++++ sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c | 32 ----- sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c | 134 +++++++++++++++++++++ sysdeps/unix/sysv/linux/x86_64/sigaction.c | 134 --------------------- 16 files changed, 454 insertions(+), 456 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/aarch64/libc_sigaction.c delete mode 100644 sysdeps/unix/sysv/linux/aarch64/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/arc/libc_sigaction.c delete mode 100644 sysdeps/unix/sysv/linux/arc/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/arm/libc_sigaction.c delete mode 100644 sysdeps/unix/sysv/linux/arm/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/i386/libc_sigaction.c delete mode 100644 sysdeps/unix/sysv/linux/i386/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/libc_sigaction.c delete mode 100644 sysdeps/unix/sysv/linux/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/libc_sigaction.c delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/libc_sigaction.c delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c delete mode 100644 sysdeps/unix/sysv/linux/x86_64/sigaction.c (limited to 'sysdeps/unix/sysv') diff --git a/sysdeps/unix/sysv/linux/aarch64/libc_sigaction.c b/sysdeps/unix/sysv/linux/aarch64/libc_sigaction.c new file mode 100644 index 0000000000..a2a2a17fe9 --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/libc_sigaction.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1997-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* Required for AArch32 compatibility. */ +#define SA_RESTORER 0x04000000 + +#define SET_SA_RESTORER(kact, act) \ + ({ \ + if ((kact)->sa_flags & SA_RESTORER) \ + (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/aarch64/sigaction.c b/sysdeps/unix/sysv/linux/aarch64/sigaction.c deleted file mode 100644 index 6f44866ce1..0000000000 --- a/sysdeps/unix/sysv/linux/aarch64/sigaction.c +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (C) 1997-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -/* Required for AArch32 compatibility. */ -#define SA_RESTORER 0x04000000 - -#define SET_SA_RESTORER(kact, act) \ - ({ \ - if ((kact)->sa_flags & SA_RESTORER) \ - (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/arc/libc_sigaction.c b/sysdeps/unix/sysv/linux/arc/libc_sigaction.c new file mode 100644 index 0000000000..26da42f04f --- /dev/null +++ b/sysdeps/unix/sysv/linux/arc/libc_sigaction.c @@ -0,0 +1,31 @@ +/* ARC specific sigaction. + Copyright (C) 2020-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#define SA_RESTORER 0x04000000 + +extern void __default_rt_sa_restorer (void); + +#define SET_SA_RESTORER(kact, act) \ + ({ \ + (kact)->sa_restorer = __default_rt_sa_restorer; \ + (kact)->sa_flags |= SA_RESTORER; \ + }) + +#define RESET_SA_RESTORER(act, kact) + +#include diff --git a/sysdeps/unix/sysv/linux/arc/sigaction.c b/sysdeps/unix/sysv/linux/arc/sigaction.c deleted file mode 100644 index 2807f74b1b..0000000000 --- a/sysdeps/unix/sysv/linux/arc/sigaction.c +++ /dev/null @@ -1,31 +0,0 @@ -/* ARC specific sigaction. - Copyright (C) 2020-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#define SA_RESTORER 0x04000000 - -extern void __default_rt_sa_restorer (void); - -#define SET_SA_RESTORER(kact, act) \ - ({ \ - (kact)->sa_restorer = __default_rt_sa_restorer; \ - (kact)->sa_flags |= SA_RESTORER; \ - }) - -#define RESET_SA_RESTORER(act, kact) - -#include diff --git a/sysdeps/unix/sysv/linux/arm/libc_sigaction.c b/sysdeps/unix/sysv/linux/arm/libc_sigaction.c new file mode 100644 index 0000000000..de061312d5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/arm/libc_sigaction.c @@ -0,0 +1,39 @@ +/* Copyright (C) 1997-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#define SA_RESTORER 0x04000000 + +extern void __default_sa_restorer (void); +extern void __default_rt_sa_restorer (void); + +#define SET_SA_RESTORER(kact, act) \ + ({ \ + if ((kact)->sa_flags & SA_RESTORER) \ + (kact)->sa_restorer = (act)->sa_restorer; \ + else \ + { \ + (kact)->sa_restorer = ((kact)->sa_flags & SA_SIGINFO) \ + ? __default_rt_sa_restorer \ + : __default_sa_restorer; \ + (kact)->sa_flags |= SA_RESTORER; \ + } \ + }) + +#define RESET_SA_RESTORER(act, kact) \ + (act)->sa_restorer = (kact)->sa_restorer; + +#include diff --git a/sysdeps/unix/sysv/linux/arm/sigaction.c b/sysdeps/unix/sysv/linux/arm/sigaction.c deleted file mode 100644 index 76a9abebf3..0000000000 --- a/sysdeps/unix/sysv/linux/arm/sigaction.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 1997-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#define SA_RESTORER 0x04000000 - -extern void __default_sa_restorer (void); -extern void __default_rt_sa_restorer (void); - -#define SET_SA_RESTORER(kact, act) \ - ({ \ - if ((kact)->sa_flags & SA_RESTORER) \ - (kact)->sa_restorer = (act)->sa_restorer; \ - else \ - { \ - (kact)->sa_restorer = ((kact)->sa_flags & SA_SIGINFO) \ - ? __default_rt_sa_restorer \ - : __default_sa_restorer; \ - (kact)->sa_flags |= SA_RESTORER; \ - } \ - }) - -#define RESET_SA_RESTORER(act, kact) \ - (act)->sa_restorer = (kact)->sa_restorer; - -#include diff --git a/sysdeps/unix/sysv/linux/i386/libc_sigaction.c b/sysdeps/unix/sysv/linux/i386/libc_sigaction.c new file mode 100644 index 0000000000..1d6457612a --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/libc_sigaction.c @@ -0,0 +1,79 @@ +/* POSIX.1 `sigaction' call for Linux/i386. + Copyright (C) 1991-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +#define SA_RESTORER 0x04000000 + +extern void restore_rt (void) asm ("__restore_rt") attribute_hidden; +extern void restore (void) asm ("__restore") attribute_hidden; + +#define SET_SA_RESTORER(kact, act) \ + ({ \ + if (GLRO(dl_sysinfo_dso) == NULL) \ + { \ + (kact)->sa_flags |= SA_RESTORER; \ + (kact)->sa_restorer = (((act)->sa_flags & SA_SIGINFO) \ + ? &restore_rt : &restore); \ + } \ + else \ + (kact)->sa_restorer = NULL; \ + }) + +#define RESET_SA_RESTORER(act, kact) \ + (act)->sa_restorer = (kact)->sa_restorer + +#include + +/* NOTE: Please think twice before making any changes to the bits of + code below. GDB needs some intimate knowledge about it to + recognize them as signal trampolines, and make backtraces through + signal handlers work right. Important are both the names + (__restore and __restore_rt) and the exact instruction sequence. + If you ever feel the need to make any changes, please notify the + appropriate GDB maintainer. */ + +#define RESTORE(name, syscall) RESTORE2 (name, syscall) +#define RESTORE2(name, syscall) \ +asm \ + ( \ + ".text\n" \ + " .align 16\n" \ + "__" #name ":\n" \ + " movl $" #syscall ", %eax\n" \ + " int $0x80" \ + ); + +/* The return code for realtime-signals. */ +RESTORE (restore_rt, __NR_rt_sigreturn) + +/* For the boring old signals. */ +#undef RESTORE2 +#define RESTORE2(name, syscall) \ +asm \ + ( \ + ".text\n" \ + " .align 8\n" \ + "__" #name ":\n" \ + " popl %eax\n" \ + " movl $" #syscall ", %eax\n" \ + " int $0x80" \ + ); + +RESTORE (restore, __NR_sigreturn) diff --git a/sysdeps/unix/sysv/linux/i386/sigaction.c b/sysdeps/unix/sysv/linux/i386/sigaction.c deleted file mode 100644 index 46aeca252d..0000000000 --- a/sysdeps/unix/sysv/linux/i386/sigaction.c +++ /dev/null @@ -1,79 +0,0 @@ -/* POSIX.1 `sigaction' call for Linux/i386. - Copyright (C) 1991-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include - -#define SA_RESTORER 0x04000000 - -extern void restore_rt (void) asm ("__restore_rt") attribute_hidden; -extern void restore (void) asm ("__restore") attribute_hidden; - -#define SET_SA_RESTORER(kact, act) \ - ({ \ - if (GLRO(dl_sysinfo_dso) == NULL) \ - { \ - (kact)->sa_flags |= SA_RESTORER; \ - (kact)->sa_restorer = (((act)->sa_flags & SA_SIGINFO) \ - ? &restore_rt : &restore); \ - } \ - else \ - (kact)->sa_restorer = NULL; \ - }) - -#define RESET_SA_RESTORER(act, kact) \ - (act)->sa_restorer = (kact)->sa_restorer - -#include - -/* NOTE: Please think twice before making any changes to the bits of - code below. GDB needs some intimate knowledge about it to - recognize them as signal trampolines, and make backtraces through - signal handlers work right. Important are both the names - (__restore and __restore_rt) and the exact instruction sequence. - If you ever feel the need to make any changes, please notify the - appropriate GDB maintainer. */ - -#define RESTORE(name, syscall) RESTORE2 (name, syscall) -#define RESTORE2(name, syscall) \ -asm \ - ( \ - ".text\n" \ - " .align 16\n" \ - "__" #name ":\n" \ - " movl $" #syscall ", %eax\n" \ - " int $0x80" \ - ); - -/* The return code for realtime-signals. */ -RESTORE (restore_rt, __NR_rt_sigreturn) - -/* For the boring old signals. */ -#undef RESTORE2 -#define RESTORE2(name, syscall) \ -asm \ - ( \ - ".text\n" \ - " .align 8\n" \ - "__" #name ":\n" \ - " popl %eax\n" \ - " movl $" #syscall ", %eax\n" \ - " int $0x80" \ - ); - -RESTORE (restore, __NR_sigreturn) diff --git a/sysdeps/unix/sysv/linux/libc_sigaction.c b/sysdeps/unix/sysv/linux/libc_sigaction.c new file mode 100644 index 0000000000..21fe657d1f --- /dev/null +++ b/sysdeps/unix/sysv/linux/libc_sigaction.c @@ -0,0 +1,72 @@ +/* Copyright (C) 1997-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include + +#include +#include + +/* New ports should not define the obsolete SA_RESTORER, however some + architecture requires for compat mode and/or due old ABI. */ +#include + +#ifndef SA_RESTORER +# define SET_SA_RESTORER(kact, act) +# define RESET_SA_RESTORER(act, kact) +#endif + +/* SPARC passes the restore function as an argument to rt_sigaction. */ +#ifndef STUB +# define STUB(act, sigsetsize) (sigsetsize) +#endif + +/* If ACT is not NULL, change the action for SIG to *ACT. + If OACT is not NULL, put the old action for SIG in *OACT. */ +int +__libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact) +{ + int result; + + struct kernel_sigaction kact, koact; + + if (act) + { + kact.k_sa_handler = act->sa_handler; + memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); + kact.sa_flags = act->sa_flags; + SET_SA_RESTORER (&kact, act); + } + + /* XXX The size argument hopefully will have to be changed to the + real size of the user-level sigset_t. */ + result = INLINE_SYSCALL_CALL (rt_sigaction, sig, + act ? &kact : NULL, + oact ? &koact : NULL, STUB (act, + __NSIG_BYTES)); + + if (oact && result >= 0) + { + oact->sa_handler = koact.k_sa_handler; + memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t)); + oact->sa_flags = koact.sa_flags; + RESET_SA_RESTORER (oact, &koact); + } + return result; +} +libc_hidden_def (__libc_sigaction) diff --git a/sysdeps/unix/sysv/linux/sigaction.c b/sysdeps/unix/sysv/linux/sigaction.c deleted file mode 100644 index 38088f9a85..0000000000 --- a/sysdeps/unix/sysv/linux/sigaction.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 1997-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include - -#include -#include - -/* New ports should not define the obsolete SA_RESTORER, however some - architecture requires for compat mode and/or due old ABI. */ -#include - -#ifndef SA_RESTORER -# define SET_SA_RESTORER(kact, act) -# define RESET_SA_RESTORER(act, kact) -#endif - -/* SPARC passes the restore function as an argument to rt_sigaction. */ -#ifndef STUB -# define STUB(act, sigsetsize) (sigsetsize) -#endif - -/* If ACT is not NULL, change the action for SIG to *ACT. - If OACT is not NULL, put the old action for SIG in *OACT. */ -int -__libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact) -{ - int result; - - struct kernel_sigaction kact, koact; - - if (act) - { - kact.k_sa_handler = act->sa_handler; - memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); - kact.sa_flags = act->sa_flags; - SET_SA_RESTORER (&kact, act); - } - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - result = INLINE_SYSCALL_CALL (rt_sigaction, sig, - act ? &kact : NULL, - oact ? &koact : NULL, STUB (act, - __NSIG_BYTES)); - - if (oact && result >= 0) - { - oact->sa_handler = koact.k_sa_handler; - memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t)); - oact->sa_flags = koact.sa_flags; - RESET_SA_RESTORER (oact, &koact); - } - return result; -} -libc_hidden_def (__libc_sigaction) - -#include diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc_sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc32/libc_sigaction.c new file mode 100644 index 0000000000..09a052fc05 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc_sigaction.c @@ -0,0 +1,37 @@ +/* POSIX.1 sigaction call for Linux/SPARC. + Copyright (C) 1997-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include + +void __rt_sigreturn_stub (void); +void __sigreturn_stub (void); + +#define STUB(act, sigsetsize) \ + (act) ? ((unsigned long)((act->sa_flags & SA_SIGINFO) \ + ? &__rt_sigreturn_stub \ + : &__sigreturn_stub) - 8) \ + : 0, \ + (sigsetsize) + +#include diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c deleted file mode 100644 index f1e07fbb7c..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c +++ /dev/null @@ -1,37 +0,0 @@ -/* POSIX.1 sigaction call for Linux/SPARC. - Copyright (C) 1997-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza , 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include -#include -#include -#include - -void __rt_sigreturn_stub (void); -void __sigreturn_stub (void); - -#define STUB(act, sigsetsize) \ - (act) ? ((unsigned long)((act->sa_flags & SA_SIGINFO) \ - ? &__rt_sigreturn_stub \ - : &__sigreturn_stub) - 8) \ - : 0, \ - (sigsetsize) - -#include diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc_sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc64/libc_sigaction.c new file mode 100644 index 0000000000..6cfcf0a4cb --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc_sigaction.c @@ -0,0 +1,32 @@ +/* POSIX.1 sigaction call for Linux/SPARC64. + Copyright (C) 1997-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza and + Jakub Jelinek . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include + +/* Defined on sigreturn_stub.S. */ +void __rt_sigreturn_stub (void); + +#define STUB(act, sigsetsize) \ + (((unsigned long) &__rt_sigreturn_stub) - 8), \ + (sigsetsize) + +#include diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c deleted file mode 100644 index 2e7f940a4e..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c +++ /dev/null @@ -1,32 +0,0 @@ -/* POSIX.1 sigaction call for Linux/SPARC64. - Copyright (C) 1997-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza and - Jakub Jelinek . - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include - -/* Defined on sigreturn_stub.S. */ -void __rt_sigreturn_stub (void); - -#define STUB(act, sigsetsize) \ - (((unsigned long) &__rt_sigreturn_stub) - 8), \ - (sigsetsize) - -#include diff --git a/sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c b/sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c new file mode 100644 index 0000000000..21367e97c1 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c @@ -0,0 +1,134 @@ +/* POSIX.1 `sigaction' call for Linux/x86-64. + Copyright (C) 2001-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#define SA_RESTORER 0x04000000 + +extern void restore_rt (void) asm ("__restore_rt") attribute_hidden; + +#define SET_SA_RESTORER(kact, act) \ + (kact)->sa_flags = (act)->sa_flags | SA_RESTORER; \ + (kact)->sa_restorer = &restore_rt + +#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 + code below. GDB needs some intimate knowledge about it to + recognize them as signal trampolines, and make backtraces through + signal handlers work right. Important are both the names + (__restore_rt) and the exact instruction sequence. + If you ever feel the need to make any changes, please notify the + appropriate GDB maintainer. + + The unwind information starts a byte before __restore_rt, so that + it is found when unwinding, to get an address the unwinder assumes + will be in the middle of a call instruction. See the Linux kernel + (the i386 vsyscall, in particular) for an explanation of the complex + unwind information used here in order to get the traditional CFA. + We do not restore cs - it's only stored as two bytes here so that's + a bit tricky. We don't use the gas cfi directives, so that we can + reliably add .cfi_signal_frame. */ + +#include "ucontext_i.h" + +#define do_cfa_expr \ + " .byte 0x0f\n" /* DW_CFA_def_cfa_expression */ \ + " .uleb128 2f-1f\n" /* length */ \ + "1: .byte 0x77\n" /* DW_OP_breg7 */ \ + " .sleb128 " CFI_STRINGIFY (oRSP) "\n" \ + " .byte 0x06\n" /* DW_OP_deref */ \ + "2:" + +#define do_expr(regno, offset) \ + " .byte 0x10\n" /* DW_CFA_expression */ \ + " .uleb128 " CFI_STRINGIFY (regno) "\n" \ + " .uleb128 2f-1f\n" /* length */ \ + "1: .byte 0x77\n" /* DW_OP_breg7 */ \ + " .sleb128 " CFI_STRINGIFY (offset) "\n" \ + "2:" + +#define RESTORE(name, syscall) RESTORE2 (name, syscall) +# define RESTORE2(name, syscall) \ +asm \ + ( \ + /* `nop' for debuggers assuming `call' should not disalign the code. */ \ + " nop\n" \ + ".align 16\n" \ + ".LSTART_" #name ":\n" \ + " .type __" #name ",@function\n" \ + "__" #name ":\n" \ + " movq $" #syscall ", %rax\n" \ + " syscall\n" \ + ".LEND_" #name ":\n" \ + ".section .eh_frame,\"a\",@progbits\n" \ + ".LSTARTFRAME_" #name ":\n" \ + " .long .LENDCIE_" #name "-.LSTARTCIE_" #name "\n" \ + ".LSTARTCIE_" #name ":\n" \ + " .long 0\n" /* CIE ID */ \ + " .byte 1\n" /* Version number */ \ + " .string \"zRS\"\n" /* NUL-terminated augmentation string */ \ + " .uleb128 1\n" /* Code alignment factor */ \ + " .sleb128 -8\n" /* Data alignment factor */ \ + " .uleb128 16\n" /* Return address register column (rip) */ \ + /* Augmentation value length */ \ + " .uleb128 .LENDAUGMNT_" #name "-.LSTARTAUGMNT_" #name "\n" \ + ".LSTARTAUGMNT_" #name ":\n" \ + " .byte 0x1b\n" /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */ \ + ".LENDAUGMNT_" #name ":\n" \ + " .align " LP_SIZE "\n" \ + ".LENDCIE_" #name ":\n" \ + " .long .LENDFDE_" #name "-.LSTARTFDE_" #name "\n" /* FDE len */ \ + ".LSTARTFDE_" #name ":\n" \ + " .long .LSTARTFDE_" #name "-.LSTARTFRAME_" #name "\n" /* CIE */ \ + /* `LSTART_' is subtracted 1 as debuggers assume a `call' here. */ \ + " .long (.LSTART_" #name "-1)-.\n" /* PC-relative start addr. */ \ + " .long .LEND_" #name "-(.LSTART_" #name "-1)\n" \ + " .uleb128 0\n" /* FDE augmentation length */ \ + do_cfa_expr \ + do_expr (8 /* r8 */, oR8) \ + do_expr (9 /* r9 */, oR9) \ + do_expr (10 /* r10 */, oR10) \ + do_expr (11 /* r11 */, oR11) \ + do_expr (12 /* r12 */, oR12) \ + do_expr (13 /* r13 */, oR13) \ + do_expr (14 /* r14 */, oR14) \ + do_expr (15 /* r15 */, oR15) \ + do_expr (5 /* rdi */, oRDI) \ + do_expr (4 /* rsi */, oRSI) \ + do_expr (6 /* rbp */, oRBP) \ + do_expr (3 /* rbx */, oRBX) \ + do_expr (1 /* rdx */, oRDX) \ + do_expr (0 /* rax */, oRAX) \ + do_expr (2 /* rcx */, oRCX) \ + do_expr (7 /* rsp */, oRSP) \ + do_expr (16 /* rip */, oRIP) \ + /* libgcc-4.1.1 has only `DWARF_FRAME_REGISTERS == 17'. */ \ + /* do_expr (49 |* rflags *|, oEFL) */ \ + /* `cs'/`ds'/`fs' are unaligned and a different size. */ \ + /* gas: Error: register save offset not a multiple of 8 */ \ + " .align " LP_SIZE "\n" \ + ".LENDFDE_" #name ":\n" \ + " .previous\n" \ + ); +/* The return code for realtime-signals. */ +RESTORE (restore_rt, __NR_rt_sigreturn) diff --git a/sysdeps/unix/sysv/linux/x86_64/sigaction.c b/sysdeps/unix/sysv/linux/x86_64/sigaction.c deleted file mode 100644 index b295037db7..0000000000 --- a/sysdeps/unix/sysv/linux/x86_64/sigaction.c +++ /dev/null @@ -1,134 +0,0 @@ -/* POSIX.1 `sigaction' call for Linux/x86-64. - Copyright (C) 2001-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#define SA_RESTORER 0x04000000 - -extern void restore_rt (void) asm ("__restore_rt") attribute_hidden; - -#define SET_SA_RESTORER(kact, act) \ - (kact)->sa_flags = (act)->sa_flags | SA_RESTORER; \ - (kact)->sa_restorer = &restore_rt - -#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 - code below. GDB needs some intimate knowledge about it to - recognize them as signal trampolines, and make backtraces through - signal handlers work right. Important are both the names - (__restore_rt) and the exact instruction sequence. - If you ever feel the need to make any changes, please notify the - appropriate GDB maintainer. - - The unwind information starts a byte before __restore_rt, so that - it is found when unwinding, to get an address the unwinder assumes - will be in the middle of a call instruction. See the Linux kernel - (the i386 vsyscall, in particular) for an explanation of the complex - unwind information used here in order to get the traditional CFA. - We do not restore cs - it's only stored as two bytes here so that's - a bit tricky. We don't use the gas cfi directives, so that we can - reliably add .cfi_signal_frame. */ - -#include "ucontext_i.h" - -#define do_cfa_expr \ - " .byte 0x0f\n" /* DW_CFA_def_cfa_expression */ \ - " .uleb128 2f-1f\n" /* length */ \ - "1: .byte 0x77\n" /* DW_OP_breg7 */ \ - " .sleb128 " CFI_STRINGIFY (oRSP) "\n" \ - " .byte 0x06\n" /* DW_OP_deref */ \ - "2:" - -#define do_expr(regno, offset) \ - " .byte 0x10\n" /* DW_CFA_expression */ \ - " .uleb128 " CFI_STRINGIFY (regno) "\n" \ - " .uleb128 2f-1f\n" /* length */ \ - "1: .byte 0x77\n" /* DW_OP_breg7 */ \ - " .sleb128 " CFI_STRINGIFY (offset) "\n" \ - "2:" - -#define RESTORE(name, syscall) RESTORE2 (name, syscall) -# define RESTORE2(name, syscall) \ -asm \ - ( \ - /* `nop' for debuggers assuming `call' should not disalign the code. */ \ - " nop\n" \ - ".align 16\n" \ - ".LSTART_" #name ":\n" \ - " .type __" #name ",@function\n" \ - "__" #name ":\n" \ - " movq $" #syscall ", %rax\n" \ - " syscall\n" \ - ".LEND_" #name ":\n" \ - ".section .eh_frame,\"a\",@progbits\n" \ - ".LSTARTFRAME_" #name ":\n" \ - " .long .LENDCIE_" #name "-.LSTARTCIE_" #name "\n" \ - ".LSTARTCIE_" #name ":\n" \ - " .long 0\n" /* CIE ID */ \ - " .byte 1\n" /* Version number */ \ - " .string \"zRS\"\n" /* NUL-terminated augmentation string */ \ - " .uleb128 1\n" /* Code alignment factor */ \ - " .sleb128 -8\n" /* Data alignment factor */ \ - " .uleb128 16\n" /* Return address register column (rip) */ \ - /* Augmentation value length */ \ - " .uleb128 .LENDAUGMNT_" #name "-.LSTARTAUGMNT_" #name "\n" \ - ".LSTARTAUGMNT_" #name ":\n" \ - " .byte 0x1b\n" /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */ \ - ".LENDAUGMNT_" #name ":\n" \ - " .align " LP_SIZE "\n" \ - ".LENDCIE_" #name ":\n" \ - " .long .LENDFDE_" #name "-.LSTARTFDE_" #name "\n" /* FDE len */ \ - ".LSTARTFDE_" #name ":\n" \ - " .long .LSTARTFDE_" #name "-.LSTARTFRAME_" #name "\n" /* CIE */ \ - /* `LSTART_' is subtracted 1 as debuggers assume a `call' here. */ \ - " .long (.LSTART_" #name "-1)-.\n" /* PC-relative start addr. */ \ - " .long .LEND_" #name "-(.LSTART_" #name "-1)\n" \ - " .uleb128 0\n" /* FDE augmentation length */ \ - do_cfa_expr \ - do_expr (8 /* r8 */, oR8) \ - do_expr (9 /* r9 */, oR9) \ - do_expr (10 /* r10 */, oR10) \ - do_expr (11 /* r11 */, oR11) \ - do_expr (12 /* r12 */, oR12) \ - do_expr (13 /* r13 */, oR13) \ - do_expr (14 /* r14 */, oR14) \ - do_expr (15 /* r15 */, oR15) \ - do_expr (5 /* rdi */, oRDI) \ - do_expr (4 /* rsi */, oRSI) \ - do_expr (6 /* rbp */, oRBP) \ - do_expr (3 /* rbx */, oRBX) \ - do_expr (1 /* rdx */, oRDX) \ - do_expr (0 /* rax */, oRAX) \ - do_expr (2 /* rcx */, oRCX) \ - do_expr (7 /* rsp */, oRSP) \ - do_expr (16 /* rip */, oRIP) \ - /* libgcc-4.1.1 has only `DWARF_FRAME_REGISTERS == 17'. */ \ - /* do_expr (49 |* rflags *|, oEFL) */ \ - /* `cs'/`ds'/`fs' are unaligned and a different size. */ \ - /* gas: Error: register save offset not a multiple of 8 */ \ - " .align " LP_SIZE "\n" \ - ".LENDFDE_" #name ":\n" \ - " .previous\n" \ - ); -/* The return code for realtime-signals. */ -RESTORE (restore_rt, __NR_rt_sigreturn) -- cgit 1.4.1