tls32.s 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. .section ".tbss","awT",@nobits
  2. .global _start,gd0,ld0,ld1,ld2,ie0,le0,le1
  3. .align 2
  4. gd0: .space 4
  5. ld0: .space 4
  6. ld1: .space 4
  7. ld2: .space 4
  8. ie0: .space 4
  9. le0: .space 4
  10. le1: .space 4
  11. .section ".tdata","awT",@progbits
  12. .align 2
  13. gd4: .long 0x12345678
  14. ld4: .long 0x23456789
  15. ld5: .long 0x3456789a
  16. ld6: .long 0x456789ab
  17. ie4: .long 0x56789abc
  18. le4: .long 0x6789abcd
  19. le5: .long 0x789abcde
  20. .section ".got2","aw"
  21. .LCTOC1 = .+32768
  22. .text
  23. _start:
  24. bcl 20,31,0f
  25. 0:
  26. mflr 30
  27. addis 30,30,.LCTOC1-0b@ha
  28. addi 30,30,.LCTOC1-0b@l
  29. #extern syms
  30. #GD
  31. addi 3,31,gd@got@tlsgd #R_PPC_GOT_TLSGD16 gd
  32. .ifdef TLSMARK
  33. bl __tls_get_addr(gd@tlsgd) #R_PPC_TLSGD gd
  34. #R_PPC_REL24 __tls_get_addr
  35. .else
  36. bl __tls_get_addr #R_PPC_REL24 __tls_get_addr
  37. .endif
  38. #LD
  39. addi 3,31,ld@got@tlsld #R_PPC_GOT_TLSLD16 ld
  40. .ifdef TLSMARK
  41. bl __tls_get_addr(ld@tlsld) #R_PPC_TLSLD ld
  42. #R_PPC_REL24 __tls_get_addr
  43. .else
  44. bl __tls_get_addr #R_PPC_REL24 __tls_get_addr
  45. .endif
  46. #global syms
  47. #GD
  48. addi 3,31,gd0@got@tlsgd #R_PPC_GOT_TLSGD16 gd0
  49. .ifdef TLSMARK
  50. bl __tls_get_addr+0x8000(gd0@tlsgd)@plt #R_PPC_TLSGD gd0
  51. #R_PPC_PLTREL24 __tls_get_addr+0x8000
  52. .else
  53. bl __tls_get_addr+0x8000@plt #R_PPC_PLTREL24 __tls_get_addr+0x8000
  54. .endif
  55. #LD
  56. addi 3,31,ld0@got@tlsld #R_PPC_GOT_TLSLD16 ld0
  57. .ifdef TLSMARK
  58. #exercise saner new syntax with @plt before the arg
  59. bl __tls_get_addr+0x8000@plt(ld0@tlsld) #R_PPC_TLSLD ld0
  60. #R_PPC_PLTREL24 __tls_get_addr+0x8000
  61. .else
  62. bl __tls_get_addr+0x8000@plt #R_PPC_PLTREL24 __tls_get_addr+0x8000
  63. .endif
  64. addi 9,3,ld0@dtprel #R_PPC_DTPREL16 ld0
  65. addis 9,3,ld1@dtprel@ha #R_PPC_DTPREL16_HA ld1
  66. lwz 10,ld1@dtprel@l(9) #R_PPC_DTPREL16_LO ld1
  67. #IE
  68. lwz 9,ie0@got@tprel(31) #R_PPC_GOT_TPREL16 ie0
  69. lhzx 10,9,ie0@tls #R_PPC_TLS ie0
  70. #LE
  71. lbz 10,le0@tprel(2) #R_PPC_TPREL16 le0
  72. addis 9,2,le1@tprel@ha #R_PPC_TPREL16_HA le1
  73. stb 10,le1@tprel@l(9) #R_PPC_TPREL16_LO le1
  74. #local syms, use a different got reg too.
  75. #GD
  76. addi 3,30,gd4@got@tlsgd #R_PPC_GOT_TLSGD16 gd4
  77. .ifdef TLSMARK
  78. bl __tls_get_addr(gd4@tlsgd) #R_PPC_TLSGD gd4
  79. #R_PPC_REL24 __tls_get_addr
  80. .else
  81. bl __tls_get_addr #R_PPC_REL24 __tls_get_addr
  82. .endif
  83. #LD
  84. addi 3,30,ld4@got@tlsld #R_PPC_GOT_TLSLD16 ld4
  85. .ifdef TLSMARK
  86. bl __tls_get_addr(ld4@tlsld) #R_PPC_TLSLD ld4
  87. #R_PPC_REL24 __tls_get_addr
  88. .else
  89. bl __tls_get_addr #R_PPC_REL24 __tls_get_addr
  90. .endif
  91. stw 10,ld4@dtprel(3) #R_PPC_DTPREL16 ld4
  92. addis 9,3,ld5@dtprel@ha #R_PPC_DTPREL16_HA ld5
  93. stw 10,ld5@dtprel@l(9) #R_PPC_DTPREL16_LO ld5
  94. #IE
  95. lwz 9,ie0@got@tprel(30) #R_PPC_GOT_TPREL16 ie4
  96. sthx 10,9,ie0@tls #R_PPC_TLS ie4
  97. #LE
  98. lhz 10,le4@tprel(2) #R_PPC_TPREL16 le4
  99. addis 9,2,le5@tprel@ha #R_PPC_TPREL16_HA le5
  100. lha 10,le5@tprel@l(9) #R_PPC_TPREL16_LO le5