- mem += -size & (4*sizeof(size_t)-1);
- mem += ((uintptr_t)image - (uintptr_t)mem) & (align-1);
- memcpy(mem, image, len);
- return mem + size;
+ pthread_t td;
+ if (!T.image) return mem;
+ void **dtv = (void *)mem;
+ dtv[0] = (void *)1;
+#ifdef TLS_ABOVE_TP
+ mem += sizeof(void *) * 2;
+ mem += -((uintptr_t)mem + sizeof(struct pthread)) & (T.align-1);
+ td = (pthread_t)mem;
+ mem += sizeof(struct pthread);
+#else
+ mem += libc.tls_size - sizeof(struct pthread);
+ mem -= (uintptr_t)mem & (T.align-1);
+ td = (pthread_t)mem;
+ mem -= T.size;
+#endif
+ td->dtv = dtv;
+ dtv[1] = mem;
+ memcpy(mem, T.image, T.len);
+ return td;
+}
+
+void *__tls_get_addr(size_t *v)
+{
+ return (char *)__pthread_self()->dtv[1]+v[1];