diff -u src/libexec/rtld-elf/powerpc/reloc.c /home/refugee/freebsd/gdb/src/libexec/rtld-elf/powerpc/reloc.c --- src/libexec/rtld-elf/powerpc/reloc.c Fri May 30 00:58:25 2003 +++ /home/refugee/freebsd/gdb/src/libexec/rtld-elf/powerpc/reloc.c Wed Aug 4 12:08:50 2004 @@ -489,3 +489,27 @@ */ __syncicache(pltcall, 72 + N * 8); } + +void +allocate_initial_tls(Obj_Entry *list) +{ + register Elf_Addr** tp __asm__("r2"); + + /* + * Fix the size of the static TLS block by using the maximum + * offset allocated so far and adding a bit for dynamic modules to + * use. + */ + + tls_static_space = tls_last_offset + tls_last_size + RTLD_STATIC_TLS_EXTRA; + + tp = allocate_tls(list, 0, 8, 16); +} + +void* +__tls_get_addr(tls_index* ti) +{ + register Elf_Addr** tp __asm__("r2"); + + return tls_get_addr_common(tp, ti->ti_module, ti->ti_offset); +} diff -u src/libexec/rtld-elf/powerpc/rtld_machdep.h /home/refugee/freebsd/gdb/src/libexec/rtld-elf/powerpc/rtld_machdep.h --- src/libexec/rtld-elf/powerpc/rtld_machdep.h Fri May 30 00:58:26 2003 +++ /home/refugee/freebsd/gdb/src/libexec/rtld-elf/powerpc/rtld_machdep.h Wed Aug 4 12:13:22 2004 @@ -62,4 +62,19 @@ void _rtld_powerpc_pltresolve(void); void _rtld_powerpc_pltcall(void); +#define round(size, align) \ + (((size) + (align) - 1) & ~((align) - 1)) +#define calculate_first_tls_offset(size, align) \ + round(16, align) +#define calculate_tls_offset(prev_offset, prev_size, size, align) \ + round(prev_offset + prev_size, align) +#define calculate_tls_end(off, size) ((off) + (size)) + +typedef struct { + unsigned long ti_module; + unsigned long ti_offset; +} tls_index; + +extern void *__tls_get_addr(tls_index* ti); + #endif