guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

branch core-updates updated: gnu: glibc-2.31: Restore patches.


From: guix-commits
Subject: branch core-updates updated: gnu: glibc-2.31: Restore patches.
Date: Wed, 21 Jul 2021 19:04:04 -0400

This is an automated email from the git hooks/post-receive script.

marusich pushed a commit to branch core-updates
in repository guix.

The following commit(s) were added to refs/heads/core-updates by this push:
     new 93a5e89  gnu: glibc-2.31: Restore patches.
93a5e89 is described below

commit 93a5e89008af440655527d03d62d4726683a89ac
Author: Chris Marusich <cmmarusich@gmail.com>
AuthorDate: Sat Jul 10 16:49:49 2021 -0700

    gnu: glibc-2.31: Restore patches.
    
    Commit 87961fc965b96ac0c7a5909ac2faab2d023b5339 inadvertently modified the
    patch set for glibc-2.31.  This change restores the original patch set.
    
    Fixes: <https://bugs.gnu.org/49516>.
    
    * gnu/packages/base.scm (glibc-2.31) [source]: Use the same patches as 
glibc,
    but replace glibc-hurd-clock_gettime_monotonic.patch with
    glibc-2.31-hurd-clock_gettime_monotonic.patch, and add
    glibc-hurd-signal-sa-siginfo.patch.
    * gnu/packages/patches/glibc-2.31-hurd-clock_gettime_monotonic.patch: Add 
it.
    * gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch: Add it.
    * gnu/local.mk (dist_patch_DATA): Adjust accordingly.
---
 gnu/local.mk                                       |   2 +
 gnu/packages/base.scm                              |  16 +-
 .../glibc-2.31-hurd-clock_gettime_monotonic.patch  |  84 +++
 .../patches/glibc-hurd-signal-sa-siginfo.patch     | 637 +++++++++++++++++++++
 4 files changed, 738 insertions(+), 1 deletion(-)

diff --git a/gnu/local.mk b/gnu/local.mk
index e4d4f85..92b00ec 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1115,10 +1115,12 @@ dist_patch_DATA =                                       
        \
   %D%/packages/patches/glibc-dl-cache.patch                    \
   %D%/packages/patches/glibc-hidden-visibility-ldconfig.patch  \
   %D%/packages/patches/glibc-hurd-clock_gettime_monotonic.patch        \
