README.TLS revision 1.2
1Steps for adding TLS support for a new platform: 2 3(1) Declare TLS variant in machine/types.h by defining either 4__HAVE_TLS_VARIANT_I or __HAVE_TLS_VARIANT_II. 5 6(2) _lwp_makecontext has to set the reserved register or kernel transfer 7variable in uc_mcontext to the provided value of 'private'. 8 9This is not possible on the VAX as there is no free space in ucontext_t. 10This requires either a special version of _lwp_create or versioning 11everything using ucontext_t. Debug support depends on getting the data from 12ucontext_t, so the second option is possibly required. 13 14(3) _lwp_setprivate(2) has to update the same register as 15_lwp_makecontext. cpu_lwp_setprivate has to call _lwp_setprivate(2) to 16reflect the kernel view. cpu_switch has to update the mapping. 17 18_lwp_setprivate is used for the initial thread, all other threads 19created by libpthread use _lwp_makecontext for this purpose. 20 21(4) Provide __tls_get_addr and possible other MD functions for dynamic 22TLS offset computation. If such alternative entry points exist (currently 23only i386), also add a weak reference to 0 in src/lib/libc/tls/tls.c. 24 25The generic implementation can be found in tls.c and is used with 26__HAVE_COMMON___TLS_GET_ADDR. It depends on ___lwp_getprivate_fast. 27 28(5) Implement the necessary relocation records in mdreloc.c. There are 29typically three relocation types found in dynamic binaries: 30 31(a) R_TYPE(TLS_DTPOFF): Offset inside the module. The common TLS code 32ensures that the DTV vector points to offset 0 inside the module TLS block. 33This is normally def->st_value + rela->r_addend. 34 35(b) R_TYPE(TLS_DTPMOD): Module index. 36 37(c) R_TYPE(TLS_TPOFF): Static TLS offset. The code has to check whether 38the static TLS offset for this module has been allocated 39(defobj->tls_done) and otherwise call _rtld_tls_offset_allocate(). This 40may fail if no static space is available and the object has been pulled 41in via dlopen(3). 42 43For TLS Variant I, this is typically: 44 45def->st_value + rela->r_addend + defobj->tlsoffset + sizeof(struct tls_tcb) 46 47e.g. the relocation doesn't include the fixed TCB. 48 49For TLS Variant II, this is typically: 50 51def->st_value - defobj->tlsoffset + rela->r_addend 52 53e.g. starting offset is counting down from the TCB. 54 55(6) Implement _lwp_getprivate_fast() in machine/mcontext.h and set 56__HAVE___LWP_GETPRIVATE_FAST. 57 58(8) Test using src/tests/lib/libc/tls. Make sure with "objdump -R" that 59t_tls_dynamic has two TPOFF relocations and h_tls_dlopen.so.1 and 60libh_tls_dynamic.so.1 have both two DTPMOD and DTPOFF relocations. 61