Browse Source

Merge some pre-work from branch, needed by NPTL.

Khem Raj 15 years ago
parent
commit
15a971616c
8 changed files with 108 additions and 1 deletions
  1. 30 1
      extra/Configs/Config.in
  2. 33 0
      extra/scripts/gen-as-const.awk
  3. 11 0
      include/elf.h
  4. 5 0
      include/fcntl.h
  5. 6 0
      include/sched.h
  6. 2 0
      include/time.h
  7. 19 0
      include/tls.h
  8. 2 0
      include/unistd.h

+ 30 - 1
extra/Configs/Config.in

@@ -403,9 +403,30 @@ config LINUXTHREADS_OLD
 	  the latest code from glibc, so it may be the only choice for the
 	  the latest code from glibc, so it may be the only choice for the
 	  newer ports (like alpha/amd64/64bit arches and hppa).
 	  newer ports (like alpha/amd64/64bit arches and hppa).
 
 
+config UCLIBC_HAS_THREADS_NATIVE
+	bool "Native POSIX Threading (NPTL) Support"
+	depends on UCLIBC_HAS_THREADS
+	default n
+	help
+	  If you want to compile uClibc with NPTL support, then answer Y.
+
+	  IMPORTANT NOTE!  NPTL requires a Linux 2.6 kernel, binutils
+	  at least version 2.16 and GCC with at least version 4.1.0. NPTL
+	  will not work with older versions of any above sources. If you
+	  ignore any of these guidelines, you do so at your own risk. Do
+	  not ask for help on any of the development mailing lists.
+
+	  !!!! WARNING !!!! BIG FAT WARNING !!!! REALLY BIG FAT WARNING !!!!
+
+	  This is experimental code and at times it may not even build and
+	  even if it does it might decide to do random damage. This code is
+	  potentially hazardous to your health and sanity. It will remain
+	  that way until further notice at which point this notice will
+	  disappear. Thank you for your support and for not smoking.
+
 config LINUXTHREADS_NEW
 config LINUXTHREADS_NEW
 	def_bool y
 	def_bool y
-	depends on UCLIBC_HAS_THREADS && !LINUXTHREADS_OLD
+	depends on UCLIBC_HAS_THREADS && !LINUXTHREADS_OLD && !UCLIBC_HAS_THREADS_NATIVE
 
 
 config UCLIBC_HAS_SYSLOG
 config UCLIBC_HAS_SYSLOG
 	bool "Syslog support"
 	bool "Syslog support"
@@ -1602,6 +1623,14 @@ config UCLIBC_HAS_GNU_GETOPT
 
 
 	  Most people will answer Y.
 	  Most people will answer Y.
 
 
+config UCLIBC_HAS_STDIO_FUTEXES
+	bool "Use futexes for multithreaded I/O locking"
+	default n
+	depends on UCLIBC_HAS_THREADS_NATIVE
+	help
+	  If you want to compile uClibc to use futexes for low-level
+	  I/O locking, answer Y.  Otherwise, answer N.
+
 config UCLIBC_HAS_GETOPT_LONG
 config UCLIBC_HAS_GETOPT_LONG
 	bool "Support getopt_long/getopt_long_only"
 	bool "Support getopt_long/getopt_long_only"
 	depends on !UCLIBC_HAS_GNU_GETOPT
 	depends on !UCLIBC_HAS_GNU_GETOPT

+ 33 - 0
extra/scripts/gen-as-const.awk

@@ -0,0 +1,33 @@
+# Script used in producing headers of assembly constants from C expressions.
+# The input to this script looks like:
+#	#cpp-directive ...
+#	NAME1
+#	NAME2 expression ...
+# The output of this script is C code to be run through gcc -S and then
+# massaged to extract the integer constant values of the given C expressions.
+# A line giving just a name implies an expression consisting of just that name.
+
+BEGIN { started = 0 }
+
+# cpp directives go straight through.
+/^#/ { print; next }
+
+NF >= 1 && !started {
+  printf "void dummy(void);\n";
+  print "void dummy(void) {";
+  started = 1;
+}
+
+# Separator.
+$1 == "--" { next }
+
+NF == 1 { sub(/^.*$/, "& &"); }
+
+NF > 1 {
+  name = $1;
+  sub(/^[^ 	]+[ 	]+/, "");
+  printf "__asm__ (\"@@@name@@@%s@@@value@@@%%0@@@end@@@\" : : \"i\" (%s));\n",
+    name, $0;
+}
+
+END { if (started) print "}" }

+ 11 - 0
include/elf.h

@@ -2367,6 +2367,9 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_ARM_THM_SWI8		14
 #define R_ARM_THM_SWI8		14
 #define R_ARM_XPC25		15
 #define R_ARM_XPC25		15
 #define R_ARM_THM_XPC22		16
 #define R_ARM_THM_XPC22		16
