diff --git a/SOURCES/0001-Backport-of-Add-NT_VMCOREDD-AT_MINSIGSTKSZ-from-Linu.patch b/SOURCES/0001-Backport-of-Add-NT_VMCOREDD-AT_MINSIGSTKSZ-from-Linu.patch new file mode 100644 index 0000000..90de4ca --- /dev/null +++ b/SOURCES/0001-Backport-of-Add-NT_VMCOREDD-AT_MINSIGSTKSZ-from-Linu.patch @@ -0,0 +1,64 @@ +From 174195409d6a3d639dd28e08cf99d6f2559eca9c Mon Sep 17 00:00:00 2001 +From: Joseph Myers +Date: Mon, 20 Aug 2018 15:46:26 +0000 +Subject: [PATCH] Add NT_VMCOREDD, AT_MINSIGSTKSZ from Linux 4.18 to elf.h. + +This patch adds two new constants from Linux 4.18 to elf.h, +NT_VMCOREDD and AT_MINSIGSTKSZ. + +Tested for x86_64. + + * elf/elf.c (NT_VMCOREDD): New macro. + (AT_MINSIGSTKSZ): Likewise. + + +UPDATE: + +Backported to glibc 2.28 + +Signed-off-by: Jair Gonzalez +--- + ChangeLog | 6 +++++- + elf/elf.h | 4 ++++ + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index 74e63467..e1f1e8ed 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,9 @@ +-2019-03-25 Mike Crowe ++2018-08-20 Joseph Myers ++ ++ * elf/elf.c (NT_VMCOREDD): New macro. ++ (AT_MINSIGSTKSZ): Likewise. + ++2019-03-25 Mike Crowe + * nptl/tst-rwlock14.c (do_test): Replace duplicate calls to + pthread_rwlock_timedrdlock with calls to + pthread_rwlock_timedwrlock to ensure that the latter is tested +diff --git a/elf/elf.h b/elf/elf.h +index d6506ea1..9b4d56b0 100644 +--- a/elf/elf.h ++++ b/elf/elf.h +@@ -808,6 +808,7 @@ typedef struct + #define NT_ARM_SYSTEM_CALL 0x404 /* ARM system call number */ + #define NT_ARM_SVE 0x405 /* ARM Scalable Vector Extension + registers */ ++#define NT_VMCOREDD 0x700 /* Vmcore Device Dump Note. */ + + /* Legal values for the note segment descriptor types for object files. */ + +@@ -1214,6 +1215,9 @@ typedef struct + #define AT_L3_CACHESIZE 46 + #define AT_L3_CACHEGEOMETRY 47 + ++#define AT_MINSIGSTKSZ 51 /* Stack needed for signal delivery ++ (AArch64). */ ++ + /* Note section contents. Each entry in the note section begins with + a header of a fixed form. */ + +-- +2.27.0 + diff --git a/SOURCES/0002-Backport-of-Print-cache-size-and-geometry-auxv-types.patch b/SOURCES/0002-Backport-of-Print-cache-size-and-geometry-auxv-types.patch new file mode 100644 index 0000000..9d11d24 --- /dev/null +++ b/SOURCES/0002-Backport-of-Print-cache-size-and-geometry-auxv-types.patch @@ -0,0 +1,259 @@ +From 1616d034b61622836d3a36af53dcfca7624c844e Mon Sep 17 00:00:00 2001 +From: Tulio Magno Quites Machado Filho +Date: Wed, 19 Dec 2018 19:03:12 -0200 +Subject: [PATCH] Print cache size and geometry auxv types on LD_SHOW_AUXV=1 + +Add support for AT_L1I_CACHESIZE, AT_L1I_CACHEGEOMETRY, +AT_L1D_CACHESIZE, AT_L1D_CACHEGEOMETRY, AT_L2_CACHESIZE, +AT_L2_CACHEGEOMETRY, AT_L3_CACHESIZE and AT_L3_CACHEGEOMETRY when +LD_SHOW_AUXV=1. + +AT_L*_CACHESIZE is printed as decimal and represent the number of +bytes of the cache. + +AT_L*_CACHEGEOMETRY is treated in order to specify the cache line size +and its associativity. + +Example output from a POWER8: + +AT_L1I_CACHESIZE: 32768 +AT_L1I_CACHEGEOMETRY: 128B line size, 8-way set associative +AT_L1D_CACHESIZE: 65536 +AT_L1D_CACHEGEOMETRY: 128B line size, 8-way set associative +AT_L2_CACHESIZE: 524288 +AT_L2_CACHEGEOMETRY: 128B line size, 8-way set associative +AT_L3_CACHESIZE: 8388608 +AT_L3_CACHEGEOMETRY: 128B line size, 8-way set associative + +Some of the new types are longer than the previous ones, requiring to +increase the indentation in order to keep the values aligned. + + * elf/dl-sysdep.c (auxvars): Add AT_L1I_CACHESIZE, + AT_L1I_CACHEGEOMETRY, AT_L1D_CACHESIZE, AT_L1D_CACHEGEOMETRY, + AT_L2_CACHESIZE, AT_L2_CACHEGEOMETRY, AT_L3_CACHESIZE and + AT_L3_CACHEGEOMETRY. Fix indentation when printing the other + fields. + (_dl_show_auxv): Give a special treatment to + AT_L1I_CACHEGEOMETRY, AT_L1D_CACHEGEOMETRY, AT_L2_CACHEGEOMETRY + and AT_L3_CACHEGEOMETRY. + * sysdeps/powerpc/dl-procinfo.h (cache_geometry): New function. + (_dl_procinfo): Fix indentation when printing AT_HWCAP and + AT_HWCAP2. Add support for AT_L1I_CACHEGEOMETRY, + AT_L1D_CACHEGEOMETRY, AT_L2_CACHEGEOMETRY and AT_L3_CACHEGEOMETRY. + +Signed-off-by: Tulio Magno Quites Machado Filho + +UPDATE: + +Backported to glibc 2.28 + +Signed-off-by: Jair Gonzalez +--- + ChangeLog | 15 ++++++++ + elf/dl-sysdep.c | 68 ++++++++++++++++++++--------------- + sysdeps/powerpc/dl-procinfo.h | 55 ++++++++++++++++++++++++++-- + 3 files changed, 107 insertions(+), 31 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index e1f1e8ed..305a772b 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,18 @@ ++2018-12-19 Tulio Magno Quites Machado Filho ++ ++ * elf/dl-sysdep.c (auxvars): Add AT_L1I_CACHESIZE, ++ AT_L1I_CACHEGEOMETRY, AT_L1D_CACHESIZE, AT_L1D_CACHEGEOMETRY, ++ AT_L2_CACHESIZE, AT_L2_CACHEGEOMETRY, AT_L3_CACHESIZE and ++ AT_L3_CACHEGEOMETRY. Fix indentation when printing the other ++ fields. ++ (_dl_show_auxv): Give a special treatment to ++ AT_L1I_CACHEGEOMETRY, AT_L1D_CACHEGEOMETRY, AT_L2_CACHEGEOMETRY ++ and AT_L3_CACHEGEOMETRY. ++ * sysdeps/powerpc/dl-procinfo.h (cache_geometry): New function. ++ (_dl_procinfo): Fix indentation when printing AT_HWCAP and ++ AT_HWCAP2. Add support for AT_L1I_CACHEGEOMETRY, ++ AT_L1D_CACHEGEOMETRY, AT_L2_CACHEGEOMETRY and AT_L3_CACHEGEOMETRY. ++ + 2018-08-20 Joseph Myers + + * elf/elf.c (NT_VMCOREDD): New macro. +diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c +index 998c5d52..93983251 100644 +--- a/elf/dl-sysdep.c ++++ b/elf/dl-sysdep.c +@@ -277,38 +277,46 @@ _dl_show_auxv (void) + { + static const struct + { +- const char label[17]; ++ const char label[22]; + enum { unknown = 0, dec, hex, str, ignore } form : 8; + } auxvars[] = + { +- [AT_EXECFD - 2] = { "EXECFD: ", dec }, +- [AT_EXECFN - 2] = { "EXECFN: ", str }, +- [AT_PHDR - 2] = { "PHDR: 0x", hex }, +- [AT_PHENT - 2] = { "PHENT: ", dec }, +- [AT_PHNUM - 2] = { "PHNUM: ", dec }, +- [AT_PAGESZ - 2] = { "PAGESZ: ", dec }, +- [AT_BASE - 2] = { "BASE: 0x", hex }, +- [AT_FLAGS - 2] = { "FLAGS: 0x", hex }, +- [AT_ENTRY - 2] = { "ENTRY: 0x", hex }, +- [AT_NOTELF - 2] = { "NOTELF: ", hex }, +- [AT_UID - 2] = { "UID: ", dec }, +- [AT_EUID - 2] = { "EUID: ", dec }, +- [AT_GID - 2] = { "GID: ", dec }, +- [AT_EGID - 2] = { "EGID: ", dec }, +- [AT_PLATFORM - 2] = { "PLATFORM: ", str }, +- [AT_HWCAP - 2] = { "HWCAP: ", hex }, +- [AT_CLKTCK - 2] = { "CLKTCK: ", dec }, +- [AT_FPUCW - 2] = { "FPUCW: ", hex }, +- [AT_DCACHEBSIZE - 2] = { "DCACHEBSIZE: 0x", hex }, +- [AT_ICACHEBSIZE - 2] = { "ICACHEBSIZE: 0x", hex }, +- [AT_UCACHEBSIZE - 2] = { "UCACHEBSIZE: 0x", hex }, ++ [AT_EXECFD - 2] = { "EXECFD: ", dec }, ++ [AT_EXECFN - 2] = { "EXECFN: ", str }, ++ [AT_PHDR - 2] = { "PHDR: 0x", hex }, ++ [AT_PHENT - 2] = { "PHENT: ", dec }, ++ [AT_PHNUM - 2] = { "PHNUM: ", dec }, ++ [AT_PAGESZ - 2] = { "PAGESZ: ", dec }, ++ [AT_BASE - 2] = { "BASE: 0x", hex }, ++ [AT_FLAGS - 2] = { "FLAGS: 0x", hex }, ++ [AT_ENTRY - 2] = { "ENTRY: 0x", hex }, ++ [AT_NOTELF - 2] = { "NOTELF: ", hex }, ++ [AT_UID - 2] = { "UID: ", dec }, ++ [AT_EUID - 2] = { "EUID: ", dec }, ++ [AT_GID - 2] = { "GID: ", dec }, ++ [AT_EGID - 2] = { "EGID: ", dec }, ++ [AT_PLATFORM - 2] = { "PLATFORM: ", str }, ++ [AT_HWCAP - 2] = { "HWCAP: ", hex }, ++ [AT_CLKTCK - 2] = { "CLKTCK: ", dec }, ++ [AT_FPUCW - 2] = { "FPUCW: ", hex }, ++ [AT_DCACHEBSIZE - 2] = { "DCACHEBSIZE: 0x", hex }, ++ [AT_ICACHEBSIZE - 2] = { "ICACHEBSIZE: 0x", hex }, ++ [AT_UCACHEBSIZE - 2] = { "UCACHEBSIZE: 0x", hex }, + [AT_IGNOREPPC - 2] = { "IGNOREPPC", ignore }, +- [AT_SECURE - 2] = { "SECURE: ", dec }, +- [AT_BASE_PLATFORM - 2] = { "BASE_PLATFORM:", str }, +- [AT_SYSINFO - 2] = { "SYSINFO: 0x", hex }, +- [AT_SYSINFO_EHDR - 2] = { "SYSINFO_EHDR: 0x", hex }, +- [AT_RANDOM - 2] = { "RANDOM: 0x", hex }, +- [AT_HWCAP2 - 2] = { "HWCAP2: 0x", hex }, ++ [AT_SECURE - 2] = { "SECURE: ", dec }, ++ [AT_BASE_PLATFORM - 2] = { "BASE_PLATFORM: ", str }, ++ [AT_SYSINFO - 2] = { "SYSINFO: 0x", hex }, ++ [AT_SYSINFO_EHDR - 2] = { "SYSINFO_EHDR: 0x", hex }, ++ [AT_RANDOM - 2] = { "RANDOM: 0x", hex }, ++ [AT_HWCAP2 - 2] = { "HWCAP2: 0x", hex }, ++ [AT_L1I_CACHESIZE - 2] = { "L1I_CACHESIZE: ", dec }, ++ [AT_L1I_CACHEGEOMETRY - 2] = { "L1I_CACHEGEOMETRY: 0x", hex }, ++ [AT_L1D_CACHESIZE - 2] = { "L1D_CACHESIZE: ", dec }, ++ [AT_L1D_CACHEGEOMETRY - 2] = { "L1D_CACHEGEOMETRY: 0x", hex }, ++ [AT_L2_CACHESIZE - 2] = { "L2_CACHESIZE: ", dec }, ++ [AT_L2_CACHEGEOMETRY - 2] = { "L2_CACHEGEOMETRY: 0x", hex }, ++ [AT_L3_CACHESIZE - 2] = { "L3_CACHESIZE: ", dec }, ++ [AT_L3_CACHEGEOMETRY - 2] = { "L3_CACHEGEOMETRY: 0x", hex }, + }; + unsigned int idx = (unsigned int) (av->a_type - 2); + +@@ -320,7 +328,9 @@ _dl_show_auxv (void) + assert (AT_NULL == 0); + assert (AT_IGNORE == 1); + +- if (av->a_type == AT_HWCAP || av->a_type == AT_HWCAP2) ++ if (av->a_type == AT_HWCAP || av->a_type == AT_HWCAP2 ++ || AT_L1I_CACHEGEOMETRY || AT_L1D_CACHEGEOMETRY ++ || AT_L2_CACHEGEOMETRY || AT_L3_CACHEGEOMETRY) + { + /* These are handled in a special way per platform. */ + if (_dl_procinfo (av->a_type, av->a_un.a_val) == 0) +diff --git a/sysdeps/powerpc/dl-procinfo.h b/sysdeps/powerpc/dl-procinfo.h +index 3593e966..8d8ffb69 100644 +--- a/sysdeps/powerpc/dl-procinfo.h ++++ b/sysdeps/powerpc/dl-procinfo.h +@@ -157,6 +157,37 @@ _dl_string_platform (const char *str) + } + + #if IS_IN (rtld) ++static inline void ++cache_geometry (const char * name, unsigned long int geometry) ++{ ++ unsigned long int assocty, line; ++ ++ _dl_printf ("%s", name); ++ ++ line = geometry & 0xffff; ++ assocty = (geometry >> 16) & 0xffff; ++ ++ if (line == 0) ++ _dl_printf ("Unknown line size, "); ++ else ++ _dl_printf ("%luB line size, ", line); ++ ++ switch (assocty) ++ { ++ case 0: ++ _dl_printf ("Unknown associativity"); ++ break; ++ case 1: ++ _dl_printf ("Directly mapped"); ++ break; ++ case 0xffff: ++ _dl_printf ("Fully associative"); ++ break; ++ default: ++ _dl_printf ("%lu-way set associative", assocty); ++ } ++} ++ + static inline int + __attribute__ ((unused)) + _dl_procinfo (unsigned int type, unsigned long int word) +@@ -164,7 +195,7 @@ _dl_procinfo (unsigned int type, unsigned long int word) + switch(type) + { + case AT_HWCAP: +- _dl_printf ("AT_HWCAP: "); ++ _dl_printf ("AT_HWCAP: "); + + for (int i = 0; i <= _DL_HWCAP_LAST; ++i) + if (word & (1 << i)) +@@ -174,7 +205,7 @@ _dl_procinfo (unsigned int type, unsigned long int word) + { + unsigned int offset = _DL_HWCAP_LAST + 1; + +- _dl_printf ("AT_HWCAP2: "); ++ _dl_printf ("AT_HWCAP2: "); + + /* We have to go through them all because the kernel added the + AT_HWCAP2 features starting with the high bits. */ +@@ -183,6 +214,26 @@ _dl_procinfo (unsigned int type, unsigned long int word) + _dl_printf (" %s", _dl_hwcap_string (offset + i)); + break; + } ++ case AT_L1I_CACHEGEOMETRY: ++ { ++ cache_geometry ("AT_L1I_CACHEGEOMETRY: ", word); ++ break; ++ } ++ case AT_L1D_CACHEGEOMETRY: ++ { ++ cache_geometry ("AT_L1D_CACHEGEOMETRY: ", word); ++ break; ++ } ++ case AT_L2_CACHEGEOMETRY: ++ { ++ cache_geometry ("AT_L2_CACHEGEOMETRY: ", word); ++ break; ++ } ++ case AT_L3_CACHEGEOMETRY: ++ { ++ cache_geometry ("AT_L3_CACHEGEOMETRY: ", word); ++ break; ++ } + default: + /* This should not happen. */ + return -1; +-- +2.27.0 + diff --git a/SOURCES/0003-Backport-of-Tests-for-minimal-signal-handler.patch b/SOURCES/0003-Backport-of-Tests-for-minimal-signal-handler.patch new file mode 100644 index 0000000..609d990 --- /dev/null +++ b/SOURCES/0003-Backport-of-Tests-for-minimal-signal-handler.patch @@ -0,0 +1,748 @@ +From fbbc9a4e347dabb2d1662744e6a2e83b569ea3a4 Mon Sep 17 00:00:00 2001 +From: Zack Weinberg +Date: Tue, 15 Jan 2019 14:58:15 -0500 +Subject: [PATCH] Tests for minimal signal handler functionality in MINSIGSTKSZ + space. + +There is general agreement that the very short list of things that ISO +C says you can do in an async signal handler should all work when the +handler is running on an alternate signal stack with only MINSIGSTKSZ +space. This patch adds tests to make sure those things do work. + +To facilitate this, there is a new set of test support routines for +setting up alternate signal stacks; see support/xsignal.h for the API. + + * support/xsignal.h (xalloc_sigstack, xfree_sigstack) + (xget_sigstack_location): New test support functions. + * support/xsigstack.c: New file, implementing them. + * support/tst-xsigstack.c: New test for them. + * support/Makefile: Update. + + * signal/tst-minsigstksz-1.c + * signal/tst-minsigstksz-2.c + * signal/tst-minsigstksz-3.c + * signal/tst-minsigstksz-3a.c + * signal/tst-minsigstksz-4.c: New tests. + * signal/Makefile: Run them. + +UPDATE: + +Backported to glibc 2.28 + +Signed-off-by: Jair Gonzalez +--- + ChangeLog | 15 +++++ + signal/Makefile | 2 + + signal/tst-minsigstksz-1.c | 131 ++++++++++++++++++++++++++++++++++++ + signal/tst-minsigstksz-2.c | 66 ++++++++++++++++++ + signal/tst-minsigstksz-3.c | 64 ++++++++++++++++++ + signal/tst-minsigstksz-3a.c | 69 +++++++++++++++++++ + signal/tst-minsigstksz-4.c | 65 ++++++++++++++++++ + support/Makefile | 2 + + support/tst-xsigstack.c | 64 ++++++++++++++++++ + support/xsignal.h | 17 +++++ + support/xsigstack.c | 107 +++++++++++++++++++++++++++++ + 11 files changed, 602 insertions(+) + create mode 100644 signal/tst-minsigstksz-1.c + create mode 100644 signal/tst-minsigstksz-2.c + create mode 100644 signal/tst-minsigstksz-3.c + create mode 100644 signal/tst-minsigstksz-3a.c + create mode 100644 signal/tst-minsigstksz-4.c + create mode 100644 support/tst-xsigstack.c + create mode 100644 support/xsigstack.c + +diff --git a/ChangeLog b/ChangeLog +index 305a772b..9e33b6cb 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,18 @@ ++2019-01-16 Zack Weinberg ++ ++ * support/xsignal.h (xalloc_sigstack, xfree_sigstack) ++ (xget_sigstack_location): New test support functions. ++ * support/xsigstack.c: New file, implementing them. ++ * support/tst-xsigstack.c: New test for them. ++ * support/Makefile: Update. ++ ++ * signal/tst-minsigstksz-1.c ++ * signal/tst-minsigstksz-2.c ++ * signal/tst-minsigstksz-3.c ++ * signal/tst-minsigstksz-3a.c ++ * signal/tst-minsigstksz-4.c: New tests. ++ * signal/Makefile: Run them. ++ + 2018-12-19 Tulio Magno Quites Machado Filho + + * elf/dl-sysdep.c (auxvars): Add AT_L1I_CACHESIZE, +diff --git a/signal/Makefile b/signal/Makefile +index aa63434f..d5a10d59 100644 +--- a/signal/Makefile ++++ b/signal/Makefile +@@ -47,6 +47,8 @@ routines := signal raise killpg \ + + tests := tst-signal tst-sigset tst-sigsimple tst-raise tst-sigset2 \ + tst-sigwait-eintr tst-sigaction \ ++ tst-minsigstksz-1 tst-minsigstksz-2 tst-minsigstksz-3 \ ++ tst-minsigstksz-3a tst-minsigstksz-4 \ + + include ../Rules + +diff --git a/signal/tst-minsigstksz-1.c b/signal/tst-minsigstksz-1.c +new file mode 100644 +index 00000000..00344d5f +--- /dev/null ++++ b/signal/tst-minsigstksz-1.c +@@ -0,0 +1,131 @@ ++/* Tests of signal delivery on an alternate stack (nonlethal). ++ Copyright (C) 2019 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, see ++ . */ ++ ++#include ++#include ++#include ++ ++/* C2011 7.4.1.1p5 specifies that only the following operations are ++ guaranteed to be well-defined inside an asynchronous signal handler: ++ * any operation on a lock-free atomic object ++ * assigning a value to an object declared as volatile sig_atomic_t ++ * calling abort, _Exit, quick_exit, or signal ++ * signal may only be called with its first argument equal to the ++ number of the signal that caused the handler to be called ++ ++ We use this list as a guideline for the set of operations that ought ++ also to be safe in a _synchronous_ signal delivered on an alternate ++ signal stack with only MINSIGSTKSZ bytes of space. ++ ++ This test program tests all of the above operations that do not, ++ one way or another, cause the program to be terminated. */ ++ ++/* We do not try to test atomic operations exhaustively, only a simple ++ atomic counter increment. This is only safe if atomic_[u]int is ++ unconditionally lock-free. */ ++#ifdef __STDC_NO_ATOMICS__ ++# define TEST_ATOMIC_OPS 0 ++#else ++# include ++# if ATOMIC_INT_LOCK_FREE != 2 ++# define TEST_ATOMIC_OPS 0 ++# else ++# define TEST_ATOMIC_OPS 1 ++# endif ++#endif ++ ++static volatile sig_atomic_t signal_flag = 0; ++static volatile sig_atomic_t signal_err = 0; ++static void ++handler_set_flag (int unused) ++{ ++ signal_flag = 1; ++} ++ ++static void ++handler_set_flag_once (int sig) ++{ ++ signal_flag = 1; ++ if (signal (sig, SIG_IGN) == SIG_ERR) ++ /* It is not safe to call FAIL_EXIT1 here. Set another flag instead. */ ++ signal_err = 1; ++} ++ ++#if TEST_ATOMIC_OPS ++static atomic_uint signal_count = 0; ++static void ++handler_count_up_1 (int unused) ++{ ++ atomic_fetch_add (&signal_count, 1); ++} ++#endif ++ ++int ++do_test (void) ++{ ++ void *sstk = xalloc_sigstack (0); ++ struct sigaction sa; ++ ++ /* Test 1: setting a volatile sig_atomic_t flag. */ ++ sa.sa_handler = handler_set_flag; ++ sa.sa_flags = SA_RESTART | SA_ONSTACK; ++ sigfillset (&sa.sa_mask); ++ if (sigaction (SIGUSR1, &sa, 0)) ++ FAIL_EXIT1 ("sigaction (SIGUSR1, handler_set_flag): %m\n"); ++ ++ TEST_VERIFY_EXIT (signal_flag == 0); ++ raise (SIGUSR1); ++ TEST_VERIFY_EXIT (signal_flag == 1); ++ signal_flag = 0; ++ raise (SIGUSR1); ++ TEST_VERIFY_EXIT (signal_flag == 1); ++ signal_flag = 0; ++ ++ /* Test 1: setting a volatile sig_atomic_t flag and then ignoring ++ further delivery of the signal. */ ++ sa.sa_handler = handler_set_flag_once; ++ if (sigaction (SIGUSR1, &sa, 0)) ++ FAIL_EXIT1 ("sigaction (SIGUSR1, handler_set_flag_once): %m\n"); ++ ++ raise (SIGUSR1); ++ TEST_VERIFY_EXIT (signal_flag == 1); ++ /* Note: if signal_err is 1, a system call failed, but we can't ++ report the error code because errno is indeterminate. */ ++ TEST_VERIFY_EXIT (signal_err == 0); ++ ++ signal_flag = 0; ++ raise (SIGUSR1); ++ TEST_VERIFY_EXIT (signal_flag == 0); ++ TEST_VERIFY_EXIT (signal_err == 0); ++ ++#if TEST_ATOMIC_OPS ++ sa.sa_handler = handler_count_up_1; ++ if (sigaction (SIGUSR1, &sa, 0)) ++ FAIL_EXIT1 ("sigaction (SIGUSR1, handler_count_up_1): %m\n"); ++ ++ raise (SIGUSR1); ++ TEST_VERIFY_EXIT (atomic_load (&signal_count) == 1); ++ raise (SIGUSR1); ++ TEST_VERIFY_EXIT (atomic_load (&signal_count) == 2); ++#endif ++ ++ xfree_sigstack (sstk); ++ return 0; ++} ++ ++#include +diff --git a/signal/tst-minsigstksz-2.c b/signal/tst-minsigstksz-2.c +new file mode 100644 +index 00000000..3368dde6 +--- /dev/null ++++ b/signal/tst-minsigstksz-2.c +@@ -0,0 +1,66 @@ ++/* Tests of signal delivery on an alternate stack (abort). ++ Copyright (C) 2019 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, see ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++/* C2011 7.4.1.1p5 specifies that only the following operations are ++ guaranteed to be well-defined inside an asynchronous signal handler: ++ * any operation on a lock-free atomic object ++ * assigning a value to an object declared as volatile sig_atomic_t ++ * calling abort, _Exit, quick_exit, or signal ++ * signal may only be called with its first argument equal to the ++ number of the signal that caused the handler to be called ++ ++ We use this list as a guideline for the set of operations that ought ++ also to be safe in a _synchronous_ signal delivered on an alternate ++ signal stack with only MINSIGSTKSZ bytes of space. ++ ++ This test program tests calls to abort. Note that it does _not_ ++ install a handler for SIGABRT, because that signal would also be ++ delivered on the alternate stack and MINSIGSTKSZ does not provide ++ enough space for delivery of nested signals. */ ++ ++static void ++handler (int unused) ++{ ++ abort (); ++} ++ ++int ++do_test (void) ++{ ++ void *sstk = xalloc_sigstack (0); ++ struct sigaction sa; ++ ++ sa.sa_handler = handler; ++ sa.sa_flags = SA_RESTART | SA_ONSTACK; ++ sigfillset (&sa.sa_mask); ++ if (sigaction (SIGUSR1, &sa, 0)) ++ FAIL_RET ("sigaction (SIGUSR1, handler): %m\n"); ++ ++ raise (SIGUSR1); ++ ++ xfree_sigstack (sstk); ++ FAIL_RET ("test process was not terminated by abort in signal handler"); ++} ++ ++#define EXPECTED_SIGNAL SIGABRT ++#include +diff --git a/signal/tst-minsigstksz-3.c b/signal/tst-minsigstksz-3.c +new file mode 100644 +index 00000000..a8d9a636 +--- /dev/null ++++ b/signal/tst-minsigstksz-3.c +@@ -0,0 +1,64 @@ ++/* Tests of signal delivery on an alternate stack (_Exit). ++ Copyright (C) 2019 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, see ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++/* C2011 7.4.1.1p5 specifies that only the following operations are ++ guaranteed to be well-defined inside an asynchronous signal handler: ++ * any operation on a lock-free atomic object ++ * assigning a value to an object declared as volatile sig_atomic_t ++ * calling abort, _Exit, quick_exit, or signal ++ * signal may only be called with its first argument equal to the ++ number of the signal that caused the handler to be called ++ ++ We use this list as a guideline for the set of operations that ought ++ also to be safe in a _synchronous_ signal delivered on an alternate ++ signal stack with only MINSIGSTKSZ bytes of space. ++ ++ This test program tests calls to _Exit. */ ++ ++#define EXPECTED_STATUS 3 ++ ++static void ++handler (int unused) ++{ ++ _Exit (EXPECTED_STATUS); ++} ++ ++int ++do_test (void) ++{ ++ void *sstk = xalloc_sigstack (0); ++ struct sigaction sa; ++ ++ sa.sa_handler = handler; ++ sa.sa_flags = SA_RESTART | SA_ONSTACK; ++ sigfillset (&sa.sa_mask); ++ if (sigaction (SIGUSR1, &sa, 0)) ++ FAIL_RET ("sigaction (SIGUSR1, handler): %m\n"); ++ ++ raise (SIGUSR1); ++ ++ xfree_sigstack (sstk); ++ FAIL_RET ("test process was not terminated by _Exit in signal handler"); ++} ++ ++#include +diff --git a/signal/tst-minsigstksz-3a.c b/signal/tst-minsigstksz-3a.c +new file mode 100644 +index 00000000..b58b8d01 +--- /dev/null ++++ b/signal/tst-minsigstksz-3a.c +@@ -0,0 +1,69 @@ ++/* Tests of signal delivery on an alternate stack (_exit). ++ Copyright (C) 2019 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, see ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++/* C2011 7.4.1.1p5 specifies that only the following operations are ++ guaranteed to be well-defined inside an asynchronous signal handler: ++ * any operation on a lock-free atomic object ++ * assigning a value to an object declared as volatile sig_atomic_t ++ * calling abort, _Exit, quick_exit, or signal ++ * signal may only be called with its first argument equal to the ++ number of the signal that caused the handler to be called ++ ++ We use this list as a guideline for the set of operations that ought ++ also to be safe in a _synchronous_ signal delivered on an alternate ++ signal stack with only MINSIGSTKSZ bytes of space. ++ ++ This test program tests calls to _exit, which is the same function ++ as _Exit, but specified by POSIX rather than ISO C. For reasons ++ unknown to the author of this program, the C committee did not ++ think it could standardize _exit under that name; regardless, in a ++ POSIX-conformant environment, they should be completely ++ interchangeable. */ ++ ++#define EXPECTED_STATUS 3 ++ ++static void ++handler (int unused) ++{ ++ _exit (EXPECTED_STATUS); ++} ++ ++int ++do_test (void) ++{ ++ void *sstk = xalloc_sigstack (0); ++ struct sigaction sa; ++ ++ sa.sa_handler = handler; ++ sa.sa_flags = SA_RESTART | SA_ONSTACK; ++ sigfillset (&sa.sa_mask); ++ if (sigaction (SIGUSR1, &sa, 0)) ++ FAIL_RET ("sigaction (SIGUSR1, handler): %m\n"); ++ ++ raise (SIGUSR1); ++ ++ xfree_sigstack (sstk); ++ FAIL_RET ("test process was not terminated by _exit in signal handler"); ++} ++ ++#include +diff --git a/signal/tst-minsigstksz-4.c b/signal/tst-minsigstksz-4.c +new file mode 100644 +index 00000000..0dc63b4d +--- /dev/null ++++ b/signal/tst-minsigstksz-4.c +@@ -0,0 +1,65 @@ ++/* Tests of signal delivery on an alternate stack (quick_exit). ++ Copyright (C) 2019 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, see ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++/* C2011 7.4.1.1p5 specifies that only the following operations are ++ guaranteed to be well-defined inside an asynchronous signal handler: ++ * any operation on a lock-free atomic object ++ * assigning a value to an object declared as volatile sig_atomic_t ++ * calling abort, _Exit, quick_exit, or signal ++ * signal may only be called with its first argument equal to the ++ number of the signal that caused the handler to be called ++ ++ We use this list as a guideline for the set of operations that ought ++ also to be safe in a _synchronous_ signal delivered on an alternate ++ signal stack with only MINSIGSTKSZ bytes of space. ++ ++ This test program tests calls to quick_exit. Note that this is only ++ safe when there are no at_quick_exit callbacks. */ ++ ++#define EXPECTED_STATUS 3 ++ ++static void ++handler (int unused) ++{ ++ quick_exit (EXPECTED_STATUS); ++} ++ ++int ++do_test (void) ++{ ++ void *sstk = xalloc_sigstack (0); ++ struct sigaction sa; ++ ++ sa.sa_handler = handler; ++ sa.sa_flags = SA_RESTART | SA_ONSTACK; ++ sigfillset (&sa.sa_mask); ++ if (sigaction (SIGUSR1, &sa, 0)) ++ FAIL_RET ("sigaction (SIGUSR1, handler): %m\n"); ++ ++ raise (SIGUSR1); ++ ++ xfree_sigstack (sstk); ++ FAIL_RET ("test process was not terminated by quick_exit in signal handler"); ++} ++ ++#include +diff --git a/support/Makefile b/support/Makefile +index dcf3c4ba..619b6d44 100644 +--- a/support/Makefile ++++ b/support/Makefile +@@ -157,6 +157,7 @@ libsupport-routines = \ + xsetsockopt \ + xsigaction \ + xsignal \ ++ xsigstack \ + xsocket \ + xposix_spawn \ + xposix_spawn_file_actions_addclose \ +@@ -231,6 +232,7 @@ tests = \ + tst-test_compare_blob \ + tst-test_compare_string \ + tst-xreadlink \ ++ tst-xsigstack \ + + ifeq ($(run-built-tests),yes) + tests-special = \ +diff --git a/support/tst-xsigstack.c b/support/tst-xsigstack.c +new file mode 100644 +index 00000000..42859c79 +--- /dev/null ++++ b/support/tst-xsigstack.c +@@ -0,0 +1,64 @@ ++/* Test of sigaltstack wrappers. ++ Copyright (C) 2019 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, see ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++static volatile uintptr_t handler_stackaddr; ++ ++static void ++handler (int unused) ++{ ++ int var; ++ handler_stackaddr = (uintptr_t) &var; ++} ++ ++int ++do_test (void) ++{ ++ void *sstk = xalloc_sigstack (0); ++ ++ unsigned char *sp; ++ size_t size; ++ xget_sigstack_location (sstk, &sp, &size); ++ printf ("signal stack installed: sp=%p size=%zu\n", sp, size); ++ ++ struct sigaction sa; ++ sa.sa_handler = handler; ++ sa.sa_flags = SA_RESTART | SA_ONSTACK; ++ sigfillset (&sa.sa_mask); ++ if (sigaction (SIGUSR1, &sa, 0)) ++ FAIL_RET ("sigaction (SIGUSR1, handler): %m\n"); ++ ++ raise (SIGUSR1); ++ ++ uintptr_t haddr = handler_stackaddr; ++ printf ("address of handler local variable: %p\n", (void *)haddr); ++ TEST_VERIFY ((uintptr_t)sp < haddr); ++ TEST_VERIFY (haddr < (uintptr_t)sp + size); ++ ++ xfree_sigstack (sstk); ++ return 0; ++} ++ ++#include +diff --git a/support/xsignal.h b/support/xsignal.h +index 9ab8d1bf..9d68558f 100644 +--- a/support/xsignal.h ++++ b/support/xsignal.h +@@ -37,6 +37,23 @@ void xsigaction (int sig, const struct sigaction *newact, + + void xpthread_sigmask (int how, const sigset_t *set, sigset_t *oldset); + ++/* Allocate and activate an alternate signal stack. This stack will ++ have SIZE + MINSIGSTKSZ bytes of space, rounded up to a whole ++ number of pages. There will be large (at least 1 MiB) inaccessible ++ guard bands on either side of it. The return value is a cookie ++ that can be passed to xfree_sigstack to deactivate and deallocate ++ the stack again. It is not necessary to call sigaltstack after ++ calling this function. Terminates the process on error. */ ++void *xalloc_sigstack (size_t size); ++ ++/* Deactivate and deallocate a signal stack created by xalloc_sigstack. */ ++void xfree_sigstack (void *stack); ++ ++/* Extract the actual address and size of the alternate signal stack from ++ the cookie returned by xalloc_sigstack. */ ++void xget_sigstack_location (const void *stack, unsigned char **addrp, ++ size_t *sizep); ++ + __END_DECLS + + #endif /* SUPPORT_SIGNAL_H */ +diff --git a/support/xsigstack.c b/support/xsigstack.c +new file mode 100644 +index 00000000..cebfa19a +--- /dev/null ++++ b/support/xsigstack.c +@@ -0,0 +1,107 @@ ++/* sigaltstack wrappers. ++ Copyright (C) 2019 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, see ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include /* roundup, MAX */ ++ ++/* The "cookie" returned by xalloc_sigstack points to one of these ++ structures. */ ++struct sigstack_desc ++{ ++ void *alloc_base; /* Base address of the complete allocation. */ ++ size_t alloc_size; /* Size of the complete allocation. */ ++ stack_t alt_stack; /* The address and size of the stack itself. */ ++ stack_t old_stack; /* The previous signal stack. */ ++}; ++ ++void * ++xalloc_sigstack (size_t size) ++{ ++ size_t pagesize = sysconf (_SC_PAGESIZE); ++ if (pagesize == -1) ++ FAIL_EXIT1 ("sysconf (_SC_PAGESIZE): %m\n"); ++ ++ /* Always supply at least MINSIGSTKSZ space; passing 0 as size means ++ only that much space. No matter what the number is, round it up ++ to a whole number of pages. */ ++ size_t stacksize = roundup (size + MINSIGSTKSZ, pagesize); ++ ++ /* The guard bands need to be large enough to intercept offset ++ accesses from a stack address that might otherwise hit another ++ mapping. Make them at least twice as big as the stack itself, to ++ defend against an offset by the entire size of a large ++ stack-allocated array. The minimum is 1MiB, which is arbitrarily ++ chosen to be larger than any "typical" wild pointer offset. ++ Again, no matter what the number is, round it up to a whole ++ number of pages. */ ++ size_t guardsize = roundup (MAX (2 * stacksize, 1024 * 1024), pagesize); ++ ++ struct sigstack_desc *desc = xmalloc (sizeof (struct sigstack_desc)); ++ desc->alloc_size = guardsize + stacksize + guardsize; ++ /* Use MAP_NORESERVE so that RAM will not be wasted on the guard ++ bands; touch all the pages of the actual stack before returning, ++ so we know they are allocated. */ ++ desc->alloc_base = xmmap (0, ++ desc->alloc_size, ++ PROT_READ|PROT_WRITE, ++ MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE|MAP_STACK, ++ -1); ++ ++ xmprotect (desc->alloc_base, guardsize, PROT_NONE); ++ xmprotect (desc->alloc_base + guardsize + stacksize, guardsize, PROT_NONE); ++ memset (desc->alloc_base + guardsize, 0xA5, stacksize); ++ ++ desc->alt_stack.ss_sp = desc->alloc_base + guardsize; ++ desc->alt_stack.ss_flags = 0; ++ desc->alt_stack.ss_size = stacksize; ++ ++ if (sigaltstack (&desc->alt_stack, &desc->old_stack)) ++ FAIL_EXIT1 ("sigaltstack (new stack: sp=%p, size=%zu, flags=%u): %m\n", ++ desc->alt_stack.ss_sp, desc->alt_stack.ss_size, ++ desc->alt_stack.ss_flags); ++ ++ return desc; ++} ++ ++void ++xfree_sigstack (void *stack) ++{ ++ struct sigstack_desc *desc = stack; ++ ++ if (sigaltstack (&desc->old_stack, 0)) ++ FAIL_EXIT1 ("sigaltstack (restore old stack: sp=%p, size=%zu, flags=%u): " ++ "%m\n", desc->old_stack.ss_sp, desc->old_stack.ss_size, ++ desc->old_stack.ss_flags); ++ xmunmap (desc->alloc_base, desc->alloc_size); ++ free (desc); ++} ++ ++void ++xget_sigstack_location (const void *stack, unsigned char **addrp, size_t *sizep) ++{ ++ const struct sigstack_desc *desc = stack; ++ *addrp = desc->alt_stack.ss_sp; ++ *sizep = desc->alt_stack.ss_size; ++} +-- +2.27.0 + diff --git a/SOURCES/0004-Disable-lazy-binding-on-tests-for-minimal-signal-han.patch b/SOURCES/0004-Disable-lazy-binding-on-tests-for-minimal-signal-han.patch new file mode 100644 index 0000000..cfed863 --- /dev/null +++ b/SOURCES/0004-Disable-lazy-binding-on-tests-for-minimal-signal-han.patch @@ -0,0 +1,64 @@ +From 373f9cff2872cf76b9aee6b4fe7719e04dda122f Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Fri, 18 Jan 2019 08:56:51 -0800 +Subject: [PATCH 4/5] Disable lazy binding on tests for minimal signal handler + +Since MINSIGSTKSZ may not have sufficent stack space to allow lazy +binding, build tests for minimal signal handler with -Wl,-z,now to +disable lazy binding. + + * signal/Makefile (LDFLAGS-tst-minsigstksz-1): New. Set to + -Wl,-z,now. + (LDFLAGS-tst-minsigstksz-2): Likewise. + (LDFLAGS-tst-minsigstksz-3): Likewise. + (LDFLAGS-tst-minsigstksz-3a): Likewise. + (LDFLAGS-tst-minsigstksz-4): Likewise. + +Reviewed-by: Carlos O'Donell + +UPDATE: + +Backported to glibc 2.28 + +Signed-off-by: Jair Gonzalez +--- + ChangeLog | 9 +++++++++ + signal/Makefile | 8 ++++++++ + 2 files changed, 17 insertions(+) + +diff --git a/ChangeLog b/ChangeLog +index 9e33b6cb..ccd5ff21 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,12 @@ ++2019-01-18 H.J. Lu ++ ++ * signal/Makefile (LDFLAGS-tst-minsigstksz-1): New. Set to ++ -Wl,-z,now. ++ (LDFLAGS-tst-minsigstksz-2): Likewise. ++ (LDFLAGS-tst-minsigstksz-3): Likewise. ++ (LDFLAGS-tst-minsigstksz-3a): Likewise. ++ (LDFLAGS-tst-minsigstksz-4): Likewise. ++ + 2019-01-16 Zack Weinberg + + * support/xsignal.h (xalloc_sigstack, xfree_sigstack) +diff --git a/signal/Makefile b/signal/Makefile +index d5a10d59..7767bb28 100644 +--- a/signal/Makefile ++++ b/signal/Makefile +@@ -59,3 +59,11 @@ CFLAGS-sigwait.c += -fexceptions -fasynchronous-unwind-tables + CFLAGS-sigwaitinfo.c += -fexceptions -fasynchronous-unwind-tables + + CFLAGS-sigreturn.c += $(no-stack-protector) ++ ++# We don't want to test the lazy resolution stack usage, just the ++# execution of the handler and the functions. ++LDFLAGS-tst-minsigstksz-1 = -Wl,-z,now ++LDFLAGS-tst-minsigstksz-2 = -Wl,-z,now ++LDFLAGS-tst-minsigstksz-3 = -Wl,-z,now ++LDFLAGS-tst-minsigstksz-3a = -Wl,-z,now ++LDFLAGS-tst-minsigstksz-4 = -Wl,-z,now +-- +2.27.0 + diff --git a/SOURCES/0005-sysconf-Add-_SC_MINSIGSTKSZ-_SC_SIGSTKSZ-BZ-20305.patch b/SOURCES/0005-sysconf-Add-_SC_MINSIGSTKSZ-_SC_SIGSTKSZ-BZ-20305.patch new file mode 100644 index 0000000..0127da4 --- /dev/null +++ b/SOURCES/0005-sysconf-Add-_SC_MINSIGSTKSZ-_SC_SIGSTKSZ-BZ-20305.patch @@ -0,0 +1,774 @@ +From 232e45c1720857fbf1948c4aeba39a3c8cc52335 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Mon, 1 Feb 2021 11:00:38 -0800 +Subject: [PATCH 5/5] sysconf: Add _SC_MINSIGSTKSZ/_SC_SIGSTKSZ [BZ #20305] + +Add _SC_MINSIGSTKSZ for the minimum signal stack size derived from +AT_MINSIGSTKSZ, which is the minimum number of bytes of free stack +space required in order to gurantee successful, non-nested handling +of a single signal whose handler is an empty function, and _SC_SIGSTKSZ +which is the suggested minimum number of bytes of stack space required +for a signal stack. + +If AT_MINSIGSTKSZ isn't available, sysconf (_SC_MINSIGSTKSZ) returns +MINSIGSTKSZ. On Linux/x86 with XSAVE, the signal frame used by kernel +is composed of the following areas and laid out as: + + ------------------------------ + | alignment padding | + ------------------------------ + | xsave buffer | + ------------------------------ + | fsave header (32-bit only) | + ------------------------------ + | siginfo + ucontext | + ------------------------------ + +Compute AT_MINSIGSTKSZ value as size of xsave buffer + size of fsave +header (32-bit only) + size of siginfo and ucontext + alignment padding. + +If _SC_SIGSTKSZ_SOURCE or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ +are redefined as + +/* Default stack size for a signal handler: sysconf (SC_SIGSTKSZ). */ + # undef SIGSTKSZ + # define SIGSTKSZ sysconf (_SC_SIGSTKSZ) + +/* Minimum stack size for a signal handler: SIGSTKSZ. */ + # undef MINSIGSTKSZ + # define MINSIGSTKSZ SIGSTKSZ + +Compilation will fail if the source assumes constant MINSIGSTKSZ or +SIGSTKSZ. + +The reason for not simply increasing the kernel's MINSIGSTKSZ #define +(apart from the fact that it is rarely used, due to glibc's shadowing +definitions) was that userspace binaries will have baked in the old +value of the constant and may be making assumptions about it. + +For example, the type (char [MINSIGSTKSZ]) changes if this #define +changes. This could be a problem if an newly built library tries to +memcpy() or dump such an object defined by and old binary. +Bounds-checking and the stack sizes passed to things like sigaltstack() +and makecontext() could similarly go wrong. + +UPDATE: + +Backported to glibc 2.28 + +Signed-off-by: Jair Gonzalez +--- + NEWS | 5 ++ + bits/confname.h | 8 +- + bits/sigstksz.h | 21 +++++ + elf/dl-support.c | 5 ++ + elf/dl-sysdep.c | 9 ++ + include/bits/sigstack.h | 5 ++ + include/bits/sigstksz.h | 7 ++ + include/features.h | 11 +++ + manual/conf.texi | 21 +++++ + manual/creature.texi | 6 ++ + posix/sysconf.c | 3 + + signal/Makefile | 5 +- + signal/signal.h | 1 + + signal/tst-minsigstksz-5.c | 84 +++++++++++++++++++ + sysdeps/generic/ldsodefs.h | 3 + + sysdeps/unix/sysv/linux/bits/sigstksz.h | 33 ++++++++ + .../unix/sysv/linux/ia64/sysconf-sigstksz.h | 27 ++++++ + sysdeps/unix/sysv/linux/sysconf-sigstksz.h | 38 +++++++++ + sysdeps/unix/sysv/linux/sysconf.c | 9 ++ + .../unix/sysv/linux/x86/dl-minsigstacksize.h | 83 ++++++++++++++++++ + .../sysv/linux/x86/include/bits/sigstack.h | 5 ++ + sysdeps/x86/dl-minsigstacksize.h | 27 ++++++ + 22 files changed, 413 insertions(+), 3 deletions(-) + create mode 100644 bits/sigstksz.h + create mode 100644 include/bits/sigstack.h + create mode 100644 include/bits/sigstksz.h + create mode 100644 signal/tst-minsigstksz-5.c + create mode 100644 sysdeps/unix/sysv/linux/bits/sigstksz.h + create mode 100644 sysdeps/unix/sysv/linux/ia64/sysconf-sigstksz.h + create mode 100644 sysdeps/unix/sysv/linux/sysconf-sigstksz.h + create mode 100644 sysdeps/unix/sysv/linux/x86/dl-minsigstacksize.h + create mode 100644 sysdeps/unix/sysv/linux/x86/include/bits/sigstack.h + create mode 100644 sysdeps/x86/dl-minsigstacksize.h + +diff --git a/NEWS b/NEWS +index 154ab22d..e0e95cb8 100644 +--- a/NEWS ++++ b/NEWS +@@ -9,6 +9,11 @@ Version 2.28 + + Major new features: + ++* Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ. When _SC_SIGSTKSZ_SOURCE or ++ _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer ++ constant on Linux. MINSIGSTKSZ is redefined to sysconf(_SC_MINSIGSTKSZ) ++ and SIGSTKSZ is redefined to sysconf (_SC_SIGSTKSZ). ++ + * The localization data for ISO 14651 is updated to match the 2016 + Edition 4 release of the standard, this matches data provided by + Unicode 9.0.0. This update introduces significant improvements to the +diff --git a/bits/confname.h b/bits/confname.h +index 59d31721..36279222 100644 +--- a/bits/confname.h ++++ b/bits/confname.h +@@ -525,8 +525,14 @@ enum + + _SC_THREAD_ROBUST_PRIO_INHERIT, + #define _SC_THREAD_ROBUST_PRIO_INHERIT _SC_THREAD_ROBUST_PRIO_INHERIT +- _SC_THREAD_ROBUST_PRIO_PROTECT ++ _SC_THREAD_ROBUST_PRIO_PROTECT, + #define _SC_THREAD_ROBUST_PRIO_PROTECT _SC_THREAD_ROBUST_PRIO_PROTECT ++ ++ _SC_MINSIGSTKSZ, ++#define _SC_MINSIGSTKSZ _SC_MINSIGSTKSZ ++ ++ _SC_SIGSTKSZ ++#define _SC_SIGSTKSZ _SC_SIGSTKSZ + }; + + /* Values for the NAME argument to `confstr'. */ +diff --git a/bits/sigstksz.h b/bits/sigstksz.h +new file mode 100644 +index 00000000..5535d873 +--- /dev/null ++++ b/bits/sigstksz.h +@@ -0,0 +1,21 @@ ++/* Definition of MINSIGSTKSZ. Generic version. ++ Copyright (C) 2020 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, see ++ . */ ++ ++#ifndef _SIGNAL_H ++# error "Never include directly; use instead." ++#endif +diff --git a/elf/dl-support.c b/elf/dl-support.c +index 34be8e5b..056945d7 100644 +--- a/elf/dl-support.c ++++ b/elf/dl-support.c +@@ -131,6 +131,8 @@ void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls; + + size_t _dl_pagesize = EXEC_PAGESIZE; + ++size_t _dl_minsigstacksize = CONSTANT_MINSIGSTKSZ; ++ + int _dl_inhibit_cache; + + unsigned int _dl_osversion; +@@ -287,6 +289,9 @@ _dl_aux_init (ElfW(auxv_t) *av) + case AT_RANDOM: + _dl_random = (void *) av->a_un.a_val; + break; ++ case AT_MINSIGSTKSZ: ++ _dl_minsigstacksize = av->a_un.a_val; ++ break; + # ifdef DL_PLATFORM_AUXV + DL_PLATFORM_AUXV + # endif +diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c +index 93983251..4bcd75b4 100644 +--- a/elf/dl-sysdep.c ++++ b/elf/dl-sysdep.c +@@ -116,6 +116,11 @@ _dl_sysdep_start (void **start_argptr, + user_entry = (ElfW(Addr)) ENTRY_POINT; + GLRO(dl_platform) = NULL; /* Default to nothing known about the platform. */ + ++ /* NB: Default to a constant CONSTANT_MINSIGSTKSZ. */ ++ _Static_assert (__builtin_constant_p (CONSTANT_MINSIGSTKSZ), ++ "CONSTANT_MINSIGSTKSZ is constant"); ++ GLRO(dl_minsigstacksize) = CONSTANT_MINSIGSTKSZ; ++ + for (av = GLRO(dl_auxv); av->a_type != AT_NULL; set_seen (av++)) + switch (av->a_type) + { +@@ -180,6 +185,9 @@ _dl_sysdep_start (void **start_argptr, + case AT_RANDOM: + _dl_random = (void *) av->a_un.a_val; + break; ++ case AT_MINSIGSTKSZ: ++ GLRO(dl_minsigstacksize) = av->a_un.a_val; ++ break; + #ifdef DL_PLATFORM_AUXV + DL_PLATFORM_AUXV + #endif +@@ -317,6 +325,7 @@ _dl_show_auxv (void) + [AT_L2_CACHEGEOMETRY - 2] = { "L2_CACHEGEOMETRY: 0x", hex }, + [AT_L3_CACHESIZE - 2] = { "L3_CACHESIZE: ", dec }, + [AT_L3_CACHEGEOMETRY - 2] = { "L3_CACHEGEOMETRY: 0x", hex }, ++ [AT_MINSIGSTKSZ - 2] = { "MINSIGSTKSZ ", dec }, + }; + unsigned int idx = (unsigned int) (av->a_type - 2); + +diff --git a/include/bits/sigstack.h b/include/bits/sigstack.h +new file mode 100644 +index 00000000..eea939f5 +--- /dev/null ++++ b/include/bits/sigstack.h +@@ -0,0 +1,5 @@ ++#include_next ++ ++#if !defined _ISOMAC && !defined CONSTANT_MINSIGSTKSZ ++# define CONSTANT_MINSIGSTKSZ MINSIGSTKSZ ++#endif +diff --git a/include/bits/sigstksz.h b/include/bits/sigstksz.h +new file mode 100644 +index 00000000..2ca891e9 +--- /dev/null ++++ b/include/bits/sigstksz.h +@@ -0,0 +1,7 @@ ++/* NB: Don't define MINSIGSTKSZ nor SIGSTKSZ to sysconf (SC_SIGSTKSZ) for ++ glibc build. IS_IN can only be used when _ISOMAC isn't defined. */ ++#ifdef _ISOMAC ++# include_next ++#elif IS_IN (libsupport) ++# include_next ++#endif +diff --git a/include/features.h b/include/features.h +index 5bed0a49..fdc3d11d 100644 +--- a/include/features.h ++++ b/include/features.h +@@ -47,6 +47,8 @@ + _LARGEFILE64_SOURCE Additional functionality from LFS for large files. + _FILE_OFFSET_BITS=N Select default filesystem interface. + _ATFILE_SOURCE Additional *at interfaces. ++ _SC_SIGSTKSZ_SOURCE Select correct (but non compile-time constant) ++ MINSIGSTKSZ and SIGSTKSZ. + _GNU_SOURCE All of the above, plus GNU extensions. + _DEFAULT_SOURCE The default set of features (taking precedence over + __STRICT_ANSI__). +@@ -93,6 +95,8 @@ + __USE_FILE_OFFSET64 Define 64bit interface as default. + __USE_MISC Define things from 4.3BSD or System V Unix. + __USE_ATFILE Define *at interfaces and AT_* constants for them. ++ __USE_SC_SIGSTKSZ Define correct (but non compile-time constant) ++ MINSIGSTKSZ and SIGSTKSZ. + __USE_GNU Define GNU extensions. + __USE_FORTIFY_LEVEL Additional security measures used, according to level. + +@@ -136,6 +140,7 @@ + #undef __USE_FILE_OFFSET64 + #undef __USE_MISC + #undef __USE_ATFILE ++#undef __USE_SC_SIGSTKSZ + #undef __USE_GNU + #undef __USE_FORTIFY_LEVEL + #undef __KERNEL_STRICT_NAMES +@@ -208,6 +213,8 @@ + # define _DEFAULT_SOURCE 1 + # undef _ATFILE_SOURCE + # define _ATFILE_SOURCE 1 ++# undef _SC_SIGSTKSZ_SOURCE ++# define _SC_SIGSTKSZ_SOURCE 1 + #endif + + /* If nothing (other than _GNU_SOURCE and _DEFAULT_SOURCE) is defined, +@@ -372,6 +379,10 @@ + # define __USE_ATFILE 1 + #endif + ++#ifdef _SC_SIGSTKSZ_SOURCE ++# define __USE_SC_SIGSTKSZ 1 ++#endif ++ + #ifdef _GNU_SOURCE + # define __USE_GNU 1 + #endif +diff --git a/manual/conf.texi b/manual/conf.texi +index dbd1d302..7321f401 100644 +--- a/manual/conf.texi ++++ b/manual/conf.texi +@@ -911,6 +911,27 @@ Inquire about the parameter corresponding to @code{NL_SETMAX}. + @item _SC_NL_TEXTMAX + @standards{X/Open, unistd.h} + Inquire about the parameter corresponding to @code{NL_TEXTMAX}. ++ ++@item _SC_MINSIGSTKSZ ++@standards{GNU, unistd.h} ++Inquire about the minimum number of bytes of free stack space required ++in order to guarantee successful, non-nested handling of a single signal ++whose handler is an empty function. ++ ++@item _SC_SIGSTKSZ ++@standards{GNU, unistd.h} ++Inquire about the suggested minimum number of bytes of stack space ++required for a signal stack. ++ ++This is not guaranteed to be enough for any specific purpose other than ++the invocation of a single, non-nested, empty handler, but nonetheless ++should be enough for basic scenarios involving simple signal handlers ++and very low levels of signal nesting (say, 2 or 3 levels at the very ++most). ++ ++This value is provided for developer convenience and to ease migration ++from the legacy @code{SIGSTKSZ} constant. Programs requiring stronger ++guarantees should avoid using it if at all possible. + @end vtable + + @node Examples of Sysconf +--- a/manual/creature.texi 2022-04-14 11:40:12.081653162 +0300 ++++ b/manual/creature.texi 2022-04-14 11:41:54.376167038 +0300 +@@ -251,6 +251,12 @@ + checks that may have an additional performance overhead. + @end defvr + ++@defvr Macro _SC_SIGSTKSZ_SOURCE ++@standards{GNU, (none)} ++If this macro is defined, correct (but non compile-time constant) ++MINSIGSTKSZ and SIGSTKSZ are defined. ++@end defvr ++ + @defvr Macro _REENTRANT + @defvrx Macro _THREAD_SAFE + @standards{Obsolete, (none)} +diff --git a/posix/sysconf.c b/posix/sysconf.c +index 09ebd95a..48c925f5 100644 +--- a/posix/sysconf.c ++++ b/posix/sysconf.c +@@ -266,6 +266,9 @@ __sysconf (int name) + case _SC_XOPEN_REALTIME: + case _SC_XOPEN_REALTIME_THREADS: + ++ case _SC_MINSIGSTKSZ: ++ case _SC_SIGSTKSZ: ++ + break; + } + +diff --git a/signal/Makefile b/signal/Makefile +index 7767bb28..cd85b8b6 100644 +--- a/signal/Makefile ++++ b/signal/Makefile +@@ -31,7 +31,8 @@ headers := signal.h sys/signal.h \ + bits/types/sigevent_t.h bits/types/siginfo_t.h \ + bits/types/sigset_t.h bits/types/sigval_t.h \ + bits/types/stack_t.h bits/types/struct_sigstack.h \ +- bits/types/__sigval_t.h ++ bits/types/__sigval_t.h \ ++ bits/sigstksz.h + + routines := signal raise killpg \ + sigaction sigprocmask kill \ +@@ -48,7 +49,7 @@ routines := signal raise killpg \ + tests := tst-signal tst-sigset tst-sigsimple tst-raise tst-sigset2 \ + tst-sigwait-eintr tst-sigaction \ + tst-minsigstksz-1 tst-minsigstksz-2 tst-minsigstksz-3 \ +- tst-minsigstksz-3a tst-minsigstksz-4 \ ++ tst-minsigstksz-3a tst-minsigstksz-4 tst-minsigstksz-5 + + include ../Rules + +diff --git a/signal/signal.h b/signal/signal.h +index 87dc82a9..8ebfc6e6 100644 +--- a/signal/signal.h ++++ b/signal/signal.h +@@ -314,6 +314,7 @@ extern int sigreturn (struct sigcontext *__scp) __THROW; + extern int siginterrupt (int __sig, int __interrupt) __THROW; + + # include ++# include + # include + + /* Alternate signal handler stack interface. +diff --git a/signal/tst-minsigstksz-5.c b/signal/tst-minsigstksz-5.c +new file mode 100644 +index 00000000..d657d2f4 +--- /dev/null ++++ b/signal/tst-minsigstksz-5.c +@@ -0,0 +1,84 @@ ++/* Test of signal delivery on an alternate stack with MINSIGSTKSZ size. ++ Copyright (C) 2020 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, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static volatile sig_atomic_t handler_run; ++ ++static void ++handler (int signo) ++{ ++ /* Clear a bit of on-stack memory. */ ++ volatile char buffer[256]; ++ for (size_t i = 0; i < sizeof (buffer); ++i) ++ buffer[i] = 0; ++ handler_run = 1; ++} ++ ++int ++do_test (void) ++{ ++ size_t stack_buffer_size = 64 * 1024 * 1024; ++ void *stack_buffer = xmalloc (stack_buffer_size); ++ void *stack_end = stack_buffer + stack_buffer_size; ++ memset (stack_buffer, 0xCC, stack_buffer_size); ++ ++ void *stack_bottom = stack_buffer + (stack_buffer_size + MINSIGSTKSZ) / 2; ++ void *stack_top = stack_bottom + MINSIGSTKSZ; ++ stack_t stack = ++ { ++ .ss_sp = stack_bottom, ++ .ss_size = MINSIGSTKSZ, ++ }; ++ if (sigaltstack (&stack, NULL) < 0) ++ FAIL_RET ("sigaltstack: %m\n"); ++ ++ struct sigaction act = ++ { ++ .sa_handler = handler, ++ .sa_flags = SA_ONSTACK, ++ }; ++ if (sigaction (SIGUSR1, &act, NULL) < 0) ++ FAIL_RET ("sigaction: %m\n"); ++ ++ if (kill (getpid (), SIGUSR1) < 0) ++ FAIL_RET ("kill: %m\n"); ++ ++ if (handler_run != 1) ++ FAIL_RET ("handler did not run\n"); ++ ++ for (void *p = stack_buffer; p < stack_bottom; ++p) ++ if (*(unsigned char *) p != 0xCC) ++ FAIL_RET ("changed byte %ld bytes below configured stack\n", ++ (long) (stack_bottom - p)); ++ for (void *p = stack_top; p < stack_end; ++p) ++ if (*(unsigned char *) p != 0xCC) ++ FAIL_RET ("changed byte %ld bytes above configured stack\n", ++ (long) (p - stack_top)); ++ ++ free (stack_buffer); ++ ++ return 0; ++} ++ ++#include +diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h +index 6cbbaa80..a15bf2e5 100644 +--- a/sysdeps/generic/ldsodefs.h ++++ b/sysdeps/generic/ldsodefs.h +@@ -527,6 +527,9 @@ struct rtld_global_ro + /* Cached value of `getpagesize ()'. */ + EXTERN size_t _dl_pagesize; + ++ /* Cached value of `sysconf (_SC_MINSIGSTKSZ)'. */ ++ EXTERN size_t _dl_minsigstacksize; ++ + /* Do we read from ld.so.cache? */ + EXTERN int _dl_inhibit_cache; + +diff --git a/sysdeps/unix/sysv/linux/bits/sigstksz.h b/sysdeps/unix/sysv/linux/bits/sigstksz.h +new file mode 100644 +index 00000000..926508f2 +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/bits/sigstksz.h +@@ -0,0 +1,33 @@ ++/* Definition of MINSIGSTKSZ and SIGSTKSZ. Linux version. ++ Copyright (C) 2020 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, see ++ . */ ++ ++#ifndef _SIGNAL_H ++# error "Never include directly; use instead." ++#endif ++ ++#if defined __USE_SC_SIGSTKSZ && __USE_SC_SIGSTKSZ ++# include ++ ++/* Default stack size for a signal handler: sysconf (SC_SIGSTKSZ). */ ++# undef SIGSTKSZ ++# define SIGSTKSZ sysconf (_SC_SIGSTKSZ) ++ ++/* Minimum stack size for a signal handler: SIGSTKSZ. */ ++# undef MINSIGSTKSZ ++# define MINSIGSTKSZ SIGSTKSZ ++#endif +diff --git a/sysdeps/unix/sysv/linux/ia64/sysconf-sigstksz.h b/sysdeps/unix/sysv/linux/ia64/sysconf-sigstksz.h +new file mode 100644 +index 00000000..7e5ceba1 +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/ia64/sysconf-sigstksz.h +@@ -0,0 +1,27 @@ ++/* sysconf_sigstksz (). Linux/ia64 version. ++ Copyright (C) 2020 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, see ++ . */ ++ ++/* Return sysconf (_SC_SIGSTKSZ). */ ++ ++static long int ++sysconf_sigstksz (void) ++{ ++ _Static_assert (__builtin_constant_p (SIGSTKSZ), ++ "SIGSTKSZ is constant"); ++ return SIGSTKSZ; ++} +diff --git a/sysdeps/unix/sysv/linux/sysconf-sigstksz.h b/sysdeps/unix/sysv/linux/sysconf-sigstksz.h +new file mode 100644 +index 00000000..64d450b2 +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/sysconf-sigstksz.h +@@ -0,0 +1,38 @@ ++/* sysconf_sigstksz (). Linux version. ++ Copyright (C) 2020 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, see ++ . */ ++ ++/* Return sysconf (_SC_SIGSTKSZ). */ ++ ++static long int ++sysconf_sigstksz (void) ++{ ++ long int minsigstacksize = GLRO(dl_minsigstacksize); ++ assert (minsigstacksize != 0); ++ _Static_assert (__builtin_constant_p (MINSIGSTKSZ), ++ "MINSIGSTKSZ is constant"); ++ if (minsigstacksize < MINSIGSTKSZ) ++ minsigstacksize = MINSIGSTKSZ; ++ /* MAX (MINSIGSTKSZ, sysconf (_SC_MINSIGSTKSZ)) * 4. */ ++ long int sigstacksize = minsigstacksize * 4; ++ /* Return MAX (SIGSTKSZ, sigstacksize). */ ++ _Static_assert (__builtin_constant_p (SIGSTKSZ), ++ "SIGSTKSZ is constant"); ++ if (sigstacksize < SIGSTKSZ) ++ sigstacksize = SIGSTKSZ; ++ return sigstacksize; ++} +diff --git a/sysdeps/unix/sysv/linux/sysconf.c b/sysdeps/unix/sysv/linux/sysconf.c +index 6fab1601..4aa9b171 100644 +--- a/sysdeps/unix/sysv/linux/sysconf.c ++++ b/sysdeps/unix/sysv/linux/sysconf.c +@@ -16,6 +16,7 @@ + License along with the GNU C Library; if not, see + . */ + ++#include + #include + #include + #include +@@ -26,6 +27,7 @@ + #include + #include + #include ++#include + + /* Legacy value of ARG_MAX. The macro is now not defined since the + actual value varies based on the stack size. */ +@@ -75,6 +77,13 @@ __sysconf (int name) + } + break; + ++ case _SC_MINSIGSTKSZ: ++ assert (GLRO(dl_minsigstacksize) != 0); ++ return GLRO(dl_minsigstacksize); ++ ++ case _SC_SIGSTKSZ: ++ return sysconf_sigstksz (); ++ + default: + break; + } +diff --git a/sysdeps/unix/sysv/linux/x86/dl-minsigstacksize.h b/sysdeps/unix/sysv/linux/x86/dl-minsigstacksize.h +new file mode 100644 +index 00000000..6088bbc9 +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/x86/dl-minsigstacksize.h +@@ -0,0 +1,83 @@ ++/* Emulate AT_MINSIGSTKSZ. Linux/x86 version. ++ Copyright (C) 2020 Free Software Foundation, Inc. ++ ++ 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, see ++ . */ ++ ++/* Emulate AT_MINSIGSTKSZ with XSAVE. */ ++ ++static inline void ++dl_check_minsigstacksize (const struct cpu_features *cpu_features) ++{ ++ /* Return if AT_MINSIGSTKSZ is provide by kernel. */ ++ if (GLRO(dl_minsigstacksize) != 0) ++ return; ++ ++ if (cpu_features->basic.max_cpuid >= 0xd ++ && CPU_FEATURES_CPU_P (cpu_features, OSXSAVE)) ++ { ++ /* Emulate AT_MINSIGSTKSZ. In Linux kernel, the signal frame data ++ with XSAVE is composed of the following areas and laid out as: ++ ------------------------------ ++ | alignment padding | ++ ------------------------------ ++ | xsave buffer | ++ ------------------------------ ++ | fsave header (32-bit only) | ++ ------------------------------ ++ | siginfo + ucontext | ++ ------------------------------ ++ */ ++ ++ unsigned int sigframe_size; ++ ++#ifdef __x86_64__ ++ /* NB: sizeof(struct rt_sigframe) + 8-byte return address in Linux ++ kernel. */ ++ sigframe_size = 440 + 8; ++#else ++ /* NB: sizeof(struct sigframe_ia32) + sizeof(struct fregs_state)) + ++ 4-byte return address + 3 * 4-byte arguments in Linux kernel. */ ++ sigframe_size = 736 + 112 + 4 + 3 * 4; ++#endif ++ ++ /* Add 15 bytes to align the stack to 16 bytes. */ ++ sigframe_size += 15; ++ ++ /* Make the space before xsave buffer multiple of 16 bytes. */ ++ sigframe_size = ALIGN_UP (sigframe_size, 16); ++ ++ /* Add (64 - 16)-byte padding to align xsave buffer at 64 bytes. */ ++ sigframe_size += 64 - 16; ++ ++ unsigned int eax, ebx, ecx, edx; ++ __cpuid_count (0xd, 0, eax, ebx, ecx, edx); ++ ++ /* Add the size of xsave buffer. */ ++ sigframe_size += ebx; ++ ++ /* Add the size of FP_XSTATE_MAGIC2. */ ++#define FP_XSTATE_MAGIC2 0x46505845U ++ sigframe_size += sizeof (FP_XSTATE_MAGIC2); ++ ++ GLRO(dl_minsigstacksize) = sigframe_size; ++ } ++ else ++ { ++ /* NB: Default to a constant MINSIGSTKSZ. */ ++ _Static_assert (__builtin_constant_p (MINSIGSTKSZ), ++ "MINSIGSTKSZ is constant"); ++ GLRO(dl_minsigstacksize) = MINSIGSTKSZ; ++ } ++} +diff --git a/sysdeps/unix/sysv/linux/x86/include/bits/sigstack.h b/sysdeps/unix/sysv/linux/x86/include/bits/sigstack.h +new file mode 100644 +index 00000000..208754c4 +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/x86/include/bits/sigstack.h +@@ -0,0 +1,5 @@ ++#include_next ++ ++#ifndef _ISOMAC ++# define CONSTANT_MINSIGSTKSZ 0 ++#endif +diff --git a/sysdeps/x86/dl-minsigstacksize.h b/sysdeps/x86/dl-minsigstacksize.h +new file mode 100644 +index 00000000..959871c9 +--- /dev/null ++++ b/sysdeps/x86/dl-minsigstacksize.h +@@ -0,0 +1,27 @@ ++/* Emulate AT_MINSIGSTKSZ. Generic x86 version. ++ Copyright (C) 2020 Free Software Foundation, Inc. ++ ++ 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, see ++ . */ ++ ++/* Emulate AT_MINSIGSTKSZ with XSAVE. */ ++ ++static inline void ++dl_check_minsigstacksize (const struct cpu_features *cpu_features) ++{ ++ /* NB: Default to a constant MINSIGSTKSZ. */ ++ _Static_assert (__builtin_constant_p (MINSIGSTKSZ), ++ "MINSIGSTKSZ is constant"); ++ GLRO(dl_minsigstacksize) = MINSIGSTKSZ; ++} +-- +2.27.0 + diff --git a/SOURCES/0006-void-short-distance-rep-movsb.patch b/SOURCES/0006-void-short-distance-rep-movsb.patch new file mode 100644 index 0000000..9964e15 --- /dev/null +++ b/SOURCES/0006-void-short-distance-rep-movsb.patch @@ -0,0 +1,53 @@ +From ff7e299914a2dfa1c3fd7abd267535f7586ac413 Mon Sep 17 00:00:00 2001 +From: Wangyang Guo +Date: Mon, 15 Nov 2021 06:12:16 +0000 +Subject: [PATCH 1/2] Avoid short distance rep movsb + +--- + .../multiarch/memmove-vec-unaligned-erms.S | 22 +++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S b/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S +index c952576c..07299dc0 100644 +--- a/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S ++++ b/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S +@@ -56,6 +56,14 @@ + # endif + #endif + ++/* Avoid short distance rep movsb only with non-SSE vector. */ ++#ifndef AVOID_SHORT_DISTANCE_REP_MOVSB ++# define AVOID_SHORT_DISTANCE_REP_MOVSB 1 ++#else ++# define AVOID_SHORT_DISTANCE_REP_MOVSB 0 ++#endif ++ ++ + #ifndef PREFETCH + # define PREFETCH(addr) prefetcht0 addr + #endif +@@ -235,7 +243,21 @@ L(movsb): + cmpq %r9, %rdi + /* Avoid slow backward REP MOVSB. */ + jb L(more_8x_vec_backward) ++# if AVOID_SHORT_DISTANCE_REP_MOVSB ++ movq %rdi, %rcx ++ subq %rsi, %rcx ++ jmp 2f ++# endif + 1: ++# if AVOID_SHORT_DISTANCE_REP_MOVSB ++ movq %rsi, %rcx ++ subq %rdi, %rcx ++2: ++/* Avoid "rep movsb" if RCX, the distance between source and destination, ++ is N*4GB + [1..63] with N >= 0. */ ++ cmpl $63, %ecx ++ jbe L(more_2x_vec) /* Avoid "rep movsb" if ECX <= 63. */ ++# endif + movq %rdx, %rcx + rep movsb + L(nop): +-- +2.27.0 + diff --git a/SOURCES/0007-pack-up-patches.patch b/SOURCES/0007-pack-up-patches.patch new file mode 100644 index 0000000..ca37c8d --- /dev/null +++ b/SOURCES/0007-pack-up-patches.patch @@ -0,0 +1,131 @@ +From f42b57f2c3da86a0e3aa8e2f6f09994b8a0c7334 Mon Sep 17 00:00:00 2001 +From: Wangyang Guo +Date: Mon, 15 Nov 2021 05:28:29 +0000 +Subject: [PATCH] pack up patches + +--- + crypt/Makefile | 2 ++ + math/Makefile | 2 ++ + math/w_sqrt_compat.c | 1 + + nss/nss_files/files-XXX.c | 4 ++++ + sysdeps/ieee754/dbl-64/e_exp.c | 1 + + sysdeps/ieee754/dbl-64/e_exp2.c | 1 + + sysdeps/x86_64/fpu/Makefile | 7 +++++++ + timezone/tzselect.ksh | 2 +- + 8 files changed, 19 insertions(+), 1 deletion(-) + +diff --git a/crypt/Makefile b/crypt/Makefile +index 3811b6e2..34fd5306 100644 +--- a/crypt/Makefile ++++ b/crypt/Makefile +@@ -22,6 +22,8 @@ subdir := crypt + + include ../Makeconfig + ++CFLAGS-.o += -flto -ffat-lto-objects -fno-stack-protector ++ + headers := crypt.h + + extra-libs := libcrypt +diff --git a/math/Makefile b/math/Makefile +index df73d708..e1826330 100644 +--- a/math/Makefile ++++ b/math/Makefile +@@ -21,6 +21,8 @@ subdir := math + + include ../Makeconfig + ++CFLAGS-.o += -fno-stack-protector -falign-functions=32 ++ + # Installed header files. + headers := math.h bits/mathcalls.h bits/mathinline.h \ + fpu_control.h complex.h bits/cmathcalls.h fenv.h \ +diff --git a/math/w_sqrt_compat.c b/math/w_sqrt_compat.c +index e76a8079..889ab39a 100644 +--- a/math/w_sqrt_compat.c ++++ b/math/w_sqrt_compat.c +@@ -26,6 +26,7 @@ + #if LIBM_SVID_COMPAT + /* wrapper sqrt */ + double ++__attribute__((aligned(64))) + __sqrt (double x) + { + if (__builtin_expect (isless (x, 0.0), 0) && _LIB_VERSION != _IEEE_) +diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c +index 37a3ce27..056ec6cc 100644 +--- a/nss/nss_files/files-XXX.c ++++ b/nss/nss_files/files-XXX.c +@@ -40,6 +40,7 @@ + #define ENTNAME_r CONCAT(ENTNAME,_r) + + #define DATAFILE "/etc/" DATABASE ++#define ALTDATAFILE "/usr/share/defaults/etc/" DATABASE + + #ifdef NEED_H_ERRNO + # include +@@ -77,6 +78,9 @@ internal_setent (FILE **stream) + { + *stream = __nss_files_fopen (DATAFILE); + ++ if (*stream == NULL) ++ *stream = fopen(ALTDATAFILE, "rce"); ++ + if (*stream == NULL) + status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; + } +diff --git a/sysdeps/ieee754/dbl-64/e_exp.c b/sysdeps/ieee754/dbl-64/e_exp.c +index ddd2bcb1..3c693d78 100644 +--- a/sysdeps/ieee754/dbl-64/e_exp.c ++++ b/sysdeps/ieee754/dbl-64/e_exp.c +@@ -49,6 +49,7 @@ + + double + SECTION ++__attribute__((aligned(64))) + __ieee754_exp (double x) + { + double bexp, t, eps, del, base, y, al, bet, res, rem, cor; +diff --git a/sysdeps/ieee754/dbl-64/e_exp2.c b/sysdeps/ieee754/dbl-64/e_exp2.c +index c45bb447..a30d5a2e 100644 +--- a/sysdeps/ieee754/dbl-64/e_exp2.c ++++ b/sysdeps/ieee754/dbl-64/e_exp2.c +@@ -39,6 +39,7 @@ static const double TWO1023 = 8.988465674311579539e+307; + static const double TWOM1000 = 9.3326361850321887899e-302; + + double ++__attribute__((aligned(64))) + __ieee754_exp2 (double x) + { + static const double himark = (double) DBL_MAX_EXP; +diff --git a/sysdeps/x86_64/fpu/Makefile b/sysdeps/x86_64/fpu/Makefile +index 2b7d69bb..bba4a1de 100644 +--- a/sysdeps/x86_64/fpu/Makefile ++++ b/sysdeps/x86_64/fpu/Makefile +@@ -237,3 +237,10 @@ CFLAGS-test-float-libmvec-sincosf-avx512.c = -DREQUIRE_AVX512F + CFLAGS-test-float-libmvec-sincosf-avx512-main.c = $(libmvec-sincos-cflags) $(float-vlen16-arch-ext-cflags) + endif + endif ++ ++ifeq ($(subdir),math) ++CFLAGS-branred.c = -mprefer-vector-width=128 -fno-tree-vectorize ++CFLAGS-s_sincos.c = -mprefer-vector-width=256 -fno-tree-vectorize ++CFLAGS-e_exp.c = -mprefer-vector-width=128 -fno-tree-vectorize ++CFLAGS-e_exp2.c = -mprefer-vector-width=128 -fno-tree-vectorize ++endif +diff --git a/timezone/tzselect.ksh b/timezone/tzselect.ksh +index d2c3a6d1..5c69e579 100755 +--- a/timezone/tzselect.ksh ++++ b/timezone/tzselect.ksh +@@ -52,7 +52,7 @@ say() { + + coord= + location_limit=10 +-zonetabtype=zone1970 ++zonetabtype=zone + + usage="Usage: tzselect [--version] [--help] [-c COORD] [-n LIMIT] + Select a time zone interactively. +-- +2.27.0 + diff --git a/SOURCES/0008-only-avoid-short-distance-rep-mobsb-on-icx.patch b/SOURCES/0008-only-avoid-short-distance-rep-mobsb-on-icx.patch new file mode 100644 index 0000000..1828e74 --- /dev/null +++ b/SOURCES/0008-only-avoid-short-distance-rep-mobsb-on-icx.patch @@ -0,0 +1,111 @@ +From 0058b10814afd8f1ea031b11f3c4ac226fa60d79 Mon Sep 17 00:00:00 2001 +From: Wangyang Guo +Date: Mon, 24 Jan 2022 02:59:56 +0000 +Subject: [PATCH] Only avoid short distance REP MOVSB on ICX + +--- + sysdeps/x86/cacheinfo.h | 9 +++++++++ + sysdeps/x86/cpu-features.c | 5 +++++ + .../include/cpu-features-preferred_feature_index_1.def | 1 + + sysdeps/x86/sysdep.h | 3 +++ + sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S | 5 +++++ + 5 files changed, 23 insertions(+) + +diff --git a/sysdeps/x86/cacheinfo.h b/sysdeps/x86/cacheinfo.h +index 02556961..7af8575d 100644 +--- a/sysdeps/x86/cacheinfo.h ++++ b/sysdeps/x86/cacheinfo.h +@@ -45,6 +45,11 @@ long int __x86_rep_movsb_threshold attribute_hidden = 2048; + /* Threshold to use Enhanced REP STOSB. */ + long int __x86_rep_stosb_threshold attribute_hidden = 2048; + ++/* Non-zero to avoid short distance REP MOVSB. */ ++//int __x86_avoid_short_distance_rep_movsb attribute_hidden; ++/* String/memory function control. */ ++int __x86_string_control attribute_hidden; ++ + static void + get_common_cache_info (long int *shared_ptr, unsigned int *threads_ptr, + long int core) +@@ -421,6 +426,10 @@ init_cacheinfo (void) + else + __x86_rep_movsb_threshold = rep_movsb_threshold; + ++ if (CPU_FEATURES_ARCH_P (cpu_features, Avoid_Short_Distance_REP_MOVSB)) ++ __x86_string_control ++ |= X86_STRING_CONTROL_AVOID_SHORT_DISTANCE_REP_MOVSB; ++ + # if HAVE_TUNABLES + __x86_rep_stosb_threshold = cpu_features->rep_stosb_threshold; + # endif +diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c +index 91042505..22b45c72 100644 +--- a/sysdeps/x86/cpu-features.c ++++ b/sysdeps/x86/cpu-features.c +@@ -526,6 +526,11 @@ init_cpu_features (struct cpu_features *cpu_features) + else + cpu_features->preferred[index_arch_Prefer_No_AVX512] + |= bit_arch_Prefer_No_AVX512; ++ ++ /* Avoid avoid short distance REP MOVSB on processor with FSRM. */ ++ if (CPU_FEATURES_CPU_P (cpu_features, FSRM)) ++ cpu_features->preferred[index_arch_Avoid_Short_Distance_REP_MOVSB] ++ |= bit_arch_Avoid_Short_Distance_REP_MOVSB; + } + /* This spells out "AuthenticAMD". */ + else if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65) +diff --git a/sysdeps/x86/include/cpu-features-preferred_feature_index_1.def b/sysdeps/x86/include/cpu-features-preferred_feature_index_1.def +index 17a5cc42..e7277b33 100644 +--- a/sysdeps/x86/include/cpu-features-preferred_feature_index_1.def ++++ b/sysdeps/x86/include/cpu-features-preferred_feature_index_1.def +@@ -32,3 +32,4 @@ BIT (Prefer_ERMS) + BIT (Prefer_FSRM) + BIT (Prefer_No_AVX512) + BIT (MathVec_Prefer_No_AVX512) ++BIT (Avoid_Short_Distance_REP_MOVSB) +diff --git a/sysdeps/x86/sysdep.h b/sysdeps/x86/sysdep.h +index f41f4ebd..4ac93a95 100644 +--- a/sysdeps/x86/sysdep.h ++++ b/sysdeps/x86/sysdep.h +@@ -57,6 +57,9 @@ enum cf_protection_level + #define STATE_SAVE_MASK \ + ((1 << 1) | (1 << 2) | (1 << 3) | (1 << 5) | (1 << 6) | (1 << 7)) + ++/* Avoid short distance REP MOVSB. */ ++#define X86_STRING_CONTROL_AVOID_SHORT_DISTANCE_REP_MOVSB (1 << 0) ++ + #ifdef __ASSEMBLER__ + + /* Syntactic details of assembler. */ +diff --git a/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S b/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S +index 07299dc0..4aa65555 100644 +--- a/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S ++++ b/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S +@@ -244,12 +244,16 @@ L(movsb): + /* Avoid slow backward REP MOVSB. */ + jb L(more_8x_vec_backward) + # if AVOID_SHORT_DISTANCE_REP_MOVSB ++ andl $X86_STRING_CONTROL_AVOID_SHORT_DISTANCE_REP_MOVSB, __x86_string_control(%rip) ++ jz 3f + movq %rdi, %rcx + subq %rsi, %rcx + jmp 2f + # endif + 1: + # if AVOID_SHORT_DISTANCE_REP_MOVSB ++ andl $X86_STRING_CONTROL_AVOID_SHORT_DISTANCE_REP_MOVSB, __x86_string_control(%rip) ++ jz 3f + movq %rsi, %rcx + subq %rdi, %rcx + 2: +@@ -257,6 +261,7 @@ L(movsb): + is N*4GB + [1..63] with N >= 0. */ + cmpl $63, %ecx + jbe L(more_2x_vec) /* Avoid "rep movsb" if ECX <= 63. */ ++3: + # endif + movq %rdx, %rcx + rep movsb +-- +2.27.0 + diff --git a/SPECS/glibc.spec b/SPECS/glibc.spec index 96e229e..450bf54 100644 --- a/SPECS/glibc.spec +++ b/SPECS/glibc.spec @@ -1,6 +1,6 @@ %define glibcsrcdir glibc-2.28 %define glibcversion 2.28 -%define glibcrelease 197%{?dist} +%define glibcrelease 198%{?dist} # Pre-release tarballs are pulled in from git using a command that is # effectively: # @@ -880,6 +880,16 @@ Patch685: glibc-rh2063712.patch Patch686: glibc-rh2063042.patch Patch687: glibc-rh2071745.patch +# Intel Optimizations +Patch1001: 0001-Backport-of-Add-NT_VMCOREDD-AT_MINSIGSTKSZ-from-Linu.patch +Patch1002: 0002-Backport-of-Print-cache-size-and-geometry-auxv-types.patch +Patch1003: 0003-Backport-of-Tests-for-minimal-signal-handler.patch +Patch1004: 0004-Disable-lazy-binding-on-tests-for-minimal-signal-han.patch +Patch1005: 0005-sysconf-Add-_SC_MINSIGSTKSZ-_SC_SIGSTKSZ-BZ-20305.patch +Patch1006: 0006-void-short-distance-rep-movsb.patch +Patch1007: 0007-pack-up-patches.patch +Patch1008: 0008-only-avoid-short-distance-rep-mobsb-on-icx.patch + ############################################################################## # Continued list of core "glibc" package information: ############################################################################## @@ -2709,6 +2719,9 @@ fi %files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared %changelog +* Tue Apr 26 2022 Ali Erdinc Koroglu - 2.28-198 +- Intel optimizations added + * Tue Apr 05 2022 Arjun Shankar - 2.28-197 - timezone: Fix a test that causes occasional build failure (#2071745)