+  %D%/packages/patches/glibc-2.31-hurd-clock_gettime_monotonic.patch   \
   %D%/packages/patches/glibc-hurd-clock_t_centiseconds.patch   \
   %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 08b1e0a..5bb71ea 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -942,7 +942,21 @@ with the Linux kernel.")
               (uri (string-append "mirror://gnu/glibc/glibc-" version 
".tar.xz"))
               (sha256
                (base32
-                "05zxkyz9bv3j9h0xyid1rhvh3klhsmrpkf3bcs6frvlgyr2gwilj"))))))
+                "05zxkyz9bv3j9h0xyid1rhvh3klhsmrpkf3bcs6frvlgyr2gwilj"))
+              (patches (search-patches
+                        "glibc-ldd-powerpc.patch"
+                        "glibc-ldd-x86_64.patch"
+                        "glibc-dl-cache.patch"
+                        "glibc-hidden-visibility-ldconfig.patch"
+                        "glibc-versioned-locpath.patch"
+                        "glibc-allow-kernel-2.6.32.patch"
+                        "glibc-reinstate-prlimit64-fallback.patch"
+                        "glibc-supported-locales.patch"
+                        "glibc-hurd-clock_t_centiseconds.patch"
+                        "glibc-2.31-hurd-clock_gettime_monotonic.patch"
+                        "glibc-hurd-signal-sa-siginfo.patch"
+                        "glibc-hurd-mach-print.patch"
+                        "glibc-hurd-gettyent.patch"))))))
 
 (define-public glibc-2.30
   (package
diff --git a/gnu/packages/patches/glibc-2.31-hurd-clock_gettime_monotonic.patch 
b/gnu/packages/patches/glibc-2.31-hurd-clock_gettime_monotonic.patch
new file mode 100644
index 0000000..1c3fe42
--- /dev/null
+++ b/gnu/packages/patches/glibc-2.31-hurd-clock_gettime_monotonic.patch
@@ -0,0 +1,84 @@
+This is needed to run Python on the Hurd, especially during the build of
+python-boot0.
+
+Adapted from 
https://salsa.debian.org/glibc-team/glibc/-/blob/glibc-2.31/debian/patches/hurd-i386/unsubmitted-clock_t_centiseconds.diff
+
+Use the realtime clock for the monotonic clock. This is of course not a proper
+implementation (which is being done in Mach), but will permit to fix at least
+the iceweasel stack.
+
+vlc however doesn't build when _POSIX_CLOCK_SELECTION is enabled but
+_POSIX_TIMERS is not, and they refuse to fix that (see #765578), so disable the
+former.
+
+From 0aa1dfd580cf9ad7b812c307b128decb782b825f Mon Sep 17 00:00:00 2001
+From: Jan Nieuwenhuizen <janneke@gnu.org>
+Date: Mon, 2 Mar 2020 18:59:04 +0100
+Subject: [PATCH 2/2] Use realtime clock for the monotonic clock.
+
+---
+ sysdeps/mach/clock_gettime.c       | 2 +-
+ sysdeps/mach/hurd/bits/posix_opt.h | 6 +++---
+ sysdeps/posix/clock_getres.c       | 1 +
+ sysdeps/pthread/timer_create.c     | 2 +-
+ 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
+--- 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;
+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
++++ b/sysdeps/mach/hurd/bits/posix_opt.h
+@@ -163,10 +163,10 @@
+ #define _POSIX_THREAD_PROCESS_SHARED  -1
+ 
+ /* The monotonic clock might be available.  */
+-#define _POSIX_MONOTONIC_CLOCK        0
++#define _POSIX_MONOTONIC_CLOCK        200809L
+ 
+-/* The clock selection interfaces are available.  */
+-#define _POSIX_CLOCK_SELECTION        200809L
++/* The clock selection interfaces are not really available yet.  */
++#define _POSIX_CLOCK_SELECTION        -1
+ 
+ /* Advisory information interfaces could be available in future.  */
+ #define _POSIX_ADVISORY_INFO  0
+diff --git a/sysdeps/posix/clock_getres.c b/sysdeps/posix/clock_getres.c
+index fcd79fd554..1dd02aa449 100644
+--- a/sysdeps/posix/clock_getres.c
++++ b/sysdeps/posix/clock_getres.c
+@@ -52,6 +52,7 @@ __clock_getres (clockid_t clock_id, struct timespec *res)
+   switch (clock_id)
+     {
+     case CLOCK_REALTIME:
++    case CLOCK_MONOTONIC:
+       retval = realtime_getres (res);
+       break;
+ 
+diff --git a/sysdeps/pthread/timer_create.c b/sysdeps/pthread/timer_create.c
+index 9d8a9ea8ae..3430582c09 100644
+--- a/sysdeps/pthread/timer_create.c
++++ b/sysdeps/pthread/timer_create.c
+@@ -48,7 +48,7 @@ timer_create (clockid_t clock_id, struct sigevent *evp, 
timer_t *timerid)
+       return -1;
+     }
+ 
+-  if (clock_id != CLOCK_REALTIME)
++  if (clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC)
+     {
+       __set_errno (EINVAL);
+       return -1;
+-- 
+2.24.0
+
diff --git a/gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch 
b/gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch
new file mode 100644
index 0000000..36ea55e
--- /dev/null
+++ b/gnu/packages/patches/glibc-hurd-signal-sa-siginfo.patch
@@ -0,0 +1,637 @@
+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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]