about summary refs log tree commit diff
path: root/sysdeps/powerpc/nptl
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2022-01-24 07:58:18 +1030
committerAlan Modra <amodra@gmail.com>2022-04-10 08:33:40 +0930
commit31a9bc8c55adc2a8d6f8f795a577ba5d5eca7506 (patch)
treebc13ea619de5d93042bd2c1335af37a51e9c5baa /sysdeps/powerpc/nptl
parentd6efcc118e406a1cfeb309f835d7118df53419bb (diff)
downloadglibc-31a9bc8c55adc2a8d6f8f795a577ba5d5eca7506.tar.gz
glibc-31a9bc8c55adc2a8d6f8f795a577ba5d5eca7506.tar.xz
glibc-31a9bc8c55adc2a8d6f8f795a577ba5d5eca7506.zip
powerpc64: Set up thread register for _dl_relocate_static_pie
libgcc ifunc resolvers that access hwcap via a field in the tcb can't
be called until the thread pointer is set up.  Other ifunc resolvers
might need access to at_platform.  This patch sets up a fake thread
pointer early to a copy of tcbhead_t.  hwcapinfo.c already had local
variables for hwcap and at_platform, replace them with an entire
tcbhead_t.  It's not that large and this way we easily ensure hwcap
and at_platform are at the same relative offsets as they are in the
real thread block.

The patch also conditionally disables part of tst-tlsifunc-static,
"bar address read from IFUNC resolver is incorrect".  We can't get a
proper address for a thread variable before glibc initialises tls.

Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Diffstat (limited to 'sysdeps/powerpc/nptl')
-rw-r--r--sysdeps/powerpc/nptl/tls.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/sysdeps/powerpc/nptl/tls.h b/sysdeps/powerpc/nptl/tls.h
index b80d39ad41..22b0075235 100644
--- a/sysdeps/powerpc/nptl/tls.h
+++ b/sysdeps/powerpc/nptl/tls.h
@@ -45,8 +45,6 @@
 
 #ifndef __ASSEMBLER__
 
-# include <hwcapinfo.h>
-
 /* Get system call information.  */
 # include <sysdep.h>
 
@@ -100,6 +98,8 @@ typedef struct
   dtv_t *dtv;
 } tcbhead_t;
 
+# include <hwcapinfo.h>
+
 /* This is the size of the initial TCB.  */
 # define TLS_INIT_TCB_SIZE	0
 
@@ -137,8 +137,8 @@ typedef struct
 # define TLS_INIT_TP(tcbp) \
   ({ 									      \
     __thread_register = (void *) (tcbp) + TLS_TCB_OFFSET;		      \
-    THREAD_SET_HWCAP (__tcb_hwcap);					      \
-    THREAD_SET_AT_PLATFORM (__tcb_platform);				      \
+    THREAD_SET_HWCAP (__tcb.hwcap);					      \
+    THREAD_SET_AT_PLATFORM (__tcb.at_platform);				      \
     NULL;								      \
   })