1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-04-24 21:47:24 +03:00

Remove second argument from TLS_INIT_TP macro

This commit is contained in:
Andreas Schwab 2014-05-13 16:40:41 +02:00
parent 36ffe7398a
commit 774f928582
21 changed files with 74 additions and 77 deletions

View File

@ -1,3 +1,27 @@
2014-05-27 Andreas Schwab <schwab@suse.de>
* csu/libc-tls.c (__libc_setup_tls): Remove second argument from
TLS_INIT_TP macro.
* elf/dl-load.c (_dl_map_object_from_fd): Likewise.
* elf/rtld.c (init_tls, dl_main): Likewise.
* nptl/sysdeps/i386/tls.h (TLS_INIT_TP): Likewise.
* nptl/sysdeps/powerpc/tls.h (TLS_INIT_TP): Likewise.
* nptl/sysdeps/s390/tls.h (TLS_INIT_TP): Likewise.
* nptl/sysdeps/sh/tls.h (TLS_INIT_TP): Likewise.
* nptl/sysdeps/sparc/tls.h (TLS_INIT_TP): Likewise.
* nptl/sysdeps/x86_64/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/aarch64/nptl/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/alpha/nptl/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/arm/nptl/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/hppa/nptl/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/ia64/nptl/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/m68k/nptl/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/mach/hurd/i386/tls.h (_hurd_tls_init): Likewise.
* sysdeps/microblaze/nptl/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/mips/nptl/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/tile/nptl/tls.h (TLS_INIT_TP): Likewise.
* sysdeps/generic/tls.h: Update description.
2014-05-27 Will Newton <will.newton@linaro.org> 2014-05-27 Will Newton <will.newton@linaro.org>
[BZ #16990] [BZ #16990]

View File

@ -182,10 +182,10 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
#if TLS_TCB_AT_TP #if TLS_TCB_AT_TP
INSTALL_DTV ((char *) tlsblock + tcb_offset, _dl_static_dtv); INSTALL_DTV ((char *) tlsblock + tcb_offset, _dl_static_dtv);
const char *lossage = TLS_INIT_TP ((char *) tlsblock + tcb_offset, 0); const char *lossage = TLS_INIT_TP ((char *) tlsblock + tcb_offset);
#elif TLS_DTV_AT_TP #elif TLS_DTV_AT_TP
INSTALL_DTV (tlsblock, _dl_static_dtv); INSTALL_DTV (tlsblock, _dl_static_dtv);
const char *lossage = TLS_INIT_TP (tlsblock, 0); const char *lossage = TLS_INIT_TP (tlsblock);
#else #else
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
#endif #endif

View File

@ -1176,7 +1176,7 @@ cannot allocate TLS data structures for initial thread");
} }
/* Now we install the TCB in the thread register. */ /* Now we install the TCB in the thread register. */
errstring = TLS_INIT_TP (tcb, 0); errstring = TLS_INIT_TP (tcb);
if (__glibc_likely (errstring == NULL)) if (__glibc_likely (errstring == NULL))
{ {
/* Now we are all good. */ /* Now we are all good. */

View File

@ -641,7 +641,7 @@ cannot allocate TLS data structures for initial thread");
GL(dl_initial_dtv) = GET_DTV (tcbp); GL(dl_initial_dtv) = GET_DTV (tcbp);
/* And finally install it for the main thread. */ /* And finally install it for the main thread. */
const char *lossage = TLS_INIT_TP (tcbp, 0); const char *lossage = TLS_INIT_TP (tcbp);
if (__glibc_unlikely (lossage != NULL)) if (__glibc_unlikely (lossage != NULL))
_dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage); _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage);
tls_init_tp_called = true; tls_init_tp_called = true;
@ -2114,7 +2114,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
/* And finally install it for the main thread. */ /* And finally install it for the main thread. */
if (! tls_init_tp_called) if (! tls_init_tp_called)
{ {
const char *lossage = TLS_INIT_TP (tcbp, 0); const char *lossage = TLS_INIT_TP (tcbp);
if (__glibc_unlikely (lossage != NULL)) if (__glibc_unlikely (lossage != NULL))
_dl_fatal_printf ("cannot set up thread-local storage: %s\n", _dl_fatal_printf ("cannot set up thread-local storage: %s\n",
lossage); lossage);

View File

@ -195,7 +195,7 @@ union user_desc_init
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(thrdescr, secondcall) \ # define TLS_INIT_TP(thrdescr) \
({ void *_thrdescr = (thrdescr); \ ({ void *_thrdescr = (thrdescr); \
tcbhead_t *_head = _thrdescr; \ tcbhead_t *_head = _thrdescr; \
union user_desc_init _segdescr; \ union user_desc_init _segdescr; \
@ -208,10 +208,7 @@ union user_desc_init
INIT_SYSINFO; \ INIT_SYSINFO; \
\ \
/* The 'entry_number' field. Let the kernel pick a value. */ \ /* The 'entry_number' field. Let the kernel pick a value. */ \
if (secondcall) \ _segdescr.vals[0] = -1; \
_segdescr.vals[0] = TLS_GET_GS () >> 3; \
else \
_segdescr.vals[0] = -1; \
/* The 'base_addr' field. Pointer to the TCB. */ \ /* The 'base_addr' field. Pointer to the TCB. */ \
_segdescr.vals[1] = (unsigned long int) _thrdescr; \ _segdescr.vals[1] = (unsigned long int) _thrdescr; \
/* The 'limit' field. We use 4GB which is 0xfffff pages. */ \ /* The 'limit' field. We use 4GB which is 0xfffff pages. */ \

View File

@ -129,7 +129,7 @@ register void *__thread_register __asm__ ("r13");
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
(__thread_register = (void *) (tcbp) + TLS_TCB_OFFSET, NULL) (__thread_register = (void *) (tcbp) + TLS_TCB_OFFSET, NULL)
/* Return the address of the dtv for the current thread. */ /* Return the address of the dtv for the current thread. */

View File

@ -119,7 +119,7 @@ typedef struct
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(thrdescr, secondcall) \ # define TLS_INIT_TP(thrdescr) \
({ void *_thrdescr = (thrdescr); \ ({ void *_thrdescr = (thrdescr); \
tcbhead_t *_head = _thrdescr; \ tcbhead_t *_head = _thrdescr; \
\ \

View File

@ -99,7 +99,7 @@ typedef struct
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
({ __asm __volatile ("ldc %0,gbr" : : "r" (tcbp)); 0; }) ({ __asm __volatile ("ldc %0,gbr" : : "r" (tcbp)); 0; })
/* Return the address of the dtv for the current thread. */ /* Return the address of the dtv for the current thread. */

View File

@ -107,7 +107,7 @@ register struct pthread *__thread_self __asm__("%g7");
(((tcbhead_t *) (descr))->dtv) (((tcbhead_t *) (descr))->dtv)
/* Code to initially initialize the thread pointer. */ /* Code to initially initialize the thread pointer. */
# define TLS_INIT_TP(descr, secondcall) \ # define TLS_INIT_TP(descr) \
(__thread_self = (__typeof (__thread_self)) (descr), NULL) (__thread_self = (__typeof (__thread_self)) (descr), NULL)
/* Return the address of the dtv for the current thread. */ /* Return the address of the dtv for the current thread. */

View File

@ -144,7 +144,7 @@ typedef struct
We have to make the syscall for both uses of the macro since the We have to make the syscall for both uses of the macro since the
address might be (and probably is) different. */ address might be (and probably is) different. */
# define TLS_INIT_TP(thrdescr, secondcall) \ # define TLS_INIT_TP(thrdescr) \
({ void *_thrdescr = (thrdescr); \ ({ void *_thrdescr = (thrdescr); \
tcbhead_t *_head = _thrdescr; \ tcbhead_t *_head = _thrdescr; \
int _result; \ int _result; \

View File

@ -90,7 +90,7 @@ typedef struct
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
({ __asm __volatile ("msr tpidr_el0, %0" : : "r" (tcbp)); NULL; }) ({ __asm __volatile ("msr tpidr_el0, %0" : : "r" (tcbp)); NULL; })
/* Return the address of the dtv for the current thread. */ /* Return the address of the dtv for the current thread. */

View File

@ -84,7 +84,7 @@ typedef struct
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
(__builtin_set_thread_pointer ((void *)(tcbp)), NULL) (__builtin_set_thread_pointer ((void *)(tcbp)), NULL)
/* Return the address of the dtv for the current thread. */ /* Return the address of the dtv for the current thread. */

View File

@ -91,7 +91,7 @@ typedef struct
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
({ INTERNAL_SYSCALL_DECL (err); \ ({ INTERNAL_SYSCALL_DECL (err); \
long result_var; \ long result_var; \
result_var = INTERNAL_SYSCALL_ARM (set_tls, err, 1, (tcbp)); \ result_var = INTERNAL_SYSCALL_ARM (set_tls, err, 1, (tcbp)); \

View File

@ -59,12 +59,11 @@
use the value. use the value.
TLS_INIT_TP(tcb, firstcall) TLS_INIT_TP(tcb)
This macro must initialize the thread pointer to enable normal TLS This macro must initialize the thread pointer to enable normal TLS
operation. The first parameter is a pointer to the thread control operation. The parameter is a pointer to the thread control block.
block. The second parameter specifies whether this is the first ld.so calls this macro once.
call for the TCB. ld.so calls this macro more than once.
THREAD_DTV() THREAD_DTV()

View File

@ -95,7 +95,7 @@ typedef struct
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
({ __set_cr27(tcbp); NULL; }) ({ __set_cr27(tcbp); NULL; })
/* Return the address of the dtv for the current thread. */ /* Return the address of the dtv for the current thread. */

View File

@ -118,7 +118,7 @@ register struct pthread *__thread_self __asm__("r13");
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(thrdescr, secondcall) \ # define TLS_INIT_TP(thrdescr) \
(__thread_self = (thrdescr), INIT_SYSINFO, NULL) (__thread_self = (thrdescr), INIT_SYSINFO, NULL)
/* Return the address of the dtv for the current thread. */ /* Return the address of the dtv for the current thread. */

View File

@ -103,7 +103,7 @@ typedef struct
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
({ \ ({ \
INTERNAL_SYSCALL_DECL (err); \ INTERNAL_SYSCALL_DECL (err); \
int _sys_result; \ int _sys_result; \

View File

@ -90,69 +90,46 @@ typedef struct
static inline const char * __attribute__ ((unused)) static inline const char * __attribute__ ((unused))
_hurd_tls_init (tcbhead_t *tcb, int secondcall) _hurd_tls_init (tcbhead_t *tcb)
{ {
HURD_TLS_DESC_DECL (desc, tcb); HURD_TLS_DESC_DECL (desc, tcb);
if (!secondcall) /* This field is used by TLS accesses to get our "thread pointer"
from the TLS point of view. */
tcb->tcb = tcb;
/* Cache our thread port. */
tcb->self = __mach_thread_self ();
/* Get the first available selector. */
int sel = -1;
error_t err = __i386_set_gdt (tcb->self, &sel, desc);
if (err == MIG_BAD_ID)
{ {
/* This field is used by TLS accesses to get our "thread pointer" /* Old kernel, use a per-thread LDT. */
from the TLS point of view. */ sel = 0x27;
tcb->tcb = tcb; err = __i386_set_ldt (tcb->self, sel, &desc, 1);
assert_perror (err);
/* Cache our thread port. */ if (err)
tcb->self = __mach_thread_self (); return "i386_set_ldt failed";
/* Get the first available selector. */
int sel = -1;
error_t err = __i386_set_gdt (tcb->self, &sel, desc);
if (err == MIG_BAD_ID)
{
/* Old kernel, use a per-thread LDT. */
sel = 0x27;
err = __i386_set_ldt (tcb->self, sel, &desc, 1);
assert_perror (err);
if (err)
return "i386_set_ldt failed";
}
else if (err)
{
assert_perror (err); /* Separate from above with different line #. */
return "i386_set_gdt failed";
}
/* Now install the new selector. */
asm volatile ("mov %w0, %%gs" :: "q" (sel));
} }
else else if (err)
{ {
/* Fetch the selector set by the first call. */ assert_perror (err); /* Separate from above with different line #. */
int sel; return "i386_set_gdt failed";
asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0));
if (__builtin_expect (sel, 0x50) & 4) /* LDT selector */
{
error_t err = __i386_set_ldt (tcb->self, sel, &desc, 1);
assert_perror (err);
if (err)
return "i386_set_ldt failed";
}
else
{
error_t err = __i386_set_gdt (tcb->self, &sel, desc);
assert_perror (err);
if (err)
return "i386_set_gdt failed";
}
} }
/* Now install the new selector. */
asm volatile ("mov %w0, %%gs" :: "q" (sel));
return 0; return 0;
} }
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(descr, secondcall) \ # define TLS_INIT_TP(descr) \
_hurd_tls_init ((tcbhead_t *) (descr), (secondcall)) _hurd_tls_init ((tcbhead_t *) (descr))
/* Return the TCB address of the current thread. */ /* Return the TCB address of the current thread. */
# define THREAD_SELF \ # define THREAD_SELF \

View File

@ -98,7 +98,7 @@ static inline void *__microblaze_get_thread_area (void)
/* Code to initially initialize the thread pointer. /* Code to initially initialize the thread pointer.
r21 is reserved for thread pointer. */ r21 is reserved for thread pointer. */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
({ __asm __volatile ("or r21,r0,%0" : : "r" ((void *)tcbp)); 0; }) ({ __asm __volatile ("or r21,r0,%0" : : "r" ((void *)tcbp)); 0; })
/* Return the address of the dtv for the current thread. */ /* Return the address of the dtv for the current thread. */

View File

@ -118,7 +118,7 @@ typedef struct
/* Code to initially initialize the thread pointer. This might need /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
({ INTERNAL_SYSCALL_DECL (err); \ ({ INTERNAL_SYSCALL_DECL (err); \
long result_var; \ long result_var; \
result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \ result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \

View File

@ -106,7 +106,7 @@ register void *__thread_pointer asm ("tp");
# define GET_DTV(tcbp) (((tcbhead_t *) (tcbp))[-1].dtv) # define GET_DTV(tcbp) (((tcbhead_t *) (tcbp))[-1].dtv)
/* Code to initially initialize the thread pointer (tp). */ /* Code to initially initialize the thread pointer (tp). */
# define TLS_INIT_TP(tcbp, secondcall) \ # define TLS_INIT_TP(tcbp) \
(__thread_pointer = (char *)(tcbp) + TLS_TCB_OFFSET, NULL) (__thread_pointer = (char *)(tcbp) + TLS_TCB_OFFSET, NULL)
/* Return the address of the dtv for the current thread. */ /* Return the address of the dtv for the current thread. */