tlspie32.s 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. .section .tbss,"awT",@nobits
  2. .global tls_gd
  3. .align 4
  4. .type tls_gd, #object
  5. .size tls_gd, 4
  6. tls_gd:
  7. .skip 4
  8. .global tls_ld
  9. .align 4
  10. .type tls_ld, #object
  11. .size tls_ld, 4
  12. tls_ld:
  13. .skip 4
  14. .global tls_ie
  15. .align 4
  16. .type tls_ie, #object
  17. .size tls_ie, 4
  18. tls_ie:
  19. .skip 4
  20. .section ".text"
  21. .LLGETPC0:
  22. retl
  23. add %o7, %l7, %l7
  24. .align 4
  25. .global foo
  26. .type foo, #function
  27. .proc 0104
  28. foo:
  29. save %sp, -104, %sp
  30. sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
  31. call .LLGETPC0
  32. add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
  33. nop;nop;nop;nop
  34. /* GD -> IE with global variable not defined in executable */
  35. sethi %tgd_hi22(sG1), %g1
  36. add %g1, %tgd_lo10(sG1), %g1
  37. add %l7, %g1, %o0, %tgd_add(sG1)
  38. call __tls_get_addr, %tgd_call(sG1)
  39. nop
  40. nop;nop;nop;nop
  41. /* GD -> LE with global variable defined in executable */
  42. sethi %tgd_hi22(tls_gd), %g1
  43. add %g1, %tgd_lo10(tls_gd), %g1
  44. add %l7, %g1, %o0, %tgd_add(tls_gd)
  45. call __tls_get_addr, %tgd_call(tls_gd)
  46. nop
  47. nop;nop;nop;nop
  48. /* LD -> LE with global variable defined in executable */
  49. sethi %tldm_hi22(tls_ld), %g1
  50. add %g1, %tldm_lo10(tls_ld), %g1
  51. add %l7, %g1, %o0, %tldm_add(tls_ld)
  52. call __tls_get_addr, %tldm_call(tls_ld)
  53. nop
  54. sethi %tldo_hix22(tls_ld), %g1
  55. xor %g1, %tldo_lox10(tls_ld), %g1
  56. add %o0, %g1, %g1, %tldo_add(tls_ld)
  57. nop;nop;nop;nop
  58. /* IE -> LE with global variable defined in executable */
  59. sethi %tie_hi22(tls_ie), %g1
  60. add %g1, %tie_lo10(tls_ie), %g1
  61. ld [%l7 + %g1], %g1, %tie_ld(tls_ie)
  62. add %g7, %g1, %g1, %tie_add(tls_ie)
  63. nop;nop;nop;nop
  64. ret
  65. restore