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.
This commit is contained in:
parent
4863c4304e
commit
87961fc965
4 changed files with 11 additions and 651 deletions
|
@ -1097,7 +1097,6 @@ dist_patch_DATA = \
|
||||||
%D%/packages/patches/glibc-hurd-gettyent.patch \
|
%D%/packages/patches/glibc-hurd-gettyent.patch \
|
||||||
%D%/packages/patches/glibc-hurd-mach-print.patch \
|
%D%/packages/patches/glibc-hurd-mach-print.patch \
|
||||||
%D%/packages/patches/glibc-hurd-magic-pid.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-powerpc.patch \
|
||||||
%D%/packages/patches/glibc-ldd-x86_64.patch \
|
%D%/packages/patches/glibc-ldd-x86_64.patch \
|
||||||
%D%/packages/patches/glibc-locales.patch \
|
%D%/packages/patches/glibc-locales.patch \
|
||||||
|
|
|
@ -671,13 +671,13 @@ (define-public glibc
|
||||||
;; version 2.28, GNU/Hurd used a different glibc branch.
|
;; version 2.28, GNU/Hurd used a different glibc branch.
|
||||||
(package
|
(package
|
||||||
(name "glibc")
|
(name "glibc")
|
||||||
(version "2.32")
|
(version "2.33")
|
||||||
(source (origin
|
(source (origin
|
||||||
(method url-fetch)
|
(method url-fetch)
|
||||||
(uri (string-append "mirror://gnu/glibc/glibc-" version ".tar.xz"))
|
(uri (string-append "mirror://gnu/glibc/glibc-" version ".tar.xz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0di848ibffrnwq7g2dvgqrnn4xqhj3h96csn69q4da51ymafl9qn"))
|
"1zvp0qdfbdyqrzydz18d9zg3n5ygy8ps7cmny1bvsp8h1q05c99f"))
|
||||||
(patches (search-patches "glibc-ldd-powerpc.patch"
|
(patches (search-patches "glibc-ldd-powerpc.patch"
|
||||||
"glibc-ldd-x86_64.patch"
|
"glibc-ldd-x86_64.patch"
|
||||||
"glibc-dl-cache.patch"
|
"glibc-dl-cache.patch"
|
||||||
|
@ -688,7 +688,6 @@ (define-public glibc
|
||||||
"glibc-supported-locales.patch"
|
"glibc-supported-locales.patch"
|
||||||
"glibc-hurd-clock_t_centiseconds.patch"
|
"glibc-hurd-clock_t_centiseconds.patch"
|
||||||
"glibc-hurd-clock_gettime_monotonic.patch"
|
"glibc-hurd-clock_gettime_monotonic.patch"
|
||||||
"glibc-hurd-signal-sa-siginfo.patch"
|
|
||||||
"glibc-hurd-mach-print.patch"
|
"glibc-hurd-mach-print.patch"
|
||||||
"glibc-hurd-gettyent.patch"))))
|
"glibc-hurd-gettyent.patch"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
|
|
|
@ -24,18 +24,17 @@ Subject: [PATCH 2/2] Use realtime clock for the monotonic clock.
|
||||||
4 files changed, 6 insertions(+), 5 deletions(-)
|
4 files changed, 6 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
diff --git a/sysdeps/mach/clock_gettime.c b/sysdeps/mach/clock_gettime.c
|
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
|
--- a/sysdeps/mach/clock_gettime.c
|
||||||
+++ b/sysdeps/mach/clock_gettime.c
|
+++ b/sysdeps/mach/clock_gettime.c
|
||||||
@@ -25,7 +25,7 @@
|
@@ -32,6 +32,7 @@ __clock_gettime (clockid_t clock_id, struct timespec *ts)
|
||||||
int
|
switch (clock_id) {
|
||||||
__clock_gettime (clockid_t clock_id, struct timespec *ts)
|
|
||||||
{
|
case CLOCK_REALTIME:
|
||||||
- if (clock_id != CLOCK_REALTIME)
|
+ case CLOCK_MONOTONIC:
|
||||||
+ if (clock_id != CLOCK_MONOTONIC && clock_id != CLOCK_REALTIME)
|
{
|
||||||
{
|
/* __host_get_time can only fail if passed an invalid host_t.
|
||||||
errno = EINVAL;
|
__mach_host_self could theoretically fail (producing an
|
||||||
return -1;
|
|
||||||
diff --git a/sysdeps/mach/hurd/bits/posix_opt.h b/sysdeps/mach/hurd/bits/posix_opt.h
|
diff --git a/sysdeps/mach/hurd/bits/posix_opt.h b/sysdeps/mach/hurd/bits/posix_opt.h
|
||||||
index 0050151332..27b3a28ab7 100644
|
index 0050151332..27b3a28ab7 100644
|
||||||
--- a/sysdeps/mach/hurd/bits/posix_opt.h
|
--- a/sysdeps/mach/hurd/bits/posix_opt.h
|
||||||
|
|
|
@ -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
|
|
Loading…
Reference in a new issue