Changeset View
Changeset View
Standalone View
Standalone View
head/libexec/rtld-elf/i386/reloc.c
Show First 20 Lines • Show All 537 Lines • ▼ Show 20 Lines | |||||
void *__tls_get_addr(tls_index *ti) | void *__tls_get_addr(tls_index *ti) | ||||
{ | { | ||||
Elf_Addr** segbase; | Elf_Addr** segbase; | ||||
__asm __volatile("movl %%gs:0, %0" : "=r" (segbase)); | __asm __volatile("movl %%gs:0, %0" : "=r" (segbase)); | ||||
return tls_get_addr_common(&segbase[1], ti->ti_module, ti->ti_offset); | return tls_get_addr_common(&segbase[1], ti->ti_module, ti->ti_offset); | ||||
} | } | ||||
size_t | |||||
calculate_first_tls_offset(size_t size, size_t align, size_t offset) | |||||
{ | |||||
size_t res; | |||||
res = roundup(size, align); | |||||
offset &= align - 1; | |||||
if (offset != 0) | |||||
res += align - offset; | |||||
return (res); | |||||
} | |||||
size_t | |||||
calculate_tls_offset(size_t prev_offset, size_t prev_size __unused, size_t size, | |||||
size_t align, size_t offset) | |||||
{ | |||||
size_t res; | |||||
res = roundup(prev_offset + size, align); | |||||
offset &= align - 1; | |||||
if (offset != 0) | |||||
res += align - offset; | |||||
return (res); | |||||
} | |||||
size_t | |||||
calculate_tls_end(size_t off, size_t size __unused) | |||||
{ | |||||
return (off); | |||||
} |