projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix mknod and mknodat to accept large dev_t values
[musl]
/
src
/
env
/
__init_tls.c
diff --git
a/src/env/__init_tls.c
b/src/env/__init_tls.c
index
6b3cd28
..
eb2a6e4
100644
(file)
--- a/
src/env/__init_tls.c
+++ b/
src/env/__init_tls.c
@@
-1,5
+1,7
@@
#include <elf.h>
#include <limits.h>
#include <elf.h>
#include <limits.h>
+#include <sys/mman.h>
+#include <string.h>
#include "pthread_impl.h"
#include "libc.h"
#include "atomic.h"
#include "pthread_impl.h"
#include "libc.h"
#include "atomic.h"
@@
-15,11
+17,18
@@
void *__copy_tls(unsigned char *mem)
if (!image) return mem;
void **dtv = (void *)mem;
dtv[0] = (void *)1;
if (!image) return mem;
void **dtv = (void *)mem;
dtv[0] = (void *)1;
- mem += __libc.tls_size - sizeof(struct pthread);
+#ifdef TLS_ABOVE_TP
+ mem += sizeof(void *) * 2;
+ mem += -((uintptr_t)mem + sizeof(struct pthread)) & (align-1);
+ td = (pthread_t)mem;
+ mem += sizeof(struct pthread);
+#else
+ mem += libc.tls_size - sizeof(struct pthread);
mem -= (uintptr_t)mem & (align-1);
td = (pthread_t)mem;
td->dtv = dtv;
mem -= size;
mem -= (uintptr_t)mem & (align-1);
td = (pthread_t)mem;
td->dtv = dtv;
mem -= size;
+#endif
dtv[1] = mem;
memcpy(mem, image, len);
return td;
dtv[1] = mem;
memcpy(mem, image, len);
return td;
@@
-33,7
+42,7
@@
void *__tls_get_addr(size_t *v)
static void *simple(void *p)
{
*(void **)p = p;
static void *simple(void *p)
{
*(void **)p = p;
- return __set_thread_area(
p
) ? 0 : p;
+ return __set_thread_area(
TP_ADJ(p)
) ? 0 : p;
}
weak_alias(simple, __install_initial_tls);
}
weak_alias(simple, __install_initial_tls);
@@
-46,19
+55,16
@@
typedef Elf32_Phdr Phdr;
typedef Elf64_Phdr Phdr;
#endif
typedef Elf64_Phdr Phdr;
#endif
-#define AUX_CNT 6
-
-void __init_tls(size_t *auxv)
+void __init_tls(size_t *aux)
{
{
- size_t i, aux[AUX_CNT] = { 0 };
unsigned char *p, *mem;
unsigned char *p, *mem;
- size_t n
, d
;
+ size_t n;
Phdr *phdr, *tls_phdr=0;
size_t base = 0;
Phdr *phdr, *tls_phdr=0;
size_t base = 0;
-
for (; auxv[0]; auxv+=2) if (auxv[0]<AUX_CNT) aux[auxv[0]] = auxv[1]
;
- p = (void *)aux[AT_PHDR];
- for (p=(void *)aux[AT_PHDR]
; aux[AT_PHNUM]--;
p+=aux[AT_PHENT]) {
+
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)
base = aux[AT_PHDR] - phdr->p_vaddr;
phdr = (void *)p;
if (phdr->p_type == PT_PHDR)
base = aux[AT_PHDR] - phdr->p_vaddr;
@@
-79,8
+85,6
@@
void __init_tls(size_t *auxv)
mem = __mmap(0, libc.tls_size, PROT_READ|PROT_WRITE,
MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
mem = __mmap(0, libc.tls_size, PROT_READ|PROT_WRITE,
MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
- if (mem == MAP_FAILED) a_crash();
-
if (!__install_initial_tls(__copy_tls(mem))) a_crash();
}
#else
if (!__install_initial_tls(__copy_tls(mem))) a_crash();
}
#else