summaryrefslogtreecommitdiff
path: root/gnu/packages/patches
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2021-04-09 14:17:24 +0200
committerLudovic Courtès <ludo@gnu.org>2021-04-09 14:19:34 +0200
commit87961fc965b96ac0c7a5909ac2faab2d023b5339 (patch)
treeeaaac205b9bbe3ef40635897fd88716950959d06 /gnu/packages/patches
parent4863c4304e7d4d5945474e771d242878f8339d44 (diff)
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/packages/patches')
-rw-r--r--gnu/packages/patches/glibc-hurd-clock_gettime_monotonic.patch19
-rw-r--r--gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch637
2 files changed, 9 insertions, 647 deletions
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