Page MenuHomeFreeBSD

D50227.id155024.diff
No OneTemporary

D50227.id155024.diff

diff --git a/lib/libc/gen/tls.c b/lib/libc/gen/tls.c
--- a/lib/libc/gen/tls.c
+++ b/lib/libc/gen/tls.c
@@ -323,62 +323,58 @@
* Allocate Static TLS using the Variant II method.
*/
void *
-__libc_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign)
+__libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
{
size_t size;
- char *tls;
- uintptr_t *dtv;
- uintptr_t segbase, oldsegbase;
+ char *tls_block, *tls;
+ uintptr_t *dtv, **tcb;
tcbalign = MAX(tcbalign, libc_tls_init_align);
size = roundup2(libc_tls_static_space, tcbalign);
if (tcbsize < 2 * sizeof(uintptr_t))
tcbsize = 2 * sizeof(uintptr_t);
- tls = libc_malloc_aligned(size + tcbsize, tcbalign);
- if (tls == NULL) {
+ tls_block = libc_malloc_aligned(size + tcbsize, tcbalign);
+ if (tls_block == NULL) {
tls_msg("__libc_allocate_tls: Out of memory.\n");
abort();
}
- memset(tls, 0, size + tcbsize);
+ memset(tls_block, 0, size + tcbsize);
dtv = __je_bootstrap_malloc(3 * sizeof(uintptr_t));
if (dtv == NULL) {
tls_msg("__libc_allocate_tls: Out of memory.\n");
abort();
}
- segbase = (uintptr_t)(tls + size);
- ((uintptr_t *)segbase)[0] = segbase;
- ((uintptr_t *)segbase)[1] = (uintptr_t)dtv;
+ tcb = (uintptr_t **)(tls_block + size);
+ tls = (char *)tcb - libc_tls_static_space;
+ tcb[0] = (uintptr_t *)tcb;
+ tcb[1] = dtv;
dtv[0] = 1;
dtv[1] = 1;
- dtv[2] = segbase - libc_tls_static_space;
+ dtv[2] = (uintptr_t)tls;
- if (oldtls) {
+ if (oldtcb != NULL) {
/*
* Copy the static TLS block over whole.
*/
- oldsegbase = (uintptr_t)oldtls;
- memcpy((void *)(segbase - libc_tls_static_space),
- (const void *)(oldsegbase - libc_tls_static_space),
+ memcpy(tls, (const char *)oldtcb - libc_tls_static_space,
libc_tls_static_space);
/*
* We assume that this block was the one we created with
* allocate_initial_tls().
*/
- _rtld_free_tls(oldtls, 2 * sizeof(uintptr_t),
+ _rtld_free_tls(oldtcb, 2 * sizeof(uintptr_t),
sizeof(uintptr_t));
} else {
- memcpy((void *)(segbase - libc_tls_static_space),
- libc_tls_init, libc_tls_init_size);
- memset((void *)(segbase - libc_tls_static_space +
- libc_tls_init_size), 0,
+ memcpy(tls, libc_tls_init, libc_tls_init_size);
+ memset(tls + libc_tls_init_size, 0,
libc_tls_static_space - libc_tls_init_size);
}
- return (void*) segbase;
+ return (tcb);
}
#endif /* TLS_VARIANT_II */
@@ -386,7 +382,7 @@
#else
void *
-__libc_allocate_tls(void *oldtls __unused, size_t tcbsize __unused,
+__libc_allocate_tls(void *oldtcb __unused, size_t tcbsize __unused,
size_t tcbalign __unused)
{
return (0);
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -5476,13 +5476,13 @@
* Allocate Static TLS using the Variant II method.
*/
void *
-allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign)
+allocate_tls(Obj_Entry *objs, void *oldtcb, size_t tcbsize, size_t tcbalign)
{
Obj_Entry *obj;
size_t size, ralign;
- char *tls;
+ char *tls_block;
uintptr_t *dtv, *olddtv;
- uintptr_t segbase, oldsegbase;
+ uintptr_t **tcb;
char *addr;
size_t i;
@@ -5492,33 +5492,32 @@
size = roundup(tls_static_space, ralign) + roundup(tcbsize, ralign);
assert(tcbsize >= 2 * sizeof(uintptr_t));
- tls = xmalloc_aligned(size, ralign, 0 /* XXX */);
+ tls_block = xmalloc_aligned(size, ralign, 0 /* XXX */);
dtv = xcalloc(tls_max_index + 2, sizeof(uintptr_t));
- segbase = (uintptr_t)(tls + roundup(tls_static_space, ralign));
- ((uintptr_t *)segbase)[0] = segbase;
- ((uintptr_t *)segbase)[1] = (uintptr_t)dtv;
+ tcb = (uintptr_t **)(tls_block + roundup(tls_static_space, ralign));
+ tcb[0] = (uintptr_t *)tcb;
+ tcb[1] = dtv;
dtv[0] = tls_dtv_generation;
dtv[1] = tls_max_index;
- if (oldtls != NULL) {
+ if (oldtcb != NULL) {
/*
* Copy the static TLS block over whole.
*/
- oldsegbase = (uintptr_t)oldtls;
- memcpy((void *)(segbase - tls_static_space),
- (const void *)(oldsegbase - tls_static_space),
+ memcpy((char *)tcb - tls_static_space,
+ (const char *)oldtcb - tls_static_space,
tls_static_space);
/*
* If any dynamic TLS blocks have been created tls_get_addr(),
* move them over.
*/
- olddtv = ((uintptr_t **)oldsegbase)[1];
+ olddtv = ((uintptr_t **)oldtcb)[1];
for (i = 0; i < olddtv[1]; i++) {
- if (olddtv[i + 2] < oldsegbase - size ||
- olddtv[i + 2] > oldsegbase) {
+ if (olddtv[i + 2] < (uintptr_t)oldtcb - size ||
+ olddtv[i + 2] > (uintptr_t)oldtcb) {
dtv[i + 2] = olddtv[i + 2];
olddtv[i + 2] = 0;
}
@@ -5528,12 +5527,12 @@
* We assume that this block was the one we created with
* allocate_initial_tls().
*/
- free_tls(oldtls, 2 * sizeof(uintptr_t), sizeof(uintptr_t));
+ free_tls(oldtcb, 2 * sizeof(uintptr_t), sizeof(uintptr_t));
} else {
for (obj = objs; obj != NULL; obj = TAILQ_NEXT(obj, next)) {
if (obj->marker || obj->tlsoffset == 0)
continue;
- addr = (char *)segbase - obj->tlsoffset;
+ addr = (char *)tcb - obj->tlsoffset;
memset(addr + obj->tlsinitsize, 0, obj->tlssize -
obj->tlsinitsize);
if (obj->tlsinit) {
@@ -5544,11 +5543,11 @@
}
}
- return ((void *)segbase);
+ return (tcb);
}
void
-free_tls(void *tls, size_t tcbsize __unused, size_t tcbalign)
+free_tls(void *tcb, size_t tcbsize __unused, size_t tcbalign)
{
uintptr_t *dtv;
size_t size, ralign;
@@ -5564,9 +5563,9 @@
ralign = tls_static_max_align;
size = roundup(tls_static_space, ralign);
- dtv = ((uintptr_t **)tls)[1];
+ dtv = ((uintptr_t **)tcb)[1];
dtvsize = dtv[1];
- tlsend = (uintptr_t)tls;
+ tlsend = (uintptr_t)tcb;
tlsstart = tlsend - size;
for (i = 0; i < dtvsize; i++) {
if (dtv[i + 2] != 0 && (dtv[i + 2] < tlsstart ||
@@ -5687,13 +5686,13 @@
}
void *
-_rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign)
+_rtld_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
{
void *ret;
RtldLockState lockstate;
wlock_acquire(rtld_bind_lock, &lockstate);
- ret = allocate_tls(globallist_curr(TAILQ_FIRST(&obj_list)), oldtls,
+ ret = allocate_tls(globallist_curr(TAILQ_FIRST(&obj_list)), oldtcb,
tcbsize, tcbalign);
lock_release(rtld_bind_lock, &lockstate);
return (ret);

File Metadata

Mime Type
text/plain
Expires
Wed, Apr 22, 11:45 AM (21 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31976333
Default Alt Text
D50227.id155024.diff (6 KB)

Event Timeline