rtld: Remove calculate_tls_end

Variant I architectures use off and Variant II ones use size + off.
Define TLS_VARIANT_I/TLS_VARIANT_II symbols similarly to how libc
handles it.

Reviewed by:	kib
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D31539
Differential revision:	https://reviews.freebsd.org/D31541
This commit is contained in:
Fangrui Song 2021-08-14 20:02:09 +03:00 committed by Konstantin Belousov
parent e6c7696203
commit 8f63fa78e8
12 changed files with 24 additions and 37 deletions

View File

@ -81,14 +81,6 @@ void __libc_free_tls(void *tls, size_t tcbsize, size_t tcbalign);
#error TLS_TCB_ALIGN undefined for target architecture
#endif
#if defined(__aarch64__) || defined(__arm__) || defined(__mips__) || \
defined(__powerpc__) || defined(__riscv)
#define TLS_VARIANT_I
#endif
#if defined(__i386__) || defined(__amd64__)
#define TLS_VARIANT_II
#endif
#if defined(__mips__) || defined(__powerpc__) || defined(__riscv)
#define DTV_OFFSET 0x8000
#else

View File

@ -76,7 +76,6 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
round(16, align)
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) \
round(TLS_TCB_SIZE, align) - TLS_TCB_SIZE
@ -93,6 +92,7 @@ extern void *__tls_get_addr(tls_index *ti);
#define md_abi_variant_hook(x)
#define TLS_VARIANT_I 1
#define TLS_DTV_OFFSET 0
#endif

View File

@ -567,9 +567,3 @@ calculate_first_tls_offset(size_t size, size_t align, size_t offset)
{
return (calculate_tls_offset(0, 0, size, align, offset));
}
size_t
calculate_tls_end(size_t off, size_t size __unused)
{
return (off);
}

View File

@ -73,10 +73,10 @@ void *__tls_get_addr(tls_index *ti) __exported;
#define md_abi_variant_hook(x)
#define TLS_VARIANT_II 1
#define TLS_DTV_OFFSET 0
size_t calculate_first_tls_offset(size_t size, size_t align, size_t offset);
size_t calculate_tls_offset(size_t prev_offset, size_t prev_size, size_t size,
size_t align, size_t offset);
size_t calculate_tls_end(size_t off, size_t size);
#endif

View File

@ -68,7 +68,6 @@ typedef struct {
round(8, align)
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) \
round(TLS_TCB_SIZE, align) - TLS_TCB_SIZE
@ -86,6 +85,7 @@ extern void arm_abi_variant_hook(Elf_Auxinfo **);
#define md_abi_variant_hook(x)
#endif
#define TLS_VARIANT_I 1
#define TLS_DTV_OFFSET 0
#endif

View File

@ -558,9 +558,3 @@ calculate_first_tls_offset(size_t size, size_t align, size_t offset)
{
return (calculate_tls_offset(0, 0, size, align, offset));
}
size_t
calculate_tls_end(size_t off, size_t size __unused)
{
return (off);
}

View File

@ -74,10 +74,10 @@ void *__tls_get_addr(tls_index *ti) __exported;
#define md_abi_variant_hook(x)
#define TLS_VARIANT_II 1
#define TLS_DTV_OFFSET 0
size_t calculate_first_tls_offset(size_t size, size_t align, size_t offset);
size_t calculate_tls_offset(size_t prev_offset, size_t prev_size, size_t size,
size_t align, size_t offset);
size_t calculate_tls_end(size_t off, size_t size);
#endif

View File

@ -68,7 +68,6 @@ typedef struct {
TLS_TCB_SIZE
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) 0
extern void *__tls_get_addr(tls_index *ti);
@ -78,6 +77,7 @@ extern void *__tls_get_addr(tls_index *ti);
#define md_abi_variant_hook(x)
#define TLS_VARIANT_I 1
#define TLS_DTV_OFFSET 0
#endif

View File

