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 @@ -201,10 +201,8 @@ __libc_free_tls(void *tcb, size_t tcbsize, size_t tcbalign __unused) { uintptr_t *dtv; - uintptr_t **tls; - tls = (uintptr_t **)tcb; - dtv = tls[0]; + dtv = ((struct tcb *)tcb)->tcb_dtv; __je_bootstrap_free(dtv); libc_free_aligned(get_tls_block_ptr(tcb, tcbsize)); } @@ -232,7 +230,8 @@ void * __libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign) { - uintptr_t *dtv, **tcb; + uintptr_t *dtv; + struct tcb *tcb; char *tls_block, *tls; size_t extra_size, maxalign, post_size, pre_size, tls_block_size; @@ -261,7 +260,7 @@ abort(); } memset(tls_block, 0, tls_block_size); - tcb = (uintptr_t **)(tls_block + pre_size + extra_size); + tcb = (struct tcb *)(tls_block + pre_size + extra_size); tls = (char *)tcb + TLS_TCB_SIZE + post_size; if (oldtcb != NULL) { @@ -270,7 +269,7 @@ libc_free_aligned(oldtcb); /* Adjust the DTV. */ - dtv = tcb[0]; + dtv = tcb->tcb_dtv; dtv[2] = (uintptr_t)tls; } else { dtv = __je_bootstrap_malloc(3 * sizeof(uintptr_t)); @@ -279,7 +278,7 @@ abort(); } /* Build the DTV. */ - tcb[0] = dtv; + tcb->tcb_dtv = dtv; dtv[0] = 1; /* Generation. */ dtv[1] = 1; /* Segments count. */ dtv[2] = (uintptr_t)tls; @@ -312,7 +311,7 @@ tcbalign = MAX(tcbalign, libc_tls_init_align); size = roundup2(libc_tls_static_space, tcbalign); - dtv = ((uintptr_t **)tcb)[1]; + dtv = ((struct tcb *)tcb)->tcb_dtv; tlsend = (uintptr_t)tcb; tlsstart = tlsend - size; libc_free_aligned((void*)tlsstart); @@ -327,7 +326,8 @@ { size_t size; char *tls_block, *tls; - uintptr_t *dtv, **tcb; + uintptr_t *dtv; + struct tcb *tcb; tcbalign = MAX(tcbalign, libc_tls_init_align); size = roundup2(libc_tls_static_space, tcbalign); @@ -346,10 +346,10 @@ abort(); } - tcb = (uintptr_t **)(tls_block + size); + tcb = (struct tcb *)(tls_block + size); tls = (char *)tcb - libc_tls_static_space; - tcb[0] = (uintptr_t *)tcb; - tcb[1] = dtv; + tcb->tcb_self = tcb; + tcb->tcb_dtv = dtv; dtv[0] = 1; dtv[1] = 1;