From ac433bfd6b7c2b5e61778f279287cb74c05675e5 Mon Sep 17 00:00:00 2001 From: John Date: Sun, 20 Oct 2024 19:20:06 +0200 Subject: [PATCH] musl: pthread for chromium --- ...hread_self-thread-pointer-adjustment.patch | 371 ++++++++++++++++++ ...-pthread-struct-members-repeated-for.patch | 164 ++++++++ srcpkgs/musl/template | 2 +- 3 files changed, 536 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/musl/patches/pthread_0001-deduplicate-__pthread_self-thread-pointer-adjustment.patch create mode 100644 srcpkgs/musl/patches/pthread_0002-remove-redundant-pthread-struct-members-repeated-for.patch diff --git a/srcpkgs/musl/patches/pthread_0001-deduplicate-__pthread_self-thread-pointer-adjustment.patch b/srcpkgs/musl/patches/pthread_0001-deduplicate-__pthread_self-thread-pointer-adjustment.patch new file mode 100644 index 00000000000000..cf331af57851f5 --- /dev/null +++ b/srcpkgs/musl/patches/pthread_0001-deduplicate-__pthread_self-thread-pointer-adjustment.patch @@ -0,0 +1,371 @@ +From 3a5b9ae7cf656648c80fe155a5239d9b4fb4c485 Mon Sep 17 00:00:00 2001 +From: Rich Felker +Date: Mon, 24 Aug 2020 22:23:08 -0400 +Subject: [PATCH 1/2] deduplicate __pthread_self thread pointer adjustment out + of each arch + +the adjustment made is entirely a function of TLS_ABOVE_TP and +TP_OFFSET. aside from avoiding repetition of the TP_OFFSET value and +arithmetic, this change makes pthread_arch.h independent of the +definition of struct __pthread from pthread_impl.h. this in turn will +allow inclusion of pthread_arch.h to be moved to the top of +pthread_impl.h so that it can influence the definition of the +structure. + +previously, arch files were very inconsistent about the type used for +the thread pointer. this change unifies the new __get_tp interface to +always use uintptr_t, which is the most correct when performing +arithmetic that may involve addresses outside the actual pointed-to +object (due to TP_OFFSET). +--- + arch/aarch64/pthread_arch.h | 8 ++++---- + arch/arm/pthread_arch.h | 16 ++++++++-------- + arch/i386/pthread_arch.h | 8 ++++---- + arch/m68k/pthread_arch.h | 5 ++--- + arch/microblaze/pthread_arch.h | 8 ++++---- + arch/mips/pthread_arch.h | 8 ++++---- + arch/mips64/pthread_arch.h | 8 ++++---- + arch/mipsn32/pthread_arch.h | 8 ++++---- + arch/or1k/pthread_arch.h | 9 ++++----- + arch/powerpc/pthread_arch.h | 6 +++--- + arch/powerpc64/pthread_arch.h | 6 +++--- + arch/riscv64/pthread_arch.h | 6 +++--- + arch/s390x/pthread_arch.h | 8 ++++---- + arch/sh/pthread_arch.h | 8 ++++---- + arch/x32/pthread_arch.h | 8 ++++---- + arch/x86_64/pthread_arch.h | 8 ++++---- + src/internal/pthread_impl.h | 2 ++ + 17 files changed, 65 insertions(+), 65 deletions(-) + +diff --git a/arch/aarch64/pthread_arch.h b/arch/aarch64/pthread_arch.h +index f3c005c7..3909616c 100644 +--- a/arch/aarch64/pthread_arch.h ++++ b/arch/aarch64/pthread_arch.h +@@ -1,8 +1,8 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- char *self; +- __asm__ ("mrs %0,tpidr_el0" : "=r"(self)); +- return (void*)(self - sizeof(struct pthread)); ++ uintptr_t tp; ++ __asm__ ("mrs %0,tpidr_el0" : "=r"(tp)); ++ return tp; + } + + #define TLS_ABOVE_TP +diff --git a/arch/arm/pthread_arch.h b/arch/arm/pthread_arch.h +index 48640985..157e2eae 100644 +--- a/arch/arm/pthread_arch.h ++++ b/arch/arm/pthread_arch.h +@@ -1,11 +1,11 @@ + #if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \ + || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 + +-static inline pthread_t __pthread_self() ++static inline uintptr_t __get_tp() + { +- char *p; +- __asm__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(p) ); +- return (void *)(p-sizeof(struct pthread)); ++ uintptr_t tp; ++ __asm__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(tp) ); ++ return tp; + } + + #else +@@ -16,12 +16,12 @@ static inline pthread_t __pthread_self() + #define BLX "blx" + #endif + +-static inline pthread_t __pthread_self() ++static inline uintptr_t __get_tp() + { + extern hidden uintptr_t __a_gettp_ptr; +- register uintptr_t p __asm__("r0"); +- __asm__ ( BLX " %1" : "=r"(p) : "r"(__a_gettp_ptr) : "cc", "lr" ); +- return (void *)(p-sizeof(struct pthread)); ++ register uintptr_t tp __asm__("r0"); ++ __asm__ ( BLX " %1" : "=r"(tp) : "r"(__a_gettp_ptr) : "cc", "lr" ); ++ return tp; + } + + #endif +diff --git a/arch/i386/pthread_arch.h b/arch/i386/pthread_arch.h +index 32570a17..a639c382 100644 +--- a/arch/i386/pthread_arch.h ++++ b/arch/i386/pthread_arch.h +@@ -1,8 +1,8 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- struct pthread *self; +- __asm__ ("movl %%gs:0,%0" : "=r" (self) ); +- return self; ++ uintptr_t tp; ++ __asm__ ("movl %%gs:0,%0" : "=r" (tp) ); ++ return tp; + } + + #define MC_PC gregs[REG_EIP] +diff --git a/arch/m68k/pthread_arch.h b/arch/m68k/pthread_arch.h +index 7c9990c2..5bea4e1a 100644 +--- a/arch/m68k/pthread_arch.h ++++ b/arch/m68k/pthread_arch.h +@@ -1,7 +1,6 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- uintptr_t tp = __syscall(SYS_get_thread_area); +- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread)); ++ return __syscall(SYS_get_thread_area); + } + + #define TLS_ABOVE_TP +diff --git a/arch/microblaze/pthread_arch.h b/arch/microblaze/pthread_arch.h +index c327f4eb..ff26624e 100644 +--- a/arch/microblaze/pthread_arch.h ++++ b/arch/microblaze/pthread_arch.h +@@ -1,8 +1,8 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- struct pthread *self; +- __asm__ ("ori %0, r21, 0" : "=r" (self) ); +- return self; ++ uintptr_t tp; ++ __asm__ ("ori %0, r21, 0" : "=r" (tp) ); ++ return tp; + } + + #define MC_PC regs.pc +diff --git a/arch/mips/pthread_arch.h b/arch/mips/pthread_arch.h +index c22eb34d..c45347ab 100644 +--- a/arch/mips/pthread_arch.h ++++ b/arch/mips/pthread_arch.h +@@ -1,13 +1,13 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { + #if __mips_isa_rev < 2 +- register char *tp __asm__("$3"); ++ register uintptr_t tp __asm__("$3"); + __asm__ (".word 0x7c03e83b" : "=r" (tp) ); + #else +- char *tp; ++ uintptr_t tp; + __asm__ ("rdhwr %0, $29" : "=r" (tp) ); + #endif +- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread)); ++ return tp; + } + + #define TLS_ABOVE_TP +diff --git a/arch/mips64/pthread_arch.h b/arch/mips64/pthread_arch.h +index c22eb34d..c45347ab 100644 +--- a/arch/mips64/pthread_arch.h ++++ b/arch/mips64/pthread_arch.h +@@ -1,13 +1,13 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { + #if __mips_isa_rev < 2 +- register char *tp __asm__("$3"); ++ register uintptr_t tp __asm__("$3"); + __asm__ (".word 0x7c03e83b" : "=r" (tp) ); + #else +- char *tp; ++ uintptr_t tp; + __asm__ ("rdhwr %0, $29" : "=r" (tp) ); + #endif +- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread)); ++ return tp; + } + + #define TLS_ABOVE_TP +diff --git a/arch/mipsn32/pthread_arch.h b/arch/mipsn32/pthread_arch.h +index c22eb34d..c45347ab 100644 +--- a/arch/mipsn32/pthread_arch.h ++++ b/arch/mipsn32/pthread_arch.h +@@ -1,13 +1,13 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { + #if __mips_isa_rev < 2 +- register char *tp __asm__("$3"); ++ register uintptr_t tp __asm__("$3"); + __asm__ (".word 0x7c03e83b" : "=r" (tp) ); + #else +- char *tp; ++ uintptr_t tp; + __asm__ ("rdhwr %0, $29" : "=r" (tp) ); + #endif +- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread)); ++ return tp; + } + + #define TLS_ABOVE_TP +diff --git a/arch/or1k/pthread_arch.h b/arch/or1k/pthread_arch.h +index 76d0a8bc..f75ea7e4 100644 +--- a/arch/or1k/pthread_arch.h ++++ b/arch/or1k/pthread_arch.h +@@ -1,14 +1,13 @@ +-/* or1k use variant I, but with the twist that tp points to the end of TCB */ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { + #ifdef __clang__ +- char *tp; ++ uintptr_t tp; + __asm__ ("l.ori %0, r10, 0" : "=r" (tp) ); + #else +- register char *tp __asm__("r10"); ++ register uintptr_t tp __asm__("r10"); + __asm__ ("" : "=r" (tp) ); + #endif +- return (struct pthread *) (tp - sizeof(struct pthread)); ++ return tp; + } + + #define TLS_ABOVE_TP +diff --git a/arch/powerpc/pthread_arch.h b/arch/powerpc/pthread_arch.h +index 9697046b..a0947763 100644 +--- a/arch/powerpc/pthread_arch.h ++++ b/arch/powerpc/pthread_arch.h +@@ -1,8 +1,8 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- register char *tp __asm__("r2"); ++ register uintptr_t tp __asm__("r2"); + __asm__ ("" : "=r" (tp) ); +- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread)); ++ return tp; + } + + #define TLS_ABOVE_TP +diff --git a/arch/powerpc64/pthread_arch.h b/arch/powerpc64/pthread_arch.h +index e9dba43f..08a557d2 100644 +--- a/arch/powerpc64/pthread_arch.h ++++ b/arch/powerpc64/pthread_arch.h +@@ -1,8 +1,8 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- register char *tp __asm__("r13"); ++ register uintptr_t tp __asm__("r13"); + __asm__ ("" : "=r" (tp) ); +- return (pthread_t)(tp - 0x7000 - sizeof(struct pthread)); ++ return tp; + } + + #define TLS_ABOVE_TP +diff --git a/arch/riscv64/pthread_arch.h b/arch/riscv64/pthread_arch.h +index 50f0868d..a20d7fba 100644 +--- a/arch/riscv64/pthread_arch.h ++++ b/arch/riscv64/pthread_arch.h +@@ -1,8 +1,8 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- char *tp; ++ uintptr_t tp; + __asm__ __volatile__("mv %0, tp" : "=r"(tp)); +- return (void *)(tp - sizeof(struct pthread)); ++ return tp; + } + + #define TLS_ABOVE_TP +diff --git a/arch/s390x/pthread_arch.h b/arch/s390x/pthread_arch.h +index 5d22546b..e54fec3f 100644 +--- a/arch/s390x/pthread_arch.h ++++ b/arch/s390x/pthread_arch.h +@@ -1,12 +1,12 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- struct pthread *self; ++ uintptr_t tp; + __asm__ ( + "ear %0, %%a0\n" + "sllg %0, %0, 32\n" + "ear %0, %%a1\n" +- : "=r"(self)); +- return self; ++ : "=r"(tp)); ++ return tp; + } + + #define MC_PC psw.addr +diff --git a/arch/sh/pthread_arch.h b/arch/sh/pthread_arch.h +index c2252908..0fcf70d2 100644 +--- a/arch/sh/pthread_arch.h ++++ b/arch/sh/pthread_arch.h +@@ -1,8 +1,8 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- char *self; +- __asm__ ("stc gbr,%0" : "=r" (self) ); +- return (struct pthread *) (self - sizeof(struct pthread)); ++ uintptr_t tp; ++ __asm__ ("stc gbr,%0" : "=r" (tp) ); ++ return tp; + } + + #define TLS_ABOVE_TP +diff --git a/arch/x32/pthread_arch.h b/arch/x32/pthread_arch.h +index fa452839..6e2495da 100644 +--- a/arch/x32/pthread_arch.h ++++ b/arch/x32/pthread_arch.h +@@ -1,8 +1,8 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- struct pthread *self; +- __asm__ ("mov %%fs:0,%0" : "=r" (self) ); +- return self; ++ uintptr_t tp; ++ __asm__ ("mov %%fs:0,%0" : "=r" (tp) ); ++ return tp; + } + + #define MC_PC gregs[REG_RIP] +diff --git a/arch/x86_64/pthread_arch.h b/arch/x86_64/pthread_arch.h +index 1c64a840..c8c63f2e 100644 +--- a/arch/x86_64/pthread_arch.h ++++ b/arch/x86_64/pthread_arch.h +@@ -1,8 +1,8 @@ +-static inline struct pthread *__pthread_self() ++static inline uintptr_t __get_tp() + { +- struct pthread *self; +- __asm__ ("mov %%fs:0,%0" : "=r" (self) ); +- return self; ++ uintptr_t tp; ++ __asm__ ("mov %%fs:0,%0" : "=r" (tp) ); ++ return tp; + } + + #define MC_PC gregs[REG_RIP] +diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h +index 3c2bd767..58e06136 100644 +--- a/src/internal/pthread_impl.h ++++ b/src/internal/pthread_impl.h +@@ -108,6 +108,12 @@ + #define DTP_OFFSET 0 + #endif + ++#ifdef TLS_ABOVE_TP ++#define __pthread_self() ((pthread_t)(__get_tp() - sizeof(struct __pthread) - TP_OFFSET)) ++#else ++#define __pthread_self() ((pthread_t)__get_tp()) ++#endif ++ + #ifndef tls_mod_off_t + #define tls_mod_off_t size_t + #endif + +-- +2.47.0 + diff --git a/srcpkgs/musl/patches/pthread_0002-remove-redundant-pthread-struct-members-repeated-for.patch b/srcpkgs/musl/patches/pthread_0002-remove-redundant-pthread-struct-members-repeated-for.patch new file mode 100644 index 00000000000000..6f784c518ead4a --- /dev/null +++ b/srcpkgs/musl/patches/pthread_0002-remove-redundant-pthread-struct-members-repeated-for.patch @@ -0,0 +1,164 @@ +From 57f6e85c9de417fef5eece2a5b00c1104321f543 Mon Sep 17 00:00:00 2001 +From: Rich Felker +Date: Mon, 24 Aug 2020 22:45:51 -0400 +Subject: [PATCH 2/2] remove redundant pthread struct members repeated for + layout purposes + +dtv_copy, canary2, and canary_at_end existed solely to match multiple +ABI and asm-accessed layouts simultaneously. now that pthread_arch.h +can be included before struct __pthread is defined, the struct layout +can depend on macros defined by pthread_arch.h. +--- + arch/powerpc/pthread_arch.h | 2 -- + arch/powerpc64/pthread_arch.h | 2 -- + arch/x32/pthread_arch.h | 2 +- + ldso/dynlink.c | 2 +- + src/env/__init_tls.c | 2 +- + src/env/__stack_chk_fail.c | 2 +- + src/internal/pthread_impl.h | 23 ++++++++++++++--------- + src/thread/pthread_create.c | 2 +- + 8 files changed, 19 insertions(+), 18 deletions(-) + +diff --git a/arch/powerpc/pthread_arch.h b/arch/powerpc/pthread_arch.h +index a0947763..42e88b07 100644 +--- a/arch/powerpc/pthread_arch.h ++++ b/arch/powerpc/pthread_arch.h +@@ -14,5 +14,3 @@ static inline uintptr_t __get_tp() + // the kernel calls the ip "nip", it's the first saved value after the 32 + // GPRs. + #define MC_PC gregs[32] +- +-#define CANARY canary_at_end +diff --git a/arch/powerpc64/pthread_arch.h b/arch/powerpc64/pthread_arch.h +index 08a557d2..1b7b9079 100644 +--- a/arch/powerpc64/pthread_arch.h ++++ b/arch/powerpc64/pthread_arch.h +@@ -14,5 +14,3 @@ static inline uintptr_t __get_tp() + // the kernel calls the ip "nip", it's the first saved value after the 32 + // GPRs. + #define MC_PC gp_regs[32] +- +-#define CANARY canary_at_end +diff --git a/arch/x32/pthread_arch.h b/arch/x32/pthread_arch.h +index 6e2495da..c1e7716d 100644 +--- a/arch/x32/pthread_arch.h ++++ b/arch/x32/pthread_arch.h +@@ -7,6 +7,6 @@ static inline uintptr_t __get_tp() + + #define MC_PC gregs[REG_RIP] + +-#define CANARY canary2 ++#define CANARY_PAD + + #define tls_mod_off_t unsigned long long +diff --git a/ldso/dynlink.c b/ldso/dynlink.c +index d3d4ddd2..f7474743 100644 +--- a/ldso/dynlink.c ++++ b/ldso/dynlink.c +@@ -1579,7 +1579,7 @@ static void install_new_tls(void) + + /* Install new dtv for each thread. */ + for (j=0, td=self; !j || td!=self; j++, td=td->next) { +- td->dtv = td->dtv_copy = newdtv[j]; ++ td->dtv = newdtv[j]; + } + + __tl_unlock(); +diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c +index 772baba3..a93141ed 100644 +--- a/src/env/__init_tls.c ++++ b/src/env/__init_tls.c +@@ -67,7 +67,7 @@ void *__copy_tls(unsigned char *mem) + } + #endif + dtv[0] = libc.tls_cnt; +- td->dtv = td->dtv_copy = dtv; ++ td->dtv = dtv; + return td; + } + +diff --git a/src/env/__stack_chk_fail.c b/src/env/__stack_chk_fail.c +index e32596d1..bf5a280a 100644 +--- a/src/env/__stack_chk_fail.c ++++ b/src/env/__stack_chk_fail.c +@@ -9,7 +9,7 @@ void __init_ssp(void *entropy) + if (entropy) memcpy(&__stack_chk_guard, entropy, sizeof(uintptr_t)); + else __stack_chk_guard = (uintptr_t)&__stack_chk_guard * 1103515245; + +- __pthread_self()->CANARY = __stack_chk_guard; ++ __pthread_self()->canary = __stack_chk_guard; + } + + void __stack_chk_fail(void) +diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h +index 58e06136..4d709bbc 100644 +--- a/src/internal/pthread_impl.h ++++ b/src/internal/pthread_impl.h +@@ -11,16 +11,25 @@ + #include "atomic.h" + #include "futex.h" + ++#include "pthread_arch.h" ++ + #define pthread __pthread + + struct pthread { + /* Part 1 -- these fields may be external or + * internal (accessed via asm) ABI. Do not change. */ + struct pthread *self; ++#ifndef TLS_ABOVE_TP + uintptr_t *dtv; ++#endif + struct pthread *prev, *next; /* non-ABI */ + uintptr_t sysinfo; +- uintptr_t canary, canary2; ++#ifndef TLS_ABOVE_TP ++#ifdef CANARY_PAD ++ uintptr_t canary_pad; ++#endif ++ uintptr_t canary; ++#endif + + /* Part 2 -- implementation details, non-ABI. */ + int tid; +@@ -52,8 +61,10 @@ struct pthread { + + /* Part 3 -- the positions of these fields relative to + * the end of the structure is external and internal ABI. */ +- uintptr_t canary_at_end; +- uintptr_t *dtv_copy; ++#ifdef TLS_ABOVE_TP ++ uintptr_t canary; ++ uintptr_t *dtv; ++#endif + }; + + enum { +@@ -109,12 +109,6 @@ + #define _b_waiters2 __u.__vi[4] + #define _b_inst __u.__p[3] + +-#include "pthread_arch.h" +- +-#ifndef CANARY +-#define CANARY canary +-#endif +- + #ifndef DTP_OFFSET + #define DTP_OFFSET 0 + #endif +diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c +index 10f1b7d8..55744155 100644 +--- a/src/thread/pthread_create.c ++++ b/src/thread/pthread_create.c +@@ -314,7 +314,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att + new->detach_state = DT_JOINABLE; + } + new->robust_list.head = &new->robust_list.head; +- new->CANARY = self->CANARY; ++ new->canary = self->canary; + new->sysinfo = self->sysinfo; + + /* Setup argument structure for the new thread on its stack. +-- +2.47.0 diff --git a/srcpkgs/musl/template b/srcpkgs/musl/template index 02a1f4e02a501f..66e5cf056e9624 100644 --- a/srcpkgs/musl/template +++ b/srcpkgs/musl/template @@ -2,7 +2,7 @@ pkgname=musl reverts="1.2.0_1" version=1.1.24 -revision=21 +revision=22 archs="*-musl" bootstrap=yes build_style=gnu-configure