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. --- nptl/Makefile | 1 + signal/Makefile | 2 +- signal/libc_sigaction.c | 32 +++++ signal/sigaction.c | 7 +- sysdeps/mach/hurd/libc_sigaction.c | 89 ++++++++++++++ sysdeps/mach/hurd/sigaction.c | 91 -------------- sysdeps/unix/syscalls.list | 1 - 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 --------------------- 23 files changed, 579 insertions(+), 554 deletions(-) create mode 100644 signal/libc_sigaction.c create mode 100644 sysdeps/mach/hurd/libc_sigaction.c delete mode 100644 sysdeps/mach/hurd/sigaction.c 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 diff --git a/nptl/Makefile b/nptl/Makefile index d3704401fb..b1948cc47a 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -225,6 +225,7 @@ libpthread-routines = \ sem_unlink \ sem_wait \ sigaction \ + libc_sigaction \ tpp \ unwind \ unwind-forcedunwind \ diff --git a/signal/Makefile b/signal/Makefile index 3d8cab1f50..99889a53a4 100644 --- a/signal/Makefile +++ b/signal/Makefile @@ -35,7 +35,7 @@ headers := signal.h sys/signal.h \ bits/sigstksz.h routines := signal raise killpg \ - sigaction sigprocmask kill \ + sigaction libc_sigaction sigprocmask kill \ sigpending sigsuspend sigwait \ sigblock sigsetmask sigpause sigvec \ sigstack sigaltstack sigintr \ diff --git a/signal/libc_sigaction.c b/signal/libc_sigaction.c new file mode 100644 index 0000000000..c25913b9bd --- /dev/null +++ b/signal/libc_sigaction.c @@ -0,0 +1,32 @@ +/* Internal sigaction definitions. + Copyright (C) 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 + +/* 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) +{ + __set_errno (ENOSYS); + return -1; +} +stub_warning (libc_sigaction) +libc_hidden_def (__libc_sigaction) diff --git a/signal/sigaction.c b/signal/sigaction.c index 3bfc17945c..8d9f755ccc 100644 --- a/signal/sigaction.c +++ b/signal/sigaction.c @@ -17,7 +17,7 @@ #include #include - +#include /* 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. */ @@ -30,10 +30,7 @@ __sigaction (int sig, const struct sigaction *act, struct sigaction *oact) return -1; } - __set_errno (ENOSYS); - return -1; + return __libc_sigaction (sig, act, oact); } libc_hidden_def (__sigaction) -stub_warning (sigaction) - weak_alias (__sigaction, sigaction) diff --git a/sysdeps/mach/hurd/libc_sigaction.c b/sysdeps/mach/hurd/libc_sigaction.c new file mode 100644 index 0000000000..29547e2d6a --- /dev/null +++ b/sysdeps/mach/hurd/libc_sigaction.c @@ -0,0 +1,89 @@ +/* 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 +#include +#include + +/* 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) +{ + struct hurd_sigstate *ss; + struct sigaction a, old; + sigset_t pending; + + if (act != NULL && act->sa_handler != SIG_DFL + && ((__sigmask (sig) & _SIG_CANT_MASK) || act->sa_handler == SIG_ERR)) + { + errno = EINVAL; + return -1; + } + + /* Copy so we fault before taking locks. */ + if (act != NULL) + a = *act; + + ss = _hurd_self_sigstate (); + + __spin_lock (&ss->critical_section_lock); + _hurd_sigstate_lock (ss); + old = _hurd_sigstate_actions (ss) [sig]; + if (act != NULL) + _hurd_sigstate_actions (ss) [sig] = a; + + if (act != NULL && sig == SIGCHLD + && (a.sa_flags & SA_NOCLDSTOP) != (old.sa_flags & SA_NOCLDSTOP)) + { + _hurd_sigstate_unlock (ss); + + /* Inform the proc server whether or not it should send us SIGCHLD for + stopped children. We do this in a critical section so that no + SIGCHLD can arrive in the middle and be of indeterminate status. */ + __USEPORT (PROC, + __proc_mod_stopchild (port, !(a.sa_flags & SA_NOCLDSTOP))); + + _hurd_sigstate_lock (ss); + pending = _hurd_sigstate_pending (ss) & ~ss->blocked; + } + else if (act != NULL && (a.sa_handler == SIG_IGN || a.sa_handler == SIG_DFL)) + /* We are changing to an action that might be to ignore SIG signals. + If SIG is blocked and pending and the new action is to ignore it, we + must remove it from the pending set now; if the action is changed + back and then SIG is unblocked, the signal pending now should not + arrive. So wake up the signal thread to check the new state and do + the right thing. */ + pending = _hurd_sigstate_pending (ss) & __sigmask (sig); + else + pending = 0; + + _hurd_sigstate_unlock (ss); + __spin_unlock (&ss->critical_section_lock); + + if (pending) + __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); + + if (oact != NULL) + *oact = old; + + return 0; +} +libc_hidden_def (__libc_sigaction) diff --git a/sysdeps/mach/hurd/sigaction.c b/sysdeps/mach/hurd/sigaction.c deleted file mode 100644 index ab91e122b9..0000000000 --- a/sysdeps/mach/hurd/sigaction.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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 -#include -#include - -/* 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 -__sigaction (int sig, const struct sigaction *act, struct sigaction *oact) -{ - struct hurd_sigstate *ss; - struct sigaction a, old; - sigset_t pending; - - if (sig <= 0 || sig >= NSIG - || (act != NULL && act->sa_handler != SIG_DFL - && ((__sigmask (sig) & _SIG_CANT_MASK) - || act->sa_handler == SIG_ERR))) - { - errno = EINVAL; - return -1; - } - - /* Copy so we fault before taking locks. */ - if (act != NULL) - a = *act; - - ss = _hurd_self_sigstate (); - - __spin_lock (&ss->critical_section_lock); - _hurd_sigstate_lock (ss); - old = _hurd_sigstate_actions (ss) [sig]; - if (act != NULL) - _hurd_sigstate_actions (ss) [sig] = a; - - if (act != NULL && sig == SIGCHLD - && (a.sa_flags & SA_NOCLDSTOP) != (old.sa_flags & SA_NOCLDSTOP)) - { - _hurd_sigstate_unlock (ss); - - /* Inform the proc server whether or not it should send us SIGCHLD for - stopped children. We do this in a critical section so that no - SIGCHLD can arrive in the middle and be of indeterminate status. */ - __USEPORT (PROC, - __proc_mod_stopchild (port, !(a.sa_flags & SA_NOCLDSTOP))); - - _hurd_sigstate_lock (ss); - pending = _hurd_sigstate_pending (ss) & ~ss->blocked; - } - else if (act != NULL && (a.sa_handler == SIG_IGN || a.sa_handler == SIG_DFL)) - /* We are changing to an action that might be to ignore SIG signals. - If SIG is blocked and pending and the new action is to ignore it, we - must remove it from the pending set now; if the action is changed - back and then SIG is unblocked, the signal pending now should not - arrive. So wake up the signal thread to check the new state and do - the right thing. */ - pending = _hurd_sigstate_pending (ss) & __sigmask (sig); - else - pending = 0; - - _hurd_sigstate_unlock (ss); - __spin_unlock (&ss->critical_section_lock); - - if (pending) - __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); - - if (oact != NULL) - *oact = old; - - return 0; -} -libc_hidden_def (__sigaction) -weak_alias (__sigaction, sigaction) diff --git a/sysdeps/unix/syscalls.list b/sysdeps/unix/syscalls.list index 7209c24110..341eec20f1 100644 --- a/sysdeps/unix/syscalls.list +++ b/sysdeps/unix/syscalls.list @@ -74,7 +74,6 @@ setsid - setsid i: __setsid setsid setsockopt - setsockopt i:iiibn setsockopt __setsockopt setuid - setuid i:i __setuid setuid shutdown - shutdown i:ii shutdown -sigaction - sigaction i:ipp __sigaction sigaction sigsuspend - sigsuspend Ci:p sigsuspend socket - socket i:iii __socket socket socketpair - socketpair i:iiif socketpair 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 v1.2.3