github.com/afumu/libc@v0.0.6/musl/src/ldso/aarch64/tlsdesc.s (about)

     1  // size_t __tlsdesc_static(size_t *a)
     2  // {
     3  // 	return a[1];
     4  // }
     5  .global __tlsdesc_static
     6  .hidden __tlsdesc_static
     7  .type __tlsdesc_static,@function
     8  __tlsdesc_static:
     9  	ldr x0,[x0,#8]
    10  	ret
    11  
    12  // size_t __tlsdesc_dynamic(size_t *a)
    13  // {
    14  // 	struct {size_t modidx,off;} *p = (void*)a[1];
    15  // 	size_t *dtv = *(size_t**)(tp - 8);
    16  // 	return dtv[p->modidx] + p->off - tp;
    17  // }
    18  .global __tlsdesc_dynamic
    19  .hidden __tlsdesc_dynamic
    20  .type __tlsdesc_dynamic,@function
    21  __tlsdesc_dynamic:
    22  	stp x1,x2,[sp,#-16]!
    23  	mrs x1,tpidr_el0      // tp
    24  	ldr x0,[x0,#8]        // p
    25  	ldp x0,x2,[x0]        // p->modidx, p->off
    26  	sub x2,x2,x1          // p->off - tp
    27  	ldr x1,[x1,#-8]       // dtv
    28  	ldr x1,[x1,x0,lsl #3] // dtv[p->modidx]
    29  	add x0,x1,x2          // dtv[p->modidx] + p->off - tp
    30  	ldp x1,x2,[sp],#16
    31  	ret