git: b26e7715b072 - stable/13 - rtld: use _get_tp() in __tls_get_addr()
Konstantin Belousov
kib at FreeBSD.org
Fri Apr 23 11:15:02 UTC 2021
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=b26e7715b072ad9c67c80e74d7b8e80de4159bee
commit b26e7715b072ad9c67c80e74d7b8e80de4159bee
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-04-07 03:49:28 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-04-23 11:14:07 +0000
rtld: use _get_tp() in __tls_get_addr()
(cherry picked from commit e8b9c508b7ae5be618ada089103468c400e465cd)
---
libexec/rtld-elf/amd64/reloc.c | 7 ++--
libexec/rtld-elf/i386/reloc.c | 14 ++++----
libexec/rtld-elf/mips/reloc.c | 62 +++---------------------------------
libexec/rtld-elf/mips/rtld_machdep.h | 2 --
4 files changed, 13 insertions(+), 72 deletions(-)
diff --git a/libexec/rtld-elf/amd64/reloc.c b/libexec/rtld-elf/amd64/reloc.c
index 309e105d8b5e..689b0d8635d4 100644
--- a/libexec/rtld-elf/amd64/reloc.c
+++ b/libexec/rtld-elf/amd64/reloc.c
@@ -541,11 +541,10 @@ allocate_initial_tls(Obj_Entry *objs)
void *
__tls_get_addr(tls_index *ti)
{
- Elf_Addr** segbase;
+ Elf_Addr **dtvp;
- __asm __volatile("movq %%fs:0, %0" : "=r" (segbase));
-
- return tls_get_addr_common(&segbase[1], ti->ti_module, ti->ti_offset);
+ dtvp = _get_tp();
+ return (tls_get_addr_common(dtvp, ti->ti_module, ti->ti_offset));
}
size_t
diff --git a/libexec/rtld-elf/i386/reloc.c b/libexec/rtld-elf/i386/reloc.c
index 5ed3abf65b31..cab163b35e6a 100644
--- a/libexec/rtld-elf/i386/reloc.c
+++ b/libexec/rtld-elf/i386/reloc.c
@@ -522,22 +522,20 @@ __attribute__((__regparm__(1)))
void *
___tls_get_addr(tls_index *ti)
{
- Elf_Addr** segbase;
+ Elf_Addr **dtvp;
- __asm __volatile("movl %%gs:0, %0" : "=r" (segbase));
-
- return tls_get_addr_common(&segbase[1], ti->ti_module, ti->ti_offset);
+ dtvp = _get_tp();
+ return (tls_get_addr_common(dtvp, ti->ti_module, ti->ti_offset));
}
/* Sun ABI */
void *
__tls_get_addr(tls_index *ti)
{
- Elf_Addr** segbase;
-
- __asm __volatile("movl %%gs:0, %0" : "=r" (segbase));
+ Elf_Addr **dtvp;
- return tls_get_addr_common(&segbase[1], ti->ti_module, ti->ti_offset);
+ dtvp = _get_tp();
+ return (tls_get_addr_common(dtvp, ti->ti_module, ti->ti_offset));
}
size_t
diff --git a/libexec/rtld-elf/mips/reloc.c b/libexec/rtld-elf/mips/reloc.c
index 163f9a170872..44ecbd66a707 100644
--- a/libexec/rtld-elf/mips/reloc.c
+++ b/libexec/rtld-elf/mips/reloc.c
@@ -776,69 +776,15 @@ allocate_initial_tls(Obj_Entry *objs)
sysarch(MIPS_SET_TLS, tls);
}
-#ifdef __mips_n64
-void *
-_mips_get_tls(void)
-{
- uint64_t _rv;
-
- __asm__ __volatile__ (
- ".set\tpush\n\t"
- ".set\tmips64r2\n\t"
- "rdhwr\t%0, $29\n\t"
- ".set\tpop"
- : "=r" (_rv));
- /*
- * XXXSS See 'git show c6be4f4d2d1b71c04de5d3bbb6933ce2dbcdb317'
- *
- * Remove the offset since this really a request to get the TLS
- * pointer via sysarch() (in theory). Of course, this may go away
- * once the TLS code is rewritten.
- */
- _rv = _rv - TLS_TP_OFFSET - TLS_TCB_SIZE;
-
- return (void *)_rv;
-}
-
-#else /* mips 32 */
-
-void *
-_mips_get_tls(void)
-{
- uint32_t _rv;
-
- __asm__ __volatile__ (
- ".set\tpush\n\t"
- ".set\tmips32r2\n\t"
- "rdhwr\t%0, $29\n\t"
- ".set\tpop"
- : "=r" (_rv));
- /*
- * XXXSS See 'git show c6be4f4d2d1b71c04de5d3bbb6933ce2dbcdb317'
- *
- * Remove the offset since this really a request to get the TLS
- * pointer via sysarch() (in theory). Of course, this may go away
- * once the TLS code is rewritten.
- */
- _rv = _rv - TLS_TP_OFFSET - TLS_TCB_SIZE;
-
- return (void *)_rv;
-}
-#endif /* ! __mips_n64 */
-
void *
__tls_get_addr(tls_index* ti)
{
- Elf_Addr** tls;
+ Elf_Addr **tls;
char *p;
-#ifdef TLS_USE_SYSARCH
- sysarch(MIPS_GET_TLS, &tls);
-#else
- tls = _mips_get_tls();
-#endif
-
- p = tls_get_addr_common(tls, ti->ti_module, ti->ti_offset + TLS_DTP_OFFSET);
+ tls = _get_tp();
+ p = tls_get_addr_common(tls, ti->ti_module, ti->ti_offset +
+ TLS_DTP_OFFSET);
return (p);
}
diff --git a/libexec/rtld-elf/mips/rtld_machdep.h b/libexec/rtld-elf/mips/rtld_machdep.h
index d2498dbb9aa4..041a5d05f9a7 100644
--- a/libexec/rtld-elf/mips/rtld_machdep.h
+++ b/libexec/rtld-elf/mips/rtld_machdep.h
@@ -44,8 +44,6 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
const struct Struct_Obj_Entry *defobj, const struct Struct_Obj_Entry *obj,
const Elf_Rel *rel);
Elf_Addr _mips_rtld_bind(struct Struct_Obj_Entry *obj, Elf_Size reloff);
-void *_mips_get_tls(void);
-
#define make_function_pointer(def, defobj) \
((defobj)->relocbase + (def)->st_value)
More information about the dev-commits-src-branches
mailing list