+#define R_ARM_TLS_DTPMOD32	17
+#define R_ARM_TLS_DTPOFF32	18
+#define R_ARM_TLS_TPOFF32	19
 #define R_ARM_COPY		20	/* Copy symbol at runtime */
 #define R_ARM_COPY		20	/* Copy symbol at runtime */
 #define R_ARM_GLOB_DAT		21	/* Create GOT entry */
 #define R_ARM_GLOB_DAT		21	/* Create GOT entry */
 #define R_ARM_JUMP_SLOT		22	/* Create PLT entry */
 #define R_ARM_JUMP_SLOT		22	/* Create PLT entry */
@@ -2385,6 +2388,14 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_ARM_GNU_VTINHERIT	101
 #define R_ARM_GNU_VTINHERIT	101
 #define R_ARM_THM_PC11		102	/* thumb unconditional branch */
 #define R_ARM_THM_PC11		102	/* thumb unconditional branch */
 #define R_ARM_THM_PC9		103	/* thumb conditional branch */
 #define R_ARM_THM_PC9		103	/* thumb conditional branch */
+#define R_ARM_TLS_GD32		104
+#define R_ARM_TLS_LDM32		105
+#define R_ARM_TLS_LDO32		106
+#define R_ARM_TLS_IE32		107
+#define R_ARM_TLS_LE32		108
+#define R_ARM_TLS_LDO12		109
+#define R_ARM_TLS_LE12		110
+#define R_ARM_TLS_IE12GP	111
 #define R_ARM_RXPC25		249
 #define R_ARM_RXPC25		249
 #define R_ARM_RSBREL32		250
 #define R_ARM_RSBREL32		250
 #define R_ARM_THM_RPC22		251
 #define R_ARM_THM_RPC22		251

+ 5 - 0
include/fcntl.h

@@ -224,6 +224,11 @@ extern int __REDIRECT (posix_fallocate, (int __fd, __off64_t __offset,
 #  define posix_fallocate posix_fallocate64
 #  define posix_fallocate posix_fallocate64
 # endif
 # endif
 # endif
 # endif
+
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+extern int __fcntl_nocancel (int fd, int cmd, ...);
+#endif
+
 # ifdef __USE_LARGEFILE64
 # ifdef __USE_LARGEFILE64
 extern int posix_fallocate64 (int __fd, __off64_t __offset, __off64_t __len);
 extern int posix_fallocate64 (int __fd, __off64_t __offset, __off64_t __len);
 # endif
 # endif

+ 6 - 0
include/sched.h

@@ -79,6 +79,12 @@ extern int sched_setaffinity (__pid_t __pid, size_t __cpusetsize,
 /* Get the CPU affinity for a task */
 /* Get the CPU affinity for a task */
 extern int sched_getaffinity (__pid_t __pid, size_t __cpusetsize,
 extern int sched_getaffinity (__pid_t __pid, size_t __cpusetsize,
 			      cpu_set_t *__cpuset) __THROW;
 			      cpu_set_t *__cpuset) __THROW;
+
+extern int __clone (int (*__fn) (void *__arg), void *__child_stack,
+		    int __flags, void *__arg, ...);
+extern int __clone2 (int (*__fn) (void *__arg), void *__child_stack_base,
+		     size_t __child_stack_size, int __flags, void *__arg, ...);
+
 #endif
 #endif
 
 
 __END_DECLS
 __END_DECLS

+ 2 - 0
include/time.h

@@ -195,6 +195,8 @@ extern double difftime (time_t __time1, time_t __time0)
      __THROW __attribute__ ((__const__));
      __THROW __attribute__ ((__const__));
 #endif /* __UCLIBC_HAS_FLOATS__ */
 #endif /* __UCLIBC_HAS_FLOATS__ */
 
 
+#define CLOCK_IDFIELD_SIZE	3
+
 /* Return the `time_t' representation of TP and normalize TP.  */
 /* Return the `time_t' representation of TP and normalize TP.  */
 extern time_t mktime (struct tm *__tp) __THROW;
 extern time_t mktime (struct tm *__tp) __THROW;
 
 

+ 19 - 0
include/tls.h

@@ -0,0 +1,19 @@
+/* This file defines USE___THREAD to 1 or 0 to cut down on the #if mess.  */
+
+#ifndef _include_tls_h
+#define _include_tls_h 1
+
+#include_next <tls.h>
+
+#if USE_TLS && HAVE___THREAD \
+    && (!defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt)
+
+# define USE___THREAD 1
+
+#else
+
+# define USE___THREAD 0
+
+#endif
+
+#endif

+ 2 - 0
include/unistd.h

@@ -770,6 +770,8 @@ extern __pid_t vfork (void) __THROW;
 libc_hidden_proto(vfork)
 libc_hidden_proto(vfork)
 #endif /* Use BSD. */
 #endif /* Use BSD. */
 
 
+/* Special exit function which only terminates the current thread.  */
+extern void __exit_thread (int val) __attribute__ ((noreturn));
 
 
 /* Return the pathname of the terminal FD is open on, or NULL on errors.
 /* Return the pathname of the terminal FD is open on, or NULL on errors.
    The returned storage is good only until the next call to this function.  */
    The returned storage is good only until the next call to this function.  */