git: 3703f95c6fca - main - libc: Use struct tcb * rather than uintptr_t ** for the tcb

From: Jessica Clarke <jrtc27_at_FreeBSD.org>
Date: Wed, 07 May 2025 19:22:10 UTC
The branch main has been updated by jrtc27:

URL: https://cgit.FreeBSD.org/src/commit/?id=3703f95c6fcaede56bb1d62c4ac00b933e2eb887

commit 3703f95c6fcaede56bb1d62c4ac00b933e2eb887
Author:     Jessica Clarke <jrtc27@FreeBSD.org>
AuthorDate: 2025-05-07 19:20:10 +0000
Commit:     Jessica Clarke <jrtc27@FreeBSD.org>
CommitDate: 2025-05-07 19:20:10 +0000

    libc: Use struct tcb * rather than uintptr_t ** for the tcb
    
    This lets us access via named struct members rather than magic
    hard-coded indices.
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D50228
---
 lib/libc/gen/tls.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/lib/libc/gen/tls.c b/lib/libc/gen/tls.c
index 9772c99833d5..5b6970ad3905 100644
--- a/lib/libc/gen/tls.c
+++ b/lib/libc/gen/tls.c
@@ -201,10 +201,8 @@ void
 __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 @@ __libc_free_tls(void *tcb, size_t tcbsize, size_t tcbalign __unused)
 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 @@ __libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
 		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_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
 		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 @@ __libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
 			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 @@ __libc_free_tls(void *tcb, size_t tcbsize __unused, size_t tcbalign)
 	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 @@ __libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
 {
 	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 @@ __libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign)
 		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;