summary refs log tree commit diff
path: root/gnu
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
parent4863c4304e7d4d5945474e771d242878f8339d44 (diff)
downloadguix-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.mk1
-rw-r--r--gnu/packages/base.scm5
-rw-r--r--gnu/packages/patches/glibc-hurd-clock_gettime_monotonic.patch19
-rw-r--r--gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch637
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