diff options
author | Ludovic Courtès <ludo@gnu.org> | 2023-12-16 12:29:51 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2024-08-31 10:42:49 +0200 |
commit | 6538474df71c8526ea8a50fcce69bfb155fe60a6 (patch) | |
tree | 050ed5ea45cdf73d44ffda64f05904960d80f3b0 /gnu/packages | |
parent | 6a554dbc0d6b7850e7e4a22645908ed72662d862 (diff) | |
download | guix-6538474df71c8526ea8a50fcce69bfb155fe60a6.tar guix-6538474df71c8526ea8a50fcce69bfb155fe60a6.tar.gz |
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
Diffstat (limited to 'gnu/packages')
-rw-r--r-- | gnu/packages/base.scm | 1 | ||||
-rw-r--r-- | gnu/packages/patches/glibc-2.38-hurd-ucontext.patch | 87 |
2 files changed, 88 insertions, 0 deletions
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 098a6070dd..af81169850 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -863,6 +863,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 |