147 lines
3.2 KiB
ArmAsm
147 lines
3.2 KiB
ArmAsm
# An external tdata symbol
|
|
.globl tdata_ext[TL]
|
|
.csect tdata_ext[TL]
|
|
.long 1
|
|
|
|
.csect tdata_int_csect[TL]
|
|
# A first internal tdata symbol
|
|
tdata_int1:
|
|
.long 2
|
|
# A second internal tdata symbol
|
|
tdata_int2:
|
|
.long 3
|
|
|
|
# Two external tbss symbols.
|
|
# XCOFF doesn't seem to allow internal tbss
|
|
# (or bss) symbols.
|
|
.comm tbss_ext[UL],8
|
|
|
|
.toc
|
|
# TC entries targeting the external tdata symbol
|
|
# Their value should be "tdata_ext" address,
|
|
# except TLSM value which must be 0.
|
|
# Their relocations should target it.
|
|
.tc tdata_ext_gd[TC],tdata_ext[TL]
|
|
.tc .tdata_ext_gd[TC],tdata_ext[TL]@m
|
|
.tc tdata_ext_ld[TC],tdata_ext[TL]@ld
|
|
.tc tdata_ext_ie[TC],tdata_ext[TL]@ie
|
|
.tc tdata_ext_le[TC],tdata_ext[TL]@le
|
|
|
|
# TC entries targeting internal tdata symbols.
|
|
# Their value should be "tdata_int1" or "tdata_int2"
|
|
# addresses, except TLSM value which must be 0.
|
|
# Their relocations should target "tdata_int_csect".
|
|
.tc tdata_int1_gd[TC],tdata_int1
|
|
.tc .tdata_int1_gd[TC],tdata_int1@m
|
|
.tc tdata_int1_ld[TC],tdata_int1@ld
|
|
.tc tdata_int1_ie[TC],tdata_int1@ie
|
|
.tc tdata_int1_le[TC],tdata_int1@le
|
|
.tc tdata_int2_gd[TC],tdata_int2
|
|
.tc .tdata_int2_gd[TC],tdata_int2@m
|
|
.tc tdata_int2_ld[TC],tdata_int2@ld
|
|
.tc tdata_int2_ie[TC],tdata_int2@ie
|
|
.tc tdata_int2_le[TC],tdata_int2@le
|
|
|
|
# TC entries targeting the external tdata symbol
|
|
# Their value should be "tbss_ext" address,
|
|
# except TLSM value which must be 0.
|
|
# Their relocations should target "tbss_ext".
|
|
.tc tbss_ext_gd[TC],tbss_ext[UL]
|
|
.tc .tbss_ext_gd[TC],tbss_ext[UL]@m
|
|
.tc tbss_ext_ld[TC],tbss_ext[UL]@ld
|
|
.tc tbss_ext_ie[TC],tbss_ext[UL]@ie
|
|
.tc tbss_ext_le[TC],tbss_ext[UL]@le
|
|
|
|
# Module entry
|
|
.tc mh[TC],mh[TC]@ml
|
|
.rename mh[TC], "_$TLSML" # Symbol for the module handle
|
|
|
|
# Macros
|
|
.macro gd_macro,sym
|
|
.if size == 32
|
|
lwz 4, \sym\()[TC](2)
|
|
lwz 3, .\sym\()[TC](2)
|
|
.else
|
|
ld 4, \sym\()[TC](2)
|
|
ld 3, .\sym\()[TC](2)
|
|
.endif
|
|
bla __tls_get_addr
|
|
.endm
|
|
|
|
.macro ld_macro, sym
|
|
.if size == 32
|
|
lwz 4, \sym\()[TC](2)
|
|
.else
|
|
ld 4, \sym\()[TC](2)
|
|
.endif
|
|
add 5,3,4
|
|
.endm
|
|
|
|
.macro ie_macro, sym
|
|
.if size == 32
|
|
bla __get_tpointer
|
|
lwz 4, \sym\()[TC](2)
|
|
add 5,3,4
|
|
.else
|
|
ld 4, \sym\()[TC](2)
|
|
add 5,4,13
|
|
.endif
|
|
.endm
|
|
|
|
.macro le_macro, sym
|
|
.if size == 32
|
|
bla __get_tpointer
|
|
lwz 4, \sym\()[TC](2)
|
|
add 5,3,4
|
|
.else
|
|
ld 4, \sym\()[TC](2)
|
|
add 5,3,13
|
|
.endif
|
|
.endm
|
|
|
|
|
|
# As TLS relocations are made in for TC symbols,
|
|
# this function only aims to avoid garbage collection
|
|
# of these symbols, especially hidden ones.
|
|
.globl foo
|
|
.globl .foo
|
|
.csect foo[DS],3
|
|
foo:
|
|
.if size == 32
|
|
.long .foo, TOC[tc0], 0
|
|
.else
|
|
.llong .foo, TOC[tc0], 0
|
|
.endif
|
|
|
|
.csect foo[PR]
|
|
.foo:
|
|
# External syms
|
|
#GD
|
|
gd_macro tdata_ext_gd
|
|
gd_macro tdata_int1_gd
|
|
gd_macro tdata_int2_gd
|
|
gd_macro tbss_ext_gd
|
|
|
|
#LD
|
|
.if size == 32
|
|
lwz 3, mh[TC](2)
|
|
.else
|
|
ld 3, mh[TC](2)
|
|
.endif
|
|
bla __tls_get_mod
|
|
ld_macro tdata_ext_ld
|
|
ld_macro tdata_int1_ld
|
|
ld_macro tdata_int2_ld
|
|
ld_macro tbss_ext_ld
|
|
|
|
#IE
|
|
ie_macro tdata_ext_ie
|
|
ie_macro tdata_int1_ie
|
|
ie_macro tdata_int2_ie
|
|
ie_macro tbss_ext_ie
|
|
|
|
#LE
|
|
le_macro tdata_ext_le
|
|
le_macro tdata_int1_le
|
|
le_macro tdata_int2_le
|
|
le_macro tbss_ext_le
|