diff options
author | Ludovic Courtès <ludo@gnu.org> | 2021-04-09 14:17:24 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2021-04-09 14:19:34 +0200 |
commit | 87961fc965b96ac0c7a5909ac2faab2d023b5339 (patch) | |
tree | eaaac205b9bbe3ef40635897fd88716950959d06 /gnu | |
parent | 4863c4304e7d4d5945474e771d242878f8339d44 (diff) | |
download | guix-87961fc965b96ac0c7a5909ac2faab2d023b5339.tar.gz |
gnu: glibc: Update to 2.33.
* gnu/packages/base.scm (glibc): Update to 2.33. [source]: Remove "glibc-hurd-signal-sa-siginfo.patch", now upstream. * gnu/packages/patches/glibc-hurd-clock_gettime_monotonic.patch: Update. * gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch: Remove. * gnu/local.mk (dist_patch_DATA): Adjust accordingly.
Diffstat (limited to 'gnu')
-rw-r--r-- | gnu/local.mk | 1 | ||||
-rw-r--r-- | gnu/packages/base.scm | 5 | ||||
-rw-r--r-- | gnu/packages/patches/glibc-hurd-clock_gettime_monotonic.patch | 19 | ||||
-rw-r--r-- | gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch | 637 |
4 files changed, 11 insertions, 651 deletions
diff --git a/gnu/local.mk b/gnu/local.mk index 068aeb77cf..f9996e6fa1 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1097,7 +1097,6 @@ dist_patch_DATA = \ %D%/packages/patches/glibc-hurd-gettyent.patch \ %D%/packages/patches/glibc-hurd-mach-print.patch \ %D%/packages/patches/glibc-hurd-magic-pid.patch \ - %D%/packages/patches/glibc-hurd-signal-sa-siginfo.patch \ %D%/packages/patches/glibc-ldd-powerpc.patch \ %D%/packages/patches/glibc-ldd-x86_64.patch \ %D%/packages/patches/glibc-locales.patch \ diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index dbb7c619fe..ee1ab1bcad 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -671,13 +671,13 @@ the store.") ;; version 2.28, GNU/Hurd used a different glibc branch. (package (name "glibc") - (version "2.32") + (version "2.33") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/glibc/glibc-" version ".tar.xz")) (sha256 (base32 - "0di848ibffrnwq7g2dvgqrnn4xqhj3h96csn69q4da51ymafl9qn")) + "1zvp0qdfbdyqrzydz18d9zg3n5ygy8ps7cmny1bvsp8h1q05c99f")) (patches (search-patches "glibc-ldd-powerpc.patch" "glibc-ldd-x86_64.patch" "glibc-dl-cache.patch" @@ -688,7 +688,6 @@ the store.") "glibc-supported-locales.patch" "glibc-hurd-clock_t_centiseconds.patch" "glibc-hurd-clock_gettime_monotonic.patch" - "glibc-hurd-signal-sa-siginfo.patch" "glibc-hurd-mach-print.patch" "glibc-hurd-gettyent.patch")))) (build-system gnu-build-system) diff --git a/gnu/packages/patches/glibc-hurd-clock_gettime_monotonic.patch b/gnu/packages/patches/glibc-hurd-clock_gettime_monotonic.patch index 1c3fe427f9..e31f99a1ce 100644 --- a/gnu/packages/patches/glibc-hurd-clock_gettime_monotonic.patch +++ b/gnu/packages/patches/glibc-hurd-clock_gettime_monotonic.patch @@ -24,18 +24,17 @@ Subject: [PATCH 2/2] Use realtime clock for the monotonic clock. 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/sysdeps/mach/clock_gettime.c b/sysdeps/mach/clock_gettime.c -index ac3547df3c..af8681ba4e 100644 +index 6862fc8c..be1449bf 100644 --- a/sysdeps/mach/clock_gettime.c +++ b/sysdeps/mach/clock_gettime.c -@@ -25,7 +25,7 @@ - int - __clock_gettime (clockid_t clock_id, struct timespec *ts) - { -- if (clock_id != CLOCK_REALTIME) -+ if (clock_id != CLOCK_MONOTONIC && clock_id != CLOCK_REALTIME) - { - errno = EINVAL; - return -1; +@@ -32,6 +32,7 @@ __clock_gettime (clockid_t clock_id, struct timespec *ts) + switch (clock_id) { + + case CLOCK_REALTIME: ++ case CLOCK_MONOTONIC: + { + /* __host_get_time can only fail if passed an invalid host_t. + __mach_host_self could theoretically fail (producing an diff --git a/sysdeps/mach/hurd/bits/posix_opt.h b/sysdeps/mach/hurd/bits/posix_opt.h index 0050151332..27b3a28ab7 100644 --- a/sysdeps/mach/hurd/bits/posix_opt.h diff --git a/gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch b/gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch deleted file mode 100644 index 36ea55e188..0000000000 --- a/gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch +++ /dev/null @@ -1,637 +0,0 @@ -This patch is needed to build e2fsprogs, util-linux. - -Taken from https://salsa.debian.org/glibc-team/glibc/-/blob/glibc-2.31/debian/patches/hurd-i386/tg-hurdsig-SA_SIGINFO.diff - -From: Jeremie Koenig <jk@jk.fr.eu.org> -Subject: [PATCH] implement SA_SIGINFO signal handlers. - - 52baaca Hurd signals: Copy bits/sigaction.h - 4232c66 Hurd signals: SA_SIGINFO support - 1831cfe Hurd signals: Use POSIX sigcodes - ---- - hurd/hurd/signal.h | 5 + - hurd/hurdfault.c | 2 - hurd/hurdinit.c | 2 - hurd/hurdsig.c | 6 - - sysdeps/mach/hurd/bits/sigaction.h | 86 +++++++++++++++++++++ - sysdeps/mach/hurd/i386/bits/sigcontext.h | 4 - sysdeps/mach/hurd/i386/exc2signal.c | 123 +++++++++++++++++++----------- - sysdeps/mach/hurd/i386/trampoline.c | 125 ++++++++++++++++++++++++++++--- - sysdeps/mach/hurd/kill.c | 2 - sysdeps/mach/hurd/setitimer.c | 2 - 10 files changed, 293 insertions(+), 64 deletions(-) - -Index: glibc-2.31/hurd/hurd/signal.h -=================================================================== ---- glibc-2.31.orig/hurd/hurd/signal.h -+++ glibc-2.31/hurd/hurd/signal.h -@@ -290,6 +290,11 @@ extern int _hurd_raise_signal (struct hu - extern void _hurd_exception2signal (struct hurd_signal_detail *detail, - int *signo); - -+/* Translate a Mach exception into a signal with a legacy sigcode. */ -+ -+extern void _hurd_exception2signal_legacy (struct hurd_signal_detail *detail, -+ int *signo); -+ - - /* Make the thread described by SS take the signal described by SIGNO and - DETAIL. If the process is traced, this will in fact stop with a SIGNO -Index: glibc-2.31/hurd/hurdfault.c -=================================================================== ---- glibc-2.31.orig/hurd/hurdfault.c -+++ glibc-2.31/hurd/hurdfault.c -@@ -70,7 +70,7 @@ _hurdsig_fault_catch_exception_raise (ma - codes into a signal number and subcode. */ - _hurd_exception2signal (&d, &signo); - -- return HURD_PREEMPT_SIGNAL_P (&_hurdsig_fault_preemptor, signo, d.code) -+ return HURD_PREEMPT_SIGNAL_P (&_hurdsig_fault_preemptor, signo, d.exc_subcode) - ? 0 : EGREGIOUS; - } - -Index: glibc-2.31/hurd/hurdinit.c -=================================================================== ---- glibc-2.31.orig/hurd/hurdinit.c -+++ glibc-2.31/hurd/hurdinit.c -@@ -177,7 +177,7 @@ _hurd_new_proc_init (char **argv, - /* This process is "traced", meaning it should stop on signals or exec. - We are all set up now to handle signals. Stop ourselves, to inform - our parent (presumably a debugger) that the exec has completed. */ -- __msg_sig_post (_hurd_msgport, SIGTRAP, 0, __mach_task_self ()); -+ __msg_sig_post (_hurd_msgport, SIGTRAP, TRAP_TRACE, __mach_task_self ()); - } - - #include <shlib-compat.h> -Index: glibc-2.31/hurd/hurdsig.c -=================================================================== ---- glibc-2.31.orig/hurd/hurdsig.c -+++ glibc-2.31/hurd/hurdsig.c -@@ -730,7 +730,7 @@ post_signal (struct hurd_sigstate *ss, - { /* PE cannot be null. */ - do - { -- if (HURD_PREEMPT_SIGNAL_P (pe, signo, detail->code)) -+ if (HURD_PREEMPT_SIGNAL_P (pe, signo, detail->exc_subcode)) - { - if (pe->preemptor) - { -@@ -1374,7 +1374,7 @@ _S_msg_sig_post (mach_port_t me, - if (err = signal_allowed (signo, refport)) - return err; - -- d.code = sigcode; -+ d.code = d.exc_subcode = sigcode; - d.exc = 0; - - /* Post the signal to a global receiver thread (or mark it pending in -@@ -1403,7 +1403,7 @@ _S_msg_sig_post_untraced (mach_port_t me - if (err = signal_allowed (signo, refport)) - return err; - -- d.code = sigcode; -+ d.code = d.exc_subcode = sigcode; - d.exc = 0; - - /* Post the signal to the designated signal-receiving thread. This will -Index: glibc-2.31/sysdeps/mach/hurd/bits/sigaction.h -=================================================================== ---- /dev/null -+++ glibc-2.31/sysdeps/mach/hurd/bits/sigaction.h -@@ -0,0 +1,86 @@ -+/* Copyright (C) 1991-2015 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#ifndef _BITS_SIGACTION_H -+#define _BITS_SIGACTION_H 1 -+ -+#ifndef _SIGNAL_H -+# error "Never include <bits/sigaction.h> directly; use <signal.h> instead." -+#endif -+ -+/* These definitions match those used by the 4.4 BSD kernel. -+ If the operating system has a `sigaction' system call that correctly -+ implements the POSIX.1 behavior, there should be a system-dependent -+ version of this file that defines `struct sigaction' and the `SA_*' -+ constants appropriately. */ -+ -+/* Structure describing the action to be taken when a signal arrives. */ -+struct sigaction -+ { -+ /* Signal handler. */ -+#if defined __USE_POSIX199309 || defined __USE_XOPEN_EXTENDED -+ union -+ { -+ /* Used if SA_SIGINFO is not set. */ -+ __sighandler_t sa_handler; -+ /* Used if SA_SIGINFO is set. */ -+ void (*sa_sigaction) (int, siginfo_t *, void *); -+ } -+ __sigaction_handler; -+# define sa_handler __sigaction_handler.sa_handler -+# define sa_sigaction __sigaction_handler.sa_sigaction -+#else -+ __sighandler_t sa_handler; -+#endif -+ -+ /* Additional set of signals to be blocked. */ -+ __sigset_t sa_mask; -+ -+ /* Special flags. */ -+ int sa_flags; -+ }; -+ -+/* Bits in `sa_flags'. */ -+#if defined __USE_XOPEN_EXTENDED || defined __USE_MISC -+# define SA_ONSTACK 0x0001 /* Take signal on signal stack. */ -+#endif -+#if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8 -+# define SA_RESTART 0x0002 /* Restart syscall on signal return. */ -+# define SA_NODEFER 0x0010 /* Don't automatically block the signal when -+ its handler is being executed. */ -+# define SA_RESETHAND 0x0004 /* Reset to SIG_DFL on entry to handler. */ -+#endif -+#define SA_NOCLDSTOP 0x0008 /* Don't send SIGCHLD when children stop. */ -+#define SA_SIGINFO 0x0040 /* Signal handler with SA_SIGINFO args */ -+ -+#ifdef __USE_MISC -+# define SA_INTERRUPT 0 /* Historical no-op ("not SA_RESTART"). */ -+ -+/* Some aliases for the SA_ constants. */ -+# define SA_NOMASK SA_NODEFER -+# define SA_ONESHOT SA_RESETHAND -+# define SA_STACK SA_ONSTACK -+#endif -+ -+ -+/* Values for the HOW argument to `sigprocmask'. */ -+#define SIG_BLOCK 1 /* Block signals. */ -+#define SIG_UNBLOCK 2 /* Unblock signals. */ -+#define SIG_SETMASK 3 /* Set the set of blocked signals. */ -+ -+#endif -Index: glibc-2.31/sysdeps/mach/hurd/i386/bits/sigcontext.h -=================================================================== ---- glibc-2.31.orig/sysdeps/mach/hurd/i386/bits/sigcontext.h -+++ glibc-2.31/sysdeps/mach/hurd/i386/bits/sigcontext.h -@@ -97,6 +97,10 @@ struct sigcontext - #define sc_ps sc_efl - - -+/* The deprecated sigcode values below are passed as an extra, non-portable -+ argument to regular signal handlers. You should use SA_SIGINFO handlers -+ instead, which use the standard POSIX signal codes. */ -+ - /* Codes for SIGFPE. */ - #define FPE_INTOVF_TRAP 0x1 /* integer overflow */ - #define FPE_INTDIV_FAULT 0x2 /* integer divide by zero */ -Index: glibc-2.31/sysdeps/mach/hurd/i386/exc2signal.c -=================================================================== ---- glibc-2.31.orig/sysdeps/mach/hurd/i386/exc2signal.c -+++ glibc-2.31/sysdeps/mach/hurd/i386/exc2signal.c -@@ -23,8 +23,8 @@ - /* Translate the Mach exception codes, as received in an `exception_raise' RPC, - into a signal number and signal subcode. */ - --void --_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo) -+static void -+exception2signal (struct hurd_signal_detail *detail, int *signo, int posix) - { - detail->error = 0; - -@@ -36,44 +36,62 @@ _hurd_exception2signal (struct hurd_sign - break; - - case EXC_BAD_ACCESS: -- if (detail->exc_code == KERN_INVALID_ADDRESS -- || detail->exc_code == KERN_PROTECTION_FAILURE -- || detail->exc_code == KERN_WRITE_PROTECTION_FAILURE) -- *signo = SIGSEGV; -- else -- *signo = SIGBUS; -- detail->code = detail->exc_subcode; -+ switch (detail->exc_code) -+ { -+ case KERN_INVALID_ADDRESS: -+ case KERN_MEMORY_FAILURE: -+ *signo = SIGSEGV; -+ detail->code = posix ? SEGV_MAPERR : detail->exc_subcode; -+ break; -+ -+ case KERN_PROTECTION_FAILURE: -+ case KERN_WRITE_PROTECTION_FAILURE: -+ *signo = SIGSEGV; -+ detail->code = posix ? SEGV_ACCERR : detail->exc_subcode; -+ break; -+ -+ default: -+ *signo = SIGBUS; -+ detail->code = posix ? BUS_ADRERR : detail->exc_subcode; -+ break; -+ } - detail->error = detail->exc_code; - break; - - case EXC_BAD_INSTRUCTION: - *signo = SIGILL; -- if (detail->exc_code == EXC_I386_INVOP) -- detail->code = ILL_INVOPR_FAULT; -- else if (detail->exc_code == EXC_I386_STKFLT) -- detail->code = ILL_STACK_FAULT; -- else -- detail->code = 0; -+ switch (detail->exc_code) -+ { -+ case EXC_I386_INVOP: -+ detail->code = posix ? ILL_ILLOPC : ILL_INVOPR_FAULT; -+ break; -+ -+ case EXC_I386_STKFLT: -+ detail->code = posix ? ILL_BADSTK : ILL_STACK_FAULT; -+ break; -+ -+ default: -+ detail->code = 0; -+ break; -+ } - break; - - case EXC_ARITHMETIC: -+ *signo = SIGFPE; - switch (detail->exc_code) - { - case EXC_I386_DIV: /* integer divide by zero */ -- *signo = SIGFPE; -- detail->code = FPE_INTDIV_FAULT; -+ detail->code = posix ? FPE_INTDIV : FPE_INTDIV_FAULT; - break; - - case EXC_I386_INTO: /* integer overflow */ -- *signo = SIGFPE; -- detail->code = FPE_INTOVF_TRAP; -+ detail->code = posix ? FPE_INTOVF : FPE_INTOVF_TRAP; - break; - - /* These aren't anywhere documented or used in Mach 3.0. */ - case EXC_I386_NOEXT: - case EXC_I386_EXTOVR: - default: -- *signo = SIGFPE; - detail->code = 0; - break; - -@@ -82,51 +100,43 @@ _hurd_exception2signal (struct hurd_sign - Give an error code corresponding to the first bit set. */ - if (detail->exc_subcode & FPS_IE) - { -- *signo = SIGILL; -- detail->code = ILL_FPEOPR_FAULT; -+ /* NB: We used to send SIGILL here but we can't distinguish -+ POSIX vs. legacy with respect to what signal we send. */ -+ detail->code = posix ? FPE_FLTINV : 0 /*ILL_FPEOPR_FAULT*/; - } - else if (detail->exc_subcode & FPS_DE) - { -- *signo = SIGFPE; -- detail->code = FPE_FLTDNR_FAULT; -+ detail->code = posix ? FPE_FLTUND : FPE_FLTDNR_FAULT; - } - else if (detail->exc_subcode & FPS_ZE) - { -- *signo = SIGFPE; -- detail->code = FPE_FLTDIV_FAULT; -+ detail->code = posix ? FPE_FLTDIV : FPE_FLTDIV_FAULT; - } - else if (detail->exc_subcode & FPS_OE) - { -- *signo = SIGFPE; -- detail->code = FPE_FLTOVF_FAULT; -+ detail->code = posix ? FPE_FLTOVF : FPE_FLTOVF_FAULT; - } - else if (detail->exc_subcode & FPS_UE) - { -- *signo = SIGFPE; -- detail->code = FPE_FLTUND_FAULT; -+ detail->code = posix ? FPE_FLTUND : FPE_FLTUND_FAULT; - } - else if (detail->exc_subcode & FPS_PE) - { -- *signo = SIGFPE; -- detail->code = FPE_FLTINX_FAULT; -+ detail->code = posix ? FPE_FLTRES : FPE_FLTINX_FAULT; - } - else - { -- *signo = SIGFPE; - detail->code = 0; - } - break; - - /* These two can only be arithmetic exceptions if we -- are in V86 mode, which sounds like emulation to me. -- (See Mach 3.0 i386/trap.c.) */ -+ are in V86 mode. (See Mach 3.0 i386/trap.c.) */ - case EXC_I386_EMERR: -- *signo = SIGFPE; -- detail->code = FPE_EMERR_FAULT; -+ detail->code = posix ? 0 : FPE_EMERR_FAULT; - break; - case EXC_I386_BOUND: -- *signo = SIGFPE; -- detail->code = FPE_EMBND_FAULT; -+ detail->code = posix ? FPE_FLTSUB : FPE_EMBND_FAULT; - break; - } - break; -@@ -143,7 +153,7 @@ _hurd_exception2signal (struct hurd_sign - if (detail->exc_code == EXC_I386_BOUND) - { - *signo = SIGFPE; -- detail->code = FPE_SUBRNG_FAULT; -+ detail->code = posix ? FPE_FLTSUB : FPE_SUBRNG_FAULT; - } - else - { -@@ -154,13 +164,34 @@ _hurd_exception2signal (struct hurd_sign - - case EXC_BREAKPOINT: - *signo = SIGTRAP; -- if (detail->exc_code == EXC_I386_SGL) -- detail->code = DBG_SINGLE_TRAP; -- else if (detail->exc_code == EXC_I386_BPT) -- detail->code = DBG_BRKPNT_FAULT; -- else -- detail->code = 0; -+ switch (detail->exc_code) -+ { -+ case EXC_I386_SGL: -+ detail->code = posix ? TRAP_BRKPT : DBG_SINGLE_TRAP; -+ break; -+ -+ case EXC_I386_BPT: -+ detail->code = posix ? TRAP_BRKPT : DBG_BRKPNT_FAULT; -+ break; -+ -+ default: -+ detail->code = 0; -+ break; -+ } - break; - } - } - libc_hidden_def (_hurd_exception2signal) -+ -+void -+_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo) -+{ -+ exception2signal (detail, signo, 1); -+} -+ -+void -+_hurd_exception2signal_legacy (struct hurd_signal_detail *detail, int *signo) -+{ -+ exception2signal (detail, signo, 0); -+} -+ -Index: glibc-2.31/sysdeps/mach/hurd/i386/trampoline.c -=================================================================== ---- glibc-2.31.orig/sysdeps/mach/hurd/i386/trampoline.c -+++ glibc-2.31/sysdeps/mach/hurd/i386/trampoline.c -@@ -19,13 +19,66 @@ - #include <hurd/signal.h> - #include <hurd/userlink.h> - #include <thread_state.h> -+#include <mach/exception.h> - #include <mach/machine/eflags.h> - #include <assert.h> - #include <errno.h> - #include "hurdfault.h" - #include <intr-msg.h> -+#include <sys/ucontext.h> - - -+/* Fill in a siginfo_t structure for SA_SIGINFO-enabled handlers. */ -+static void fill_siginfo (siginfo_t *si, int signo, -+ const struct hurd_signal_detail *detail, -+ const struct machine_thread_all_state *state) -+{ -+ si->si_signo = signo; -+ si->si_errno = detail->error; -+ si->si_code = detail->code; -+ -+ /* XXX We would need a protocol change for sig_post to include -+ * this information. */ -+ si->si_pid = -1; -+ si->si_uid = -1; -+ -+ /* Address of the faulting instruction or memory access. */ -+ if (detail->exc == EXC_BAD_ACCESS) -+ si->si_addr = (void *) detail->exc_subcode; -+ else -+ si->si_addr = (void *) state->basic.eip; -+ -+ /* XXX On SIGCHLD, this should be the exit status of the child -+ * process. We would need a protocol change for the proc server -+ * to send this information along with the signal. */ -+ si->si_status = 0; -+ -+ si->si_band = 0; /* SIGPOLL is not supported yet. */ -+ si->si_value.sival_int = 0; /* sigqueue() is not supported yet. */ -+} -+ -+/* Fill in a ucontext_t structure SA_SIGINFO-enabled handlers. */ -+static void fill_ucontext (ucontext_t *uc, const struct sigcontext *sc) -+{ -+ uc->uc_flags = 0; -+ uc->uc_link = NULL; -+ uc->uc_sigmask = sc->sc_mask; -+ uc->uc_stack.ss_sp = (__ptr_t) sc->sc_esp; -+ uc->uc_stack.ss_size = 0; -+ uc->uc_stack.ss_flags = 0; -+ -+ /* Registers. */ -+ memcpy (&uc->uc_mcontext.gregs[REG_GS], &sc->sc_gs, -+ (REG_TRAPNO - REG_GS) * sizeof (int)); -+ uc->uc_mcontext.gregs[REG_TRAPNO] = 0; -+ uc->uc_mcontext.gregs[REG_ERR] = 0; -+ memcpy (&uc->uc_mcontext.gregs[REG_EIP], &sc->sc_eip, -+ (NGREG - REG_EIP) * sizeof (int)); -+ -+ /* XXX FPU state. */ -+ memset (&uc->uc_mcontext.fpregs, 0, sizeof (fpregset_t)); -+} -+ - struct sigcontext * - _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, - int signo, struct hurd_signal_detail *detail, -@@ -43,15 +96,38 @@ _hurd_setup_sighandler (struct hurd_sigs - struct - { - int signo; -- long int sigcode; -- struct sigcontext *scp; /* Points to ctx, below. */ -+ union -+ { -+ /* Extra arguments for traditional signal handlers */ -+ struct -+ { -+ long int sigcode; -+ struct sigcontext *scp; /* Points to ctx, below. */ -+ } legacy; -+ -+ /* Extra arguments for SA_SIGINFO handlers */ -+ struct -+ { -+ siginfo_t *siginfop; /* Points to siginfo, below. */ -+ ucontext_t *uctxp; /* Points to uctx, below. */ -+ } posix; -+ }; - void *sigreturn_addr; - void *sigreturn_returns_here; - struct sigcontext *return_scp; /* Same; arg to sigreturn. */ -+ -+ /* NB: sigreturn assumes link is next to ctx. */ - struct sigcontext ctx; - struct hurd_userlink link; -+ ucontext_t ucontext; -+ siginfo_t siginfo; - } *stackframe; - -+ /* sigaction for preemptors */ -+ static const struct sigaction legacy_sigaction = { -+ .sa_flags = SA_RESTART -+ }; -+ - if (ss->context) - { - /* We have a previous sigcontext that sigreturn was about -@@ -94,9 +170,13 @@ _hurd_setup_sighandler (struct hurd_sigs - the SP on sigreturn. */ - state->basic.uesp = state->basic.ecx; - -- /* XXX what if handler != action->handler (for instance, if a signal -- * preemptor took over) ? */ - action = & _hurd_sigstate_actions (ss) [signo]; -+ if ( (action->sa_flags & SA_SIGINFO) -+ && handler != (__sighandler_t) action->sa_sigaction -+ || !(action->sa_flags & SA_SIGINFO) -+ && handler != action->sa_handler) -+ /* A signal preemptor took over, use legacy semantic. */ -+ action = &legacy_sigaction; - - if ((action->sa_flags & SA_ONSTACK) - && !(ss->sigaltstack.ss_flags & (SS_DISABLE|SS_ONSTACK))) -@@ -140,15 +220,9 @@ _hurd_setup_sighandler (struct hurd_sigs - = &stackframe->link.thread.next; - ss->active_resources = &stackframe->link; - -- /* Set up the arguments for the signal handler. */ -- stackframe->signo = signo; -- stackframe->sigcode = detail->code; -- stackframe->scp = stackframe->return_scp = scp = &stackframe->ctx; -- stackframe->sigreturn_addr = &__sigreturn; -- stackframe->sigreturn_returns_here = firewall; /* Crash on return. */ -- - /* Set up the sigcontext from the current state of the thread. */ - -+ scp = &stackframe->ctx; - scp->sc_onstack = ss->sigaltstack.ss_flags & SS_ONSTACK ? 1 : 0; - - /* struct sigcontext is laid out so that starting at sc_gs mimics a -@@ -162,6 +236,35 @@ _hurd_setup_sighandler (struct hurd_sigs - &state->fpu, &scp->sc_i386_float_state, - sizeof (state->fpu)); - -+ /* Set up the arguments for the signal handler. */ -+ stackframe->signo = signo; -+ if (action->sa_flags & SA_SIGINFO) -+ { -+ stackframe->posix.siginfop = &stackframe->siginfo; -+ stackframe->posix.uctxp = &stackframe->ucontext; -+ fill_siginfo (&stackframe->siginfo, signo, detail, state); -+ fill_ucontext (&stackframe->ucontext, scp); -+ } -+ else -+ { -+ if (detail->exc) -+ { -+ int nsigno; -+ _hurd_exception2signal_legacy (detail, &nsigno); -+ assert (nsigno == signo); -+ } -+ else -+ detail->code = 0; -+ -+ stackframe->legacy.sigcode = detail->code; -+ stackframe->legacy.scp = &stackframe->ctx; -+ } -+ -+ /* Set up the bottom of the stack. */ -+ stackframe->sigreturn_addr = &__sigreturn; -+ stackframe->sigreturn_returns_here = firewall; /* Crash on return. */ -+ stackframe->return_scp = &stackframe->ctx; -+ - _hurdsig_end_catch_fault (); - - if (! ok) -Index: glibc-2.31/sysdeps/mach/hurd/kill.c -=================================================================== ---- glibc-2.31.orig/sysdeps/mach/hurd/kill.c -+++ glibc-2.31/sysdeps/mach/hurd/kill.c -@@ -64,7 +64,7 @@ __kill (pid_t pid, int sig) - { - if (msgport != MACH_PORT_NULL) - /* Send a signal message to his message port. */ -- return __msg_sig_post (msgport, sig, 0, refport); -+ return __msg_sig_post (msgport, sig, SI_USER, refport); - - /* The process has no message port. Perhaps try direct - frobnication of the task. */ -Index: glibc-2.31/sysdeps/mach/hurd/setitimer.c -=================================================================== ---- glibc-2.31.orig/sysdeps/mach/hurd/setitimer.c -+++ glibc-2.31/sysdeps/mach/hurd/setitimer.c -@@ -105,7 +105,7 @@ timer_thread (void) - __msg_sig_post_request (_hurd_msgport, - _hurd_itimer_port, - MACH_MSG_TYPE_MAKE_SEND_ONCE, -- SIGALRM, 0, __mach_task_self ()); -+ SIGALRM, SI_TIMER, __mach_task_self ()); - break; - - case MACH_RCV_INTERRUPTED: -Index: glibc-2.31/sysdeps/mach/hurd/i386/sigcontextinfo.h -=================================================================== ---- glibc-2.31.orig/sysdeps/mach/hurd/i386/sigcontextinfo.h -+++ glibc-2.31/sysdeps/mach/hurd/i386/sigcontextinfo.h -@@ -18,11 +18,10 @@ - #ifndef _SIGCONTEXTINFO_H - #define _SIGCONTEXTINFO_H - --#define SIGCONTEXT struct sigcontext - static inline uintptr_t --sigcontext_get_pc (struct sigcontext ctx) -+sigcontext_get_pc (struct ucontext_t *ctx) - { -- return ctx.sc_eip; -+ return ctx->uc_mcontext.gregs[REG_EIP]; - } - - #endif |