aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jirutka <jakub@jirutka.cz>2018-06-18 22:11:53 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2018-06-19 07:47:53 +0000
commited42835662421a72dbc1c47397a2805306203860 (patch)
treedfc247dd19c81d7d89548c2ca0c94cc6410db573
parent7503de19f027c334f41dfbd8e793b04ad70622c0 (diff)
downloadalpine_aports-ed42835662421a72dbc1c47397a2805306203860.tar.bz2
alpine_aports-ed42835662421a72dbc1c47397a2805306203860.tar.xz
alpine_aports-ed42835662421a72dbc1c47397a2805306203860.zip
main/musl: backport patch fixing TLS layout
This issue affects e.g. Rust on aarch64.
-rw-r--r--main/musl/APKBUILD5
-rw-r--r--main/musl/fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch293
2 files changed, 297 insertions, 1 deletions
diff --git a/main/musl/APKBUILD b/main/musl/APKBUILD
index cd67b11c11..796c4ae84d 100644
--- a/main/musl/APKBUILD
+++ b/main/musl/APKBUILD
@@ -2,7 +2,7 @@
2# Maintainer: Timo Teräs <timo.teras@iki.fi> 2# Maintainer: Timo Teräs <timo.teras@iki.fi>
3pkgname=musl 3pkgname=musl
4pkgver=1.1.19 4pkgver=1.1.19
5pkgrel=9 5pkgrel=10
6pkgdesc="the musl c library (libc) implementation" 6pkgdesc="the musl c library (libc) implementation"
7url="http://www.musl-libc.org/" 7url="http://www.musl-libc.org/"
8arch="all" 8arch="all"
@@ -24,6 +24,8 @@ source="http://www.musl-libc.org/releases/musl-$pkgver.tar.gz
24 2000-pthread-internals-increase-DEFAULT_GUARD_SIZE-to-2-p.patch 24 2000-pthread-internals-increase-DEFAULT_GUARD_SIZE-to-2-p.patch
25 handle-aux-at_base.patch 25 handle-aux-at_base.patch
26 26
27 fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch
28
27 ldconfig 29 ldconfig
28 __stack_chk_fail_local.c 30 __stack_chk_fail_local.c
29 getconf.c 31 getconf.c
@@ -155,6 +157,7 @@ b0bcfc837f888f2b1c2d65c06dcc0a2fa12da78986ba9c7c86a64123ce44c21a63c13c1cc2e93fdf
155023fc05d653f4a3be4d16a2e223bddc26be7bc31c4decf3f5b9bed78cbe7bc8687ff8c164b94541f6fda66d6c3864dd42cb10920d066f97d2891e31a366c3e8d 0006-powerpc-update-hwcap.h-for-linux-v4.15.patch 157023fc05d653f4a3be4d16a2e223bddc26be7bc31c4decf3f5b9bed78cbe7bc8687ff8c164b94541f6fda66d6c3864dd42cb10920d066f97d2891e31a366c3e8d 0006-powerpc-update-hwcap.h-for-linux-v4.15.patch
1562c8e1dde1834238097b2ee8a7bfb53471a0d9cff4a5e38b55f048b567deff1cdd47c170d0578a67b1a039f95a6c5fbb8cff369c75b6a3e4d7ed171e8e86ebb8c 2000-pthread-internals-increase-DEFAULT_GUARD_SIZE-to-2-p.patch 1582c8e1dde1834238097b2ee8a7bfb53471a0d9cff4a5e38b55f048b567deff1cdd47c170d0578a67b1a039f95a6c5fbb8cff369c75b6a3e4d7ed171e8e86ebb8c 2000-pthread-internals-increase-DEFAULT_GUARD_SIZE-to-2-p.patch
1576a7ff16d95b5d1be77e0a0fbb245491817db192176496a57b22ab037637d97a185ea0b0d19da687da66c2a2f5578e4343d230f399d49fe377d8f008410974238 handle-aux-at_base.patch 1596a7ff16d95b5d1be77e0a0fbb245491817db192176496a57b22ab037637d97a185ea0b0d19da687da66c2a2f5578e4343d230f399d49fe377d8f008410974238 handle-aux-at_base.patch
160898507a75af05d960ac25343ac1ff026923a62f5095400fa3dcc650baf25b83cdff740da8a87fa6e40856227a44dcc469b78af6905e2f0e4f027abef5d3fad57 fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch
1588d3a2d5315fc56fee7da9abb8b89bb38c6046c33d154c10d168fb35bfde6b0cf9f13042a3bceee34daf091bc409d699223735dcf19f382eeee1f6be34154f26f ldconfig 1618d3a2d5315fc56fee7da9abb8b89bb38c6046c33d154c10d168fb35bfde6b0cf9f13042a3bceee34daf091bc409d699223735dcf19f382eeee1f6be34154f26f ldconfig
159062bb49fa54839010acd4af113e20f7263dde1c8a2ca359b5fb2661ef9ed9d84a0f7c3bc10c25dcfa10bb3c5a4874588dff636ac43d5dbb3d748d75400756d0b __stack_chk_fail_local.c 162062bb49fa54839010acd4af113e20f7263dde1c8a2ca359b5fb2661ef9ed9d84a0f7c3bc10c25dcfa10bb3c5a4874588dff636ac43d5dbb3d748d75400756d0b __stack_chk_fail_local.c
1600d80f37b34a35e3d14b012257c50862dfeb9d2c81139ea2dfa101d981d093b009b9fa450ba27a708ac59377a48626971dfc58e20a3799084a65777a0c32cbc7d getconf.c 1630d80f37b34a35e3d14b012257c50862dfeb9d2c81139ea2dfa101d981d093b009b9fa450ba27a708ac59377a48626971dfc58e20a3799084a65777a0c32cbc7d getconf.c
diff --git a/main/musl/fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch b/main/musl/fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch
new file mode 100644
index 0000000000..ce82a6fd28
--- /dev/null
+++ b/main/musl/fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch
@@ -0,0 +1,293 @@
1From 610c5a8524c3d6cd3ac5a5f1231422e7648a3791 Mon Sep 17 00:00:00 2001
2From: Szabolcs Nagy <nsz@port70.net>
3Date: Sat, 2 Jun 2018 01:52:01 +0200
4Subject: fix TLS layout of TLS variant I when there is a gap above TP
5
6In TLS variant I the TLS is above TP (or above a fixed offset from TP)
7but on some targets there is a reserved gap above TP before TLS starts.
8
9This matters for the local-exec tls access model when the offsets of
10TLS variables from the TP are hard coded by the linker into the
11executable, so the libc must compute these offsets the same way as the
12linker. The tls offset of the main module has to be
13
14 alignup(GAP_ABOVE_TP, main_tls_align).
15
16If there is no TLS in the main module then the gap can be ignored
17since musl does not use it and the tls access models of shared
18libraries are not affected.
19
20The previous setup only worked if (tls_align & -GAP_ABOVE_TP) == 0
21(i.e. TLS did not require large alignment) because the gap was
22treated as a fixed offset from TP. Now the TP points at the end
23of the pthread struct (which is aligned) and there is a gap above
24it (which may also need alignment).
25
26The fix required changing TP_ADJ and __pthread_self on affected
27targets (aarch64, arm and sh) and in the tlsdesc asm the offset to
28access the dtv changed too.
29
30Patch-Source: https://git.musl-libc.org/cgit/musl/commit/?id=610c5a8524c3d6cd3ac5a5f1231422e7648a3791
31See-Also: https://github.com/rust-lang/rust/issues/48967
32---
33 arch/aarch64/pthread_arch.h | 5 +++--
34 arch/aarch64/reloc.h | 2 +-
35 arch/arm/pthread_arch.h | 7 ++++---
36 arch/arm/reloc.h | 2 +-
37 arch/mips/pthread_arch.h | 1 +
38 arch/mips64/pthread_arch.h | 1 +
39 arch/mipsn32/pthread_arch.h | 1 +
40 arch/or1k/pthread_arch.h | 1 +
41 arch/powerpc/pthread_arch.h | 1 +
42 arch/powerpc64/pthread_arch.h | 1 +
43 arch/sh/pthread_arch.h | 5 +++--
44 arch/sh/reloc.h | 2 +-
45 ldso/dynlink.c | 5 +++--
46 src/env/__init_tls.c | 10 ++++++++--
47 src/ldso/aarch64/tlsdesc.s | 5 ++---
48 15 files changed, 32 insertions(+), 17 deletions(-)
49
50diff --git a/arch/aarch64/pthread_arch.h b/arch/aarch64/pthread_arch.h
51index b2e2d8f..e8499d8 100644
52--- a/arch/aarch64/pthread_arch.h
53+++ b/arch/aarch64/pthread_arch.h
54@@ -2,10 +2,11 @@ static inline struct pthread *__pthread_self()
55 {
56 char *self;
57 __asm__ __volatile__ ("mrs %0,tpidr_el0" : "=r"(self));
58- return (void*)(self + 16 - sizeof(struct pthread));
59+ return (void*)(self - sizeof(struct pthread));
60 }
61
62 #define TLS_ABOVE_TP
63-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 16)
64+#define GAP_ABOVE_TP 16
65+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
66
67 #define MC_PC pc
68diff --git a/arch/aarch64/reloc.h b/arch/aarch64/reloc.h
69index 51b66e2..40cf0b2 100644
70--- a/arch/aarch64/reloc.h
71+++ b/arch/aarch64/reloc.h
72@@ -10,7 +10,7 @@
73
74 #define NO_LEGACY_INITFINI
75
76-#define TPOFF_K 16
77+#define TPOFF_K 0
78
79 #define REL_SYMBOLIC R_AARCH64_ABS64
80 #define REL_GOT R_AARCH64_GLOB_DAT
81diff --git a/arch/arm/pthread_arch.h b/arch/arm/pthread_arch.h
82index 6657e19..8f2ae8f 100644
83--- a/arch/arm/pthread_arch.h
84+++ b/arch/arm/pthread_arch.h
85@@ -5,7 +5,7 @@ static inline pthread_t __pthread_self()
86 {
87 char *p;
88 __asm__ __volatile__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(p) );
89- return (void *)(p+8-sizeof(struct pthread));
90+ return (void *)(p-sizeof(struct pthread));
91 }
92
93 #else
94@@ -21,12 +21,13 @@ static inline pthread_t __pthread_self()
95 extern uintptr_t __attribute__((__visibility__("hidden"))) __a_gettp_ptr;
96 register uintptr_t p __asm__("r0");
97 __asm__ __volatile__ ( BLX " %1" : "=r"(p) : "r"(__a_gettp_ptr) : "cc", "lr" );
98- return (void *)(p+8-sizeof(struct pthread));
99+ return (void *)(p-sizeof(struct pthread));
100 }
101
102 #endif
103
104 #define TLS_ABOVE_TP
105-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 8)
106+#define GAP_ABOVE_TP 8
107+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
108
109 #define MC_PC arm_pc
110diff --git a/arch/arm/reloc.h b/arch/arm/reloc.h
111index b175711..4b00bf6 100644
112--- a/arch/arm/reloc.h
113+++ b/arch/arm/reloc.h
114@@ -16,7 +16,7 @@
115
116 #define NO_LEGACY_INITFINI
117
118-#define TPOFF_K 8
119+#define TPOFF_K 0
120
121 #define REL_SYMBOLIC R_ARM_ABS32
122 #define REL_GOT R_ARM_GLOB_DAT
123diff --git a/arch/mips/pthread_arch.h b/arch/mips/pthread_arch.h
124index e581265..5fea15a 100644
125--- a/arch/mips/pthread_arch.h
126+++ b/arch/mips/pthread_arch.h
127@@ -11,6 +11,7 @@ static inline struct pthread *__pthread_self()
128 }
129
130 #define TLS_ABOVE_TP
131+#define GAP_ABOVE_TP 0
132 #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
133
134 #define DTP_OFFSET 0x8000
135diff --git a/arch/mips64/pthread_arch.h b/arch/mips64/pthread_arch.h
136index e581265..5fea15a 100644
137--- a/arch/mips64/pthread_arch.h
138+++ b/arch/mips64/pthread_arch.h
139@@ -11,6 +11,7 @@ static inline struct pthread *__pthread_self()
140 }
141
142 #define TLS_ABOVE_TP
143+#define GAP_ABOVE_TP 0
144 #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
145
146 #define DTP_OFFSET 0x8000
147diff --git a/arch/mipsn32/pthread_arch.h b/arch/mipsn32/pthread_arch.h
148index e581265..5fea15a 100644
149--- a/arch/mipsn32/pthread_arch.h
150+++ b/arch/mipsn32/pthread_arch.h
151@@ -11,6 +11,7 @@ static inline struct pthread *__pthread_self()
152 }
153
154 #define TLS_ABOVE_TP
155+#define GAP_ABOVE_TP 0
156 #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
157
158 #define DTP_OFFSET 0x8000
159diff --git a/arch/or1k/pthread_arch.h b/arch/or1k/pthread_arch.h
160index 7decd76..521b9c5 100644
161--- a/arch/or1k/pthread_arch.h
162+++ b/arch/or1k/pthread_arch.h
163@@ -12,6 +12,7 @@ static inline struct pthread *__pthread_self()
164 }
165
166 #define TLS_ABOVE_TP
167+#define GAP_ABOVE_TP 0
168 #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
169
170 #define MC_PC regs.pc
171diff --git a/arch/powerpc/pthread_arch.h b/arch/powerpc/pthread_arch.h
172index 7c5c4fa..79e5a09 100644
173--- a/arch/powerpc/pthread_arch.h
174+++ b/arch/powerpc/pthread_arch.h
175@@ -11,6 +11,7 @@ static inline struct pthread *__pthread_self()
176 }
177
178 #define TLS_ABOVE_TP
179+#define GAP_ABOVE_TP 0
180 #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
181
182 #define DTP_OFFSET 0x8000
183diff --git a/arch/powerpc64/pthread_arch.h b/arch/powerpc64/pthread_arch.h
184index 2f976fe..37b75e2 100644
185--- a/arch/powerpc64/pthread_arch.h
186+++ b/arch/powerpc64/pthread_arch.h
187@@ -6,6 +6,7 @@ static inline struct pthread *__pthread_self()
188 }
189
190 #define TLS_ABOVE_TP
191+#define GAP_ABOVE_TP 0
192 #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
193
194 #define DTP_OFFSET 0x8000
195diff --git a/arch/sh/pthread_arch.h b/arch/sh/pthread_arch.h
196index 2756e7e..41fefac 100644
197--- a/arch/sh/pthread_arch.h
198+++ b/arch/sh/pthread_arch.h
199@@ -2,10 +2,11 @@ static inline struct pthread *__pthread_self()
200 {
201 char *self;
202 __asm__ __volatile__ ("stc gbr,%0" : "=r" (self) );
203- return (struct pthread *) (self + 8 - sizeof(struct pthread));
204+ return (struct pthread *) (self - sizeof(struct pthread));
205 }
206
207 #define TLS_ABOVE_TP
208-#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 8)
209+#define GAP_ABOVE_TP 8
210+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
211
212 #define MC_PC sc_pc
213diff --git a/arch/sh/reloc.h b/arch/sh/reloc.h
214index 0238ce0..a1f16cb 100644
215--- a/arch/sh/reloc.h
216+++ b/arch/sh/reloc.h
217@@ -20,7 +20,7 @@
218
219 #define LDSO_ARCH "sh" ENDIAN_SUFFIX FP_SUFFIX ABI_SUFFIX
220
221-#define TPOFF_K 8
222+#define TPOFF_K 0
223
224 #define REL_SYMBOLIC R_SH_DIR32
225 #define REL_OFFSET R_SH_REL32
226diff --git a/ldso/dynlink.c b/ldso/dynlink.c
227index cea5f45..c6216b7 100644
228--- a/ldso/dynlink.c
229+++ b/ldso/dynlink.c
230@@ -1594,8 +1594,9 @@ _Noreturn void __dls3(size_t *sp)
231 libc.tls_head = tls_tail = &app.tls;
232 app.tls_id = tls_cnt = 1;
233 #ifdef TLS_ABOVE_TP
234- app.tls.offset = 0;
235- tls_offset = app.tls.size
236+ app.tls.offset = GAP_ABOVE_TP;
237+ app.tls.offset += -GAP_ABOVE_TP & (app.tls.align-1);
238+ tls_offset = app.tls.offset + app.tls.size
239 + ( -((uintptr_t)app.tls.image + app.tls.size)
240 & (app.tls.align-1) );
241 #else
242diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c
243index 1c5d98a..31d324a 100644
244--- a/src/env/__init_tls.c
245+++ b/src/env/__init_tls.c
246@@ -104,13 +104,19 @@ static void static_init_tls(size_t *aux)
247
248 main_tls.size += (-main_tls.size - (uintptr_t)main_tls.image)
249 & (main_tls.align-1);
250- if (main_tls.align < MIN_TLS_ALIGN) main_tls.align = MIN_TLS_ALIGN;
251-#ifndef TLS_ABOVE_TP
252+#ifdef TLS_ABOVE_TP
253+ main_tls.offset = GAP_ABOVE_TP;
254+ main_tls.offset += -GAP_ABOVE_TP & (main_tls.align-1);
255+#else
256 main_tls.offset = main_tls.size;
257 #endif
258+ if (main_tls.align < MIN_TLS_ALIGN) main_tls.align = MIN_TLS_ALIGN;
259
260 libc.tls_align = main_tls.align;
261 libc.tls_size = 2*sizeof(void *) + sizeof(struct pthread)
262+#ifdef TLS_ABOVE_TP
263+ + main_tls.offset
264+#endif
265 + main_tls.size + main_tls.align
266 + MIN_TLS_ALIGN-1 & -MIN_TLS_ALIGN;
267
268diff --git a/src/ldso/aarch64/tlsdesc.s b/src/ldso/aarch64/tlsdesc.s
269index 8ed5c26..8e4004d 100644
270--- a/src/ldso/aarch64/tlsdesc.s
271+++ b/src/ldso/aarch64/tlsdesc.s
272@@ -14,7 +14,7 @@ __tlsdesc_static:
273 // size_t __tlsdesc_dynamic(size_t *a)
274 // {
275 // struct {size_t modidx,off;} *p = (void*)a[1];
276-// size_t *dtv = *(size_t**)(tp + 16 - 8);
277+// size_t *dtv = *(size_t**)(tp - 8);
278 // if (p->modidx <= dtv[0])
279 // return dtv[p->modidx] + p->off - tp;
280 // return __tls_get_new(p) - tp;
281@@ -28,8 +28,7 @@ __tlsdesc_dynamic:
282 mrs x1,tpidr_el0 // tp
283 ldr x0,[x0,#8] // p
284 ldr x2,[x0] // p->modidx
285- add x3,x1,#8
286- ldr x3,[x3] // dtv
287+ ldr x3,[x1,#-8] // dtv
288 ldr x4,[x3] // dtv[0]
289 cmp x2,x4
290 b.hi 1f
291--
292cgit v0.11.2
293