From a7536148af9fd70a86280a8bc07d01c9ca63e731 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Wed, 3 Apr 2024 23:17:13 -0400 Subject: [PATCH] x86-64: Save APX registers in ld.so trampoline --- .glibc.metadata | 1 + glibc-RHEL-25046.patch | 88 ++++++++++++++++++++++++++++++++++++++++++ glibc.spec | 6 ++- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 .glibc.metadata create mode 100644 glibc-RHEL-25046.patch diff --git a/.glibc.metadata b/.glibc.metadata new file mode 100644 index 0000000..ebacb12 --- /dev/null +++ b/.glibc.metadata @@ -0,0 +1 @@ +7c3b8890a6346793b6334cc5f2fea5d437d307b8 glibc-2.34.tar.xz diff --git a/glibc-RHEL-25046.patch b/glibc-RHEL-25046.patch new file mode 100644 index 0000000..db48ca3 --- /dev/null +++ b/glibc-RHEL-25046.patch @@ -0,0 +1,88 @@ +From dfb05f8e704edac70db38c4c8ee700769d91a413 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Fri, 16 Feb 2024 07:17:10 -0800 +Subject: [PATCH] x86-64: Save APX registers in ld.so trampoline +Content-type: text/plain; charset=UTF-8 + +Add APX registers to STATE_SAVE_MASK so that APX registers are saved in +ld.so trampoline. This fixes BZ #31371. + +Also update STATE_SAVE_OFFSET and STATE_SAVE_MASK for i386 which will +be used by i386 _dl_tlsdesc_dynamic. +Reviewed-by: Noah Goldstein + +Conflicts: + sysdeps/x86/sysdep.h + (rebased for context and line numbers) +--- + sysdeps/x86/sysdep.h | 52 +++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 46 insertions(+), 6 deletions(-) + +diff --git a/sysdeps/x86/sysdep.h b/sysdeps/x86/sysdep.h +index 85d0a8c943..837fd28734 100644 +--- a/sysdeps/x86/sysdep.h ++++ b/sysdeps/x86/sysdep.h +@@ -48,14 +48,54 @@ + # define SHSTK_ENABLED 0 + #endif + ++/* The extended state feature IDs in the state component bitmap. */ ++#define X86_XSTATE_X87_ID 0 ++#define X86_XSTATE_SSE_ID 1 ++#define X86_XSTATE_AVX_ID 2 ++#define X86_XSTATE_BNDREGS_ID 3 ++#define X86_XSTATE_BNDCFG_ID 4 ++#define X86_XSTATE_K_ID 5 ++#define X86_XSTATE_ZMM_H_ID 6 ++#define X86_XSTATE_ZMM_ID 7 ++#define X86_XSTATE_PKRU_ID 9 ++#define X86_XSTATE_TILECFG_ID 17 ++#define X86_XSTATE_TILEDATA_ID 18 ++#define X86_XSTATE_APX_F_ID 19 ++ ++#ifdef __x86_64__ + /* Offset for fxsave/xsave area used by _dl_runtime_resolve. Also need + space to preserve RCX, RDX, RSI, RDI, R8, R9 and RAX. It must be +- aligned to 16 bytes for fxsave and 64 bytes for xsave. */ +-#define STATE_SAVE_OFFSET (8 * 7 + 8) +- +-/* Save SSE, AVX, AVX512, mask and bound registers. */ +-#define STATE_SAVE_MASK \ +- ((1 << 1) | (1 << 2) | (1 << 3) | (1 << 5) | (1 << 6) | (1 << 7)) ++ aligned to 16 bytes for fxsave and 64 bytes for xsave. ++ ++ NB: Is is non-zero because of the 128-byte red-zone. Some registers ++ are saved on stack without adjusting stack pointer first. When we ++ update stack pointer to allocate more space, we need to take the ++ red-zone into account. */ ++# define STATE_SAVE_OFFSET (8 * 7 + 8) ++ ++/* Save SSE, AVX, AVX512, mask, bound and APX registers. Bound and APX ++ registers are mutually exclusive. */ ++# define STATE_SAVE_MASK \ ++ ((1 << X86_XSTATE_SSE_ID) \ ++ | (1 << X86_XSTATE_AVX_ID) \ ++ | (1 << X86_XSTATE_BNDREGS_ID) \ ++ | (1 << X86_XSTATE_K_ID) \ ++ | (1 << X86_XSTATE_ZMM_H_ID) \ ++ | (1 << X86_XSTATE_ZMM_ID) \ ++ | (1 << X86_XSTATE_APX_F_ID)) ++#else ++/* Offset for fxsave/xsave area used by _dl_tlsdesc_dynamic. Since i386 ++ doesn't have red-zone, use 0 here. */ ++# define STATE_SAVE_OFFSET 0 ++ ++/* Save SSE, AVX, AXV512, mask and bound registers. */ ++# define STATE_SAVE_MASK \ ++ ((1 << X86_XSTATE_SSE_ID) \ ++ | (1 << X86_XSTATE_AVX_ID) \ ++ | (1 << X86_XSTATE_BNDREGS_ID) \ ++ | (1 << X86_XSTATE_K_ID) \ ++ | (1 << X86_XSTATE_ZMM_H_ID)) ++#endif + + /* Constants for bits in __x86_string_control: */ + +-- +2.39.3 + diff --git a/glibc.spec b/glibc.spec index 76187da..32db246 100644 --- a/glibc.spec +++ b/glibc.spec @@ -155,7 +155,7 @@ end \ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: 104%{?dist} +Release: 105%{?dist} # In general, GPLv2+ is used by programs, LGPLv2+ is used for # libraries. @@ -816,6 +816,7 @@ Patch579: glibc-RHEL-25531-1.patch Patch580: glibc-RHEL-25531-2.patch Patch581: glibc-RHEL-25531-3.patch Patch582: glibc-RHEL-25531-4.patch +Patch583: glibc-RHEL-25046.patch ############################################################################## # Continued list of core "glibc" package information: @@ -2974,6 +2975,9 @@ update_gconv_modules_cache () %endif %changelog +* Wed Apr 3 2024 DJ Delorie - 2.34-105 +- x86-64: Save APX registers in ld.so trampoline (RHEL-25046) + * Tue Mar 26 2024 DJ Delorie - 2.34-104 - x86: Fix Zen3/Zen4 ERMS selection (RHEL-25531)