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:
parent
e6c7696203
commit
8f63fa78e8
@ -81,14 +81,6 @@ void __libc_free_tls(void *tls, size_t tcbsize, size_t tcbalign);
|
|||||||
#error TLS_TCB_ALIGN undefined for target architecture
|
#error TLS_TCB_ALIGN undefined for target architecture
|
||||||
#endif
|
#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)
|
#if defined(__mips__) || defined(__powerpc__) || defined(__riscv)
|
||||||
#define DTV_OFFSET 0x8000
|
#define DTV_OFFSET 0x8000
|
||||||
#else
|
#else
|
||||||
|
@ -76,7 +76,6 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
|||||||
round(16, align)
|
round(16, align)
|
||||||
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
||||||
round(prev_offset + prev_size, align)
|
round(prev_offset + prev_size, align)
|
||||||
#define calculate_tls_end(off, size) ((off) + (size))
|
|
||||||
#define calculate_tls_post_size(align) \
|
#define calculate_tls_post_size(align) \
|
||||||
round(TLS_TCB_SIZE, align) - TLS_TCB_SIZE
|
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 md_abi_variant_hook(x)
|
||||||
|
|
||||||
|
#define TLS_VARIANT_I 1
|
||||||
#define TLS_DTV_OFFSET 0
|
#define TLS_DTV_OFFSET 0
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -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));
|
return (calculate_tls_offset(0, 0, size, align, offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
|
||||||
calculate_tls_end(size_t off, size_t size __unused)
|
|
||||||
{
|
|
||||||
return (off);
|
|
||||||
}
|
|
||||||
|
@ -73,10 +73,10 @@ void *__tls_get_addr(tls_index *ti) __exported;
|
|||||||
|
|
||||||
#define md_abi_variant_hook(x)
|
#define md_abi_variant_hook(x)
|
||||||
|
|
||||||
|
#define TLS_VARIANT_II 1
|
||||||
#define TLS_DTV_OFFSET 0
|
#define TLS_DTV_OFFSET 0
|
||||||
|
|
||||||
size_t calculate_first_tls_offset(size_t size, size_t align, size_t offset);
|
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 calculate_tls_offset(size_t prev_offset, size_t prev_size, size_t size,
|
||||||
size_t align, size_t offset);
|
size_t align, size_t offset);
|
||||||
size_t calculate_tls_end(size_t off, size_t size);
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -68,7 +68,6 @@ typedef struct {
|
|||||||
round(8, align)
|
round(8, align)
|
||||||
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
||||||
round(prev_offset + prev_size, align)
|
round(prev_offset + prev_size, align)
|
||||||
#define calculate_tls_end(off, size) ((off) + (size))
|
|
||||||
#define calculate_tls_post_size(align) \
|
#define calculate_tls_post_size(align) \
|
||||||
round(TLS_TCB_SIZE, align) - TLS_TCB_SIZE
|
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)
|
#define md_abi_variant_hook(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define TLS_VARIANT_I 1
|
||||||
#define TLS_DTV_OFFSET 0
|
#define TLS_DTV_OFFSET 0
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -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));
|
return (calculate_tls_offset(0, 0, size, align, offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
|
||||||
calculate_tls_end(size_t off, size_t size __unused)
|
|
||||||
{
|
|
||||||
return (off);
|
|
||||||
}
|
|
||||||
|
@ -74,10 +74,10 @@ void *__tls_get_addr(tls_index *ti) __exported;
|
|||||||
|
|
||||||
#define md_abi_variant_hook(x)
|
#define md_abi_variant_hook(x)
|
||||||
|
|
||||||
|
#define TLS_VARIANT_II 1
|
||||||
#define TLS_DTV_OFFSET 0
|
#define TLS_DTV_OFFSET 0
|
||||||
|
|
||||||
size_t calculate_first_tls_offset(size_t size, size_t align, size_t offset);
|
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 calculate_tls_offset(size_t prev_offset, size_t prev_size, size_t size,
|
||||||
size_t align, size_t offset);
|
size_t align, size_t offset);
|
||||||
size_t calculate_tls_end(size_t off, size_t size);
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -68,7 +68,6 @@ typedef struct {
|
|||||||
TLS_TCB_SIZE
|
TLS_TCB_SIZE
|
||||||
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
||||||
round(prev_offset + prev_size, align)
|
round(prev_offset + prev_size, align)
|
||||||
#define calculate_tls_end(off, size) ((off) + (size))
|
|
||||||
#define calculate_tls_post_size(align) 0
|
#define calculate_tls_post_size(align) 0
|
||||||
|
|
||||||
extern void *__tls_get_addr(tls_index *ti);
|
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 md_abi_variant_hook(x)
|
||||||
|
|
||||||
|
#define TLS_VARIANT_I 1
|
||||||
#define TLS_DTV_OFFSET 0
|
#define TLS_DTV_OFFSET 0
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -73,6 +73,7 @@ void _rtld_powerpc_pltcall(void);
|
|||||||
* TLS
|
* TLS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define TLS_VARIANT_I 1
|
||||||
#define TLS_TP_OFFSET 0x7000
|
#define TLS_TP_OFFSET 0x7000
|
||||||
#define TLS_DTV_OFFSET 0x8000
|
#define TLS_DTV_OFFSET 0x8000
|
||||||
#define TLS_TCB_SIZE 8
|
#define TLS_TCB_SIZE 8
|
||||||
@ -83,7 +84,6 @@ void _rtld_powerpc_pltcall(void);
|
|||||||
TLS_TCB_SIZE
|
TLS_TCB_SIZE
|
||||||
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
||||||
round(prev_offset + prev_size, align)
|
round(prev_offset + prev_size, align)
|
||||||
#define calculate_tls_end(off, size) ((off) + (size))
|
|
||||||
#define calculate_tls_post_size(align) 0
|
#define calculate_tls_post_size(align) 0
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -65,6 +65,7 @@ extern u_long cpu_features2; /* r4 */
|
|||||||
* TLS
|
* TLS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define TLS_VARIANT_I 1
|
||||||
#define TLS_TP_OFFSET 0x7000
|
#define TLS_TP_OFFSET 0x7000
|
||||||
#define TLS_DTV_OFFSET 0x8000
|
#define TLS_DTV_OFFSET 0x8000
|
||||||
#define TLS_TCB_SIZE 16
|
#define TLS_TCB_SIZE 16
|
||||||
@ -75,7 +76,6 @@ extern u_long cpu_features2; /* r4 */
|
|||||||
TLS_TCB_SIZE
|
TLS_TCB_SIZE
|
||||||
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
||||||
round(prev_offset + prev_size, align)
|
round(prev_offset + prev_size, align)
|
||||||
#define calculate_tls_end(off, size) ((off) + (size))
|
|
||||||
#define calculate_tls_post_size(align) 0
|
#define calculate_tls_post_size(align) 0
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -82,6 +82,7 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
|||||||
/*
|
/*
|
||||||
* TLS
|
* TLS
|
||||||
*/
|
*/
|
||||||
|
#define TLS_VARIANT_I 1
|
||||||
#define TLS_TP_OFFSET 0x0
|
#define TLS_TP_OFFSET 0x0
|
||||||
#define TLS_DTV_OFFSET 0x800
|
#define TLS_DTV_OFFSET 0x800
|
||||||
#define TLS_TCB_SIZE 16
|
#define TLS_TCB_SIZE 16
|
||||||
@ -92,7 +93,6 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
|
|||||||
TLS_TCB_SIZE
|
TLS_TCB_SIZE
|
||||||
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
#define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \
|
||||||
round(prev_offset + prev_size, align)
|
round(prev_offset + prev_size, align)
|
||||||
#define calculate_tls_end(off, size) ((off) + (size))
|
|
||||||
#define calculate_tls_post_size(align) 0
|
#define calculate_tls_post_size(align) 0
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -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));
|
return (tls_get_addr_slow(dtvp, index, offset, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__aarch64__) || defined(__arm__) || defined(__mips__) || \
|
#ifdef TLS_VARIANT_I
|
||||||
defined(__powerpc__) || defined(__riscv)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return pointer to allocated TLS block
|
* 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));
|
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.
|
* 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);
|
free((void*) dtv);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif /* TLS_VARIANT_II */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate TLS block for module with given index.
|
* 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,
|
off = calculate_tls_offset(tls_last_offset, tls_last_size,
|
||||||
obj->tlssize, obj->tlsalign, obj->tlspoffset);
|
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
|
* If we have already fixed the size of the static TLS block, we
|
||||||
* must stay within that size. When allocating the static TLS, 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.
|
* loading modules which use static TLS.
|
||||||
*/
|
*/
|
||||||
if (tls_static_space != 0) {
|
if (tls_static_space != 0) {
|
||||||
if (calculate_tls_end(off, obj->tlssize) > tls_static_space)
|
if (off > tls_static_space)
|
||||||
return false;
|
return false;
|
||||||
} else if (obj->tlsalign > tls_static_max_align) {
|
} else if (obj->tlsalign > tls_static_max_align) {
|
||||||
tls_static_max_align = obj->tlsalign;
|
tls_static_max_align = obj->tlsalign;
|
||||||
}
|
}
|
||||||
|
|
||||||
tls_last_offset = obj->tlsoffset = off;
|
tls_last_offset = off;
|
||||||
tls_last_size = obj->tlssize;
|
tls_last_size = obj->tlssize;
|
||||||
obj->tls_done = true;
|
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
|
* simplistic workaround to allow libGL.so.1 to be loaded and
|
||||||
* unloaded multiple times.
|
* unloaded multiple times.
|
||||||
*/
|
*/
|
||||||
if (calculate_tls_end(obj->tlsoffset, obj->tlssize)
|
size_t off = obj->tlsoffset;
|
||||||
== calculate_tls_end(tls_last_offset, tls_last_size)) {
|
#ifdef TLS_VARIANT_I
|
||||||
|
off += obj->tlssize;
|
||||||
|
#endif
|
||||||
|
if (off == tls_last_offset) {
|
||||||
tls_last_offset -= obj->tlssize;
|
tls_last_offset -= obj->tlssize;
|
||||||
tls_last_size = 0;
|
tls_last_size = 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user