@ -73,6 +73,7 @@ void _rtld_powerpc_pltcall(void);
* TLS
*/
#define TLS_VARIANT_I 1
#define TLS_TP_OFFSET 0x7000
#define TLS_DTV_OFFSET 0x8000
#define TLS_TCB_SIZE 8
@ -83,7 +84,6 @@ void _rtld_powerpc_pltcall(void);
TLS_TCB_SIZE
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) 0
typedef struct {

View File

@ -65,6 +65,7 @@ extern u_long cpu_features2; /* r4 */
* TLS
*/
#define TLS_VARIANT_I 1
#define TLS_TP_OFFSET 0x7000
#define TLS_DTV_OFFSET 0x8000
#define TLS_TCB_SIZE 16
@ -75,7 +76,6 @@ extern u_long cpu_features2; /* r4 */
TLS_TCB_SIZE
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) 0
typedef struct {

View File

@ -82,6 +82,7 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
/*
* TLS
*/
#define TLS_VARIANT_I 1
#define TLS_TP_OFFSET 0x0
#define TLS_DTV_OFFSET 0x800
#define TLS_TCB_SIZE 16
@ -92,7 +93,6 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
TLS_TCB_SIZE
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
#define calculate_tls_post_size(align) 0
typedef struct {

View File

@ -4939,8 +4939,7 @@ tls_get_addr_common(Elf_Addr **dtvp, int index, size_t offset)
return (tls_get_addr_slow(dtvp, index, offset, false));
}
#if defined(__aarch64__) || defined(__arm__) || defined(__mips__) || \
defined(__powerpc__) || defined(__riscv)
#ifdef TLS_VARIANT_I
/*
* Return pointer to allocated TLS block
@ -5071,9 +5070,9 @@ free_tls(void *tcb, size_t tcbsize, size_t tcbalign __unused)
free_aligned(get_tls_block_ptr(tcb, tcbsize));
}
#endif
#endif /* TLS_VARIANT_I */
#if defined(__i386__) || defined(__amd64__)
#ifdef TLS_VARIANT_II
/*
* Allocate Static TLS using the Variant II method.
@ -5179,7 +5178,7 @@ free_tls(void *tls, size_t tcbsize __unused, size_t tcbalign)
free((void*) dtv);
}
#endif
#endif /* TLS_VARIANT_II */
/*
* Allocate TLS block for module with given index.
@ -5227,6 +5226,11 @@ allocate_tls_offset(Obj_Entry *obj)
off = calculate_tls_offset(tls_last_offset, tls_last_size,
obj->tlssize, obj->tlsalign, obj->tlspoffset);
obj->tlsoffset = off;
#ifdef TLS_VARIANT_I
off += obj->tlssize;
#endif
/*
* If we have already fixed the size of the static TLS block, we
* must stay within that size. When allocating the static TLS, we
@ -5234,13 +5238,13 @@ allocate_tls_offset(Obj_Entry *obj)
* loading modules which use static TLS.
*/
if (tls_static_space != 0) {
if (calculate_tls_end(off, obj->tlssize) > tls_static_space)
if (off > tls_static_space)
return false;
} else if (obj->tlsalign > tls_static_max_align) {
tls_static_max_align = obj->tlsalign;
}
tls_last_offset = obj->tlsoffset = off;
tls_last_offset = off;
tls_last_size = obj->tlssize;
obj->tls_done = true;
@ -5257,8 +5261,11 @@ free_tls_offset(Obj_Entry *obj)
* simplistic workaround to allow libGL.so.1 to be loaded and
* unloaded multiple times.
*/
if (calculate_tls_end(obj->tlsoffset, obj->tlssize)
== calculate_tls_end(tls_last_offset, tls_last_size)) {
size_t off = obj->tlsoffset;
#ifdef TLS_VARIANT_I
off += obj->tlssize;
#endif
if (off == tls_last_offset) {
tls_last_offset -= obj->tlssize;
tls_last_size = 0;
}