summary refs log tree commit diff
path: root/linuxthreads/sysdeps/i386
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-12-03 01:51:07 +0000
committerRoland McGrath <roland@gnu.org>2002-12-03 01:51:07 +0000
commit2d14868942150183adaf0bc80b8ed6b70b65261e (patch)
tree6f1aea1c1f443244ed6a0883ddf276c01232381d /linuxthreads/sysdeps/i386
parentf87277f2cdbfde84d4b82687a62e6eb8fd2222f9 (diff)
downloadglibc-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/sysdeps/i386')
-rw-r--r--linuxthreads/sysdeps/i386/tls.h28
1 files changed, 25 insertions, 3 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 */