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.hidden __tls_get_new 13 14// size_t __tlsdesc_dynamic(size_t *a) 15// { 16// struct {size_t modidx,off;} *p = (void*)a[1]; 17// size_t *dtv = *(size_t**)(tp + 16 - 8); 18// if (p->modidx <= dtv[0]) 19// return dtv[p->modidx] + p->off - tp; 20// return __tls_get_new(p) - tp; 21// } 22.global __tlsdesc_dynamic 23.hidden __tlsdesc_dynamic 24.type __tlsdesc_dynamic,@function 25__tlsdesc_dynamic: 26 stp x1,x2,[sp,#-32]! 27 stp x3,x4,[sp,#16] 28 mrs x1,tpidr_el0 // tp 29 ldr x0,[x0,#8] // p 30 ldr x2,[x0] // p->modidx 31 add x3,x1,#8 32 ldr x3,[x3] // dtv 33 ldr x4,[x3] // dtv[0] 34 cmp x2,x4 35 b.hi 1f 36 ldr x2,[x3,x2,lsl #3] // dtv[p->modidx] 37 ldr x0,[x0,#8] // p->off 38 add x0,x0,x2 392: sub x0,x0,x1 40 ldp x3,x4,[sp,#16] 41 ldp x1,x2,[sp],#32 42 ret 43 44 // save all registers __tls_get_new may clobber 45 // update sp in two steps because offset must be in [-512,509] 461: stp x29,x30,[sp,#-160]! 47 stp x5,x6,[sp,#16] 48 stp x7,x8,[sp,#32] 49 stp x9,x10,[sp,#48] 50 stp x11,x12,[sp,#64] 51 stp x13,x14,[sp,#80] 52 stp x15,x16,[sp,#96] 53 stp x17,x18,[sp,#112] 54 stp q0,q1,[sp,#128] 55 stp q2,q3,[sp,#-480]! 56 stp q4,q5,[sp,#32] 57 stp q6,q7,[sp,#64] 58 stp q8,q9,[sp,#96] 59 stp q10,q11,[sp,#128] 60 stp q12,q13,[sp,#160] 61 stp q14,q15,[sp,#192] 62 stp q16,q17,[sp,#224] 63 stp q18,q19,[sp,#256] 64 stp q20,q21,[sp,#288] 65 stp q22,q23,[sp,#320] 66 stp q24,q25,[sp,#352] 67 stp q26,q27,[sp,#384] 68 stp q28,q29,[sp,#416] 69 stp q30,q31,[sp,#448] 70 bl __tls_get_new 71 mrs x1,tpidr_el0 72 ldp q4,q5,[sp,#32] 73 ldp q6,q7,[sp,#64] 74 ldp q8,q9,[sp,#96] 75 ldp q10,q11,[sp,#128] 76 ldp q12,q13,[sp,#160] 77 ldp q14,q15,[sp,#192] 78 ldp q16,q17,[sp,#224] 79 ldp q18,q19,[sp,#256] 80 ldp q20,q21,[sp,#288] 81 ldp q22,q23,[sp,#320] 82 ldp q24,q25,[sp,#352] 83 ldp q26,q27,[sp,#384] 84 ldp q28,q29,[sp,#416] 85 ldp q30,q31,[sp,#448] 86 ldp q2,q3,[sp],#480 87 ldp x5,x6,[sp,#16] 88 ldp x7,x8,[sp,#32] 89 ldp x9,x10,[sp,#48] 90 ldp x11,x12,[sp,#64] 91 ldp x13,x14,[sp,#80] 92 ldp x15,x16,[sp,#96] 93 ldp x17,x18,[sp,#112] 94 ldp q0,q1,[sp,#128] 95 ldp x29,x30,[sp],#160 96 b 2b 97