tlsdesc.s 2.0 KB

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