summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2023-12-16 12:29:51 +0100
committerLudovic Courtès <ludo@gnu.org>2023-12-19 23:51:11 +0100
commit33b5db1a792d6ff34c3abd1ac95c70d317d24732 (patch)
tree55cc0ac4ff407fbdabafbbcf0885ebe98748b0d2
parent10541dca6a621a994f6d7d74d4d9ca9a71867213 (diff)
gnu: glibc: Add patch for ‘ucontext’ on x86_64-gnu (GNU/Hurd).
Suggested by Sergey Bugaev. * gnu/packages/patches/glibc-2.38-hurd-ucontext.patch: New file. * gnu/packages/base.scm (glibc)[source]: Use it. * gnu/local.mk (dist_patch_DATA): Add it. Change-Id: Ib74e93f2414eda2ec4b3e01fc2bb67b02838fabb
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/base.scm1
-rw-r--r--gnu/packages/patches/glibc-2.38-hurd-ucontext.patch87
3 files changed, 89 insertions, 0 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index b296b5520e..27cf31e5c3 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1321,6 +1321,7 @@ dist_patch_DATA = \
%D%/packages/patches/glibc-2.37-hurd-clock_t_centiseconds.patch \
%D%/packages/patches/glibc-2.37-hurd-local-clock_gettime_MONOTONIC.patch \
%D%/packages/patches/glibc-2.37-versioned-locpath.patch \
+ %D%/packages/patches/glibc-2.38-hurd-ucontext.patch \
%D%/packages/patches/glibc-2.38-ldd-x86_64.patch \
%D%/packages/patches/glibc-hurd-clock_t_centiseconds.patch \
%D%/packages/patches/glibc-hurd-getauxval.patch \
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index eab9ff411d..e2a952cc42 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -813,6 +813,7 @@ the store.")
"glibc-supported-locales.patch"
"glibc-2.37-hurd-clock_t_centiseconds.patch"
"glibc-2.37-hurd-local-clock_gettime_MONOTONIC.patch"
+ "glibc-2.38-hurd-ucontext.patch"
"glibc-hurd-mach-print.patch"
"glibc-hurd-gettyent.patch"
"glibc-hurd-getauxval.patch"))))
diff --git a/gnu/packages/patches/glibc-2.38-hurd-ucontext.patch b/gnu/packages/patches/glibc-2.38-hurd-ucontext.patch
new file mode 100644
index 0000000000..03a6132666
--- /dev/null
+++ b/gnu/packages/patches/glibc-2.38-hurd-ucontext.patch
@@ -0,0 +1,87 @@
+commit 29d4591b07a4da53320e949557c6946c62c26bde
+Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
+Date: Thu Sep 28 00:07:18 2023 +0200
+
+ hurd: Drop REG_GSFS and REG_ESDS from x86_64's ucontext
+
+ These are useless on x86_64, and __NGREG was actually wrong with them.
+
+diff --git a/sysdeps/mach/hurd/x86/trampoline.c b/sysdeps/mach/hurd/x86/trampoline.c
+index 6318c9528a..bc3f15e1e0 100644
+--- a/sysdeps/mach/hurd/x86/trampoline.c
++++ b/sysdeps/mach/hurd/x86/trampoline.c
+@@ -79,8 +79,8 @@ static void fill_ucontext (ucontext_t *uc, const struct sigcontext *sc)
+
+ /* Registers. */
+ #ifdef __x86_64__
+- memcpy (&uc->uc_mcontext.gregs[REG_GSFS], &sc->sc_gs,
+- (REG_ERR - REG_GSFS) * sizeof (long));
++ memcpy (&uc->uc_mcontext.gregs[REG_R8], &sc->sc_r8,
++ (REG_ERR - REG_R8) * sizeof (long));
+ #else
+ memcpy (&uc->uc_mcontext.gregs[REG_GS], &sc->sc_gs,
+ (REG_TRAPNO - REG_GS) * sizeof (int));
+diff --git a/sysdeps/mach/hurd/x86_64/bits/sigcontext.h b/sysdeps/mach/hurd/x86_64/bits/sigcontext.h
+index 6396054463..7facc587b8 100644
+--- a/sysdeps/mach/hurd/x86_64/bits/sigcontext.h
++++ b/sysdeps/mach/hurd/x86_64/bits/sigcontext.h
+@@ -59,13 +59,7 @@ struct sigcontext
+ }
+ trampoline.c knows this, so it must be changed if this changes. */
+
+-#define sc_i386_thread_state sc_gs /* Beginning of correspondence. */
+- /* Segment registers. */
+- int sc_gs;
+- int sc_fs;
+- int sc_es;
+- int sc_ds;
+-
++#define sc_i386_thread_state sc_r8 /* Beginning of correspondence. */
+ long sc_r8;
+ long sc_r9;
+ long sc_r10;
+diff --git a/sysdeps/mach/x86/thread_state.h b/sysdeps/mach/x86/thread_state.h
+index 8c419515f9..e237e46cb2 100644
+--- a/sysdeps/mach/x86/thread_state.h
++++ b/sysdeps/mach/x86/thread_state.h
+@@ -34,12 +34,13 @@
+ #define PC rip
+ #define SP ursp
+ #define SYSRETURN rax
++#define MACHINE_THREAD_STATE_FIX_NEW(ts) do { \
++ asm ("mov %%cs, %w0" : "=q" ((ts)->cs)); \
++} while(0)
+ #else
+ #define PC eip
+ #define SP uesp
+ #define SYSRETURN eax
+-#endif
+-
+ #define MACHINE_THREAD_STATE_FIX_NEW(ts) do { \
+ asm ("mov %%cs, %w0" : "=q" ((ts)->cs)); \
+ asm ("mov %%ds, %w0" : "=q" ((ts)->ds)); \
+@@ -47,6 +48,7 @@
+ asm ("mov %%fs, %w0" : "=q" ((ts)->fs)); \
+ asm ("mov %%gs, %w0" : "=q" ((ts)->gs)); \
+ } while(0)
++#endif
+
+ struct machine_thread_all_state
+ {
+diff --git a/sysdeps/x86_64/sys/ucontext.h b/sysdeps/x86_64/sys/ucontext.h
+index d73a893795..f1b6be77a7 100644
+--- a/sysdeps/x86_64/sys/ucontext.h
++++ b/sysdeps/x86_64/sys/ucontext.h
+@@ -47,11 +47,7 @@ typedef greg_t gregset_t[__NGREG];
+ /* Number of each register in the `gregset_t' array. */
+ enum
+ {
+- REG_GSFS = 0, /* Actually int gs, fs. */
+-# define REG_GSFS REG_GSFS
+- REG_ESDS, /* Actually int es, ds. */
+-# define REG_ESDS REG_ESDS
+- REG_R8,
++ REG_R8 = 0,
+ # define REG_R8 REG_R8
+ REG_R9,
+ # define REG_R9 REG_R9