X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fenv%2F__init_tls.c;h=73551e6c4173af5976c3084a728efc4707d8e0a3;hb=cd7159e7be73451befedce2e9dfd9f6a4c3b21f0;hp=efa072842999c6cbb959cc33a4c3c7587578c821;hpb=0bc03091bb674ebb9fa6fe69e4aec1da3ac484f2;p=musl diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c index efa07284..73551e6c 100644 --- a/src/env/__init_tls.c +++ b/src/env/__init_tls.c @@ -2,11 +2,15 @@ #include #include #include +#include #include "pthread_impl.h" #include "libc.h" #include "atomic.h" #include "syscall.h" +#ifndef SHARED +static +#endif int __init_tp(void *p) { pthread_t td = p; @@ -14,20 +18,25 @@ int __init_tp(void *p) int r = __set_thread_area(TP_ADJ(p)); if (r < 0) return -1; if (!r) libc.can_do_threads = 1; - libc.has_thread_pointer = 1; - td->tid = td->pid = __syscall(SYS_set_tid_address, &td->tid); + td->tid = __syscall(SYS_set_tid_address, &td->tid); td->locale = &libc.global_locale; + td->robust_list.head = &td->robust_list.head; return 0; } #ifndef SHARED -static long long builtin_tls[(sizeof(struct pthread) + 64)/sizeof(long long)]; +static struct builtin_tls { + char c; + struct pthread pt; + void *space[16]; +} builtin_tls[1]; +#define MIN_TLS_ALIGN offsetof(struct builtin_tls, pt) struct tls_image { void *image; size_t len, size, align; -} __static_tls ATTR_LIBC_VISIBILITY; +} __static_tls; #define T __static_tls @@ -48,7 +57,7 @@ void *__copy_tls(unsigned char *mem) td = (pthread_t)mem; mem -= T.size; #endif - td->dtv = dtv; + td->dtv = td->dtv_copy = dtv; dtv[1] = mem; memcpy(mem, T.image, T.len); return td; @@ -68,8 +77,6 @@ void __init_tls(size_t *aux) size_t base = 0; void *mem; - libc.tls_size = sizeof(struct pthread); - for (p=(void *)aux[AT_PHDR],n=aux[AT_PHNUM]; n; n--,p+=aux[AT_PHENT]) { phdr = (void *)p; if (phdr->p_type == PT_PHDR) @@ -86,17 +93,17 @@ void __init_tls(size_t *aux) } T.size += (-T.size - (uintptr_t)T.image) & (T.align-1); - if (T.align < 4*sizeof(size_t)) T.align = 4*sizeof(size_t); + if (T.align < MIN_TLS_ALIGN) T.align = MIN_TLS_ALIGN; - libc.tls_size = 2*sizeof(void *)+T.size+T.align+sizeof(struct pthread); + libc.tls_size = 2*sizeof(void *)+T.size+T.align+sizeof(struct pthread) + + MIN_TLS_ALIGN-1 & -MIN_TLS_ALIGN; if (libc.tls_size > sizeof builtin_tls) { +#ifndef SYS_mmap2 +#define SYS_mmap2 SYS_mmap +#endif mem = (void *)__syscall( -#ifdef SYS_mmap2 SYS_mmap2, -#else - SYS_mmap, -#endif 0, libc.tls_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); /* -4095...-1 cast to void * will crash on dereference anyway, @@ -106,8 +113,8 @@ void __init_tls(size_t *aux) mem = builtin_tls; } - /* Failure to initialize thread pointer is fatal if TLS is used. */ - if (__init_tp(__copy_tls(mem)) < 0 && tls_phdr) + /* Failure to initialize thread pointer is always fatal. */ + if (__init_tp(__copy_tls(mem)) < 0) a_crash(); } #else