diff --git a/1-5-AArch64-Improve-A64FX-memset-for-small-sizes.patch b/1-5-AArch64-Improve-A64FX-memset-for-small-sizes.patch deleted file mode 100644 index 2db004518382383d0814b1acc240f24ba6fcd6f2..0000000000000000000000000000000000000000 --- a/1-5-AArch64-Improve-A64FX-memset-for-small-sizes.patch +++ /dev/null @@ -1,136 +0,0 @@ -From 07b427296b8d59f439144029d9a948f6c1ce0a31 Mon Sep 17 00:00:00 2001 -From: Wilco Dijkstra -Date: Tue, 10 Aug 2021 13:30:27 +0100 -Subject: [PATCH] [1/5] AArch64: Improve A64FX memset for small sizes - -Improve performance of small memsets by reducing instruction counts and -improving code alignment. Bench-memset shows 35-45% performance gain for -small sizes. - -Reviewed-by: Naohiro Tamura ---- - sysdeps/aarch64/multiarch/memset_a64fx.S | 96 ++++++++++++-------------------- - 1 file changed, 36 insertions(+), 60 deletions(-) - -diff --git a/sysdeps/aarch64/multiarch/memset_a64fx.S b/sysdeps/aarch64/multiarch/memset_a64fx.S -index ce54e54..cf3d402 100644 ---- a/sysdeps/aarch64/multiarch/memset_a64fx.S -+++ b/sysdeps/aarch64/multiarch/memset_a64fx.S -@@ -51,78 +51,54 @@ - .endm - - .macro st1b_unroll first=0, last=7 -- st1b z0.b, p0, [dst, #\first, mul vl] -+ st1b z0.b, p0, [dst, \first, mul vl] - .if \last-\first - st1b_unroll "(\first+1)", \last - .endif - .endm - -- .macro shortcut_for_small_size exit -- // if rest <= vector_length * 2 -- whilelo p0.b, xzr, count -- whilelo p1.b, vector_length, count -- b.last 1f -- st1b z0.b, p0, [dstin, #0, mul vl] -- st1b z0.b, p1, [dstin, #1, mul vl] -- ret --1: // if rest > vector_length * 8 -- cmp count, vector_length, lsl 3 // vector_length * 8 -- b.hi \exit -- // if rest <= vector_length * 4 -- lsl tmp1, vector_length, 1 // vector_length * 2 -- whilelo p2.b, tmp1, count -- incb tmp1 -- whilelo p3.b, tmp1, count -- b.last 1f -- st1b z0.b, p0, [dstin, #0, mul vl] -- st1b z0.b, p1, [dstin, #1, mul vl] -- st1b z0.b, p2, [dstin, #2, mul vl] -- st1b z0.b, p3, [dstin, #3, mul vl] -- ret --1: // if rest <= vector_length * 8 -- lsl tmp1, vector_length, 2 // vector_length * 4 -- whilelo p4.b, tmp1, count -- incb tmp1 -- whilelo p5.b, tmp1, count -- b.last 1f -- st1b z0.b, p0, [dstin, #0, mul vl] -- st1b z0.b, p1, [dstin, #1, mul vl] -- st1b z0.b, p2, [dstin, #2, mul vl] -- st1b z0.b, p3, [dstin, #3, mul vl] -- st1b z0.b, p4, [dstin, #4, mul vl] -- st1b z0.b, p5, [dstin, #5, mul vl] -- ret --1: lsl tmp1, vector_length, 2 // vector_length * 4 -- incb tmp1 // vector_length * 5 -- incb tmp1 // vector_length * 6 -- whilelo p6.b, tmp1, count -- incb tmp1 -- whilelo p7.b, tmp1, count -- st1b z0.b, p0, [dstin, #0, mul vl] -- st1b z0.b, p1, [dstin, #1, mul vl] -- st1b z0.b, p2, [dstin, #2, mul vl] -- st1b z0.b, p3, [dstin, #3, mul vl] -- st1b z0.b, p4, [dstin, #4, mul vl] -- st1b z0.b, p5, [dstin, #5, mul vl] -- st1b z0.b, p6, [dstin, #6, mul vl] -- st1b z0.b, p7, [dstin, #7, mul vl] -- ret -- .endm - --ENTRY (MEMSET) -+#undef BTI_C -+#define BTI_C - -+ENTRY (MEMSET) - PTR_ARG (0) - SIZE_ARG (2) - -- cbnz count, 1f -- ret --1: dup z0.b, valw - cntb vector_length -- // shortcut for less than vector_length * 8 -- // gives a free ptrue to p0.b for n >= vector_length -- shortcut_for_small_size L(vl_agnostic) -- // end of shortcut -+ dup z0.b, valw -+ whilelo p0.b, vector_length, count -+ b.last 1f -+ whilelo p1.b, xzr, count -+ st1b z0.b, p1, [dstin, 0, mul vl] -+ st1b z0.b, p0, [dstin, 1, mul vl] -+ ret -+ -+ // count >= vector_length * 2 -+1: cmp count, vector_length, lsl 2 -+ add dstend, dstin, count -+ b.hi 1f -+ st1b z0.b, p0, [dstin, 0, mul vl] -+ st1b z0.b, p0, [dstin, 1, mul vl] -+ st1b z0.b, p0, [dstend, -2, mul vl] -+ st1b z0.b, p0, [dstend, -1, mul vl] -+ ret -+ -+ // count > vector_length * 4 -+1: lsl tmp1, vector_length, 3 -+ cmp count, tmp1 -+ b.hi L(vl_agnostic) -+ st1b z0.b, p0, [dstin, 0, mul vl] -+ st1b z0.b, p0, [dstin, 1, mul vl] -+ st1b z0.b, p0, [dstin, 2, mul vl] -+ st1b z0.b, p0, [dstin, 3, mul vl] -+ st1b z0.b, p0, [dstend, -4, mul vl] -+ st1b z0.b, p0, [dstend, -3, mul vl] -+ st1b z0.b, p0, [dstend, -2, mul vl] -+ st1b z0.b, p0, [dstend, -1, mul vl] -+ ret - -+ .p2align 4 - L(vl_agnostic): // VL Agnostic - mov rest, count - mov dst, dstin --- -1.8.3.1 - diff --git a/2-5-AArch64-Improve-A64FX-memset-for-large-sizes.patch b/2-5-AArch64-Improve-A64FX-memset-for-large-sizes.patch deleted file mode 100644 index 81cdbe038153bf7f08099f86bacb538ab90c8550..0000000000000000000000000000000000000000 --- a/2-5-AArch64-Improve-A64FX-memset-for-large-sizes.patch +++ /dev/null @@ -1,131 +0,0 @@ -From 9bc2ed8f46d80859a5596789cc9e8cc2de84b0e7 Mon Sep 17 00:00:00 2001 -From: Wilco Dijkstra -Date: Tue, 10 Aug 2021 13:39:37 +0100 -Subject: [PATCH] [2/5] AArch64: Improve A64FX memset for large sizes - -Improve performance of large memsets. Simplify alignment code. For zero memset -use DC ZVA, which almost doubles performance. For non-zero memsets use the -unroll8 loop which is about 10% faster. - -Reviewed-by: Naohiro Tamura ---- - sysdeps/aarch64/multiarch/memset_a64fx.S | 85 ++++++++++---------------------- - 1 file changed, 25 insertions(+), 60 deletions(-) - -diff --git a/sysdeps/aarch64/multiarch/memset_a64fx.S b/sysdeps/aarch64/multiarch/memset_a64fx.S -index cf3d402..75cf43a 100644 ---- a/sysdeps/aarch64/multiarch/memset_a64fx.S -+++ b/sysdeps/aarch64/multiarch/memset_a64fx.S -@@ -27,14 +27,11 @@ - */ - - #define L1_SIZE (64*1024) // L1 64KB --#define L2_SIZE (8*1024*1024) // L2 8MB - 1MB -+#define L2_SIZE (8*1024*1024) // L2 8MB - #define CACHE_LINE_SIZE 256 - #define PF_DIST_L1 (CACHE_LINE_SIZE * 16) // Prefetch distance L1 --#define ZF_DIST (CACHE_LINE_SIZE * 21) // Zerofill distance --#define rest x8 -+#define rest x2 - #define vector_length x9 --#define vl_remainder x10 // vector_length remainder --#define cl_remainder x11 // CACHE_LINE_SIZE remainder - - #if HAVE_AARCH64_SVE_ASM - # if IS_IN (libc) -@@ -42,14 +39,6 @@ - - .arch armv8.2-a+sve - -- .macro dc_zva times -- dc zva, tmp1 -- add tmp1, tmp1, CACHE_LINE_SIZE -- .if \times-1 -- dc_zva "(\times-1)" -- .endif -- .endm -- - .macro st1b_unroll first=0, last=7 - st1b z0.b, p0, [dst, \first, mul vl] - .if \last-\first -@@ -188,54 +177,30 @@ L(L1_prefetch): // if rest >= L1_SIZE - cbnz rest, L(unroll32) - ret - --L(L2): -- // align dst address at vector_length byte boundary -- sub tmp1, vector_length, 1 -- ands tmp2, dst, tmp1 -- // if vl_remainder == 0 -- b.eq 1f -- sub vl_remainder, vector_length, tmp2 -- // process remainder until the first vector_length boundary -- whilelt p2.b, xzr, vl_remainder -- st1b z0.b, p2, [dst] -- add dst, dst, vl_remainder -- sub rest, rest, vl_remainder -- // align dstin address at CACHE_LINE_SIZE byte boundary --1: mov tmp1, CACHE_LINE_SIZE -- ands tmp2, dst, CACHE_LINE_SIZE - 1 -- // if cl_remainder == 0 -- b.eq L(L2_dc_zva) -- sub cl_remainder, tmp1, tmp2 -- // process remainder until the first CACHE_LINE_SIZE boundary -- mov tmp1, xzr // index --2: whilelt p2.b, tmp1, cl_remainder -- st1b z0.b, p2, [dst, tmp1] -- incb tmp1 -- cmp tmp1, cl_remainder -- b.lo 2b -- add dst, dst, cl_remainder -- sub rest, rest, cl_remainder -- --L(L2_dc_zva): -- // zero fill -- mov tmp1, dst -- dc_zva (ZF_DIST / CACHE_LINE_SIZE) - 1 -- mov zva_len, ZF_DIST -- add tmp1, zva_len, CACHE_LINE_SIZE * 2 -- // unroll -+ // count >= L2_SIZE - .p2align 3 --1: st1b_unroll 0, 3 -- add tmp2, dst, zva_len -- dc zva, tmp2 -- st1b_unroll 4, 7 -- add tmp2, tmp2, CACHE_LINE_SIZE -- dc zva, tmp2 -- add dst, dst, CACHE_LINE_SIZE * 2 -- sub rest, rest, CACHE_LINE_SIZE * 2 -- cmp rest, tmp1 // ZF_DIST + CACHE_LINE_SIZE * 2 -- b.ge 1b -- cbnz rest, L(unroll8) -- ret -+L(L2): -+ tst valw, 255 -+ b.ne L(unroll8) -+ // align dst to CACHE_LINE_SIZE byte boundary -+ and tmp2, dst, CACHE_LINE_SIZE - 1 -+ st1b z0.b, p0, [dst, 0, mul vl] -+ st1b z0.b, p0, [dst, 1, mul vl] -+ st1b z0.b, p0, [dst, 2, mul vl] -+ st1b z0.b, p0, [dst, 3, mul vl] -+ sub dst, dst, tmp2 -+ add count, count, tmp2 -+ -+ // clear cachelines using DC ZVA -+ sub count, count, CACHE_LINE_SIZE * 2 -+ .p2align 4 -+1: add dst, dst, CACHE_LINE_SIZE -+ dc zva, dst -+ subs count, count, CACHE_LINE_SIZE -+ b.hi 1b -+ add count, count, CACHE_LINE_SIZE -+ add dst, dst, CACHE_LINE_SIZE -+ b L(last) - - END (MEMSET) - libc_hidden_builtin_def (MEMSET) --- -1.8.3.1 - diff --git a/3-5-AArch64-Improve-A64FX-memset-for-remaining-bytes.patch b/3-5-AArch64-Improve-A64FX-memset-for-remaining-bytes.patch deleted file mode 100644 index 7ba35160157681add3051dc033c2782f84c22cb9..0000000000000000000000000000000000000000 --- a/3-5-AArch64-Improve-A64FX-memset-for-remaining-bytes.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 186092c6ba8825598ffdbf15dbf0823c771f560d Mon Sep 17 00:00:00 2001 -From: Wilco Dijkstra -Date: Tue, 10 Aug 2021 13:42:07 +0100 -Subject: [PATCH] [3/5] AArch64: Improve A64FX memset for remaining bytes - -Simplify handling of remaining bytes. Avoid lots of taken branches and complex -whilelo computations, instead unconditionally write vectors from the end. - -Reviewed-by: Naohiro Tamura ---- - sysdeps/aarch64/multiarch/memset_a64fx.S | 46 +++++++++----------------------- - 1 file changed, 13 insertions(+), 33 deletions(-) - -diff --git a/sysdeps/aarch64/multiarch/memset_a64fx.S b/sysdeps/aarch64/multiarch/memset_a64fx.S -index 75cf43a..337c86b 100644 ---- a/sysdeps/aarch64/multiarch/memset_a64fx.S -+++ b/sysdeps/aarch64/multiarch/memset_a64fx.S -@@ -130,38 +130,19 @@ L(unroll8): - b 1b - - L(last): -- whilelo p0.b, xzr, rest -- whilelo p1.b, vector_length, rest -- b.last 1f -- st1b z0.b, p0, [dst, #0, mul vl] -- st1b z0.b, p1, [dst, #1, mul vl] -- ret --1: lsl tmp1, vector_length, 1 // vector_length * 2 -- whilelo p2.b, tmp1, rest -- incb tmp1 -- whilelo p3.b, tmp1, rest -- b.last 1f -- st1b z0.b, p0, [dst, #0, mul vl] -- st1b z0.b, p1, [dst, #1, mul vl] -- st1b z0.b, p2, [dst, #2, mul vl] -- st1b z0.b, p3, [dst, #3, mul vl] -- ret --1: lsl tmp1, vector_length, 2 // vector_length * 4 -- whilelo p4.b, tmp1, rest -- incb tmp1 -- whilelo p5.b, tmp1, rest -- incb tmp1 -- whilelo p6.b, tmp1, rest -- incb tmp1 -- whilelo p7.b, tmp1, rest -- st1b z0.b, p0, [dst, #0, mul vl] -- st1b z0.b, p1, [dst, #1, mul vl] -- st1b z0.b, p2, [dst, #2, mul vl] -- st1b z0.b, p3, [dst, #3, mul vl] -- st1b z0.b, p4, [dst, #4, mul vl] -- st1b z0.b, p5, [dst, #5, mul vl] -- st1b z0.b, p6, [dst, #6, mul vl] -- st1b z0.b, p7, [dst, #7, mul vl] -+ cmp count, vector_length, lsl 1 -+ b.ls 2f -+ add tmp2, vector_length, vector_length, lsl 2 -+ cmp count, tmp2 -+ b.ls 5f -+ st1b z0.b, p0, [dstend, -8, mul vl] -+ st1b z0.b, p0, [dstend, -7, mul vl] -+ st1b z0.b, p0, [dstend, -6, mul vl] -+5: st1b z0.b, p0, [dstend, -5, mul vl] -+ st1b z0.b, p0, [dstend, -4, mul vl] -+ st1b z0.b, p0, [dstend, -3, mul vl] -+2: st1b z0.b, p0, [dstend, -2, mul vl] -+ st1b z0.b, p0, [dstend, -1, mul vl] - ret - - L(L1_prefetch): // if rest >= L1_SIZE -@@ -199,7 +180,6 @@ L(L2): - subs count, count, CACHE_LINE_SIZE - b.hi 1b - add count, count, CACHE_LINE_SIZE -- add dst, dst, CACHE_LINE_SIZE - b L(last) - - END (MEMSET) --- -1.8.3.1 - diff --git a/4-5-AArch64-Improve-A64FX-memset-by-removing-unroll3.patch b/4-5-AArch64-Improve-A64FX-memset-by-removing-unroll3.patch deleted file mode 100644 index fd176710033f0dd03a04542b998b246a0349a6c6..0000000000000000000000000000000000000000 --- a/4-5-AArch64-Improve-A64FX-memset-by-removing-unroll3.patch +++ /dev/null @@ -1,51 +0,0 @@ -From e69d9981f858a38e19304e6ff5ebdf89f2cb0ba0 Mon Sep 17 00:00:00 2001 -From: Wilco Dijkstra -Date: Tue, 10 Aug 2021 13:44:27 +0100 -Subject: [PATCH] [4/5] AArch64: Improve A64FX memset by removing unroll32 - -Remove unroll32 code since it doesn't improve performance. - -Reviewed-by: Naohiro Tamura ---- - sysdeps/aarch64/multiarch/memset_a64fx.S | 18 +----------------- - 1 file changed, 1 insertion(+), 17 deletions(-) - -diff --git a/sysdeps/aarch64/multiarch/memset_a64fx.S b/sysdeps/aarch64/multiarch/memset_a64fx.S -index 337c86b..ef03156 100644 ---- a/sysdeps/aarch64/multiarch/memset_a64fx.S -+++ b/sysdeps/aarch64/multiarch/memset_a64fx.S -@@ -102,22 +102,6 @@ L(vl_agnostic): // VL Agnostic - ccmp vector_length, tmp1, 0, cs - b.eq L(L1_prefetch) - --L(unroll32): -- lsl tmp1, vector_length, 3 // vector_length * 8 -- lsl tmp2, vector_length, 5 // vector_length * 32 -- .p2align 3 --1: cmp rest, tmp2 -- b.cc L(unroll8) -- st1b_unroll -- add dst, dst, tmp1 -- st1b_unroll -- add dst, dst, tmp1 -- st1b_unroll -- add dst, dst, tmp1 -- st1b_unroll -- add dst, dst, tmp1 -- sub rest, rest, tmp2 -- b 1b - - L(unroll8): - lsl tmp1, vector_length, 3 -@@ -155,7 +139,7 @@ L(L1_prefetch): // if rest >= L1_SIZE - sub rest, rest, CACHE_LINE_SIZE * 2 - cmp rest, L1_SIZE - b.ge 1b -- cbnz rest, L(unroll32) -+ cbnz rest, L(unroll8) - ret - - // count >= L2_SIZE --- -1.8.3.1 - diff --git a/5-5-AArch64-Improve-A64FX-memset-medium-loops.patch b/5-5-AArch64-Improve-A64FX-memset-medium-loops.patch deleted file mode 100644 index f8bc03e6150c98185e227fea69034114e97cbfdb..0000000000000000000000000000000000000000 --- a/5-5-AArch64-Improve-A64FX-memset-medium-loops.patch +++ /dev/null @@ -1,96 +0,0 @@ -From a5db6a5cae6a92d1675c013e5c8d972768721576 Mon Sep 17 00:00:00 2001 -From: Wilco Dijkstra -Date: Tue, 10 Aug 2021 13:46:20 +0100 -Subject: [PATCH] [5/5] AArch64: Improve A64FX memset medium loops - -Simplify the code for memsets smaller than L1. Improve the unroll8 and -L1_prefetch loops. - -Reviewed-by: Naohiro Tamura ---- - sysdeps/aarch64/multiarch/memset_a64fx.S | 45 ++++++++++++++------------------ - 1 file changed, 19 insertions(+), 26 deletions(-) - -diff --git a/sysdeps/aarch64/multiarch/memset_a64fx.S b/sysdeps/aarch64/multiarch/memset_a64fx.S -index ef03156..7bf759b 100644 ---- a/sysdeps/aarch64/multiarch/memset_a64fx.S -+++ b/sysdeps/aarch64/multiarch/memset_a64fx.S -@@ -30,7 +30,6 @@ - #define L2_SIZE (8*1024*1024) // L2 8MB - #define CACHE_LINE_SIZE 256 - #define PF_DIST_L1 (CACHE_LINE_SIZE * 16) // Prefetch distance L1 --#define rest x2 - #define vector_length x9 - - #if HAVE_AARCH64_SVE_ASM -@@ -89,29 +88,19 @@ ENTRY (MEMSET) - - .p2align 4 - L(vl_agnostic): // VL Agnostic -- mov rest, count - mov dst, dstin -- add dstend, dstin, count -- // if rest >= L2_SIZE && vector_length == 64 then L(L2) -- mov tmp1, 64 -- cmp rest, L2_SIZE -- ccmp vector_length, tmp1, 0, cs -- b.eq L(L2) -- // if rest >= L1_SIZE && vector_length == 64 then L(L1_prefetch) -- cmp rest, L1_SIZE -- ccmp vector_length, tmp1, 0, cs -- b.eq L(L1_prefetch) -- -+ cmp count, L1_SIZE -+ b.hi L(L1_prefetch) - -+ // count >= 8 * vector_length - L(unroll8): -- lsl tmp1, vector_length, 3 -- .p2align 3 --1: cmp rest, tmp1 -- b.cc L(last) -- st1b_unroll -+ sub count, count, tmp1 -+ .p2align 4 -+1: st1b_unroll 0, 7 - add dst, dst, tmp1 -- sub rest, rest, tmp1 -- b 1b -+ subs count, count, tmp1 -+ b.hi 1b -+ add count, count, tmp1 - - L(last): - cmp count, vector_length, lsl 1 -@@ -129,18 +118,22 @@ L(last): - st1b z0.b, p0, [dstend, -1, mul vl] - ret - --L(L1_prefetch): // if rest >= L1_SIZE -+ // count >= L1_SIZE - .p2align 3 -+L(L1_prefetch): -+ cmp count, L2_SIZE -+ b.hs L(L2) -+ cmp vector_length, 64 -+ b.ne L(unroll8) - 1: st1b_unroll 0, 3 - prfm pstl1keep, [dst, PF_DIST_L1] - st1b_unroll 4, 7 - prfm pstl1keep, [dst, PF_DIST_L1 + CACHE_LINE_SIZE] - add dst, dst, CACHE_LINE_SIZE * 2 -- sub rest, rest, CACHE_LINE_SIZE * 2 -- cmp rest, L1_SIZE -- b.ge 1b -- cbnz rest, L(unroll8) -- ret -+ sub count, count, CACHE_LINE_SIZE * 2 -+ cmp count, PF_DIST_L1 -+ b.hs 1b -+ b L(unroll8) - - // count >= L2_SIZE - .p2align 3 --- -1.8.3.1 - diff --git a/AArch64-Update-A64FX-memset-not-to-degrade-at-16KB.patch b/AArch64-Update-A64FX-memset-not-to-degrade-at-16KB.patch deleted file mode 100644 index f7ce84d2d510140196eab38d24c48361bbc93f2f..0000000000000000000000000000000000000000 --- a/AArch64-Update-A64FX-memset-not-to-degrade-at-16KB.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 23777232c23f80809613bdfa329f63aadf992922 Mon Sep 17 00:00:00 2001 -From: Naohiro Tamura via Libc-alpha -Date: Fri, 27 Aug 2021 05:03:04 +0000 -Subject: [PATCH] AArch64: Update A64FX memset not to degrade at 16KB - -This patch updates unroll8 code so as not to degrade at the peak -performance 16KB for both FX1000 and FX700. - -Inserted 2 instructions at the beginning of the unroll8 loop, -cmp and branch, are a workaround that is found heuristically. - -Reviewed-by: Wilco Dijkstra ---- - sysdeps/aarch64/multiarch/memset_a64fx.S | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/sysdeps/aarch64/multiarch/memset_a64fx.S b/sysdeps/aarch64/multiarch/memset_a64fx.S -index 7bf759b..f7dfdaa 100644 ---- a/sysdeps/aarch64/multiarch/memset_a64fx.S -+++ b/sysdeps/aarch64/multiarch/memset_a64fx.S -@@ -96,7 +96,14 @@ L(vl_agnostic): // VL Agnostic - L(unroll8): - sub count, count, tmp1 - .p2align 4 --1: st1b_unroll 0, 7 -+ // The 2 instructions at the beginning of the following loop, -+ // cmp and branch, are a workaround so as not to degrade at -+ // the peak performance 16KB. -+ // It is found heuristically and the branch condition, b.ne, -+ // is chosen intentionally never to jump. -+1: cmp xzr, xzr -+ b.ne 1b -+ st1b_unroll 0, 7 - add dst, dst, tmp1 - subs count, count, tmp1 - b.hi 1b --- -1.8.3.1 - diff --git a/Avoid-warning-overriding-recipe-for-.-tst-ro-dynamic.patch b/Avoid-warning-overriding-recipe-for-.-tst-ro-dynamic.patch deleted file mode 100644 index 60576f4a05ff79470f55a5306ea6f78c9aef8697..0000000000000000000000000000000000000000 --- a/Avoid-warning-overriding-recipe-for-.-tst-ro-dynamic.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 15e6d6785ac2935bb963506b47a37b3d1f728952 Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" -Date: Fri, 24 Sep 2021 08:56:42 -0700 -Subject: [PATCH] Avoid warning: overriding recipe for - .../tst-ro-dynamic-mod.so - -Add tst-ro-dynamic-mod to modules-names-nobuild to avoid - -../Makerules:767: warning: ignoring old recipe for target '.../elf/tst-ro-dynamic-mod.so' - -This updates BZ #28340 fix. ---- - elf/Makefile | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/elf/Makefile b/elf/Makefile -index 0cdccaa..26986c0 100644 ---- a/elf/Makefile -+++ b/elf/Makefile -@@ -402,8 +402,9 @@ endif - modules-execstack-yes = tst-execstack-mod - extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) - --# filtmod1.so, tst-big-note-lib.so have special rules. --modules-names-nobuild := filtmod1 tst-big-note-lib -+# filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special -+# rules. -+modules-names-nobuild := filtmod1 tst-big-note-lib tst-ro-dynamic-mod - - tests += $(tests-static) - --- -1.8.3.1 - diff --git a/Do-not-define-tgmath.h-fmaxmag-fminmag-macros-for-C2.patch b/Do-not-define-tgmath.h-fmaxmag-fminmag-macros-for-C2.patch deleted file mode 100644 index ce25968f0bbbd400aef9c3feb878106d0326d995..0000000000000000000000000000000000000000 --- a/Do-not-define-tgmath.h-fmaxmag-fminmag-macros-for-C2.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 79850e1025aabeccd3586c32ca259aa854607582 Mon Sep 17 00:00:00 2001 -From: Joseph Myers -Date: Wed, 29 Sep 2021 17:38:32 +0000 -Subject: [PATCH] Do not define tgmath.h fmaxmag, fminmag macros for C2X (bug - 28397) - -C2X does not include fmaxmag and fminmag. When I updated feature test -macro handling accordingly (commit -858045ad1c5ac1682288bbcb3676632b97a21ddf, "Update floating-point -feature test macro handling for C2X", included in 2.34), I missed -updating tgmath.h so it doesn't define the corresponding type-generic -macros unless __STDC_WANT_IEC_60559_BFP_EXT__ is defined; I've now -reported this as bug 28397. Adjust the conditionals in tgmath.h -accordingly. - -Tested for x86_64. ---- - math/tgmath.h | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/math/tgmath.h b/math/tgmath.h -index 9868353..3d7b099 100644 ---- a/math/tgmath.h -+++ b/math/tgmath.h -@@ -921,7 +921,9 @@ - - /* Like ilogb, but returning long int. */ - # define llogb(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, llogb) -+#endif - -+#if __GLIBC_USE (IEC_60559_BFP_EXT) - /* Return value with maximum magnitude. */ - # define fmaxmag(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmaxmag) - --- -1.8.3.1 - diff --git a/Fix-failing-nss-tst-nss-files-hosts-long-with-local-.patch b/Fix-failing-nss-tst-nss-files-hosts-long-with-local-.patch deleted file mode 100644 index f9cb581bdca739cb58554db8aab0d6392fdf2d56..0000000000000000000000000000000000000000 --- a/Fix-failing-nss-tst-nss-files-hosts-long-with-local-.patch +++ /dev/null @@ -1,37 +0,0 @@ -From ae925404a10bf0ea63d6e8d41e3821f68b4d776c Mon Sep 17 00:00:00 2001 -From: Aurelien Jarno -Date: Fri, 3 Sep 2021 00:28:14 +0200 -Subject: [PATCH] Fix failing nss/tst-nss-files-hosts-long with local resolver - -When a local resolver like unbound is listening on the IPv4 loopback -address 127.0.0.1, the nss/tst-nss-files-hosts-long test fails. This is -due to: -- the default resolver in the absence of resolv.conf being 127.0.0.1 -- the default DNS NSS database configuration in the absence of - nsswitch.conf being 'hosts: dns [!UNAVAIL=return] file' - -This causes the requests for 'test4' and 'test6' to first be sent to the -local resolver, which responds with NXDOMAIN in the likely case those -records do no exist. In turn that causes the access to /etc/hosts to be -skipped, which is the purpose of that test. - -Fix that by providing a simple nsswitch.conf file forcing access to -/etc/hosts for that test. I have tested that the only changed result in -the testsuite is that test. - -(cherry picked from commit 2738480a4b0866723fb8c633f36bdd34a8767581) ---- - nss/tst-nss-files-hosts-long.root/etc/nsswitch.conf | 1 + - 1 file changed, 1 insertion(+) - create mode 100644 nss/tst-nss-files-hosts-long.root/etc/nsswitch.conf - -diff --git a/nss/tst-nss-files-hosts-long.root/etc/nsswitch.conf b/nss/tst-nss-files-hosts-long.root/etc/nsswitch.conf -new file mode 100644 -index 0000000..5b0c6a4 ---- /dev/null -+++ b/nss/tst-nss-files-hosts-long.root/etc/nsswitch.conf -@@ -0,0 +1 @@ -+hosts: files --- -1.8.3.1 - diff --git a/Linux-Fix-fcntl-ioctl-prctl-redirects-for-_TIME_BITS.patch b/Linux-Fix-fcntl-ioctl-prctl-redirects-for-_TIME_BITS.patch deleted file mode 100644 index b33981de0a23215e05069e5251e4d5a825799c83..0000000000000000000000000000000000000000 --- a/Linux-Fix-fcntl-ioctl-prctl-redirects-for-_TIME_BITS.patch +++ /dev/null @@ -1,72 +0,0 @@ -From c87fcacc50505d550f1bb038382bcc7ea73a5926 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Fri, 6 Aug 2021 09:51:38 +0200 -Subject: [PATCH] Linux: Fix fcntl, ioctl, prctl redirects for _TIME_BITS=64 - (bug 28182) - -__REDIRECT and __THROW are not compatible with C++ due to the ordering of the -__asm__ alias and the throw specifier. __REDIRECT_NTH has to be used -instead. - -Fixes commit 8a40aff86ba5f64a3a84883e539cb67b ("io: Add time64 alias -for fcntl"), commit 82c395d91ea4f69120d453aeec398e30 ("misc: Add -time64 alias for ioctl"), commit b39ffab860cd743a82c91946619f1b8158 -("Linux: Add time64 alias for prctl"). - -Reviewed-by: Carlos O'Donell ---- - io/fcntl.h | 8 ++++---- - misc/sys/ioctl.h | 4 ++-- - sysdeps/unix/sysv/linux/sys/prctl.h | 2 +- - 3 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/io/fcntl.h b/io/fcntl.h -index 8917a73..1c96f98 100644 ---- a/io/fcntl.h -+++ b/io/fcntl.h -@@ -187,10 +187,10 @@ extern int fcntl64 (int __fd, int __cmd, ...); - # endif - #else /* __USE_TIME_BITS64 */ - # ifdef __REDIRECT --extern int __REDIRECT (fcntl, (int __fd, int __request, ...), -- __fcntl_time64) __THROW; --extern int __REDIRECT (fcntl64, (int __fd, int __request, ...), -- __fcntl_time64) __THROW; -+extern int __REDIRECT_NTH (fcntl, (int __fd, int __request, ...), -+ __fcntl_time64); -+extern int __REDIRECT_NTH (fcntl64, (int __fd, int __request, ...), -+ __fcntl_time64); - # else - extern int __fcntl_time64 (int __fd, int __request, ...) __THROW; - # define fcntl64 __fcntl_time64 -diff --git a/misc/sys/ioctl.h b/misc/sys/ioctl.h -index 6884d99..9945c1e 100644 ---- a/misc/sys/ioctl.h -+++ b/misc/sys/ioctl.h -@@ -42,8 +42,8 @@ __BEGIN_DECLS - extern int ioctl (int __fd, unsigned long int __request, ...) __THROW; - #else - # ifdef __REDIRECT --extern int __REDIRECT (ioctl, (int __fd, unsigned long int __request, ...), -- __ioctl_time64) __THROW; -+extern int __REDIRECT_NTH (ioctl, (int __fd, unsigned long int __request, ...), -+ __ioctl_time64); - # else - extern int __ioctl_time64 (int __fd, unsigned long int __request, ...) __THROW; - # define ioctl __ioctl_time64 -diff --git a/sysdeps/unix/sysv/linux/sys/prctl.h b/sysdeps/unix/sysv/linux/sys/prctl.h -index db88938..f0e0d2f 100644 ---- a/sysdeps/unix/sysv/linux/sys/prctl.h -+++ b/sysdeps/unix/sysv/linux/sys/prctl.h -@@ -42,7 +42,7 @@ __BEGIN_DECLS - extern int prctl (int __option, ...) __THROW; - #else - # ifdef __REDIRECT --extern int __REDIRECT (prctl, (int __option, ...), __prctl_time64) __THROW; -+extern int __REDIRECT_NTH (prctl, (int __option, ...), __prctl_time64); - # else - extern int __prctl_time64 (int __option,d ...) __THROW; - # define ioctl __prctl_time64 --- -1.8.3.1 - diff --git a/Linux-Simplify-__opensock-and-fix-race-condition-BZ-.patch b/Linux-Simplify-__opensock-and-fix-race-condition-BZ-.patch deleted file mode 100644 index b7cbeef7cd7b54c930ca24e7a6a5d131def37f9f..0000000000000000000000000000000000000000 --- a/Linux-Simplify-__opensock-and-fix-race-condition-BZ-.patch +++ /dev/null @@ -1,241 +0,0 @@ -From 5bf07e1b3a74232bfb8332275110be1a5da50f83 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Tue, 28 Sep 2021 18:55:49 +0200 -Subject: [PATCH] Linux: Simplify __opensock and fix race condition [BZ #28353] - -AF_NETLINK support is not quite optional on modern Linux systems -anymore, so it is likely that the first attempt will always succeed. -Consequently, there is no need to cache the result. Keep AF_UNIX -and the Internet address families as a fallback, for the rare case -that AF_NETLINK is missing. The other address families previously -probed are totally obsolete be now, so remove them. - -Use this simplified version as the generic implementation, disabling -Netlink support as needed. ---- - socket/opensock.c | 65 +++++--------- - sysdeps/unix/sysv/linux/opensock.c | 114 ------------------------ - sysdeps/unix/sysv/linux/s390/opensock.c | 2 - - 3 files changed, 22 insertions(+), 159 deletions(-) - delete mode 100644 sysdeps/unix/sysv/linux/opensock.c - delete mode 100644 sysdeps/unix/sysv/linux/s390/opensock.c - -diff --git a/socket/opensock.c b/socket/opensock.c -index 37148d4743..ff94d27a61 100644 ---- a/socket/opensock.c -+++ b/socket/opensock.c -@@ -1,4 +1,5 @@ --/* Copyright (C) 1999-2021 Free Software Foundation, Inc. -+/* Create socket with an unspecified address family for use with ioctl. -+ Copyright (C) 1999-2021 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 -@@ -15,56 +16,34 @@ - License along with the GNU C Library; if not, see - . */ - --#include -+#include - #include --#include - - /* Return a socket of any type. The socket can be used in subsequent - ioctl calls to talk to the kernel. */ - int - __opensock (void) - { -- /* Cache the last AF that worked, to avoid many redundant calls to -- socket(). */ -- static int sock_af = -1; -- int fd = -1; -- __libc_lock_define_initialized (static, lock); -- -- if (sock_af != -1) -- { -- fd = __socket (sock_af, SOCK_DGRAM, 0); -- if (fd != -1) -- return fd; -- } -- -- __libc_lock_lock (lock); -- -- if (sock_af != -1) -- fd = __socket (sock_af, SOCK_DGRAM, 0); -- -- if (fd == -1) -- { --#ifdef AF_INET -- fd = __socket (sock_af = AF_INET, SOCK_DGRAM, 0); --#endif --#ifdef AF_INET6 -- if (fd < 0) -- fd = __socket (sock_af = AF_INET6, SOCK_DGRAM, 0); --#endif --#ifdef AF_IPX -- if (fd < 0) -- fd = __socket (sock_af = AF_IPX, SOCK_DGRAM, 0); --#endif --#ifdef AF_AX25 -- if (fd < 0) -- fd = __socket (sock_af = AF_AX25, SOCK_DGRAM, 0); --#endif --#ifdef AF_APPLETALK -- if (fd < 0) -- fd = __socket (sock_af = AF_APPLETALK, SOCK_DGRAM, 0); -+ /* SOCK_DGRAM is supported by all address families. (Netlink does -+ not support SOCK_STREAM.) */ -+ int type = SOCK_DGRAM | SOCK_CLOEXEC; -+ int fd; -+ -+#ifdef AF_NETLINK -+ fd = __socket (AF_NETLINK, type, 0); -+ if (fd >= 0) -+ return fd; - #endif -- } - -- __libc_lock_unlock (lock); -+ fd = __socket (AF_UNIX, type, 0); -+ if (fd >= 0) -+ return fd; -+ fd = __socket (AF_INET, type, 0); -+ if (fd >= 0) -+ return fd; -+ fd = __socket (AF_INET6, type, 0); -+ if (fd >= 0) -+ return fd; -+ __set_errno (ENOENT); - return fd; - } -diff --git a/sysdeps/unix/sysv/linux/opensock.c b/sysdeps/unix/sysv/linux/opensock.c -deleted file mode 100644 -index e87d6e58b0..0000000000 ---- a/sysdeps/unix/sysv/linux/opensock.c -+++ /dev/null -@@ -1,114 +0,0 @@ --/* Copyright (C) 1999-2021 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 -- --/* Return a socket of any type. The socket can be used in subsequent -- ioctl calls to talk to the kernel. */ --int --__opensock (void) --{ -- static int last_family; /* Available socket family we will use. */ -- static int last_type; -- static const struct -- { -- int family; -- const char procname[15]; -- } afs[] = -- { -- { AF_UNIX, "net/unix" }, -- { AF_INET, "" }, -- { AF_INET6, "net/if_inet6" }, -- { AF_AX25, "net/ax25" }, -- { AF_NETROM, "net/nr" }, -- { AF_ROSE, "net/rose" }, -- { AF_IPX, "net/ipx" }, -- { AF_APPLETALK, "net/appletalk" }, -- { AF_ECONET, "sys/net/econet" }, -- { AF_ASH, "sys/net/ash" }, -- { AF_X25, "net/x25" }, --#ifdef NEED_AF_IUCV -- { AF_IUCV, "net/iucv" } --#endif -- }; --#define nafs (sizeof (afs) / sizeof (afs[0])) -- char fname[sizeof "/proc/" + 14]; -- int result; -- int has_proc; -- size_t cnt; -- -- /* We already know which family to use from the last call. Use it -- again. */ -- if (last_family != 0) -- { -- assert (last_type != 0); -- -- result = __socket (last_family, last_type | SOCK_CLOEXEC, 0); -- if (result != -1 || errno != EAFNOSUPPORT) -- /* Maybe the socket type isn't supported anymore (module is -- unloaded). In this case again try to find the type. */ -- return result; -- -- /* Reset the values. They seem not valid anymore. */ -- last_family = 0; -- last_type = 0; -- } -- -- /* Check whether the /proc filesystem is available. */ -- has_proc = __access ("/proc/net", R_OK) != -1; -- strcpy (fname, "/proc/"); -- -- /* Iterate over the interface families and find one which is -- available. */ -- for (cnt = 0; cnt < nafs; ++cnt) -- { -- int type = SOCK_DGRAM; -- -- if (has_proc && afs[cnt].procname[0] != '\0') -- { -- strcpy (fname + 6, afs[cnt].procname); -- if (__access (fname, R_OK) == -1) -- /* The /proc entry is not available. I.e., we cannot -- create a socket of this type (without loading the -- module). Don't look for it since this might trigger -- loading the module. */ -- continue; -- } -- -- if (afs[cnt].family == AF_NETROM || afs[cnt].family == AF_X25) -- type = SOCK_SEQPACKET; -- -- result = __socket (afs[cnt].family, type | SOCK_CLOEXEC, 0); -- if (result != -1) -- { -- /* Found an available family. */ -- last_type = type; -- last_family = afs[cnt].family; -- return result; -- } -- } -- -- /* None of the protocol families is available. It is unclear what kind -- of error is returned. ENOENT seems like a reasonable choice. */ -- __set_errno (ENOENT); -- return -1; --} -diff --git a/sysdeps/unix/sysv/linux/s390/opensock.c b/sysdeps/unix/sysv/linux/s390/opensock.c -deleted file mode 100644 -index f099d651ff..0000000000 ---- a/sysdeps/unix/sysv/linux/s390/opensock.c -+++ /dev/null -@@ -1,2 +0,0 @@ --#define NEED_AF_IUCV 1 --#include "../opensock.c" --- -2.27.0 - diff --git a/Remove-sysdeps-tls-macros.h.patch b/Remove-sysdeps-tls-macros.h.patch deleted file mode 100644 index 82561b7860cdf06af01c8368d7528ecf6048f3d1..0000000000000000000000000000000000000000 --- a/Remove-sysdeps-tls-macros.h.patch +++ /dev/null @@ -1,1810 +0,0 @@ -From 710ba420fd417a4a82e0ad2e998e5f3b972cb503 Mon Sep 17 00:00:00 2001 -From: Fangrui Song -Date: Wed, 18 Aug 2021 09:15:20 -0700 -Subject: [PATCH] Remove sysdeps/*/tls-macros.h - -They provide TLS_GD/TLS_LD/TLS_IE/TLS_IE macros for TLS testing. Now -that we have migrated to __thread and tls_model attributes, these macros -are unused and the tls-macros.h files can retire. - -Reviewed-by: Szabolcs Nagy ---- - benchtests/strcoll-inputs/filelist#en_US.UTF-8 | 22 ---- - sysdeps/aarch64/tls-macros.h | 51 --------- - sysdeps/alpha/tls-macros.h | 25 ----- - sysdeps/arc/tls-macros.h | 47 -------- - sysdeps/arm/tls-macros.h | 72 ------------- - sysdeps/csky/abiv2/tls-macros.h | 55 ---------- - sysdeps/generic/tls-macros.h | 12 --- - sysdeps/hppa/tls-macros.h | 114 -------------------- - sysdeps/i386/tls-macros.h | 47 -------- - sysdeps/ia64/tls-macros.h | 66 ------------ - sysdeps/m68k/tls-macros.h | 68 ------------ - sysdeps/microblaze/tls-macros.h | 46 -------- - sysdeps/mips/tls-macros.h | 130 ---------------------- - sysdeps/nios2/tls-macros.h | 46 -------- - sysdeps/powerpc/powerpc32/tls-macros.h | 49 --------- - sysdeps/powerpc/powerpc64/tls-macros.h | 42 -------- - sysdeps/powerpc/tls-macros.h | 3 - - sysdeps/riscv/tls-macros.h | 47 -------- - sysdeps/s390/s390-32/tls-macros.h | 106 ------------------ - sysdeps/s390/s390-64/tls-macros.h | 90 ---------------- - sysdeps/sh/tls-macros.h | 143 ------------------------- - sysdeps/sparc/sparc32/tls-macros.h | 66 ------------ - sysdeps/sparc/sparc64/tls-macros.h | 65 ----------- - sysdeps/x86_64/tls-macros.h | 39 ------- - 24 files changed, 1451 deletions(-) - delete mode 100644 sysdeps/aarch64/tls-macros.h - delete mode 100644 sysdeps/alpha/tls-macros.h - delete mode 100644 sysdeps/arc/tls-macros.h - delete mode 100644 sysdeps/arm/tls-macros.h - delete mode 100644 sysdeps/csky/abiv2/tls-macros.h - delete mode 100644 sysdeps/generic/tls-macros.h - delete mode 100644 sysdeps/hppa/tls-macros.h - delete mode 100644 sysdeps/i386/tls-macros.h - delete mode 100644 sysdeps/ia64/tls-macros.h - delete mode 100644 sysdeps/m68k/tls-macros.h - delete mode 100644 sysdeps/microblaze/tls-macros.h - delete mode 100644 sysdeps/mips/tls-macros.h - delete mode 100644 sysdeps/nios2/tls-macros.h - delete mode 100644 sysdeps/powerpc/powerpc32/tls-macros.h - delete mode 100644 sysdeps/powerpc/powerpc64/tls-macros.h - delete mode 100644 sysdeps/powerpc/tls-macros.h - delete mode 100644 sysdeps/riscv/tls-macros.h - delete mode 100644 sysdeps/s390/s390-32/tls-macros.h - delete mode 100644 sysdeps/s390/s390-64/tls-macros.h - delete mode 100644 sysdeps/sh/tls-macros.h - delete mode 100644 sysdeps/sparc/sparc32/tls-macros.h - delete mode 100644 sysdeps/sparc/sparc64/tls-macros.h - delete mode 100644 sysdeps/x86_64/tls-macros.h - -diff --git a/benchtests/strcoll-inputs/filelist#en_US.UTF-8 b/benchtests/strcoll-inputs/filelist#en_US.UTF-8 -index 43eb9ef..197700e 100644 ---- a/benchtests/strcoll-inputs/filelist#en_US.UTF-8 -+++ b/benchtests/strcoll-inputs/filelist#en_US.UTF-8 -@@ -3195,7 +3195,6 @@ Implies - submul_1.S - sysdep.h - add_n.S --tls-macros.h - libc-tls.c - sub_n.S - libgcc-compat.c -@@ -3443,7 +3442,6 @@ libresolv.abilist - thread_state.h - pty-private.h - ldconfig.h --tls-macros.h - fd_to_filename.h - not-cancel.h - safe-fatal.h -@@ -3605,7 +3603,6 @@ start.S - tst-mode-switch-3.c - addmul_1.S - add_n.S --tls-macros.h - libc-tls.c - sub_n.S - strcmp.S -@@ -3921,7 +3918,6 @@ addmul_1.S - pthread_spin_trylock.S - add_n.S - e_sqrt.c --tls-macros.h - sub_n.S - strcmp.S - strlen.S -@@ -4138,7 +4134,6 @@ addmul_1.S - pthread_spin_trylock.S - add_n.S - rtld-memset.c --tls-macros.h - sub_n.S - strcmp.S - strlen.S -@@ -4651,7 +4646,6 @@ addmul_1.S - sysdep.h - strlen.c - add_n.S --tls-macros.h - sub_n.S - i786 - Implies -@@ -4712,7 +4706,6 @@ Makefile - start.S - libm-test-ulps - sysdep.h --tls-macros.h - libc-tls.c - tst-audit.h - dl-machine.h -@@ -5071,7 +5064,6 @@ addmul_1.S - sysdep.h - add_n.S - wcschr.S --tls-macros.h - sub_n.S - tst-quad2.c - strcmp.S -@@ -6337,7 +6329,6 @@ Makefile - start.S - libm-test-ulps - sysdep.h --tls-macros.h - libc-tls.c - strlen.S - tst-audit.h -@@ -6447,7 +6438,6 @@ strstr.c - string-endian.h - memcmp.c - sysdep.h --tls-macros.h - tst-audit.h - dl-machine.h - dl-tls.h -@@ -6581,7 +6571,6 @@ Makefile - start.S - libm-test-ulps - sysdep.h --tls-macros.h - libc-tls.c - strcmp.S - strrchr.S -@@ -7004,7 +6993,6 @@ addmul_1.S - Implies - sysdep.h - rtld-memset.c --tls-macros.h - strcmp.S - strlen.S - tst-audit.h -@@ -7124,7 +7112,6 @@ wcschr.c - Makefile - ffs.c - sysdep.h --tls-macros.h - test-arithf.c - nofpu - atomic-feupdateenv.c -@@ -7386,7 +7373,6 @@ gprrest0.S - sysdep.h - add_n.S - rtld-memset.c --tls-macros.h - sub_n.S - strcmp.S - strlen.S -@@ -7969,7 +7955,6 @@ memcmp.S - Makefile - start.S - sysdep.h --tls-macros.h - libc-tls.c - strcmp.S - sched_cpucount.c -@@ -8197,7 +8182,6 @@ start.S - addmul_1.S - nscd-types.h - add_n.S --tls-macros.h - libc-tls.c - sub_n.S - divqu.S -@@ -8318,7 +8302,6 @@ Makefile - ffs.c - start.S - sysdep.h --tls-macros.h - libc-tls.c - tst-audit.h - wcpcpy.c -@@ -8628,7 +8611,6 @@ Makefile - start.S - sysdep.h - add_n.S --tls-macros.h - sub_n.S - strcmp.S - tst-audit.h -@@ -8690,7 +8672,6 @@ start.S - addmul_1.S - sysdep.h - add_n.S --tls-macros.h - sub_n.S - strcmp.S - tst-audit.h -@@ -8796,7 +8777,6 @@ ftestexcept.c - rt-aeabi_unwind_cpp_pr1.c - sysdep.h - add_n.S --tls-macros.h - libc-tls.c - sub_n.S - strlen.S -@@ -8879,7 +8859,6 @@ Makefile - start.S - libm-test-ulps - sysdep.h --tls-macros.h - libc-tls.c - tst-audit.h - dl-machine.h -@@ -12064,7 +12043,6 @@ nodelmod4.c - dl-fini.c - unload2dep.c - unload8.c --tls-macros.h - unload4.c - tst-array5.exp - unload4mod2.c -diff --git a/sysdeps/aarch64/tls-macros.h b/sysdeps/aarch64/tls-macros.h -deleted file mode 100644 -index 33883dc..0000000 ---- a/sysdeps/aarch64/tls-macros.h -+++ /dev/null -@@ -1,51 +0,0 @@ --/* Copyright (C) 2009-2021 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 -- . */ -- --#define TLS_LD(x) TLS_GD(x) -- --#define TLS_GD(x) \ -- ({ register unsigned long __result asm ("x0"); \ -- asm ("adrp %0, :tlsgd:" #x "; " \ -- "add %0, %0, #:tlsgd_lo12:" #x "; " \ -- "bl __tls_get_addr;" \ -- "nop" \ -- : "=r" (__result) \ -- : \ -- : "x1", "x2", "x3", "x4", "x5", "x6", \ -- "x7", "x8", "x9", "x10", "x11", "x12", \ -- "x13", "x14", "x15", "x16", "x17", "x18", \ -- "x30", "memory", "cc"); \ -- (int *) (__result); }) -- --#define TLS_IE(x) \ -- ({ register unsigned long __result asm ("x0"); \ -- register unsigned long __t; \ -- asm ("mrs %1, tpidr_el0; " \ -- "adrp %0, :gottprel:" #x "; " \ -- "ldr %0, [%0, #:gottprel_lo12:" #x "]; " \ -- "add %0, %0, %1" \ -- : "=r" (__result), "=r" (__t)); \ -- (int *) (__result); }) -- --#define TLS_LE(x) \ -- ({ register unsigned long __result asm ("x0"); \ -- asm ("mrs %0, tpidr_el0; " \ -- "add %0, %0, :tprel_hi12:" #x "; " \ -- "add %0, %0, :tprel_lo12_nc:" #x \ -- : "=r" (__result)); \ -- (int *) (__result); }) -diff --git a/sysdeps/alpha/tls-macros.h b/sysdeps/alpha/tls-macros.h -deleted file mode 100644 -index 00489c2..0000000 ---- a/sysdeps/alpha/tls-macros.h -+++ /dev/null -@@ -1,25 +0,0 @@ --/* Macros to support TLS testing in times of missing compiler support. */ -- --extern void *__tls_get_addr (void *); -- --# define TLS_GD(x) \ -- ({ register void *__gp asm ("$29"); void *__result; \ -- asm ("lda %0, " #x "($gp) !tlsgd" : "=r" (__result) : "r"(__gp)); \ -- __tls_get_addr (__result); }) -- --# define TLS_LD(x) \ -- ({ register void *__gp asm ("$29"); void *__result; \ -- asm ("lda %0, " #x "($gp) !tlsldm" : "=r" (__result) : "r"(__gp)); \ -- __result = __tls_get_addr (__result); \ -- asm ("lda %0, " #x "(%0) !dtprel" : "+r" (__result)); \ -- __result; }) -- --# define TLS_IE(x) \ -- ({ register void *__gp asm ("$29"); long ofs; \ -- asm ("ldq %0, " #x "($gp) !gottprel" : "=r"(ofs) : "r"(__gp)); \ -- __builtin_thread_pointer () + ofs; }) -- --# define TLS_LE(x) \ -- ({ void *__result = __builtin_thread_pointer (); \ -- asm ("lda %0, " #x "(%0) !tprel" : "+r" (__result)); \ -- __result; }) -diff --git a/sysdeps/arc/tls-macros.h b/sysdeps/arc/tls-macros.h -deleted file mode 100644 -index b0003d8..0000000 ---- a/sysdeps/arc/tls-macros.h -+++ /dev/null -@@ -1,47 +0,0 @@ --/* Macros to support TLS testing in times of missing compiler support. ARC version. -- Copyright (C) 2020-2021 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 -- . */ -- -- --/* For now. */ --#define TLS_LD(x) TLS_IE(x) -- --#define TLS_GD(x) \ -- ({ void *__result; \ -- __asm__ ("add r0, pcl, @" #x "@tlsgd \n" \ -- ".tls_gd_ld " #x "`bl __tls_get_addr@plt \n" \ -- "mov %0, r0 \n" \ -- : "=&r" (__result) \ -- ::"r0","r1","r2","r3","r4","r5","r6","r7", \ -- "r8","r9","r10","r11","r12"); \ -- __result; }) -- --#define TLS_LE(x) \ -- ({ void *__result; \ -- void *tp = __builtin_thread_pointer (); \ -- __asm__ ("add %0, %1, @" #x "@tpoff \n" \ -- : "=r" (__result) : "r"(tp)); \ -- __result; }) -- --#define TLS_IE(x) \ -- ({ void *__result; \ -- void *tp = __builtin_thread_pointer (); \ -- __asm__ ("ld %0, [pcl, @" #x "@tlsie] \n" \ -- "add %0, %1, %0 \n" \ -- : "=&r" (__result) : "r" (tp)); \ -- __result; }) -diff --git a/sysdeps/arm/tls-macros.h b/sysdeps/arm/tls-macros.h -deleted file mode 100644 -index 25cd849..0000000 ---- a/sysdeps/arm/tls-macros.h -+++ /dev/null -@@ -1,72 +0,0 @@ --#include /* For ARCH_HAS_T2. */ -- --#ifdef __thumb2__ --# define ARM_PC_OFFSET "4" --#else --# define ARM_PC_OFFSET "8" --#endif -- --/* Returns the address of data containing ".word SYMBOL(RELOC)". */ --#if defined (ARCH_HAS_T2) && !defined (PIC) --# define GET_SPECIAL_RELOC(symbol, reloc) \ -- ({ \ -- int *__##symbol##_rodata; \ -- asm ("movw %0, #:lower16:1f\n" \ -- "movt %0, #:upper16:1f\n" \ -- ".pushsection .rodata.cst4, \"aM\", %%progbits, 4\n" \ -- ".balign 4\n" \ -- "1: .word " #symbol "(" #reloc ")\n" \ -- ".popsection" \ -- : "=r" (__##symbol##_rodata)); \ -- __##symbol##_rodata; \ -- }) --#elif defined (ARCH_HAS_T2) && defined (PIC) && ARM_PCREL_MOVW_OK --# define GET_SPECIAL_RELOC(symbol, reloc) \ -- ({ \ -- int *__##symbol##_rodata; \ -- asm ("movw %0, #:lower16:1f - 2f - " ARM_PC_OFFSET "\n" \ -- "movt %0, #:upper16:1f - 2f - " ARM_PC_OFFSET "\n" \ -- ".pushsection .rodata.cst4, \"aM\", %%progbits, 4\n" \ -- ".balign 4\n" \ -- "1: .word " #symbol "(" #reloc ")\n" \ -- ".popsection\n" \ -- "2: add %0, %0, pc" \ -- : "=r" (__##symbol##_rodata)); \ -- __##symbol##_rodata; \ -- }) --#else --# define GET_SPECIAL_RELOC(symbol, reloc) \ -- ({ \ -- int *__##symbol##_rodata; \ -- asm ("adr %0, 1f\n" \ -- "b 2f\n" \ -- ".balign 4\n" \ -- "1: .word " #symbol "(" #reloc ")\n" \ -- "2:" \ -- : "=r" (__##symbol##_rodata)); \ -- __##symbol##_rodata; \ -- }) --#endif -- --/* Returns the pointer value (SYMBOL(RELOC) + pc - PC_OFS). */ --#define GET_SPECIAL_PCREL(symbol, reloc) \ -- ({ \ -- int *__##symbol##_rodata = GET_SPECIAL_RELOC (symbol, reloc); \ -- (void *) ((int) __##symbol##_rodata + *__##symbol##_rodata); \ -- }) -- --#define TLS_LE(x) \ -- (__builtin_thread_pointer () + *GET_SPECIAL_RELOC (x, tpoff)) -- --#define TLS_IE(x) \ -- ((int *) (__builtin_thread_pointer () \ -- + *(int *) GET_SPECIAL_PCREL (x, gottpoff))) -- --extern void *__tls_get_addr (void *); -- --#define TLS_LD(x) \ -- ((int *) (__tls_get_addr (GET_SPECIAL_PCREL (x, tlsldm)) \ -- + *GET_SPECIAL_RELOC (x, tlsldo))) -- --#define TLS_GD(x) \ -- ((int *) __tls_get_addr (GET_SPECIAL_PCREL (x, tlsgd))) -diff --git a/sysdeps/csky/abiv2/tls-macros.h b/sysdeps/csky/abiv2/tls-macros.h -deleted file mode 100644 -index 57ed1e7..0000000 ---- a/sysdeps/csky/abiv2/tls-macros.h -+++ /dev/null -@@ -1,55 +0,0 @@ --/* Macros for accessing thread-local storage. C-SKY ABIV2 version. -- Copyright (C) 2018-2021 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 -- . */ -- --# define TLS_LE(x) \ -- ({ int *__result; \ -- __asm__ ("lrw %0, " #x "@TPOFF\n\t" \ -- "add %0, tls, %0" \ -- : "=&r" (__result)); \ -- __result; }) -- --# define TLS_IE(x) \ -- ({ int *__result; \ -- __asm__ ("grs a1, 1f\n" \ -- "1:\tlrw %0, " #x "@GOTTPOFF\n\t" \ -- "ldr.w %0, (a1, %0 << 0)\n\t" \ -- "add %0, tls, %0" \ -- : "=&r" (__result): : "a1"); \ -- __result; }) -- --# define TLS_LD(x) \ -- ({ char *__result; \ -- int __offset; \ -- extern void *__tls_get_addr (void *); \ -- __asm__ ("grs a1, 1f\n" \ -- "1:\tlrw %0, " #x "@TLSLDM32;\n\t" \ -- "add %0, a1, %0" \ -- : "=r" (__result) : : "a1"); \ -- __result = (char *)__tls_get_addr (__result); \ -- __asm__ ("lrw %0, " #x "@TLSLDO32" \ -- : "=r" (__offset)); \ -- (int *) (__result + __offset); }) -- --# define TLS_GD(x) \ -- ({ int *__result; \ -- extern void *__tls_get_addr (void *); \ -- __asm__ ("grs a1, 1f\n" \ -- "1:\tlrw %0, " #x "@TLSGD32\n\t" \ -- "add %0, a1, %0" \ -- : "=r" (__result) : : "a1"); \ -- (int *)__tls_get_addr (__result); }) -diff --git a/sysdeps/generic/tls-macros.h b/sysdeps/generic/tls-macros.h -deleted file mode 100644 -index 0a08f7c..0000000 ---- a/sysdeps/generic/tls-macros.h -+++ /dev/null -@@ -1,12 +0,0 @@ --/* Macros to support TLS testing in times of missing compiler support. -- Stub version. -- -- These macros should yield int * expressions for the TLS symbol X -- accessed using the various TLS access models. Macros for some machines -- are defined in elf/tls-macros.h, but ports can instead provide this file. -- --#define TLS_LE(x) --#define TLS_IE(x) --#define TLS_LD(x) --#define TLS_GD(x) --*/ -diff --git a/sysdeps/hppa/tls-macros.h b/sysdeps/hppa/tls-macros.h -deleted file mode 100644 -index 38edb1b..0000000 ---- a/sysdeps/hppa/tls-macros.h -+++ /dev/null -@@ -1,114 +0,0 @@ --/* TLS Access Macros for HP PARISC Linux */ -- --/* HPPA Local Exec TLS access. */ --#define TLS_LE(x) \ -- ({ int * __result; \ -- unsigned long __tmp; \ -- asm ( \ -- " mfctl %%cr27, %1\n" \ -- " addil LR'" #x "-$tls_leoff$, %1\n" \ -- " ldo RR'" #x "-$tls_leoff$(%%r1), %0\n" \ -- : "=r" (__result), "=r" (__tmp) \ -- : \ -- : "r1" ); \ -- __result; \ -- }) -- --/* HPPA Initial Exec TLS access. */ --#ifdef PIC --# define TLS_IE(x) \ -- ({ int * __result; \ -- unsigned long __tmp, __tmp2; \ -- asm ( \ -- " mfctl %%cr27, %1\n" \ -- " addil LT'" #x "-$tls_ieoff$, %%r19\n" \ -- " ldw RT'" #x "-$tls_ieoff$(%%r1), %2\n" \ -- " add %1, %2, %0\n" \ -- : "=r" (__result), "=r" (__tmp), "=r" (__tmp2) \ -- : \ -- : "r1" ); \ -- __result; \ -- }) --#else --# define TLS_IE(x) \ -- ({ int * __result; \ -- unsigned long __tmp, __tmp2; \ -- asm ( \ -- " mfctl %%cr27, %1\n" \ -- " addil LR'" #x "-$tls_ieoff$, %%r27\n" \ -- " ldw RR'" #x "-$tls_ieoff$(%%r1), %2\n" \ -- " add %1, %2, %0\n" \ -- : "=r" (__result), "=r" (__tmp), "=r" (__tmp2) \ -- : \ -- : "r1" ); \ -- __result; \ -- }) --#endif -- --#ifdef PIC --/* HPPA Local Dynamic TLS access. */ --# define TLS_LD(x) \ -- ({ int * __result; \ -- asm ( \ -- " copy %%r19, %%r4\n" \ -- " addil LT'" #x "-$tls_ldidx$, %%r19\n" \ -- " bl __tls_get_addr, %%r2\n" \ -- " ldo RT'" #x "-$tls_ldidx$(%%r1), %%r26\n" \ -- " addil LR'" #x "-$tls_dtpoff$, %%r28\n" \ -- " ldo RR'" #x "-$tls_dtpoff$(%%r1), %0\n" \ -- " copy %%r4, %%r19\n" \ -- : "=r" (__result) \ -- : \ -- : "r1", "r2", "r4", "r20", "r21", "r22", "r23", "r24", \ -- "r25", "r26", "r28", "r29", "r31" ); \ -- __result; \ -- }) --#else --# define TLS_LD(x) \ -- ({ int * __result; \ -- asm ( \ -- " addil LR'" #x "-$tls_ldidx$, %%r27\n" \ -- " bl __tls_get_addr, %%r2\n" \ -- " ldo RR'" #x "-$tls_ldidx$(%%r1), %%r26\n" \ -- " addil LR'" #x "-$tls_dtpoff$, %%r28\n" \ -- " ldo RR'" #x "-$tls_dtpoff$(%%r1), %0\n" \ -- : "=r" (__result) \ -- : \ -- : "r1", "r2", "r20", "r21", "r22", "r23", "r24", \ -- "r25", "r26", "r28", "r29", "r31" ); \ -- __result; \ -- }) --#endif -- --/* HPPA General Dynamic TLS access. */ --#ifdef PIC --# define TLS_GD(x) \ -- ({ int * __result; \ -- asm ( \ -- " copy %%r19, %%r4\n" \ -- " addil LT'" #x "-$tls_gdidx$, %%r19\n" \ -- " bl __tls_get_addr, %%r2\n" \ -- " ldo RT'" #x "-$tls_gdidx$(%%r1), %%r26\n" \ -- " copy %%r28, %0\n" \ -- " copy %%r4, %%r19\n" \ -- : "=r" (__result) \ -- : \ -- : "r1", "r2", "r4", "r20", "r21", "r22", "r23", "r24", \ -- "r25", "r26", "r28", "r29", "r31" ); \ -- __result; \ -- }) --#else --# define TLS_GD(x) \ -- ({ int * __result; \ -- asm ( \ -- " addil LR'" #x "-$tls_gdidx$, %%r27\n" \ -- " bl __tls_get_addr, %%r2\n" \ -- " ldo RR'" #x "-$tls_gdidx$(%%r1), %%r26\n" \ -- " copy %%r28, %0\n" \ -- : "=r" (__result) \ -- : \ -- : "r1", "r2", "r20", "r21", "r22", "r23", "r24", \ -- "r25", "r26", "r28", "r29", "r31" ); \ -- __result; \ -- }) --#endif -diff --git a/sysdeps/i386/tls-macros.h b/sysdeps/i386/tls-macros.h -deleted file mode 100644 -index 9c1303d..0000000 ---- a/sysdeps/i386/tls-macros.h -+++ /dev/null -@@ -1,47 +0,0 @@ --#define TLS_LE(x) \ -- ({ int *__l; \ -- asm ("movl %%gs:0,%0\n\t" \ -- "subl $" #x "@tpoff,%0" \ -- : "=r" (__l)); \ -- __l; }) -- --#define TLS_IE(x) \ -- ({ int *__l, __b; \ -- asm ("call 1f\n\t" \ -- ".subsection 1\n" \ -- "1:\tmovl (%%esp), %%ebx\n\t" \ -- "ret\n\t" \ -- ".previous\n\t" \ -- "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n\t" \ -- "movl %%gs:0,%0\n\t" \ -- "subl " #x "@gottpoff(%%ebx),%0" \ -- : "=r" (__l), "=&b" (__b)); \ -- __l; }) -- --#define TLS_LD(x) \ -- ({ int *__l, __b, __c, __d; \ -- asm ("call 1f\n\t" \ -- ".subsection 1\n" \ -- "1:\tmovl (%%esp), %%ebx\n\t" \ -- "ret\n\t" \ -- ".previous\n\t" \ -- "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n\t" \ -- "leal " #x "@tlsldm(%%ebx),%%eax\n\t" \ -- "call ___tls_get_addr@plt\n\t" \ -- "leal " #x "@dtpoff(%%eax), %%eax" \ -- : "=a" (__l), "=&b" (__b), "=&c" (__c), "=&d" (__d)); \ -- __l; }) -- --#define TLS_GD(x) \ -- ({ int *__l, __b, __c, __d; \ -- asm ("call 1f\n\t" \ -- ".subsection 1\n" \ -- "1:\tmovl (%%esp), %%ebx\n\t" \ -- "ret\n\t" \ -- ".previous\n\t" \ -- "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n\t" \ -- "leal " #x "@tlsgd(%%ebx),%%eax\n\t" \ -- "call ___tls_get_addr@plt\n\t" \ -- "nop" \ -- : "=a" (__l), "=&b" (__b), "=&c" (__c), "=&d" (__d)); \ -- __l; }) -diff --git a/sysdeps/ia64/tls-macros.h b/sysdeps/ia64/tls-macros.h -deleted file mode 100644 -index 13b216d..0000000 ---- a/sysdeps/ia64/tls-macros.h -+++ /dev/null -@@ -1,66 +0,0 @@ --/* Macros to support TLS testing in times of missing compiler support. */ -- --extern void *__tls_get_addr (void *); -- --# define TLS_LE(x) \ -- ({ void *__l; \ -- asm ("mov r2=r13\n\t" \ -- ";;\n\t" \ -- "addl %0=@tprel(" #x "),r2\n\t" \ -- : "=r" (__l) : : "r2" ); __l; }) -- --# define TLS_IE(x) \ -- ({ void *__l; \ -- register long __gp asm ("gp"); \ -- asm (";;\n\t" \ -- "addl r16=@ltoff(@tprel(" #x ")),gp\n\t" \ -- ";;\n\t" \ -- "ld8 r17=[r16]\n\t" \ -- ";;\n\t" \ -- "add %0=r13,r17\n\t" \ -- ";;\n\t" \ -- : "=r" (__l) : "r" (__gp) : "r16", "r17" ); __l; }) -- --# define __TLS_CALL_CLOBBERS \ -- "r2", "r3", "r8", "r9", "r10", "r11", "r14", "r15", "r16", "r17", \ -- "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", \ -- "r27", "r28", "r29", "r30", "r31", \ -- "p6", "p7", "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15", \ -- "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \ -- "b6", "b7", \ -- "out0", "out1", "out2", "out3", "out4", "out5", "out6", "out7" -- --# define TLS_LD(x) \ -- ({ void *__l; \ -- register long __gp asm ("gp"); \ -- asm (";;\n\t" \ -- "mov loc0=gp\n\t" \ -- "addl r16=@ltoff(@dtpmod(" #x ")),gp\n\t" \ -- "addl out1=@dtprel(" #x "),r0\n\t" \ -- ";;\n\t" \ -- "ld8 out0=[r16]\n\t" \ -- "br.call.sptk.many b0=__tls_get_addr" \ -- ";;\n\t" \ -- "mov gp=loc0\n\t" \ -- "mov %0=r8\n\t" \ -- ";;\n\t" \ -- : "=r" (__l) : "r" (__gp) : "loc0", __TLS_CALL_CLOBBERS); \ -- __l; }) -- --# define TLS_GD(x) \ -- ({ void *__l; \ -- register long __gp asm ("gp"); \ -- asm (";;\n\t" \ -- "mov loc0=gp\n\t" \ -- "addl r16=@ltoff(@dtpmod(" #x ")),gp\n\t" \ -- "addl r17=@ltoff(@dtprel(" #x ")),gp\n\t" \ -- ";;\n\t" \ -- "ld8 out0=[r16]\n\t" \ -- "ld8 out1=[r17]\n\t" \ -- "br.call.sptk.many b0=__tls_get_addr" \ -- ";;\n\t" \ -- "mov gp=loc0\n\t" \ -- "mov %0=r8\n\t" \ -- ";;\n\t" \ -- : "=r" (__l) : "r" (__gp) : "loc0", __TLS_CALL_CLOBBERS); \ -- __l; }) -diff --git a/sysdeps/m68k/tls-macros.h b/sysdeps/m68k/tls-macros.h -deleted file mode 100644 -index 5fe1735..0000000 ---- a/sysdeps/m68k/tls-macros.h -+++ /dev/null -@@ -1,68 +0,0 @@ --/* Macros for accessing thread-local storage. m68k version. -- Copyright (C) 2010-2021 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- Contributed by Maxim Kuvyrkov , 2010. -- -- 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 -- . */ -- --#define TLS_GD(x) \ -- ({ \ -- void *__result; \ -- extern void *__tls_get_addr (void *); \ -- \ -- asm ("movel #_GLOBAL_OFFSET_TABLE_@GOTPC, %0\n\t" \ -- "lea (-6, %%pc, %0), %0\n\t" \ -- "lea " #x "@TLSGD(%0), %0" \ -- : "=&a" (__result)); \ -- (int *) __tls_get_addr (__result); }) -- --#define TLS_LD(x) \ -- ({ \ -- char *__tp; \ -- int __offset; \ -- extern void *__tls_get_addr (void *); \ -- \ -- asm ("movel #_GLOBAL_OFFSET_TABLE_@GOTPC, %0\n\t" \ -- "lea (-6, %%pc, %0), %0\n\t" \ -- "lea " #x "@TLSLDM(%0), %0" \ -- : "=&a" (__tp)); \ -- __tp = (char *) __tls_get_addr (__tp); \ -- asm ("movel #" #x "@TLSLDO, %0" \ -- : "=a" (__offset)); \ -- (int *) (__tp + __offset); }) -- --#define TLS_IE(x) \ -- ({ \ -- char *__tp; \ -- int __offset; \ -- extern void * __m68k_read_tp (void); \ -- \ -- __tp = (char *) __m68k_read_tp (); \ -- asm ("movel #_GLOBAL_OFFSET_TABLE_@GOTPC, %0\n\t" \ -- "lea (-6, %%pc, %0), %0\n\t" \ -- "movel " #x "@TLSIE(%0), %0" \ -- : "=&a" (__offset)); \ -- (int *) (__tp + __offset); }) -- --#define TLS_LE(x) \ -- ({ \ -- char *__tp; \ -- int __offset; \ -- extern void * __m68k_read_tp (void); \ -- \ -- __tp = (char *) __m68k_read_tp (); \ -- asm ("movel #" #x "@TLSLE, %0" \ -- : "=a" (__offset)); \ -- (int *) (__tp + __offset); }) -diff --git a/sysdeps/microblaze/tls-macros.h b/sysdeps/microblaze/tls-macros.h -deleted file mode 100644 -index f7cd59d..0000000 ---- a/sysdeps/microblaze/tls-macros.h -+++ /dev/null -@@ -1,46 +0,0 @@ --/* Copyright (C) 2009-2021 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 -- . */ -- --#define TLS_LD(x) \ -- ({ \ -- char *__result; \ -- int __offset; \ -- extern void *__tls_get_addr (void *); \ -- asm ("mfs r20,rpc \n" \ -- "addik r20,r20,_GLOBAL_OFFSET_TABLE_+8\n" \ -- "addik %0,r20," #x "@TLSLDM" \ -- : "=r" (__result)); \ -- __result = (char *) __tls_get_addr (__result); \ -- asm ("addik %0,r0,"#x"@TLSDTPREL" \ -- : "=r" (__offset)); \ -- (int *) (__result + __offset); }) -- -- --#define TLS_GD(x) \ -- ({ \ -- int *__result; \ -- extern void *__tls_get_addr (void *); \ -- asm ("mfs r20,rpc\n" \ -- "addik r20,r20,_GLOBAL_OFFSET_TABLE_+8\n" \ -- "addik %0,r20," #x "@TLSGD" \ -- : "=r" (__result)); \ -- (int *) __tls_get_addr (__result); }) -- --#define TLS_LE(x) TLS_LD(x) -- --#define TLS_IE(x) TLS_GD(x) -diff --git a/sysdeps/mips/tls-macros.h b/sysdeps/mips/tls-macros.h -deleted file mode 100644 -index a6fdfbc..0000000 ---- a/sysdeps/mips/tls-macros.h -+++ /dev/null -@@ -1,130 +0,0 @@ --/* Macros to support TLS testing in times of missing compiler support. */ -- --#include --#include --#include -- --#define __STRING2(X) __STRING(X) --#define ADDU __STRING2(PTR_ADDU) --#define ADDIU __STRING2(PTR_ADDIU) --#define LW __STRING2(PTR_L) -- --/* Load the GOT pointer, which may not be in $28 in a non-PIC -- (abicalls pic0) function. */ --#ifndef __PIC__ --# if _MIPS_SIM != _ABI64 --# ifndef __mips16 --# define LOAD_GP "move %[tmp], $28\n\tla $28, __gnu_local_gp\n\t" --# else --# define LOAD_GP \ -- "li %[tmp], %%hi(__gnu_local_gp)\n\t" \ -- "sll %[tmp], 16\n\t" \ -- "addiu %[tmp], %%lo(__gnu_local_gp)\n\t" --# endif --# else --# define LOAD_GP "move %[tmp], $28\n\tdla $28, __gnu_local_gp\n\t" --# endif --# define UNLOAD_GP "\n\tmove $28, %[tmp]" --#else --/* MIPS16 (re)creates the GP value using PC-relative instructions. */ --# ifdef __mips16 --# define LOAD_GP \ -- "li %[tmp], %%hi(_gp_disp)\n\t" \ -- "addiu %0, $pc, %%lo(_gp_disp)\n\t" \ -- "sll %[tmp], 16\n\t" \ -- "addu %[tmp], %0\n\t" --# else --# define LOAD_GP --# endif --# define UNLOAD_GP --#endif -- --# if __mips_isa_rev >= 2 --# define TLS_RDHWR "rdhwr\t%0,$29" --# else --# define TLS_RDHWR \ -- ".set push\n\t.set mips32r2\n\t" \ -- "rdhwr\t%0,$29\n\t.set pop" --#endif -- --#ifndef __mips16 --# define TLS_GD(x) \ -- ({ void *__result, *__tmp; \ -- extern void *__tls_get_addr (void *); \ -- asm (LOAD_GP ADDIU " %0, $28, %%tlsgd(" #x ")" \ -- UNLOAD_GP \ -- : "=r" (__result), [tmp] "=&r" (__tmp)); \ -- (int *)__tls_get_addr (__result); }) --# define TLS_LD(x) \ -- ({ void *__result, *__tmp; \ -- extern void *__tls_get_addr (void *); \ -- asm (LOAD_GP ADDIU " %0, $28, %%tlsldm(" #x ")" \ -- UNLOAD_GP \ -- : "=r" (__result), [tmp] "=&r" (__tmp)); \ -- __result = __tls_get_addr (__result); \ -- asm ("lui $3,%%dtprel_hi(" #x ")\n\t" \ -- "addiu $3,$3,%%dtprel_lo(" #x ")\n\t" \ -- ADDU " %0,%0,$3" \ -- : "+r" (__result) : : "$3"); \ -- __result; }) --# define TLS_IE(x) \ -- ({ void *__result, *__tmp; \ -- asm (TLS_RDHWR \ -- : "=v" (__result)); \ -- asm (LOAD_GP LW " $3,%%gottprel(" #x ")($28)\n\t" \ -- ADDU " %0,%0,$3" \ -- UNLOAD_GP \ -- : "+r" (__result), [tmp] "=&r" (__tmp) \ -- : : "$3"); \ -- __result; }) --# define TLS_LE(x) \ -- ({ void *__result; \ -- asm (TLS_RDHWR \ -- : "=v" (__result)); \ -- asm ("lui $3,%%tprel_hi(" #x ")\n\t" \ -- "addiu $3,$3,%%tprel_lo(" #x ")\n\t" \ -- ADDU " %0,%0,$3" \ -- : "+r" (__result) : : "$3"); \ -- __result; }) -- --#else /* __mips16 */ --/* MIPS16 version. */ --# define TLS_GD(x) \ -- ({ void *__result, *__tmp; \ -- extern void *__tls_get_addr (void *); \ -- asm (LOAD_GP ADDIU " %1, %%tlsgd(" #x ")" \ -- "\n\tmove %0, %1" \ -- : "=d" (__result), [tmp] "=&d" (__tmp)); \ -- (int *) __tls_get_addr (__result); }) --# define TLS_LD(x) \ -- ({ void *__result, *__tmp; \ -- extern void *__tls_get_addr (void *); \ -- asm (LOAD_GP ADDIU " %1, %%tlsldm(" #x ")" \ -- "\n\tmove %0, %1" \ -- : "=d" (__result), [tmp] "=&d" (__tmp)); \ -- __result = __tls_get_addr (__result); \ -- asm ("li $3,%%dtprel_hi(" #x ")\n\t" \ -- "sll $3,16\n\t" \ -- "addiu $3,%%dtprel_lo(" #x ")\n\t" \ -- ADDU " %0,%0,$3" \ -- : "+d" (__result) : : "$3"); \ -- __result; }) --# define TLS_IE(x) \ -- ({ void *__result, *__tmp, *__tp; \ -- __tp = __builtin_thread_pointer (); \ -- asm (LOAD_GP LW " $3,%%gottprel(" #x ")(%1)\n\t" \ -- ADDU " %0,%[tp],$3" \ -- : "=&d" (__result), [tmp] "=&d" (__tmp) \ -- : [tp] "d" (__tp) : "$3"); \ -- __result; }) --# define TLS_LE(x) \ -- ({ void *__result, *__tp; \ -- __tp = __builtin_thread_pointer (); \ -- asm ("li $3,%%tprel_hi(" #x ")\n\t" \ -- "sll $3,16\n\t" \ -- "addiu $3,%%tprel_lo(" #x ")\n\t" \ -- ADDU " %0,%[tp],$3" \ -- : "=d" (__result) : [tp] "d" (__tp) : "$3"); \ -- __result; }) -- --#endif /* __mips16 */ -diff --git a/sysdeps/nios2/tls-macros.h b/sysdeps/nios2/tls-macros.h -deleted file mode 100644 -index 7029530..0000000 ---- a/sysdeps/nios2/tls-macros.h -+++ /dev/null -@@ -1,46 +0,0 @@ --#define TLS_LE(x) \ -- ({ int *__result; \ -- asm ("addi %0, r23, %%tls_le(" #x ")" \ -- : "=r" (__result)); \ -- __result; }) -- --#define TLS_IE(x) \ -- ({ int *__result; \ -- int __tmp; \ -- asm ("nextpc %0 ; " \ -- "1: movhi %1, %%hiadj(_gp_got - 1b) ; " \ -- "addi %1, %1, %%lo(_gp_got - 1b) ; " \ -- "add %0, %0, %1 ; " \ -- "ldw %1, %%tls_ie(" #x ")(%0) ; " \ -- "add %1, r23, %1" \ -- : "=&r" (__tmp), "=&r" (__result)); \ -- __result; }) -- --#define TLS_LD(x) \ -- ({ char *__result; \ -- char *__result2; \ -- int *__result3; \ -- int __tmp; \ -- extern void *__tls_get_addr (void *); \ -- asm ("nextpc %0 ; " \ -- "1: movhi %1, %%hiadj(_gp_got - 1b) ; " \ -- "addi %1, %1, %%lo(_gp_got - 1b) ; " \ -- "add %0, %0, %1 ; " \ -- "addi %0, %0, %%tls_ldm(" #x ")" \ -- : "=r" (__result), "=r" (__tmp)); \ -- __result2 = (char *)__tls_get_addr (__result); \ -- asm ("addi %0, %1, %%tls_ldo(" #x ")" \ -- : "=r" (__result3) : "r" (__result2)); \ -- __result3; }) -- --#define TLS_GD(x) \ -- ({ int *__result; \ -- int __tmp; \ -- extern void *__tls_get_addr (void *); \ -- asm ("nextpc %0 ; " \ -- "1: movhi %1, %%hiadj(_gp_got - 1b) ; " \ -- "addi %1, %1, %%lo(_gp_got - 1b) ; " \ -- "add %0, %0, %1 ; " \ -- "addi %0, %0, %%tls_gd(" #x ")" \ -- : "=r" (__result), "=r" (__tmp)); \ -- (int *)__tls_get_addr (__result); }) -diff --git a/sysdeps/powerpc/powerpc32/tls-macros.h b/sysdeps/powerpc/powerpc32/tls-macros.h -deleted file mode 100644 -index ee0eac4..0000000 ---- a/sysdeps/powerpc/powerpc32/tls-macros.h -+++ /dev/null -@@ -1,49 +0,0 @@ --/* Include sysdeps/powerpc/tls-macros.h for __TLS_CALL_CLOBBERS */ --#include_next "tls-macros.h" -- --/* PowerPC32 Local Exec TLS access. */ --#define TLS_LE(x) \ -- ({ int *__result; \ -- asm ("addi %0,2," #x "@tprel" \ -- : "=r" (__result)); \ -- __result; }) -- --/* PowerPC32 Initial Exec TLS access. */ --#define TLS_IE(x) \ -- ({ int *__result; \ -- asm ("bcl 20,31,1f\n1:\t" \ -- "mflr %0\n\t" \ -- "addis %0,%0,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" \ -- "addi %0,%0,_GLOBAL_OFFSET_TABLE_-1b@l\n\t" \ -- "lwz %0," #x "@got@tprel(%0)\n\t" \ -- "add %0,%0," #x "@tls" \ -- : "=b" (__result) : \ -- : "lr"); \ -- __result; }) -- --/* PowerPC32 Local Dynamic TLS access. */ --#define TLS_LD(x) \ -- ({ int *__result; \ -- asm ("bcl 20,31,1f\n1:\t" \ -- "mflr 3\n\t" \ -- "addis 3,3,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" \ -- "addi 3,3,_GLOBAL_OFFSET_TABLE_-1b@l\n\t" \ -- "addi 3,3," #x "@got@tlsld\n\t" \ -- "bl __tls_get_addr@plt\n\t" \ -- "addi %0,3," #x "@dtprel" \ -- : "=r" (__result) : \ -- : "3", __TLS_CALL_CLOBBERS); \ -- __result; }) -- --/* PowerPC32 General Dynamic TLS access. */ --#define TLS_GD(x) \ -- ({ register int *__result __asm__ ("r3"); \ -- asm ("bcl 20,31,1f\n1:\t" \ -- "mflr 3\n\t" \ -- "addis 3,3,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t" \ -- "addi 3,3,_GLOBAL_OFFSET_TABLE_-1b@l\n\t" \ -- "addi 3,3," #x "@got@tlsgd\n\t" \ -- "bl __tls_get_addr@plt" \ -- : "=r" (__result) : \ -- : __TLS_CALL_CLOBBERS); \ -- __result; }) -diff --git a/sysdeps/powerpc/powerpc64/tls-macros.h b/sysdeps/powerpc/powerpc64/tls-macros.h -deleted file mode 100644 -index 79a0b25..0000000 ---- a/sysdeps/powerpc/powerpc64/tls-macros.h -+++ /dev/null -@@ -1,42 +0,0 @@ --/* Include sysdeps/powerpc/tls-macros.h for __TLS_CALL_CLOBBERS */ --#include_next "tls-macros.h" -- --/* PowerPC64 Local Exec TLS access. */ --#define TLS_LE(x) \ -- ({ int * __result; \ -- asm ("addis %0,13," #x "@tprel@ha\n\t" \ -- "addi %0,%0," #x "@tprel@l" \ -- : "=b" (__result) ); \ -- __result; \ -- }) --/* PowerPC64 Initial Exec TLS access. */ --#define TLS_IE(x) \ -- ({ int * __result; \ -- asm ("ld %0," #x "@got@tprel(2)\n\t" \ -- "add %0,%0," #x "@tls" \ -- : "=r" (__result) ); \ -- __result; \ -- }) -- --/* PowerPC64 Local Dynamic TLS access. */ --#define TLS_LD(x) \ -- ({ int * __result; \ -- asm ("addi 3,2," #x "@got@tlsld\n\t" \ -- "bl __tls_get_addr\n\t" \ -- "nop \n\t" \ -- "addis %0,3," #x "@dtprel@ha\n\t" \ -- "addi %0,%0," #x "@dtprel@l" \ -- : "=b" (__result) : \ -- : "3", __TLS_CALL_CLOBBERS); \ -- __result; \ -- }) --/* PowerPC64 General Dynamic TLS access. */ --#define TLS_GD(x) \ -- ({ register int *__result __asm__ ("r3"); \ -- asm ("addi 3,2," #x "@got@tlsgd\n\t" \ -- "bl __tls_get_addr\n\t" \ -- "nop " \ -- : "=r" (__result) : \ -- : __TLS_CALL_CLOBBERS); \ -- __result; \ -- }) -diff --git a/sysdeps/powerpc/tls-macros.h b/sysdeps/powerpc/tls-macros.h -deleted file mode 100644 -index 809ef5c..0000000 ---- a/sysdeps/powerpc/tls-macros.h -+++ /dev/null -@@ -1,3 +0,0 @@ --#define __TLS_CALL_CLOBBERS \ -- "0", "4", "5", "6", "7", "8", "9", "10", "11", "12", \ -- "lr", "ctr", "cr0", "cr1", "cr5", "cr6", "cr7" -diff --git a/sysdeps/riscv/tls-macros.h b/sysdeps/riscv/tls-macros.h -deleted file mode 100644 -index 90c496c..0000000 ---- a/sysdeps/riscv/tls-macros.h -+++ /dev/null -@@ -1,47 +0,0 @@ --/* Macros to support TLS testing in times of missing compiler support. -- Copyright (C) 2017-2021 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 "dl-tls.h" -- --#define TLS_GD(x) \ -- ({ void *__result; \ -- asm ("la.tls.gd %0, " #x "\n\t" \ -- : "=r" (__result)); \ -- __tls_get_addr (__result); }) -- --#define TLS_LD(x) TLS_GD(x) -- --#define TLS_IE(x) \ -- ({ void *__result; \ -- asm ("la.tls.ie %0, " #x "\n\t" \ -- "add %0, %0, tp\n\t" \ -- : "=r" (__result)); \ -- __result; }) -- --#define TLS_LE(x) \ -- ({ void *__result; \ -- asm ("lui %0, %%tprel_hi(" #x ")\n\t" \ -- "add %0, %0, tp, %%tprel_add(" #x ")\n\t" \ -- "addi %0, %0, %%tprel_lo(" #x ")\n\t" \ -- : "=r" (__result)); \ -- __result; }) -diff --git a/sysdeps/s390/s390-32/tls-macros.h b/sysdeps/s390/s390-32/tls-macros.h -deleted file mode 100644 -index 153523a..0000000 ---- a/sysdeps/s390/s390-32/tls-macros.h -+++ /dev/null -@@ -1,106 +0,0 @@ --#define TLS_LE(x) \ -- ({ unsigned long __offset; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.long " #x "@ntpoff\n" \ -- "1:\tl %0,0(%0)" \ -- : "=a" (__offset) : : "cc" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) -- --#ifdef PIC --# define TLS_IE(x) \ -- ({ unsigned long __offset, __save12; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.long _GLOBAL_OFFSET_TABLE_-0b\n\t" \ -- ".long " #x "@gotntpoff\n" \ -- "1:\tlr %1,%%r12\n\t" \ -- "l %%r12,0(%0)\n\t" \ -- "la %%r12,0(%0,%%r12)\n\t" \ -- "l %0,4(%0)\n\t" \ -- "l %0,0(%0,%%r12):tls_load:" #x "\n\t" \ -- "lr %%r12,%1\n" \ -- : "=&a" (__offset), "=&a" (__save12) : : "cc" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#else --# define TLS_IE(x) \ -- ({ unsigned long __offset; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.long " #x "@indntpoff\n" \ -- "1:\t l %0,0(%0)\n\t" \ -- "l %0,0(%0):tls_load:" #x \ -- : "=&a" (__offset) : : "cc" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#endif -- --#ifdef PIC --# define TLS_LD(x) \ -- ({ unsigned long __offset, __save12; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.long _GLOBAL_OFFSET_TABLE_-0b\n\t" \ -- ".long __tls_get_offset@plt-0b\n\t" \ -- ".long " #x "@tlsldm\n\t" \ -- ".long " #x "@dtpoff\n" \ -- "1:\tlr %1,%%r12\n\t" \ -- "l %%r12,0(%0)\n\t" \ -- "la %%r12,0(%%r12,%0)\n\t" \ -- "l %%r1,4(%0)\n\t" \ -- "l %%r2,8(%0)\n\t" \ -- "bas %%r14,0(%%r1,%0):tls_ldcall:" #x "\n\t" \ -- "l %0,12(%0)\n\t" \ -- "alr %0,%%r2\n\t" \ -- "lr %%r12,%1" \ -- : "=&a" (__offset), "=&a" (__save12) \ -- : : "cc", "0", "1", "2", "3", "4", "5", "14"); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#else --# define TLS_LD(x) \ -- ({ unsigned long __offset; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.long _GLOBAL_OFFSET_TABLE_\n\t" \ -- ".long __tls_get_offset@plt\n\t" \ -- ".long " #x "@tlsldm\n\t" \ -- ".long " #x "@dtpoff\n" \ -- "1:\tl %%r12,0(%0)\n\t" \ -- "l %%r1,4(%0)\n\t" \ -- "l %%r2,8(%0)\n\t" \ -- "bas %%r14,0(%%r1):tls_ldcall:" #x "\n\t" \ -- "l %0,12(%0)\n\t" \ -- "alr %0,%%r2" \ -- : "=&a" (__offset) \ -- : : "cc", "0", "1", "2", "3", "4", "5", "12", "14"); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#endif -- --#ifdef PIC --# define TLS_GD(x) \ -- ({ unsigned long __offset, __save12; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.long _GLOBAL_OFFSET_TABLE_-0b\n\t" \ -- ".long __tls_get_offset@plt-0b\n\t" \ -- ".long " #x "@tlsgd\n" \ -- "1:\tlr %1,%%r12\n\t" \ -- "l %%r12,0(%0)\n\t" \ -- "la %%r12,0(%%r12,%0)\n\t" \ -- "l %%r1,4(%0)\n\t" \ -- "l %%r2,8(%0)\n\t" \ -- "bas %%r14,0(%%r1,%0):tls_gdcall:" #x "\n\t" \ -- "lr %0,%%r2\n\t" \ -- "lr %%r12,%1" \ -- : "=&a" (__offset), "=&a" (__save12) \ -- : : "cc", "0", "1", "2", "3", "4", "5", "14"); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#else --# define TLS_GD(x) \ -- ({ unsigned long __offset; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.long _GLOBAL_OFFSET_TABLE_\n\t" \ -- ".long __tls_get_offset@plt\n\t" \ -- ".long " #x "@tlsgd\n" \ -- "1:\tl %%r12,0(%0)\n\t" \ -- "l %%r1,4(%0)\n\t" \ -- "l %%r2,8(%0)\n\t" \ -- "bas %%r14,0(%%r1):tls_gdcall:" #x "\n\t" \ -- "lr %0,%%r2" \ -- : "=&a" (__offset) \ -- : : "cc", "0", "1", "2", "3", "4", "5", "12", "14"); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#endif -diff --git a/sysdeps/s390/s390-64/tls-macros.h b/sysdeps/s390/s390-64/tls-macros.h -deleted file mode 100644 -index 449a843..0000000 ---- a/sysdeps/s390/s390-64/tls-macros.h -+++ /dev/null -@@ -1,90 +0,0 @@ --#define TLS_LE(x) \ -- ({ unsigned long __offset; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.quad " #x "@ntpoff\n" \ -- "1:\tlg %0,0(%0)" \ -- : "=a" (__offset) : : "cc" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) -- --#ifdef PIC --# define TLS_IE(x) \ -- ({ unsigned long __offset, __save12; \ -- __asm__ ("bras %0,0f\n\t" \ -- ".quad " #x "@gotntpoff\n" \ -- "0:\tlgr %1,%%r12\n\t" \ -- "larl %%r12,_GLOBAL_OFFSET_TABLE_\n\t" \ -- "lg %0,0(%0)\n\t" \ -- "lg %0,0(%0,%%r12):tls_load:" #x "\n\t" \ -- "lgr %%r12,%1\n" \ -- : "=&a" (__offset), "=&a" (__save12) : : "cc" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#else --# define TLS_IE(x) \ -- ({ unsigned long __offset; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.quad " #x "@indntpoff\n" \ -- "1:\t lg %0,0(%0)\n\t" \ -- "lg %0,0(%0):tls_load:" #x \ -- : "=&a" (__offset) : : "cc" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#endif -- --#ifdef PIC --# define TLS_LD(x) \ -- ({ unsigned long __offset, __save12; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.quad " #x "@tlsldm\n\t" \ -- ".quad " #x "@dtpoff\n" \ -- "1:\tlgr %1,%%r12\n\t" \ -- "larl %%r12,_GLOBAL_OFFSET_TABLE_\n\t" \ -- "lg %%r2,0(%0)\n\t" \ -- "brasl %%r14,__tls_get_offset@plt:tls_ldcall:" #x "\n\t" \ -- "lg %0,8(%0)\n\t" \ -- "algr %0,%%r2\n\t" \ -- "lgr %%r12,%1" \ -- : "=&a" (__offset), "=&a" (__save12) \ -- : : "cc", "0", "1", "2", "3", "4", "5", "14" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#else --# define TLS_LD(x) \ -- ({ unsigned long __offset; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.quad " #x "@tlsldm\n\t" \ -- ".quad " #x "@dtpoff\n" \ -- "1:\tlarl %%r12,_GLOBAL_OFFSET_TABLE_\n\t" \ -- "lg %%r2,0(%0)\n\t" \ -- "brasl %%r14,__tls_get_offset@plt:tls_ldcall:" #x "\n\t" \ -- "lg %0,8(%0)\n\t" \ -- "algr %0,%%r2" \ -- : "=&a" (__offset) \ -- : : "cc", "0", "1", "2", "3", "4", "5", "12", "14" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#endif -- --#ifdef PIC --# define TLS_GD(x) \ -- ({ unsigned long __offset, __save12; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.quad " #x "@tlsgd\n" \ -- "1:\tlgr %1,%%r12\n\t" \ -- "larl %%r12,_GLOBAL_OFFSET_TABLE_\n\t" \ -- "lg %%r2,0(%0)\n\t" \ -- "brasl %%r14,__tls_get_offset@plt:tls_gdcall:" #x "\n\t" \ -- "lgr %0,%%r2\n\t" \ -- "lgr %%r12,%1" \ -- : "=&a" (__offset), "=&a" (__save12) \ -- : : "cc", "0", "1", "2", "3", "4", "5", "14" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#else --# define TLS_GD(x) \ -- ({ unsigned long __offset; \ -- __asm__ ("bras %0,1f\n" \ -- "0:\t.quad " #x "@tlsgd\n" \ -- "1:\tlarl %%r12,_GLOBAL_OFFSET_TABLE_\n\t" \ -- "lg %%r2,0(%0)\n\t" \ -- "brasl %%r14,__tls_get_offset@plt:tls_gdcall:" #x "\n\t" \ -- "lgr %0,%%r2" \ -- : "=&a" (__offset) \ -- : : "cc", "0", "1", "2", "3", "4", "5", "12", "14" ); \ -- (int *) (__builtin_thread_pointer() + __offset); }) --#endif -diff --git a/sysdeps/sh/tls-macros.h b/sysdeps/sh/tls-macros.h -deleted file mode 100644 -index aa56b0a..0000000 ---- a/sysdeps/sh/tls-macros.h -+++ /dev/null -@@ -1,143 +0,0 @@ --#define TLS_LE(x) \ -- ({ int *__l; void *__tp; \ -- asm ("stc gbr,%1\n\t" \ -- "mov.l 1f,%0\n\t" \ -- "bra 2f\n\t" \ -- " add %1,%0\n\t" \ -- ".align 2\n\t" \ -- "1: .long " #x "@tpoff\n\t" \ -- "2:" \ -- : "=r" (__l), "=r" (__tp)); \ -- __l; }) -- --#ifdef PIC --# define TLS_IE(x) \ -- ({ int *__l; void *__tp; \ -- register void *__gp __asm__("r12"); \ -- asm ("mov.l 1f,r0\n\t" \ -- "stc gbr,%1\n\t" \ -- "mov.l @(r0,r12),%0\n\t" \ -- "bra 2f\n\t" \ -- " add %1,%0\n\t" \ -- ".align 2\n\t" \ -- "1: .long " #x "@gottpoff\n\t" \ -- "2:" \ -- : "=r" (__l), "=r" (__tp) : "r" (__gp) : "r0"); \ -- __l; }) --#else --# define TLS_IE(x) \ -- ({ int *__l; void *__tp; \ -- asm ("mov.l r12,@-r15\n\t" \ -- "mova 0f,r0\n\t" \ -- "mov.l 0f,r12\n\t" \ -- "add r0,r12\n\t" \ -- "mov.l 1f,r0\n\t" \ -- "stc gbr,%1\n\t" \ -- "mov.l @(r0,r12),%0\n\t" \ -- "bra 2f\n\t" \ -- " add %1,%0\n\t" \ -- ".align 2\n\t" \ -- "1: .long " #x "@gottpoff\n\t" \ -- "0: .long _GLOBAL_OFFSET_TABLE_\n\t" \ -- "2: mov.l @r15+,r12" \ -- : "=r" (__l), "=r" (__tp) : : "r0"); \ -- __l; }) --#endif -- --#ifdef PIC --# define TLS_LD(x) \ -- ({ int *__l; \ -- register void *__gp __asm__("r12"); \ -- asm ("mov.l 1f,r4\n\t" \ -- "mova 2f,r0\n\t" \ -- "mov.l 2f,r1\n\t" \ -- "add r0,r1\n\t" \ -- "jsr @r1\n\t" \ -- " add r12,r4\n\t" \ -- "bra 4f\n\t" \ -- " nop\n\t" \ -- ".align 2\n\t" \ -- "1: .long " #x "@tlsldm\n\t" \ -- "2: .long __tls_get_addr@plt\n\t" \ -- "4: mov.l 3f,%0\n\t" \ -- "bra 5f\n\t" \ -- " add r0,%0\n\t" \ -- ".align 2\n\t" \ -- "3: .long " #x "@dtpoff\n\t" \ -- "5:" \ -- : "=r" (__l) : "r" (__gp) : "r0", "r1", "r2", "r3", "r4", "r5", \ -- "r6", "r7", "pr", "t"); \ -- __l; }) --#else --# define TLS_LD(x) \ -- ({ int *__l; \ -- asm ("mov.l r12,@-r15\n\t" \ -- "mova 0f,r0\n\t" \ -- "mov.l 0f,r12\n\t" \ -- "add r0,r12\n\t" \ -- "mov.l 1f,r4\n\t" \ -- "mova 2f,r0\n\t" \ -- "mov.l 2f,r1\n\t" \ -- "add r0,r1\n\t" \ -- "jsr @r1\n\t" \ -- " add r12,r4\n\t" \ -- "bra 4f\n\t" \ -- " nop\n\t" \ -- ".align 2\n\t" \ -- "1: .long " #x "@tlsldm\n\t" \ -- "2: .long __tls_get_addr@plt\n\t" \ -- "0: .long _GLOBAL_OFFSET_TABLE_\n\t" \ -- "4: mov.l 3f,%0\n\t" \ -- "bra 5f\n\t" \ -- " add r0,%0\n\t" \ -- ".align 2\n\t" \ -- "3: .long " #x "@dtpoff\n\t" \ -- "5: mov.l @r15+,r12" \ -- : "=r" (__l) : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ -- "pr", "t"); \ -- __l; }) --#endif -- --#ifdef PIC --# define TLS_GD(x) \ -- ({ int *__l; \ -- register void *__gp __asm__("r12"); \ -- asm ("mov.l 1f,r4\n\t" \ -- "mova 2f,r0\n\t" \ -- "mov.l 2f,r1\n\t" \ -- "add r0,r1\n\t" \ -- "jsr @r1\n\t" \ -- " add r12,r4\n\t" \ -- "bra 3f\n\t" \ -- " mov r0,%0\n\t" \ -- ".align 2\n\t" \ -- "1: .long " #x "@tlsgd\n\t" \ -- "2: .long __tls_get_addr@plt\n\t" \ -- "3:" \ -- : "=r" (__l) : "r" (__gp) : "r0", "r1", "r2", "r3", "r4", "r5", \ -- "r6", "r7", "pr", "t"); \ -- __l; }) --#else --# define TLS_GD(x) \ -- ({ int *__l; \ -- asm ("mov.l r12,@-r15\n\t" \ -- "mova 0f,r0\n\t" \ -- "mov.l 0f,r12\n\t" \ -- "add r0,r12\n\t" \ -- "mov.l 1f,r4\n\t" \ -- "mova 2f,r0\n\t" \ -- "mov.l 2f,r1\n\t" \ -- "add r0,r1\n\t" \ -- "jsr @r1\n\t" \ -- " add r12,r4\n\t" \ -- "bra 3f\n\t" \ -- " mov r0,%0\n\t" \ -- ".align 2\n\t" \ -- "1: .long " #x "@tlsgd\n\t" \ -- "2: .long __tls_get_addr@plt\n\t" \ -- "0: .long _GLOBAL_OFFSET_TABLE_\n\t" \ -- "3: mov.l @r15+,r12" \ -- : "=r" (__l) : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ -- "pr", "t"); \ -- __l; }) --#endif -diff --git a/sysdeps/sparc/sparc32/tls-macros.h b/sysdeps/sparc/sparc32/tls-macros.h -deleted file mode 100644 -index 152216e..0000000 ---- a/sysdeps/sparc/sparc32/tls-macros.h -+++ /dev/null -@@ -1,66 +0,0 @@ --#define TLS_LE(x) \ -- ({ int *__l; \ -- asm ("sethi %%tle_hix22(" #x "), %0" : "=r" (__l)); \ -- asm ("xor %1, %%tle_lox10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ -- asm ("add %%g7, %1, %0" : "=r" (__l) : "r" (__l)); \ -- __l; }) -- --#ifdef __PIC__ --# define TLS_LOAD_PIC \ -- ({ register long pc __asm__ ("%o7"); \ -- long got; \ -- asm ("sethi %%hi(_GLOBAL_OFFSET_TABLE_-4), %1\n\t" \ -- "call .+8\n\t" \ -- "add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t" \ -- "add %1, %0, %1\n\t" \ -- : "=r" (pc), "=r" (got)); \ -- got; }) --#else --# define TLS_LOAD_PIC \ -- ({ long got; \ -- asm (".hidden _GLOBAL_OFFSET_TABLE_\n\t" \ -- "sethi %%hi(_GLOBAL_OFFSET_TABLE_), %0\n\t" \ -- "or %0, %%lo(_GLOBAL_OFFSET_TABLE_), %0" \ -- : "=r" (got)); \ -- got; }) --#endif -- --#define TLS_IE(x) \ -- ({ int *__l; \ -- asm ("sethi %%tie_hi22(" #x "), %0" : "=r" (__l)); \ -- asm ("add %1, %%tie_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ -- asm ("ld [%1 + %2], %0, %%tie_ld(" #x ")" \ -- : "=r" (__l) : "r" (TLS_LOAD_PIC), "r" (__l)); \ -- asm ("add %%g7, %1, %0, %%tie_add(" #x ")" : "=r" (__l) : "r" (__l)); \ -- __l; }) -- --#define TLS_LD(x) \ -- ({ int *__l; register void *__o0 asm ("%o0"); \ -- long __o; \ -- asm ("sethi %%tldm_hi22(" #x "), %0" : "=r" (__l)); \ -- asm ("add %1, %%tldm_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ -- asm ("add %1, %2, %0, %%tldm_add(" #x ")" \ -- : "=r" (__o0) : "r" (TLS_LOAD_PIC), "r" (__l)); \ -- asm ("call __tls_get_addr, %%tgd_call(" #x ")\n\t" \ -- " nop" \ -- : "=r" (__o0) : "0" (__o0) \ -- : "g1", "g2", "g3", "g4", "g5", "g6", "o1", "o2", "o3", "o4", \ -- "o5", "o7", "cc"); \ -- asm ("sethi %%tldo_hix22(" #x "), %0" : "=r" (__o)); \ -- asm ("xor %1, %%tldo_lox10(" #x "), %0" : "=r" (__o) : "r" (__o)); \ -- asm ("add %1, %2, %0, %%tldo_add(" #x ")" : "=r" (__l) \ -- : "r" (__o0), "r" (__o)); \ -- __l; }) -- --#define TLS_GD(x) \ -- ({ int *__l; register void *__o0 asm ("%o0"); \ -- asm ("sethi %%tgd_hi22(" #x "), %0" : "=r" (__l)); \ -- asm ("add %1, %%tgd_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ -- asm ("add %1, %2, %0, %%tgd_add(" #x ")" \ -- : "=r" (__o0) : "r" (TLS_LOAD_PIC), "r" (__l)); \ -- asm ("call __tls_get_addr, %%tgd_call(" #x ")\n\t" \ -- " nop" \ -- : "=r" (__o0) : "0" (__o0) \ -- : "g1", "g2", "g3", "g4", "g5", "g6", "o1", "o2", "o3", "o4", \ -- "o5", "o7", "cc"); \ -- __o0; }) -diff --git a/sysdeps/sparc/sparc64/tls-macros.h b/sysdeps/sparc/sparc64/tls-macros.h -deleted file mode 100644 -index bb0d803..0000000 ---- a/sysdeps/sparc/sparc64/tls-macros.h -+++ /dev/null -@@ -1,65 +0,0 @@ --#define TLS_LE(x) \ -- ({ int *__l; \ -- asm ("sethi %%tle_hix22(" #x "), %0" : "=r" (__l)); \ -- asm ("xor %1, %%tle_lox10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ -- asm ("add %%g7, %1, %0" : "=r" (__l) : "r" (__l)); \ -- __l; }) -- --#ifdef __PIC__ --# define TLS_LOAD_PIC \ -- ({ long pc, got; \ -- asm ("sethi %%hi(_GLOBAL_OFFSET_TABLE_-4), %1\n\t" \ -- "rd %%pc, %0\n\t" \ -- "add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t" \ -- "add %1, %0, %1\n\t" \ -- : "=r" (pc), "=r" (got)); \ -- got; }) --#else --# define TLS_LOAD_PIC \ -- ({ long got; \ -- asm (".hidden _GLOBAL_OFFSET_TABLE_\n\t" \ -- "sethi %%hi(_GLOBAL_OFFSET_TABLE_), %0\n\t" \ -- "or %0, %%lo(_GLOBAL_OFFSET_TABLE_), %0" \ -- : "=r" (got)); \ -- got; }) --#endif -- --#define TLS_IE(x) \ -- ({ int *__l; \ -- asm ("sethi %%tie_hi22(" #x "), %0" : "=r" (__l)); \ -- asm ("add %1, %%tie_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ -- asm ("ldx [%1 + %2], %0, %%tie_ldx(" #x ")" \ -- : "=r" (__l) : "r" (TLS_LOAD_PIC), "r" (__l)); \ -- asm ("add %%g7, %1, %0, %%tie_add(" #x ")" : "=r" (__l) : "r" (__l)); \ -- __l; }) -- --#define TLS_LD(x) \ -- ({ int *__l; register void *__o0 asm ("%o0"); \ -- long __o; \ -- asm ("sethi %%tldm_hi22(" #x "), %0" : "=r" (__l)); \ -- asm ("add %1, %%tldm_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ -- asm ("add %1, %2, %0, %%tldm_add(" #x ")" \ -- : "=r" (__o0) : "r" (TLS_LOAD_PIC), "r" (__l)); \ -- asm ("call __tls_get_addr, %%tgd_call(" #x ")\n\t" \ -- " nop" \ -- : "=r" (__o0) : "0" (__o0) \ -- : "g1", "g2", "g3", "g4", "g5", "g6", "o1", "o2", "o3", "o4", \ -- "o5", "o7", "cc"); \ -- asm ("sethi %%tldo_hix22(" #x "), %0" : "=r" (__o)); \ -- asm ("xor %1, %%tldo_lox10(" #x "), %0" : "=r" (__o) : "r" (__o)); \ -- asm ("add %1, %2, %0, %%tldo_add(" #x ")" : "=r" (__l) \ -- : "r" (__o0), "r" (__o)); \ -- __l; }) -- --#define TLS_GD(x) \ -- ({ int *__l; register void *__o0 asm ("%o0"); \ -- asm ("sethi %%tgd_hi22(" #x "), %0" : "=r" (__l)); \ -- asm ("add %1, %%tgd_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \ -- asm ("add %1, %2, %0, %%tgd_add(" #x ")" \ -- : "=r" (__o0) : "r" (TLS_LOAD_PIC), "r" (__l)); \ -- asm ("call __tls_get_addr, %%tgd_call(" #x ")\n\t" \ -- " nop" \ -- : "=r" (__o0) : "0" (__o0) \ -- : "g1", "g2", "g3", "g4", "g5", "g6", "o1", "o2", "o3", "o4", \ -- "o5", "o7", "cc"); \ -- __o0; }) -diff --git a/sysdeps/x86_64/tls-macros.h b/sysdeps/x86_64/tls-macros.h -deleted file mode 100644 -index 22d2a4b..0000000 ---- a/sysdeps/x86_64/tls-macros.h -+++ /dev/null -@@ -1,39 +0,0 @@ --#define TLS_LE(x) \ -- ({ int *__l; \ -- asm ("mov %%fs:0,%0\n\t" \ -- "lea " #x "@tpoff(%0), %0" \ -- : "=r" (__l)); \ -- __l; }) -- --#define TLS_IE(x) \ -- ({ int *__l; \ -- asm ("mov %%fs:0,%0\n\t" \ -- "add " #x "@gottpoff(%%rip),%0" \ -- : "=r" (__l)); \ -- __l; }) -- --#define TLS_LD(x) \ -- ({ int *__l, __c, __d; \ -- asm ("leaq " #x "@tlsld(%%rip),%%rdi\n\t" \ -- "call __tls_get_addr@plt\n\t" \ -- "leaq " #x "@dtpoff(%%rax), %%rax" \ -- : "=a" (__l), "=&c" (__c), "=&d" (__d) \ -- : : "rdi", "rsi", "r8", "r9", "r10", "r11"); \ -- __l; }) -- --#ifdef __ILP32__ --# define TLS_GD_PREFIX --#else --# define TLS_GD_PREFIX ".byte 0x66\n\t" --#endif -- --#define TLS_GD(x) \ -- ({ int *__l, __c, __d; \ -- asm (TLS_GD_PREFIX \ -- "leaq " #x "@tlsgd(%%rip),%%rdi\n\t" \ -- ".word 0x6666\n\t" \ -- "rex64\n\t" \ -- "call __tls_get_addr@plt" \ -- : "=a" (__l), "=&c" (__c), "=&d" (__d) \ -- : : "rdi", "rsi", "r8", "r9", "r10", "r11"); \ -- __l; }) --- -1.8.3.1 - diff --git a/Update-string-test-memmove.c-to-cover-16KB-copy.patch b/Update-string-test-memmove.c-to-cover-16KB-copy.patch deleted file mode 100644 index 894833e457bf199b4ed9e809080f0a3576f9ffba..0000000000000000000000000000000000000000 --- a/Update-string-test-memmove.c-to-cover-16KB-copy.patch +++ /dev/null @@ -1,78 +0,0 @@ -From c333dcf8d8f9e6e46475d9eff24bd5394b5d3d9e Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" -Date: Mon, 1 Feb 2021 17:23:12 -0800 -Subject: [PATCH] Update string/test-memmove.c to cover 16KB copy - ---- - string/test-memmove.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 48 insertions(+) - -diff --git a/string/test-memmove.c b/string/test-memmove.c -index b271248..670094c 100644 ---- a/string/test-memmove.c -+++ b/string/test-memmove.c -@@ -312,6 +312,50 @@ do_test2 (size_t offset) - munmap ((void *) large_buf, size); - } - -+static void -+do_test3 (size_t bytes_move, size_t offset) -+{ -+ size_t size = bytes_move * 3; -+ uint32_t *buf; -+ -+ buf = mmap (NULL, size, PROT_READ | PROT_WRITE, -+ MAP_PRIVATE | MAP_ANON, -1, 0); -+ -+ if (buf == MAP_FAILED) -+ error (EXIT_UNSUPPORTED, errno, "mmap failed"); -+ -+ size_t arr_size = bytes_move / sizeof (uint32_t); -+ size_t i; -+ -+ FOR_EACH_IMPL (impl, 0) -+ { -+ for (i = 0; i < arr_size; i++) -+ buf[i] = (uint32_t) i; -+ -+ uint32_t *dst = &buf[arr_size + offset]; -+ -+#ifdef TEST_BCOPY -+ CALL (impl, (char *) buf, (char *) dst, bytes_move); -+#else -+ CALL (impl, (char *) dst, (char *) buf, bytes_move); -+#endif -+ -+ for (i = 0; i < arr_size; i++) -+ { -+ if (dst[i] != (uint32_t) i) -+ { -+ error (0, 0, -+ "Wrong result in function %s dst \"%p\" src \"%p\" offset \"%zd\"", -+ impl->name, dst, buf, i); -+ ret = 1; -+ break; -+ } -+ } -+ } -+ -+ munmap ((void *) buf, size); -+} -+ - int - test_main (void) - { -@@ -356,6 +400,10 @@ test_main (void) - do_test2 (0x200000); - do_test2 (0x4000000 - 1); - do_test2 (0x4000000); -+ -+ /* Copy 16KB data. */ -+ do_test3 (16384, 3); -+ - return ret; - } - --- -1.8.3.1 - diff --git a/Use-__executable_start-as-the-lowest-address-for-pro.patch b/Use-__executable_start-as-the-lowest-address-for-pro.patch deleted file mode 100644 index 06ddfb1958de4bd0063e3d322d0cc0af4e76d494..0000000000000000000000000000000000000000 --- a/Use-__executable_start-as-the-lowest-address-for-pro.patch +++ /dev/null @@ -1,106 +0,0 @@ -From 84a7eb1f87c1d01b58ad887a0ab5d87abbc1c772 Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" -Date: Fri, 30 Jul 2021 19:07:30 -0700 -Subject: [PATCH] Use __executable_start as the lowest address for profiling - [BZ #28153] - -Glibc assumes that ENTRY_POINT is the lowest address for which we need -to keep profiling records and BFD linker uses a linker script to place -the input sections. - -Starting from GCC 4.6, the main function is placed in .text.startup -section and starting from binutils 2.22, BFD linker with - -commit add44f8d5c5c05e08b11e033127a744d61c26aee -Author: Alan Modra -Date: Thu Nov 25 03:03:02 2010 +0000 - - * scripttempl/elf.sc: Group .text.exit, text.startup and .text.hot - sections. - -places .text.startup section before .text section, which leave the main -function out of profiling records. - -Starting from binutils 2.15, linker provides __executable_start to mark -the lowest address of the executable. Use __executable_start as the -lowest address to keep the main function in profiling records. This fixes -[BZ #28153]. - -Tested on Linux/x86-64, Linux/x32 and Linux/i686 as well as with -build-many-glibcs.py. ---- - csu/gmon-start.c | 10 +++++++++- - gmon/tst-gmon-gprof.sh | 2 ++ - gmon/tst-gmon-static-gprof.sh | 2 ++ - 3 files changed, 13 insertions(+), 1 deletion(-) - -diff --git a/csu/gmon-start.c b/csu/gmon-start.c -index b343288..344606a 100644 ---- a/csu/gmon-start.c -+++ b/csu/gmon-start.c -@@ -52,6 +52,11 @@ extern char ENTRY_POINT[]; - #endif - extern char etext[]; - -+/* Use __executable_start as the lowest address to keep profiling records -+ if it provided by the linker. */ -+extern const char executable_start[] asm ("__executable_start") -+ __attribute__ ((weak, visibility ("hidden"))); -+ - #ifndef TEXT_START - # ifdef ENTRY_POINT_DECL - # define TEXT_START ENTRY_POINT -@@ -92,7 +97,10 @@ __gmon_start__ (void) - called = 1; - - /* Start keeping profiling records. */ -- __monstartup ((u_long) TEXT_START, (u_long) &etext); -+ if (&executable_start != NULL) -+ __monstartup ((u_long) &executable_start, (u_long) &etext); -+ else -+ __monstartup ((u_long) TEXT_START, (u_long) &etext); - - /* Call _mcleanup before exiting; it will write out gmon.out from the - collected data. */ -diff --git a/gmon/tst-gmon-gprof.sh b/gmon/tst-gmon-gprof.sh -index 9d37158..dc0be02 100644 ---- a/gmon/tst-gmon-gprof.sh -+++ b/gmon/tst-gmon-gprof.sh -@@ -39,12 +39,14 @@ trap cleanup 0 - cat > "$expected" < "$expected_dot" < "$expected" < "$expected_dot" < -Date: Tue, 24 Aug 2021 16:15:50 -0300 -Subject: [PATCH] Use support_open_dev_null_range io/tst-closefrom, - misc/tst-close_range, and posix/tst-spawn5 (BZ #28260) - -It ensures a continuous range of file descriptor and avoid hitting -the RLIMIT_NOFILE. - -Checked on x86_64-linux-gnu. - -(cherry picked from commit 6b20880b22d1d0fce7e9f506baa6fe2d5c7fcfdc) ---- - io/tst-closefrom.c | 21 ++++++--------------- - posix/tst-spawn5.c | 13 +------------ - sysdeps/unix/sysv/linux/tst-close_range.c | 31 ++++++++++--------------------- - 3 files changed, 17 insertions(+), 48 deletions(-) - -diff --git a/io/tst-closefrom.c b/io/tst-closefrom.c -index d4c1870..395ec0d 100644 ---- a/io/tst-closefrom.c -+++ b/io/tst-closefrom.c -@@ -24,31 +24,22 @@ - #include - #include - #include -+#include - - #include - - #define NFDS 100 - - static int --open_multiple_temp_files (void) --{ -- /* Check if the temporary file descriptor has no no gaps. */ -- int lowfd = xopen ("/dev/null", O_RDONLY, 0600); -- for (int i = 1; i <= NFDS; i++) -- TEST_COMPARE (xopen ("/dev/null", O_RDONLY, 0600), lowfd + i); -- return lowfd; --} -- --static int - closefrom_test (void) - { - struct support_descriptors *descrs = support_descriptors_list (); - -- int lowfd = open_multiple_temp_files (); -+ int lowfd = support_open_dev_null_range (NFDS, O_RDONLY, 0600); - -- const int maximum_fd = lowfd + NFDS; -+ const int maximum_fd = lowfd + NFDS - 1; - const int half_fd = lowfd + NFDS / 2; -- const int gap = maximum_fd / 4; -+ const int gap = lowfd + NFDS / 4; - - /* Close half of the descriptors and check result. */ - closefrom (half_fd); -@@ -58,7 +49,7 @@ closefrom_test (void) - TEST_COMPARE (fcntl (i, F_GETFL), -1); - TEST_COMPARE (errno, EBADF); - } -- for (int i = 0; i < half_fd; i++) -+ for (int i = lowfd; i < half_fd; i++) - TEST_VERIFY (fcntl (i, F_GETFL) > -1); - - /* Create some gaps, close up to a threshold, and check result. */ -@@ -74,7 +65,7 @@ closefrom_test (void) - TEST_COMPARE (fcntl (i, F_GETFL), -1); - TEST_COMPARE (errno, EBADF); - } -- for (int i = 0; i < gap; i++) -+ for (int i = lowfd; i < gap; i++) - TEST_VERIFY (fcntl (i, F_GETFL) > -1); - - /* Close the remmaining but the last one. */ -diff --git a/posix/tst-spawn5.c b/posix/tst-spawn5.c -index ac66738..a95199a 100644 ---- a/posix/tst-spawn5.c -+++ b/posix/tst-spawn5.c -@@ -48,17 +48,6 @@ static int initial_argv_count; - #define NFDS 100 - - static int --open_multiple_temp_files (void) --{ -- /* Check if the temporary file descriptor has no no gaps. */ -- int lowfd = xopen ("/dev/null", O_RDONLY, 0600); -- for (int i = 1; i <= NFDS; i++) -- TEST_COMPARE (xopen ("/dev/null", O_RDONLY, 0600), -- lowfd + i); -- return lowfd; --} -- --static int - parse_fd (const char *str) - { - char *endptr; -@@ -185,7 +174,7 @@ spawn_closefrom_test (posix_spawn_file_actions_t *fa, int lowfd, int highfd, - static void - do_test_closefrom (void) - { -- int lowfd = open_multiple_temp_files (); -+ int lowfd = support_open_dev_null_range (NFDS, O_RDONLY, 0600); - const int half_fd = lowfd + NFDS / 2; - - /* Close half of the descriptors and check result. */ -diff --git a/sysdeps/unix/sysv/linux/tst-close_range.c b/sysdeps/unix/sysv/linux/tst-close_range.c -index dccb618..f5069d1 100644 ---- a/sysdeps/unix/sysv/linux/tst-close_range.c -+++ b/sysdeps/unix/sysv/linux/tst-close_range.c -@@ -36,23 +36,12 @@ - - #define NFDS 100 - --static int --open_multiple_temp_files (void) --{ -- /* Check if the temporary file descriptor has no no gaps. */ -- int lowfd = xopen ("/dev/null", O_RDONLY, 0600); -- for (int i = 1; i <= NFDS; i++) -- TEST_COMPARE (xopen ("/dev/null", O_RDONLY, 0600), -- lowfd + i); -- return lowfd; --} -- - static void - close_range_test_max_upper_limit (void) - { - struct support_descriptors *descrs = support_descriptors_list (); - -- int lowfd = open_multiple_temp_files (); -+ int lowfd = support_open_dev_null_range (NFDS, O_RDONLY, 0600); - - { - int r = close_range (lowfd, ~0U, 0); -@@ -68,7 +57,7 @@ close_range_test_max_upper_limit (void) - static void - close_range_test_common (int lowfd, unsigned int flags) - { -- const int maximum_fd = lowfd + NFDS; -+ const int maximum_fd = lowfd + NFDS - 1; - const int half_fd = lowfd + NFDS / 2; - const int gap_1 = maximum_fd - 8; - -@@ -121,7 +110,7 @@ close_range_test (void) - struct support_descriptors *descrs = support_descriptors_list (); - - /* Check if the temporary file descriptor has no no gaps. */ -- int lowfd = open_multiple_temp_files (); -+ int lowfd = support_open_dev_null_range (NFDS, O_RDONLY, 0600); - - close_range_test_common (lowfd, 0); - -@@ -146,7 +135,7 @@ close_range_test_subprocess (void) - struct support_descriptors *descrs = support_descriptors_list (); - - /* Check if the temporary file descriptor has no no gaps. */ -- int lowfd = open_multiple_temp_files (); -+ int lowfd = support_open_dev_null_range (NFDS, O_RDONLY, 0600); - - struct support_stack stack = support_stack_alloc (4096); - -@@ -184,7 +173,7 @@ close_range_unshare_test (void) - struct support_descriptors *descrs1 = support_descriptors_list (); - - /* Check if the temporary file descriptor has no no gaps. */ -- int lowfd = open_multiple_temp_files (); -+ int lowfd = support_open_dev_null_range (NFDS, O_RDONLY, 0600); - - struct support_descriptors *descrs2 = support_descriptors_list (); - -@@ -200,7 +189,7 @@ close_range_unshare_test (void) - - support_stack_free (&stack); - -- for (int i = 0; i < NFDS; i++) -+ for (int i = lowfd; i < lowfd + NFDS; i++) - TEST_VERIFY (fcntl (i, F_GETFL) > -1); - - support_descriptors_check (descrs2); -@@ -226,9 +215,9 @@ static void - close_range_cloexec_test (void) - { - /* Check if the temporary file descriptor has no no gaps. */ -- const int lowfd = open_multiple_temp_files (); -+ int lowfd = support_open_dev_null_range (NFDS, O_RDONLY, 0600); - -- const int maximum_fd = lowfd + NFDS; -+ const int maximum_fd = lowfd + NFDS - 1; - const int half_fd = lowfd + NFDS / 2; - const int gap_1 = maximum_fd - 8; - -@@ -251,13 +240,13 @@ close_range_cloexec_test (void) - /* Create some gaps, close up to a threshold, and check result. */ - static int gap_close[] = { 57, 78, 81, 82, 84, 90 }; - for (int i = 0; i < array_length (gap_close); i++) -- xclose (gap_close[i]); -+ xclose (lowfd + gap_close[i]); - - TEST_COMPARE (close_range (half_fd + 1, gap_1, CLOSE_RANGE_CLOEXEC), 0); - for (int i = half_fd + 1; i < gap_1; i++) - { - int flags = fcntl (i, F_GETFD); -- if (is_in_array (gap_close, array_length (gap_close), i)) -+ if (is_in_array (gap_close, array_length (gap_close), i - lowfd)) - TEST_COMPARE (flags, -1); - else - { --- -1.8.3.1 - diff --git a/aarch64-Make-elf_machine_-load_address-dynamic-robus.patch b/aarch64-Make-elf_machine_-load_address-dynamic-robus.patch deleted file mode 100644 index b17849954135668bd06c9ba120438c24be25200a..0000000000000000000000000000000000000000 --- a/aarch64-Make-elf_machine_-load_address-dynamic-robus.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 43d06ed218fc8be58987bdfd00e21e5720f0b862 Mon Sep 17 00:00:00 2001 -From: Fangrui Song -Date: Wed, 11 Aug 2021 09:00:37 -0700 -Subject: [PATCH] aarch64: Make elf_machine_{load_address,dynamic} robust [BZ - #28203] - -The AArch64 ABI is largely platform agnostic and does not specify -_GLOBAL_OFFSET_TABLE_[0] ([1]). glibc ld.so turns out to be probably the -only user of _GLOBAL_OFFSET_TABLE_[0] and GNU ld defines the value -to the link-time address _DYNAMIC. [2] - -In 2012, __ehdr_start was implemented in GNU ld and gold in binutils -2.23. Using adrp+add / (-mcmodel=tiny) adr to access -__ehdr_start/_DYNAMIC gives us a robust way to get the load address and -the link-time address of _DYNAMIC. - -[1]: From a psABI maintainer, https://bugs.llvm.org/show_bug.cgi?id=49672#c2 -[2]: LLD's aarch64 port does not set _GLOBAL_OFFSET_TABLE_[0] to the -link-time address _DYNAMIC. -LLD is widely used on aarch64 Android and ChromeOS devices. Software -just works without the need for _GLOBAL_OFFSET_TABLE_[0]. - -Reviewed-by: Szabolcs Nagy ---- - sysdeps/aarch64/dl-machine.h | 24 +++++++++--------------- - 1 file changed, 9 insertions(+), 15 deletions(-) - -diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h -index d29d827..3e10cb4 100644 ---- a/sysdeps/aarch64/dl-machine.h -+++ b/sysdeps/aarch64/dl-machine.h -@@ -37,28 +37,22 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr) - return ehdr->e_machine == EM_AARCH64; - } - --/* Return the link-time address of _DYNAMIC. Conveniently, this is the -- first element of the GOT. */ --static inline ElfW(Addr) __attribute__ ((unused)) --elf_machine_dynamic (void) --{ -- extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] attribute_hidden; -- return _GLOBAL_OFFSET_TABLE_[0]; --} -- - /* Return the run-time load address of the shared object. */ - - static inline ElfW(Addr) __attribute__ ((unused)) - elf_machine_load_address (void) - { -- /* To figure out the load address we use the definition that for any symbol: -- dynamic_addr(symbol) = static_addr(symbol) + load_addr -+ extern const ElfW(Ehdr) __ehdr_start attribute_hidden; -+ return (ElfW(Addr)) &__ehdr_start; -+} - -- _DYNAMIC sysmbol is used here as its link-time address stored in -- the special unrelocated first GOT entry. */ -+/* Return the link-time address of _DYNAMIC. */ - -- extern ElfW(Dyn) _DYNAMIC[] attribute_hidden; -- return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic (); -+static inline ElfW(Addr) __attribute__ ((unused)) -+elf_machine_dynamic (void) -+{ -+ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden; -+ return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address (); - } - - /* Set up the loaded object described by L so its unrelocated PLT --- -1.8.3.1 - diff --git a/arm-Simplify-elf_machine_-load_address-dynamic.patch b/arm-Simplify-elf_machine_-load_address-dynamic.patch deleted file mode 100644 index 42987ce944f01b708da4f3796f127015b6349a18..0000000000000000000000000000000000000000 --- a/arm-Simplify-elf_machine_-load_address-dynamic.patch +++ /dev/null @@ -1,82 +0,0 @@ -From bca0f5cbc9257c13322b99e55235c4f21ba0bd82 Mon Sep 17 00:00:00 2001 -From: Fangrui Song -Date: Wed, 18 Aug 2021 11:13:03 -0700 -Subject: [PATCH] arm: Simplify elf_machine_{load_address,dynamic} - -and drop reliance on _GLOBAL_OFFSET_TABLE_[0] being the link-time -address of _DYNAMIC. &__ehdr_start is a better way to get the load address. - -This is similar to commits b37b75d269883a2c553bb7019a813094eb4e2dd1 -(x86-64) and 43d06ed218fc8be58987bdfd00e21e5720f0b862 (aarch64). - -Reviewed-by: Joseph Myers ---- - sysdeps/arm/dl-machine.h | 47 ++++++++++------------------------------------- - 1 file changed, 10 insertions(+), 37 deletions(-) - -diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h -index ff5e09e..eb13cb8 100644 ---- a/sysdeps/arm/dl-machine.h -+++ b/sysdeps/arm/dl-machine.h -@@ -37,48 +37,21 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr) - return ehdr->e_machine == EM_ARM; - } - -- --/* Return the link-time address of _DYNAMIC. Conveniently, this is the -- first element of the GOT. */ --static inline Elf32_Addr __attribute__ ((unused)) --elf_machine_dynamic (void) --{ -- /* Declaring this hidden ensures that a PC-relative reference is used. */ -- extern const Elf32_Addr _GLOBAL_OFFSET_TABLE_[] attribute_hidden; -- return _GLOBAL_OFFSET_TABLE_[0]; --} -- -- - /* Return the run-time load address of the shared object. */ --static inline Elf32_Addr __attribute__ ((unused)) -+static inline ElfW(Addr) __attribute__ ((unused)) - elf_machine_load_address (void) - { -- Elf32_Addr pcrel_addr; --#ifdef SHARED -- extern Elf32_Addr __dl_start (void *) asm ("_dl_start"); -- Elf32_Addr got_addr = (Elf32_Addr) &__dl_start; -- asm ("adr %0, _dl_start" : "=r" (pcrel_addr)); --#else -- extern Elf32_Addr __dl_relocate_static_pie (void *) -- asm ("_dl_relocate_static_pie") attribute_hidden; -- Elf32_Addr got_addr = (Elf32_Addr) &__dl_relocate_static_pie; -- asm ("adr %0, _dl_relocate_static_pie" : "=r" (pcrel_addr)); --#endif --#ifdef __thumb__ -- /* Clear the low bit of the function address. -- -- NOTE: got_addr is from GOT table whose lsb is always set by linker if it's -- Thumb function address. PCREL_ADDR comes from PC-relative calculation -- which will finish during assembling. GAS assembler before the fix for -- PR gas/21458 was not setting the lsb but does after that. Always do the -- strip for both, so the code works with various combinations of glibc and -- Binutils. */ -- got_addr &= ~(Elf32_Addr) 1; -- pcrel_addr &= ~(Elf32_Addr) 1; --#endif -- return pcrel_addr - got_addr; -+ extern const ElfW(Ehdr) __ehdr_start attribute_hidden; -+ return (ElfW(Addr)) &__ehdr_start; - } - -+/* Return the link-time address of _DYNAMIC. */ -+static inline ElfW(Addr) __attribute__ ((unused)) -+elf_machine_dynamic (void) -+{ -+ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden; -+ return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address (); -+} - - /* Set up the loaded object described by L so its unrelocated PLT - entries will jump to the on-demand fixup code in dl-runtime.c. */ --- -1.8.3.1 - diff --git a/backport-CVE-2021-38604-0001-librt-add-test-bug-28213.patch b/backport-CVE-2021-38604-0001-librt-add-test-bug-28213.patch deleted file mode 100644 index c511b6696d42a64bab270062b635746704489b4d..0000000000000000000000000000000000000000 --- a/backport-CVE-2021-38604-0001-librt-add-test-bug-28213.patch +++ /dev/null @@ -1,146 +0,0 @@ -From 4cc79c217744743077bf7a0ec5e0a4318f1e6641 Mon Sep 17 00:00:00 2001 -From: Nikita Popov -Date: Thu, 12 Aug 2021 16:09:50 +0530 -Subject: [PATCH] librt: add test (bug 28213) - -This test implements following logic: -1) Create POSIX message queue. - Register a notification with mq_notify (using NULL attributes). - Then immediately unregister the notification with mq_notify. - Helper thread in a vulnerable version of glibc - should cause NULL pointer dereference after these steps. -2) Once again, register the same notification. - Try to send a dummy message. - Test is considered successfulif the dummy message - is successfully received by the callback function. - -Signed-off-by: Nikita Popov -Reviewed-by: Siddhesh Poyarekar ---- - rt/Makefile | 1 + - rt/tst-bz28213.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 102 insertions(+) - create mode 100644 rt/tst-bz28213.c - -diff --git a/rt/Makefile b/rt/Makefile -index 113cea03a5..910e775995 100644 ---- a/rt/Makefile -+++ b/rt/Makefile -@@ -74,6 +74,7 @@ tests := tst-shm tst-timer tst-timer2 \ - tst-aio7 tst-aio8 tst-aio9 tst-aio10 \ - tst-mqueue1 tst-mqueue2 tst-mqueue3 tst-mqueue4 \ - tst-mqueue5 tst-mqueue6 tst-mqueue7 tst-mqueue8 tst-mqueue9 \ -+ tst-bz28213 \ - tst-timer3 tst-timer4 tst-timer5 \ - tst-cpuclock2 tst-cputimer1 tst-cputimer2 tst-cputimer3 \ - tst-shm-cancel \ -diff --git a/rt/tst-bz28213.c b/rt/tst-bz28213.c -new file mode 100644 -index 0000000000..0c096b5a0a ---- /dev/null -+++ b/rt/tst-bz28213.c -@@ -0,0 +1,101 @@ -+/* Bug 28213: test for NULL pointer dereference in mq_notify. -+ Copyright (C) The GNU Toolchain Authors. -+ 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 -+#include -+#include -+ -+static mqd_t m = -1; -+static const char msg[] = "hello"; -+ -+static void -+check_bz28213_cb (union sigval sv) -+{ -+ char buf[sizeof (msg)]; -+ -+ (void) sv; -+ -+ TEST_VERIFY_EXIT ((size_t) mq_receive (m, buf, sizeof (buf), NULL) -+ == sizeof (buf)); -+ TEST_VERIFY_EXIT (memcmp (buf, msg, sizeof (buf)) == 0); -+ -+ exit (0); -+} -+ -+static void -+check_bz28213 (void) -+{ -+ struct sigevent sev; -+ -+ memset (&sev, '\0', sizeof (sev)); -+ sev.sigev_notify = SIGEV_THREAD; -+ sev.sigev_notify_function = check_bz28213_cb; -+ -+ /* Step 1: Register & unregister notifier. -+ Helper thread should receive NOTIFY_REMOVED notification. -+ In a vulnerable version of glibc, NULL pointer dereference follows. */ -+ TEST_VERIFY_EXIT (mq_notify (m, &sev) == 0); -+ TEST_VERIFY_EXIT (mq_notify (m, NULL) == 0); -+ -+ /* Step 2: Once again, register notification. -+ Try to send one message. -+ Test is considered successful, if the callback does exit (0). */ -+ TEST_VERIFY_EXIT (mq_notify (m, &sev) == 0); -+ TEST_VERIFY_EXIT (mq_send (m, msg, sizeof (msg), 1) == 0); -+ -+ /* Wait... */ -+ pause (); -+} -+ -+static int -+do_test (void) -+{ -+ static const char m_name[] = "/bz28213_queue"; -+ struct mq_attr m_attr; -+ -+ memset (&m_attr, '\0', sizeof (m_attr)); -+ m_attr.mq_maxmsg = 1; -+ m_attr.mq_msgsize = sizeof (msg); -+ -+ m = mq_open (m_name, -+ O_RDWR | O_CREAT | O_EXCL, -+ 0600, -+ &m_attr); -+ -+ if (m < 0) -+ { -+ if (errno == ENOSYS) -+ FAIL_UNSUPPORTED ("POSIX message queues are not implemented\n"); -+ FAIL_EXIT1 ("Failed to create POSIX message queue: %m\n"); -+ } -+ -+ TEST_VERIFY_EXIT (mq_unlink (m_name) == 0); -+ -+ check_bz28213 (); -+ -+ return 0; -+} -+ -+#include --- -2.27.0 - diff --git a/backport-CVE-2021-38604-0002-librt-fix-NULL-pointer-dereference-bug-28213.patch b/backport-CVE-2021-38604-0002-librt-fix-NULL-pointer-dereference-bug-28213.patch deleted file mode 100644 index 3dca8cc6cb6cc141a54ba9a4d1c4cecdf8f6e073..0000000000000000000000000000000000000000 --- a/backport-CVE-2021-38604-0002-librt-fix-NULL-pointer-dereference-bug-28213.patch +++ /dev/null @@ -1,39 +0,0 @@ -From b805aebd42364fe696e417808a700fdb9800c9e8 Mon Sep 17 00:00:00 2001 -From: Nikita Popov -Date: Mon, 9 Aug 2021 20:17:34 +0530 -Subject: [PATCH] librt: fix NULL pointer dereference (bug 28213) - -Helper thread frees copied attribute on NOTIFY_REMOVED message -received from the OS kernel. Unfortunately, it fails to check whether -copied attribute actually exists (data.attr != NULL). This worked -earlier because free() checks passed pointer before actually -attempting to release corresponding memory. But -__pthread_attr_destroy assumes pointer is not NULL. - -So passing NULL pointer to __pthread_attr_destroy will result in -segmentation fault. This scenario is possible if -notification->sigev_notify_attributes == NULL (which means default -thread attributes should be used). - -Signed-off-by: Nikita Popov -Reviewed-by: Siddhesh Poyarekar ---- - sysdeps/unix/sysv/linux/mq_notify.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sysdeps/unix/sysv/linux/mq_notify.c b/sysdeps/unix/sysv/linux/mq_notify.c -index 9799dcdaa4..eccae2e4c6 100644 ---- a/sysdeps/unix/sysv/linux/mq_notify.c -+++ b/sysdeps/unix/sysv/linux/mq_notify.c -@@ -131,7 +131,7 @@ helper_thread (void *arg) - to wait until it is done with it. */ - (void) __pthread_barrier_wait (¬ify_barrier); - } -- else if (data.raw[NOTIFY_COOKIE_LEN - 1] == NOTIFY_REMOVED) -+ else if (data.raw[NOTIFY_COOKIE_LEN - 1] == NOTIFY_REMOVED && data.attr != NULL) - { - /* The only state we keep is the copy of the thread attributes. */ - __pthread_attr_destroy (data.attr); --- -2.27.0 - diff --git a/copy_and_spawn_sgid-Avoid-double-calls-to-close.patch b/copy_and_spawn_sgid-Avoid-double-calls-to-close.patch deleted file mode 100644 index 0f4799037f3950a526eb0e7357c75c5f4c6bbb7b..0000000000000000000000000000000000000000 --- a/copy_and_spawn_sgid-Avoid-double-calls-to-close.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 45caed9d67a00af917d8b5b88d4b5eb1225b7aef Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Tue, 3 Aug 2021 21:10:53 +0530 -Subject: [PATCH] copy_and_spawn_sgid: Avoid double calls to close() - -If close() on infd and outfd succeeded, reset the fd numbers so that -we don't attempt to close them again. - -Reviewed-by: Arjun Shankar ---- - support/support_capture_subprocess.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c -index 27bfd19..0bacf6d 100644 ---- a/support/support_capture_subprocess.c -+++ b/support/support_capture_subprocess.c -@@ -170,6 +170,7 @@ copy_and_spawn_sgid (char *child_id, gid_t gid) - support_subprogram because we only want the program exit status, not the - contents. */ - ret = 0; -+ infd = outfd = -1; - - char * const args[] = {execname, child_id, NULL}; - --- -1.8.3.1 - diff --git a/delete-check-installed-headers-c-and-check-installed.patch b/delete-check-installed-headers-c-and-check-installed.patch deleted file mode 100644 index b4fa93429db84be32cd4c600a6bd417b50c6fdc1..0000000000000000000000000000000000000000 --- a/delete-check-installed-headers-c-and-check-installed.patch +++ /dev/null @@ -1,60 +0,0 @@ -From dd2efa50d197e2205acd8edbf29aba717d71bdbb Mon Sep 17 00:00:00 2001 -From: Yang Yanchao -Date: Tue, 4 Jan 2022 19:55:28 +0800 -Subject: [PATCH] testsuit: delete check-installed-headers-c and check-installed-headers-cxx - -check-installed-headers-c and check-installed-headers-cxx checked at CI -and can be deleted during building - ---- - Makefile | 4 ++-- - Rules | 4 ++-- - 2 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/Makefile b/Makefile -index f98d5a9e..83200a75 100644 ---- a/Makefile -+++ b/Makefile -@@ -532,7 +532,7 @@ $(objpfx)check-local-headers.out: scripts/check-local-headers.sh - - ifneq "$(headers)" "" - # Special test of all the installed headers in this directory. --tests-special += $(objpfx)check-installed-headers-c.out -+# tests-special += $(objpfx)check-installed-headers-c.out - libof-check-installed-headers-c := testsuite - $(objpfx)check-installed-headers-c.out: \ - scripts/check-installed-headers.sh $(headers) -@@ -542,7 +541,7 @@ $(objpfx)check-installed-headers-c.out: \ - $(evaluate-test) - - ifneq "$(CXX)" "" --tests-special += $(objpfx)check-installed-headers-cxx.out -+# tests-special += $(objpfx)check-installed-headers-cxx.out - libof-check-installed-headers-cxx := testsuite - $(objpfx)check-installed-headers-cxx.out: \ - scripts/check-installed-headers.sh $(headers) -diff --git a/Rules b/Rules -index b1137afe..ca29abd7 100644 ---- a/Rules -+++ b/Rules -@@ -84,7 +84,7 @@ common-generated += dummy.o dummy.c - ifneq "$(headers)" "" - # Test that all of the headers installed by this directory can be compiled - # in isolation. --tests-special += $(objpfx)check-installed-headers-c.out -+# tests-special += $(objpfx)check-installed-headers-c.out - libof-check-installed-headers-c := testsuite - $(objpfx)check-installed-headers-c.out: \ - $(..)scripts/check-installed-headers.sh $(headers) -@@ -96,7 +95,7 @@ $(objpfx)check-installed-headers-c.out: \ - ifneq "$(CXX)" "" - # If a C++ compiler is available, also test that they can be compiled - # in isolation as C++. --tests-special += $(objpfx)check-installed-headers-cxx.out -+# tests-special += $(objpfx)check-installed-headers-cxx.out - libof-check-installed-headers-cxx := testsuite - $(objpfx)check-installed-headers-cxx.out: \ - $(..)scripts/check-installed-headers.sh $(headers) --- -2.27.0 - diff --git a/elf-Avoid-deadlock-between-pthread_create-and-ctors-.patch b/elf-Avoid-deadlock-between-pthread_create-and-ctors-.patch deleted file mode 100644 index da70902246f8c39129c73d0cd78e981e82f91bbf..0000000000000000000000000000000000000000 --- a/elf-Avoid-deadlock-between-pthread_create-and-ctors-.patch +++ /dev/null @@ -1,482 +0,0 @@ -From 83b5323261bb72313bffcf37476c1b8f0847c736 Mon Sep 17 00:00:00 2001 -From: Szabolcs Nagy -Date: Wed, 15 Sep 2021 15:16:19 +0100 -Subject: [PATCH] elf: Avoid deadlock between pthread_create and ctors [BZ - #28357] - -The fix for bug 19329 caused a regression such that pthread_create can -deadlock when concurrent ctors from dlopen are waiting for it to finish. -Use a new GL(dl_load_tls_lock) in pthread_create that is not taken -around ctors in dlopen. - -The new lock is also used in __tls_get_addr instead of GL(dl_load_lock). - -The new lock is held in _dl_open_worker and _dl_close_worker around -most of the logic before/after the init/fini routines. When init/fini -routines are running then TLS is in a consistent, usable state. -In _dl_open_worker the new lock requires catching and reraising dlopen -failures that happen in the critical section. - -The new lock is reinitialized in a fork child, to keep the existing -behaviour and it is kept recursive in case malloc interposition or TLS -access from signal handlers can retake it. It is not obvious if this -is necessary or helps, but avoids changing the preexisting behaviour. - -The new lock may be more appropriate for dl_iterate_phdr too than -GL(dl_load_write_lock), since TLS state of an incompletely loaded -module may be accessed. If the new lock can replace the old one, -that can be a separate change. - -Fixes bug 28357. - -Reviewed-by: Adhemerval Zanella ---- - elf/dl-close.c | 6 ++ - elf/dl-open.c | 35 +++++++++++- - elf/dl-support.c | 7 +++ - elf/dl-tls.c | 16 +++--- - elf/rtld.c | 1 + - posix/fork.c | 3 + - sysdeps/generic/ldsodefs.h | 9 ++- - sysdeps/pthread/Makefile | 10 +++- - sysdeps/pthread/tst-create1.c | 119 +++++++++++++++++++++++++++++++++++++++ - sysdeps/pthread/tst-create1mod.c | 41 ++++++++++++++ - 10 files changed, 235 insertions(+), 12 deletions(-) - create mode 100644 sysdeps/pthread/tst-create1.c - create mode 100644 sysdeps/pthread/tst-create1mod.c - -diff --git a/elf/dl-close.c b/elf/dl-close.c -index 93ff5c9..cfe0f1c 100644 ---- a/elf/dl-close.c -+++ b/elf/dl-close.c -@@ -549,6 +549,9 @@ _dl_close_worker (struct link_map *map, bool force) - size_t tls_free_end; - tls_free_start = tls_free_end = NO_TLS_OFFSET; - -+ /* Protects global and module specitic TLS state. */ -+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock)); -+ - /* We modify the list of loaded objects. */ - __rtld_lock_lock_recursive (GL(dl_load_write_lock)); - -@@ -784,6 +787,9 @@ _dl_close_worker (struct link_map *map, bool force) - GL(dl_tls_static_used) = tls_free_start; - } - -+ /* TLS is cleaned up for the unloaded modules. */ -+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock)); -+ - #ifdef SHARED - /* Auditing checkpoint: we have deleted all objects. */ - if (__glibc_unlikely (do_audit)) -diff --git a/elf/dl-open.c b/elf/dl-open.c -index 5295e93..6ea5dd2 100644 ---- a/elf/dl-open.c -+++ b/elf/dl-open.c -@@ -66,6 +66,9 @@ struct dl_open_args - libc_map value in the namespace in case of a dlopen failure. */ - bool libc_already_loaded; - -+ /* Set to true if the end of dl_open_worker_begin was reached. */ -+ bool worker_continue; -+ - /* Original parameters to the program and the current environment. */ - int argc; - char **argv; -@@ -482,7 +485,7 @@ call_dl_init (void *closure) - } - - static void --dl_open_worker (void *a) -+dl_open_worker_begin (void *a) - { - struct dl_open_args *args = a; - const char *file = args->file; -@@ -774,6 +777,36 @@ dl_open_worker (void *a) - _dl_call_libc_early_init (libc_map, false); - } - -+ args->worker_continue = true; -+} -+ -+static void -+dl_open_worker (void *a) -+{ -+ struct dl_open_args *args = a; -+ -+ args->worker_continue = false; -+ -+ { -+ /* Protects global and module specific TLS state. */ -+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock)); -+ -+ struct dl_exception ex; -+ int err = _dl_catch_exception (&ex, dl_open_worker_begin, args); -+ -+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock)); -+ -+ if (__glibc_unlikely (ex.errstring != NULL)) -+ /* Reraise the error. */ -+ _dl_signal_exception (err, &ex, NULL); -+ } -+ -+ if (!args->worker_continue) -+ return; -+ -+ int mode = args->mode; -+ struct link_map *new = args->map; -+ - /* Run the initializer functions of new objects. Temporarily - disable the exception handler, so that lazy binding failures are - fatal. */ -diff --git a/elf/dl-support.c b/elf/dl-support.c -index 02e2ed7..d99c1f1 100644 ---- a/elf/dl-support.c -+++ b/elf/dl-support.c -@@ -228,6 +228,13 @@ __rtld_lock_define_initialized_recursive (, _dl_load_lock) - list of loaded objects while an object is added to or removed from - that list. */ - __rtld_lock_define_initialized_recursive (, _dl_load_write_lock) -+ /* This lock protects global and module specific TLS related data. -+ E.g. it is held in dlopen and dlclose when GL(dl_tls_generation), -+ GL(dl_tls_max_dtv_idx) or GL(dl_tls_dtv_slotinfo_list) are -+ accessed and when TLS related relocations are processed for a -+ module. It was introduced to keep pthread_create accessing TLS -+ state that is being set up. */ -+__rtld_lock_define_initialized_recursive (, _dl_load_tls_lock) - - - #ifdef HAVE_AUX_VECTOR -diff --git a/elf/dl-tls.c b/elf/dl-tls.c -index d554ae4..9260d2d 100644 ---- a/elf/dl-tls.c -+++ b/elf/dl-tls.c -@@ -532,7 +532,7 @@ _dl_allocate_tls_init (void *result) - size_t maxgen = 0; - - /* Protects global dynamic TLS related state. */ -- __rtld_lock_lock_recursive (GL(dl_load_lock)); -+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock)); - - /* Check if the current dtv is big enough. */ - if (dtv[-1].counter < GL(dl_tls_max_dtv_idx)) -@@ -606,7 +606,7 @@ _dl_allocate_tls_init (void *result) - listp = listp->next; - assert (listp != NULL); - } -- __rtld_lock_unlock_recursive (GL(dl_load_lock)); -+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock)); - - /* The DTV version is up-to-date now. */ - dtv[0].counter = maxgen; -@@ -745,7 +745,7 @@ _dl_update_slotinfo (unsigned long int req_modid) - - Here the dtv needs to be updated to new_gen generation count. - -- This code may be called during TLS access when GL(dl_load_lock) -+ This code may be called during TLS access when GL(dl_load_tls_lock) - is not held. In that case the user code has to synchronize with - dlopen and dlclose calls of relevant modules. A module m is - relevant if the generation of m <= new_gen and dlclose of m is -@@ -867,11 +867,11 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map) - if (__glibc_unlikely (the_map->l_tls_offset - != FORCED_DYNAMIC_TLS_OFFSET)) - { -- __rtld_lock_lock_recursive (GL(dl_load_lock)); -+ __rtld_lock_lock_recursive (GL(dl_load_tls_lock)); - if (__glibc_likely (the_map->l_tls_offset == NO_TLS_OFFSET)) - { - the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET; -- __rtld_lock_unlock_recursive (GL(dl_load_lock)); -+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock)); - } - else if (__glibc_likely (the_map->l_tls_offset - != FORCED_DYNAMIC_TLS_OFFSET)) -@@ -883,7 +883,7 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map) - #else - # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" - #endif -- __rtld_lock_unlock_recursive (GL(dl_load_lock)); -+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock)); - - dtv[GET_ADDR_MODULE].pointer.to_free = NULL; - dtv[GET_ADDR_MODULE].pointer.val = p; -@@ -891,7 +891,7 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map) - return (char *) p + GET_ADDR_OFFSET; - } - else -- __rtld_lock_unlock_recursive (GL(dl_load_lock)); -+ __rtld_lock_unlock_recursive (GL(dl_load_tls_lock)); - } - struct dtv_pointer result = allocate_and_init (the_map); - dtv[GET_ADDR_MODULE].pointer = result; -@@ -962,7 +962,7 @@ _dl_tls_get_addr_soft (struct link_map *l) - return NULL; - - dtv_t *dtv = THREAD_DTV (); -- /* This may be called without holding the GL(dl_load_lock). Reading -+ /* This may be called without holding the GL(dl_load_tls_lock). Reading - arbitrary gen value is fine since this is best effort code. */ - size_t gen = atomic_load_relaxed (&GL(dl_tls_generation)); - if (__glibc_unlikely (dtv[0].counter != gen)) -diff --git a/elf/rtld.c b/elf/rtld.c -index 8d2bba3..9642eb9 100644 ---- a/elf/rtld.c -+++ b/elf/rtld.c -@@ -322,6 +322,7 @@ struct rtld_global _rtld_global = - #ifdef _LIBC_REENTRANT - ._dl_load_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER, - ._dl_load_write_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER, -+ ._dl_load_tls_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER, - #endif - ._dl_nns = 1, - ._dl_ns = -diff --git a/posix/fork.c b/posix/fork.c -index c471f7b..021691b 100644 ---- a/posix/fork.c -+++ b/posix/fork.c -@@ -99,6 +99,9 @@ __libc_fork (void) - /* Reset the lock the dynamic loader uses to protect its data. */ - __rtld_lock_initialize (GL(dl_load_lock)); - -+ /* Reset the lock protecting dynamic TLS related data. */ -+ __rtld_lock_initialize (GL(dl_load_tls_lock)); -+ - reclaim_stacks (); - - /* Run the handlers registered for the child. */ -diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h -index d49529d..9ec1511 100644 ---- a/sysdeps/generic/ldsodefs.h -+++ b/sysdeps/generic/ldsodefs.h -@@ -369,6 +369,13 @@ struct rtld_global - list of loaded objects while an object is added to or removed - from that list. */ - __rtld_lock_define_recursive (EXTERN, _dl_load_write_lock) -+ /* This lock protects global and module specific TLS related data. -+ E.g. it is held in dlopen and dlclose when GL(dl_tls_generation), -+ GL(dl_tls_max_dtv_idx) or GL(dl_tls_dtv_slotinfo_list) are -+ accessed and when TLS related relocations are processed for a -+ module. It was introduced to keep pthread_create accessing TLS -+ state that is being set up. */ -+ __rtld_lock_define_recursive (EXTERN, _dl_load_tls_lock) - - /* Incremented whenever something may have been added to dl_loaded. */ - EXTERN unsigned long long _dl_load_adds; -@@ -1268,7 +1275,7 @@ extern int _dl_scope_free (void *) attribute_hidden; - - /* Add module to slot information data. If DO_ADD is false, only the - required memory is allocated. Must be called with GL -- (dl_load_lock) acquired. If the function has already been called -+ (dl_load_tls_lock) acquired. If the function has already been called - for the link map L with !do_add, then this function will not raise - an exception, otherwise it is possible that it encounters a memory - allocation failure. */ -diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile -index 0af9c59..df8943f 100644 ---- a/sysdeps/pthread/Makefile -+++ b/sysdeps/pthread/Makefile -@@ -152,15 +152,17 @@ tests += tst-cancelx2 tst-cancelx3 tst-cancelx6 tst-cancelx8 tst-cancelx9 \ - tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3 - - ifeq ($(build-shared),yes) --tests += tst-atfork2 tst-pt-tls4 tst-_res1 tst-fini1 -+tests += tst-atfork2 tst-pt-tls4 tst-_res1 tst-fini1 tst-create1 - tests-nolibpthread += tst-fini1 - endif - - modules-names += tst-atfork2mod tst-tls4moda tst-tls4modb \ -- tst-_res1mod1 tst-_res1mod2 tst-fini1mod -+ tst-_res1mod1 tst-_res1mod2 tst-fini1mod \ -+ tst-create1mod - test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names))) - - tst-atfork2mod.so-no-z-defs = yes -+tst-create1mod.so-no-z-defs = yes - - ifeq ($(build-shared),yes) - # Build all the modules even when not actually running test programs. -@@ -279,4 +281,8 @@ LDFLAGS-tst-join7mod.so = -Wl,-soname,tst-join7mod.so - - CFLAGS-tst-unwind-thread.c += -funwind-tables - -+LDFLAGS-tst-create1 = -Wl,-export-dynamic -+$(objpfx)tst-create1: $(shared-thread-library) -+$(objpfx)tst-create1.out: $(objpfx)tst-create1mod.so -+ - endif -diff --git a/sysdeps/pthread/tst-create1.c b/sysdeps/pthread/tst-create1.c -new file mode 100644 -index 0000000..932586c ---- /dev/null -+++ b/sysdeps/pthread/tst-create1.c -@@ -0,0 +1,119 @@ -+/* Verify that pthread_create does not deadlock when ctors take locks. -+ Copyright (C) 2021 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 -+ -+/* -+Check if ctor and pthread_create deadlocks in -+ -+thread 1: dlopen -> ctor -> lock(user_lock) -+thread 2: lock(user_lock) -> pthread_create -+ -+or in -+ -+thread 1: dlclose -> dtor -> lock(user_lock) -+thread 2: lock(user_lock) -> pthread_create -+*/ -+ -+static pthread_barrier_t bar_ctor; -+static pthread_barrier_t bar_dtor; -+static pthread_mutex_t user_lock = PTHREAD_MUTEX_INITIALIZER; -+ -+void -+ctor (void) -+{ -+ xpthread_barrier_wait (&bar_ctor); -+ dprintf (1, "thread 1: in ctor: started.\n"); -+ xpthread_mutex_lock (&user_lock); -+ dprintf (1, "thread 1: in ctor: locked user_lock.\n"); -+ xpthread_mutex_unlock (&user_lock); -+ dprintf (1, "thread 1: in ctor: unlocked user_lock.\n"); -+ dprintf (1, "thread 1: in ctor: done.\n"); -+} -+ -+void -+dtor (void) -+{ -+ xpthread_barrier_wait (&bar_dtor); -+ dprintf (1, "thread 1: in dtor: started.\n"); -+ xpthread_mutex_lock (&user_lock); -+ dprintf (1, "thread 1: in dtor: locked user_lock.\n"); -+ xpthread_mutex_unlock (&user_lock); -+ dprintf (1, "thread 1: in dtor: unlocked user_lock.\n"); -+ dprintf (1, "thread 1: in dtor: done.\n"); -+} -+ -+static void * -+thread3 (void *a) -+{ -+ dprintf (1, "thread 3: started.\n"); -+ dprintf (1, "thread 3: done.\n"); -+ return 0; -+} -+ -+static void * -+thread2 (void *a) -+{ -+ pthread_t t3; -+ dprintf (1, "thread 2: started.\n"); -+ -+ xpthread_mutex_lock (&user_lock); -+ dprintf (1, "thread 2: locked user_lock.\n"); -+ xpthread_barrier_wait (&bar_ctor); -+ t3 = xpthread_create (0, thread3, 0); -+ xpthread_mutex_unlock (&user_lock); -+ dprintf (1, "thread 2: unlocked user_lock.\n"); -+ xpthread_join (t3); -+ -+ xpthread_mutex_lock (&user_lock); -+ dprintf (1, "thread 2: locked user_lock.\n"); -+ xpthread_barrier_wait (&bar_dtor); -+ t3 = xpthread_create (0, thread3, 0); -+ xpthread_mutex_unlock (&user_lock); -+ dprintf (1, "thread 2: unlocked user_lock.\n"); -+ xpthread_join (t3); -+ -+ dprintf (1, "thread 2: done.\n"); -+ return 0; -+} -+ -+static void -+thread1 (void) -+{ -+ dprintf (1, "thread 1: started.\n"); -+ xpthread_barrier_init (&bar_ctor, NULL, 2); -+ xpthread_barrier_init (&bar_dtor, NULL, 2); -+ pthread_t t2 = xpthread_create (0, thread2, 0); -+ void *p = xdlopen ("tst-create1mod.so", RTLD_NOW | RTLD_GLOBAL); -+ dprintf (1, "thread 1: dlopen done.\n"); -+ xdlclose (p); -+ dprintf (1, "thread 1: dlclose done.\n"); -+ xpthread_join (t2); -+ dprintf (1, "thread 1: done.\n"); -+} -+ -+static int -+do_test (void) -+{ -+ thread1 (); -+ return 0; -+} -+ -+#include -diff --git a/sysdeps/pthread/tst-create1mod.c b/sysdeps/pthread/tst-create1mod.c -new file mode 100644 -index 0000000..62c9006 ---- /dev/null -+++ b/sysdeps/pthread/tst-create1mod.c -@@ -0,0 +1,41 @@ -+/* Verify that pthread_create does not deadlock when ctors take locks. -+ Copyright (C) 2021 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 -+ -+/* Require TLS setup for the module. */ -+__thread int tlsvar; -+ -+void ctor (void); -+void dtor (void); -+ -+static void __attribute__ ((constructor)) -+do_init (void) -+{ -+ dprintf (1, "constructor started: %d.\n", tlsvar++); -+ ctor (); -+ dprintf (1, "constructor done: %d.\n", tlsvar++); -+} -+ -+static void __attribute__ ((destructor)) -+do_end (void) -+{ -+ dprintf (1, "destructor started: %d.\n", tlsvar++); -+ dtor (); -+ dprintf (1, "destructor done: %d.\n", tlsvar++); -+} --- -1.8.3.1 - diff --git a/elf-Drop-elf-tls-macros.h-in-favor-of-__thread-and-t.patch b/elf-Drop-elf-tls-macros.h-in-favor-of-__thread-and-t.patch deleted file mode 100644 index 1cd2fc280e6a7daac32beacfe9a102737dffb986..0000000000000000000000000000000000000000 --- a/elf-Drop-elf-tls-macros.h-in-favor-of-__thread-and-t.patch +++ /dev/null @@ -1,543 +0,0 @@ -From 33c50ef42878b07ee6ead8b3f1a81d8c2c74697c Mon Sep 17 00:00:00 2001 -From: Fangrui Song -Date: Mon, 16 Aug 2021 09:59:30 -0700 -Subject: [PATCH] elf: Drop elf/tls-macros.h in favor of __thread and tls_model - attributes [BZ #28152] [BZ #28205] - -elf/tls-macros.h was added for TLS testing when GCC did not support -__thread. __thread and tls_model attributes are mature now and have been -used by many newer tests. - -Also delete tst-tls2.c which tests .tls_common (unused by modern GCC and -unsupported by Clang/LLD). .tls_common and .tbss definition are almost -identical after linking, so the runtime test doesn't add additional -coverage. Assembler and linker tests should be on the binutils side. - -When LLD 13.0.0 is allowed in configure.ac -(https://sourceware.org/pipermail/libc-alpha/2021-August/129866.html), -`make check` result is on par with glibc built with GNU ld on aarch64 -and x86_64. - -As a future clean-up, TLS_GD/TLS_LD/TLS_IE/TLS_IE macros can be removed from -sysdeps/*/tls-macros.h. We can add optional -mtls-dialect={gnu2,trad} -tests to ensure coverage. - -Tested on aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. - -Reviewed-by: Szabolcs Nagy ---- - elf/Makefile | 4 +- - elf/tls-macros.h | 25 ----------- - elf/tst-tls1.c | 64 +++++++++++----------------- - elf/tst-tls2.c | 82 ------------------------------------ - elf/tst-tls3.c | 26 +++++------- - elf/tst-tlsmod1.c | 24 +++++------ - elf/tst-tlsmod2.c | 6 +-- - elf/tst-tlsmod3.c | 8 ++-- - elf/tst-tlsmod4.c | 6 +-- - elf/tst-tlsmod5.c | 4 +- - elf/tst-tlsmod6.c | 4 +- - sysdeps/powerpc/mod-tlsopt-powerpc.c | 6 +-- - sysdeps/powerpc/tst-tlsifunc.c | 4 +- - 13 files changed, 64 insertions(+), 199 deletions(-) - delete mode 100644 elf/tls-macros.h - delete mode 100644 elf/tst-tls2.c - -diff --git a/elf/Makefile b/elf/Makefile -index d05f410..725537c 100644 ---- a/elf/Makefile -+++ b/elf/Makefile -@@ -163,7 +163,7 @@ tests-static-normal := tst-array1-static tst-array5-static \ - tst-single_threaded-static tst-single_threaded-pthread-static \ - tst-dst-static tst-getauxval-static - --tests-static-internal := tst-tls1-static tst-tls2-static \ -+tests-static-internal := tst-tls1-static \ - tst-ptrguard1-static tst-stackguard1-static \ - tst-tls1-static-non-pie - -@@ -183,7 +183,7 @@ endif - tests := tst-tls9 tst-leaks1 \ - tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \ - tst-auxv tst-stringtable --tests-internal := tst-tls1 tst-tls2 $(tests-static-internal) -+tests-internal := tst-tls1 $(tests-static-internal) - tests-static := $(tests-static-normal) $(tests-static-internal) - - ifeq (yes,$(build-shared)) -diff --git a/elf/tls-macros.h b/elf/tls-macros.h -deleted file mode 100644 -index e25e33b..0000000 ---- a/elf/tls-macros.h -+++ /dev/null -@@ -1,25 +0,0 @@ --/* Macros to support TLS testing in times of missing compiler support. */ -- --#define COMMON_INT_DEF(x) \ -- asm (".tls_common " #x ",4,4") --/* XXX Until we get compiler support we don't need declarations. */ --#define COMMON_INT_DECL(x) -- --/* XXX This definition will probably be machine specific, too. */ --#define VAR_INT_DEF(x) \ -- asm (".section .tdata\n\t" \ -- ".globl " #x "\n" \ -- ".balign 4\n" \ -- #x ":\t.long 0\n\t" \ -- ".size " #x ",4\n\t" \ -- ".previous") --/* XXX Until we get compiler support we don't need declarations. */ --#define VAR_INT_DECL(x) -- --#include_next -- -- /* XXX Each architecture must have its own asm for now. */ --#if !defined TLS_LE || !defined TLS_IE \ -- || !defined TLS_LD || !defined TLS_GD --# error "No support for this architecture so far." --#endif -diff --git a/elf/tst-tls1.c b/elf/tst-tls1.c -index c31da56..b341221 100644 ---- a/elf/tst-tls1.c -+++ b/elf/tst-tls1.c -@@ -1,13 +1,14 @@ - /* glibc test for TLS in ld.so. */ - #include - --#include "tls-macros.h" -- -- --/* Two common 'int' variables in TLS. */ --COMMON_INT_DEF(foo); --COMMON_INT_DEF(bar); - -+__thread int foo, bar __attribute__ ((tls_model("local-exec"))); -+extern __thread int foo_gd asm ("foo") __attribute__ ((tls_model("global-dynamic"))); -+extern __thread int foo_ld asm ("foo") __attribute__ ((tls_model("local-dynamic"))); -+extern __thread int foo_ie asm ("foo") __attribute__ ((tls_model("initial-exec"))); -+extern __thread int bar_gd asm ("bar") __attribute__ ((tls_model("global-dynamic"))); -+extern __thread int bar_ld asm ("bar") __attribute__ ((tls_model("local-dynamic"))); -+extern __thread int bar_ie asm ("bar") __attribute__ ((tls_model("initial-exec"))); - - static int - do_test (void) -@@ -18,63 +19,48 @@ do_test (void) - - /* Set the variable using the local exec model. */ - puts ("set bar to 1 (LE)"); -- ap = TLS_LE (bar); -- *ap = 1; -+ bar = 1; - - - /* Get variables using initial exec model. */ - fputs ("get sum of foo and bar (IE)", stdout); -- ap = TLS_IE (foo); -- bp = TLS_IE (bar); -+ ap = &foo_ie; -+ bp = &bar_ie; - printf (" = %d\n", *ap + *bp); - result |= *ap + *bp != 1; -- if (*ap != 0) -- { -- printf ("foo = %d\n", *ap); -- result = 1; -- } -- if (*bp != 1) -+ if (*ap != 0 || *bp != 1) - { -- printf ("bar = %d\n", *bp); -+ printf ("foo = %d\nbar = %d\n", *ap, *bp); - result = 1; - } - - -- /* Get variables using local dynamic model. */ -- fputs ("get sum of foo and bar (LD)", stdout); -- ap = TLS_LD (foo); -- bp = TLS_LD (bar); -+ /* Get variables using local dynamic model or TLSDESC. */ -+ fputs ("get sum of foo and bar (LD or TLSDESC)", stdout); -+ ap = &foo_ld; -+ bp = &bar_ld; - printf (" = %d\n", *ap + *bp); - result |= *ap + *bp != 1; -- if (*ap != 0) -- { -- printf ("foo = %d\n", *ap); -- result = 1; -- } -- if (*bp != 1) -+ if (*ap != 0 || *bp != 1) - { -- printf ("bar = %d\n", *bp); -+ printf ("foo = %d\nbar = %d\n", *ap, *bp); - result = 1; - } - - -- /* Get variables using generic dynamic model. */ -- fputs ("get sum of foo and bar (GD)", stdout); -- ap = TLS_GD (foo); -- bp = TLS_GD (bar); -+ /* Get variables using general dynamic model or TLSDESC. */ -+ fputs ("get sum of foo and bar (GD or TLSDESC)", stdout); -+ ap = &foo_gd; -+ bp = &bar_gd; - printf (" = %d\n", *ap + *bp); - result |= *ap + *bp != 1; -- if (*ap != 0) -- { -- printf ("foo = %d\n", *ap); -- result = 1; -- } -- if (*bp != 1) -+ if (*ap != 0 || *bp != 1) - { -- printf ("bar = %d\n", *bp); -+ printf ("foo = %d\nbar = %d\n", *ap, *bp); - result = 1; - } - -+ - return result; - } - -diff --git a/elf/tst-tls2.c b/elf/tst-tls2.c -deleted file mode 100644 -index 963b8d6..0000000 ---- a/elf/tst-tls2.c -+++ /dev/null -@@ -1,82 +0,0 @@ --/* glibc test for TLS in ld.so. */ --#include -- --#include "tls-macros.h" -- -- --/* Two 'int' variables in TLS. */ --VAR_INT_DEF(foo); --VAR_INT_DEF(bar); -- -- --static int --do_test (void) --{ -- int result = 0; -- int *ap, *bp; -- -- -- /* Set the variable using the local exec model. */ -- puts ("set bar to 1 (LE)"); -- ap = TLS_LE (bar); -- *ap = 1; -- -- -- /* Get variables using initial exec model. */ -- fputs ("get sum of foo and bar (IE)", stdout); -- ap = TLS_IE (foo); -- bp = TLS_IE (bar); -- printf (" = %d\n", *ap + *bp); -- result |= *ap + *bp != 1; -- if (*ap != 0) -- { -- printf ("foo = %d\n", *ap); -- result = 1; -- } -- if (*bp != 1) -- { -- printf ("bar = %d\n", *bp); -- result = 1; -- } -- -- -- /* Get variables using local dynamic model. */ -- fputs ("get sum of foo and bar (LD)", stdout); -- ap = TLS_LD (foo); -- bp = TLS_LD (bar); -- printf (" = %d\n", *ap + *bp); -- result |= *ap + *bp != 1; -- if (*ap != 0) -- { -- printf ("foo = %d\n", *ap); -- result = 1; -- } -- if (*bp != 1) -- { -- printf ("bar = %d\n", *bp); -- result = 1; -- } -- -- -- /* Get variables using generic dynamic model. */ -- fputs ("get sum of foo and bar (GD)", stdout); -- ap = TLS_GD (foo); -- bp = TLS_GD (bar); -- printf (" = %d\n", *ap + *bp); -- result |= *ap + *bp != 1; -- if (*ap != 0) -- { -- printf ("foo = %d\n", *ap); -- result = 1; -- } -- if (*bp != 1) -- { -- printf ("bar = %d\n", *bp); -- result = 1; -- } -- -- return result; --} -- -- --#include -diff --git a/elf/tst-tls3.c b/elf/tst-tls3.c -index 7e0abb4..222b179 100644 ---- a/elf/tst-tls3.c -+++ b/elf/tst-tls3.c -@@ -1,13 +1,12 @@ - /* glibc test for TLS in ld.so. */ - #include - --#include "tls-macros.h" - -- --/* One define int variable, two externs. */ --COMMON_INT_DECL(foo); --VAR_INT_DECL(bar); --VAR_INT_DEF(baz); -+__thread int foo, bar __attribute__ ((tls_model("initial-exec"))); -+__thread int baz __attribute__ ((tls_model("local-exec"))); -+extern __thread int foo_gd __attribute__ ((alias("foo"), tls_model("global-dynamic"))); -+extern __thread int bar_gd __attribute__ ((alias("bar"), tls_model("global-dynamic"))); -+extern __thread int baz_ld __attribute__ ((alias("baz"), tls_model("local-dynamic"))); - - - extern int in_dso (void); -@@ -22,23 +21,20 @@ do_test (void) - - /* Set the variable using the local exec model. */ - puts ("set baz to 3 (LE)"); -- ap = TLS_LE (baz); -- *ap = 3; -+ baz = 3; - - - /* Get variables using initial exec model. */ - puts ("set variables foo and bar (IE)"); -- ap = TLS_IE (foo); -- *ap = 1; -- bp = TLS_IE (bar); -- *bp = 2; -+ foo = 1; -+ bar = 2; - - - /* Get variables using local dynamic model. */ - fputs ("get sum of foo, bar (GD) and baz (LD)", stdout); -- ap = TLS_GD (foo); -- bp = TLS_GD (bar); -- cp = TLS_LD (baz); -+ ap = &foo_gd; -+ bp = &bar_gd; -+ cp = &baz_ld; - printf (" = %d\n", *ap + *bp + *cp); - result |= *ap + *bp + *cp != 6; - if (*ap != 1) -diff --git a/elf/tst-tlsmod1.c b/elf/tst-tlsmod1.c -index 8d91567..a448c4d 100644 ---- a/elf/tst-tlsmod1.c -+++ b/elf/tst-tlsmod1.c -@@ -1,12 +1,12 @@ - #include - --#include "tls-macros.h" - -+__thread int foo, bar __attribute__ ((tls_model("global-dynamic"))); -+extern __thread int baz __attribute__ ((tls_model("global-dynamic"))); -+extern __thread int foo_ie asm ("foo") __attribute__ ((tls_model("initial-exec"))); -+extern __thread int bar_ie asm ("bar") __attribute__ ((tls_model("initial-exec"))); -+extern __thread int baz_ie asm ("baz") __attribute__ ((tls_model("initial-exec"))); - --/* One define int variable, two externs. */ --COMMON_INT_DEF(foo); --VAR_INT_DEF(bar); --VAR_INT_DECL(baz); - - extern int in_dso (void); - -@@ -19,8 +19,8 @@ in_dso (void) - /* Get variables using initial exec model. */ - fputs ("get sum of foo and bar (IE)", stdout); - asm ("" ::: "memory"); -- ap = TLS_IE (foo); -- bp = TLS_IE (bar); -+ ap = &foo_ie; -+ bp = &bar_ie; - printf (" = %d\n", *ap + *bp); - result |= *ap + *bp != 3; - if (*ap != 1) -@@ -35,11 +35,11 @@ in_dso (void) - } - - -- /* Get variables using generic dynamic model. */ -- fputs ("get sum of foo and bar and baz (GD)", stdout); -- ap = TLS_GD (foo); -- bp = TLS_GD (bar); -- cp = TLS_GD (baz); -+ /* Get variables using generic dynamic model or TLSDESC. */ -+ fputs ("get sum of foo and bar and baz (GD or TLSDESC)", stdout); -+ ap = &foo; -+ bp = &bar; -+ cp = &baz; - printf (" = %d\n", *ap + *bp + *cp); - result |= *ap + *bp + *cp != 6; - if (*ap != 1) -diff --git a/elf/tst-tlsmod2.c b/elf/tst-tlsmod2.c -index 40eb140..3223fe4 100644 ---- a/elf/tst-tlsmod2.c -+++ b/elf/tst-tlsmod2.c -@@ -1,9 +1,7 @@ - #include - --#include "tls-macros.h" - -- --COMMON_INT_DEF(foo); -+__thread int foo; - - - int -@@ -15,7 +13,7 @@ in_dso (int n, int *caller_foop) - puts ("foo"); /* Make sure PLT is used before macros. */ - asm ("" ::: "memory"); - -- foop = TLS_GD (foo); -+ foop = &foo; - - if (caller_foop != NULL && foop != caller_foop) - { -diff --git a/elf/tst-tlsmod3.c b/elf/tst-tlsmod3.c -index 6d186c4..d6e7498 100644 ---- a/elf/tst-tlsmod3.c -+++ b/elf/tst-tlsmod3.c -@@ -1,10 +1,10 @@ - #include - --#include "tls-macros.h" - - extern int in_dso (int n, int *caller_foop); - --COMMON_INT_DEF(comm_n); -+extern __thread int foo; -+__thread int comm_n; - - - -@@ -20,8 +20,8 @@ in_dso2 (void) - puts ("foo"); /* Make sure PLT is used before macros. */ - asm ("" ::: "memory"); - -- foop = TLS_GD (foo); -- np = TLS_GD (comm_n); -+ foop = &foo; -+ np = &comm_n; - - if (n != *np) - { -diff --git a/elf/tst-tlsmod4.c b/elf/tst-tlsmod4.c -index 86889aa..f38919a 100644 ---- a/elf/tst-tlsmod4.c -+++ b/elf/tst-tlsmod4.c -@@ -1,9 +1,7 @@ - #include - --#include "tls-macros.h" - -- --COMMON_INT_DEF(baz); -+__thread int baz; - - - int -@@ -15,7 +13,7 @@ in_dso (int n, int *caller_bazp) - puts ("foo"); /* Make sure PLT is used before macros. */ - asm ("" ::: "memory"); - -- bazp = TLS_GD (baz); -+ bazp = &baz; - - if (caller_bazp != NULL && bazp != caller_bazp) - { -diff --git a/elf/tst-tlsmod5.c b/elf/tst-tlsmod5.c -index a97c7e5..3f39c5b 100644 ---- a/elf/tst-tlsmod5.c -+++ b/elf/tst-tlsmod5.c -@@ -1,3 +1 @@ --#include "tls-macros.h" -- --COMMON_INT_DEF(foo); -+__thread int foo; -diff --git a/elf/tst-tlsmod6.c b/elf/tst-tlsmod6.c -index e968596..7b3571f 100644 ---- a/elf/tst-tlsmod6.c -+++ b/elf/tst-tlsmod6.c -@@ -1,3 +1 @@ --#include "tls-macros.h" -- --COMMON_INT_DEF(bar); -+__thread int bar; -diff --git a/sysdeps/powerpc/mod-tlsopt-powerpc.c b/sysdeps/powerpc/mod-tlsopt-powerpc.c -index ee0db12..2a82e53 100644 ---- a/sysdeps/powerpc/mod-tlsopt-powerpc.c -+++ b/sysdeps/powerpc/mod-tlsopt-powerpc.c -@@ -1,11 +1,9 @@ - /* shared library to test for __tls_get_addr optimization. */ - #include - --#include "../../elf/tls-macros.h" - #include "dl-tls.h" - --/* common 'int' variable in TLS. */ --COMMON_INT_DEF(foo); -+__thread int foo __attribute__ ((tls_model("global-dynamic"))); - - - int -@@ -14,7 +12,7 @@ tls_get_addr_opt_test (void) - int result = 0; - - /* Get variable using general dynamic model. */ -- int *ap = TLS_GD (foo); -+ int *ap = &foo; - if (*ap != 0) - { - printf ("foo = %d\n", *ap); -diff --git a/sysdeps/powerpc/tst-tlsifunc.c b/sysdeps/powerpc/tst-tlsifunc.c -index 3095d41..c8c0bad 100644 ---- a/sysdeps/powerpc/tst-tlsifunc.c -+++ b/sysdeps/powerpc/tst-tlsifunc.c -@@ -21,9 +21,9 @@ - #include - #include - #include --#include - - __thread int bar; -+extern __thread int bar_gd asm ("bar") __attribute__ ((tls_model("global-dynamic"))); - static int *bar_ptr = NULL; - - static uint32_t resolver_platform = 0; -@@ -57,7 +57,7 @@ get_platform (void) - void - init_foo (void) - { -- bar_ptr = TLS_GD (bar); -+ bar_ptr = &bar_gd; - } - - int --- -1.8.3.1 - diff --git a/elf-Fix-missing-colon-in-LD_SHOW_AUXV-output-BZ-2825.patch b/elf-Fix-missing-colon-in-LD_SHOW_AUXV-output-BZ-2825.patch deleted file mode 100644 index ffd1cb1903f567190104c39dfda48188958932cb..0000000000000000000000000000000000000000 --- a/elf-Fix-missing-colon-in-LD_SHOW_AUXV-output-BZ-2825.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 82fbcd7118d760492e2ecc9fa291e358b9ba0361 Mon Sep 17 00:00:00 2001 -From: Arjun Shankar -Date: Fri, 20 Aug 2021 16:24:05 +0200 -Subject: [PATCH] elf: Fix missing colon in LD_SHOW_AUXV output [BZ #28253] - -This commit adds a missing colon in the AT_MINSIGSTKSZ entry in -the _dl_show_auxv function. ---- - elf/dl-sysdep.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c -index d47bef1..2c684c2 100644 ---- a/elf/dl-sysdep.c -+++ b/elf/dl-sysdep.c -@@ -317,7 +317,7 @@ _dl_show_auxv (void) - [AT_SYSINFO_EHDR - 2] = { "SYSINFO_EHDR: 0x", hex }, - [AT_RANDOM - 2] = { "RANDOM: 0x", hex }, - [AT_HWCAP2 - 2] = { "HWCAP2: 0x", hex }, -- [AT_MINSIGSTKSZ - 2] = { "MINSIGSTKSZ ", dec }, -+ [AT_MINSIGSTKSZ - 2] = { "MINSIGSTKSZ: ", dec }, - [AT_L1I_CACHESIZE - 2] = { "L1I_CACHESIZE: ", dec }, - [AT_L1I_CACHEGEOMETRY - 2] = { "L1I_CACHEGEOMETRY: 0x", hex }, - [AT_L1D_CACHESIZE - 2] = { "L1D_CACHESIZE: ", dec }, --- -1.8.3.1 - diff --git a/elf-Unconditionally-use-__ehdr_start.patch b/elf-Unconditionally-use-__ehdr_start.patch deleted file mode 100644 index b30438db5358b87abf931dd3cdb9e939bd65808b..0000000000000000000000000000000000000000 --- a/elf-Unconditionally-use-__ehdr_start.patch +++ /dev/null @@ -1,177 +0,0 @@ -From 302247c89121e8d4c7629e589edbb4974fff6edb Mon Sep 17 00:00:00 2001 -From: Fangrui Song -Date: Tue, 10 Aug 2021 11:04:56 -0700 -Subject: [PATCH] elf: Unconditionally use __ehdr_start - -We can consider __ehdr_start (from binutils 2.23 onwards) -unconditionally supported, since configure.ac requires binutils>=2.25. - -The configure.ac check is related to an ia64 bug fixed by binutils 2.24. -See https://sourceware.org/pipermail/libc-alpha/2014-August/053503.html - -Tested on x86_64-linux-gnu. Tested build-many-glibcs.py with -aarch64-linux-gnu and s390x-linux-gnu. - -Reviewed-by: Szabolcs Nagy ---- - config.h.in | 3 --- - configure | 52 ---------------------------------------------------- - configure.ac | 34 ---------------------------------- - elf/rtld.c | 13 ++++--------- - 4 files changed, 4 insertions(+), 98 deletions(-) - -diff --git a/config.h.in b/config.h.in -index 8b45a3a..0d92504 100644 ---- a/config.h.in -+++ b/config.h.in -@@ -198,9 +198,6 @@ - /* Define if CC supports attribute retain. */ - #undef HAVE_GNU_RETAIN - --/* Define if the linker defines __ehdr_start. */ --#undef HAVE_EHDR_START -- - /* Define to 1 if the assembler needs intermediate aliases to define - multiple symbol versions for one symbol. */ - #define SYMVER_NEEDS_ALIAS 0 -diff --git a/configure b/configure -index 9619c10..7272fbf 100755 ---- a/configure -+++ b/configure -@@ -6636,58 +6636,6 @@ if test $libc_cv_predef_fortify_source = yes; then - fi - - --# Some linkers on some architectures support __ehdr_start but with --# bugs. Make sure usage of it does not create relocations in the --# output (as the linker should resolve them all for us). --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker provides working __ehdr_start" >&5 --$as_echo_n "checking whether the linker provides working __ehdr_start... " >&6; } --if ${libc_cv_ehdr_start+:} false; then : -- $as_echo_n "(cached) " >&6 --else -- --old_CFLAGS="$CFLAGS" --old_LDFLAGS="$LDFLAGS" --old_LIBS="$LIBS" --CFLAGS="$CFLAGS -fPIC" --LDFLAGS="$LDFLAGS -nostdlib -nostartfiles -shared $no_ssp" --LIBS= --cat confdefs.h - <<_ACEOF >conftest.$ac_ext --/* end confdefs.h. */ -- --typedef struct { -- char foo; -- long val; --} Ehdr; --extern const Ehdr __ehdr_start __attribute__ ((visibility ("hidden"))); --long ehdr (void) { return __ehdr_start.val; } -- --_ACEOF --if ac_fn_c_try_link "$LINENO"; then : -- if $READELF -r conftest | grep -F __ehdr_start >/dev/null; then -- libc_cv_ehdr_start=broken -- else -- libc_cv_ehdr_start=yes -- fi --else -- libc_cv_ehdr_start=no --fi --rm -f core conftest.err conftest.$ac_objext \ -- conftest$ac_exeext conftest.$ac_ext --CFLAGS="$old_CFLAGS" --LDFLAGS="$old_LDFLAGS" --LIBS="$old_LIBS" -- --fi --{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ehdr_start" >&5 --$as_echo "$libc_cv_ehdr_start" >&6; } --if test "$libc_cv_ehdr_start" = yes; then -- $as_echo "#define HAVE_EHDR_START 1" >>confdefs.h -- --elif test "$libc_cv_ehdr_start" = broken; then -- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: linker is broken -- you should upgrade" >&5 --$as_echo "$as_me: WARNING: linker is broken -- you should upgrade" >&2;} --fi -- - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the assembler requires one version per symbol" >&5 - $as_echo_n "checking whether the assembler requires one version per symbol... " >&6; } - if ${libc_cv_symver_needs_alias+:} false; then : -diff --git a/configure.ac b/configure.ac -index 34ecbba..af47cd5 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1662,40 +1662,6 @@ if test $libc_cv_predef_fortify_source = yes; then - fi - AC_SUBST(CPPUNDEFS) - --# Some linkers on some architectures support __ehdr_start but with --# bugs. Make sure usage of it does not create relocations in the --# output (as the linker should resolve them all for us). --AC_CACHE_CHECK([whether the linker provides working __ehdr_start], -- libc_cv_ehdr_start, [ --old_CFLAGS="$CFLAGS" --old_LDFLAGS="$LDFLAGS" --old_LIBS="$LIBS" --CFLAGS="$CFLAGS -fPIC" --LDFLAGS="$LDFLAGS -nostdlib -nostartfiles -shared $no_ssp" --LIBS= --AC_LINK_IFELSE([AC_LANG_SOURCE([ --typedef struct { -- char foo; -- long val; --} Ehdr; --extern const Ehdr __ehdr_start __attribute__ ((visibility ("hidden"))); --long ehdr (void) { return __ehdr_start.val; } --])], -- [if $READELF -r conftest | grep -F __ehdr_start >/dev/null; then -- libc_cv_ehdr_start=broken -- else -- libc_cv_ehdr_start=yes -- fi], [libc_cv_ehdr_start=no]) --CFLAGS="$old_CFLAGS" --LDFLAGS="$old_LDFLAGS" --LIBS="$old_LIBS" --]) --if test "$libc_cv_ehdr_start" = yes; then -- AC_DEFINE([HAVE_EHDR_START]) --elif test "$libc_cv_ehdr_start" = broken; then -- AC_MSG_WARN([linker is broken -- you should upgrade]) --fi -- - dnl Starting with binutils 2.35, GAS can attach multiple symbol versions - dnl to one symbol (PR 23840). - AC_CACHE_CHECK(whether the assembler requires one version per symbol, -diff --git a/elf/rtld.c b/elf/rtld.c -index d733359..878e648 100644 ---- a/elf/rtld.c -+++ b/elf/rtld.c -@@ -1684,21 +1684,16 @@ dl_main (const ElfW(Phdr) *phdr, - if (GLRO(dl_use_load_bias) == (ElfW(Addr)) -2) - GLRO(dl_use_load_bias) = main_map->l_addr == 0 ? -1 : 0; - -- /* Set up the program header information for the dynamic linker -- itself. It is needed in the dl_iterate_phdr callbacks. */ -- const ElfW(Ehdr) *rtld_ehdr; -- - /* Starting from binutils-2.23, the linker will define the magic symbol - __ehdr_start to point to our own ELF header if it is visible in a - segment that also includes the phdrs. If that's not available, we use - the old method that assumes the beginning of the file is part of the - lowest-addressed PT_LOAD segment. */ --#ifdef HAVE_EHDR_START - extern const ElfW(Ehdr) __ehdr_start __attribute__ ((visibility ("hidden"))); -- rtld_ehdr = &__ehdr_start; --#else -- rtld_ehdr = (void *) GL(dl_rtld_map).l_map_start; --#endif -+ -+ /* Set up the program header information for the dynamic linker -+ itself. It is needed in the dl_iterate_phdr callbacks. */ -+ const ElfW(Ehdr) *rtld_ehdr = &__ehdr_start; - assert (rtld_ehdr->e_ehsize == sizeof *rtld_ehdr); - assert (rtld_ehdr->e_phentsize == sizeof (ElfW(Phdr))); - --- -1.8.3.1 - diff --git a/gaiconf_init-Avoid-double-free-in-label-and-preceden.patch b/gaiconf_init-Avoid-double-free-in-label-and-preceden.patch deleted file mode 100644 index 7ebc183cfe5c2c5e11ca8a8db56c61cab02ede10..0000000000000000000000000000000000000000 --- a/gaiconf_init-Avoid-double-free-in-label-and-preceden.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 77a34079d8f3d63b61543bf3af93043f8674e4c4 Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Tue, 3 Aug 2021 21:11:03 +0530 -Subject: [PATCH] gaiconf_init: Avoid double-free in label and precedence lists - -labellist and precedencelist could get freed a second time if there -are allocation failures, so set them to NULL to avoid a double-free. - -Reviewed-by: Arjun Shankar ---- - sysdeps/posix/getaddrinfo.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 838a68f..43dfc67 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -2008,6 +2008,7 @@ gaiconf_init (void) - l = l->next; - } - free_prefixlist (labellist); -+ labellist = NULL; - - /* Sort the entries so that the most specific ones are at - the beginning. */ -@@ -2046,6 +2047,7 @@ gaiconf_init (void) - l = l->next; - } - free_prefixlist (precedencelist); -+ precedencelist = NULL; - - /* Sort the entries so that the most specific ones are at - the beginning. */ --- -1.8.3.1 - diff --git a/gconv-Do-not-emit-spurious-NUL-character-in-ISO-2022.patch b/gconv-Do-not-emit-spurious-NUL-character-in-ISO-2022.patch deleted file mode 100644 index 2c546eac2c2f3d9f4660a5779ebe8cc634f4386b..0000000000000000000000000000000000000000 --- a/gconv-Do-not-emit-spurious-NUL-character-in-ISO-2022.patch +++ /dev/null @@ -1,185 +0,0 @@ -From ff012870b2c02a62598c04daa1e54632e020fd7d Mon Sep 17 00:00:00 2001 -From: Nikita Popov -Date: Tue, 2 Nov 2021 13:21:42 +0500 -Subject: [PATCH] gconv: Do not emit spurious NUL character in ISO-2022-JP-3 - (bug 28524) - -Bugfix 27256 has introduced another issue: -In conversion from ISO-2022-JP-3 encoding, it is possible -to force iconv to emit extra NUL character on internal state reset. -To do this, it is sufficient to feed iconv with escape sequence -which switches active character set. -The simplified check 'data->__statep->__count != ASCII_set' -introduced by the aforementioned bugfix picks that case and -behaves as if '\0' character has been queued thus emitting it. - -To eliminate this issue, these steps are taken: -* Restore original condition -'(data->__statep->__count & ~7) != ASCII_set'. -It is necessary since bits 0-2 may contain -number of buffered input characters. -* Check that queued character is not NUL. -Similar step is taken for main conversion loop. - -Bundled test case follows following logic: -* Try to convert ISO-2022-JP-3 escape sequence -switching active character set -* Reset internal state by providing NULL as input buffer -* Ensure that nothing has been converted. - -Signed-off-by: Nikita Popov ---- - iconvdata/Makefile | 5 +++- - iconvdata/bug-iconv15.c | 60 +++++++++++++++++++++++++++++++++++++++ - iconvdata/iso-2022-jp-3.c | 28 ++++++++++++------ - 3 files changed, 84 insertions(+), 9 deletions(-) - create mode 100644 iconvdata/bug-iconv15.c - -diff --git a/iconvdata/Makefile b/iconvdata/Makefile -index c216f959..d5507a04 100644 ---- a/iconvdata/Makefile -+++ b/iconvdata/Makefile -@@ -1,4 +1,5 @@ - # Copyright (C) 1997-2021 Free Software Foundation, Inc. -+# Copyright (C) The GNU Toolchain Authors. - # This file is part of the GNU C Library. - - # The GNU C Library is free software; you can redistribute it and/or -@@ -74,7 +75,7 @@ ifeq (yes,$(build-shared)) - tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \ - tst-iconv6 bug-iconv5 bug-iconv6 tst-iconv7 bug-iconv8 bug-iconv9 \ - bug-iconv10 bug-iconv11 bug-iconv12 tst-iconv-big5-hkscs-to-2ucs4 \ -- bug-iconv13 bug-iconv14 -+ bug-iconv13 bug-iconv14 bug-iconv15 - ifeq ($(have-thread-library),yes) - tests += bug-iconv3 - endif -@@ -327,6 +328,8 @@ $(objpfx)bug-iconv12.out: $(addprefix $(objpfx), $(gconv-modules)) \ - $(addprefix $(objpfx),$(modules.so)) - $(objpfx)bug-iconv14.out: $(addprefix $(objpfx), $(gconv-modules)) \ - $(addprefix $(objpfx),$(modules.so)) -+$(objpfx)bug-iconv15.out: $(addprefix $(objpfx), $(gconv-modules)) \ -+ $(addprefix $(objpfx),$(modules.so)) - - $(objpfx)iconv-test.out: run-iconv-test.sh \ - $(addprefix $(objpfx), $(gconv-modules)) \ -diff --git a/iconvdata/bug-iconv15.c b/iconvdata/bug-iconv15.c -new file mode 100644 -index 00000000..cc04bd03 ---- /dev/null -+++ b/iconvdata/bug-iconv15.c -@@ -0,0 +1,60 @@ -+/* Bug 28524: Conversion from ISO-2022-JP-3 with iconv -+ may emit spurious NUL character on state reset. -+ Copyright (C) The GNU Toolchain Authors. -+ 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 -+ -+static int -+do_test (void) -+{ -+ char in[] = "\x1b(I"; -+ char *inbuf = in; -+ size_t inleft = sizeof (in) - 1; -+ char out[1]; -+ char *outbuf = out; -+ size_t outleft = sizeof (out); -+ iconv_t cd; -+ -+ cd = iconv_open ("UTF8", "ISO-2022-JP-3"); -+ TEST_VERIFY_EXIT (cd != (iconv_t) -1); -+ -+ /* First call to iconv should alter internal state. -+ Now, JISX0201_Kana_set is selected and -+ state value != ASCII_set. */ -+ TEST_VERIFY (iconv (cd, &inbuf, &inleft, &outbuf, &outleft) != (size_t) -1); -+ -+ /* No bytes should have been added to -+ the output buffer at this point. */ -+ TEST_VERIFY (outbuf == out); -+ TEST_VERIFY (outleft == sizeof (out)); -+ -+ /* Second call shall emit spurious NUL character in unpatched glibc. */ -+ TEST_VERIFY (iconv (cd, NULL, NULL, &outbuf, &outleft) != (size_t) -1); -+ -+ /* No characters are expected to be produced. */ -+ TEST_VERIFY (outbuf == out); -+ TEST_VERIFY (outleft == sizeof (out)); -+ -+ TEST_VERIFY_EXIT (iconv_close (cd) != -1); -+ -+ return 0; -+} -+ -+#include -diff --git a/iconvdata/iso-2022-jp-3.c b/iconvdata/iso-2022-jp-3.c -index c8ba88cd..5fc0c0f7 100644 ---- a/iconvdata/iso-2022-jp-3.c -+++ b/iconvdata/iso-2022-jp-3.c -@@ -1,5 +1,6 @@ - /* Conversion module for ISO-2022-JP-3. - Copyright (C) 1998-2021 Free Software Foundation, Inc. -+ Copyright (C) The GNU Toolchain Authors. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 1998, - and Bruno Haible , 2002. -@@ -81,20 +82,31 @@ enum - the output state to the initial state. This has to be done during the - flushing. */ - #define EMIT_SHIFT_TO_INIT \ -- if (data->__statep->__count != ASCII_set) \ -+ if ((data->__statep->__count & ~7) != ASCII_set) \ - { \ - if (FROM_DIRECTION) \ - { \ -- if (__glibc_likely (outbuf + 4 <= outend)) \ -+ uint32_t ch = data->__statep->__count >> 6; \ -+ \ -+ if (__glibc_unlikely (ch != 0)) \ - { \ -- /* Write out the last character. */ \ -- *((uint32_t *) outbuf) = data->__statep->__count >> 6; \ -- outbuf += sizeof (uint32_t); \ -- data->__statep->__count = ASCII_set; \ -+ if (__glibc_likely (outbuf + 4 <= outend)) \ -+ { \ -+ /* Write out the last character. */ \ -+ put32u (outbuf, ch); \ -+ outbuf += 4; \ -+ data->__statep->__count &= 7; \ -+ data->__statep->__count |= ASCII_set; \ -+ } \ -+ else \ -+ /* We don't have enough room in the output buffer. */ \ -+ status = __GCONV_FULL_OUTPUT; \ - } \ - else \ -- /* We don't have enough room in the output buffer. */ \ -- status = __GCONV_FULL_OUTPUT; \ -+ { \ -+ data->__statep->__count &= 7; \ -+ data->__statep->__count |= ASCII_set; \ -+ } \ - } \ - else \ - { \ --- -2.23.0 - diff --git a/gconv_parseconfdir-Fix-memory-leak.patch b/gconv_parseconfdir-Fix-memory-leak.patch deleted file mode 100644 index de306cccbb58dc9dab731c59c05d4337266708fb..0000000000000000000000000000000000000000 --- a/gconv_parseconfdir-Fix-memory-leak.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 5f9b78fe35d08739b6da1e5b356786d41116c108 Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Tue, 3 Aug 2021 21:10:20 +0530 -Subject: [PATCH] gconv_parseconfdir: Fix memory leak - -The allocated `conf` would leak if we have to skip over the file due -to the underlying filesystem not supporting dt_type. - -Reviewed-by: Arjun Shankar ---- - iconv/gconv_parseconfdir.h | 9 ++++----- - 1 file changed, 4 insertions(+), 5 deletions(-) - -diff --git a/iconv/gconv_parseconfdir.h b/iconv/gconv_parseconfdir.h -index a4153e5..2f06268 100644 ---- a/iconv/gconv_parseconfdir.h -+++ b/iconv/gconv_parseconfdir.h -@@ -153,12 +153,11 @@ gconv_parseconfdir (const char *dir, size_t dir_len) - struct stat64 st; - if (asprintf (&conf, "%s/%s", buf, ent->d_name) < 0) - continue; -- if (ent->d_type == DT_UNKNOWN -- && (lstat64 (conf, &st) == -1 -- || !S_ISREG (st.st_mode))) -- continue; - -- found |= read_conf_file (conf, dir, dir_len); -+ if (ent->d_type != DT_UNKNOWN -+ || (lstat64 (conf, &st) != -1 && S_ISREG (st.st_mode))) -+ found |= read_conf_file (conf, dir, dir_len); -+ - free (conf); - } - } --- -1.8.3.1 - diff --git a/gethosts-Remove-unused-argument-_type.patch b/gethosts-Remove-unused-argument-_type.patch deleted file mode 100644 index 1fb60e7c2db97c282a8ae87745083d32c72eebc0..0000000000000000000000000000000000000000 --- a/gethosts-Remove-unused-argument-_type.patch +++ /dev/null @@ -1,44 +0,0 @@ -From b17e842a60819098d2a203ecc8b8371b7e1d6c65 Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Wed, 4 Aug 2021 02:21:01 +0530 -Subject: [PATCH] gethosts: Remove unused argument _type - -The generated code is unchanged. ---- - sysdeps/posix/getaddrinfo.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c -index 43dfc67..9f1cde2 100644 ---- a/sysdeps/posix/getaddrinfo.c -+++ b/sysdeps/posix/getaddrinfo.c -@@ -239,7 +239,7 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, - return true; - } - --#define gethosts(_family, _type) \ -+#define gethosts(_family) \ - { \ - struct hostent th; \ - char *localcanon = NULL; \ -@@ -829,7 +829,7 @@ gaih_inet (const char *name, const struct gaih_service *service, - if (req->ai_family == AF_INET6 - || req->ai_family == AF_UNSPEC) - { -- gethosts (AF_INET6, struct in6_addr); -+ gethosts (AF_INET6); - no_inet6_data = no_data; - inet6_status = status; - } -@@ -841,7 +841,7 @@ gaih_inet (const char *name, const struct gaih_service *service, - know we are not going to need them. */ - && ((req->ai_flags & AI_ALL) || !got_ipv6))) - { -- gethosts (AF_INET, struct in_addr); -+ gethosts (AF_INET); - - if (req->ai_family == AF_INET) - { --- -1.8.3.1 - diff --git a/glibc-2.34.tar.xz b/glibc-2.35.tar.xz similarity index 64% rename from glibc-2.34.tar.xz rename to glibc-2.35.tar.xz index d0ed575847b706916dd40a7451d46bdafc0d7efc..9e7dee93c248113d37d533ab7dc62acda7d82012 100644 Binary files a/glibc-2.34.tar.xz and b/glibc-2.35.tar.xz differ diff --git a/glibc-c-utf8-locale.patch b/glibc-c-utf8-locale.patch deleted file mode 100644 index a4cf357a24cf0d111cb6ab2a812d1b4da9eb7878..0000000000000000000000000000000000000000 --- a/glibc-c-utf8-locale.patch +++ /dev/null @@ -1,286 +0,0 @@ -Short description: Add C.UTF-8 support. -Author(s): Fedora glibc team -Origin: PATCH -Upstream status: not-submitted - -This patch needs to upstream as part of Carlos O'Donell -'s work on enabling upstream C.UTF-8 support. This -work is currently blocked on cleaning up the test results to prove that -full code-point sorting is working as intended. - -Note that this patch does not provide full code-point sorting as -expected. - -This patch needs to upstream as soon as possible since it would be nice -to have this in F29 and fixed. - -From 2eda7b462b415105f5a05c1323372d4e39d46439 Mon Sep 17 00:00:00 2001 -From: Mike FABIAN -Date: Mon, 10 Aug 2015 15:58:12 +0200 -Subject: [PATCH] Add a C.UTF-8 locale - ---- - localedata/SUPPORTED | 1 + - localedata/locales/C | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 239 insertions(+) - create mode 100644 localedata/locales/C - -diff --git a/localedata/SUPPORTED b/localedata/SUPPORTED -index 8ca023e..2a78391 100644 ---- a/localedata/SUPPORTED -+++ b/localedata/SUPPORTED -@@ -1,6 +1,7 @@ - # This file names the currently supported and somewhat tested locales. - # If you have any additions please file a glibc bug report. - SUPPORTED-LOCALES=\ -+C.UTF-8/UTF-8 \ - aa_DJ.UTF-8/UTF-8 \ - aa_DJ/ISO-8859-1 \ - aa_ER/UTF-8 \ -diff --git a/localedata/locales/C b/localedata/locales/C -new file mode 100644 -index 0000000..fdf460e ---- /dev/null -+++ b/localedata/locales/C -@@ -0,0 +1,238 @@ -+escape_char / -+comment_char % -+% Locale for C locale in UTF-8 -+ -+LC_IDENTIFICATION -+title "C locale" -+source "" -+address "" -+contact "" -+email "mfabian@redhat.com" -+tel "" -+fax "" -+language "C" -+territory "" -+revision "1.0" -+date "2015-08-10" -+% -+category "i18n:2012";LC_IDENTIFICATION -+category "i18n:2012";LC_CTYPE -+category "i18n:2012";LC_COLLATE -+category "i18n:2012";LC_TIME -+category "i18n:2012";LC_NUMERIC -+category "i18n:2012";LC_MONETARY -+category "i18n:2012";LC_MESSAGES -+category "i18n:2012";LC_PAPER -+category "i18n:2012";LC_NAME -+category "i18n:2012";LC_ADDRESS -+category "i18n:2012";LC_TELEPHONE -+category "i18n:2012";LC_MEASUREMENT -+END LC_IDENTIFICATION -+ -+LC_CTYPE -+copy "i18n" -+ -+translit_start -+include "translit_combining";"" -+translit_end -+ -+END LC_CTYPE -+ -+LC_COLLATE -+order_start forward -+ -+.. -+ -+ -+.. -+ -+ -+.. -+ -+ -+.. -+ -+ -+.. -+ -+ -+.. -+ -+UNDEFINED -+order_end -+END LC_COLLATE -+ -+LC_MONETARY -+% This is the 14652 i18n fdcc-set definition for -+% the LC_MONETARY category -+% (except for the int_curr_symbol and currency_symbol, they are empty in -+% the 14652 i18n fdcc-set definition and also empty in -+% glibc/locale/C-monetary.c. But localedef complains in that case). -+% -+% Using "USD" for int_curr_symbol. But maybe "XXX" would be better? -+% XXX is "No currency" (https://en.wikipedia.org/wiki/ISO_4217) -+int_curr_symbol "" -+% Using "$" for currency_symbol. But maybe would be better? -+% U+00A4 is the "generic currency symbol" -+% (https://en.wikipedia.org/wiki/Currency_sign_%28typography%29) -+currency_symbol "" -+mon_decimal_point "" -+mon_thousands_sep "" -+mon_grouping -1 -+positive_sign "" -+negative_sign "" -+int_frac_digits -1 -+frac_digits -1 -+p_cs_precedes -1 -+int_p_sep_by_space -1 -+p_sep_by_space -1 -+n_cs_precedes -1 -+int_n_sep_by_space -1 -+n_sep_by_space -1 -+p_sign_posn -1 -+n_sign_posn -1 -+% -+END LC_MONETARY -+ -+LC_NUMERIC -+% This is the POSIX Locale definition for -+% the LC_NUMERIC category. -+% -+decimal_point "" -+thousands_sep "" -+grouping -1 -+END LC_NUMERIC -+ -+LC_TIME -+% This is the POSIX Locale definition for -+% the LC_TIME category. -+% -+% Abbreviated weekday names (%a) -+abday "";"";/ -+ "";"";/ -+ "";"";/ -+ "" -+ -+% Full weekday names (%A) -+day "";/ -+ "";/ -+ "";/ -+ "";/ -+ "";/ -+ "";/ -+ "" -+ -+% Abbreviated month names (%b) -+abmon "";"";/ -+ "";"";/ -+ "";"";/ -+ "";"";/ -+ "";"";/ -+ "";"" -+ -+% Full month names (%B) -+mon "";/ -+ "";/ -+ "";/ -+ "";/ -+ "";/ -+ "";/ -+ "";/ -+ "";/ -+ "";/ -+ "";/ -+ "";/ -+ "" -+ -+% Week description, consists of three fields: -+% 1. Number of days in a week. -+% 2. Gregorian date that is a first weekday (19971130 for Sunday, 19971201 for Monday). -+% 3. The weekday number to be contained in the first week of the year. -+% -+% ISO 8601 conforming applications should use the values 7, 19971201 (a -+% Monday), and 4 (Thursday), respectively. -+week 7;19971201;4 -+first_weekday 1 -+first_workday 1 -+ -+% Appropriate date and time representation (%c) -+% "%a %b %e %H:%M:%S %Y" -+d_t_fmt "" -+ -+% Appropriate date representation (%x) -+% "%m/%d/%y" -+d_fmt "" -+ -+% Appropriate time representation (%X) -+% "%H:%M:%S" -+t_fmt "" -+ -+% Appropriate AM/PM time representation (%r) -+% "%I:%M:%S %p" -+t_fmt_ampm "" -+ -+% Equivalent of AM/PM (%p) "AM"/"PM" -+% -+am_pm "";"" -+ -+% Appropriate date representation (date(1)) "%a %b %e %H:%M:%S %Z %Y" -+date_fmt "" -+END LC_TIME -+ -+LC_MESSAGES -+% This is the POSIX Locale definition for -+% the LC_NUMERIC category. -+% -+yesexpr "" -+noexpr "" -+yesstr "" -+nostr "" -+END LC_MESSAGES -+ -+LC_PAPER -+% This is the ISO/IEC 14652 "i18n" definition for -+% the LC_PAPER category. -+% (A4 paper, this is also used in the built in C/POSIX -+% locale in glibc/locale/C-paper.c) -+height 297 -+width 210 -+END LC_PAPER -+ -+LC_NAME -+% This is the ISO/IEC 14652 "i18n" definition for -+% the LC_NAME category. -+% "%p%t%g%t%m%t%f" -+% (also used in the built in C/POSIX locale in glibc/locale/C-name.c) -+name_fmt "/ -+" -+END LC_NAME -+ -+LC_ADDRESS -+% This is the ISO/IEC 14652 "i18n" definition for -+% the LC_ADDRESS category. -+% "%a%N%f%N%d%N%b%N%s %h %e %r%N%C-%z %T%N%c%N" -+% (also used in the built in C/POSIX locale in glibc/locale/C-address.c) -+postal_fmt "/ -+/ -+/ -+/ -+" -+END LC_ADDRESS -+ -+LC_TELEPHONE -+% This is the ISO/IEC 14652 "i18n" definition for -+% the LC_TELEPHONE category. -+% "+%c %a %l" -+tel_int_fmt "/ -+" -+% (also used in the built in C/POSIX locale in glibc/locale/C-telephone.c) -+END LC_TELEPHONE -+ -+LC_MEASUREMENT -+% This is the ISO/IEC 14652 "i18n" definition for -+% the LC_MEASUREMENT category. -+% (same as in the built in C/POSIX locale in glibc/locale/C-measurement.c) -+%metric -+measurement 1 -+END LC_MEASUREMENT -+ --- -2.4.3 - diff --git a/glibc.spec b/glibc.spec index 0b940f025bba32977ec652cd8aa34ebf50ef303d..06f0a7ae9be8fd6553c328850a259d8112a380d5 100644 --- a/glibc.spec +++ b/glibc.spec @@ -32,7 +32,7 @@ %bcond_with werror %bcond_without docs %ifarch x86_64 aarch64 -%bcond_without compat_2_17 +%bcond_with compat_2_17 %endif %ifarch %{valgrind_arches} @@ -64,8 +64,8 @@ # glibc - The GNU C Library (glibc) core package. ############################################################################## Name: glibc -Version: 2.34 -Release: 39 +Version: 2.35 +Release: 1 Summary: The GNU libc libraries License: %{all_license} URL: http://www.gnu.org/software/glibc/ @@ -84,80 +84,18 @@ Source8: testsuite_whitelist.%{_target_cpu} %endif Patch0: glibc-1070416.patch -Patch1: glibc-c-utf8-locale.patch -Patch2: backport-CVE-2021-38604-0001-librt-add-test-bug-28213.patch -Patch3: backport-CVE-2021-38604-0002-librt-fix-NULL-pointer-dereference-bug-28213.patch -Patch4: copy_and_spawn_sgid-Avoid-double-calls-to-close.patch -Patch5: gaiconf_init-Avoid-double-free-in-label-and-preceden.patch -Patch6: gconv_parseconfdir-Fix-memory-leak.patch -Patch7: gethosts-Remove-unused-argument-_type.patch -Patch8: iconv_charmap-Close-output-file-when-done.patch -Patch9: ldconfig-avoid-leak-on-empty-paths-in-config-file.patch -Patch10: Linux-Fix-fcntl-ioctl-prctl-redirects-for-_TIME_BITS.patch -Patch11: nis-Fix-leak-on-realloc-failure-in-nis_getnames-BZ-2.patch -Patch12: rt-Set-the-correct-message-queue-for-tst-mqueue10.patch -Patch13: 1-5-AArch64-Improve-A64FX-memset-for-small-sizes.patch -Patch14: 2-5-AArch64-Improve-A64FX-memset-for-large-sizes.patch -Patch15: 3-5-AArch64-Improve-A64FX-memset-for-remaining-bytes.patch -Patch16: 4-5-AArch64-Improve-A64FX-memset-by-removing-unroll3.patch -Patch17: 5-5-AArch64-Improve-A64FX-memset-medium-loops.patch -Patch18: elf-Unconditionally-use-__ehdr_start.patch -Patch19: aarch64-Make-elf_machine_-load_address-dynamic-robus.patch -Patch20: mtrace-Use-a-static-buffer-for-printing-BZ-25947.patch -Patch21: time-Fix-overflow-itimer-tests-on-32-bit-systems.patch -Patch22: arm-Simplify-elf_machine_-load_address-dynamic.patch -Patch23: elf-Drop-elf-tls-macros.h-in-favor-of-__thread-and-t.patch -Patch24: elf-Fix-missing-colon-in-LD_SHOW_AUXV-output-BZ-2825.patch -Patch25: Remove-sysdeps-tls-macros.h.patch -Patch26: riscv-Drop-reliance-on-_GLOBAL_OFFSET_TABLE_-0.patch -Patch27: x86_64-Simplify-elf_machine_-load_address-dynamic.patch -Patch28: x86-fix-Autoconf-caching-of-instruction-support-chec.patch -Patch29: Update-string-test-memmove.c-to-cover-16KB-copy.patch -Patch30: x86-64-Optimize-load-of-all-bits-set-into-ZMM-regist.patch -Patch31: mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch -Patch32: rtld-copy-terminating-null-in-tunables_strdup-bug-28.patch -Patch33: Use-__executable_start-as-the-lowest-address-for-pro.patch -Patch34: x86-64-Use-testl-to-check-__x86_string_control.patch -Patch35: AArch64-Update-A64FX-memset-not-to-degrade-at-16KB.patch -Patch36: support-Add-support_wait_for_thread_exit.patch -Patch37: nptl-pthread_kill-pthread_cancel-should-not-fail-aft.patch -Patch38: nptl-Fix-race-between-pthread_kill-and-thread-exit-b.patch -Patch39: nptl-pthread_kill-needs-to-return-ESRCH-for-old-prog.patch -Patch40: nptl-Fix-type-of-pthread_mutexattr_getrobust_np-pthr.patch -Patch41: nptl-Avoid-setxid-deadlock-with-blocked-signals-in-t.patch -Patch42: nptl-pthread_kill-must-send-signals-to-a-specific-th.patch -Patch43: iconvconfig-Fix-behaviour-with-prefix-BZ-28199.patch -Patch44: gconv-Do-not-emit-spurious-NUL-character-in-ISO-2022.patch -Patch45: elf-Avoid-deadlock-between-pthread_create-and-ctors-.patch -Patch46: ld.so-Replace-DL_RO_DYN_SECTION-with-dl_relocate_ld-.patch -Patch47: ld.so-Initialize-bootstrap_map.l_ld_readonly-BZ-2834.patch -Patch48: Avoid-warning-overriding-recipe-for-.-tst-ro-dynamic.patch -Patch49: posix-Fix-attribute-access-mode-on-getcwd-BZ-27476.patch -Patch50: Linux-Simplify-__opensock-and-fix-race-condition-BZ-.patch -Patch51: linux-Simplify-get_nprocs.patch -Patch52: misc-Add-__get_nprocs_sched.patch -Patch53: linux-Revert-the-use-of-sched_getaffinity-on-get_npr.patch -Patch54: pthread-tst-cancel28-Fix-barrier-re-init-race-condit.patch -Patch55: support-Add-support_open_dev_null_range.patch -Patch56: Use-support_open_dev_null_range-io-tst-closefrom-mis.patch -Patch57: Fix-failing-nss-tst-nss-files-hosts-long-with-local-.patch -Patch58: nptl-Add-one-more-barrier-to-nptl-tst-create1.patch -Patch59: io-Fix-ftw-internal-realloc-buffer-BZ-28126.patch -Patch60: Do-not-define-tgmath.h-fmaxmag-fminmag-macros-for-C2.patch -Patch61: ld.so-Don-t-fill-the-DT_DEBUG-entry-in-ld.so-BZ-2812.patch -Patch62: delete-check-installed-headers-c-and-check-installed.patch - -Patch9000: turn-default-value-of-x86_rep_stosb_threshold_form_2K_to_1M.patch -Patch9001: delete-no-hard-link-to-avoid-all_language-package-to.patch -Patch9002: 0001-add-base-files-for-libphtread-condition-family.patch -Patch9003: 0002-add-header-files-for-libphtread_2_17_so.patch -Patch9004: 0003-add-build-script-and-files-of-libpthread_2_17_so.patch -Patch9005: 0004-add-two-header-files-with-some-deleted-macros.patch -Patch9006: 0005-add-pthread-functions_h.patch -Patch9007: 0006-add-elsion-function-which-moved-to-libc-in-glibc-2.34.patch -Patch9008: 0007-add-lowlevellock_2_17_c.patch -Patch9009: 0008-add-pause_nocancel_2_17.patch -Patch9010: 0009-add-unwind-with-longjmp.patch + +#Patch9000: turn-default-value-of-x86_rep_stosb_threshold_form_2K_to_1M.patch +#Patch9001: delete-no-hard-link-to-avoid-all_language-package-to.patch +#Patch9002: 0001-add-base-files-for-libphtread-condition-family.patch +#Patch9003: 0002-add-header-files-for-libphtread_2_17_so.patch +#Patch9004: 0003-add-build-script-and-files-of-libpthread_2_17_so.patch +#Patch9005: 0004-add-two-header-files-with-some-deleted-macros.patch +#Patch9006: 0005-add-pthread-functions_h.patch +#Patch9007: 0006-add-elsion-function-which-moved-to-libc-in-glibc-2.34.patch +#Patch9008: 0007-add-lowlevellock_2_17_c.patch +#Patch9009: 0008-add-pause_nocancel_2_17.patch +#Patch9010: 0009-add-unwind-with-longjmp.patch Provides: ldconfig rtld(GNU_HASH) bundled(gnulib) @@ -919,9 +857,9 @@ fi grep -v ^PASS: tests.sum | grep -v ^UNSUPPORTED > rpmbuild.tests.sum.not-passing || true # Delete the testsuite from the whitelist -cp %{SOURCE8} testsuite_whitelist -omit_testsuite testsuite_whitelist -rm -rf testsuite_whitelist +#cp %{SOURCE8} testsuite_whitelist +#omit_testsuite testsuite_whitelist +#rm -rf testsuite_whitelist set +x if test -s rpmbuild.tests.sum.not-passing ; then @@ -938,7 +876,7 @@ if test -s rpmbuild.tests.sum.not-passing ; then fi done done - 2.35-1 +- upgrade to 2.35 + * Fri Jan 28 2022 Yang Yanchao - 2.34-39 - refactor the generation mode of the debug package and add correct files to the glibc-debugsource sync form 22.03-LTS diff --git a/iconv_charmap-Close-output-file-when-done.patch b/iconv_charmap-Close-output-file-when-done.patch deleted file mode 100644 index a96692223ccbd7427bc30fa3dcde6250e7b43fc8..0000000000000000000000000000000000000000 --- a/iconv_charmap-Close-output-file-when-done.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 1e0e6d656db9dfa12ef7eb67976385d3deb0d4ff Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Tue, 3 Aug 2021 21:10:29 +0530 -Subject: [PATCH] iconv_charmap: Close output file when done - -Reviewed-by: Arjun Shankar ---- - iconv/iconv_charmap.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/iconv/iconv_charmap.c b/iconv/iconv_charmap.c -index e2d53fe..a8b6b56 100644 ---- a/iconv/iconv_charmap.c -+++ b/iconv/iconv_charmap.c -@@ -234,6 +234,8 @@ charmap_conversion (const char *from_code, struct charmap_t *from_charmap, - while (++remaining < argc); - - /* All done. */ -+ if (output != stdout) -+ fclose (output); - free_table (cvtbl); - return status; - } --- -1.8.3.1 - diff --git a/iconvconfig-Fix-behaviour-with-prefix-BZ-28199.patch b/iconvconfig-Fix-behaviour-with-prefix-BZ-28199.patch deleted file mode 100644 index 6df7a8218cf4f111faf3f08beff2506fd553488b..0000000000000000000000000000000000000000 --- a/iconvconfig-Fix-behaviour-with-prefix-BZ-28199.patch +++ /dev/null @@ -1,123 +0,0 @@ -From 43cea6d5652b6b9e61ac6ecc69419c909b504f47 Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Mon, 13 Sep 2021 20:48:35 +0530 -Subject: [PATCH] iconvconfig: Fix behaviour with --prefix [BZ #28199] - -The consolidation of configuration parsing broke behaviour with ---prefix, where the prefix bled into the modules cache. Accept a -prefix which, when non-NULL, is prepended to the path when looking for -configuration files but only the original directory is added to the -modules cache. - -This has no effect on the codegen of gconv_conf since it passes NULL. - -Reported-by: Patrick McCarty -Reported-by: Michael Hudson-Doyle -Reviewed-by: Andreas Schwab ---- - iconv/gconv_conf.c | 2 +- - iconv/gconv_parseconfdir.h | 22 +++++++++++++++------- - iconv/iconvconfig.c | 16 ++++++++++++---- - 3 files changed, 28 insertions(+), 12 deletions(-) - -diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c -index 09ffe02..077082a 100644 ---- a/iconv/gconv_conf.c -+++ b/iconv/gconv_conf.c -@@ -477,7 +477,7 @@ __gconv_read_conf (void) - __gconv_get_path (); - - for (cnt = 0; __gconv_path_elem[cnt].name != NULL; ++cnt) -- gconv_parseconfdir (__gconv_path_elem[cnt].name, -+ gconv_parseconfdir (NULL, __gconv_path_elem[cnt].name, - __gconv_path_elem[cnt].len); - #endif - -diff --git a/iconv/gconv_parseconfdir.h b/iconv/gconv_parseconfdir.h -index 2f06268..a586268 100644 ---- a/iconv/gconv_parseconfdir.h -+++ b/iconv/gconv_parseconfdir.h -@@ -39,7 +39,6 @@ - /* Name of the file containing the module information in the directories - along the path. */ - static const char gconv_conf_filename[] = "gconv-modules"; --static const char gconv_conf_dirname[] = "gconv-modules.d"; - - static void add_alias (char *); - static void add_module (char *, const char *, size_t, int); -@@ -110,19 +109,28 @@ read_conf_file (const char *filename, const char *directory, size_t dir_len) - return true; - } - -+/* Prefix DIR (with length DIR_LEN) with PREFIX if the latter is non-NULL and -+ parse configuration in it. */ -+ - static __always_inline bool --gconv_parseconfdir (const char *dir, size_t dir_len) -+gconv_parseconfdir (const char *prefix, const char *dir, size_t dir_len) - { -- /* No slash needs to be inserted between dir and gconv_conf_filename; -- dir already ends in a slash. */ -- char *buf = malloc (dir_len + sizeof (gconv_conf_dirname)); -+ /* No slash needs to be inserted between dir and gconv_conf_filename; dir -+ already ends in a slash. The additional 2 is to accommodate the ".d" -+ when looking for configuration files in gconv-modules.d. */ -+ size_t buflen = dir_len + sizeof (gconv_conf_filename) + 2; -+ char *buf = malloc (buflen + (prefix != NULL ? strlen (prefix) : 0)); -+ char *cp = buf; - bool found = false; - - if (buf == NULL) - return false; - -- char *cp = mempcpy (mempcpy (buf, dir, dir_len), gconv_conf_filename, -- sizeof (gconv_conf_filename)); -+ if (prefix != NULL) -+ cp = stpcpy (cp, prefix); -+ -+ cp = mempcpy (mempcpy (cp, dir, dir_len), gconv_conf_filename, -+ sizeof (gconv_conf_filename)); - - /* Read the gconv-modules configuration file first. */ - found = read_conf_file (buf, dir, dir_len); -diff --git a/iconv/iconvconfig.c b/iconv/iconvconfig.c -index fd61cf2..a89b62e 100644 ---- a/iconv/iconvconfig.c -+++ b/iconv/iconvconfig.c -@@ -652,13 +652,21 @@ add_module (char *rp, const char *directory, - static int - handle_dir (const char *dir) - { -+ char *newp = NULL; - size_t dirlen = strlen (dir); - bool found = false; - -- char *fulldir = xasprintf ("%s%s%s", dir[0] == '/' ? prefix : "", -- dir, dir[dirlen - 1] != '/' ? "/" : ""); -+ /* End directory path with a '/' if it doesn't already. */ -+ if (dir[dirlen - 1] != '/') -+ { -+ newp = xmalloc (dirlen + 2); -+ memcpy (newp, dir, dirlen); -+ newp[dirlen++] = '/'; -+ newp[dirlen] = '\0'; -+ dir = newp; -+ } - -- found = gconv_parseconfdir (fulldir, strlen (fulldir)); -+ found = gconv_parseconfdir (dir[0] == '/' ? prefix : NULL, dir, dirlen); - - if (!found) - { -@@ -670,7 +678,7 @@ handle_dir (const char *dir) - "configuration files with names ending in .conf."); - } - -- free (fulldir); -+ free (newp); - - return found ? 0 : 1; - } --- -1.8.3.1 - diff --git a/io-Fix-ftw-internal-realloc-buffer-BZ-28126.patch b/io-Fix-ftw-internal-realloc-buffer-BZ-28126.patch deleted file mode 100644 index 09767bd715da61ad8fe726b9273406e0c2cbaf00..0000000000000000000000000000000000000000 --- a/io-Fix-ftw-internal-realloc-buffer-BZ-28126.patch +++ /dev/null @@ -1,210 +0,0 @@ -From 1836bb2ebf62bd9a3588f2ed2d851c8ae810097a Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Wed, 25 Aug 2021 11:17:06 -0300 -Subject: [PATCH] io: Fix ftw internal realloc buffer (BZ #28126) - -The 106ff08526d3ca did not take in consideration the buffer might be -reallocated if the total path is larger than PATH_MAX. The realloc -uses 'dirbuf', where 'dirstreams' is the allocated buffer. - -Checked on x86_64-linux-gnu. - -Reviewed-by: H.J. Lu ---- - io/Makefile | 1 + - io/ftw.c | 39 ++++++++++----------- - io/tst-ftw-bz28126.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 117 insertions(+), 20 deletions(-) - create mode 100644 io/tst-ftw-bz28126.c - -diff --git a/io/Makefile b/io/Makefile -index 9871ecb..ecf65ab 100644 ---- a/io/Makefile -+++ b/io/Makefile -@@ -79,6 +79,7 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ - tst-futimens \ - tst-utimensat \ - tst-closefrom \ -+ tst-ftw-bz28126 - - tests-time64 := \ - tst-futimens-time64 \ -diff --git a/io/ftw.c b/io/ftw.c -index f0db173..fe95345 100644 ---- a/io/ftw.c -+++ b/io/ftw.c -@@ -203,6 +203,20 @@ struct ftw_data - void *known_objects; - }; - -+static bool -+ftw_allocate (struct ftw_data *data, size_t newsize) -+{ -+ void *newp = realloc (data->dirstreams, data->maxdir -+ * sizeof (struct dir_data *) -+ + newsize); -+ if (newp == NULL) -+ return false; -+ data->dirstreams = newp; -+ data->dirbufsize = newsize; -+ data->dirbuf = (char *) data->dirstreams -+ + data->maxdir * sizeof (struct dir_data *); -+ return true; -+} - - /* Internally we use the FTW_* constants used for `nftw'. When invoked - as `ftw', map each flag to the subset of values used by `ftw'. */ -@@ -388,17 +402,9 @@ process_entry (struct ftw_data *data, struct dir_data *dir, const char *name, - return 0; - - new_buflen = data->ftw.base + namlen + 2; -- if (data->dirbufsize < new_buflen) -- { -- /* Enlarge the buffer. */ -- char *newp; -- -- data->dirbufsize = 2 * new_buflen; -- newp = (char *) realloc (data->dirbuf, data->dirbufsize); -- if (newp == NULL) -- return -1; -- data->dirbuf = newp; -- } -+ if (data->dirbufsize < new_buflen -+ && !ftw_allocate (data, 2 * new_buflen)) -+ return -1; - - *((char *) __mempcpy (data->dirbuf + data->ftw.base, name, namlen)) = '\0'; - -@@ -628,7 +634,7 @@ __attribute ((noinline)) - ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, - int flags) - { -- struct ftw_data data; -+ struct ftw_data data = { .dirstreams = NULL }; - struct STRUCT_STAT st; - int result = 0; - int save_err; -@@ -646,16 +652,9 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, - data.maxdir = descriptors < 1 ? 1 : descriptors; - data.actdir = 0; - /* PATH_MAX is always defined when we get here. */ -- data.dirbufsize = MAX (2 * strlen (dir), PATH_MAX); -- data.dirstreams = malloc (data.maxdir * sizeof (struct dir_data *) -- + data.dirbufsize); -- if (data.dirstreams == NULL) -+ if (!ftw_allocate (&data, MAX (2 * strlen (dir), PATH_MAX))) - return -1; -- - memset (data.dirstreams, '\0', data.maxdir * sizeof (struct dir_data *)); -- -- data.dirbuf = (char *) data.dirstreams -- + data.maxdir * sizeof (struct dir_data *); - cp = __stpcpy (data.dirbuf, dir); - /* Strip trailing slashes. */ - while (cp > data.dirbuf + 1 && cp[-1] == '/') -diff --git a/io/tst-ftw-bz28126.c b/io/tst-ftw-bz28126.c -new file mode 100644 -index 0000000..94044ab ---- /dev/null -+++ b/io/tst-ftw-bz28126.c -@@ -0,0 +1,97 @@ -+/* Check if internal buffer reallocation work for large paths (BZ #28126) -+ Copyright (C) 2021 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 -+#include -+#include -+ -+static int -+my_func (const char *file, const struct stat *sb, int flag) -+{ -+ return 0; -+} -+ -+static const char folder[NAME_MAX] = { [0 ... 253] = 'a', [254] = '\0' }; -+ -+#define NSUBFOLDERS 16 -+static int nsubfolders; -+ -+static void -+do_cleanup (void) -+{ -+ xchdir (".."); -+ for (int i = 0; i < nsubfolders; i++) -+ { -+ remove (folder); -+ xchdir (".."); -+ } -+ remove (folder); -+} -+#define CLEANUP_HANDLER do_cleanup -+ -+static void -+check_mkdir (const char *path) -+{ -+ int r = mkdir (path, 0777); -+ /* Some filesystem such as overlayfs does not support larger path required -+ to trigger the internal buffer reallocation. */ -+ if (r != 0) -+ { -+ if (errno == ENAMETOOLONG) -+ FAIL_UNSUPPORTED ("the filesystem does not support the required" -+ "large path"); -+ else -+ FAIL_EXIT1 ("mkdir (\"%s\", 0%o): %m", folder, 0777); -+ } -+} -+ -+static int -+do_test (void) -+{ -+ char *tempdir = support_create_temp_directory ("tst-bz28126"); -+ -+ /* Create path with various subfolders to force an internal buffer -+ reallocation within ntfw. */ -+ char *path = xasprintf ("%s/%s", tempdir, folder); -+ check_mkdir (path); -+ xchdir (path); -+ free (path); -+ for (int i = 0; i < NSUBFOLDERS - 1; i++) -+ { -+ check_mkdir (folder); -+ xchdir (folder); -+ nsubfolders++; -+ } -+ -+ TEST_COMPARE (ftw (tempdir, my_func, 20), 0); -+ -+ free (tempdir); -+ -+ do_cleanup (); -+ -+ return 0; -+} -+ -+#include --- -1.8.3.1 - diff --git a/ld.so-Don-t-fill-the-DT_DEBUG-entry-in-ld.so-BZ-2812.patch b/ld.so-Don-t-fill-the-DT_DEBUG-entry-in-ld.so-BZ-2812.patch deleted file mode 100644 index 93d45e947a0f8a677add72c73b9fdfba9256fbf0..0000000000000000000000000000000000000000 --- a/ld.so-Don-t-fill-the-DT_DEBUG-entry-in-ld.so-BZ-2812.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 3234a31b489707f19ec6d4c9909af06f20ddb901 Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" -Date: Mon, 2 Aug 2021 13:52:36 -0700 -Subject: [PATCH] ld.so: Don't fill the DT_DEBUG entry in ld.so [BZ #28129] - -Linker creates the DT_DEBUG entry only in executables. Don't fill the -non-existent DT_DEBUG entry in ld.so with the run-time address of the -r_debug structure. This fixes BZ #28129. ---- - elf/rtld.c | 6 ------ - 1 file changed, 6 deletions(-) - -diff --git a/elf/rtld.c b/elf/rtld.c -index 9642eb9c92..628245d8cd 100644 ---- a/elf/rtld.c -+++ b/elf/rtld.c -@@ -1761,17 +1761,11 @@ dl_main (const ElfW(Phdr) *phdr, - #ifdef ELF_MACHINE_DEBUG_SETUP - /* Some machines (e.g. MIPS) don't use DT_DEBUG in this way. */ - ELF_MACHINE_DEBUG_SETUP (main_map, r); -- ELF_MACHINE_DEBUG_SETUP (&GL(dl_rtld_map), r); - #else - if (main_map->l_info[DT_DEBUG] != NULL) - /* There is a DT_DEBUG entry in the dynamic section. Fill it in - with the run-time address of the r_debug structure */ - main_map->l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r; -- -- /* Fill in the pointer in the dynamic linker's own dynamic section, in -- case you run gdb on the dynamic linker directly. */ -- if (GL(dl_rtld_map).l_info[DT_DEBUG] != NULL) -- GL(dl_rtld_map).l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r; - #endif - - /* We start adding objects. */ --- -2.25.1 - diff --git a/ld.so-Initialize-bootstrap_map.l_ld_readonly-BZ-2834.patch b/ld.so-Initialize-bootstrap_map.l_ld_readonly-BZ-2834.patch deleted file mode 100644 index d1f4271f5367a46f0536aa14fa3d4c40f02a8f96..0000000000000000000000000000000000000000 --- a/ld.so-Initialize-bootstrap_map.l_ld_readonly-BZ-2834.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 2ec99d8c42b2ff1a1231e4df462a0910a9b7fdef Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" -Date: Thu, 23 Sep 2021 09:06:49 -0700 -Subject: [PATCH] ld.so: Initialize bootstrap_map.l_ld_readonly [BZ #28340] - -1. Define DL_RO_DYN_SECTION to initalize bootstrap_map.l_ld_readonly -before calling elf_get_dynamic_info to get dynamic info in bootstrap_map, -2. Define a single - -static inline bool -dl_relocate_ld (const struct link_map *l) -{ - /* Don't relocate dynamic section if it is readonly */ - return !(l->l_ld_readonly || DL_RO_DYN_SECTION); -} - -This updates BZ #28340 fix. ---- - elf/rtld.c | 1 + - sysdeps/generic/dl-relocate-ld.h | 11 ++--------- - sysdeps/generic/ldsodefs.h | 10 ++++++++++ - sysdeps/mips/dl-relocate-ld.h | 11 ++--------- - sysdeps/riscv/dl-relocate-ld.h | 11 ++--------- - 5 files changed, 17 insertions(+), 27 deletions(-) - -diff --git a/elf/rtld.c b/elf/rtld.c -index c66a1d0..b8ba2d8 100644 ---- a/elf/rtld.c -+++ b/elf/rtld.c -@@ -547,6 +547,7 @@ _dl_start (void *arg) - - /* Read our own dynamic section and fill in the info array. */ - bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic (); -+ bootstrap_map.l_ld_readonly = DL_RO_DYN_SECTION; - elf_get_dynamic_info (&bootstrap_map); - - #if NO_TLS_OFFSET != 0 -diff --git a/sysdeps/generic/dl-relocate-ld.h b/sysdeps/generic/dl-relocate-ld.h -index 5fae206..cfb86c2 100644 ---- a/sysdeps/generic/dl-relocate-ld.h -+++ b/sysdeps/generic/dl-relocate-ld.h -@@ -19,14 +19,7 @@ - #ifndef _DL_RELOCATE_LD_H - #define _DL_RELOCATE_LD_H - --/* Return true if dynamic section in the shared library L should be -- relocated. */ -- --static inline bool --dl_relocate_ld (const struct link_map *l) --{ -- /* Don't relocate dynamic section if it is readonly */ -- return !l->l_ld_readonly; --} -+/* The dynamic section is writable. */ -+#define DL_RO_DYN_SECTION 0 - - #endif /* _DL_RELOCATE_LD_H */ -diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h -index 9ec1511..0410f77 100644 ---- a/sysdeps/generic/ldsodefs.h -+++ b/sysdeps/generic/ldsodefs.h -@@ -69,6 +69,16 @@ __BEGIN_DECLS - `ElfW(TYPE)' is used in place of `Elf32_TYPE' or `Elf64_TYPE'. */ - #define ELFW(type) _ElfW (ELF, __ELF_NATIVE_CLASS, type) - -+/* Return true if dynamic section in the shared library L should be -+ relocated. */ -+ -+static inline bool -+dl_relocate_ld (const struct link_map *l) -+{ -+ /* Don't relocate dynamic section if it is readonly */ -+ return !(l->l_ld_readonly || DL_RO_DYN_SECTION); -+} -+ - /* All references to the value of l_info[DT_PLTGOT], - l_info[DT_STRTAB], l_info[DT_SYMTAB], l_info[DT_RELA], - l_info[DT_REL], l_info[DT_JMPREL], and l_info[VERSYMIDX (DT_VERSYM)] -diff --git a/sysdeps/mips/dl-relocate-ld.h b/sysdeps/mips/dl-relocate-ld.h -index 0c18d9a..376ad75 100644 ---- a/sysdeps/mips/dl-relocate-ld.h -+++ b/sysdeps/mips/dl-relocate-ld.h -@@ -19,14 +19,7 @@ - #ifndef _DL_RELOCATE_LD_H - #define _DL_RELOCATE_LD_H - --/* Return true if dynamic section in the shared library L should be -- relocated. */ -- --static inline bool --dl_relocate_ld (const struct link_map *l) --{ -- /* Never relocate dynamic section. */ -- return false; --} -+/* The dynamic section is readonly. */ -+#define DL_RO_DYN_SECTION 1 - - #endif /* _DL_RELOCATE_LD_H */ -diff --git a/sysdeps/riscv/dl-relocate-ld.h b/sysdeps/riscv/dl-relocate-ld.h -index 1032745..2ab2b8a 100644 ---- a/sysdeps/riscv/dl-relocate-ld.h -+++ b/sysdeps/riscv/dl-relocate-ld.h -@@ -19,14 +19,7 @@ - #ifndef _DL_RELOCATE_LD_H - #define _DL_RELOCATE_LD_H - --/* Return true if dynamic section in the shared library L should be -- relocated. */ -- --static inline bool --dl_relocate_ld (const struct link_map *l) --{ -- /* Never relocate dynamic section for ABI compatibility. */ -- return false; --} -+/* The dynamic section is readonly for ABI compatibility. */ -+#define DL_RO_DYN_SECTION 1 - - #endif /* _DL_RELOCATE_LD_H */ --- -1.8.3.1 - diff --git a/ld.so-Replace-DL_RO_DYN_SECTION-with-dl_relocate_ld-.patch b/ld.so-Replace-DL_RO_DYN_SECTION-with-dl_relocate_ld-.patch deleted file mode 100644 index 077b996743c1a88b817e7935e7fbc8fdded4684c..0000000000000000000000000000000000000000 --- a/ld.so-Replace-DL_RO_DYN_SECTION-with-dl_relocate_ld-.patch +++ /dev/null @@ -1,515 +0,0 @@ -From b413280cfb16834450f66f554bc0d618bb513851 Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" -Date: Thu, 16 Sep 2021 08:15:29 -0700 -Subject: [PATCH] ld.so: Replace DL_RO_DYN_SECTION with dl_relocate_ld [BZ - #28340] - -We can't relocate entries in dynamic section if it is readonly: - -1. Add a l_ld_readonly field to struct link_map to indicate if dynamic -section is readonly and set it based on p_flags of PT_DYNAMIC segment. -2. Replace DL_RO_DYN_SECTION with dl_relocate_ld to decide if dynamic -section should be relocated. -3. Remove DL_RO_DYN_TEMP_CNT. -4. Don't use a static dynamic section to make readonly dynamic section -in vDSO writable. -5. Remove the temp argument from elf_get_dynamic_info. - -This fixes BZ #28340. - -Reviewed-by: Siddhesh Poyarekar ---- - elf/Makefile | 11 +++++++++-- - elf/dl-load.c | 3 ++- - elf/dl-reloc-static-pie.c | 12 +++++++++++- - elf/get-dynamic-info.h | 21 +++------------------ - elf/rtld.c | 6 ++++-- - elf/setup-vdso.h | 5 ++--- - elf/tst-ro-dynamic-mod.c | 19 +++++++++++++++++++ - elf/tst-ro-dynamic-mod.map | 16 ++++++++++++++++ - elf/tst-ro-dynamic.c | 31 +++++++++++++++++++++++++++++++ - include/link.h | 3 +++ - sysdeps/generic/dl-relocate-ld.h | 32 ++++++++++++++++++++++++++++++++ - sysdeps/generic/ldsodefs.h | 7 ++----- - sysdeps/mips/dl-relocate-ld.h | 32 ++++++++++++++++++++++++++++++++ - sysdeps/mips/ldsodefs.h | 4 ---- - sysdeps/riscv/dl-relocate-ld.h | 32 ++++++++++++++++++++++++++++++++ - sysdeps/riscv/ldsodefs.h | 5 ----- - 16 files changed, 198 insertions(+), 41 deletions(-) - create mode 100644 elf/tst-ro-dynamic-mod.c - create mode 100644 elf/tst-ro-dynamic-mod.map - create mode 100644 elf/tst-ro-dynamic.c - create mode 100644 sysdeps/generic/dl-relocate-ld.h - create mode 100644 sysdeps/mips/dl-relocate-ld.h - create mode 100644 sysdeps/riscv/dl-relocate-ld.h - -diff --git a/elf/Makefile b/elf/Makefile -index 835b85b..0cdccaa 100644 ---- a/elf/Makefile -+++ b/elf/Makefile -@@ -224,7 +224,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \ - tst-tls-ie tst-tls-ie-dlmopen argv0test \ - tst-glibc-hwcaps tst-glibc-hwcaps-prepend tst-glibc-hwcaps-mask \ - tst-tls20 tst-tls21 tst-dlmopen-dlerror tst-dlmopen-gethostbyname \ -- tst-dl-is_dso -+ tst-dl-is_dso tst-ro-dynamic - # reldep9 - tests-internal += loadtest unload unload2 circleload1 \ - neededtest neededtest2 neededtest3 neededtest4 \ -@@ -360,7 +360,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ - libmarkermod4-1 libmarkermod4-2 libmarkermod4-3 libmarkermod4-4 \ - tst-tls20mod-bad tst-tls21mod tst-dlmopen-dlerror-mod \ - tst-auxvalmod \ -- tst-dlmopen-gethostbyname-mod \ -+ tst-dlmopen-gethostbyname-mod tst-ro-dynamic-mod \ - - # Most modules build with _ISOMAC defined, but those filtered out - # depend on internal headers. -@@ -1911,3 +1911,10 @@ $(objpfx)tst-getauxval-static.out: $(objpfx)tst-auxvalmod.so - tst-getauxval-static-ENV = LD_LIBRARY_PATH=$(objpfx):$(common-objpfx) - - $(objpfx)tst-dlmopen-gethostbyname.out: $(objpfx)tst-dlmopen-gethostbyname-mod.so -+ -+$(objpfx)tst-ro-dynamic: $(objpfx)tst-ro-dynamic-mod.so -+$(objpfx)tst-ro-dynamic-mod.so: $(objpfx)tst-ro-dynamic-mod.os \ -+ tst-ro-dynamic-mod.map -+ $(LINK.o) -nostdlib -nostartfiles -shared -o $@ \ -+ -Wl,--script=tst-ro-dynamic-mod.map \ -+ $(objpfx)tst-ro-dynamic-mod.os -diff --git a/elf/dl-load.c b/elf/dl-load.c -index 39e0d07..6ea7107 100644 ---- a/elf/dl-load.c -+++ b/elf/dl-load.c -@@ -1149,6 +1149,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd, - such a segment to avoid a crash later. */ - l->l_ld = (void *) ph->p_vaddr; - l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn)); -+ l->l_ld_readonly = (ph->p_flags & PF_W) == 0; - } - break; - -@@ -1292,7 +1293,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd, - else - l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr); - -- elf_get_dynamic_info (l, NULL); -+ elf_get_dynamic_info (l); - - /* Make sure we are not dlopen'ing an object that has the - DF_1_NOOPEN flag set, or a PIE object. */ -diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c -index 289651b..68ded17 100644 ---- a/elf/dl-reloc-static-pie.c -+++ b/elf/dl-reloc-static-pie.c -@@ -40,7 +40,17 @@ _dl_relocate_static_pie (void) - - /* Read our own dynamic section and fill in the info array. */ - main_map->l_ld = ((void *) main_map->l_addr + elf_machine_dynamic ()); -- elf_get_dynamic_info (main_map, NULL); -+ -+ const ElfW(Phdr) *ph, *phdr = GL(dl_phdr); -+ size_t phnum = GL(dl_phnum); -+ for (ph = phdr; ph < &phdr[phnum]; ++ph) -+ if (ph->p_type == PT_DYNAMIC) -+ { -+ main_map->l_ld_readonly = (ph->p_flags & PF_W) == 0; -+ break; -+ } -+ -+ elf_get_dynamic_info (main_map); - - # ifdef ELF_MACHINE_BEFORE_RTLD_RELOC - ELF_MACHINE_BEFORE_RTLD_RELOC (main_map->l_info); -diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h -index d8ec323..4aa2058 100644 ---- a/elf/get-dynamic-info.h -+++ b/elf/get-dynamic-info.h -@@ -28,7 +28,7 @@ static - auto - #endif - inline void __attribute__ ((unused, always_inline)) --elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp) -+elf_get_dynamic_info (struct link_map *l) - { - #if __ELF_NATIVE_CLASS == 32 - typedef Elf32_Word d_tag_utype; -@@ -69,28 +69,15 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp) - info[i] = dyn; - } - --#define DL_RO_DYN_TEMP_CNT 8 -- --#ifndef DL_RO_DYN_SECTION - /* Don't adjust .dynamic unnecessarily. */ -- if (l->l_addr != 0) -+ if (l->l_addr != 0 && dl_relocate_ld (l)) - { - ElfW(Addr) l_addr = l->l_addr; -- int cnt = 0; - - # define ADJUST_DYN_INFO(tag) \ - do \ - if (info[tag] != NULL) \ -- { \ -- if (temp) \ -- { \ -- temp[cnt].d_tag = info[tag]->d_tag; \ -- temp[cnt].d_un.d_ptr = info[tag]->d_un.d_ptr + l_addr; \ -- info[tag] = temp + cnt++; \ -- } \ -- else \ -- info[tag]->d_un.d_ptr += l_addr; \ -- } \ -+ info[tag]->d_un.d_ptr += l_addr; \ - while (0) - - ADJUST_DYN_INFO (DT_HASH); -@@ -107,9 +94,7 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp) - ADJUST_DYN_INFO (VERSYMIDX (DT_VERSYM)); - ADJUST_DYN_INFO (ADDRIDX (DT_GNU_HASH)); - # undef ADJUST_DYN_INFO -- assert (cnt <= DL_RO_DYN_TEMP_CNT); - } --#endif - if (info[DT_PLTREL] != NULL) - { - #if ELF_MACHINE_NO_RELA -diff --git a/elf/rtld.c b/elf/rtld.c -index 742c413..8d2bba3 100644 ---- a/elf/rtld.c -+++ b/elf/rtld.c -@@ -463,6 +463,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) - #ifndef DONT_USE_BOOTSTRAP_MAP - GL(dl_rtld_map).l_addr = info->l.l_addr; - GL(dl_rtld_map).l_ld = info->l.l_ld; -+ GL(dl_rtld_map).l_ld_readonly = info->l.l_ld_readonly; - memcpy (GL(dl_rtld_map).l_info, info->l.l_info, - sizeof GL(dl_rtld_map).l_info); - GL(dl_rtld_map).l_mach = info->l.l_mach; -@@ -546,7 +547,7 @@ _dl_start (void *arg) - - /* Read our own dynamic section and fill in the info array. */ - bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic (); -- elf_get_dynamic_info (&bootstrap_map, NULL); -+ elf_get_dynamic_info (&bootstrap_map); - - #if NO_TLS_OFFSET != 0 - bootstrap_map.l_tls_offset = NO_TLS_OFFSET; -@@ -1468,6 +1469,7 @@ dl_main (const ElfW(Phdr) *phdr, - /* This tells us where to find the dynamic section, - which tells us everything we need to do. */ - main_map->l_ld = (void *) main_map->l_addr + ph->p_vaddr; -+ main_map->l_ld_readonly = (ph->p_flags & PF_W) == 0; - break; - case PT_INTERP: - /* This "interpreter segment" was used by the program loader to -@@ -1613,7 +1615,7 @@ dl_main (const ElfW(Phdr) *phdr, - if (! rtld_is_main) - { - /* Extract the contents of the dynamic section for easy access. */ -- elf_get_dynamic_info (main_map, NULL); -+ elf_get_dynamic_info (main_map); - - /* If the main map is libc.so, update the base namespace to - refer to this map. If libc.so is loaded later, this happens -diff --git a/elf/setup-vdso.h b/elf/setup-vdso.h -index 86c491e..f44748b 100644 ---- a/elf/setup-vdso.h -+++ b/elf/setup-vdso.h -@@ -33,8 +33,6 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)), - 0, LM_ID_BASE); - if (__glibc_likely (l != NULL)) - { -- static ElfW(Dyn) dyn_temp[DL_RO_DYN_TEMP_CNT] attribute_relro; -- - l->l_phdr = ((const void *) GLRO(dl_sysinfo_dso) - + GLRO(dl_sysinfo_dso)->e_phoff); - l->l_phnum = GLRO(dl_sysinfo_dso)->e_phnum; -@@ -45,6 +43,7 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)), - { - l->l_ld = (void *) ph->p_vaddr; - l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn)); -+ l->l_ld_readonly = (ph->p_flags & PF_W) == 0; - } - else if (ph->p_type == PT_LOAD) - { -@@ -65,7 +64,7 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)), - l->l_map_end += l->l_addr; - l->l_text_end += l->l_addr; - l->l_ld = (void *) ((ElfW(Addr)) l->l_ld + l->l_addr); -- elf_get_dynamic_info (l, dyn_temp); -+ elf_get_dynamic_info (l); - _dl_setup_hash (l); - l->l_relocated = 1; - -diff --git a/elf/tst-ro-dynamic-mod.c b/elf/tst-ro-dynamic-mod.c -new file mode 100644 -index 0000000..6d99925 ---- /dev/null -+++ b/elf/tst-ro-dynamic-mod.c -@@ -0,0 +1,19 @@ -+/* Test case for DSO with readonly dynamic section. -+ Copyright (C) 2021 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 -+ . */ -+ -+int foo = -1; -diff --git a/elf/tst-ro-dynamic-mod.map b/elf/tst-ro-dynamic-mod.map -new file mode 100644 -index 0000000..2fe4a29 ---- /dev/null -+++ b/elf/tst-ro-dynamic-mod.map -@@ -0,0 +1,16 @@ -+SECTIONS -+{ -+ . = SIZEOF_HEADERS; -+ .dynamic : { *(.dynamic) } :text :dynamic -+ .rodata : { *(.data*) *(.bss*) } :text -+ /DISCARD/ : { -+ *(.note.gnu.property) -+ } -+ .note : { *(.note.*) } :text :note -+} -+PHDRS -+{ -+ text PT_LOAD FLAGS(5) FILEHDR PHDRS; -+ dynamic PT_DYNAMIC FLAGS(4); -+ note PT_NOTE FLAGS(4); -+} -diff --git a/elf/tst-ro-dynamic.c b/elf/tst-ro-dynamic.c -new file mode 100644 -index 0000000..3a18f87 ---- /dev/null -+++ b/elf/tst-ro-dynamic.c -@@ -0,0 +1,31 @@ -+/* Test case for DSO with readonly dynamic section. -+ Copyright (C) 2021 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 -+ -+extern int foo; -+ -+static int -+do_test (void) -+{ -+ TEST_COMPARE (foo, -1); -+ return 0; -+} -+ -+#include -diff --git a/include/link.h b/include/link.h -index 7b8250d..484ee6c 100644 ---- a/include/link.h -+++ b/include/link.h -@@ -205,6 +205,7 @@ struct link_map - unsigned int l_free_initfini:1; /* Nonzero if l_initfini can be - freed, ie. not allocated with - the dummy malloc in ld.so. */ -+ unsigned int l_ld_readonly:1; /* Nonzero if dynamic section is readonly. */ - - /* NODELETE status of the map. Only valid for maps of type - lt_loaded. Lazy binding sets l_nodelete_active directly, -@@ -342,6 +343,8 @@ struct link_map - unsigned long long int l_serial; - }; - -+#include -+ - /* Information used by audit modules. For most link maps, this data - immediate follows the link map in memory. For the dynamic linker, - it is allocated separately. See link_map_audit_state in -diff --git a/sysdeps/generic/dl-relocate-ld.h b/sysdeps/generic/dl-relocate-ld.h -new file mode 100644 -index 0000000..5fae206 ---- /dev/null -+++ b/sysdeps/generic/dl-relocate-ld.h -@@ -0,0 +1,32 @@ -+/* Check if dynamic section should be relocated. Generic version. -+ Copyright (C) 2021 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 _DL_RELOCATE_LD_H -+#define _DL_RELOCATE_LD_H -+ -+/* Return true if dynamic section in the shared library L should be -+ relocated. */ -+ -+static inline bool -+dl_relocate_ld (const struct link_map *l) -+{ -+ /* Don't relocate dynamic section if it is readonly */ -+ return !l->l_ld_readonly; -+} -+ -+#endif /* _DL_RELOCATE_LD_H */ -diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h -index 6e50fcd..d49529d 100644 ---- a/sysdeps/generic/ldsodefs.h -+++ b/sysdeps/generic/ldsodefs.h -@@ -75,11 +75,8 @@ __BEGIN_DECLS - have to be accessed via the D_PTR macro. The macro is needed since for - most architectures the entry is already relocated - but for some not - and we need to relocate at access time. */ --#ifdef DL_RO_DYN_SECTION --# define D_PTR(map, i) ((map)->i->d_un.d_ptr + (map)->l_addr) --#else --# define D_PTR(map, i) (map)->i->d_un.d_ptr --#endif -+#define D_PTR(map, i) \ -+ ((map)->i->d_un.d_ptr + (dl_relocate_ld (map) ? 0 : (map)->l_addr)) - - /* Result of the lookup functions and how to retrieve the base address. */ - typedef struct link_map *lookup_t; -diff --git a/sysdeps/mips/dl-relocate-ld.h b/sysdeps/mips/dl-relocate-ld.h -new file mode 100644 -index 0000000..0c18d9a ---- /dev/null -+++ b/sysdeps/mips/dl-relocate-ld.h -@@ -0,0 +1,32 @@ -+/* Check if dynamic section should be relocated. MIPS version. -+ Copyright (C) 2021 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 _DL_RELOCATE_LD_H -+#define _DL_RELOCATE_LD_H -+ -+/* Return true if dynamic section in the shared library L should be -+ relocated. */ -+ -+static inline bool -+dl_relocate_ld (const struct link_map *l) -+{ -+ /* Never relocate dynamic section. */ -+ return false; -+} -+ -+#endif /* _DL_RELOCATE_LD_H */ -diff --git a/sysdeps/mips/ldsodefs.h b/sysdeps/mips/ldsodefs.h -index 4db7c60..36fd09a 100644 ---- a/sysdeps/mips/ldsodefs.h -+++ b/sysdeps/mips/ldsodefs.h -@@ -75,10 +75,6 @@ struct La_mips_64_retval; - struct La_mips_64_retval *, \ - const char *); - --/* The MIPS ABI specifies that the dynamic section has to be read-only. */ -- --#define DL_RO_DYN_SECTION 1 -- - #include_next - - /* The 64-bit MIPS ELF ABI uses an unusual reloc format. Each -diff --git a/sysdeps/riscv/dl-relocate-ld.h b/sysdeps/riscv/dl-relocate-ld.h -new file mode 100644 -index 0000000..1032745 ---- /dev/null -+++ b/sysdeps/riscv/dl-relocate-ld.h -@@ -0,0 +1,32 @@ -+/* Check if dynamic section should be relocated. RISC-V version. -+ Copyright (C) 2021 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 _DL_RELOCATE_LD_H -+#define _DL_RELOCATE_LD_H -+ -+/* Return true if dynamic section in the shared library L should be -+ relocated. */ -+ -+static inline bool -+dl_relocate_ld (const struct link_map *l) -+{ -+ /* Never relocate dynamic section for ABI compatibility. */ -+ return false; -+} -+ -+#endif /* _DL_RELOCATE_LD_H */ -diff --git a/sysdeps/riscv/ldsodefs.h b/sysdeps/riscv/ldsodefs.h -index 0c69671..8947ffe 100644 ---- a/sysdeps/riscv/ldsodefs.h -+++ b/sysdeps/riscv/ldsodefs.h -@@ -38,11 +38,6 @@ struct La_riscv_retval; - struct La_riscv_retval *, \ - const char *); - --/* Although the RISC-V ABI does not specify that the dynamic section has -- to be read-only, it needs to be kept for ABI compatibility. */ -- --#define DL_RO_DYN_SECTION 1 -- - #include_next - - #endif --- -1.8.3.1 - diff --git a/ldconfig-avoid-leak-on-empty-paths-in-config-file.patch b/ldconfig-avoid-leak-on-empty-paths-in-config-file.patch deleted file mode 100644 index c415a470f20ad525d8eaf44e8025ef1804d888ad..0000000000000000000000000000000000000000 --- a/ldconfig-avoid-leak-on-empty-paths-in-config-file.patch +++ /dev/null @@ -1,30 +0,0 @@ -From b0234d79e7d82475d1666f25326ec045c045b3ed Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Tue, 3 Aug 2021 21:10:10 +0530 -Subject: [PATCH] ldconfig: avoid leak on empty paths in config file - -Reviewed-by: Arjun Shankar ---- - elf/ldconfig.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/elf/ldconfig.c b/elf/ldconfig.c -index 1037e8d..b889363 100644 ---- a/elf/ldconfig.c -+++ b/elf/ldconfig.c -@@ -503,7 +503,11 @@ add_dir_1 (const char *line, const char *from_file, int from_line) - entry->path[--i] = '\0'; - - if (i == 0) -- return; -+ { -+ free (entry->path); -+ free (entry); -+ return; -+ } - - char *path = entry->path; - if (opt_chroot != NULL) --- -1.8.3.1 - diff --git a/linux-Revert-the-use-of-sched_getaffinity-on-get_npr.patch b/linux-Revert-the-use-of-sched_getaffinity-on-get_npr.patch deleted file mode 100644 index 17a7a5ce7c3aa2d8f8168c0d7c71f9b99323452c..0000000000000000000000000000000000000000 --- a/linux-Revert-the-use-of-sched_getaffinity-on-get_npr.patch +++ /dev/null @@ -1,206 +0,0 @@ -From 342298278eabc75baabcaced110a11a02c3d3580 Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Mon, 6 Sep 2021 14:19:51 -0300 -Subject: [PATCH] linux: Revert the use of sched_getaffinity on get_nproc (BZ - #28310) - -The use of sched_getaffinity on get_nproc and -sysconf (_SC_NPROCESSORS_ONLN) done in 903bc7dcc2acafc40 (BZ #27645) -breaks the top command in common hypervisor configurations and also -other monitoring tools. - -The main issue using sched_getaffinity changed the symbols semantic -from system-wide scope of online CPUs to per-process one (which can -be changed with kernel cpusets or book parameters in VM). - -This patch reverts mostly of the 903bc7dcc2acafc40, with the -exceptions: - - * No more cached values and atomic updates, since they are inherent - racy. - - * No /proc/cpuinfo fallback, since /proc/stat is already used and - it would require to revert more arch-specific code. - - * The alloca is replace with a static buffer of 1024 bytes. - -So the implementation first consult the sysfs, and fallbacks to procfs. - -Checked on x86_64-linux-gnu. - -Reviewed-by: Florian Weimer ---- - sysdeps/unix/sysv/linux/getsysstats.c | 139 ++++++++++++++++++++++++++++++++-- - 1 file changed, 134 insertions(+), 5 deletions(-) - -diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c -index 1e3d886..15ad91c 100644 ---- a/sysdeps/unix/sysv/linux/getsysstats.c -+++ b/sysdeps/unix/sysv/linux/getsysstats.c -@@ -17,6 +17,8 @@ - . */ - - #include -+#include -+#include - #include - #include - #include -@@ -29,7 +31,7 @@ - #include - - int --__get_nprocs (void) -+__get_nprocs_sched (void) - { - enum - { -@@ -52,14 +54,141 @@ __get_nprocs (void) - atomics are needed). */ - return 2; - } --libc_hidden_def (__get_nprocs) --weak_alias (__get_nprocs, get_nprocs) -+ -+static char * -+next_line (int fd, char *const buffer, char **cp, char **re, -+ char *const buffer_end) -+{ -+ char *res = *cp; -+ char *nl = memchr (*cp, '\n', *re - *cp); -+ if (nl == NULL) -+ { -+ if (*cp != buffer) -+ { -+ if (*re == buffer_end) -+ { -+ memmove (buffer, *cp, *re - *cp); -+ *re = buffer + (*re - *cp); -+ *cp = buffer; -+ -+ ssize_t n = __read_nocancel (fd, *re, buffer_end - *re); -+ if (n < 0) -+ return NULL; -+ -+ *re += n; -+ -+ nl = memchr (*cp, '\n', *re - *cp); -+ while (nl == NULL && *re == buffer_end) -+ { -+ /* Truncate too long lines. */ -+ *re = buffer + 3 * (buffer_end - buffer) / 4; -+ n = __read_nocancel (fd, *re, buffer_end - *re); -+ if (n < 0) -+ return NULL; -+ -+ nl = memchr (*re, '\n', n); -+ **re = '\n'; -+ *re += n; -+ } -+ } -+ else -+ nl = memchr (*cp, '\n', *re - *cp); -+ -+ res = *cp; -+ } -+ -+ if (nl == NULL) -+ nl = *re - 1; -+ } -+ -+ *cp = nl + 1; -+ assert (*cp <= *re); -+ -+ return res == *re ? NULL : res; -+} -+ - - int --__get_nprocs_sched (void) -+__get_nprocs (void) - { -- return __get_nprocs (); -+ enum { buffer_size = 1024 }; -+ char buffer[buffer_size]; -+ char *buffer_end = buffer + buffer_size; -+ char *cp = buffer_end; -+ char *re = buffer_end; -+ -+ const int flags = O_RDONLY | O_CLOEXEC; -+ /* This file contains comma-separated ranges. */ -+ int fd = __open_nocancel ("/sys/devices/system/cpu/online", flags); -+ char *l; -+ int result = 0; -+ if (fd != -1) -+ { -+ l = next_line (fd, buffer, &cp, &re, buffer_end); -+ if (l != NULL) -+ do -+ { -+ char *endp; -+ unsigned long int n = strtoul (l, &endp, 10); -+ if (l == endp) -+ { -+ result = 0; -+ break; -+ } -+ -+ unsigned long int m = n; -+ if (*endp == '-') -+ { -+ l = endp + 1; -+ m = strtoul (l, &endp, 10); -+ if (l == endp) -+ { -+ result = 0; -+ break; -+ } -+ } -+ -+ result += m - n + 1; -+ -+ l = endp; -+ if (l < re && *l == ',') -+ ++l; -+ } -+ while (l < re && *l != '\n'); -+ -+ __close_nocancel_nostatus (fd); -+ -+ if (result > 0) -+ return result; -+ } -+ -+ cp = buffer_end; -+ re = buffer_end; -+ -+ /* Default to an SMP system in case we cannot obtain an accurate -+ number. */ -+ result = 2; -+ -+ fd = __open_nocancel ("/proc/stat", flags); -+ if (fd != -1) -+ { -+ result = 0; -+ -+ while ((l = next_line (fd, buffer, &cp, &re, buffer_end)) != NULL) -+ /* The current format of /proc/stat has all the cpu* entries -+ at the front. We assume here that stays this way. */ -+ if (strncmp (l, "cpu", 3) != 0) -+ break; -+ else if (isdigit (l[3])) -+ ++result; -+ -+ __close_nocancel_nostatus (fd); -+ } -+ -+ return result; - } -+libc_hidden_def (__get_nprocs) -+weak_alias (__get_nprocs, get_nprocs) - - - /* On some architectures it is possible to distinguish between configured --- -1.8.3.1 - diff --git a/linux-Simplify-get_nprocs.patch b/linux-Simplify-get_nprocs.patch deleted file mode 100644 index 55c49b227a6d74218bcbb88e8017cfd8eb2b00b5..0000000000000000000000000000000000000000 --- a/linux-Simplify-get_nprocs.patch +++ /dev/null @@ -1,216 +0,0 @@ -From cda99af14e82b4bb6abaecd717ebe3b57c0aa534 Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Mon, 6 Sep 2021 12:28:24 -0300 -Subject: [PATCH] linux: Simplify get_nprocs - -This patch simplifies the memory allocation code and uses the sched -routines instead of reimplement it. This still uses a stack -allocation buffer, so it can be used on malloc initialization code. - -Linux currently supports at maximum of 4096 cpus for most architectures: - -$ find -iname Kconfig | xargs git grep -A10 -w NR_CPUS | grep -w range -arch/alpha/Kconfig- range 2 32 -arch/arc/Kconfig- range 2 4096 -arch/arm/Kconfig- range 2 16 if DEBUG_KMAP_LOCAL -arch/arm/Kconfig- range 2 32 if !DEBUG_KMAP_LOCAL -arch/arm64/Kconfig- range 2 4096 -arch/csky/Kconfig- range 2 32 -arch/hexagon/Kconfig- range 2 6 if SMP -arch/ia64/Kconfig- range 2 4096 -arch/mips/Kconfig- range 2 256 -arch/openrisc/Kconfig- range 2 32 -arch/parisc/Kconfig- range 2 32 -arch/riscv/Kconfig- range 2 32 -arch/s390/Kconfig- range 2 512 -arch/sh/Kconfig- range 2 32 -arch/sparc/Kconfig- range 2 32 if SPARC32 -arch/sparc/Kconfig- range 2 4096 if SPARC64 -arch/um/Kconfig- range 1 1 -arch/x86/Kconfig-# [NR_CPUS_RANGE_BEGIN ... NR_CPUS_RANGE_END] range. -arch/x86/Kconfig- range NR_CPUS_RANGE_BEGIN NR_CPUS_RANGE_END -arch/xtensa/Kconfig- range 2 32 - -With x86 supporting 8192: - -arch/x86/Kconfig - 976 config NR_CPUS_RANGE_END - 977 int - 978 depends on X86_64 - 979 default 8192 if SMP && CPUMASK_OFFSTACK - 980 default 512 if SMP && !CPUMASK_OFFSTACK - 981 default 1 if !SMP - -So using a maximum of 32k cpu should cover all cases (and I would -expect once we start to have many more CPUs that Linux would provide -a more straightforward way to query for such information). - -A test is added to check if sched_getaffinity can successfully return -with large buffers. - -Checked on x86_64-linux-gnu and i686-linux-gnu. - -Reviewed-by: Florian Weimer -(cherry picked from commit 33099d72e41cf8a129b362e9709eb2be9372d844) ---- - posix/Makefile | 3 +- - posix/tst-sched_getaffinity.c | 48 +++++++++++++++++++++++++ - sysdeps/unix/sysv/linux/getsysstats.c | 68 ++++++++++------------------------- - 3 files changed, 68 insertions(+), 51 deletions(-) - create mode 100644 posix/tst-sched_getaffinity.c - -diff --git a/posix/Makefile b/posix/Makefile -index 059efb3..09460a2 100644 ---- a/posix/Makefile -+++ b/posix/Makefile -@@ -107,7 +107,8 @@ tests := test-errno tstgetopt testfnm runtests runptests \ - tst-sysconf-empty-chroot tst-glob_symlinks tst-fexecve \ - tst-glob-tilde test-ssize-max tst-spawn4 bug-regex37 \ - bug-regex38 tst-regcomp-truncated tst-spawn-chdir \ -- tst-wordexp-nocmd tst-execveat tst-spawn5 -+ tst-wordexp-nocmd tst-execveat tst-spawn5 \ -+ tst-sched_getaffinity - - # Test for the glob symbol version that was replaced in glibc 2.27. - ifeq ($(have-GLIBC_2.26)$(build-shared),yesyes) -diff --git a/posix/tst-sched_getaffinity.c b/posix/tst-sched_getaffinity.c -new file mode 100644 -index 0000000..db9d517 ---- /dev/null -+++ b/posix/tst-sched_getaffinity.c -@@ -0,0 +1,48 @@ -+/* Tests for sched_getaffinity with large buffers. -+ Copyright (C) 2021 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 -+ -+/* NB: this test may fail on system with more than 32k cpus. */ -+ -+static int -+do_test (void) -+{ -+ /* The values are larger than the default cpu_set_t. */ -+ const int bufsize[] = { 1<<11, 1<<12, 1<<13, 1<<14, 1<<15, 1<<16, 1<<17 }; -+ int cpucount[array_length (bufsize)]; -+ -+ for (int i = 0; i < array_length (bufsize); i++) -+ { -+ cpu_set_t *cpuset = CPU_ALLOC (bufsize[i]); -+ TEST_VERIFY (cpuset != NULL); -+ size_t size = CPU_ALLOC_SIZE (bufsize[i]); -+ TEST_COMPARE (sched_getaffinity (0, size, cpuset), 0); -+ cpucount[i] = CPU_COUNT_S (size, cpuset); -+ CPU_FREE (cpuset); -+ } -+ -+ for (int i = 0; i < array_length (cpucount) - 1; i++) -+ TEST_COMPARE (cpucount[i], cpucount[i + 1]); -+ -+ return 0; -+} -+ -+#include -diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c -index 120ce1b..61d20e7 100644 ---- a/sysdeps/unix/sysv/linux/getsysstats.c -+++ b/sysdeps/unix/sysv/linux/getsysstats.c -@@ -29,61 +29,29 @@ - #include - #include - --/* Compute the population count of the entire array. */ --static int --__get_nprocs_count (const unsigned long int *array, size_t length) --{ -- int count = 0; -- for (size_t i = 0; i < length; ++i) -- if (__builtin_add_overflow (count, __builtin_popcountl (array[i]), -- &count)) -- return INT_MAX; -- return count; --} -- --/* __get_nprocs with a large buffer. */ --static int --__get_nprocs_large (void) --{ -- /* This code cannot use scratch_buffer because it is used during -- malloc initialization. */ -- size_t pagesize = GLRO (dl_pagesize); -- unsigned long int *page = __mmap (0, pagesize, PROT_READ | PROT_WRITE, -- MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); -- if (page == MAP_FAILED) -- return 2; -- int r = INTERNAL_SYSCALL_CALL (sched_getaffinity, 0, pagesize, page); -- int count; -- if (r > 0) -- count = __get_nprocs_count (page, pagesize / sizeof (unsigned long int)); -- else if (r == -EINVAL) -- /* One page is still not enough to store the bits. A more-or-less -- arbitrary value. This assumes t hat such large systems never -- happen in practice. */ -- count = GLRO (dl_pagesize) * CHAR_BIT; -- else -- count = 2; -- __munmap (page, GLRO (dl_pagesize)); -- return count; --} -- - int - __get_nprocs (void) - { -- /* Fast path for most systems. The kernel expects a buffer size -- that is a multiple of 8. */ -- unsigned long int small_buffer[1024 / CHAR_BIT / sizeof (unsigned long int)]; -- int r = INTERNAL_SYSCALL_CALL (sched_getaffinity, 0, -- sizeof (small_buffer), small_buffer); -+ enum -+ { -+ max_num_cpus = 32768, -+ cpu_bits_size = CPU_ALLOC_SIZE (32768) -+ }; -+ -+ /* This cannot use malloc because it is used on malloc initialization. */ -+ __cpu_mask cpu_bits[cpu_bits_size / sizeof (__cpu_mask)]; -+ int r = INTERNAL_SYSCALL_CALL (sched_getaffinity, 0, cpu_bits_size, -+ cpu_bits); - if (r > 0) -- return __get_nprocs_count (small_buffer, r / sizeof (unsigned long int)); -+ return CPU_COUNT_S (cpu_bits_size, (cpu_set_t*) cpu_bits); - else if (r == -EINVAL) -- /* The kernel requests a larger buffer to store the data. */ -- return __get_nprocs_large (); -- else -- /* Some other error. 2 is conservative (not a uniprocessor -- system, so atomics are needed). */ -- return 2; -+ /* The input buffer is still not enough to store the number of cpus. This -+ is an arbitrary values assuming such systems should be rare and there -+ is no offline cpus. */ -+ return max_num_cpus; -+ /* Some other error. 2 is conservative (not a uniprocessor system, so -+ atomics are needed). */ -+ return 2; - } - libc_hidden_def (__get_nprocs) - weak_alias (__get_nprocs, get_nprocs) --- -1.8.3.1 - diff --git a/misc-Add-__get_nprocs_sched.patch b/misc-Add-__get_nprocs_sched.patch deleted file mode 100644 index 68e1208c751fb2a38709b900d4b6fb3f2acc11b5..0000000000000000000000000000000000000000 --- a/misc-Add-__get_nprocs_sched.patch +++ /dev/null @@ -1,110 +0,0 @@ -From e870aac8974cda746157a5a3c9f452ccd70da29b Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Mon, 6 Sep 2021 12:22:54 -0300 -Subject: [PATCH] misc: Add __get_nprocs_sched - -This is an internal function meant to return the number of avaliable -processor where the process can scheduled, different than the -__get_nprocs which returns a the system available online CPU. - -The Linux implementation currently only calls __get_nprocs(), which -in tuns calls sched_getaffinity. - -Reviewed-by: Florian Weimer -(cherry picked from commit 11a02b035b464ab6813676adfd19c4a59c36d907) ---- - include/sys/sysinfo.h | 7 ++++++- - malloc/arena.c | 2 +- - misc/getsysstats.c | 6 ++++++ - sysdeps/mach/getsysstats.c | 6 ++++++ - sysdeps/unix/sysv/linux/getsysstats.c | 6 ++++++ - 5 files changed, 25 insertions(+), 2 deletions(-) - -diff --git a/include/sys/sysinfo.h b/include/sys/sysinfo.h -index 7388356..c490561 100644 ---- a/include/sys/sysinfo.h -+++ b/include/sys/sysinfo.h -@@ -9,10 +9,15 @@ - extern int __get_nprocs_conf (void); - libc_hidden_proto (__get_nprocs_conf) - --/* Return number of available processors. */ -+/* Return number of available processors (not all of them will be -+ available to the caller process). */ - extern int __get_nprocs (void); - libc_hidden_proto (__get_nprocs) - -+/* Return the number of available processors which the process can -+ be scheduled. */ -+extern int __get_nprocs_sched (void) attribute_hidden; -+ - /* Return number of physical pages of memory in the system. */ - extern long int __get_phys_pages (void); - libc_hidden_proto (__get_phys_pages) -diff --git a/malloc/arena.c b/malloc/arena.c -index 6674846..f1f0af8 100644 ---- a/malloc/arena.c -+++ b/malloc/arena.c -@@ -879,7 +879,7 @@ arena_get2 (size_t size, mstate avoid_arena) - narenas_limit = mp_.arena_max; - else if (narenas > mp_.arena_test) - { -- int n = __get_nprocs (); -+ int n = __get_nprocs_sched (); - - if (n >= 1) - narenas_limit = NARENAS_FROM_NCORES (n); -diff --git a/misc/getsysstats.c b/misc/getsysstats.c -index 0eedfac..57d9360 100644 ---- a/misc/getsysstats.c -+++ b/misc/getsysstats.c -@@ -45,6 +45,12 @@ weak_alias (__get_nprocs, get_nprocs) - link_warning (get_nprocs, "warning: get_nprocs will always return 1") - - -+int -+__get_nprocs_sched (void) -+{ -+ return 1; -+} -+ - long int - __get_phys_pages (void) - { -diff --git a/sysdeps/mach/getsysstats.c b/sysdeps/mach/getsysstats.c -index 1267f39..cc8023f 100644 ---- a/sysdeps/mach/getsysstats.c -+++ b/sysdeps/mach/getsysstats.c -@@ -62,6 +62,12 @@ __get_nprocs (void) - libc_hidden_def (__get_nprocs) - weak_alias (__get_nprocs, get_nprocs) - -+int -+__get_nprocs_sched (void) -+{ -+ return __get_nprocs (); -+} -+ - /* Return the number of physical pages on the system. */ - long int - __get_phys_pages (void) -diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c -index 1391e36..120ce1b 100644 ---- a/sysdeps/unix/sysv/linux/getsysstats.c -+++ b/sysdeps/unix/sysv/linux/getsysstats.c -@@ -88,6 +88,12 @@ __get_nprocs (void) - libc_hidden_def (__get_nprocs) - weak_alias (__get_nprocs, get_nprocs) - -+int -+__get_nprocs_sched (void) -+{ -+ return __get_nprocs (); -+} -+ - - /* On some architectures it is possible to distinguish between configured - and active cpus. */ --- -1.8.3.1 - diff --git a/mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch b/mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch deleted file mode 100644 index 10622da623b013f68f8975c09485d0a00d6b0242..0000000000000000000000000000000000000000 --- a/mtrace-Fix-output-with-PIE-and-ASLR-BZ-22716.patch +++ /dev/null @@ -1,77 +0,0 @@ -From f2e33c3268db9adf8e57e991676ed0d5ac74e8a8 Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Mon, 23 Aug 2021 08:11:54 +0530 -Subject: [PATCH] mtrace: Fix output with PIE and ASLR [BZ #22716] - -Record only the relative address of the caller in mtrace file. Use -LD_TRACE_PRELINKING to get the executable as well as binary vs -executable load offsets so that we may compute a base to add to the -relative address in the mtrace file. This allows us to get a valid -address to pass to addr2line in all cases. - -Fixes BZ #22716. - -Co-authored-by: John Ogness -Reviewed-by: Andreas Schwab -Reviewed-by: DJ Delorie ---- - malloc/mtrace-impl.c | 6 +++--- - malloc/mtrace.pl | 15 +++++++-------- - 2 files changed, 10 insertions(+), 11 deletions(-) - -diff --git a/malloc/mtrace-impl.c b/malloc/mtrace-impl.c -index 83008ca..f5f19c2 100644 ---- a/malloc/mtrace-impl.c -+++ b/malloc/mtrace-impl.c -@@ -65,9 +65,9 @@ tr_where (const void *caller, Dl_info *info) - offset); - } - -- fprintf (mallstream, "@ %s%s%s[%p] ", info->dli_fname ? : "", -- info->dli_fname ? ":" : "", -- buf, caller); -+ fprintf (mallstream, "@ %s%s%s[0x%" PRIxPTR "] ", -+ info->dli_fname ? : "", info->dli_fname ? ":" : "", buf, -+ caller - info->dli_fbase); - } - else - fprintf (mallstream, "@ [%p] ", caller); -diff --git a/malloc/mtrace.pl b/malloc/mtrace.pl -index 6f49c83..b1073a1 100644 ---- a/malloc/mtrace.pl -+++ b/malloc/mtrace.pl -@@ -75,11 +75,15 @@ if ($#ARGV == 0) { - } else { - $prog = "./$binary"; - } -- if (open (LOCS, "env LD_TRACE_LOADED_OBJECTS=1 $prog |")) { -+ # Set the environment variable LD_TRACE_PRELINKING to an empty string so -+ # that we trigger tracing but do not match with the executable or any of -+ # its dependencies. -+ if (open (LOCS, "env LD_TRACE_PRELINKING= $prog |")) { - while () { - chop; -- if (/^.*=> (.*) .(0x[0123456789abcdef]*).$/) { -+ if (/^.*=> (.*) \((0x[0123456789abcdef]*), (0x[0123456789abcdef]*).*/) { - $locs{$1} = $2; -+ $rel{$1} = hex($2) - hex($3); - } - } - close (LOCS); -@@ -110,12 +114,7 @@ sub location { - my $addr = $2; - my $searchaddr; - return $cache{$addr} if (exists $cache{$addr}); -- if ($locs{$prog} ne "") { -- $searchaddr = sprintf "%#x", $addr - $locs{$prog}; -- } else { -- $searchaddr = $addr; -- $prog = $binary; -- } -+ $searchaddr = sprintf "%#x", hex($addr) + $rel{$prog}; - if ($binary ne "" && open (ADDR, "addr2line -e $prog $searchaddr|")) { - my $line = ; - chomp $line; --- -1.8.3.1 - diff --git a/mtrace-Use-a-static-buffer-for-printing-BZ-25947.patch b/mtrace-Use-a-static-buffer-for-printing-BZ-25947.patch deleted file mode 100644 index 9c25d437166403be1a65a8d6acd48b7c62659215..0000000000000000000000000000000000000000 --- a/mtrace-Use-a-static-buffer-for-printing-BZ-25947.patch +++ /dev/null @@ -1,61 +0,0 @@ -From dc906e94f7033892dadbd91718349f19e1376391 Mon Sep 17 00:00:00 2001 -From: Siddhesh Poyarekar -Date: Thu, 12 Aug 2021 06:38:15 +0530 -Subject: [PATCH] mtrace: Use a static buffer for printing [BZ #25947] - -Use a static buffer for mtrace printing now that it no longer adds to -default libc footprint. - -Reviewed-by: DJ Delorie ---- - malloc/mtrace-impl.c | 14 +++----------- - 1 file changed, 3 insertions(+), 11 deletions(-) - -diff --git a/malloc/mtrace-impl.c b/malloc/mtrace-impl.c -index 0e10ab7..83008ca 100644 ---- a/malloc/mtrace-impl.c -+++ b/malloc/mtrace-impl.c -@@ -34,11 +34,8 @@ - - #include - --#define TRACE_BUFFER_SIZE 512 -- - static FILE *mallstream; - static const char mallenv[] = "MALLOC_TRACE"; --static char *malloc_trace_buffer; - - static void - tr_where (const void *caller, Dl_info *info) -@@ -184,16 +181,13 @@ do_mtrace (void) - mallfile = secure_getenv (mallenv); - if (mallfile != NULL) - { -- char *mtb = malloc (TRACE_BUFFER_SIZE); -- if (mtb == NULL) -- return; -- - mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "wce"); - if (mallstream != NULL) - { - /* Be sure it doesn't malloc its buffer! */ -- malloc_trace_buffer = mtb; -- setvbuf (mallstream, malloc_trace_buffer, _IOFBF, TRACE_BUFFER_SIZE); -+ static char tracebuf [512]; -+ -+ setvbuf (mallstream, tracebuf, _IOFBF, sizeof (tracebuf)); - fprintf (mallstream, "= Start\n"); - if (!added_atexit_handler) - { -@@ -203,8 +197,6 @@ do_mtrace (void) - } - __malloc_debug_enable (MALLOC_MTRACE_HOOK); - } -- else -- free (mtb); - } - } - --- -1.8.3.1 - diff --git a/nis-Fix-leak-on-realloc-failure-in-nis_getnames-BZ-2.patch b/nis-Fix-leak-on-realloc-failure-in-nis_getnames-BZ-2.patch deleted file mode 100644 index b72b47476112e7583629e61aeada649eadf423d2..0000000000000000000000000000000000000000 --- a/nis-Fix-leak-on-realloc-failure-in-nis_getnames-BZ-2.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 60698263122b7c54ded3f70a466176e17a529480 Mon Sep 17 00:00:00 2001 -From: Robbie Harwood -Date: Wed, 28 Jul 2021 14:23:32 -0400 -Subject: [PATCH] nis: Fix leak on realloc failure in nis_getnames [BZ #28150] - -If pos >= count but realloc fails, tmp will not have been placed in -getnames[pos] yet, and so will not be freed in free_null. Detected -by Coverity. - -Also remove misleading comment from nis_getnames(), since it actually -did properly release getnames when out of memory. - -Tested-by: Carlos O'Donell ---- - nis/nis_subr.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/nis/nis_subr.c b/nis/nis_subr.c -index dd0e300..6784fc3 100644 ---- a/nis/nis_subr.c -+++ b/nis/nis_subr.c -@@ -103,9 +103,6 @@ count_dots (const_nis_name str) - return count; - } - --/* If we run out of memory, we don't give already allocated memory -- free. The overhead for bringing getnames back in a safe state to -- free it is to big. */ - nis_name * - nis_getnames (const_nis_name name) - { -@@ -271,7 +268,10 @@ nis_getnames (const_nis_name name) - nis_name *newp = realloc (getnames, - (count + 1) * sizeof (char *)); - if (__glibc_unlikely (newp == NULL)) -- goto free_null; -+ { -+ free (tmp); -+ goto free_null; -+ } - getnames = newp; - } - getnames[pos] = tmp; --- -1.8.3.1 - diff --git a/nptl-Add-one-more-barrier-to-nptl-tst-create1.patch b/nptl-Add-one-more-barrier-to-nptl-tst-create1.patch deleted file mode 100644 index e18a8bc16f10c229f285c799530b66c5fcd119fe..0000000000000000000000000000000000000000 --- a/nptl-Add-one-more-barrier-to-nptl-tst-create1.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 5cc338565479a620244c2f8ff35956629c4dbf81 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Fri, 10 Dec 2021 05:14:24 +0100 -Subject: [PATCH] nptl: Add one more barrier to nptl/tst-create1 - -Without the bar_ctor_finish barrier, it was possible that thread2 -re-locked user_lock before ctor had a chance to lock it. ctor then -blocked in its locking operation, xdlopen from the main thread -did not return, and thread2 was stuck waiting in bar_dtor: - -thread 1: started. -thread 2: started. -thread 2: locked user_lock. -constructor started: 0. -thread 1: in ctor: started. -thread 3: started. -thread 3: done. -thread 2: unlocked user_lock. -thread 2: locked user_lock. - -Fixes the test in commit 83b5323261bb72313bffcf37476c1b8f0847c736 -("elf: Avoid deadlock between pthread_create and ctors [BZ #28357]"). - -Reviewed-by: Szabolcs Nagy ---- - sysdeps/pthread/tst-create1.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/sysdeps/pthread/tst-create1.c b/sysdeps/pthread/tst-create1.c -index 932586c..763ded8 100644 ---- a/sysdeps/pthread/tst-create1.c -+++ b/sysdeps/pthread/tst-create1.c -@@ -33,6 +33,7 @@ thread 2: lock(user_lock) -> pthread_create - */ - - static pthread_barrier_t bar_ctor; -+static pthread_barrier_t bar_ctor_finish; - static pthread_barrier_t bar_dtor; - static pthread_mutex_t user_lock = PTHREAD_MUTEX_INITIALIZER; - -@@ -46,6 +47,7 @@ ctor (void) - xpthread_mutex_unlock (&user_lock); - dprintf (1, "thread 1: in ctor: unlocked user_lock.\n"); - dprintf (1, "thread 1: in ctor: done.\n"); -+ xpthread_barrier_wait (&bar_ctor_finish); - } - - void -@@ -81,6 +83,7 @@ thread2 (void *a) - xpthread_mutex_unlock (&user_lock); - dprintf (1, "thread 2: unlocked user_lock.\n"); - xpthread_join (t3); -+ xpthread_barrier_wait (&bar_ctor_finish); - - xpthread_mutex_lock (&user_lock); - dprintf (1, "thread 2: locked user_lock.\n"); -@@ -99,6 +102,7 @@ thread1 (void) - { - dprintf (1, "thread 1: started.\n"); - xpthread_barrier_init (&bar_ctor, NULL, 2); -+ xpthread_barrier_init (&bar_ctor_finish, NULL, 2); - xpthread_barrier_init (&bar_dtor, NULL, 2); - pthread_t t2 = xpthread_create (0, thread2, 0); - void *p = xdlopen ("tst-create1mod.so", RTLD_NOW | RTLD_GLOBAL); --- -1.8.3.1 - diff --git a/nptl-Avoid-setxid-deadlock-with-blocked-signals-in-t.patch b/nptl-Avoid-setxid-deadlock-with-blocked-signals-in-t.patch deleted file mode 100644 index e582b7042189d3a23db9ff767379e51cfdd56386..0000000000000000000000000000000000000000 --- a/nptl-Avoid-setxid-deadlock-with-blocked-signals-in-t.patch +++ /dev/null @@ -1,137 +0,0 @@ -From 2849e2f53311b66853cb5159b64cba2bddbfb854 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Thu, 23 Sep 2021 09:55:54 +0200 -Subject: [PATCH] nptl: Avoid setxid deadlock with blocked signals in thread - exit [BZ #28361] - -As part of the fix for bug 12889, signals are blocked during -thread exit, so that application code cannot run on the thread that -is about to exit. This would cause problems if the application -expected signals to be delivered after the signal handler revealed -the thread to still exist, despite pthread_kill can no longer be used -to send signals to it. However, glibc internally uses the SIGSETXID -signal in a way that is incompatible with signal blocking, due to the -way the setxid handshake delays thread exit until the setxid operation -has completed. With a blocked SIGSETXID, the handshake can never -complete, causing a deadlock. - -As a band-aid, restore the previous handshake protocol by not blocking -SIGSETXID during thread exit. - -The new test sysdeps/pthread/tst-pthread-setuid-loop.c is based on -a downstream test by Martin Osvald. - -Reviewed-by: Carlos O'Donell -Tested-by: Carlos O'Donell ---- - nptl/pthread_create.c | 12 +++++- - sysdeps/pthread/Makefile | 1 + - sysdeps/pthread/tst-pthread-setuid-loop.c | 61 +++++++++++++++++++++++++++++++ - 3 files changed, 72 insertions(+), 2 deletions(-) - create mode 100644 sysdeps/pthread/tst-pthread-setuid-loop.c - -diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c -index a559f86..d6ea43a 100644 ---- a/nptl/pthread_create.c -+++ b/nptl/pthread_create.c -@@ -487,8 +487,16 @@ start_thread (void *arg) - - /* This prevents sending a signal from this thread to itself during - its final stages. This must come after the exit call above -- because atexit handlers must not run with signals blocked. */ -- __libc_signal_block_all (NULL); -+ because atexit handlers must not run with signals blocked. -+ -+ Do not block SIGSETXID. The setxid handshake below expects the -+ signal to be delivered. (SIGSETXID cannot run application code, -+ nor does it use pthread_kill.) Reuse the pd->sigmask space for -+ computing the signal mask, to save stack space. */ -+ __sigfillset (&pd->sigmask); -+ __sigdelset (&pd->sigmask, SIGSETXID); -+ INTERNAL_SYSCALL_CALL (rt_sigprocmask, SIG_BLOCK, &pd->sigmask, NULL, -+ __NSIG_BYTES); - - /* Tell __pthread_kill_internal that this thread is about to exit. - If there is a __pthread_kill_internal in progress, this delays -diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile -index 48dba71..d4bd2d4 100644 ---- a/sysdeps/pthread/Makefile -+++ b/sysdeps/pthread/Makefile -@@ -118,6 +118,7 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \ - tst-unload \ - tst-unwind-thread \ - tst-pt-vfork1 tst-pt-vfork2 tst-vfork1x tst-vfork2x \ -+ tst-pthread-setuid-loop \ - tst-pthread_cancel-exited \ - tst-pthread_cancel-select-loop \ - tst-pthread_kill-exited \ -diff --git a/sysdeps/pthread/tst-pthread-setuid-loop.c b/sysdeps/pthread/tst-pthread-setuid-loop.c -new file mode 100644 -index 0000000..fda2a49 ---- /dev/null -+++ b/sysdeps/pthread/tst-pthread-setuid-loop.c -@@ -0,0 +1,61 @@ -+/* Test that setuid, pthread_create, thread exit do not deadlock (bug 28361). -+ Copyright (C) 2021 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 -+ -+/* How many threads to launch during each iteration. */ -+enum { threads = 4 }; -+ -+/* How many iterations to perform. This value seems to reproduce -+ bug 28361 in a bout one in three runs. */ -+enum { iterations = 5000 }; -+ -+/* Cache of the real user ID used by setuid_thread. */ -+static uid_t uid; -+ -+/* Start routine for the threads. */ -+static void * -+setuid_thread (void *closure) -+{ -+ TEST_COMPARE (setuid (uid), 0); -+ return NULL; -+} -+ -+static int -+do_test (void) -+{ -+ /* The setxid machinery is still invoked even if the UID is -+ unchanged. (The kernel might reset other credentials as part of -+ the system call.) */ -+ uid = getuid (); -+ -+ for (int i = 0; i < iterations; ++i) -+ { -+ pthread_t thread_ids[threads]; -+ for (int j = 0; j < threads; ++j) -+ thread_ids[j] = xpthread_create (NULL, setuid_thread, NULL); -+ for (int j = 0; j < threads; ++j) -+ xpthread_join (thread_ids[j]); -+ } -+ -+ return 0; -+} -+ -+#include --- -1.8.3.1 - diff --git a/nptl-Fix-race-between-pthread_kill-and-thread-exit-b.patch b/nptl-Fix-race-between-pthread_kill-and-thread-exit-b.patch deleted file mode 100644 index 3acbe2325cbb41db515f6a50648ef13d118acdaf..0000000000000000000000000000000000000000 --- a/nptl-Fix-race-between-pthread_kill-and-thread-exit-b.patch +++ /dev/null @@ -1,424 +0,0 @@ -From 526c3cf11ee9367344b6b15d669e4c3cb461a2be Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Mon, 13 Sep 2021 11:06:08 +0200 -Subject: [PATCH] nptl: Fix race between pthread_kill and thread exit (bug - 12889) - -A new thread exit lock and flag are introduced. They are used to -detect that the thread is about to exit or has exited in -__pthread_kill_internal, and the signal is not sent in this case. - -The test sysdeps/pthread/tst-pthread_cancel-select-loop.c is derived -from a downstream test originally written by Marek Polacek. - -Reviewed-by: Adhemerval Zanella ---- - nptl/allocatestack.c | 3 + - nptl/descr.h | 6 ++ - nptl/pthread_create.c | 14 +++ - nptl/pthread_kill.c | 65 +++++++----- - sysdeps/pthread/Makefile | 2 + - sysdeps/pthread/tst-pthread_cancel-select-loop.c | 87 ++++++++++++++++ - sysdeps/pthread/tst-pthread_kill-exiting.c | 123 +++++++++++++++++++++++ - 7 files changed, 275 insertions(+), 25 deletions(-) - create mode 100644 sysdeps/pthread/tst-pthread_cancel-select-loop.c - create mode 100644 sysdeps/pthread/tst-pthread_kill-exiting.c - -diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c -index 0356993..fa81007 100644 ---- a/nptl/allocatestack.c -+++ b/nptl/allocatestack.c -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include - - /* Default alignment of stack. */ - #ifndef STACK_ALIGN -@@ -126,6 +127,8 @@ get_cached_stack (size_t *sizep, void **memp) - /* No pending event. */ - result->nextevent = NULL; - -+ result->exiting = false; -+ __libc_lock_init (result->exit_lock); - result->tls_state = (struct tls_internal_t) { 0 }; - - /* Clear the DTV. */ -diff --git a/nptl/descr.h b/nptl/descr.h -index e1c8831..41ee56f 100644 ---- a/nptl/descr.h -+++ b/nptl/descr.h -@@ -395,6 +395,12 @@ struct pthread - PTHREAD_CANCEL_ASYNCHRONOUS). */ - unsigned char canceltype; - -+ /* Used in __pthread_kill_internal to detected a thread that has -+ exited or is about to exit. exit_lock must only be acquired -+ after blocking signals. */ -+ bool exiting; -+ int exit_lock; /* A low-level lock (for use with __libc_lock_init etc). */ -+ - /* Used on strsignal. */ - struct tls_internal_t tls_state; - -diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c -index 7607f36..a559f86 100644 ---- a/nptl/pthread_create.c -+++ b/nptl/pthread_create.c -@@ -36,6 +36,7 @@ - #include - #include - #include -+#include - - #include - -@@ -484,6 +485,19 @@ start_thread (void *arg) - /* This was the last thread. */ - exit (0); - -+ /* This prevents sending a signal from this thread to itself during -+ its final stages. This must come after the exit call above -+ because atexit handlers must not run with signals blocked. */ -+ __libc_signal_block_all (NULL); -+ -+ /* Tell __pthread_kill_internal that this thread is about to exit. -+ If there is a __pthread_kill_internal in progress, this delays -+ the thread exit until the signal has been queued by the kernel -+ (so that the TID used to send it remains valid). */ -+ __libc_lock_lock (pd->exit_lock); -+ pd->exiting = true; -+ __libc_lock_unlock (pd->exit_lock); -+ - #ifndef __ASSUME_SET_ROBUST_LIST - /* If this thread has any robust mutexes locked, handle them now. */ - # if __PTHREAD_MUTEX_HAVE_PREV -diff --git a/nptl/pthread_kill.c b/nptl/pthread_kill.c -index 5d4c86f..fb7862e 100644 ---- a/nptl/pthread_kill.c -+++ b/nptl/pthread_kill.c -@@ -16,6 +16,7 @@ - License along with the GNU C Library; if not, see - . */ - -+#include - #include - #include - #include -@@ -23,37 +24,51 @@ - int - __pthread_kill_internal (pthread_t threadid, int signo) - { -- pid_t tid; - struct pthread *pd = (struct pthread *) threadid; -- - if (pd == THREAD_SELF) -- /* It is a special case to handle raise() implementation after a vfork -- call (which does not update the PD tid field). */ -- tid = INLINE_SYSCALL_CALL (gettid); -- else -- /* Force load of pd->tid into local variable or register. Otherwise -- if a thread exits between ESRCH test and tgkill, we might return -- EINVAL, because pd->tid would be cleared by the kernel. */ -- tid = atomic_forced_read (pd->tid); -- -- int val; -- if (__glibc_likely (tid > 0)) - { -- pid_t pid = __getpid (); -- -- val = INTERNAL_SYSCALL_CALL (tgkill, pid, tid, signo); -- val = (INTERNAL_SYSCALL_ERROR_P (val) -- ? INTERNAL_SYSCALL_ERRNO (val) : 0); -+ /* Use the actual TID from the kernel, so that it refers to the -+ current thread even if called after vfork. There is no -+ signal blocking in this case, so that the signal is delivered -+ immediately, before __pthread_kill_internal returns: a signal -+ sent to the thread itself needs to be delivered -+ synchronously. (It is unclear if Linux guarantees the -+ delivery of all pending signals after unblocking in the code -+ below. POSIX only guarantees delivery of a single signal, -+ which may not be the right one.) */ -+ pid_t tid = INTERNAL_SYSCALL_CALL (gettid); -+ int ret = INTERNAL_SYSCALL_CALL (kill, tid, signo); -+ return INTERNAL_SYSCALL_ERROR_P (ret) ? INTERNAL_SYSCALL_ERRNO (ret) : 0; - } -+ -+ /* Block all signals, as required by pd->exit_lock. */ -+ sigset_t old_mask; -+ __libc_signal_block_all (&old_mask); -+ __libc_lock_lock (pd->exit_lock); -+ -+ int ret; -+ if (pd->exiting) -+ /* The thread is about to exit (or has exited). Sending the -+ signal is either not observable (the target thread has already -+ blocked signals at this point), or it will fail, or it might be -+ delivered to a new, unrelated thread that has reused the TID. -+ So do not actually send the signal. Do not report an error -+ because the threadid argument is still valid (the thread ID -+ lifetime has not ended), and ESRCH (for example) would be -+ misleading. */ -+ ret = 0; - else -- /* The kernel reports that the thread has exited. POSIX specifies -- the ESRCH error only for the case when the lifetime of a thread -- ID has ended, but calling pthread_kill on such a thread ID is -- undefined in glibc. Therefore, do not treat kernel thread exit -- as an error. */ -- val = 0; -+ { -+ /* Using tgkill is a safety measure. pd->exit_lock ensures that -+ the target thread cannot exit. */ -+ ret = INTERNAL_SYSCALL_CALL (tgkill, __getpid (), pd->tid, signo); -+ ret = INTERNAL_SYSCALL_ERROR_P (ret) ? INTERNAL_SYSCALL_ERRNO (ret) : 0; -+ } -+ -+ __libc_lock_unlock (pd->exit_lock); -+ __libc_signal_restore_set (&old_mask); - -- return val; -+ return ret; - } - - int -diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile -index dedfa0d..48dba71 100644 ---- a/sysdeps/pthread/Makefile -+++ b/sysdeps/pthread/Makefile -@@ -119,7 +119,9 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \ - tst-unwind-thread \ - tst-pt-vfork1 tst-pt-vfork2 tst-vfork1x tst-vfork2x \ - tst-pthread_cancel-exited \ -+ tst-pthread_cancel-select-loop \ - tst-pthread_kill-exited \ -+ tst-pthread_kill-exiting \ - # tests - - tests-time64 := \ -diff --git a/sysdeps/pthread/tst-pthread_cancel-select-loop.c b/sysdeps/pthread/tst-pthread_cancel-select-loop.c -new file mode 100644 -index 0000000..a620875 ---- /dev/null -+++ b/sysdeps/pthread/tst-pthread_cancel-select-loop.c -@@ -0,0 +1,87 @@ -+/* Test that pthread_cancel succeeds during thread exit. -+ Copyright (C) 2021 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 -+ . */ -+ -+/* This test tries to trigger an internal race condition in -+ pthread_cancel, where the cancellation signal is sent after the -+ thread has begun the cancellation process. This can result in a -+ spurious ESRCH error. For the original bug 12889, the window is -+ quite small, so the bug was not reproduced in every run. */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Set to true by timeout_thread_function when the test should -+ terminate. */ -+static bool timeout; -+ -+static void * -+timeout_thread_function (void *unused) -+{ -+ usleep (5 * 1000 * 1000); -+ __atomic_store_n (&timeout, true, __ATOMIC_RELAXED); -+ return NULL; -+} -+ -+/* Used for blocking the select function below. */ -+static int pipe_fds[2]; -+ -+static void * -+canceled_thread_function (void *unused) -+{ -+ while (true) -+ { -+ fd_set rfs; -+ fd_set wfs; -+ fd_set efs; -+ FD_ZERO (&rfs); -+ FD_ZERO (&wfs); -+ FD_ZERO (&efs); -+ FD_SET (pipe_fds[0], &rfs); -+ -+ /* If the cancellation request is recognized early, the thread -+ begins exiting while the cancellation signal arrives. */ -+ select (FD_SETSIZE, &rfs, &wfs, &efs, NULL); -+ } -+ return NULL; -+} -+ -+static int -+do_test (void) -+{ -+ xpipe (pipe_fds); -+ pthread_t thr_timeout = xpthread_create (NULL, timeout_thread_function, NULL); -+ -+ while (!__atomic_load_n (&timeout, __ATOMIC_RELAXED)) -+ { -+ pthread_t thr = xpthread_create (NULL, canceled_thread_function, NULL); -+ xpthread_cancel (thr); -+ TEST_VERIFY (xpthread_join (thr) == PTHREAD_CANCELED); -+ } -+ -+ xpthread_join (thr_timeout); -+ xclose (pipe_fds[0]); -+ xclose (pipe_fds[1]); -+ return 0; -+} -+ -+#include -diff --git a/sysdeps/pthread/tst-pthread_kill-exiting.c b/sysdeps/pthread/tst-pthread_kill-exiting.c -new file mode 100644 -index 0000000..f803e94 ---- /dev/null -+++ b/sysdeps/pthread/tst-pthread_kill-exiting.c -@@ -0,0 +1,123 @@ -+/* Test that pthread_kill succeeds during thread exit. -+ Copyright (C) 2021 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 -+ . */ -+ -+/* This test verifies that pthread_kill for a thread that is exiting -+ succeeds (with or without actually delivering the signal). */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Set to true by timeout_thread_function when the test should -+ terminate. */ -+static bool timeout; -+ -+static void * -+timeout_thread_function (void *unused) -+{ -+ usleep (1000 * 1000); -+ __atomic_store_n (&timeout, true, __ATOMIC_RELAXED); -+ return NULL; -+} -+ -+/* Used to synchronize the sending threads with the target thread and -+ main thread. */ -+static pthread_barrier_t barrier_1; -+static pthread_barrier_t barrier_2; -+ -+/* The target thread to which signals are to be sent. */ -+static pthread_t target_thread; -+ -+/* Set by the main thread to true after timeout has been set to -+ true. */ -+static bool exiting; -+ -+static void * -+sender_thread_function (void *unused) -+{ -+ while (true) -+ { -+ /* Wait until target_thread has been initialized. The target -+ thread and main thread participate in this barrier. */ -+ xpthread_barrier_wait (&barrier_1); -+ -+ if (exiting) -+ break; -+ -+ xpthread_kill (target_thread, SIGUSR1); -+ -+ /* Communicate that the signal has been sent. The main thread -+ participates in this barrier. */ -+ xpthread_barrier_wait (&barrier_2); -+ } -+ return NULL; -+} -+ -+static void * -+target_thread_function (void *unused) -+{ -+ target_thread = pthread_self (); -+ xpthread_barrier_wait (&barrier_1); -+ return NULL; -+} -+ -+static int -+do_test (void) -+{ -+ xsignal (SIGUSR1, SIG_IGN); -+ -+ pthread_t thr_timeout = xpthread_create (NULL, timeout_thread_function, NULL); -+ -+ pthread_t threads[4]; -+ xpthread_barrier_init (&barrier_1, NULL, array_length (threads) + 2); -+ xpthread_barrier_init (&barrier_2, NULL, array_length (threads) + 1); -+ -+ for (int i = 0; i < array_length (threads); ++i) -+ threads[i] = xpthread_create (NULL, sender_thread_function, NULL); -+ -+ while (!__atomic_load_n (&timeout, __ATOMIC_RELAXED)) -+ { -+ xpthread_create (NULL, target_thread_function, NULL); -+ -+ /* Wait for the target thread to be set up and signal sending to -+ start. */ -+ xpthread_barrier_wait (&barrier_1); -+ -+ /* Wait for signal sending to complete. */ -+ xpthread_barrier_wait (&barrier_2); -+ -+ xpthread_join (target_thread); -+ } -+ -+ exiting = true; -+ -+ /* Signal the sending threads to exit. */ -+ xpthread_create (NULL, target_thread_function, NULL); -+ xpthread_barrier_wait (&barrier_1); -+ -+ for (int i = 0; i < array_length (threads); ++i) -+ xpthread_join (threads[i]); -+ xpthread_join (thr_timeout); -+ -+ return 0; -+} -+ -+#include --- -1.8.3.1 - diff --git a/nptl-Fix-type-of-pthread_mutexattr_getrobust_np-pthr.patch b/nptl-Fix-type-of-pthread_mutexattr_getrobust_np-pthr.patch deleted file mode 100644 index b92e3c5ac066bdafbd925fb7da27dbc8138f8c79..0000000000000000000000000000000000000000 --- a/nptl-Fix-type-of-pthread_mutexattr_getrobust_np-pthr.patch +++ /dev/null @@ -1,37 +0,0 @@ -From f3e664563361dc17530113b3205998d1f19dc4d9 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Tue, 21 Sep 2021 07:12:56 +0200 -Subject: [PATCH] nptl: Fix type of pthread_mutexattr_getrobust_np, - pthread_mutexattr_setrobust_np (bug 28036) - -Reviewed-by: Carlos O'Donell -Tested-by: Carlos O'Donell ---- - sysdeps/nptl/pthread.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h -index f1b7f2b..43146e9 100644 ---- a/sysdeps/nptl/pthread.h -+++ b/sysdeps/nptl/pthread.h -@@ -933,7 +933,7 @@ extern int pthread_mutexattr_getrobust (const pthread_mutexattr_t *__attr, - # ifdef __USE_GNU - # ifdef __REDIRECT_NTH - extern int __REDIRECT_NTH (pthread_mutexattr_getrobust_np, -- (pthread_mutex_t *, int *), -+ (pthread_mutexattr_t *, int *), - pthread_mutexattr_getrobust) __nonnull ((1)) - __attribute_deprecated_msg__ ("\ - pthread_mutexattr_getrobust_np is deprecated, use pthread_mutexattr_getrobust"); -@@ -949,7 +949,7 @@ extern int pthread_mutexattr_setrobust (pthread_mutexattr_t *__attr, - # ifdef __USE_GNU - # ifdef __REDIRECT_NTH - extern int __REDIRECT_NTH (pthread_mutexattr_setrobust_np, -- (pthread_mutex_t *, int), -+ (pthread_mutexattr_t *, int), - pthread_mutexattr_setrobust) __nonnull ((1)) - __attribute_deprecated_msg__ ("\ - pthread_mutexattr_setrobust_np is deprecated, use pthread_mutexattr_setrobust"); --- -1.8.3.1 - diff --git a/nptl-pthread_kill-must-send-signals-to-a-specific-th.patch b/nptl-pthread_kill-must-send-signals-to-a-specific-th.patch deleted file mode 100644 index 87683c361626d662a809dea2215bbd596b18012a..0000000000000000000000000000000000000000 --- a/nptl-pthread_kill-must-send-signals-to-a-specific-th.patch +++ /dev/null @@ -1,162 +0,0 @@ -From eae81d70574e923ce3c59078b8df857ae192efa6 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Fri, 1 Oct 2021 18:16:41 +0200 -Subject: [PATCH] nptl: pthread_kill must send signals to a specific thread [BZ - #28407] - -The choice between the kill vs tgkill system calls is not just about -the TID reuse race, but also about whether the signal is sent to the -whole process (and any thread in it) or to a specific thread. - -This was caught by the openposix test suite: - - LTP: openposix test suite - FAIL: SIGUSR1 is member of new thread pendingset. - - -Fixes commit 526c3cf11ee9367344b6b15d669e4c3cb461a2be ("nptl: Fix race -between pthread_kill and thread exit (bug 12889)"). - -Reviewed-by: Carlos O'Donell -Tested-by: Carlos O'Donell ---- - nptl/pthread_kill.c | 4 +- - sysdeps/pthread/Makefile | 1 + - sysdeps/pthread/tst-pthread-raise-blocked-self.c | 92 ++++++++++++++++++++++++ - 3 files changed, 94 insertions(+), 3 deletions(-) - create mode 100644 sysdeps/pthread/tst-pthread-raise-blocked-self.c - -diff --git a/nptl/pthread_kill.c b/nptl/pthread_kill.c -index a44dc8f..35bf1f9 100644 ---- a/nptl/pthread_kill.c -+++ b/nptl/pthread_kill.c -@@ -40,7 +40,7 @@ __pthread_kill_implementation (pthread_t threadid, int signo, int no_tid) - below. POSIX only guarantees delivery of a single signal, - which may not be the right one.) */ - pid_t tid = INTERNAL_SYSCALL_CALL (gettid); -- int ret = INTERNAL_SYSCALL_CALL (kill, tid, signo); -+ int ret = INTERNAL_SYSCALL_CALL (tgkill, __getpid (), tid, signo); - return INTERNAL_SYSCALL_ERROR_P (ret) ? INTERNAL_SYSCALL_ERRNO (ret) : 0; - } - -@@ -59,8 +59,6 @@ __pthread_kill_implementation (pthread_t threadid, int signo, int no_tid) - ret = no_tid; - else - { -- /* Using tgkill is a safety measure. pd->exit_lock ensures that -- the target thread cannot exit. */ - ret = INTERNAL_SYSCALL_CALL (tgkill, __getpid (), pd->tid, signo); - ret = INTERNAL_SYSCALL_ERROR_P (ret) ? INTERNAL_SYSCALL_ERRNO (ret) : 0; - } -diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile -index d4bd2d4..0af9c59 100644 ---- a/sysdeps/pthread/Makefile -+++ b/sysdeps/pthread/Makefile -@@ -121,6 +121,7 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \ - tst-pthread-setuid-loop \ - tst-pthread_cancel-exited \ - tst-pthread_cancel-select-loop \ -+ tst-pthread-raise-blocked-self \ - tst-pthread_kill-exited \ - tst-pthread_kill-exiting \ - # tests -diff --git a/sysdeps/pthread/tst-pthread-raise-blocked-self.c b/sysdeps/pthread/tst-pthread-raise-blocked-self.c -new file mode 100644 -index 0000000..128e1a6 ---- /dev/null -+++ b/sysdeps/pthread/tst-pthread-raise-blocked-self.c -@@ -0,0 +1,92 @@ -+/* Test that raise sends signal to current thread even if blocked. -+ Copyright (C) 2021 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 -+ -+/* Used to create a dummy thread ID distinct from all other thread -+ IDs. */ -+static void * -+noop (void *ignored) -+{ -+ return NULL; -+} -+ -+static volatile pthread_t signal_thread; -+ -+static void -+signal_handler (int signo) -+{ -+ signal_thread = pthread_self (); -+} -+ -+/* Used to ensure that waiting_thread has launched and can accept -+ signals. */ -+static pthread_barrier_t barrier; -+ -+static void * -+waiting_thread (void *ignored) -+{ -+ xpthread_barrier_wait (&barrier); -+ pause (); -+ return NULL; -+} -+ -+static int -+do_test (void) -+{ -+ xsignal (SIGUSR1, signal_handler); -+ xpthread_barrier_init (&barrier, NULL, 2); -+ -+ /* Distinct thread ID value to */ -+ pthread_t dummy = xpthread_create (NULL, noop, NULL); -+ signal_thread = dummy; -+ -+ pthread_t helper = xpthread_create (NULL, waiting_thread, NULL); -+ -+ /* Make sure that the thread is running. */ -+ xpthread_barrier_wait (&barrier); -+ -+ /* Block signals on this thread. */ -+ sigset_t set; -+ sigfillset (&set); -+ xpthread_sigmask (SIG_BLOCK, &set, NULL); -+ -+ /* Send the signal to this thread. It must not be delivered. */ -+ raise (SIGUSR1); -+ TEST_VERIFY (signal_thread == dummy); -+ -+ /* Wait a bit to give a chance for signal delivery (increases -+ chances of failure with bug 28407). */ -+ usleep (50 * 1000); -+ -+ /* Unblocking should cause synchronous delivery of the signal. */ -+ xpthread_sigmask (SIG_UNBLOCK, &set, NULL); -+ TEST_VERIFY (signal_thread == pthread_self ()); -+ -+ xpthread_cancel (helper); -+ xpthread_join (helper); -+ xpthread_join (dummy); -+ return 0; -+} -+ -+#include --- -1.8.3.1 - diff --git a/nptl-pthread_kill-needs-to-return-ESRCH-for-old-prog.patch b/nptl-pthread_kill-needs-to-return-ESRCH-for-old-prog.patch deleted file mode 100644 index d52abb8c51e80541d5ba7f96317ada368aa0c39d..0000000000000000000000000000000000000000 --- a/nptl-pthread_kill-needs-to-return-ESRCH-for-old-prog.patch +++ /dev/null @@ -1,142 +0,0 @@ -From 95dba35bf05e4a5d69dfae5e9c9d4df3646a7f93 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Mon, 20 Sep 2021 14:56:08 +0200 -Subject: [PATCH] nptl: pthread_kill needs to return ESRCH for old programs - (bug 19193) - -The fix for bug 19193 breaks some old applications which appear -to use pthread_kill to probe if a thread is still running, something -that is not supported by POSIX. ---- - nptl/pthread_kill.c | 37 ++++++++++++++++++++++++------- - sysdeps/pthread/tst-pthread_kill-exited.c | 21 ++++++++++++++++-- - 2 files changed, 48 insertions(+), 10 deletions(-) - -diff --git a/nptl/pthread_kill.c b/nptl/pthread_kill.c -index fb7862e..a44dc8f 100644 ---- a/nptl/pthread_kill.c -+++ b/nptl/pthread_kill.c -@@ -21,8 +21,11 @@ - #include - #include - --int --__pthread_kill_internal (pthread_t threadid, int signo) -+/* Sends SIGNO to THREADID. If the thread is about to exit or has -+ already exited on the kernel side, return NO_TID. Otherwise return -+ 0 or an error code. */ -+static int -+__pthread_kill_implementation (pthread_t threadid, int signo, int no_tid) - { - struct pthread *pd = (struct pthread *) threadid; - if (pd == THREAD_SELF) -@@ -52,11 +55,8 @@ __pthread_kill_internal (pthread_t threadid, int signo) - signal is either not observable (the target thread has already - blocked signals at this point), or it will fail, or it might be - delivered to a new, unrelated thread that has reused the TID. -- So do not actually send the signal. Do not report an error -- because the threadid argument is still valid (the thread ID -- lifetime has not ended), and ESRCH (for example) would be -- misleading. */ -- ret = 0; -+ So do not actually send the signal. */ -+ ret = no_tid; - else - { - /* Using tgkill is a safety measure. pd->exit_lock ensures that -@@ -72,6 +72,15 @@ __pthread_kill_internal (pthread_t threadid, int signo) - } - - int -+__pthread_kill_internal (pthread_t threadid, int signo) -+{ -+ /* Do not report an error in the no-tid case because the threadid -+ argument is still valid (the thread ID lifetime has not ended), -+ and ESRCH (for example) would be misleading. */ -+ return __pthread_kill_implementation (threadid, signo, 0); -+} -+ -+int - __pthread_kill (pthread_t threadid, int signo) - { - /* Disallow sending the signal we use for cancellation, timers, -@@ -81,6 +90,7 @@ __pthread_kill (pthread_t threadid, int signo) - - return __pthread_kill_internal (threadid, signo); - } -+ - /* Some architectures (for instance arm) might pull raise through libgcc, so - avoid the symbol version if it ends up being used on ld.so. */ - #if !IS_IN(rtld) -@@ -88,6 +98,17 @@ libc_hidden_def (__pthread_kill) - versioned_symbol (libc, __pthread_kill, pthread_kill, GLIBC_2_34); - - # if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_34) --compat_symbol (libc, __pthread_kill, pthread_kill, GLIBC_2_0); -+/* Variant which returns ESRCH in the no-TID case, for backwards -+ compatibility. */ -+int -+attribute_compat_text_section -+__pthread_kill_esrch (pthread_t threadid, int signo) -+{ -+ if (__is_internal_signal (signo)) -+ return EINVAL; -+ -+ return __pthread_kill_implementation (threadid, signo, ESRCH); -+} -+compat_symbol (libc, __pthread_kill_esrch, pthread_kill, GLIBC_2_0); - # endif - #endif -diff --git a/sysdeps/pthread/tst-pthread_kill-exited.c b/sysdeps/pthread/tst-pthread_kill-exited.c -index 7575fb6..a2fddad 100644 ---- a/sysdeps/pthread/tst-pthread_kill-exited.c -+++ b/sysdeps/pthread/tst-pthread_kill-exited.c -@@ -16,11 +16,15 @@ - License along with the GNU C Library; if not, see - . */ - --/* This test verifies that pthread_kill returns 0 (and not ESRCH) for -- a thread that has exited on the kernel side. */ -+/* This test verifies that the default pthread_kill returns 0 (and not -+ ESRCH) for a thread that has exited on the kernel side. */ - -+#include -+#include -+#include - #include - #include -+#include - #include - #include - -@@ -30,6 +34,12 @@ noop_thread (void *closure) - return NULL; - } - -+#if TEST_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_34) && PTHREAD_IN_LIBC -+extern __typeof (pthread_kill) compat_pthread_kill; -+compat_symbol_reference (libpthread, compat_pthread_kill, pthread_kill, -+ GLIBC_2_0); -+#endif -+ - static int - do_test (void) - { -@@ -37,7 +47,14 @@ do_test (void) - - support_wait_for_thread_exit (); - -+ /* NB: Always uses the default symbol due to separate compilation. */ - xpthread_kill (thr, SIGUSR1); -+ -+#if TEST_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_34) && PTHREAD_IN_LIBC -+ /* Old binaries need the non-conforming ESRCH error code. */ -+ TEST_COMPARE (compat_pthread_kill (thr, SIGUSR1), ESRCH); -+#endif -+ - xpthread_join (thr); - - return 0; --- -1.8.3.1 - diff --git a/nptl-pthread_kill-pthread_cancel-should-not-fail-aft.patch b/nptl-pthread_kill-pthread_cancel-should-not-fail-aft.patch deleted file mode 100644 index 7d1bc81fe6a21a03129f997e05df7eba32bba728..0000000000000000000000000000000000000000 --- a/nptl-pthread_kill-pthread_cancel-should-not-fail-aft.patch +++ /dev/null @@ -1,292 +0,0 @@ -From 8af8456004edbab71f8903a60a3cae442cf6fe69 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Mon, 13 Sep 2021 11:06:08 +0200 -Subject: [PATCH] nptl: pthread_kill, pthread_cancel should not fail after exit - (bug 19193) - -This closes one remaining race condition related to bug 12889: if -the thread already exited on the kernel side, returning ESRCH -is not correct because that error is reserved for the thread IDs -(pthread_t values) whose lifetime has ended. In case of a -kernel-side exit and a valid thread ID, no signal needs to be sent -and cancellation does not have an effect, so just return 0. - -sysdeps/pthread/tst-kill4.c triggers undefined behavior and is -removed with this commit. - -Reviewed-by: Adhemerval Zanella ---- - nptl/pthread_cancel.c | 9 +-- - nptl/pthread_kill.c | 7 ++- - sysdeps/pthread/Makefile | 5 +- - sysdeps/pthread/tst-kill4.c | 90 ----------------------------- - sysdeps/pthread/tst-pthread_cancel-exited.c | 45 +++++++++++++++ - sysdeps/pthread/tst-pthread_kill-exited.c | 46 +++++++++++++++ - 6 files changed, 106 insertions(+), 96 deletions(-) - delete mode 100644 sysdeps/pthread/tst-kill4.c - create mode 100644 sysdeps/pthread/tst-pthread_cancel-exited.c - create mode 100644 sysdeps/pthread/tst-pthread_kill-exited.c - -diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c -index 2bb523c..a8aa3b3 100644 ---- a/nptl/pthread_cancel.c -+++ b/nptl/pthread_cancel.c -@@ -61,10 +61,11 @@ __pthread_cancel (pthread_t th) - { - volatile struct pthread *pd = (volatile struct pthread *) th; - -- /* Make sure the descriptor is valid. */ -- if (INVALID_TD_P (pd)) -- /* Not a valid thread handle. */ -- return ESRCH; -+ if (pd->tid == 0) -+ /* The thread has already exited on the kernel side. Its outcome -+ (regular exit, other cancelation) has already been -+ determined. */ -+ return 0; - - static int init_sigcancel = 0; - if (atomic_load_relaxed (&init_sigcancel) == 0) -diff --git a/nptl/pthread_kill.c b/nptl/pthread_kill.c -index f79a2b2..5d4c86f 100644 ---- a/nptl/pthread_kill.c -+++ b/nptl/pthread_kill.c -@@ -46,7 +46,12 @@ __pthread_kill_internal (pthread_t threadid, int signo) - ? INTERNAL_SYSCALL_ERRNO (val) : 0); - } - else -- val = ESRCH; -+ /* The kernel reports that the thread has exited. POSIX specifies -+ the ESRCH error only for the case when the lifetime of a thread -+ ID has ended, but calling pthread_kill on such a thread ID is -+ undefined in glibc. Therefore, do not treat kernel thread exit -+ as an error. */ -+ val = 0; - - return val; - } -diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile -index 42f9fc5..dedfa0d 100644 ---- a/sysdeps/pthread/Makefile -+++ b/sysdeps/pthread/Makefile -@@ -89,7 +89,7 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \ - tst-join8 tst-join9 tst-join10 tst-join11 tst-join12 tst-join13 \ - tst-join14 tst-join15 \ - tst-key1 tst-key2 tst-key3 tst-key4 \ -- tst-kill1 tst-kill2 tst-kill3 tst-kill4 tst-kill5 tst-kill6 \ -+ tst-kill1 tst-kill2 tst-kill3 tst-kill5 tst-kill6 \ - tst-locale1 tst-locale2 \ - tst-memstream \ - tst-mutex-errorcheck tst-mutex1 tst-mutex2 tst-mutex3 tst-mutex4 \ -@@ -118,6 +118,9 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \ - tst-unload \ - tst-unwind-thread \ - tst-pt-vfork1 tst-pt-vfork2 tst-vfork1x tst-vfork2x \ -+ tst-pthread_cancel-exited \ -+ tst-pthread_kill-exited \ -+ # tests - - tests-time64 := \ - tst-abstime-time64 \ -diff --git a/sysdeps/pthread/tst-kill4.c b/sysdeps/pthread/tst-kill4.c -deleted file mode 100644 -index 222ceb7..0000000 ---- a/sysdeps/pthread/tst-kill4.c -+++ /dev/null -@@ -1,90 +0,0 @@ --/* Copyright (C) 2003-2021 Free Software Foundation, Inc. -- This file is part of the GNU C Library. -- Contributed by Ulrich Drepper , 2003. -- -- 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 void * --tf (void *a) --{ -- return NULL; --} -- -- --int --do_test (void) --{ -- pthread_attr_t at; -- if (pthread_attr_init (&at) != 0) -- { -- puts ("attr_create failed"); -- exit (1); -- } -- -- /* Limit thread stack size, because if it is too large, pthread_join -- will free it immediately rather than put it into stack cache. */ -- if (pthread_attr_setstacksize (&at, 2 * 1024 * 1024) != 0) -- { -- puts ("setstacksize failed"); -- exit (1); -- } -- -- pthread_t th; -- if (pthread_create (&th, &at, tf, NULL) != 0) -- { -- puts ("create failed"); -- exit (1); -- } -- -- pthread_attr_destroy (&at); -- -- if (pthread_join (th, NULL) != 0) -- { -- puts ("join failed"); -- exit (1); -- } -- -- /* The following only works because we assume here something about -- the implementation. Namely, that the memory allocated for the -- thread descriptor is not going away, that the TID field is -- cleared and therefore the signal is sent to process 0, and that -- we can savely assume there is no other process with this ID at -- that time. */ -- int e = pthread_kill (th, 0); -- if (e == 0) -- { -- puts ("pthread_kill succeeded"); -- exit (1); -- } -- if (e != ESRCH) -- { -- puts ("pthread_kill didn't return ESRCH"); -- exit (1); -- } -- -- return 0; --} -- -- --#define TEST_FUNCTION do_test () --#include "../test-skeleton.c" -diff --git a/sysdeps/pthread/tst-pthread_cancel-exited.c b/sysdeps/pthread/tst-pthread_cancel-exited.c -new file mode 100644 -index 0000000..811c9be ---- /dev/null -+++ b/sysdeps/pthread/tst-pthread_cancel-exited.c -@@ -0,0 +1,45 @@ -+/* Test that pthread_kill succeeds for an exited thread. -+ Copyright (C) 2021 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 -+ . */ -+ -+/* This test verifies that pthread_kill returns 0 (and not ESRCH) for -+ a thread that has exited on the kernel side. */ -+ -+#include -+#include -+#include -+ -+static void * -+noop_thread (void *closure) -+{ -+ return NULL; -+} -+ -+static int -+do_test (void) -+{ -+ pthread_t thr = xpthread_create (NULL, noop_thread, NULL); -+ -+ support_wait_for_thread_exit (); -+ -+ xpthread_cancel (thr); -+ xpthread_join (thr); -+ -+ return 0; -+} -+ -+#include -diff --git a/sysdeps/pthread/tst-pthread_kill-exited.c b/sysdeps/pthread/tst-pthread_kill-exited.c -new file mode 100644 -index 0000000..7575fb6 ---- /dev/null -+++ b/sysdeps/pthread/tst-pthread_kill-exited.c -@@ -0,0 +1,46 @@ -+/* Test that pthread_kill succeeds for an exited thread. -+ Copyright (C) 2021 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 -+ . */ -+ -+/* This test verifies that pthread_kill returns 0 (and not ESRCH) for -+ a thread that has exited on the kernel side. */ -+ -+#include -+#include -+#include -+#include -+ -+static void * -+noop_thread (void *closure) -+{ -+ return NULL; -+} -+ -+static int -+do_test (void) -+{ -+ pthread_t thr = xpthread_create (NULL, noop_thread, NULL); -+ -+ support_wait_for_thread_exit (); -+ -+ xpthread_kill (thr, SIGUSR1); -+ xpthread_join (thr); -+ -+ return 0; -+} -+ -+#include --- -1.8.3.1 - diff --git a/posix-Fix-attribute-access-mode-on-getcwd-BZ-27476.patch b/posix-Fix-attribute-access-mode-on-getcwd-BZ-27476.patch deleted file mode 100644 index a9e8d26b9e20df41fd1c5b911c4a99ef4db0dde4..0000000000000000000000000000000000000000 --- a/posix-Fix-attribute-access-mode-on-getcwd-BZ-27476.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 433ec4f14a5753c7689c83c20c9972915c53c204 Mon Sep 17 00:00:00 2001 -From: Aurelien Jarno -Date: Fri, 10 Sep 2021 19:39:35 +0200 -Subject: [PATCH] posix: Fix attribute access mode on getcwd [BZ #27476] - -There is a GNU extension that allows to call getcwd(NULL, >0). It is -described in the documentation, but also directly in the unistd.h -header, just above the declaration. - -Therefore the attribute access mode added in commit 06febd8c6705 -is not correct. Drop it. ---- - posix/bits/unistd.h | 5 ++--- - posix/unistd.h | 3 +-- - 2 files changed, 3 insertions(+), 5 deletions(-) - -diff --git a/posix/bits/unistd.h b/posix/bits/unistd.h -index f083138..622adeb 100644 ---- a/posix/bits/unistd.h -+++ b/posix/bits/unistd.h -@@ -199,10 +199,9 @@ __NTH (readlinkat (int __fd, const char *__restrict __path, - #endif - - extern char *__getcwd_chk (char *__buf, size_t __size, size_t __buflen) -- __THROW __wur __attr_access ((__write_only__, 1, 2)); -+ __THROW __wur; - extern char *__REDIRECT_NTH (__getcwd_alias, -- (char *__buf, size_t __size), getcwd) -- __wur __attr_access ((__write_only__, 1, 2)); -+ (char *__buf, size_t __size), getcwd) __wur; - extern char *__REDIRECT_NTH (__getcwd_chk_warn, - (char *__buf, size_t __size, size_t __buflen), - __getcwd_chk) -diff --git a/posix/unistd.h b/posix/unistd.h -index 3dca657..8224c5f 100644 ---- a/posix/unistd.h -+++ b/posix/unistd.h -@@ -528,8 +528,7 @@ extern int fchdir (int __fd) __THROW __wur; - an array is allocated with `malloc'; the array is SIZE - bytes long, unless SIZE == 0, in which case it is as - big as necessary. */ --extern char *getcwd (char *__buf, size_t __size) __THROW __wur -- __attr_access ((__write_only__, 1, 2)); -+extern char *getcwd (char *__buf, size_t __size) __THROW __wur; - - #ifdef __USE_GNU - /* Return a malloc'd string containing the current directory name. --- -1.8.3.1 - diff --git a/pthread-tst-cancel28-Fix-barrier-re-init-race-condit.patch b/pthread-tst-cancel28-Fix-barrier-re-init-race-condit.patch deleted file mode 100644 index 208821236906cd5b9a03ae1ade5a2f6888924cdb..0000000000000000000000000000000000000000 --- a/pthread-tst-cancel28-Fix-barrier-re-init-race-condit.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 9874ca536b1d0662b1cea46af3ce09a4d42aeb32 Mon Sep 17 00:00:00 2001 -From: Stafford Horne -Date: Sat, 25 Sep 2021 17:02:06 +0900 -Subject: [PATCH] pthread/tst-cancel28: Fix barrier re-init race condition - -When running this test on the OpenRISC port I am working on this test -fails with a timeout. The test passes when being straced or debugged. -Looking at the code there seems to be a race condition in that: - - 1 main thread: calls xpthread_cancel - 2 sub thread : receives cancel signal - 3 sub thread : cleanup routine waits on barrier - 4 main thread: re-inits barrier - 5 main thread: waits on barrier - -After getting to 5 the main thread and sub thread wait forever as the 2 -barriers are no longer the same. - -Removing the barrier re-init seems to fix this issue. Also, the barrier -does not need to be reinitialized as that is done by default. - -Reviewed-by: Adhemerval Zanella ---- - sysdeps/pthread/tst-cancel28.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/sysdeps/pthread/tst-cancel28.c b/sysdeps/pthread/tst-cancel28.c -index 627cbc8..9286c15 100644 ---- a/sysdeps/pthread/tst-cancel28.c -+++ b/sysdeps/pthread/tst-cancel28.c -@@ -69,7 +69,6 @@ do_test (void) - - xpthread_cancel (timer_thread); - -- xpthread_barrier_init (&barrier, NULL, 2); - xpthread_barrier_wait (&barrier); - - return 0; --- -1.8.3.1 - diff --git a/riscv-Drop-reliance-on-_GLOBAL_OFFSET_TABLE_-0.patch b/riscv-Drop-reliance-on-_GLOBAL_OFFSET_TABLE_-0.patch deleted file mode 100644 index a45f186a092d107a2ba305ececa180f2e3e8c3b0..0000000000000000000000000000000000000000 --- a/riscv-Drop-reliance-on-_GLOBAL_OFFSET_TABLE_-0.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 34b4624b04fc8f038b2c329ca7560197320615b4 Mon Sep 17 00:00:00 2001 -From: Fangrui Song -Date: Wed, 18 Aug 2021 10:01:31 -0700 -Subject: [PATCH] riscv: Drop reliance on _GLOBAL_OFFSET_TABLE_[0] - -&__ehdr_start is a better way to get the load address. - -This is similar to commits b37b75d269883a2c553bb7019a813094eb4e2dd1 -(x86-64) and 43d06ed218fc8be58987bdfd00e21e5720f0b862 (aarch64). - -Reviewed-by: Palmer Dabbelt ---- - sysdeps/riscv/dl-machine.h | 21 ++++++++++----------- - 1 file changed, 10 insertions(+), 11 deletions(-) - -diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h -index aedf69f..5b07461 100644 ---- a/sysdeps/riscv/dl-machine.h -+++ b/sysdeps/riscv/dl-machine.h -@@ -76,27 +76,26 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr) - return 1; - } - -+/* Return the run-time load address of the shared object. */ -+static inline ElfW(Addr) -+elf_machine_load_address (void) -+{ -+ extern const ElfW(Ehdr) __ehdr_start attribute_hidden; -+ return (ElfW(Addr)) &__ehdr_start; -+} -+ - /* Return the link-time address of _DYNAMIC. */ - static inline ElfW(Addr) - elf_machine_dynamic (void) - { -- extern ElfW(Addr) _GLOBAL_OFFSET_TABLE_ __attribute__ ((visibility ("hidden"))); -- return _GLOBAL_OFFSET_TABLE_; -+ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden; -+ return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address (); - } - - #define STRINGXP(X) __STRING (X) - #define STRINGXV(X) STRINGV_ (X) - #define STRINGV_(...) # __VA_ARGS__ - --/* Return the run-time load address of the shared object. */ --static inline ElfW(Addr) --elf_machine_load_address (void) --{ -- ElfW(Addr) load_addr; -- asm ("lla %0, _DYNAMIC" : "=r" (load_addr)); -- return load_addr - elf_machine_dynamic (); --} -- - /* Initial entry point code for the dynamic linker. - The C function `_dl_start' is the real entry point; - its return value is the user program's entry point. */ --- -1.8.3.1 - diff --git a/rt-Set-the-correct-message-queue-for-tst-mqueue10.patch b/rt-Set-the-correct-message-queue-for-tst-mqueue10.patch deleted file mode 100644 index 700045ab8e3b9fc9e48bdae7197fc34394659656..0000000000000000000000000000000000000000 --- a/rt-Set-the-correct-message-queue-for-tst-mqueue10.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 3d9a539ee66165148b2b9e08b46e03a5f58f65d2 Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Wed, 4 Aug 2021 17:14:46 -0300 -Subject: [PATCH] rt: Set the correct message queue for tst-mqueue10 - -Checked on x86_64-linux-gnu. ---- - rt/tst-mqueue10.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/rt/tst-mqueue10.c b/rt/tst-mqueue10.c -index 1879580..0bf64d7 100644 ---- a/rt/tst-mqueue10.c -+++ b/rt/tst-mqueue10.c -@@ -25,7 +25,7 @@ - #include - #include - --static char name[sizeof "/tst-mqueue2-" + INT_BUFSIZE_BOUND (pid_t)]; -+static char name[sizeof "/tst-mqueue10-" + INT_BUFSIZE_BOUND (pid_t)]; - - static void - do_cleanup (void) -@@ -37,7 +37,7 @@ do_cleanup (void) - static int - do_test (void) - { -- snprintf (name, sizeof (name), "/tst-mqueue2-%u", getpid ()); -+ snprintf (name, sizeof (name), "/tst-mqueue10-%u", getpid ()); - - char msg[8] = { 0x55 }; - --- -1.8.3.1 - diff --git a/rtld-copy-terminating-null-in-tunables_strdup-bug-28.patch b/rtld-copy-terminating-null-in-tunables_strdup-bug-28.patch deleted file mode 100644 index 6f7310675b7dff8397b34f4830587290154c59d3..0000000000000000000000000000000000000000 --- a/rtld-copy-terminating-null-in-tunables_strdup-bug-28.patch +++ /dev/null @@ -1,28 +0,0 @@ -From a4f5a3103fc3e7974dbe35b411cba9f670807cde Mon Sep 17 00:00:00 2001 -From: Andreas Schwab -Date: Mon, 23 Aug 2021 10:19:52 +0200 -Subject: [PATCH] rtld: copy terminating null in tunables_strdup (bug 28256) - -Avoid triggering a false positive from valgrind by copying the terminating -null in tunables_strdup. At this point the heap is still clean, but -valgrind is stricter here. ---- - elf/dl-tunables.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c -index 8009e54..1666736 100644 ---- a/elf/dl-tunables.c -+++ b/elf/dl-tunables.c -@@ -56,8 +56,6 @@ tunables_strdup (const char *in) - if (out == (void *)-1) - _dl_fatal_printf ("sbrk() failure while processing tunables\n"); - -- i--; -- - while (i-- > 0) - out[i] = in[i]; - --- -1.8.3.1 - diff --git a/support-Add-support_open_dev_null_range.patch b/support-Add-support_open_dev_null_range.patch deleted file mode 100644 index 0b78f8cc6e23fb1d755fed2f41323697abd6025d..0000000000000000000000000000000000000000 --- a/support-Add-support_open_dev_null_range.patch +++ /dev/null @@ -1,363 +0,0 @@ -From e814f4b04ee413a7bb3dfa43e74c8fb4abf58359 Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Tue, 24 Aug 2021 16:12:24 -0300 -Subject: [PATCH] support: Add support_open_dev_null_range - -It returns a range of file descriptor referring to the '/dev/null' -pathname. The function takes care of restarting the open range -if a file descriptor is found within the specified range and -also increases RLIMIT_NOFILE if required. - -Checked on x86_64-linux-gnu. ---- - support/Makefile | 2 + - support/support-open-dev-null-range.c | 134 ++++++++++++++++++++++++++ - support/support.h | 8 ++ - support/tst-support-open-dev-null-range.c | 155 ++++++++++++++++++++++++++++++ - 4 files changed, 299 insertions(+) - create mode 100644 support/support-open-dev-null-range.c - create mode 100644 support/tst-support-open-dev-null-range.c - -diff --git a/support/Makefile b/support/Makefile -index a462781..6332e7b 100644 ---- a/support/Makefile -+++ b/support/Makefile -@@ -66,6 +66,7 @@ libsupport-routines = \ - support_path_support_time64 \ - support_process_state \ - support_ptrace \ -+ support-open-dev-null-range \ - support_openpty \ - support_paths \ - support_quote_blob \ -@@ -264,6 +265,7 @@ tests = \ - tst-support_capture_subprocess \ - tst-support_descriptors \ - tst-support_format_dns_packet \ -+ tst-support-open-dev-null-range \ - tst-support-process_state \ - tst-support_quote_blob \ - tst-support_quote_string \ -diff --git a/support/support-open-dev-null-range.c b/support/support-open-dev-null-range.c -new file mode 100644 -index 0000000..80d9dba ---- /dev/null -+++ b/support/support-open-dev-null-range.c -@@ -0,0 +1,134 @@ -+/* Return a range of open file descriptors. -+ Copyright (C) 2021 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 -+ -+static void -+increase_nofile (void) -+{ -+ struct rlimit rl; -+ if (getrlimit (RLIMIT_NOFILE, &rl) == -1) -+ FAIL_EXIT1 ("getrlimit (RLIMIT_NOFILE): %m"); -+ -+ rl.rlim_cur += 128; -+ -+ if (setrlimit (RLIMIT_NOFILE, &rl) == 1) -+ FAIL_EXIT1 ("setrlimit (RLIMIT_NOFILE): %m"); -+} -+ -+static int -+open_dev_null (int flags, mode_t mode) -+{ -+ int fd = open64 ("/dev/null", flags, mode); -+ if (fd > 0) -+ return fd; -+ -+ if (fd < 0 && errno != EMFILE) -+ FAIL_EXIT1 ("open64 (\"/dev/null\", 0x%x, 0%o): %m", flags, mode); -+ -+ increase_nofile (); -+ -+ return xopen ("/dev/null", flags, mode); -+} -+ -+struct range -+{ -+ int lowfd; -+ size_t len; -+}; -+ -+struct range_list -+{ -+ size_t total; -+ size_t used; -+ struct range *ranges; -+}; -+ -+static void -+range_init (struct range_list *r) -+{ -+ r->total = 8; -+ r->used = 0; -+ r->ranges = xmalloc (r->total * sizeof (struct range)); -+} -+ -+static void -+range_add (struct range_list *r, int lowfd, size_t len) -+{ -+ if (r->used == r->total) -+ { -+ r->total *= 2; -+ r->ranges = xrealloc (r->ranges, r->total * sizeof (struct range)); -+ } -+ r->ranges[r->used].lowfd = lowfd; -+ r->ranges[r->used].len = len; -+ r->used++; -+} -+ -+static void -+range_close (struct range_list *r) -+{ -+ for (size_t i = 0; i < r->used; i++) -+ { -+ int minfd = r->ranges[i].lowfd; -+ int maxfd = r->ranges[i].lowfd + r->ranges[i].len; -+ for (int fd = minfd; fd < maxfd; fd++) -+ xclose (fd); -+ } -+ free (r->ranges); -+} -+ -+int -+support_open_dev_null_range (int num, int flags, mode_t mode) -+{ -+ /* We keep track of the ranges that hit an already opened descriptor, so -+ we close them after we get a working range. */ -+ struct range_list rl; -+ range_init (&rl); -+ -+ int lowfd = open_dev_null (flags, mode); -+ int prevfd = lowfd; -+ while (true) -+ { -+ int i = 1; -+ for (; i < num; i++) -+ { -+ int fd = open_dev_null (flags, mode); -+ if (fd != lowfd + i) -+ { -+ range_add (&rl, lowfd, prevfd - lowfd + 1); -+ -+ prevfd = lowfd = fd; -+ break; -+ } -+ prevfd = fd; -+ } -+ if (i == num) -+ break; -+ } -+ -+ range_close (&rl); -+ -+ return lowfd; -+} -diff --git a/support/support.h b/support/support.h -index 834dba9..e6911e1 100644 ---- a/support/support.h -+++ b/support/support.h -@@ -193,6 +193,14 @@ struct support_stack support_stack_alloc (size_t size); - /* Deallocate the STACK. */ - void support_stack_free (struct support_stack *stack); - -+ -+/* Create a range of NUM opened '/dev/null' file descriptors using FLAGS and -+ MODE. The function takes care of restarting the open range if a file -+ descriptor is found within the specified range and also increases -+ RLIMIT_NOFILE if required. -+ The returned value is the lowest file descriptor number. */ -+int support_open_dev_null_range (int num, int flags, mode_t mode); -+ - __END_DECLS - - #endif /* SUPPORT_H */ -diff --git a/support/tst-support-open-dev-null-range.c b/support/tst-support-open-dev-null-range.c -new file mode 100644 -index 0000000..8e29def ---- /dev/null -+++ b/support/tst-support-open-dev-null-range.c -@@ -0,0 +1,155 @@ -+/* Tests for support_open_dev_null_range. -+ Copyright (C) 2021 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 -+#include -+ -+#ifndef PATH_MAX -+# define PATH_MAX 1024 -+#endif -+ -+#include -+ -+static void -+check_path (int fd) -+{ -+ char *proc_fd_path = xasprintf ("/proc/self/fd/%d", fd); -+ char file_path[PATH_MAX]; -+ ssize_t file_path_length -+ = readlink (proc_fd_path, file_path, sizeof (file_path)); -+ free (proc_fd_path); -+ if (file_path_length < 0) -+ FAIL_EXIT1 ("readlink (%s, %p, %zu)", proc_fd_path, file_path, -+ sizeof (file_path)); -+ file_path[file_path_length] = '\0'; -+ TEST_COMPARE_STRING (file_path, "/dev/null"); -+} -+ -+static int -+number_of_opened_files (void) -+{ -+ DIR *fds = opendir ("/proc/self/fd"); -+ if (fds == NULL) -+ FAIL_EXIT1 ("opendir (\"/proc/self/fd\"): %m"); -+ -+ int r = 0; -+ while (true) -+ { -+ errno = 0; -+ struct dirent64 *e = readdir64 (fds); -+ if (e == NULL) -+ { -+ if (errno != 0) -+ FAIL_EXIT1 ("readdir: %m"); -+ break; -+ } -+ -+ if (e->d_name[0] == '.') -+ continue; -+ -+ char *endptr; -+ long int fd = strtol (e->d_name, &endptr, 10); -+ if (*endptr != '\0' || fd < 0 || fd > INT_MAX) -+ FAIL_EXIT1 ("readdir: invalid file descriptor name: /proc/self/fd/%s", -+ e->d_name); -+ -+ /* Skip the descriptor which is used to enumerate the -+ descriptors. */ -+ if (fd == dirfd (fds)) -+ continue; -+ -+ r = r + 1; -+ } -+ -+ closedir (fds); -+ -+ return r; -+} -+ -+static int -+do_test (void) -+{ -+ const int nfds1 = 8; -+ int lowfd = support_open_dev_null_range (nfds1, O_RDONLY, 0600); -+ for (int i = 0; i < nfds1; i++) -+ { -+ TEST_VERIFY (fcntl (lowfd + i, F_GETFL) > -1); -+ check_path (lowfd + i); -+ } -+ -+ /* create some gaps. */ -+ xclose (lowfd + 1); -+ xclose (lowfd + 5); -+ xclose (lowfd + 6); -+ -+ const int nfds2 = 16; -+ int lowfd2 = support_open_dev_null_range (nfds2, O_RDONLY, 0600); -+ for (int i = 0; i < nfds2; i++) -+ { -+ TEST_VERIFY (fcntl (lowfd2 + i, F_GETFL) > -1); -+ check_path (lowfd2 + i); -+ } -+ -+ /* Decrease the maximum number of files. */ -+ { -+ struct rlimit rl; -+ if (getrlimit (RLIMIT_NOFILE, &rl) == -1) -+ FAIL_EXIT1 ("getrlimit (RLIMIT_NOFILE): %m"); -+ -+ rl.rlim_cur = number_of_opened_files (); -+ -+ if (setrlimit (RLIMIT_NOFILE, &rl) == 1) -+ FAIL_EXIT1 ("setrlimit (RLIMIT_NOFILE): %m"); -+ } -+ -+ const int nfds3 = 16; -+ int lowfd3 = support_open_dev_null_range (nfds3, O_RDONLY, 0600); -+ for (int i = 0; i < nfds3; i++) -+ { -+ TEST_VERIFY (fcntl (lowfd3 + i, F_GETFL) > -1); -+ check_path (lowfd3 + i); -+ } -+ -+ /* create a lot of gaps to trigger the range extension. */ -+ xclose (lowfd3 + 1); -+ xclose (lowfd3 + 3); -+ xclose (lowfd3 + 5); -+ xclose (lowfd3 + 7); -+ xclose (lowfd3 + 9); -+ xclose (lowfd3 + 11); -+ xclose (lowfd3 + 13); -+ -+ const int nfds4 = 16; -+ int lowfd4 = support_open_dev_null_range (nfds4, O_RDONLY, 0600); -+ for (int i = 0; i < nfds4; i++) -+ { -+ TEST_VERIFY (fcntl (lowfd4 + i, F_GETFL) > -1); -+ check_path (lowfd4 + i); -+ } -+ -+ return 0; -+} -+ -+#include --- -1.8.3.1 - diff --git a/support-Add-support_wait_for_thread_exit.patch b/support-Add-support_wait_for_thread_exit.patch deleted file mode 100644 index 97ca806ec6d13510d7e68df0719cb9b8de86437d..0000000000000000000000000000000000000000 --- a/support-Add-support_wait_for_thread_exit.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 032d74eaf6179100048a5bf0ce942e97dc8b9a60 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Mon, 30 Aug 2021 13:43:56 +0200 -Subject: [PATCH] support: Add support_wait_for_thread_exit - ---- - support/Makefile | 3 +- - support/support.h | 4 ++ - support/support_wait_for_thread_exit.c | 72 ++++++++++++++++++++++++++++++++++ - 3 files changed, 78 insertions(+), 1 deletion(-) - create mode 100644 support/support_wait_for_thread_exit.c - -diff --git a/support/Makefile b/support/Makefile -index 6332e7b..2a07317 100644 ---- a/support/Makefile -+++ b/support/Makefile -@@ -83,9 +83,10 @@ libsupport-routines = \ - support_test_compare_blob \ - support_test_compare_failure \ - support_test_compare_string \ -- support_write_file_string \ - support_test_main \ - support_test_verify_impl \ -+ support_wait_for_thread_exit \ -+ support_write_file_string \ - temp_file \ - timespec \ - timespec-time64 \ -diff --git a/support/support.h b/support/support.h -index e6911e1..c219e0d 100644 ---- a/support/support.h -+++ b/support/support.h -@@ -174,6 +174,10 @@ timer_t support_create_timer (uint64_t sec, long int nsec, bool repeat, - /* Disable the timer TIMER. */ - void support_delete_timer (timer_t timer); - -+/* Wait until all threads except the current thread have exited (as -+ far as the kernel is concerned). */ -+void support_wait_for_thread_exit (void); -+ - struct support_stack - { - void *stack; -diff --git a/support/support_wait_for_thread_exit.c b/support/support_wait_for_thread_exit.c -new file mode 100644 -index 0000000..658a813 ---- /dev/null -+++ b/support/support_wait_for_thread_exit.c -@@ -0,0 +1,72 @@ -+/* Wait until all threads except the current thread has exited. -+ Copyright (C) 2021 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 -+ -+void -+support_wait_for_thread_exit (void) -+{ -+#ifdef __linux__ -+ DIR *proc_self_task = opendir ("/proc/self/task"); -+ TEST_VERIFY_EXIT (proc_self_task != NULL); -+ -+ while (true) -+ { -+ errno = 0; -+ struct dirent *e = readdir (proc_self_task); -+ if (e == NULL && errno != 0) -+ FAIL_EXIT1 ("readdir: %m"); -+ if (e == NULL) -+ { -+ /* Only the main thread remains. Testing may continue. */ -+ closedir (proc_self_task); -+ return; -+ } -+ -+ if (strcmp (e->d_name, ".") == 0 || strcmp (e->d_name, "..") == 0) -+ continue; -+ -+ int task_tid = atoi (e->d_name); -+ if (task_tid <= 0) -+ FAIL_EXIT1 ("Invalid /proc/self/task entry: %s", e->d_name); -+ -+ if (task_tid == gettid ()) -+ /* The current thread. Keep scanning for other -+ threads. */ -+ continue; -+ -+ /* task_tid does not refer to this thread here, i.e., there is -+ another running thread. */ -+ -+ /* Small timeout to give the thread a chance to exit. */ -+ usleep (50 * 1000); -+ -+ /* Start scanning the directory from the start. */ -+ rewinddir (proc_self_task); -+ } -+#else -+ /* Use a large timeout because we cannot verify that the thread has -+ exited. */ -+ usleep (5 * 1000 * 1000); -+#endif -+} --- -1.8.3.1 - diff --git a/time-Fix-overflow-itimer-tests-on-32-bit-systems.patch b/time-Fix-overflow-itimer-tests-on-32-bit-systems.patch deleted file mode 100644 index 939e816cf880d4372574433d98b396997fa99ec1..0000000000000000000000000000000000000000 --- a/time-Fix-overflow-itimer-tests-on-32-bit-systems.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 6e8a0aac2f883a23efb1683b120499138f9e6021 Mon Sep 17 00:00:00 2001 -From: Stafford Horne -Date: Mon, 7 Jun 2021 22:10:19 +0900 -Subject: [PATCH] time: Fix overflow itimer tests on 32-bit systems - -On the port of OpenRISC I am working on and it appears the rv32 port -we have sets __TIMESIZE == 64 && __WORDSIZE == 32. This causes the -size of time_t to be 8 bytes, but the tv_sec in the kernel is still 32-bit -causing truncation. - -The truncations are unavoidable on these systems so skip the -testing/failures by guarding with __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64. - -Also, futher in the tests and in other parts of code checking for time_t -overflow does not work on 32-bit systems when time_t is 64-bit. As -suggested by Adhemerval, update the in_time_t_range function to assume -32-bits by using int32_t. - -This also brings in the header for stdint.h so we can update other -usages of __int32_t to int32_t as suggested by Adhemerval. - -Reviewed-by: Adhemerval Zanella ---- - include/time.h | 10 ++++++---- - time/tst-itimer.c | 4 ++-- - 2 files changed, 8 insertions(+), 6 deletions(-) - -diff --git a/include/time.h b/include/time.h -index 22b29ca..127347e 100644 ---- a/include/time.h -+++ b/include/time.h -@@ -11,6 +11,7 @@ - # include - # include - # include -+# include - - extern __typeof (strftime_l) __strftime_l; - libc_hidden_proto (__strftime_l) -@@ -342,11 +343,12 @@ libc_hidden_proto (__time64) - actual clock ID. */ - #define CLOCK_IDFIELD_SIZE 3 - --/* Check whether T fits in time_t. */ -+/* Check whether T fits in int32_t, assume all usages are for -+ sizeof(time_t) == 32. */ - static inline bool - in_time_t_range (__time64_t t) - { -- time_t s = t; -+ int32_t s = t; - return s == t; - } - -@@ -453,8 +455,8 @@ timespec64_to_timeval64 (const struct __timespec64 ts64) - and suseconds_t. */ - struct __timeval32 - { -- __int32_t tv_sec; /* Seconds. */ -- __int32_t tv_usec; /* Microseconds. */ -+ int32_t tv_sec; /* Seconds. */ -+ int32_t tv_usec; /* Microseconds. */ - }; - - /* Conversion functions for converting to/from __timeval32 */ -diff --git a/time/tst-itimer.c b/time/tst-itimer.c -index 929c2b7..bd7d7af 100644 ---- a/time/tst-itimer.c -+++ b/time/tst-itimer.c -@@ -100,7 +100,7 @@ do_test (void) - - /* Linux does not provide 64 bit time_t support for getitimer and - setitimer on architectures with 32 bit time_t support. */ -- if (sizeof (__time_t) == 8) -+ if (__KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64) - { - TEST_COMPARE (setitimer (timers[i], &it, NULL), 0); - TEST_COMPARE (setitimer (timers[i], &(struct itimerval) { 0 }, -@@ -131,7 +131,7 @@ do_test (void) - it.it_interval.tv_usec = 20; - it.it_value.tv_sec = 30; - it.it_value.tv_usec = 40; -- if (sizeof (__time_t) == 8) -+ if (__KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64) - { - TEST_COMPARE (setitimer (timers[i], &it, NULL), 0); - --- -1.8.3.1 - diff --git a/x86-64-Optimize-load-of-all-bits-set-into-ZMM-regist.patch b/x86-64-Optimize-load-of-all-bits-set-into-ZMM-regist.patch deleted file mode 100644 index 924e63c8f380a7f4b395c0b516c96193fce71e2a..0000000000000000000000000000000000000000 --- a/x86-64-Optimize-load-of-all-bits-set-into-ZMM-regist.patch +++ /dev/null @@ -1,267 +0,0 @@ -From 78c9ec9000f873abe7a15a91b87080a2e4308260 Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" -Date: Fri, 20 Aug 2021 06:42:24 -0700 -Subject: [PATCH] x86-64: Optimize load of all bits set into ZMM register [BZ - #28252] - -Optimize loads of all bits set into ZMM register in AVX512 SVML codes -by replacing - - vpbroadcastq .L_2il0floatpacket.16(%rip), %zmmX - -and - - vmovups .L_2il0floatpacket.13(%rip), %zmmX - -with - vpternlogd $0xff, %zmmX, %zmmX, %zmmX - -This fixes BZ #28252. ---- - sysdeps/x86_64/fpu/multiarch/svml_d_cos8_core_avx512.S | 7 +------ - sysdeps/x86_64/fpu/multiarch/svml_d_log8_core_avx512.S | 7 +------ - sysdeps/x86_64/fpu/multiarch/svml_d_sin8_core_avx512.S | 7 +------ - sysdeps/x86_64/fpu/multiarch/svml_d_sincos8_core_avx512.S | 7 +------ - sysdeps/x86_64/fpu/multiarch/svml_s_cosf16_core_avx512.S | 7 +------ - sysdeps/x86_64/fpu/multiarch/svml_s_expf16_core_avx512.S | 7 +------ - sysdeps/x86_64/fpu/multiarch/svml_s_logf16_core_avx512.S | 7 +------ - sysdeps/x86_64/fpu/multiarch/svml_s_powf16_core_avx512.S | 12 ++---------- - sysdeps/x86_64/fpu/multiarch/svml_s_sincosf16_core_avx512.S | 7 +------ - sysdeps/x86_64/fpu/multiarch/svml_s_sinf16_core_avx512.S | 7 +------ - 10 files changed, 11 insertions(+), 64 deletions(-) - -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_cos8_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_d_cos8_core_avx512.S -index e68fcdb..58e588a 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_d_cos8_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_d_cos8_core_avx512.S -@@ -265,7 +265,7 @@ WRAPPER_IMPL_AVX512 _ZGVdN4v_cos - vmovaps %zmm0, %zmm8 - - /* Check for large arguments path */ -- vpbroadcastq .L_2il0floatpacket.16(%rip), %zmm2 -+ vpternlogd $0xff, %zmm2, %zmm2, %zmm2 - - /* - ARGUMENT RANGE REDUCTION: -@@ -456,8 +456,3 @@ WRAPPER_IMPL_AVX512 _ZGVdN4v_cos - jmp .LBL_2_7 - #endif - END (_ZGVeN8v_cos_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.16: -- .long 0xffffffff,0xffffffff -- .type .L_2il0floatpacket.16,@object -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_log8_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_d_log8_core_avx512.S -index dfa2aca..f5f117d 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_d_log8_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_d_log8_core_avx512.S -@@ -274,7 +274,7 @@ WRAPPER_IMPL_AVX512 _ZGVdN4v_log - - /* preserve mantissa, set input exponent to 2^(-10) */ - vpternlogq $248, _ExpMask(%rax), %zmm3, %zmm2 -- vpbroadcastq .L_2il0floatpacket.12(%rip), %zmm1 -+ vpternlogd $0xff, %zmm1, %zmm1, %zmm1 - vpsrlq $32, %zmm4, %zmm6 - - /* reciprocal approximation good to at least 11 bits */ -@@ -461,8 +461,3 @@ WRAPPER_IMPL_AVX512 _ZGVdN4v_log - jmp .LBL_2_7 - #endif - END (_ZGVeN8v_log_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.12: -- .long 0xffffffff,0xffffffff -- .type .L_2il0floatpacket.12,@object -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_sin8_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_d_sin8_core_avx512.S -index be8ab7c..48d251d 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_d_sin8_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_d_sin8_core_avx512.S -@@ -261,7 +261,7 @@ WRAPPER_IMPL_AVX512 _ZGVdN4v_sin - andq $-64, %rsp - subq $1280, %rsp - movq __svml_d_trig_data@GOTPCREL(%rip), %rax -- vpbroadcastq .L_2il0floatpacket.14(%rip), %zmm14 -+ vpternlogd $0xff, %zmm1, %zmm1, %zmm14 - vmovups __dAbsMask(%rax), %zmm7 - vmovups __dInvPI(%rax), %zmm2 - vmovups __dRShifter(%rax), %zmm1 -@@ -458,8 +458,3 @@ WRAPPER_IMPL_AVX512 _ZGVdN4v_sin - jmp .LBL_2_7 - #endif - END (_ZGVeN8v_sin_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.14: -- .long 0xffffffff,0xffffffff -- .type .L_2il0floatpacket.14,@object -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_sincos8_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_d_sincos8_core_avx512.S -index 6118870..a4944a4 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_d_sincos8_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_d_sincos8_core_avx512.S -@@ -430,7 +430,7 @@ WRAPPER_IMPL_AVX512_fFF _ZGVdN4vl8l8_sincos - - /* SinPoly = SinR*SinPoly */ - vfmadd213pd %zmm5, %zmm5, %zmm4 -- vpbroadcastq .L_2il0floatpacket.15(%rip), %zmm3 -+ vpternlogd $0xff, %zmm3, %zmm3, %zmm3 - - /* Update Cos result's sign */ - vxorpd %zmm2, %zmm1, %zmm1 -@@ -741,8 +741,3 @@ END (_ZGVeN8vvv_sincos_knl) - ENTRY (_ZGVeN8vvv_sincos_skx) - WRAPPER_AVX512_vvv_vl8l8 _ZGVeN8vl8l8_sincos_skx - END (_ZGVeN8vvv_sincos_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.15: -- .long 0xffffffff,0xffffffff -- .type .L_2il0floatpacket.15,@object -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_cosf16_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_s_cosf16_core_avx512.S -index f671d60..fe8474f 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_s_cosf16_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_s_cosf16_core_avx512.S -@@ -278,7 +278,7 @@ WRAPPER_IMPL_AVX512 _ZGVdN8v_cosf - X = X - Y*PI1 - Y*PI2 - Y*PI3 - */ - vmovaps %zmm0, %zmm6 -- vmovups .L_2il0floatpacket.13(%rip), %zmm12 -+ vpternlogd $0xff, %zmm12, %zmm12, %zmm12 - vmovups __sRShifter(%rax), %zmm3 - vmovups __sPI1_FMA(%rax), %zmm5 - vmovups __sA9_FMA(%rax), %zmm9 -@@ -453,8 +453,3 @@ WRAPPER_IMPL_AVX512 _ZGVdN8v_cosf - jmp .LBL_2_7 - #endif - END (_ZGVeN16v_cosf_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.13: -- .long 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff -- .type .L_2il0floatpacket.13,@object -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_expf16_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_s_expf16_core_avx512.S -index 637bfe3..229b782 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_s_expf16_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_s_expf16_core_avx512.S -@@ -264,7 +264,7 @@ WRAPPER_IMPL_AVX512 _ZGVdN8v_expf - vmovaps %zmm0, %zmm7 - - /* compare against threshold */ -- vmovups .L_2il0floatpacket.13(%rip), %zmm3 -+ vpternlogd $0xff, %zmm3, %zmm3, %zmm3 - vmovups __sInvLn2(%rax), %zmm4 - vmovups __sShifter(%rax), %zmm1 - vmovups __sLn2hi(%rax), %zmm6 -@@ -440,8 +440,3 @@ WRAPPER_IMPL_AVX512 _ZGVdN8v_expf - - #endif - END (_ZGVeN16v_expf_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.13: -- .long 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff -- .type .L_2il0floatpacket.13,@object -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_logf16_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_s_logf16_core_avx512.S -index 9d790fb..fa2aae9 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_s_logf16_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_s_logf16_core_avx512.S -@@ -235,7 +235,7 @@ WRAPPER_IMPL_AVX512 _ZGVdN8v_logf - andq $-64, %rsp - subq $1280, %rsp - movq __svml_slog_data@GOTPCREL(%rip), %rax -- vmovups .L_2il0floatpacket.7(%rip), %zmm6 -+ vpternlogd $0xff, %zmm6, %zmm6, %zmm6 - vmovups _iBrkValue(%rax), %zmm4 - vmovups _sPoly_7(%rax), %zmm8 - -@@ -409,8 +409,3 @@ WRAPPER_IMPL_AVX512 _ZGVdN8v_logf - - #endif - END (_ZGVeN16v_logf_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.7: -- .long 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff -- .type .L_2il0floatpacket.7,@object -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_powf16_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_s_powf16_core_avx512.S -index c5c43c4..6aea2a4 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_s_powf16_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_s_powf16_core_avx512.S -@@ -385,7 +385,7 @@ WRAPPER_IMPL_AVX512_ff _ZGVdN8vv_powf - vpsrlq $32, %zmm3, %zmm2 - vpmovqd %zmm2, %ymm11 - vcvtps2pd %ymm14, %zmm13 -- vmovups .L_2il0floatpacket.23(%rip), %zmm14 -+ vpternlogd $0xff, %zmm14, %zmm14, %zmm14 - vmovaps %zmm14, %zmm26 - vpandd _ABSMASK(%rax), %zmm1, %zmm8 - vpcmpd $1, _INF(%rax), %zmm8, %k2 -@@ -427,7 +427,7 @@ WRAPPER_IMPL_AVX512_ff _ZGVdN8vv_powf - vpmovqd %zmm11, %ymm5 - vpxord %zmm10, %zmm10, %zmm10 - vgatherdpd _Log2Rcp_lookup(%rax,%ymm4), %zmm10{%k3} -- vpbroadcastq .L_2il0floatpacket.24(%rip), %zmm4 -+ vpternlogd $0xff, %zmm4, %zmm4, %zmm4 - vpxord %zmm11, %zmm11, %zmm11 - vcvtdq2pd %ymm7, %zmm7 - vgatherdpd _Log2Rcp_lookup(%rax,%ymm5), %zmm11{%k1} -@@ -643,11 +643,3 @@ WRAPPER_IMPL_AVX512_ff _ZGVdN8vv_powf - jmp .LBL_2_7 - #endif - END (_ZGVeN16vv_powf_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.23: -- .long 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff -- .type .L_2il0floatpacket.23,@object --.L_2il0floatpacket.24: -- .long 0xffffffff,0xffffffff -- .type .L_2il0floatpacket.24,@object -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_sincosf16_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_s_sincosf16_core_avx512.S -index 9cf359c..a446c50 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_s_sincosf16_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_s_sincosf16_core_avx512.S -@@ -317,7 +317,7 @@ WRAPPER_IMPL_AVX512_fFF _ZGVdN8vvv_sincosf - - /* Result sign calculations */ - vpternlogd $150, %zmm0, %zmm14, %zmm1 -- vmovups .L_2il0floatpacket.13(%rip), %zmm14 -+ vpternlogd $0xff, %zmm14, %zmm14, %zmm14 - - /* Add correction term 0.5 for cos() part */ - vaddps %zmm8, %zmm5, %zmm15 -@@ -748,8 +748,3 @@ END (_ZGVeN16vvv_sincosf_knl) - ENTRY (_ZGVeN16vvv_sincosf_skx) - WRAPPER_AVX512_vvv_vl4l4 _ZGVeN16vl4l4_sincosf_skx - END (_ZGVeN16vvv_sincosf_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.13: -- .long 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff -- .type .L_2il0floatpacket.13,@object -diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_sinf16_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_s_sinf16_core_avx512.S -index bd05109..c1b352d 100644 ---- a/sysdeps/x86_64/fpu/multiarch/svml_s_sinf16_core_avx512.S -+++ b/sysdeps/x86_64/fpu/multiarch/svml_s_sinf16_core_avx512.S -@@ -280,7 +280,7 @@ WRAPPER_IMPL_AVX512 _ZGVdN8v_sinf - movq __svml_s_trig_data@GOTPCREL(%rip), %rax - - /* Check for large and special values */ -- vmovups .L_2il0floatpacket.11(%rip), %zmm14 -+ vpternlogd $0xff, %zmm14, %zmm14, %zmm14 - vmovups __sAbsMask(%rax), %zmm5 - vmovups __sInvPI(%rax), %zmm1 - vmovups __sRShifter(%rax), %zmm2 -@@ -472,8 +472,3 @@ WRAPPER_IMPL_AVX512 _ZGVdN8v_sinf - jmp .LBL_2_7 - #endif - END (_ZGVeN16v_sinf_skx) -- -- .section .rodata, "a" --.L_2il0floatpacket.11: -- .long 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff -- .type .L_2il0floatpacket.11,@object --- -1.8.3.1 - diff --git a/x86-64-Use-testl-to-check-__x86_string_control.patch b/x86-64-Use-testl-to-check-__x86_string_control.patch deleted file mode 100644 index 363930e209a2b3400809eefbe647cf306b263126..0000000000000000000000000000000000000000 --- a/x86-64-Use-testl-to-check-__x86_string_control.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 3c8b9879cab6d41787bc5b14c1748f62fd6d0e5f Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" -Date: Sat, 28 Aug 2021 06:10:38 -0700 -Subject: [PATCH] x86-64: Use testl to check __x86_string_control - -Use testl, instead of andl, to check __x86_string_control to avoid -updating __x86_string_control. - -Reviewed-by: Carlos O'Donell ---- - sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S b/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S -index 9f02624..abde843 100644 ---- a/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S -+++ b/sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S -@@ -325,7 +325,7 @@ 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) -+ testl $X86_STRING_CONTROL_AVOID_SHORT_DISTANCE_REP_MOVSB, __x86_string_control(%rip) - jz 3f - movq %rdi, %rcx - subq %rsi, %rcx -@@ -333,7 +333,7 @@ L(movsb): - # endif - 1: - # if AVOID_SHORT_DISTANCE_REP_MOVSB -- andl $X86_STRING_CONTROL_AVOID_SHORT_DISTANCE_REP_MOVSB, __x86_string_control(%rip) -+ testl $X86_STRING_CONTROL_AVOID_SHORT_DISTANCE_REP_MOVSB, __x86_string_control(%rip) - jz 3f - movq %rsi, %rcx - subq %rdi, %rcx --- -1.8.3.1 - diff --git a/x86-fix-Autoconf-caching-of-instruction-support-chec.patch b/x86-fix-Autoconf-caching-of-instruction-support-chec.patch deleted file mode 100644 index d4117fa6a97f8d987e75c36899ec5786fcc6235b..0000000000000000000000000000000000000000 --- a/x86-fix-Autoconf-caching-of-instruction-support-chec.patch +++ /dev/null @@ -1,178 +0,0 @@ -From 0835c0f0bad351117154b815f34f8af19ea7e325 Mon Sep 17 00:00:00 2001 -From: Matt Whitlock -Date: Wed, 16 Jun 2021 23:40:47 -0400 -Subject: [PATCH] x86: fix Autoconf caching of instruction support checks [BZ - #27991] - -The Autoconf documentation for the AC_CACHE_CHECK macro states: - - The commands-to-set-it must have no side effects except for setting - the variable cache-id, see below. - -However, the tests for support of -msahf and -mmovbe were embedded in -the commands-to-set-it for lib_cv_include_x86_isa_level. This had the -consequence that libc_cv_have_x86_lahf_sahf and libc_cv_have_x86_movbe -were not defined whenever lib_cv_include_x86_isa_level was read from -cache. These variables' being undefined meant that their unquoted use -in later test expressions led to the 'test' built-in's misparsing its -arguments and emitting errors like "test: =: unexpected operator" or -"test: =: unary operator expected", depending on the particular shell. - -This commit refactors the tests for LAHF/SAHF and MOVBE instruction -support into their own AC_CACHE_CHECK macro invocations to obey the -rule that the commands-to-set-it must have no side effects other than -setting the variable named by cache-id. - -Signed-off-by: Matt Whitlock -Reviewed-by: Adhemerval Zanella ---- - sysdeps/x86/configure | 56 ++++++++++++++++++++++++++++++------------------ - sysdeps/x86/configure.ac | 34 +++++++++++++++-------------- - 2 files changed, 53 insertions(+), 37 deletions(-) - -diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure -index ead1295..62676bb 100644 ---- a/sysdeps/x86/configure -+++ b/sysdeps/x86/configure -@@ -126,8 +126,6 @@ cat > conftest2.S <&5 - (eval $ac_try) 2>&5 -@@ -137,9 +135,22 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest c - count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l` - if test "$count" = 1; then - libc_cv_include_x86_isa_level=yes -- cat > conftest.c <&5 -+$as_echo "$libc_cv_include_x86_isa_level" >&6; } -+if test $libc_cv_include_x86_isa_level = yes; then -+ $as_echo "#define INCLUDE_X86_ISA_LEVEL 1" >>confdefs.h -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LAHF/SAHF instruction support" >&5 -+$as_echo_n "checking for LAHF/SAHF instruction support... " >&6; } -+if ${libc_cv_have_x86_lahf_sahf+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ libc_cv_have_x86_lahf_sahf=no -+ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - -x c /dev/null' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 - (eval $ac_try) 2>&5 - ac_status=$? -@@ -147,7 +158,20 @@ EOF - test $ac_status = 0; }; } | grep -q "\-msahf"; then - libc_cv_have_x86_lahf_sahf=yes - fi -- if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c' -+fi -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_x86_lahf_sahf" >&5 -+$as_echo "$libc_cv_have_x86_lahf_sahf" >&6; } -+ if test $libc_cv_have_x86_lahf_sahf = yes; then -+ $as_echo "#define HAVE_X86_LAHF_SAHF 1" >>confdefs.h -+ -+ fi -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MOVBE instruction support" >&5 -+$as_echo_n "checking for MOVBE instruction support... " >&6; } -+if ${libc_cv_have_x86_movbe+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ libc_cv_have_x86_movbe=no -+ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - -x c /dev/null' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 - (eval $ac_try) 2>&5 - ac_status=$? -@@ -155,23 +179,13 @@ EOF - test $ac_status = 0; }; } | grep -q "\-mmovbe"; then - libc_cv_have_x86_movbe=yes - fi -- fi --fi --rm -f conftest* --fi --{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_include_x86_isa_level" >&5 --$as_echo "$libc_cv_include_x86_isa_level" >&6; } --if test $libc_cv_include_x86_isa_level = yes; then -- $as_echo "#define INCLUDE_X86_ISA_LEVEL 1" >>confdefs.h -- - fi --if test $libc_cv_have_x86_lahf_sahf = yes; then -- $as_echo "#define HAVE_X86_LAHF_SAHF 1" >>confdefs.h -- --fi --if test $libc_cv_have_x86_movbe = yes; then -- $as_echo "#define HAVE_X86_MOVBE 1" >>confdefs.h -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_x86_movbe" >&5 -+$as_echo "$libc_cv_have_x86_movbe" >&6; } -+ if test $libc_cv_have_x86_movbe = yes; then -+ $as_echo "#define HAVE_X86_MOVBE 1" >>confdefs.h - -+ fi - fi - config_vars="$config_vars - enable-x86-isa-level = $libc_cv_include_x86_isa_level" -diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac -index bca97fd..04a12ab 100644 ---- a/sysdeps/x86/configure.ac -+++ b/sysdeps/x86/configure.ac -@@ -98,30 +98,32 @@ cat > conftest2.S < conftest.c < -Date: Tue, 17 Aug 2021 10:45:57 -0700 -Subject: [PATCH] x86_64: Simplify elf_machine_{load_address,dynamic} - -and drop reliance on _GLOBAL_OFFSET_TABLE_[0] being the link-time -address of _DYNAMIC. &__ehdr_start is a better way to get the load address. - -Reviewed-by: H.J. Lu ---- - sysdeps/x86_64/dl-machine.h | 21 +++++++-------------- - 1 file changed, 7 insertions(+), 14 deletions(-) - -diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h -index a8596aa..ceee507 100644 ---- a/sysdeps/x86_64/dl-machine.h -+++ b/sysdeps/x86_64/dl-machine.h -@@ -35,27 +35,20 @@ elf_machine_matches_host (const ElfW(Ehdr) *ehdr) - } - - --/* Return the link-time address of _DYNAMIC. Conveniently, this is the -- first element of the GOT. This must be inlined in a function which -- uses global data. */ -+/* Return the run-time load address of the shared object. */ - static inline ElfW(Addr) __attribute__ ((unused)) --elf_machine_dynamic (void) -+elf_machine_load_address (void) - { -- /* This produces an IP-relative reloc which is resolved at link time. */ -- extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] attribute_hidden; -- return _GLOBAL_OFFSET_TABLE_[0]; -+ extern const ElfW(Ehdr) __ehdr_start attribute_hidden; -+ return (ElfW(Addr)) &__ehdr_start; - } - -- --/* Return the run-time load address of the shared object. */ -+/* Return the link-time address of _DYNAMIC. */ - static inline ElfW(Addr) __attribute__ ((unused)) --elf_machine_load_address (void) -+elf_machine_dynamic (void) - { -- /* Compute the difference between the runtime address of _DYNAMIC as seen -- by an IP-relative reference, and the link-time address found in the -- special unrelocated first GOT entry. */ - extern ElfW(Dyn) _DYNAMIC[] attribute_hidden; -- return (ElfW(Addr)) &_DYNAMIC - elf_machine_dynamic (); -+ return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address (); - } - - /* Set up the loaded object described by L so its unrelocated PLT --- -1.8.3.1 -