From patchwork Mon Feb 12 12:42:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 128018 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp3171629ljc; Mon, 12 Feb 2018 04:43:09 -0800 (PST) X-Google-Smtp-Source: AH8x225WhAtsAb8/6T6vQwvsOTFs5YTluTWRsUNoU6ORsftNc0+B+cB5GP5JRpXOT3lg+MZ5kOlI X-Received: by 10.101.101.143 with SMTP id u15mr9112715pgv.265.1518439389427; Mon, 12 Feb 2018 04:43:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518439389; cv=none; d=google.com; s=arc-20160816; b=qOHfcBLmqqPwQJe3B3e4H7/4pVgzijjpmDEHgwzM3U/dS6w9KMeN8nD36b46VdYz1m OVtwmCHNzKcn6ezQEjDCfy5T7GKN+5QwSAVODLT0PvLyR1eVYCJGzuiKWGKFJ8A5d0P0 vx1wSdMXg5Gj+fG7KHFftda432v4iA+9aKlI5RmvDyWqcD9pJulLRFTyEnKE5NX7CwK1 bt5Pe60ytmwo/kZ0MVpyd0P3vv/RuPM0ZGT7d/LiVHBxWqZrsuhCaF27H2vAmHvu6/e6 rxP7d9vjfqyh8auQ3h3BFNGfl8JAJl1L9ybO2jjaeIkiFPI/+oJQFH+Lh0gBrtsMBjgH TIUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=Td9Zjjw+vhhxXAywl8CLnAhEMrG7E2g+Kj7lgXwc8Ug=; b=DBkIf3YIL/11bGvRtSPFSUHsC3zJ6xp6FvpOrygV0Tb0Mj51oHdByZ5Ye1564UIh5E shoHAwmV9AoHEJ6owxQEtSLIO5gXo7dwXrPkIPX8EgLRe+z+MTA7AYSX6vIOWxgebErF kg+Ib+5F3murXYZ5ar6ULngt7ZfsUMQUbPTiEtNMDF7JO9IbkEeTQk4pdDSNZgyAFa6O AR1GMBwiqmsUtiG8J9SW2sI73AseJ946usbhzNB7zoouFQLQ0FzhCO6hOLJIWRR7Ybht 4eB0YCssTMZq/J1FsKa3dnDbVoVxxuSHRHEZW6nDJQUpqDoGz0W9Q0Nop0VvJ6OqX+bX y7XA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=qXaaUudo; spf=pass (google.com: domain of libc-alpha-return-90259-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-90259-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id a13si5093145pgu.178.2018.02.12.04.43.09 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Feb 2018 04:43:09 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-90259-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=qXaaUudo; spf=pass (google.com: domain of libc-alpha-return-90259-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-90259-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=WLsBH2o0jQ69JmoJau1JJwh0KQnzJeR EnZZ3VdtPxSZiKX/rTp24/AAU7VyYuS5t8xRrY1MT8AkpHdn/No+UY3W16nmyHbC xPJ3PXklYspLOwUWhLY1oLNPq3ngv9veBrjT859qI+VzaMZI3L7q5CF6FkI4dFTg GZkU5/FU/K8k= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=ygWmZLF9h3xA75hnoSKQgExKfnc=; b=qXaaU udoZMVfmVRklCOOLZLRilwDtUMcD+SZRtqH9aQMNpzsX9Glc1/2wgE6djybsRYTj VWntskurVt49PMPnjioq1I8twThlwneSNVnbRJOsg+nbBlp5XMw32OvTe0fKTJjN oehjikVLMX0YCrRQQaL8yjozOS75pRZtFiz78U= Received: (qmail 52552 invoked by alias); 12 Feb 2018 12:42:45 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 52445 invoked by uid 89); 12 Feb 2018 12:42:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f178.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=Td9Zjjw+vhhxXAywl8CLnAhEMrG7E2g+Kj7lgXwc8Ug=; b=iR7ayivKipsYdaZM+8K2mvIo5CWJ9TnGlmh3PXrxiG534rEUFwGw4GRQtuM+zpC63/ fY58+Kxy6kzASWLi0ijyGTw17IyhkcjUq7WIePs8EnrxOW455QwNcuKSMURGpsAf0Ajh 7thF5Pz9lKj8Dj4B+6+WfG4oh8GxVfReL3wNgF9d84jAvBnoaRDHy0B4m+H2YCOq1rYT 2kMhzdkX/Rr9y76JbebUf7cRahMk0UQcqCOfpSQXXPdi69Fl9WYoNUQGZADRBIoJYzEb IW4qVUFGP0bPtVvzkngKhv6NiWx0MK2U96Ndv1Zy3XcukLBpglaY41cv01MPup0fY/3l adiA== X-Gm-Message-State: APf1xPCQOupzd1idJ5YSd/g1GTALMaVGwkiAiWEDaQB5VIn4wPWqPv7v 928G7WD/GdBpseOFWVjhaX2BveriJts= X-Received: by 10.200.17.1 with SMTP id c1mr19277812qtj.150.1518439354199; Mon, 12 Feb 2018 04:42:34 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH v4 3/4] linux: Consolidate sigaction implementation Date: Mon, 12 Feb 2018 10:42:24 -0200 Message-Id: <1518439345-6013-3-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1518439345-6013-1-git-send-email-adhemerval.zanella@linaro.org> References: <1518439345-6013-1-git-send-email-adhemerval.zanella@linaro.org> This patch consolidates all Linux sigaction implementation on a default one at sysdeps/unix/sysv/linux/sigaction.c. The idea is remove redundant code and simplify new ports addition by following the current generic Linux User API (UAPI). The UAPI for new ports defines a generic extensible sigaction struct as: struct sigaction { __sighandler_t sa_handler; unsigned long sa_flags; #ifdef SA_RESTORER void (*sa_restorer) (void); #endif sigset_t sa_mask; }; Where SA_RESTORER is just placed to compatibility reasons, news ports should not add it. A similar definition is used on generic kernel_sigaction.h. The user exported sigaction definition is not changed, so for most architectures it requires an adjustment to kernel expected one for the syscall. The main changes are: - All architectures now define and use a kernel_sigaction struct meant for the syscall, even for the architectures where the user sigaction has the same layout of the kernel expected one (s390-64 and ia64). Although it requires more work for these architectures, it simplifies the generic implementation. Also, sigaction is hardly a hotspot where micro optimization would play an important role. - The generic kernel_sigaction definition is now aligned with expected UAPI one for newer ports, where SA_RESTORER and sa_restorer is not expected to be defined. This means adding kernel_sigaction for current architectures that does define it (m68k, nios2, powerpc, s390, sh, sparc, and tile) and which rely on previous generic definition. - Remove old MIPS usage of sa_restorer. This was removed since 2.6.27 (2957c9e61ee9c - "[MIPS] IRIX: Goodbye and thanks for all the fish"). So for new ports the generic implementation should work if its uses Linux UAPI. If SA_RESTORER is still required (due some architecture limitation), it should define its own kernel_sigaction.h, define it and include generic header (assuming it still uses the default generic kernel layout). Checked on x86_64-linux-gnu, i686-linux-gnu, arm-linux-gnueabihf, aarch64-linux-gnu, sparc64-linux-gnu, sparcv9-linux-gnu, powerpc-linux-gnu, and powerpc64-linux-gnu. I also check the build on all remaining affected ABIs. * sysdeps/unix/sysv/linux/aarch64/sigaction.c: Use default Linux version as base implementation. * sysdeps/unix/sysv/linux/arm/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/i386/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h: Add include guards, remove unrequired definitions and update comments. * sysdeps/unix/sysv/linux/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/mips/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/ia64/kernel_sigaction.h: New file. * sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/kernel_sigaction: Likewise. * sysdeps/unix/sysv/linux/s390/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/sh/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/tile/kernel_sigaction.h: Likewise. * sysdeps/unix/sysv/linux/ia64/sigaction.c: Remove file. * sysdeps/unix/sysv/linux/mips/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/sigaction.c: Add STUB, SET_SA_RESTORER, and RESET_SA_RESTORER hooks. Signed-off-by: Adhemerval Zanella --- ChangeLog | 25 +++++ sysdeps/unix/sysv/linux/aarch64/sigaction.c | 58 ++--------- sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h | 21 ++-- sysdeps/unix/sysv/linux/arm/sigaction.c | 79 +++----------- sysdeps/unix/sysv/linux/i386/sigaction.c | 76 +++----------- sysdeps/unix/sysv/linux/ia64/kernel_sigaction.h | 6 ++ sysdeps/unix/sysv/linux/ia64/sigaction.c | 45 -------- sysdeps/unix/sysv/linux/kernel_sigaction.h | 31 +++--- sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h | 22 ++++ sysdeps/unix/sysv/linux/mips/kernel_sigaction.h | 48 ++------- sysdeps/unix/sysv/linux/mips/sigaction.c | 116 --------------------- sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h | 8 ++ sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h | 8 ++ sysdeps/unix/sysv/linux/s390/kernel_sigaction.h | 28 +++++ sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c | 43 -------- sysdeps/unix/sysv/linux/sh/kernel_sigaction.h | 8 ++ sysdeps/unix/sysv/linux/sigaction.c | 28 ++--- sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h | 10 ++ sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c | 41 +------- sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c | 43 +------- sysdeps/unix/sysv/linux/tile/kernel_sigaction.h | 9 ++ sysdeps/unix/sysv/linux/x86_64/sigaction.c | 61 ++--------- 22 files changed, 230 insertions(+), 584 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/ia64/kernel_sigaction.h delete mode 100644 sysdeps/unix/sysv/linux/ia64/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h delete mode 100644 sysdeps/unix/sysv/linux/mips/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h create mode 100644 sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h create mode 100644 sysdeps/unix/sysv/linux/s390/kernel_sigaction.h delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/sh/kernel_sigaction.h create mode 100644 sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h create mode 100644 sysdeps/unix/sysv/linux/tile/kernel_sigaction.h -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/aarch64/sigaction.c b/sysdeps/unix/sysv/linux/aarch64/sigaction.c index 73f4eb7..83d5b4f 100644 --- a/sysdeps/unix/sysv/linux/aarch64/sigaction.c +++ b/sysdeps/unix/sysv/linux/aarch64/sigaction.c @@ -1,5 +1,4 @@ /* Copyright (C) 1997-2018 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 @@ -16,55 +15,16 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include - -#include -#include - +/* Required for AArch32 compatibility. */ #define SA_RESTORER 0x04000000 -/* The difference here is that the sigaction structure used in the - kernel is not the same as we use in the libc. Therefore we must - translate it here. */ -#include - -int -__libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact) -{ - int result; - struct kernel_sigaction kact; - struct kernel_sigaction 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; -#ifdef HAVE_SA_RESTORER - if (kact.sa_flags & SA_RESTORER) - kact.sa_restorer = act->sa_restorer; -#endif - } +#define SET_SA_RESTORER(kact, act) \ + ({ \ + if ((kact)->sa_flags & SA_RESTORER) \ + (kact)->sa_restorer = (act)->sa_restorer; \ + }) - result = INLINE_SYSCALL (rt_sigaction, 4, sig, - act ? &kact : NULL, - oact ? &koact : NULL, _NSIG / 8); - if (result >= 0 || errno != ENOSYS) - { - 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; -#ifdef HAVE_SA_RESTORER - oact->sa_restorer = koact.sa_restorer; -#endif - } - } - return result; -} -libc_hidden_def (__libc_sigaction) +#define RESET_SA_RESTORER(act, kact) \ + (act)->sa_restorer = (kact)->sa_restorer; -#include +#include diff --git a/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h b/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h index 4c35d96..25180ff 100644 --- a/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h @@ -1,15 +1,12 @@ -/* This is the sigaction struction from the Linux 2.1.20 kernel. */ +#ifndef _KERNEL_SIGACTION_H +# define _KERNEL_SIGACTION_H -struct old_kernel_sigaction { - __sighandler_t k_sa_handler; - unsigned long sa_mask; - unsigned int sa_flags; +/* This is the sigaction structure from the Linux 3.2 kernel. */ +struct kernel_sigaction +{ + __sighandler_t k_sa_handler; + unsigned int sa_flags; + sigset_t sa_mask; }; -/* This is the sigaction structure from the Linux 2.1.68 kernel. */ - -struct kernel_sigaction { - __sighandler_t k_sa_handler; - unsigned int sa_flags; - sigset_t sa_mask; -}; +#endif diff --git a/sysdeps/unix/sysv/linux/arm/sigaction.c b/sysdeps/unix/sysv/linux/arm/sigaction.c index e4d80de..c828250 100644 --- a/sysdeps/unix/sysv/linux/arm/sigaction.c +++ b/sysdeps/unix/sysv/linux/arm/sigaction.c @@ -15,70 +15,25 @@ License along with the GNU C Library. If not, see . */ -#include -#include -#include - -#include -#include - -/* The difference here is that the sigaction structure used in the - kernel is not the same as we use in the libc. Therefore we must - translate it here. */ -#include - #define SA_RESTORER 0x04000000 extern void __default_sa_restorer (void); extern void __default_rt_sa_restorer (void); -/* When RT signals are in use we need to use a different return stub. */ -#define choose_restorer(flags) \ - (flags & SA_SIGINFO) ? __default_rt_sa_restorer \ - : __default_sa_restorer - -/* 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; -#ifdef HAVE_SA_RESTORER - if (kact.sa_flags & SA_RESTORER) - kact.sa_restorer = act->sa_restorer; - else - { - kact.sa_restorer = choose_restorer (kact.sa_flags); - kact.sa_flags |= SA_RESTORER; - } -#endif - } - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - result = INLINE_SYSCALL (rt_sigaction, 4, sig, - act ? &kact : NULL, - oact ? &koact : NULL, _NSIG / 8); - - 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; -#ifdef HAVE_SA_RESTORER - oact->sa_restorer = koact.sa_restorer; -#endif - } - return result; -} -libc_hidden_def (__libc_sigaction) - -#include +#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/sigaction.c b/sysdeps/unix/sysv/linux/i386/sigaction.c index a5eb9e0..137c73b 100644 --- a/sysdeps/unix/sysv/linux/i386/sigaction.c +++ b/sysdeps/unix/sysv/linux/i386/sigaction.c @@ -16,78 +16,28 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include #include -#include - -#include -#include #include -/* The difference here is that the sigaction structure used in the - kernel is not the same as we use in the libc. Therefore we must - translate it here. */ -#include - -/* We do not globally define the SA_RESTORER flag so do it here. */ #define SA_RESTORER 0x04000000 - -/* Using the hidden attribute here does not change the code but it - helps to avoid warnings. */ -#ifdef __NR_rt_sigaction extern void restore_rt (void) asm ("__restore_rt") attribute_hidden; -#endif 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); \ + } \ + }) -/* 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; - kact.sa_flags = act->sa_flags; - memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); - - if (GLRO(dl_sysinfo_dso) == NULL) - { - kact.sa_flags |= SA_RESTORER; - - kact.sa_restorer = ((act->sa_flags & SA_SIGINFO) - ? &restore_rt : &restore); - } - } - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - INTERNAL_SYSCALL_DECL (err); - result = INTERNAL_SYSCALL (rt_sigaction, err, 4, - sig, act ? &kact : NULL, - oact ? &koact : NULL, _NSIG / 8); - if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err))) - return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (result, - err)); - else 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; - oact->sa_restorer = koact.sa_restorer; - } - return result; -} -libc_hidden_def (__libc_sigaction) +#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 @@ -108,10 +58,8 @@ asm \ " int $0x80" \ ); -#ifdef __NR_rt_sigaction /* The return code for realtime-signals. */ RESTORE (restore_rt, __NR_rt_sigreturn) -#endif /* For the boring old signals. */ #undef RESTORE2 diff --git a/sysdeps/unix/sysv/linux/ia64/kernel_sigaction.h b/sysdeps/unix/sysv/linux/ia64/kernel_sigaction.h new file mode 100644 index 0000000..05813db --- /dev/null +++ b/sysdeps/unix/sysv/linux/ia64/kernel_sigaction.h @@ -0,0 +1,6 @@ +/* This is the sigaction structure from the Linux 3.2 kernel. */ +struct kernel_sigaction { + __sighandler_t k_sa_handler; + unsigned long sa_flags; + sigset_t sa_mask; /* mask last for extensibility */ +}; diff --git a/sysdeps/unix/sysv/linux/ia64/sigaction.c b/sysdeps/unix/sysv/linux/ia64/sigaction.c deleted file mode 100644 index e7fb8cd..0000000 --- a/sysdeps/unix/sysv/linux/ia64/sigaction.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 1997-2018 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Linux/IA64 specific sigaction - Written by Jes Sorensen, , April 1999. - - 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 - . */ - -/* Linux/ia64 only has rt signals, thus we do not even want to try falling - back to the old style signals as the default Linux handler does. */ - -#include -#include -#include - -#include -#include - -/* The variable is shared between all wrappers around signal handling - functions which have RT equivalents. This is the definition. */ - - -/* 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) -{ - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - return INLINE_SYSCALL (rt_sigaction, 4, sig, act, oact, _NSIG / 8); -} -libc_hidden_def (__libc_sigaction) - -#include diff --git a/sysdeps/unix/sysv/linux/kernel_sigaction.h b/sysdeps/unix/sysv/linux/kernel_sigaction.h index d005cbc..2dbec08 100644 --- a/sysdeps/unix/sysv/linux/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/kernel_sigaction.h @@ -1,19 +1,20 @@ -/* This is the sigaction structure from the Linux 2.1.20 kernel. */ +#ifndef _KERNEL_SIGACTION_H +# define _KERNEL_SIGACTION_H -#define HAVE_SA_RESTORER - -struct old_kernel_sigaction { - __sighandler_t k_sa_handler; - unsigned long sa_mask; - unsigned long sa_flags; - void (*sa_restorer) (void); +/* 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 + void (*sa_restorer) (void); +#endif + sigset_t sa_mask; }; -/* This is the sigaction structure from the Linux 2.1.68 kernel. */ +#ifndef SA_RESTORER +# define SET_SA_RESTORER(kact, act) +# define RESET_SA_RESTORER(act, kact) +#endif -struct kernel_sigaction { - __sighandler_t k_sa_handler; - unsigned long sa_flags; - void (*sa_restorer) (void); - sigset_t sa_mask; -}; +#endif diff --git a/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h b/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h new file mode 100644 index 0000000..54972fe --- /dev/null +++ b/sysdeps/unix/sysv/linux/m68k/kernel_sigaction.h @@ -0,0 +1,22 @@ +#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 diff --git a/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h b/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h index b6f52cc..beef976 100644 --- a/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h +++ b/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h @@ -1,40 +1,12 @@ -/* This is the sigaction structure from the Linux 2.1.24 kernel. */ - -#include - -#define HAVE_SA_RESTORER - -struct old_kernel_sigaction { - unsigned int sa_flags; - __sighandler_t k_sa_handler; - unsigned long sa_mask; - unsigned int __pad0[3]; /* reserved, keep size constant */ - - /* Abi says here follows reserved int[2] */ - void (*sa_restorer)(void); -#if (_MIPS_SZPTR < 64) - /* - * For 32 bit code we have to pad struct sigaction to get - * constant size for the ABI - */ - int pad1[1]; /* reserved */ -#endif +#ifndef _KERNEL_SIGACTION_H +# define _KERNEL_SIGACTION_H + +/* This is the sigaction structure from the Linux 3.2 kernel. */ +struct kernel_sigaction +{ + unsigned int sa_flags; + __sighandler_t k_sa_handler; + sigset_t sa_mask; }; - -#define _KERNEL_NSIG 128 -#define _KERNEL_NSIG_BPW _MIPS_SZLONG -#define _KERNEL_NSIG_WORDS (_KERNEL_NSIG / _KERNEL_NSIG_BPW) - -typedef struct { - unsigned long sig[_KERNEL_NSIG_WORDS]; -} kernel_sigset_t; - -/* This is the sigaction structure from the Linux 2.1.68 kernel. */ -struct kernel_sigaction { - unsigned int sa_flags; - __sighandler_t k_sa_handler; - kernel_sigset_t sa_mask; - void (*sa_restorer)(void); - int s_resv[1]; /* reserved */ -}; +#endif diff --git a/sysdeps/unix/sysv/linux/mips/sigaction.c b/sysdeps/unix/sysv/linux/mips/sigaction.c deleted file mode 100644 index 008b688..0000000 --- a/sysdeps/unix/sysv/linux/mips/sigaction.c +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 1997-2018 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 -#include - -#include - -/* The difference here is that the sigaction structure used in the - kernel is not the same as we use in the libc. Therefore we must - translate it here. */ -#include - -#if _MIPS_SIM != _ABIO32 - -# ifdef __NR_rt_sigreturn -static void restore_rt (void) asm ("__restore_rt"); -# endif -# ifdef __NR_sigreturn -static void restore (void) asm ("__restore"); -# endif -#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 (kernel_sigset_t)); - kact.sa_flags = act->sa_flags; -#ifdef HAVE_SA_RESTORER -# if _MIPS_SIM == _ABIO32 - kact.sa_restorer = act->sa_restorer; -# else - kact.sa_restorer = &restore_rt; -# endif -#endif - } - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - result = INLINE_SYSCALL (rt_sigaction, 4, sig, - act ? &kact : NULL, - oact ? &koact : NULL, - sizeof (kernel_sigset_t)); - - if (oact && result >= 0) - { - oact->sa_handler = koact.k_sa_handler; - memcpy (&oact->sa_mask, &koact.sa_mask, - sizeof (kernel_sigset_t)); - oact->sa_flags = koact.sa_flags; -#ifdef HAVE_SA_RESTORER - oact->sa_restorer = koact.sa_restorer; -#endif - } - return result; -} -libc_hidden_def (__libc_sigaction) - -#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. */ - -#define RESTORE(name, syscall) RESTORE2 (name, syscall) -#define RESTORE2(name, syscall) \ -asm \ - ( \ - ".align 4\n" \ - "__" #name ":\n" \ - " li $2, " #syscall "\n" \ - " syscall\n" \ - ); - -/* The return code for realtime-signals. */ -#if _MIPS_SIM != _ABIO32 -# ifdef __NR_rt_sigreturn -RESTORE (restore_rt, __NR_rt_sigreturn) -# endif -# ifdef __NR_sigreturn -RESTORE (restore, __NR_sigreturn) -# endif -#endif diff --git a/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h b/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h new file mode 100644 index 0000000..4ada322 --- /dev/null +++ b/sysdeps/unix/sysv/linux/nios2/kernel_sigaction.h @@ -0,0 +1,8 @@ +/* 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 diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h new file mode 100644 index 0000000..c5213f2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/kernel_sigaction.h @@ -0,0 +1,8 @@ +/* powerpc kernel sigaction is similar to generic Linux UAPI one. */ +#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 diff --git a/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h b/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h new file mode 100644 index 0000000..a8beaf7 --- /dev/null +++ b/sysdeps/unix/sysv/linux/s390/kernel_sigaction.h @@ -0,0 +1,28 @@ +#include + +#define SA_RESTORER 0x04000000 + +/* This is the sigaction structure from the Linux 3.2 kernel. */ +struct kernel_sigaction +{ + union + { + __sighandler_t _sa_handler; + void (*_sa_sigaction)(int, siginfo_t *, void *); + } _u; +#define k_sa_handler _u._sa_handler +#ifndef __s390x__ + sigset_t sa_mask; + unsigned long sa_flags; + void (*sa_restorer)(void); +#else + unsigned long sa_flags; + void (*sa_restorer)(void); + sigset_t sa_mask; +#endif +}; + +#define SET_SA_RESTORER(kact, act) \ + (kact)->sa_restorer = (act)->sa_restorer +#define RESET_SA_RESTORER(act, kact) \ + (act)->sa_restorer = (kact)->sa_restorer diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c b/sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c deleted file mode 100644 index c13927c..0000000 --- a/sysdeps/unix/sysv/linux/s390/s390-64/sigaction.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 2001-2018 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 - . */ - -/* 64 bit Linux for S/390 only has rt signals, thus we do not even want to try - falling back to the old style signals as the default Linux handler does. */ - -#include -#include -#include - -#include -#include - -/* The variable is shared between all wrappers around signal handling - functions which have RT equivalents. This is the definition. */ - - -/* 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) -{ - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - return INLINE_SYSCALL (rt_sigaction, 4, sig, act, oact, _NSIG / 8); -} -libc_hidden_def (__libc_sigaction) - -#include diff --git a/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h new file mode 100644 index 0000000..7ebcd08 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/kernel_sigaction.h @@ -0,0 +1,8 @@ +/* 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 diff --git a/sysdeps/unix/sysv/linux/sigaction.c b/sysdeps/unix/sysv/linux/sigaction.c index 40a311a..0e6851a 100644 --- a/sysdeps/unix/sysv/linux/sigaction.c +++ b/sysdeps/unix/sysv/linux/sigaction.c @@ -22,11 +22,19 @@ #include #include -/* The difference here is that the sigaction structure used in the - kernel is not the same as we use in the libc. Therefore we must - translate it here. */ +/* 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) +#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. */ @@ -42,25 +50,21 @@ __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact) kact.k_sa_handler = act->sa_handler; memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); kact.sa_flags = act->sa_flags; -#ifdef HAVE_SA_RESTORER - kact.sa_restorer = act->sa_restorer; -#endif + 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 (rt_sigaction, 4, sig, - act ? &kact : NULL, - oact ? &koact : NULL, _NSIG / 8); + result = INLINE_SYSCALL_CALL (rt_sigaction, sig, + act ? &kact : NULL, + oact ? &koact : NULL, STUB(act) _NSIG / 8); 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; -#ifdef HAVE_SA_RESTORER - oact->sa_restorer = koact.sa_restorer; -#endif + RESET_SA_RESTORER (oact, &koact); } return result; } diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h new file mode 100644 index 0000000..bee7e9c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h @@ -0,0 +1,10 @@ +/* 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 +#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/sparc/sparc32/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c index 204a5d8..c1d8f45 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c @@ -27,43 +27,12 @@ static void __rt_sigreturn_stub (void); static void __sigreturn_stub (void); -int -__libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact) -{ - struct kernel_sigaction kact, koact; - unsigned long stub = 0; - int ret; - - if (act) - { - kact.k_sa_handler = act->sa_handler; - memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); - if (((kact.sa_flags = act->sa_flags) & SA_SIGINFO) != 0) - stub = (unsigned long) &__rt_sigreturn_stub; - else - stub = (unsigned long) &__sigreturn_stub; - stub -= 8; - kact.sa_restorer = NULL; - } - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - ret = INLINE_SYSCALL (rt_sigaction, 5, sig, act ? &kact : 0, - oact ? &koact : 0, stub, _NSIG / 8); - - if (oact && ret >= 0) - { - oact->sa_handler = koact.k_sa_handler; - memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t)); - oact->sa_flags = koact.sa_flags; - oact->sa_restorer = koact.sa_restorer; - } - return ret; -} -libc_hidden_def (__libc_sigaction) - -#include +#define STUB(act) \ + ((unsigned long)((act->sa_flags & SA_SIGINFO) \ + ? &__rt_sigreturn_stub \ + : &__sigreturn_stub) - 8), +#include static inhibit_stack_protector diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c index 73cda4c..cfbbc6e 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c @@ -21,50 +21,13 @@ #include #include #include -#include -#include - -#include - -/* SPARC 64bit userland requires a kernel that has rt signals anyway. */ static void __rt_sigreturn_stub (void); -int -__libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact) -{ - int ret; - struct kernel_sigaction kact, koact; - unsigned long stub = ((unsigned long) &__rt_sigreturn_stub) - 8; - - 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; - kact.sa_restorer = NULL; - } - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - ret = INLINE_SYSCALL (rt_sigaction, 5, sig, - act ? &kact : 0, - oact ? &koact : 0, stub, _NSIG / 8); - - if (oact && ret >= 0) - { - oact->sa_handler = koact.k_sa_handler; - memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t)); - oact->sa_flags = koact.sa_flags; - oact->sa_restorer = koact.sa_restorer; - } - - return ret; -} -libc_hidden_def (__libc_sigaction) - -#include +#define STUB(act) \ + (((unsigned long) &__rt_sigreturn_stub) - 8), +#include static inhibit_stack_protector diff --git a/sysdeps/unix/sysv/linux/tile/kernel_sigaction.h b/sysdeps/unix/sysv/linux/tile/kernel_sigaction.h new file mode 100644 index 0000000..a943d52 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tile/kernel_sigaction.h @@ -0,0 +1,9 @@ +/* tile kernel sigaction is similar to generic Linux UAPI one + and SA_RESTORER is used only for binary compatibility. */ +#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 diff --git a/sysdeps/unix/sysv/linux/x86_64/sigaction.c b/sysdeps/unix/sysv/linux/x86_64/sigaction.c index 2f7459f..4e6d9cc 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sigaction.c +++ b/sysdeps/unix/sysv/linux/x86_64/sigaction.c @@ -16,65 +16,20 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include #include -#include - -#include -#include - -/* The difference here is that the sigaction structure used in the - kernel is not the same as we use in the libc. Therefore we must - translate it here. */ -#include - -#include "ucontext_i.h" - -/* We do not globally define the SA_RESTORER flag so do it here. */ #define SA_RESTORER 0x04000000 +#include -/* Using the hidden attribute here does not change the code but it - helps to avoid warnings. */ 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 -/* 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 | SA_RESTORER; - - kact.sa_restorer = &restore_rt; - } - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - result = INLINE_SYSCALL (rt_sigaction, 4, - sig, act ? &kact : NULL, - oact ? &koact : NULL, _NSIG / 8); - 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; - oact->sa_restorer = koact.sa_restorer; - } - return result; -} -libc_hidden_def (__libc_sigaction) - -#include +#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 @@ -93,6 +48,8 @@ libc_hidden_def (__libc_sigaction) 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 */ \