diff options
author | Roland McGrath <roland@gnu.org> | 2002-12-03 01:51:07 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-12-03 01:51:07 +0000 |
commit | 2d14868942150183adaf0bc80b8ed6b70b65261e (patch) | |
tree | 6f1aea1c1f443244ed6a0883ddf276c01232381d /linuxthreads | |
parent | f87277f2cdbfde84d4b82687a62e6eb8fd2222f9 (diff) | |
download | glibc-2d14868942150183adaf0bc80b8ed6b70b65261e.tar.gz glibc-2d14868942150183adaf0bc80b8ed6b70b65261e.tar.xz glibc-2d14868942150183adaf0bc80b8ed6b70b65261e.zip |
* elf/tst-tls4.c: Define an unused TLS variable here, so that no lazy
TLS setup is required. * elf/tst-tls5.c: Likewise. * elf/tst-tls6.c: Likewise. * elf/tst-tls7.c: Likewise. * elf/tst-tls8.c: Likewise. * elf/tst-tls9.c: Likewise. * elf/rtld.c (dl_main): Remove [! SHARED] conditional from `if (GL(dl_tls_max_dtv_idx) > 0)' tests for doing TLS setup. * elf/dl-close.c (libc_freeres_fn): Check GL(dl_tls_dtv_slotinfo_list) for being null before calling free_slotinfo. * elf/dl-load.c (_dl_map_object_from_fd) [SHARED]: For PT_TLS in dynamic loading, bail with error if GL(dl_tls_max_dtv_idx) is zero.
Diffstat (limited to 'linuxthreads')
-rw-r--r-- | linuxthreads/sysdeps/i386/tls.h | 28 | ||||
-rw-r--r-- | linuxthreads/tst-context.c | 11 |
2 files changed, 34 insertions, 5 deletions
diff --git a/linuxthreads/sysdeps/i386/tls.h b/linuxthreads/sysdeps/i386/tls.h index 7715303d95..8bbe5f28e6 100644 --- a/linuxthreads/sysdeps/i386/tls.h +++ b/linuxthreads/sysdeps/i386/tls.h @@ -43,8 +43,17 @@ typedef struct #endif -/* We can support TLS only if the floating-stack support is available. */ -#if defined FLOATING_STACKS && defined HAVE_TLS_SUPPORT +/* We can support TLS only if the floating-stack support is available. + However, we want to compile in the support and test at runtime whether + the running kernel can support it or not. To avoid bothering with the + TLS support code at all, use configure --without-tls. + + We need USE_TLS to be consistently defined, for ldsodefs.h conditionals. + But some of the code below can cause problems in building libpthread + (e.g. useldt.h will defined FLOATING_STACKS when it shouldn't). */ + +#if defined HAVE_TLS_SUPPORT \ + && (defined FLOATING_STACKS || !defined IS_IN_libpthread) /* Signal that TLS support is available. */ # define USE_TLS 1 @@ -96,8 +105,21 @@ typedef struct # define TLS_LOAD_EBX # endif +# if __ASSUME_LDT_WORKS > 0 +# define TLS_DO_MODIFY_LDT_KERNEL_CHECK /* Nothing to do. */ +# else +# include "useldt.h" /* For the structure. */ +# define TLS_DO_MODIFY_LDT_KERNEL_CHECK \ + if (__builtin_expect (GL(dl_osversion) < 131939, 0)) \ + _dl_fatal_printf ("kernel %u.%u.%u cannot support thread-local storage\n",\ + (GL(dl_osversion) >> 16) & 0xff, \ + (GL(dl_osversion) >> 8) & 0xff, \ + (GL(dl_osversion) >> 0) & 0xff); +# endif + # define TLS_DO_MODIFY_LDT(descr, nr) \ ({ \ + TLS_DO_MODIFY_LDT_KERNEL_CHECK \ struct modify_ldt_ldt_s ldt_entry = \ { nr, (unsigned long int) (descr), 0xfffff /* 4GB in pages */, \ 1, 0, 0, 1, 0, 1, 0 }; \ @@ -177,7 +199,7 @@ typedef struct ({ struct _pthread_descr_struct *__descr; \ THREAD_GETMEM (__descr, p_header.data.dtvp); }) -# endif /* FLOATING_STACKS && HAVE_TLS_SUPPORT */ +# endif /* HAVE_TLS_SUPPORT && (FLOATING_STACKS || !IS_IN_libpthread) */ #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/linuxthreads/tst-context.c b/linuxthreads/tst-context.c index 5c3272a4fb..2938a9f7fa 100644 --- a/linuxthreads/tst-context.c +++ b/linuxthreads/tst-context.c @@ -1,3 +1,12 @@ +/* Ack, a hack! We need to get the proper definition, or lack thereof, + for FLOATING_STACKS. But when !IS_IN_libpthread, this can get defined + incidentally by <tls.h>. So kludge around it. */ + +#define IS_IN_libpthread +#include <tls.h> +#undef IS_IN_libpthread +#undef USE___THREAD + #include <errno.h> #include <error.h> #include <pthread.h> @@ -5,8 +14,6 @@ #include <stdlib.h> #include <ucontext.h> -#include "pt-machine.h" - #define N 4 |