aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch')
-rw-r--r--main/musl/fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch293
1 files changed, 0 insertions, 293 deletions
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
deleted file mode 100644
index ce82a6fd28..0000000000
--- a/main/musl/fix-TLS-layout-of-TLS-variant-I-when-there-is-gap-above-TP.patch
+++ /dev/null
@@ -1,293 +0,0 @@
-From 610c5a8524c3d6cd3ac5a5f1231422e7648a3791 Mon Sep 17 00:00:00 2001
-From: Szabolcs Nagy <nsz@port70.net>
-Date: Sat, 2 Jun 2018 01:52:01 +0200
-Subject: fix TLS layout of TLS variant I when there is a gap above TP
-
-In TLS variant I the TLS is above TP (or above a fixed offset from TP)
-but on some targets there is a reserved gap above TP before TLS starts.
-
-This matters for the local-exec tls access model when the offsets of
-TLS variables from the TP are hard coded by the linker into the
-executable, so the libc must compute these offsets the same way as the
-linker. The tls offset of the main module has to be
-
- alignup(GAP_ABOVE_TP, main_tls_align).
-
-If there is no TLS in the main module then the gap can be ignored
-since musl does not use it and the tls access models of shared
-libraries are not affected.
-
-The previous setup only worked if (tls_align & -GAP_ABOVE_TP) == 0
-(i.e. TLS did not require large alignment) because the gap was
-treated as a fixed offset from TP. Now the TP points at the end
-of the pthread struct (which is aligned) and there is a gap above
-it (which may also need alignment).
-
-The fix required changing TP_ADJ and __pthread_self on affected
-targets (aarch64, arm and sh) and in the tlsdesc asm the offset to
-access the dtv changed too.
-
-Patch-Source: https://git.musl-libc.org/cgit/musl/commit/?id=610c5a8524c3d6cd3ac5a5f1231422e7648a3791
-See-Also: https://github.com/rust-lang/rust/issues/48967
----
- arch/aarch64/pthread_arch.h | 5 +++--
- arch/aarch64/reloc.h | 2 +-
- arch/arm/pthread_arch.h | 7 ++++---
- arch/arm/reloc.h | 2 +-
- arch/mips/pthread_arch.h | 1 +
- arch/mips64/pthread_arch.h | 1 +
- arch/mipsn32/pthread_arch.h | 1 +
- arch/or1k/pthread_arch.h | 1 +
- arch/powerpc/pthread_arch.h | 1 +
- arch/powerpc64/pthread_arch.h | 1 +
- arch/sh/pthread_arch.h | 5 +++--
- arch/sh/reloc.h | 2 +-
- ldso/dynlink.c | 5 +++--
- src/env/__init_tls.c | 10 ++++++++--
- src/ldso/aarch64/tlsdesc.s | 5 ++---
- 15 files changed, 32 insertions(+), 17 deletions(-)
-
-diff --git a/arch/aarch64/pthread_arch.h b/arch/aarch64/pthread_arch.h
-index b2e2d8f..e8499d8 100644
---- a/arch/aarch64/pthread_arch.h
-+++ b/arch/aarch64/pthread_arch.h
-@@ -2,10 +2,11 @@ static inline struct pthread *__pthread_self()
- {
- char *self;
- __asm__ __volatile__ ("mrs %0,tpidr_el0" : "=r"(self));
-- return (void*)(self + 16 - sizeof(struct pthread));
-+ return (void*)(self - sizeof(struct pthread));
- }
-
- #define TLS_ABOVE_TP
--#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 16)
-+#define GAP_ABOVE_TP 16
-+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
-
- #define MC_PC pc
-diff --git a/arch/aarch64/reloc.h b/arch/aarch64/reloc.h
-index 51b66e2..40cf0b2 100644
---- a/arch/aarch64/reloc.h
-+++ b/arch/aarch64/reloc.h
-@@ -10,7 +10,7 @@
-
- #define NO_LEGACY_INITFINI
-
--#define TPOFF_K 16
-+#define TPOFF_K 0
-
- #define REL_SYMBOLIC R_AARCH64_ABS64
- #define REL_GOT R_AARCH64_GLOB_DAT
-diff --git a/arch/arm/pthread_arch.h b/arch/arm/pthread_arch.h
-index 6657e19..8f2ae8f 100644
---- a/arch/arm/pthread_arch.h
-+++ b/arch/arm/pthread_arch.h
-@@ -5,7 +5,7 @@ static inline pthread_t __pthread_self()
- {
- char *p;
- __asm__ __volatile__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(p) );
-- return (void *)(p+8-sizeof(struct pthread));
-+ return (void *)(p-sizeof(struct pthread));
- }
-
- #else
-@@ -21,12 +21,13 @@ static inline pthread_t __pthread_self()
- extern uintptr_t __attribute__((__visibility__("hidden"))) __a_gettp_ptr;
- register uintptr_t p __asm__("r0");
- __asm__ __volatile__ ( BLX " %1" : "=r"(p) : "r"(__a_gettp_ptr) : "cc", "lr" );
-- return (void *)(p+8-sizeof(struct pthread));
-+ return (void *)(p-sizeof(struct pthread));
- }
-
- #endif
-
- #define TLS_ABOVE_TP
--#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 8)
-+#define GAP_ABOVE_TP 8
-+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
-
- #define MC_PC arm_pc
-diff --git a/arch/arm/reloc.h b/arch/arm/reloc.h
-index b175711..4b00bf6 100644
---- a/arch/arm/reloc.h
-+++ b/arch/arm/reloc.h
-@@ -16,7 +16,7 @@
-
- #define NO_LEGACY_INITFINI
-
--#define TPOFF_K 8
-+#define TPOFF_K 0
-
- #define REL_SYMBOLIC R_ARM_ABS32
- #define REL_GOT R_ARM_GLOB_DAT
-diff --git a/arch/mips/pthread_arch.h b/arch/mips/pthread_arch.h
-index e581265..5fea15a 100644
---- a/arch/mips/pthread_arch.h
-+++ b/arch/mips/pthread_arch.h
-@@ -11,6 +11,7 @@ static inline struct pthread *__pthread_self()
- }
-
- #define TLS_ABOVE_TP
-+#define GAP_ABOVE_TP 0
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
-
- #define DTP_OFFSET 0x8000
-diff --git a/arch/mips64/pthread_arch.h b/arch/mips64/pthread_arch.h
-index e581265..5fea15a 100644
---- a/arch/mips64/pthread_arch.h
-+++ b/arch/mips64/pthread_arch.h
-@@ -11,6 +11,7 @@ static inline struct pthread *__pthread_self()
- }
-
- #define TLS_ABOVE_TP
-+#define GAP_ABOVE_TP 0
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
-
- #define DTP_OFFSET 0x8000
-diff --git a/arch/mipsn32/pthread_arch.h b/arch/mipsn32/pthread_arch.h
-index e581265..5fea15a 100644
---- a/arch/mipsn32/pthread_arch.h
-+++ b/arch/mipsn32/pthread_arch.h
-@@ -11,6 +11,7 @@ static inline struct pthread *__pthread_self()
- }
-
- #define TLS_ABOVE_TP
-+#define GAP_ABOVE_TP 0
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
-
- #define DTP_OFFSET 0x8000
-diff --git a/arch/or1k/pthread_arch.h b/arch/or1k/pthread_arch.h
-index 7decd76..521b9c5 100644
---- a/arch/or1k/pthread_arch.h
-+++ b/arch/or1k/pthread_arch.h
-@@ -12,6 +12,7 @@ static inline struct pthread *__pthread_self()
- }
-
- #define TLS_ABOVE_TP
-+#define GAP_ABOVE_TP 0
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
-
- #define MC_PC regs.pc
-diff --git a/arch/powerpc/pthread_arch.h b/arch/powerpc/pthread_arch.h
-index 7c5c4fa..79e5a09 100644
---- a/arch/powerpc/pthread_arch.h
-+++ b/arch/powerpc/pthread_arch.h
-@@ -11,6 +11,7 @@ static inline struct pthread *__pthread_self()
- }
-
- #define TLS_ABOVE_TP
-+#define GAP_ABOVE_TP 0
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
-
- #define DTP_OFFSET 0x8000
-diff --git a/arch/powerpc64/pthread_arch.h b/arch/powerpc64/pthread_arch.h
-index 2f976fe..37b75e2 100644
---- a/arch/powerpc64/pthread_arch.h
-+++ b/arch/powerpc64/pthread_arch.h
-@@ -6,6 +6,7 @@ static inline struct pthread *__pthread_self()
- }
-
- #define TLS_ABOVE_TP
-+#define GAP_ABOVE_TP 0
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000)
-
- #define DTP_OFFSET 0x8000
-diff --git a/arch/sh/pthread_arch.h b/arch/sh/pthread_arch.h
-index 2756e7e..41fefac 100644
---- a/arch/sh/pthread_arch.h
-+++ b/arch/sh/pthread_arch.h
-@@ -2,10 +2,11 @@ static inline struct pthread *__pthread_self()
- {
- char *self;
- __asm__ __volatile__ ("stc gbr,%0" : "=r" (self) );
-- return (struct pthread *) (self + 8 - sizeof(struct pthread));
-+ return (struct pthread *) (self - sizeof(struct pthread));
- }
-
- #define TLS_ABOVE_TP
--#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 8)
-+#define GAP_ABOVE_TP 8
-+#define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread))
-
- #define MC_PC sc_pc
-diff --git a/arch/sh/reloc.h b/arch/sh/reloc.h
-index 0238ce0..a1f16cb 100644
---- a/arch/sh/reloc.h
-+++ b/arch/sh/reloc.h
-@@ -20,7 +20,7 @@
-
- #define LDSO_ARCH "sh" ENDIAN_SUFFIX FP_SUFFIX ABI_SUFFIX
-
--#define TPOFF_K 8
-+#define TPOFF_K 0
-
- #define REL_SYMBOLIC R_SH_DIR32
- #define REL_OFFSET R_SH_REL32
-diff --git a/ldso/dynlink.c b/ldso/dynlink.c
-index cea5f45..c6216b7 100644
---- a/ldso/dynlink.c
-+++ b/ldso/dynlink.c
-@@ -1594,8 +1594,9 @@ _Noreturn void __dls3(size_t *sp)
- libc.tls_head = tls_tail = &app.tls;
- app.tls_id = tls_cnt = 1;
- #ifdef TLS_ABOVE_TP
-- app.tls.offset = 0;
-- tls_offset = app.tls.size
-+ app.tls.offset = GAP_ABOVE_TP;
-+ app.tls.offset += -GAP_ABOVE_TP & (app.tls.align-1);
-+ tls_offset = app.tls.offset + app.tls.size
- + ( -((uintptr_t)app.tls.image + app.tls.size)
- & (app.tls.align-1) );
- #else
-diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c
-index 1c5d98a..31d324a 100644
---- a/src/env/__init_tls.c
-+++ b/src/env/__init_tls.c
-@@ -104,13 +104,19 @@ static void static_init_tls(size_t *aux)
-
- main_tls.size += (-main_tls.size - (uintptr_t)main_tls.image)
- & (main_tls.align-1);
-- if (main_tls.align < MIN_TLS_ALIGN) main_tls.align = MIN_TLS_ALIGN;
--#ifndef TLS_ABOVE_TP
-+#ifdef TLS_ABOVE_TP
-+ main_tls.offset = GAP_ABOVE_TP;
-+ main_tls.offset += -GAP_ABOVE_TP & (main_tls.align-1);
-+#else
- main_tls.offset = main_tls.size;
- #endif
-+ if (main_tls.align < MIN_TLS_ALIGN) main_tls.align = MIN_TLS_ALIGN;
-
- libc.tls_align = main_tls.align;
- libc.tls_size = 2*sizeof(void *) + sizeof(struct pthread)
-+#ifdef TLS_ABOVE_TP
-+ + main_tls.offset
-+#endif
- + main_tls.size + main_tls.align
- + MIN_TLS_ALIGN-1 & -MIN_TLS_ALIGN;
-
-diff --git a/src/ldso/aarch64/tlsdesc.s b/src/ldso/aarch64/tlsdesc.s
-index 8ed5c26..8e4004d 100644
---- a/src/ldso/aarch64/tlsdesc.s
-+++ b/src/ldso/aarch64/tlsdesc.s
-@@ -14,7 +14,7 @@ __tlsdesc_static:
- // size_t __tlsdesc_dynamic(size_t *a)
- // {
- // struct {size_t modidx,off;} *p = (void*)a[1];
--// size_t *dtv = *(size_t**)(tp + 16 - 8);
-+// size_t *dtv = *(size_t**)(tp - 8);
- // if (p->modidx <= dtv[0])
- // return dtv[p->modidx] + p->off - tp;
- // return __tls_get_new(p) - tp;
-@@ -28,8 +28,7 @@ __tlsdesc_dynamic:
- mrs x1,tpidr_el0 // tp
- ldr x0,[x0,#8] // p
- ldr x2,[x0] // p->modidx
-- add x3,x1,#8
-- ldr x3,[x3] // dtv
-+ ldr x3,[x1,#-8] // dtv
- ldr x4,[x3] // dtv[0]
- cmp x2,x4
- b.hi 1f
---
-cgit v0.11.2
-