diff options
| -rw-r--r-- | libc/misc/Makefile.in | 1 | ||||
| -rw-r--r-- | libc/misc/pthread/Makefile.in | 1 | ||||
| -rw-r--r-- | libc/misc/pthread/tsd.c | 11 | ||||
| -rw-r--r-- | libc/stdlib/Makefile.in | 7 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/Makefile.in | 21 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/__rt_sigwaitinfo.c | 103 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/_exit.c | 10 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/bits/kernel-features.h | 387 | 
8 files changed, 523 insertions, 18 deletions
diff --git a/libc/misc/Makefile.in b/libc/misc/Makefile.in index 838081d66..6c09d3142 100644 --- a/libc/misc/Makefile.in +++ b/libc/misc/Makefile.in @@ -21,6 +21,7 @@ include $(top_srcdir)libc/misc/gnu/Makefile.in  include $(top_srcdir)libc/misc/internals/Makefile.in  include $(top_srcdir)libc/misc/locale/Makefile.in  include $(top_srcdir)libc/misc/mntent/Makefile.in +include $(top_srcdir)libc/misc/pthread/Makefile.in  include $(top_srcdir)libc/misc/regex/Makefile.in  include $(top_srcdir)libc/misc/search/Makefile.in  include $(top_srcdir)libc/misc/statfs/Makefile.in diff --git a/libc/misc/pthread/Makefile.in b/libc/misc/pthread/Makefile.in index ceea1c21b..48e816236 100644 --- a/libc/misc/pthread/Makefile.in +++ b/libc/misc/pthread/Makefile.in @@ -10,6 +10,7 @@ subdirs += libc/misc/pthread  MISC_PTHREAD_DIR := $(top_srcdir)libc/misc/pthread  MISC_PTHREAD_OUT := $(top_builddir)libc/misc/pthread +libc-shared-$(UCLIBC_HAS_THREADS) += $(MISC_PTHREAD_OUT)/tsd.os  libc-$(UCLIBC_HAS_THREADS) += $(MISC_PTHREAD_OUT)/unlock.o  libc-$(UCLIBC_HAS_THREADS) += $(MISC_PTHREAD_OUT)/weaks.o diff --git a/libc/misc/pthread/tsd.c b/libc/misc/pthread/tsd.c new file mode 100644 index 000000000..434938d97 --- /dev/null +++ b/libc/misc/pthread/tsd.c @@ -0,0 +1,11 @@ +/* libpthread sets _dl_error_catch_tsd to point to this function. +   We define it here instead of in libpthread so t here instead of in libpthread so that it doesn't +   need to have a TLS segment of its own just for this one pointer.  */ + +void ** __attribute__ ((const)) +__libc_dl_error_tsd (void) +{ +  static __thread void *data __attribute__ ((tls_model ("initial-exec"))); +  return &data; +} + diff --git a/libc/stdlib/Makefile.in b/libc/stdlib/Makefile.in index 48ee5f227..af8be6451 100644 --- a/libc/stdlib/Makefile.in +++ b/libc/stdlib/Makefile.in @@ -13,7 +13,7 @@ include $(top_srcdir)libc/stdlib/malloc-standard/Makefile.in  CSRC := \  	abort.c getenv.c mkdtemp.c realpath.c mkstemp.c \ -	rand.c random.c random_r.c setenv.c system.c div.c ldiv.c lldiv.c \ +	rand.c random.c random_r.c setenv.c div.c ldiv.c lldiv.c \  	getpt.c drand48-iter.c jrand48.c \  	jrand48_r.c lrand48.c lrand48_r.c mrand48.c mrand48_r.c nrand48.c \  	nrand48_r.c rand_r.c srand48.c srand48_r.c seed48.c seed48_r.c \ @@ -40,7 +40,6 @@ ifeq ($(UCLIBC_SUSV3_LEGACY),y)  CSRC += mktemp.c  endif -  # multi source stdlib.c  CSRC +=	abs.c labs.c atoi.c atol.c strtol.c strtoul.c _stdlib_strto_l.c \  	qsort.c bsearch.c \ @@ -92,7 +91,9 @@ STDLIB_SRC := $(patsubst %.c,$(STDLIB_DIR)/%.c,$(CSRC))  STDLIB_OBJ := $(patsubst %.c,$(STDLIB_OUT)/%.o,$(CSRC))  libc-y += $(STDLIB_OBJ) -libc-static-y += $(STDLIB_OUT)/atexit.o +libc-static-y += $(STDLIB_OUT)/atexit.o $(STDLIB_OUT)/system.o +libc-shared-y += $(STDLIB_OUT)/system.oS +  # this should always be the PIC version, because it could be used in shared libs  libc-nonshared-y += $(STDLIB_OUT)/atexit.os diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in index ec889ca0d..535a57369 100644 --- a/libc/sysdeps/linux/common/Makefile.in +++ b/libc/sysdeps/linux/common/Makefile.in @@ -33,6 +33,15 @@ CSRC := $(filter-out capget.c capset.c inotify.c ioperm.c iopl.c madvise.c \  	splice.c vmsplice.c tee.c signalfd.c swapoff.c swapon.c \  	sync_file_range.c sysctl.c sysinfo.c timerfd.c uselib.c vhangup.c,$(CSRC))  endif +	 +ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y) +CSRC := $(filter-out fork.c getpid.c raise.c open.c close.c read.c write.c, $(CSRC)) +ifneq ($(TARGET_ARCH),arm) +CSRC := $(filter-out waitpid.c, $(CSRC)) +else +CSRC := $(filter-out vfork.c, $(CSRC)) +endif +endif  ifneq ($(UCLIBC_BSD_SPECIFIC),y)  # we need these internally: getdomainname.c @@ -75,6 +84,18 @@ ifneq ($(UCLIBC_SV4_DEPRECATED),y)  CSRC := $(filter-out ustat.c,$(CSRC))  endif +ifeq ($(TARGET_ARCH),sh) +CSRC := $(filter-out longjmp.c vfork.c,$(CSRC)) +endif + +ifeq ($(TARGET_ARCH),sparc) +CSRC := $(filter-out vfork.c,$(CSRC)) +endif + +ifeq ($(TARGET_ARCH),i386) +CSRC := $(filter-out vfork.c,$(CSRC)) +endif +  # fails for some reason  ifneq ($(strip $(ARCH_OBJS)),)  CSRC := $(filter-out $(notdir $(ARCH_OBJS:.o=.c)) $(ARCH_OBJ_FILTEROUT),$(CSRC)) diff --git a/libc/sysdeps/linux/common/__rt_sigwaitinfo.c b/libc/sysdeps/linux/common/__rt_sigwaitinfo.c new file mode 100644 index 000000000..1adc0fd73 --- /dev/null +++ b/libc/sysdeps/linux/common/__rt_sigwaitinfo.c @@ -0,0 +1,103 @@ +/* vi: set sw=4 ts=4: */ +/* + * __rt_sigwaitinfo() for uClibc + * + * Copyright (C) 2006 by Steven Hill <sjhill@realitydiluted.com> + * Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org> + * + * GNU Library General Public License (LGPL) version 2 or later. + */ + +#include <sys/syscall.h> +#include <signal.h> +#include <string.h> + +libc_hidden_proto(memcpy) + +#ifdef __NR_rt_sigtimedwait + +#include <string.h> + +# ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#  include <sysdep-cancel.h> + +static int do_sigwaitinfo(const sigset_t *set, siginfo_t *info) +{ +#  ifdef SIGCANCEL +	sigset_t tmpset; + +	if (set != NULL && (__builtin_expect (__sigismember (set, SIGCANCEL), 0) +#   ifdef SIGSETXID +		|| __builtin_expect (__sigismember (set, SIGSETXID), 0) +#   endif +		)) +	{ +		/* Create a temporary mask without the bit for SIGCANCEL set.  */ +		// We are not copying more than we have to. +		memcpy (&tmpset, set, _NSIG / 8); +		__sigdelset (&tmpset, SIGCANCEL); +#   ifdef SIGSETXID +		__sigdelset (&tmpset, SIGSETXID); +#   endif +		set = &tmpset; +	} +#  endif + +	/* XXX The size argument hopefully will have to be changed to the +	   real size of the user-level sigset_t.  */ +	int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set, info, +								 NULL, _NSIG / 8); + +	/* The kernel generates a SI_TKILL code in si_code in case tkill is +	   used.  tkill is transparently used in raise().  Since having +	   SI_TKILL as a code is useful in general we fold the results +	   here.  */ +	if (result != -1 && info != NULL && info->si_code == SI_TKILL) +		info->si_code = SI_USER; + +	return result; +} + +/* Return any pending signal or wait for one for the given time.  */ +int __sigwaitinfo(const sigset_t *set, siginfo_t *info) +{ +	if(SINGLE_THREAD_P) +		return do_sigwaitinfo(set, info); + +	int oldtype = LIBC_CANCEL_ASYNC(); + +	/* XXX The size argument hopefully will have to be changed to the +	   real size of the user-level sigset_t.  */ +	int result = do_sigwaitinfo(set, info); + +	LIBC_CANCEL_RESET(oldtype); + +	return result; +} +# else +#  define __need_NULL +#  include <stddef.h> +#  define __NR___rt_sigwaitinfo __NR_rt_sigtimedwait +static _syscall4(int, __rt_sigwaitinfo, const sigset_t *, set, +				 siginfo_t *, info, const struct timespec *, timeout, +				 size_t, setsize); + +int attribute_hidden __sigwaitinfo(const sigset_t * set, siginfo_t * info) +{ +	return __rt_sigwaitinfo(set, info, NULL, _NSIG / 8); +} +# endif +#else +int attribute_hidden __sigwaitinfo(const sigset_t * set, siginfo_t * info) +{ +	if (set == NULL) +		__set_errno(EINVAL); +	else +		__set_errno(ENOSYS); +	return -1; +} +#endif +libc_hidden_proto(sigwaitinfo) +weak_alias (__sigwaitinfo, sigwaitinfo) +libc_hidden_weak(sigwaitinfo) + diff --git a/libc/sysdeps/linux/common/_exit.c b/libc/sysdeps/linux/common/_exit.c index fbeed0d8a..a36927d0c 100644 --- a/libc/sysdeps/linux/common/_exit.c +++ b/libc/sysdeps/linux/common/_exit.c @@ -12,12 +12,22 @@  #include <unistd.h>  #include <sys/types.h>  #include <sys/syscall.h> +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#include <sysdep.h> +#endif  void attribute_noreturn _exit(int status)  {  	/* The loop is added only to keep gcc happy. */  	while(1) +	{ +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +# ifdef __NR_exit_group +		INLINE_SYSCALL(exit_group, 1, status); +# endif +#endif  		INLINE_SYSCALL(exit, 1, status); +	}  }  libc_hidden_def(_exit) diff --git a/libc/sysdeps/linux/common/bits/kernel-features.h b/libc/sysdeps/linux/common/bits/kernel-features.h index 88297349a..923341b35 100644 --- a/libc/sysdeps/linux/common/bits/kernel-features.h +++ b/libc/sysdeps/linux/common/bits/kernel-features.h @@ -26,23 +26,126 @@  #endif  #include <linux/version.h> -#define __LINUX_KERNEL_VERSION	LINUX_VERSION_CODE +#define __LINUX_KERNEL_VERSION		LINUX_VERSION_CODE + +/* We assume for __LINUX_KERNEL_VERSION the same encoding used in +   linux/version.h.  I.e., the major, minor, and subminor all get a +   byte with the major number being in the highest byte.  This means +   we can do numeric comparisons. + +   In the following we will define certain symbols depending on +   whether the describes kernel feature is available in the kernel +   version given by __LINUX_KERNEL_VERSION.  We are not always exactly +   recording the correct versions in which the features were +   introduced.  If somebody cares these values can afterwards be +   corrected.  Most of the numbers here are set corresponding to +   2.2.0.  */ + +/* `getcwd' system call.  */ +#if __LINUX_KERNEL_VERSION >= 131584 +# define __ASSUME_GETCWD_SYSCALL	1 +#endif  /* Real-time signal became usable in 2.1.70.  */  #if __LINUX_KERNEL_VERSION >= 131398  # define __ASSUME_REALTIME_SIGNALS	1  #endif -/* Beginning with 2.5.63 support for realtime and monotonic clocks and -   timers based on them is available.  */ -#if __LINUX_KERNEL_VERSION >= 132415 -# define __ASSUME_POSIX_TIMERS		1 +/* When were the `pread'/`pwrite' syscalls introduced?  */ +#if __LINUX_KERNEL_VERSION >= 131584 +# define __ASSUME_PREAD_SYSCALL		1 +# define __ASSUME_PWRITE_SYSCALL	1  #endif -/* On x86, the set_thread_area syscall was introduced in 2.5.29, but its -   semantics was changed in 2.5.30, and again after 2.5.31.  */ -#if __LINUX_KERNEL_VERSION >= 132384 && defined __i386__ -# define __ASSUME_SET_THREAD_AREA_SYSCALL	1 +/* When was `poll' introduced?  */ +#if __LINUX_KERNEL_VERSION >= 131584 +# define __ASSUME_POLL_SYSCALL		1 +#endif + +/* The `lchown' syscall was introduced in 2.1.80.  */ +#if __LINUX_KERNEL_VERSION >= 131408 +# define __ASSUME_LCHOWN_SYSCALL	1 +#endif + +/* When did the `setresuid' sysall became available?  */ +#if __LINUX_KERNEL_VERSION >= 131584 && !defined __sparc__ +# define __ASSUME_SETRESUID_SYSCALL	1 +#endif + +/* The SIOCGIFNAME ioctl is available starting with 2.1.50.  */ +#if __LINUX_KERNEL_VERSION >= 131408 +# define __ASSUME_SIOCGIFNAME		1 +#endif + +/* MSG_NOSIGNAL was at least available with Linux 2.2.0.  */ +#if __LINUX_KERNEL_VERSION >= 131584 +# define __ASSUME_MSG_NOSIGNAL		1 +#endif + +/* On x86 another `getrlimit' syscall was added in 2.3.25.  */ +#if __LINUX_KERNEL_VERSION >= 131865 && defined __i386__ +# define __ASSUME_NEW_GETRLIMIT_SYSCALL	1 +#endif + +/* On x86 the truncate64/ftruncate64 syscalls were introduced in 2.3.31.  */ +#if __LINUX_KERNEL_VERSION >= 131871 && defined __i386__ +# define __ASSUME_TRUNCATE64_SYSCALL	1 +#endif + +/* On x86 the mmap2 syscall was introduced in 2.3.31.  */ +#if __LINUX_KERNEL_VERSION >= 131871 && defined __i386__ +# define __ASSUME_MMAP2_SYSCALL	1 +#endif + +/* On x86 the stat64/lstat64/fstat64 syscalls were introduced in 2.3.34.  */ +#if __LINUX_KERNEL_VERSION >= 131874 && defined __i386__ +# define __ASSUME_STAT64_SYSCALL	1 +#endif + +/* On sparc and ARM the truncate64/ftruncate64/mmap2/stat64/lstat64/fstat64 +   syscalls were introduced in 2.3.35.  */ +#if __LINUX_KERNEL_VERSION >= 131875 && (defined __sparc__ || defined __arm__) +# define __ASSUME_TRUNCATE64_SYSCALL	1 +# define __ASSUME_MMAP2_SYSCALL		1 +# define __ASSUME_STAT64_SYSCALL	1 +#endif + +/* I know for sure that getrlimit are in 2.3.35 on powerpc.  */ +#if __LINUX_KERNEL_VERSION >= 131875 && defined __powerpc__ +# define __ASSUME_NEW_GETRLIMIT_SYSCALL	1 +#endif + +/* I know for sure that these are in 2.3.35 on powerpc. But PowerPC64 does not +   support separate 64-bit syscalls, already 64-bit */ +#if __LINUX_KERNEL_VERSION >= 131875 && defined __powerpc__ \ +    && !defined __powerpc64__ +# define __ASSUME_TRUNCATE64_SYSCALL	1 +# define __ASSUME_STAT64_SYSCALL	1 +#endif + +/* Linux 2.3.39 introduced 32bit UID/GIDs.  Some platforms had 32 +   bit type all along.  */ +#if __LINUX_KERNEL_VERSION >= 131879 || defined __powerpc__ || defined __mips__ +# define __ASSUME_32BITUIDS		1 +#endif + +/* Linux 2.3.39 sparc added setresuid.  */ +#if __LINUX_KERNEL_VERSION >= 131879 && defined __sparc__ +# define __ASSUME_SETRESUID_SYSCALL	1 +#endif + +#if __LINUX_KERNEL_VERSION >= 131879 +# define __ASSUME_SETRESGID_SYSCALL	1 +#endif + +/* Linux 2.3.39 introduced IPC64.  Except for powerpc.  */ +#if __LINUX_KERNEL_VERSION >= 131879 && !defined __powerpc__ +# define __ASSUME_IPC64		1 +#endif + +/* MIPS platforms had IPC64 all along.  */ +#if defined __mips__ +# define __ASSUME_IPC64		1  #endif  /* We can use the LDTs for threading with Linux 2.3.99 and newer.  */ @@ -50,6 +153,74 @@  # define __ASSUME_LDT_WORKS		1  #endif +/* Linux 2.4.0 on PPC introduced a correct IPC64. But PowerPC64 does not +   support a separate 64-bit sys call, already 64-bit */ +#if __LINUX_KERNEL_VERSION >= 132096 && defined __powerpc__ \ +    && !defined __powerpc64__ +# define __ASSUME_IPC64			1 +#endif + +/* SH kernels got stat64, mmap2, and truncate64 during 2.4.0-test.  */ +#if __LINUX_KERNEL_VERSION >= 132096 && defined __sh__ +# define __ASSUME_TRUNCATE64_SYSCALL	1 +# define __ASSUME_MMAP2_SYSCALL		1 +# define __ASSUME_STAT64_SYSCALL	1 +#endif + +/* The changed st_ino field appeared in 2.4.0-test6.  But we cannot +   distinguish this version from other 2.4.0 releases.  Therefore play +   save and assume it available is for 2.4.1 and up.  However, SH is lame, +   and still does not have a 64-bit inode field.  */ +#if __LINUX_KERNEL_VERSION >= 132097 && !defined __alpha__ && !defined __sh__ +# define __ASSUME_ST_INO_64_BIT		1 +#endif + +/* To support locking of large files a new fcntl() syscall was introduced +   in 2.4.0-test7.  We test for 2.4.1 for the earliest version we know +   the syscall is available.  */ +#if __LINUX_KERNEL_VERSION >= 132097 && (defined __i386__ || defined __sparc__) +# define __ASSUME_FCNTL64		1 +#endif + +/* The AT_CLKTCK auxiliary vector entry was introduction in the 2.4.0 +   series.  */ +#if __LINUX_KERNEL_VERSION >= 132097 +# define __ASSUME_AT_CLKTCK		1 +#endif + +/* Arm got fcntl64 in 2.4.4, PowerPC and SH have it also in 2.4.4 (I +   don't know when it got introduced).  But PowerPC64 does not support +   separate FCNTL64 call, FCNTL is already 64-bit */ +#if __LINUX_KERNEL_VERSION >= 132100 \ +    && (defined __arm__ || defined __powerpc__ || defined __sh__) \ +    && !defined __powerpc64__ +# define __ASSUME_FCNTL64		1 +#endif + +/* The getdents64 syscall was introduced in 2.4.0-test7.  We test for +   2.4.1 for the earliest version we know the syscall is available.  */ +#if __LINUX_KERNEL_VERSION >= 132097 +# define __ASSUME_GETDENTS64_SYSCALL	1 +#endif + +/* When did O_DIRECTORY became available?  Early in 2.3 but when? +   Be safe, use 2.3.99.  */ +#if __LINUX_KERNEL_VERSION >= 131939 +# define __ASSUME_O_DIRECTORY		1 +#endif + +/* Starting with one of the 2.4.0 pre-releases the Linux kernel passes +   up the page size information.  */ +#if __LINUX_KERNEL_VERSION >= 132097 +# define __ASSUME_AT_PAGESIZE		1 +#endif + +/* Starting with at least 2.4.0 the kernel passes the uid/gid unconditionally +   up to the child.  */ +#if __LINUX_KERNEL_VERSION >= 132097 +# define __ASSUME_AT_XID		1 +#endif +  /* Starting with 2.4.5 kernels PPC passes the AUXV in the standard way     and the vfork syscall made it into the official kernel.  */  #if __LINUX_KERNEL_VERSION >= (132096+5) && defined __powerpc__ @@ -57,17 +228,72 @@  # define __ASSUME_VFORK_SYSCALL		1  #endif +/* Starting with 2.4.5 kernels the mmap2 syscall made it into the official +   kernel.  But PowerPC64 does not support a separate MMAP2 call.  */ +#if __LINUX_KERNEL_VERSION >= (132096+5) && defined __powerpc__ \ +    && !defined __powerpc64__ +# define __ASSUME_MMAP2_SYSCALL		1 +#endif + +/* Starting with 2.4.21 PowerPC implements the new prctl syscall. +   This allows applications to get/set the Floating Point Exception Mode.  */ +#if __LINUX_KERNEL_VERSION >= (132096+21) && defined __powerpc__ +# define __ASSUME_NEW_PRCTL_SYSCALL		1 +#endif + +/* Starting with 2.4.21 the PowerPC32 clone syscall works as expected.  */ +#if __LINUX_KERNEL_VERSION >= (132096+21) && defined __powerpc__ \ +    && !defined __powerpc64__ +# define __ASSUME_FIXED_CLONE_SYSCALL		1 +#endif + +/* Starting with 2.4.21 PowerPC64 implements the new rt_sigreturn syscall. +   The new rt_sigreturn takes an ucontext pointer allowing rt_sigreturn +   to be used in the set/swapcontext implementation.  */ +#if __LINUX_KERNEL_VERSION >= (132096+21) && defined __powerpc64__ +# define __ASSUME_NEW_RT_SIGRETURN_SYSCALL		1 +#endif + +/* On x86, the set_thread_area syscall was introduced in 2.5.29, but its +   semantics was changed in 2.5.30, and again after 2.5.31.  */ +#if __LINUX_KERNEL_VERSION >= 132384 && defined __i386__ +# define __ASSUME_SET_THREAD_AREA_SYSCALL	1 +#endif +  /* The vfork syscall on x86 and arm was definitely available in 2.4.  */  #if __LINUX_KERNEL_VERSION >= 132097 && (defined __i386__ || defined __arm__)  # define __ASSUME_VFORK_SYSCALL		1  #endif -/* Starting with version 2.6.4-rc1 the getdents syscall returns d_type - *    information as well and in between 2.6.5 and 2.6.8 most compat wrappers - *       were fixed too.  Except s390{,x} which was fixed in 2.6.11.  */ -#if (__LINUX_KERNEL_VERSION >= 0x020608 && !defined __s390__) \ -    || (__LINUX_KERNEL_VERSION >= 0x02060b && defined __s390__) -# define __ASSUME_GETDENTS32_D_TYPE 1 +/* There are an infinite number of PA-RISC kernel versions numbered +   2.4.0.  But they've not really been released as such.  We require +   and expect the final version here.  */ +#ifdef __hppa__ +# define __ASSUME_32BITUIDS		1 +# define __ASSUME_TRUNCATE64_SYSCALL	1 +# define __ASSUME_MMAP2_SYSCALL		1 +# define __ASSUME_STAT64_SYSCALL	1 +# define __ASSUME_IPC64			1 +# define __ASSUME_ST_INO_64_BIT		1 +# define __ASSUME_FCNTL64		1 +# define __ASSUME_GETDENTS64_SYSCALL	1 +#endif + +/* Alpha switched to a 64-bit timeval sometime before 2.2.0.  */ +#if __LINUX_KERNEL_VERSION >= 131584 && defined __alpha__ +# define __ASSUME_TIMEVAL64		1 +#endif + +#if defined __mips__ && _MIPS_SIM == _ABIN32 +# define __ASSUME_FCNTL64		1 +#endif + +/* The late 2.5 kernels saw a lot of new CLONE_* flags.  Summarize +   their availability with one define.  The changes were made first +   for i386 and the have to be done separately for the other archs. +   For i386 we pick 2.5.50 as the first version with support.  */ +#if __LINUX_KERNEL_VERSION >= 132402 && defined __i386__ +# define __ASSUME_CLONE_THREAD_FLAGS	1  #endif  /* Support for various CLOEXEC and NONBLOCK flags was added for x86, @@ -87,6 +313,137 @@  # define __ASSUME_VFORK_SYSCALL		1  #endif +/* Beginning with 2.5.63 support for realtime and monotonic clocks and +   timers based on them is available.  */ +#if __LINUX_KERNEL_VERSION >= 132415 +# define __ASSUME_POSIX_TIMERS		1 +#endif + +/* The late 2.5 kernels saw a lot of new CLONE_* flags.  Summarize +   their availability with one define.  The changes were made first +   for i386 and the have to be done separately for the other archs. +   For ia64, s390*, PPC, x86-64 we pick 2.5.64 as the first version +   with support.  */ +#if __LINUX_KERNEL_VERSION >= 132416 \ +    && (defined __ia64__ || defined __s390__ || defined __powerpc__ \ +	|| defined __x86_64__ || defined __sh__) +# define __ASSUME_CLONE_THREAD_FLAGS	1 +#endif + +/* With kernel 2.4.17 we always have netlink support.  */ +#if __LINUX_KERNEL_VERSION >= (132096+17) +# define __ASSUME_NETLINK_SUPPORT	1 +#endif + +/* The requeue futex functionality was introduced in 2.5.70.  */ +#if __LINUX_KERNEL_VERSION >= 132422 +# define __ASSUME_FUTEX_REQUEUE	1 +#endif + +/* The statfs64 syscalls are available in 2.5.74.  */ +#if __LINUX_KERNEL_VERSION >= 132426 +# define __ASSUME_STATFS64	1 +#endif + +/* Starting with at least 2.5.74 the kernel passes the setuid-like exec +   flag unconditionally up to the child.  */ +#if __LINUX_KERNEL_VERSION >= 132426 +# define __ASSUME_AT_SECURE	1 +#endif + +/* Starting with the 2.5.75 kernel the kernel fills in the correct value +   in the si_pid field passed as part of the siginfo_t struct to signal +   handlers.  */ +#if __LINUX_KERNEL_VERSION >= 132427 +# define __ASSUME_CORRECT_SI_PID	1 +#endif + +/* The tgkill syscall was instroduced for i386 in 2.5.75.  For Alpha +   it was introduced in 2.6.0-test1 which unfortunately cannot be +   distinguished from 2.6.0.  On x86-64, ppc, and ppc64 it was +   introduced in 2.6.0-test3. */ +#if (__LINUX_KERNEL_VERSION >= 132427 && defined __i386__) \ +    || (__LINUX_KERNEL_VERSION >= 132609 && defined __alpha__) \ +    || (__LINUX_KERNEL_VERSION >= 132609 && defined __x86_64__) \ +    || (__LINUX_KERNEL_VERSION >= 132609 && defined __powerpc__) \ +    || (__LINUX_KERNEL_VERSION >= 132609 && defined __sh__) +# define __ASSUME_TGKILL	1 +#endif + +/* The utimes syscall has been available for some architectures +   forever.  For x86 it was introduced after 2.5.75, for x86-64, +   ppc, and ppc64 it was introduced in 2.6.0-test3.  */ +#if defined __alpha__ || defined __ia64__ || defined __hppa__ \ +    || defined __sparc__ \ +    || (__LINUX_KERNEL_VERSION > 132427 && defined __i386__) \ +    || (__LINUX_KERNEL_VERSION > 132609 && defined __x86_64__) \ +    || (__LINUX_KERNEL_VERSION >= 132609 && defined __powerpc__) \ +    || (__LINUX_KERNEL_VERSION >= 132609 && defined __sh__) +# define __ASSUME_UTIMES	1 +#endif + +// XXX Disabled for now since the semantics we want is not achieved. +#if 0 +/* The CLONE_STOPPED flag was introduced in the 2.6.0-test1 series.  */ +#if __LINUX_KERNEL_VERSION >= 132609 +# define __ASSUME_CLONE_STOPPED	1 +#endif +#endif + +/* The fixed version of the posix_fadvise64 syscall appeared in +   2.6.0-test3.  At least for x86.  Powerpc support appeared in +   2.6.2, but for 32-bit userspace only.  */ +#if (__LINUX_KERNEL_VERSION >= 132609 && defined __i386__) \ +    || (__LINUX_KERNEL_VERSION >= 132610 && defined __powerpc__ \ +       && !defined __powerpc64__) +# define __ASSUME_FADVISE64_64_SYSCALL	1 +#endif + +/* The PROT_GROWSDOWN/PROT_GROWSUP flags were introduced in the 2.6.0-test +   series.  */ +#if __LINUX_KERNEL_VERSION >= 132609 +# define __ASSUME_PROT_GROWSUPDOWN	1 +#endif + +/* Starting with 2.6.0 PowerPC adds signal/swapcontext support for Vector +   SIMD (AKA Altivec, VMX) instructions and register state.  This changes +   the overall size of the sigcontext and adds the swapcontext syscall.  */ +#if __LINUX_KERNEL_VERSION >= 132608 && defined __powerpc__ +# define __ASSUME_SWAPCONTEXT_SYSCALL	1 +#endif + +/* The CLONE_DETACHED flag is not necessary in 2.6.2 kernels, it is +   implied.  */ +#if __LINUX_KERNEL_VERSION >= 132610 +# define __ASSUME_NO_CLONE_DETACHED	1 +#endif + +/* Starting with version 2.6.4-rc1 the getdents syscall returns d_type +   information as well and in between 2.6.5 and 2.6.8 most compat wrappers +   were fixed too.  Except s390{,x} which was fixed in 2.6.11.  */ +#if (__LINUX_KERNEL_VERSION >= 0x020608 && !defined __s390__) \ +    || (__LINUX_KERNEL_VERSION >= 0x02060b && defined __s390__) +# define __ASSUME_GETDENTS32_D_TYPE	1 +#endif + +/* Starting with version 2.5.3, the initial location returned by `brk' +   after exec is always rounded up to the next page.  */ +#if __LINUX_KERNEL_VERSION >= 132355 +# define __ASSUME_BRK_PAGE_ROUNDED	1 +#endif + +/* Starting with version 2.6.9, the waitid system call is available. +   Except for powerpc and powerpc64, where it is available in 2.6.12.  */ +#if (__LINUX_KERNEL_VERSION >= 0x020609 && !defined __powerpc__) \ +    || (__LINUX_KERNEL_VERSION >= 0x02060c && defined __powerpc__) +# define __ASSUME_WAITID_SYSCALL	1 +#endif + +/* Starting with version 2.6.9, SSI_IEEE_RAISE_EXCEPTION exists.  */ +#if __LINUX_KERNEL_VERSION >= 0x020609 && defined __alpha__ +#define __ASSUME_IEEE_RAISE_EXCEPTION	1 +#endif +  /* This header was added somewhere around 2.6.13  */  #if __LINUX_KERNEL_VERSION >= 132621  # define HAVE_LINUX_CPUMASK_H	1  | 
