summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2023-05-12 21:28:47 +0200
committerBruno Haible <bruno@clisp.org>2023-05-12 21:33:34 +0200
commitacb36717d8dd76b5cb755edc53aa5cea7f24db01 (patch)
tree6208c79607f987b2c6bd37507177e669f9e4cf9c
parentf01d8792778b637f7464533ac019e42f58adb310 (diff)
downloadgnulib-acb36717d8dd76b5cb755edc53aa5cea7f24db01.tar.gz
sigsegv: Add tentative support for Hurd/x86_64.
Reported by Samuel Thibault <samuel.thibault@ens-lyon.org>. * lib/sigsegv.c: Update from libsigsegv/src/fault-hurd-i386.h.
-rw-r--r--ChangeLog6
-rw-r--r--lib/sigsegv.c20
2 files changed, 23 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 169645e055..542706f252 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2023-05-12 Bruno Haible <bruno@clisp.org>
+
+ sigsegv: Add tentative support for Hurd/x86_64.
+ Reported by Samuel Thibault <samuel.thibault@ens-lyon.org>.
+ * lib/sigsegv.c: Update from libsigsegv/src/fault-hurd-i386.h.
+
2023-05-12 Paul Eggert <eggert@cs.ucla.edu>
file-has-acl: port to Fedora 39
diff --git a/lib/sigsegv.c b/lib/sigsegv.c
index 5e943e4d5d..aadba4e060 100644
--- a/lib/sigsegv.c
+++ b/lib/sigsegv.c
@@ -365,12 +365,26 @@ int libsigsegv_version = LIBSIGSEGV_VERSION;
# define SIGSEGV_FAULT_ADDRESS (unsigned long) code
# define SIGSEGV_FAULT_CONTEXT scp
-# if defined __i386__
+# if defined __x86_64__
+/* 64 bit registers */
+
+/* scp points to a 'struct sigcontext' (defined in
+ glibc/sysdeps/mach/hurd/x86_64/bits/sigcontext.h).
+ The registers, at the moment the signal occurred, get pushed on the stack
+ through gnumach/x86_64/locore.S:alltraps and then copied into the struct
+ through glibc/sysdeps/mach/hurd/x86/trampoline.c. */
+/* sc_rsp is unused (not set by gnumach/x86_64/locore.S:alltraps). We need
+ to use sc_ursp. */
+# define SIGSEGV_FAULT_STACKPOINTER scp->sc_ursp
+
+# elif defined __i386__
+/* 32 bit registers */
/* scp points to a 'struct sigcontext' (defined in
glibc/sysdeps/mach/hurd/i386/bits/sigcontext.h).
- The registers of this struct get pushed on the stack through
- gnumach/i386/i386/locore.S:trapall. */
+ The registers, at the moment the signal occurred, get pushed on the stack
+ through gnumach/i386/i386/locore.S:alltraps and then copied into the struct
+ through glibc/sysdeps/mach/hurd/x86/trampoline.c. */
/* Both sc_esp and sc_uesp appear to have the same value.
It appears more reliable to use sc_uesp because it is labelled as
"old esp, if trapped from user". */