git: 6138e8498185 - stable/13 - rtld-elf: Use _get_tp in __tls_get_addr for aarch64 and riscv64.

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Fri, 29 Apr 2022 20:55:06 UTC
The branch stable/13 has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=6138e8498185b0fa229b53b1de1ed6005488d57d

commit 6138e8498185b0fa229b53b1de1ed6005488d57d
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2021-11-17 23:50:55 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2022-04-29 20:50:04 +0000

    rtld-elf: Use _get_tp in __tls_get_addr for aarch64 and riscv64.
    
    Reviewed by:    kib
    Sponsored by:   The University of Cambridge, Google Inc.
    Differential Revision:  https://reviews.freebsd.org/D33047
    
    (cherry picked from commit b928e924f74b0b8f882a9b735611421a93113640)
---
 libexec/rtld-elf/aarch64/reloc.c | 9 +++------
 libexec/rtld-elf/riscv/reloc.c   | 8 +++-----
 2 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/libexec/rtld-elf/aarch64/reloc.c b/libexec/rtld-elf/aarch64/reloc.c
index 8cc66c87d698..f697e4a03054 100644
--- a/libexec/rtld-elf/aarch64/reloc.c
+++ b/libexec/rtld-elf/aarch64/reloc.c
@@ -534,11 +534,8 @@ allocate_initial_tls(Obj_Entry *objs)
 void *
 __tls_get_addr(tls_index* ti)
 {
-      char *p;
-      void *_tp;
+	Elf_Addr **dtvp;
 
-      __asm __volatile("mrs	%0, tpidr_el0"  : "=r" (_tp));
-      p = tls_get_addr_common((Elf_Addr **)(_tp), ti->ti_module, ti->ti_offset);
-
-      return (p);
+	dtvp = _get_tp();
+	return (tls_get_addr_common(dtvp, ti->ti_module, ti->ti_offset));
 }
diff --git a/libexec/rtld-elf/riscv/reloc.c b/libexec/rtld-elf/riscv/reloc.c
index 1e749206e9b9..70db8379ade5 100644
--- a/libexec/rtld-elf/riscv/reloc.c
+++ b/libexec/rtld-elf/riscv/reloc.c
@@ -406,13 +406,11 @@ allocate_initial_tls(Obj_Entry *objs)
 void *
 __tls_get_addr(tls_index* ti)
 {
-	char *_tp;
+	Elf_Addr **dtvp;
 	void *p;
 
-	__asm __volatile("mv %0, tp" : "=r" (_tp));
-
-	p = tls_get_addr_common((Elf_Addr**)((Elf_Addr)_tp - TLS_TP_OFFSET
-	    - TLS_TCB_SIZE), ti->ti_module, ti->ti_offset);
+	dtvp = _get_tp();
+	p = tls_get_addr_common(dtvp, ti->ti_module, ti->ti_offset);
 
 	return ((char*)p + TLS_DTV_OFFSET);
 }