Message ID | mvmbnv1veku.fsf@hawking.suse.de |
---|---|
State | New |
Headers | show |
> --- a/nptl/sysdeps/i386/tls.h > +++ b/nptl/sysdeps/i386/tls.h > @@ -195,7 +195,7 @@ union user_desc_init > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > operation can cause a failure 'errno' must not be touched. */ > -# define TLS_INIT_TP(thrdescr, secondcall) \ > +# define TLS_INIT_TP(thrdescr) \ > ({ void *_thrdescr = (thrdescr); \ > tcbhead_t *_head = _thrdescr; \ > union user_desc_init _segdescr; \ > @@ -208,10 +208,7 @@ union user_desc_init > INIT_SYSINFO; \ > \ > /* The 'entry_number' field. Let the kernel pick a value. */ \ > - if (secondcall) \ > - _segdescr.vals[0] = TLS_GET_GS () >> 3; \ > - else \ > - _segdescr.vals[0] = -1; \ > + _segdescr.vals[0] = -1; \ Please leave a comment behind explaining what -1 means here. > --- a/sysdeps/generic/tls.h > +++ b/sysdeps/generic/tls.h > @@ -59,12 +59,11 @@ > use the value. > > > - TLS_INIT_TP(tcb, firstcall) > + TLS_INIT_TP(tcb) > > This macro must initialize the thread pointer to enable normal TLS > operation. The first parameter is a pointer to the thread control > - block. The second parameter specifies whether this is the first > - call for the TCB. ld.so calls this macro more than once. > + block. Amend the comment to say that the macro can be used at most once in a process. > --- a/sysdeps/mach/hurd/i386/tls.h > +++ b/sysdeps/mach/hurd/i386/tls.h Looks OK to me but tschwinge should approve it too. If the Hurd bit is OK, then the whole patch is OK with the comment changes I requested above. Thanks, Roland
Roland McGrath <roland@hack.frob.com> writes: >> --- a/nptl/sysdeps/i386/tls.h >> +++ b/nptl/sysdeps/i386/tls.h >> @@ -195,7 +195,7 @@ union user_desc_init >> /* Code to initially initialize the thread pointer. This might need >> special attention since 'errno' is not yet available and if the >> operation can cause a failure 'errno' must not be touched. */ >> -# define TLS_INIT_TP(thrdescr, secondcall) \ >> +# define TLS_INIT_TP(thrdescr) \ >> ({ void *_thrdescr = (thrdescr); \ >> tcbhead_t *_head = _thrdescr; \ >> union user_desc_init _segdescr; \ >> @@ -208,10 +208,7 @@ union user_desc_init >> INIT_SYSINFO; \ >> \ >> /* The 'entry_number' field. Let the kernel pick a value. */ \ >> - if (secondcall) \ >> - _segdescr.vals[0] = TLS_GET_GS () >> 3; \ >> - else \ >> - _segdescr.vals[0] = -1; \ >> + _segdescr.vals[0] = -1; \ > > Please leave a comment behind explaining what -1 means here. ??? I didn't remove the comment. Andreas.
> Roland McGrath <roland@hack.frob.com> writes: > > >> --- a/nptl/sysdeps/i386/tls.h > >> +++ b/nptl/sysdeps/i386/tls.h > >> @@ -195,7 +195,7 @@ union user_desc_init > >> /* Code to initially initialize the thread pointer. This might need > >> special attention since 'errno' is not yet available and if the > >> operation can cause a failure 'errno' must not be touched. */ > >> -# define TLS_INIT_TP(thrdescr, secondcall) \ > >> +# define TLS_INIT_TP(thrdescr) \ > >> ({ void *_thrdescr = (thrdescr); \ > >> tcbhead_t *_head = _thrdescr; \ > >> union user_desc_init _segdescr; \ > >> @@ -208,10 +208,7 @@ union user_desc_init > >> INIT_SYSINFO; \ > >> \ > >> /* The 'entry_number' field. Let the kernel pick a value. */ \ > >> - if (secondcall) \ > >> - _segdescr.vals[0] = TLS_GET_GS () >> 3; \ > >> - else \ > >> - _segdescr.vals[0] = -1; \ > >> + _segdescr.vals[0] = -1; \ > > > > Please leave a comment behind explaining what -1 means here. > > ??? I didn't remove the comment. OK.
Roland McGrath <roland@hack.frob.com> writes: > Looks OK to me but tschwinge should approve it too. > > If the Hurd bit is OK, then the whole patch is OK with the comment > changes I requested above. Thomas, could you comment it? On Tue, May 13, 2014 at 06:16:49PM +0200, Andreas Schwab wrote: > * 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. > > --- > csu/libc-tls.c | 4 +-- > elf/dl-load.c | 2 +- > elf/rtld.c | 4 +-- > nptl/sysdeps/i386/tls.h | 7 ++-- > nptl/sysdeps/powerpc/tls.h | 2 +- > nptl/sysdeps/s390/tls.h | 2 +- > nptl/sysdeps/sh/tls.h | 2 +- > nptl/sysdeps/sparc/tls.h | 2 +- > nptl/sysdeps/x86_64/tls.h | 2 +- > sysdeps/aarch64/nptl/tls.h | 2 +- > sysdeps/alpha/nptl/tls.h | 2 +- > sysdeps/arm/nptl/tls.h | 2 +- > sysdeps/generic/tls.h | 5 ++- > sysdeps/hppa/nptl/tls.h | 2 +- > sysdeps/ia64/nptl/tls.h | 2 +- > sysdeps/m68k/nptl/tls.h | 2 +- > sysdeps/mach/hurd/i386/tls.h | 75 +++++++++++++++---------------------------- > sysdeps/microblaze/nptl/tls.h | 2 +- > sysdeps/mips/nptl/tls.h | 2 +- > sysdeps/tile/nptl/tls.h | 2 +- > 20 files changed, 49 insertions(+), 76 deletions(-) > > diff --git a/csu/libc-tls.c b/csu/libc-tls.c > index c18b888..dcb607c 100644 > --- a/csu/libc-tls.c > +++ b/csu/libc-tls.c > @@ -182,10 +182,10 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) > #if TLS_TCB_AT_TP > 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 > INSTALL_DTV (tlsblock, _dl_static_dtv); > - const char *lossage = TLS_INIT_TP (tlsblock, 0); > + const char *lossage = TLS_INIT_TP (tlsblock); > #else > # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" > #endif > diff --git a/elf/dl-load.c b/elf/dl-load.c > index cfa7f25..016a99c 100644 > --- a/elf/dl-load.c > +++ b/elf/dl-load.c > @@ -1176,7 +1176,7 @@ cannot allocate TLS data structures for initial thread"); > } > > /* 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)) > { > /* Now we are all good. */ > diff --git a/elf/rtld.c b/elf/rtld.c > index 87c5ffa..71cc0db 100644 > --- a/elf/rtld.c > +++ b/elf/rtld.c > @@ -641,7 +641,7 @@ cannot allocate TLS data structures for initial thread"); > GL(dl_initial_dtv) = GET_DTV (tcbp); > > /* 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)) > _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage); > 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. */ > 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)) > _dl_fatal_printf ("cannot set up thread-local storage: %s\n", > lossage); > diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h > index 4183ee8..2f8d11d 100644 > --- a/nptl/sysdeps/i386/tls.h > +++ b/nptl/sysdeps/i386/tls.h > @@ -195,7 +195,7 @@ union user_desc_init > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > operation can cause a failure 'errno' must not be touched. */ > -# define TLS_INIT_TP(thrdescr, secondcall) \ > +# define TLS_INIT_TP(thrdescr) \ > ({ void *_thrdescr = (thrdescr); \ > tcbhead_t *_head = _thrdescr; \ > union user_desc_init _segdescr; \ > @@ -208,10 +208,7 @@ union user_desc_init > INIT_SYSINFO; \ > \ > /* The 'entry_number' field. Let the kernel pick a value. */ \ > - if (secondcall) \ > - _segdescr.vals[0] = TLS_GET_GS () >> 3; \ > - else \ > - _segdescr.vals[0] = -1; \ > + _segdescr.vals[0] = -1; \ > /* The 'base_addr' field. Pointer to the TCB. */ \ > _segdescr.vals[1] = (unsigned long int) _thrdescr; \ > /* The 'limit' field. We use 4GB which is 0xfffff pages. */ \ > diff --git a/nptl/sysdeps/powerpc/tls.h b/nptl/sysdeps/powerpc/tls.h > index 556c8d5..91cc6f3 100644 > --- a/nptl/sysdeps/powerpc/tls.h > +++ b/nptl/sysdeps/powerpc/tls.h > @@ -129,7 +129,7 @@ register void *__thread_register __asm__ ("r13"); > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > 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) > > /* Return the address of the dtv for the current thread. */ > diff --git a/nptl/sysdeps/s390/tls.h b/nptl/sysdeps/s390/tls.h > index 2019882..bb7c339 100644 > --- a/nptl/sysdeps/s390/tls.h > +++ b/nptl/sysdeps/s390/tls.h > @@ -119,7 +119,7 @@ typedef struct > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > operation can cause a failure 'errno' must not be touched. */ > -# define TLS_INIT_TP(thrdescr, secondcall) \ > +# define TLS_INIT_TP(thrdescr) \ > ({ void *_thrdescr = (thrdescr); \ > tcbhead_t *_head = _thrdescr; \ > \ > diff --git a/nptl/sysdeps/sh/tls.h b/nptl/sysdeps/sh/tls.h > index 84e464c..a0660d2 100644 > --- a/nptl/sysdeps/sh/tls.h > +++ b/nptl/sysdeps/sh/tls.h > @@ -99,7 +99,7 @@ typedef struct > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > 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; }) > > /* Return the address of the dtv for the current thread. */ > diff --git a/nptl/sysdeps/sparc/tls.h b/nptl/sysdeps/sparc/tls.h > index 755bc23..4a1dce7 100644 > --- a/nptl/sysdeps/sparc/tls.h > +++ b/nptl/sysdeps/sparc/tls.h > @@ -107,7 +107,7 @@ register struct pthread *__thread_self __asm__("%g7"); > (((tcbhead_t *) (descr))->dtv) > > /* 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) > > /* Return the address of the dtv for the current thread. */ > diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h > index 30bd449..fb671f4 100644 > --- a/nptl/sysdeps/x86_64/tls.h > +++ b/nptl/sysdeps/x86_64/tls.h > @@ -144,7 +144,7 @@ typedef struct > > We have to make the syscall for both uses of the macro since the > address might be (and probably is) different. */ > -# define TLS_INIT_TP(thrdescr, secondcall) \ > +# define TLS_INIT_TP(thrdescr) \ > ({ void *_thrdescr = (thrdescr); \ > tcbhead_t *_head = _thrdescr; \ > int _result; \ > diff --git a/sysdeps/aarch64/nptl/tls.h b/sysdeps/aarch64/nptl/tls.h > index ae2e6c4..64cbdab 100644 > --- a/sysdeps/aarch64/nptl/tls.h > +++ b/sysdeps/aarch64/nptl/tls.h > @@ -90,7 +90,7 @@ typedef struct > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > 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; }) > > /* Return the address of the dtv for the current thread. */ > diff --git a/sysdeps/alpha/nptl/tls.h b/sysdeps/alpha/nptl/tls.h > index b2e082d..fbc579a 100644 > --- a/sysdeps/alpha/nptl/tls.h > +++ b/sysdeps/alpha/nptl/tls.h > @@ -84,7 +84,7 @@ typedef struct > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > 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) > > /* Return the address of the dtv for the current thread. */ > diff --git a/sysdeps/arm/nptl/tls.h b/sysdeps/arm/nptl/tls.h > index 1a2d606..fc828d2 100644 > --- a/sysdeps/arm/nptl/tls.h > +++ b/sysdeps/arm/nptl/tls.h > @@ -91,7 +91,7 @@ typedef struct > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > 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); \ > long result_var; \ > result_var = INTERNAL_SYSCALL_ARM (set_tls, err, 1, (tcbp)); \ > diff --git a/sysdeps/generic/tls.h b/sysdeps/generic/tls.h > index fb3d965..b950aa8 100644 > --- a/sysdeps/generic/tls.h > +++ b/sysdeps/generic/tls.h > @@ -59,12 +59,11 @@ > use the value. > > > - TLS_INIT_TP(tcb, firstcall) > + TLS_INIT_TP(tcb) > > This macro must initialize the thread pointer to enable normal TLS > operation. The first parameter is a pointer to the thread control > - block. The second parameter specifies whether this is the first > - call for the TCB. ld.so calls this macro more than once. > + block. > > > THREAD_DTV() > diff --git a/sysdeps/hppa/nptl/tls.h b/sysdeps/hppa/nptl/tls.h > index e4dc197..6c721e0 100644 > --- a/sysdeps/hppa/nptl/tls.h > +++ b/sysdeps/hppa/nptl/tls.h > @@ -95,7 +95,7 @@ typedef struct > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > 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; }) > > /* Return the address of the dtv for the current thread. */ > diff --git a/sysdeps/ia64/nptl/tls.h b/sysdeps/ia64/nptl/tls.h > index 3f9225a..3eca4e6 100644 > --- a/sysdeps/ia64/nptl/tls.h > +++ b/sysdeps/ia64/nptl/tls.h > @@ -118,7 +118,7 @@ register struct pthread *__thread_self __asm__("r13"); > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > 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) > > /* Return the address of the dtv for the current thread. */ > diff --git a/sysdeps/m68k/nptl/tls.h b/sysdeps/m68k/nptl/tls.h > index 471775a..c1df875 100644 > --- a/sysdeps/m68k/nptl/tls.h > +++ b/sysdeps/m68k/nptl/tls.h > @@ -103,7 +103,7 @@ typedef struct > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > 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); \ > int _sys_result; \ > diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h > index 03741cd..5b7abd0 100644 > --- a/sysdeps/mach/hurd/i386/tls.h > +++ b/sysdeps/mach/hurd/i386/tls.h > @@ -90,69 +90,46 @@ typedef struct > > > 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); > > - 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" > - 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) > - { > - /* 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)); > + /* 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 > + else if (err) > { > - /* Fetch the selector set by the first call. */ > - int sel; > - 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"; > - } > + 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)); > + > return 0; > } > > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > operation can cause a failure 'errno' must not be touched. */ > -# define TLS_INIT_TP(descr, secondcall) \ > - _hurd_tls_init ((tcbhead_t *) (descr), (secondcall)) > +# define TLS_INIT_TP(descr) \ > + _hurd_tls_init ((tcbhead_t *) (descr)) > > /* Return the TCB address of the current thread. */ > # define THREAD_SELF \ > diff --git a/sysdeps/microblaze/nptl/tls.h b/sysdeps/microblaze/nptl/tls.h > index 71f1dd9..e75a30c 100644 > --- a/sysdeps/microblaze/nptl/tls.h > +++ b/sysdeps/microblaze/nptl/tls.h > @@ -98,7 +98,7 @@ static inline void *__microblaze_get_thread_area (void) > > /* Code to initially initialize the 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; }) > > /* Return the address of the dtv for the current thread. */ > diff --git a/sysdeps/mips/nptl/tls.h b/sysdeps/mips/nptl/tls.h > index 754d4e4..d6fd83d 100644 > --- a/sysdeps/mips/nptl/tls.h > +++ b/sysdeps/mips/nptl/tls.h > @@ -118,7 +118,7 @@ typedef struct > /* Code to initially initialize the thread pointer. This might need > special attention since 'errno' is not yet available and if the > 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); \ > long result_var; \ > result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \ > diff --git a/sysdeps/tile/nptl/tls.h b/sysdeps/tile/nptl/tls.h > index 2a9bbc1..c93e8a8 100644 > --- a/sysdeps/tile/nptl/tls.h > +++ b/sysdeps/tile/nptl/tls.h > @@ -106,7 +106,7 @@ register void *__thread_pointer asm ("tp"); > # define GET_DTV(tcbp) (((tcbhead_t *) (tcbp))[-1].dtv) > > /* 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) > > /* Return the address of the dtv for the current thread. */
Hi! On Tue, 13 May 2014 10:01:57 -0700 (PDT), Roland McGrath <roland@hack.frob.com> wrote: > > --- a/sysdeps/mach/hurd/i386/tls.h > > +++ b/sysdeps/mach/hurd/i386/tls.h > > Looks OK to me but tschwinge should approve it too. OK. I had wondered about the firstcall/secondcall argument before, <http://news.gmane.org/find-root.php?message_id=%3C871uumj8z7.fsf%40kepler.schwinge.homeip.net%3E>. > If the Hurd bit is OK, then the whole patch is OK with the comment changes > I requested above. Grüße, Thomas
diff --git a/csu/libc-tls.c b/csu/libc-tls.c index c18b888..dcb607c 100644 --- a/csu/libc-tls.c +++ b/csu/libc-tls.c @@ -182,10 +182,10 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) #if TLS_TCB_AT_TP 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 INSTALL_DTV (tlsblock, _dl_static_dtv); - const char *lossage = TLS_INIT_TP (tlsblock, 0); + const char *lossage = TLS_INIT_TP (tlsblock); #else # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" #endif diff --git a/elf/dl-load.c b/elf/dl-load.c index cfa7f25..016a99c 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -1176,7 +1176,7 @@ cannot allocate TLS data structures for initial thread"); } /* 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)) { /* Now we are all good. */ diff --git a/elf/rtld.c b/elf/rtld.c index 87c5ffa..71cc0db 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -641,7 +641,7 @@ cannot allocate TLS data structures for initial thread"); GL(dl_initial_dtv) = GET_DTV (tcbp); /* 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)) _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage); 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. */ 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)) _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage); diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h index 4183ee8..2f8d11d 100644 --- a/nptl/sysdeps/i386/tls.h +++ b/nptl/sysdeps/i386/tls.h @@ -195,7 +195,7 @@ union user_desc_init /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the operation can cause a failure 'errno' must not be touched. */ -# define TLS_INIT_TP(thrdescr, secondcall) \ +# define TLS_INIT_TP(thrdescr) \ ({ void *_thrdescr = (thrdescr); \ tcbhead_t *_head = _thrdescr; \ union user_desc_init _segdescr; \ @@ -208,10 +208,7 @@ union user_desc_init INIT_SYSINFO; \ \ /* The 'entry_number' field. Let the kernel pick a value. */ \ - if (secondcall) \ - _segdescr.vals[0] = TLS_GET_GS () >> 3; \ - else \ - _segdescr.vals[0] = -1; \ + _segdescr.vals[0] = -1; \ /* The 'base_addr' field. Pointer to the TCB. */ \ _segdescr.vals[1] = (unsigned long int) _thrdescr; \ /* The 'limit' field. We use 4GB which is 0xfffff pages. */ \ diff --git a/nptl/sysdeps/powerpc/tls.h b/nptl/sysdeps/powerpc/tls.h index 556c8d5..91cc6f3 100644 --- a/nptl/sysdeps/powerpc/tls.h +++ b/nptl/sysdeps/powerpc/tls.h @@ -129,7 +129,7 @@ register void *__thread_register __asm__ ("r13"); /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the 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) /* Return the address of the dtv for the current thread. */ diff --git a/nptl/sysdeps/s390/tls.h b/nptl/sysdeps/s390/tls.h index 2019882..bb7c339 100644 --- a/nptl/sysdeps/s390/tls.h +++ b/nptl/sysdeps/s390/tls.h @@ -119,7 +119,7 @@ typedef struct /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the operation can cause a failure 'errno' must not be touched. */ -# define TLS_INIT_TP(thrdescr, secondcall) \ +# define TLS_INIT_TP(thrdescr) \ ({ void *_thrdescr = (thrdescr); \ tcbhead_t *_head = _thrdescr; \ \ diff --git a/nptl/sysdeps/sh/tls.h b/nptl/sysdeps/sh/tls.h index 84e464c..a0660d2 100644 --- a/nptl/sysdeps/sh/tls.h +++ b/nptl/sysdeps/sh/tls.h @@ -99,7 +99,7 @@ typedef struct /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the 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; }) /* Return the address of the dtv for the current thread. */ diff --git a/nptl/sysdeps/sparc/tls.h b/nptl/sysdeps/sparc/tls.h index 755bc23..4a1dce7 100644 --- a/nptl/sysdeps/sparc/tls.h +++ b/nptl/sysdeps/sparc/tls.h @@ -107,7 +107,7 @@ register struct pthread *__thread_self __asm__("%g7"); (((tcbhead_t *) (descr))->dtv) /* 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) /* Return the address of the dtv for the current thread. */ diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h index 30bd449..fb671f4 100644 --- a/nptl/sysdeps/x86_64/tls.h +++ b/nptl/sysdeps/x86_64/tls.h @@ -144,7 +144,7 @@ typedef struct We have to make the syscall for both uses of the macro since the address might be (and probably is) different. */ -# define TLS_INIT_TP(thrdescr, secondcall) \ +# define TLS_INIT_TP(thrdescr) \ ({ void *_thrdescr = (thrdescr); \ tcbhead_t *_head = _thrdescr; \ int _result; \ diff --git a/sysdeps/aarch64/nptl/tls.h b/sysdeps/aarch64/nptl/tls.h index ae2e6c4..64cbdab 100644 --- a/sysdeps/aarch64/nptl/tls.h +++ b/sysdeps/aarch64/nptl/tls.h @@ -90,7 +90,7 @@ typedef struct /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the 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; }) /* Return the address of the dtv for the current thread. */ diff --git a/sysdeps/alpha/nptl/tls.h b/sysdeps/alpha/nptl/tls.h index b2e082d..fbc579a 100644 --- a/sysdeps/alpha/nptl/tls.h +++ b/sysdeps/alpha/nptl/tls.h @@ -84,7 +84,7 @@ typedef struct /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the 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) /* Return the address of the dtv for the current thread. */ diff --git a/sysdeps/arm/nptl/tls.h b/sysdeps/arm/nptl/tls.h index 1a2d606..fc828d2 100644 --- a/sysdeps/arm/nptl/tls.h +++ b/sysdeps/arm/nptl/tls.h @@ -91,7 +91,7 @@ typedef struct /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the 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); \ long result_var; \ result_var = INTERNAL_SYSCALL_ARM (set_tls, err, 1, (tcbp)); \ diff --git a/sysdeps/generic/tls.h b/sysdeps/generic/tls.h index fb3d965..b950aa8 100644 --- a/sysdeps/generic/tls.h +++ b/sysdeps/generic/tls.h @@ -59,12 +59,11 @@ use the value. - TLS_INIT_TP(tcb, firstcall) + TLS_INIT_TP(tcb) This macro must initialize the thread pointer to enable normal TLS operation. The first parameter is a pointer to the thread control - block. The second parameter specifies whether this is the first - call for the TCB. ld.so calls this macro more than once. + block. THREAD_DTV() diff --git a/sysdeps/hppa/nptl/tls.h b/sysdeps/hppa/nptl/tls.h index e4dc197..6c721e0 100644 --- a/sysdeps/hppa/nptl/tls.h +++ b/sysdeps/hppa/nptl/tls.h @@ -95,7 +95,7 @@ typedef struct /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the 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; }) /* Return the address of the dtv for the current thread. */ diff --git a/sysdeps/ia64/nptl/tls.h b/sysdeps/ia64/nptl/tls.h index 3f9225a..3eca4e6 100644 --- a/sysdeps/ia64/nptl/tls.h +++ b/sysdeps/ia64/nptl/tls.h @@ -118,7 +118,7 @@ register struct pthread *__thread_self __asm__("r13"); /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the 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) /* Return the address of the dtv for the current thread. */ diff --git a/sysdeps/m68k/nptl/tls.h b/sysdeps/m68k/nptl/tls.h index 471775a..c1df875 100644 --- a/sysdeps/m68k/nptl/tls.h +++ b/sysdeps/m68k/nptl/tls.h @@ -103,7 +103,7 @@ typedef struct /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the 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); \ int _sys_result; \ diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h index 03741cd..5b7abd0 100644 --- a/sysdeps/mach/hurd/i386/tls.h +++ b/sysdeps/mach/hurd/i386/tls.h @@ -90,69 +90,46 @@ typedef struct 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); - 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" - 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) - { - /* 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)); + /* 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 + else if (err) { - /* Fetch the selector set by the first call. */ - int sel; - 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"; - } + 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)); + return 0; } /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the operation can cause a failure 'errno' must not be touched. */ -# define TLS_INIT_TP(descr, secondcall) \ - _hurd_tls_init ((tcbhead_t *) (descr), (secondcall)) +# define TLS_INIT_TP(descr) \ + _hurd_tls_init ((tcbhead_t *) (descr)) /* Return the TCB address of the current thread. */ # define THREAD_SELF \ diff --git a/sysdeps/microblaze/nptl/tls.h b/sysdeps/microblaze/nptl/tls.h index 71f1dd9..e75a30c 100644 --- a/sysdeps/microblaze/nptl/tls.h +++ b/sysdeps/microblaze/nptl/tls.h @@ -98,7 +98,7 @@ static inline void *__microblaze_get_thread_area (void) /* Code to initially initialize the 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; }) /* Return the address of the dtv for the current thread. */ diff --git a/sysdeps/mips/nptl/tls.h b/sysdeps/mips/nptl/tls.h index 754d4e4..d6fd83d 100644 --- a/sysdeps/mips/nptl/tls.h +++ b/sysdeps/mips/nptl/tls.h @@ -118,7 +118,7 @@ typedef struct /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the 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); \ long result_var; \ result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \ diff --git a/sysdeps/tile/nptl/tls.h b/sysdeps/tile/nptl/tls.h index 2a9bbc1..c93e8a8 100644 --- a/sysdeps/tile/nptl/tls.h +++ b/sysdeps/tile/nptl/tls.h @@ -106,7 +106,7 @@ register void *__thread_pointer asm ("tp"); # define GET_DTV(tcbp) (((tcbhead_t *) (tcbp))[-1].dtv) /* 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) /* Return the address of the dtv for the current thread. */