diff options
Diffstat (limited to 'libpthread/nptl/sysdeps/unix/sysv')
32 files changed, 525 insertions, 463 deletions
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/Makefile.in b/libpthread/nptl/sysdeps/unix/sysv/linux/Makefile.in index 56c177066..743bc20ea 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/Makefile.in +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/Makefile.in @@ -58,6 +58,11 @@ SH_PTHREAD_SPECIFIC := sem_post.c sem_wait.c sem_timedwait.c sem_trywait.c  libpthread_CSRC := $(filter-out $(SH_PTHREAD_SPECIFIC),$(libpthread_CSRC))  endif +ifeq ($(TARGET_ARCH),i386) +X86_PTHREAD_SPECIFIC := sem_post.c sem_wait.c sem_timedwait.c sem_trywait.c +libpthread_CSRC := $(filter-out $(X86_PTHREAD_SPECIFIC),$(libpthread_CSRC)) +endif +  ifeq ($(TARGET_ARCH),x86_64)  librt_CSRC := mq_notify.c  diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-vfork.S index f739eb105..b9d1ef768 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-vfork.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-vfork.S @@ -35,5 +35,5 @@  	cmp	r0, #0;			/* If we are the parent... */	\  	strne	r3, [r2, #PID_OFFSET]	/* ... restore the saved PID.  */ -#include <../../../../../../../libc/sysdeps/linux/arm/vfork.S> +#INCLUDE <../../../../../../../LIBC/SYSDEPS/LINUX/ARM/VFORK.S> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile new file mode 100644 index 000000000..43a6fad84 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile @@ -0,0 +1,13 @@ +# Makefile for uClibc NPTL +# +# Copyright (C) 2005 Steven J. Hill <sjhill@uclibc.org> +# +# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. +# + +top_srcdir=../../../../../../../ +top_builddir=../../../../../../../ +all: objs +include $(top_builddir)Rules.mak +include Makefile.arch +include $(top_srcdir)Makerules diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch new file mode 100644 index 000000000..ae7943080 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch @@ -0,0 +1,73 @@ +# Makefile for uClibc NPTL +# +# Copyright (C) 2006 Steven J. Hill <sjhill@uclibc.org> +# +# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. +# +LINUX_ARCH_DIR:=$(top_srcdir)libpthread/nptl/sysdeps/unix/sysv/linux/i386 +LINUX_ARCH_OUT:=$(top_builddir)libpthread/nptl/sysdeps/unix/sysv/linux/i386 + + +libpthread_SSRC = pt-vfork.S clone.S pthread_spin_unlock.S pthread_once.S  +libpthread_CSRC = pthread_spin_init.c pt-__syscall_error.c + +libc_a_CSRC = fork.c +libc_a_SSRC = clone.S vfork.S + +libpthread_SSRC += i486/lowlevellock.S i486/pthread_barrier_wait.S i486/pthread_cond_signal.S i486/pthread_cond_broadcast.S \ +				   i486/pthread_cond_timedwait.S i486/pthread_cond_wait.S i486/sem_post.S i486/sem_timedwait.S \ +				   i486/sem_trywait.S i486/sem_wait.S i486/pthread_rwlock_rdlock.S i486/pthread_rwlock_wrlock.S \ +				   i486/pthread_rwlock_timedrdlock.S i486/pthread_rwlock_timedwrlock.S i486/pthread_rwlock_unlock.S + +libc_a_SSRC += i486/libc-lowlevellock.S + + +CFLAGS-OMIT-fork.c = -DNOT_IN_libc=1 -DIS_IN_libpthread=1 + +ifeq ($(UCLIBC_HAS_STDIO_FUTEXES),y) +CFLAGS-fork.c = -D__USE_STDIO_FUTEXES__ +endif + +ASFLAGS-pt-vfork.S = -DNOT_IN_libc=1 -DIS_IN_libpthread=1 -D_LIBC_REENTRANT -DUSE___THREAD +ASFLAGS-lowlevellock.S = -DNOT_IN_libc=1 -DIS_IN_libpthread=1 -D_LIBC_REENTRANT -DUSE___THREAD +ASFLAGS-pthread_once.S = -DNOT_IN_libc=1 -DIS_IN_libpthread=1 -D_LIBC_REENTRANT -DUSE___THREAD +ASFLAGS-pthread_spin_unlock.S = -DNOT_IN_libc=1 -DIS_IN_libpthread=1 -D_LIBC_REENTRANT -DUSE___THREAD + + +ASFLAGS-clone.S = -D_LIBC_REENTRANT +ASFLAGS-vfork.S = -D_LIBC_REENTRANT +ASFLAGS-libc-lowlevellock.S = -D_LIBC_REENTRANT + +ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y) +#Needed to use the correct SYSCALL_ERROR_HANDLER +ASFLAGS-clone.S += -DUSE___THREAD +ASFLAGS-vfork.S += -DUSE___THREAD +endif + +CFLAGS += $(SSP_ALL_CFLAGS) +#CFLAGS:=$(CFLAGS:-O1=-O2) + +LINUX_ARCH_OBJ:=$(patsubst %.S,$(LINUX_ARCH_OUT)/%.o,$(libpthread_SSRC)) +LINUX_ARCH_OBJ+=$(patsubst %.c,$(LINUX_ARCH_OUT)/%.o,$(libpthread_CSRC)) + +ifeq ($(DOPIC),y) +libpthread-a-y += $(LINUX_ARCH_OBJ:.o=.os) +else +libpthread-a-y += $(LINUX_ARCH_OBJ) +endif +libpthread-so-y += $(LINUX_ARCH_OBJ:.o=.oS) + +libpthread-nomulti-y+=$(LINUX_ARCH_OBJS) + +LIBC_LINUX_ARCH_OBJ:=$(patsubst %.c,$(LINUX_ARCH_OUT)/%.o,$(libc_a_CSRC)) +LIBC_LINUX_ARCH_OBJ+=$(patsubst %.S,$(LINUX_ARCH_OUT)/%.o,$(libc_a_SSRC)) + +libc-static-y+=$(LIBC_LINUX_ARCH_OBJ) +libc-shared-y+=$(LIBC_LINUX_ARCH_OBJ:.o=.oS) + +libc-nomulti-y+=$(LIBC_LINUX_ARCH_OBJ) + +objclean-y+=nptl_linux_arch_clean + +nptl_linux_arch_clean: +	$(do_rm) $(addprefix $(LINUX_ARCH_OUT)/*., o os oS) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/clone.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/clone.S index 95c17f18e..9c7c46467 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/clone.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/clone.S @@ -1,2 +1,2 @@  #define RESET_PID -#include <sysdeps/unix/sysv/linux/i386/clone.S> +#include <libc/sysdeps/linux/i386/clone.S> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/createthread.c b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/createthread.c index 37e3d9499..35719be96 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/createthread.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/createthread.c @@ -46,4 +46,4 @@  /* Get the real implementation.  */ -#include <nptl/sysdeps/pthread/createthread.c> +#include <sysdeps/pthread/createthread.c> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S index dc65b709a..955e119ab 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S @@ -30,8 +30,6 @@  # endif  #endif -#define SYS_gettimeofday	__NR_gettimeofday -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S index 114284c44..2af9e38cd 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S @@ -20,7 +20,6 @@  #include <sysdep.h>  #include <lowlevelbarrier.h> -#define SYS_futex	240  #define FUTEX_WAIT	0  #define FUTEX_WAKE	1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S index dc9b2b12a..16b019c4c 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S @@ -18,7 +18,6 @@     02111-1307 USA.  */  #include <sysdep.h> -#include <shlib-compat.h>  #include <lowlevelcond.h>  #include <bits/kernel-features.h> @@ -28,7 +27,6 @@  # define LOCK lock  #endif -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1  #define FUTEX_REQUEUE		3 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S index d16f8b60f..11650c8e1 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S @@ -18,7 +18,6 @@     02111-1307 USA.  */  #include <sysdep.h> -#include <shlib-compat.h>  #include <lowlevelcond.h>  #include <bits/kernel-features.h> @@ -28,7 +27,6 @@  # define LOCK lock  #endif -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1  #define FUTEX_REQUEUE		3 @@ -110,5 +108,3 @@ __pthread_cond_signal:  	call	__lll_mutex_unlock_wake  	jmp	6b  	.size	__pthread_cond_signal, .-__pthread_cond_signal -versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal, -		  GLIBC_2_3_2) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S index 699c2cb22..e1f4c6d97 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S @@ -18,7 +18,6 @@     02111-1307 USA.  */  #include <sysdep.h> -#include <shlib-compat.h>  #include <lowlevelcond.h>  #include <pthread-errnos.h> @@ -28,8 +27,6 @@  # define LOCK lock  #endif -#define SYS_gettimeofday	__NR_gettimeofday -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 @@ -468,170 +465,3 @@ __condvar_tw_cleanup:  .LENDCODE:  	.size	__condvar_tw_cleanup, .-__condvar_tw_cleanup - -	.section .gcc_except_table,"a",@progbits -.LexceptSTART: -	.byte	0xff				# @LPStart format (omit) -	.byte	0xff				# @TType format (omit) -	.byte	0x0b				# call-site format -						# DW_EH_PE_sdata4 -	.uleb128 .Lcstend-.Lcstbegin -.Lcstbegin: -	.long	.LcleanupSTART-.LSTARTCODE -	.long	.Ladd_cond_futex-.LcleanupSTART -	.long	__condvar_tw_cleanup-.LSTARTCODE -	.uleb128  0 -	.long	.Ladd_cond_futex-.LSTARTCODE -	.long	.Lsub_cond_futex-.Ladd_cond_futex -	.long	__condvar_tw_cleanup2-.LSTARTCODE -	.uleb128  0 -	.long	.Lsub_cond_futex-.LSTARTCODE -	.long	.LcleanupEND-.Lsub_cond_futex -	.long	__condvar_tw_cleanup-.LSTARTCODE -	.uleb128  0 -	.long	.LcallUR-.LSTARTCODE -	.long	.LENDCODE-.LcallUR -	.long	0 -	.uleb128  0 -.Lcstend: - - -	.section .eh_frame,"a",@progbits -.LSTARTFRAME: -	.long	L(ENDCIE)-L(STARTCIE)		# Length of the CIE. -.LSTARTCIE: -	.long	0				# CIE ID. -	.byte	1				# Version number. -#ifdef SHARED -	.string	"zPLR"				# NUL-terminated augmentation -						# string. -#else -	.string	"zPL"				# NUL-terminated augmentation -						# string. -#endif -	.uleb128 1				# Code alignment factor. -	.sleb128 -4				# Data alignment factor. -	.byte	8				# Return address register -						# column. -#ifdef SHARED -	.uleb128 7				# Augmentation value length. -	.byte	0x9b				# Personality: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4 -						# + DW_EH_PE_indirect -	.long	DW.ref.__gcc_personality_v0-. -	.byte	0x1b				# LSDA Encoding: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4. -	.byte	0x1b				# FDE Encoding: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4. -#else -	.uleb128 6				# Augmentation value length. -	.byte	0x0				# Personality: absolute -	.long	__gcc_personality_v0 -	.byte	0x0				# LSDA Encoding: absolute -#endif -	.byte 0x0c				# DW_CFA_def_cfa -	.uleb128 4 -	.uleb128 4 -	.byte	0x88				# DW_CFA_offset, column 0x8 -	.uleb128 1 -	.align 4 -.LENDCIE: - -	.long	.LENDFDE-.LSTARTFDE		# Length of the FDE. -.LSTARTFDE: -	.long	.LSTARTFDE-.LSTARTFRAME		# CIE pointer. -#ifdef SHARED -	.long	.LSTARTCODE-.			# PC-relative start address -						# of the code -#else -	.long	.LSTARTCODE			# Start address of the code. -#endif -	.long	.LENDCODE-.LSTARTCODE		# Length of the code. -	.uleb128 4				# Augmentation size -#ifdef SHARED -	.long	.LexceptSTART-. -#else -	.long	.LexceptSTART -#endif -	.byte	0x40+.Lpush_ebp-.LSTARTCODE	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 8 -	.byte	0x85				# DW_CFA_offset %ebp -	.uleb128 2 -	.byte	0x40+ .Lpush_edi-.Lpush_ebp	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 12 -	.byte	0x87				# DW_CFA_offset %edi -	.uleb128 3 -	.byte	0x40+.Lpush_esi-.Lpush_edi	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte	0x86				# DW_CFA_offset %esi -	.uleb128 4 -	.byte	0x40+.Lpush_ebx-.Lpush_esi	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 20 -	.byte	0x83				# DW_CFA_offset %ebx -	.uleb128 5 -	.byte	2				# DW_CFA_advance_loc1 -	.byte	.Lsubl-.Lpush_ebx -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 20+FRAME_SIZE -	.byte	3				# DW_CFA_advance_loc2 -	.2byte	.Laddl-.Lsubl -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 20 -	.byte	0x40+.Lpop_ebx-.Laddl		# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte	0xc3				# DW_CFA_restore %ebx -	.byte	0x40+.Lpop_esi-.Lpop_ebx	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 12 -	.byte	0xc6				# DW_CFA_restore %esi -	.byte	0x40+.Lpop_edi-.Lpop_esi	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 8 -	.byte	0xc7				# DW_CFA_restore %edi -	.byte	0x40+.Lpop_ebp-.Lpop_edi	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 4 -	.byte	0xc5				# DW_CFA_restore %ebp -	.byte	0x40+.LSbl1-.Lpop_edi		# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 20 -	.byte	0x40+.LSbl2-.LSbl1		# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 20+FRAME_SIZE -	.byte	0x85				# DW_CFA_offset %ebp -	.uleb128 2 -	.byte	0x87				# DW_CFA_offset %edi -	.uleb128 3 -	.byte	0x86				# DW_CFA_offset %esi -	.uleb128 4 -	.byte	0x83				# DW_CFA_offset %ebx -	.uleb128 5 -	.byte	0x40+.LSbl3-.LSbl2		# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 20 -#if defined __NR_clock_gettime && !defined __ASSUME_POSIX_TIMERS -	.byte	0x40+.LSbl4-.LSbl3		# DW_CFA_advance_loc+N -#else -	.byte	4				# DW_CFA_advance_loc4 -	.long	.LSbl5-.LSbl3 -#endif -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 20+FRAME_SIZE -	.align	4 -.LENDFDE: - -#ifdef SHARED -	.hidden DW.ref.__gcc_personality_v0 -	.weak   DW.ref.__gcc_personality_v0 -	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits -	.align 4 -	.type   DW.ref.__gcc_personality_v0, @object -	.size   DW.ref.__gcc_personality_v0, 4 -DW.ref.__gcc_personality_v0: -	.long   __gcc_personality_v0 -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S index d28278515..4cb0073dc 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S @@ -18,7 +18,6 @@     02111-1307 USA.  */  #include <sysdep.h> -#include <shlib-compat.h>  #include <lowlevelcond.h>  #include <tcb-offsets.h> @@ -28,7 +27,6 @@  # define LOCK lock  #endif -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 @@ -359,165 +357,3 @@ __condvar_w_cleanup:  .LENDCODE:  	.size	__condvar_w_cleanup, .-__condvar_w_cleanup - -	.section .gcc_except_table,"a",@progbits -.LexceptSTART: -	.byte	0xff				# @LPStart format (omit) -	.byte	0xff				# @TType format (omit) -	.byte	0x0b				# call-site format -						# DW_EH_PE_sdata4 -	.uleb128 .Lcstend-.Lcstbegin -.Lcstbegin: -	.long	.LcleanupSTART-.LSTARTCODE -	.long	.Ladd_cond_futex-.LcleanupSTART -	.long	__condvar_w_cleanup-.LSTARTCODE -	.uleb128  0 -	.long	.Ladd_cond_futex-.LSTARTCODE -	.long	.Lsub_cond_futex-.Ladd_cond_futex -	.long	__condvar_w_cleanup2-.LSTARTCODE -	.uleb128  0 -	.long	.Lsub_cond_futex-.LSTARTCODE -	.long	.LcleanupEND-.Lsub_cond_futex -	.long	__condvar_w_cleanup-.LSTARTCODE -	.uleb128  0 -	.long	.LcallUR-.LSTARTCODE -	.long	.LENDCODE-.LcallUR -	.long	0 -	.uleb128  0 -.Lcstend: - -	.section .eh_frame,"a",@progbits -.LSTARTFRAME: -	.long	L(ENDCIE)-L(STARTCIE)		# Length of the CIE. -.LSTARTCIE: -	.long	0				# CIE ID. -	.byte	1				# Version number. -#ifdef SHARED -	.string	"zPLR"				# NUL-terminated augmentation -						# string. -#else -	.string	"zPL"				# NUL-terminated augmentation -						# string. -#endif -	.uleb128 1				# Code alignment factor. -	.sleb128 -4				# Data alignment factor. -	.byte	8				# Return address register -						# column. -#ifdef SHARED -	.uleb128 7				# Augmentation value length. -	.byte	0x9b				# Personality: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4 -						# + DW_EH_PE_indirect -	.long	DW.ref.__gcc_personality_v0-. -	.byte	0x1b				# LSDA Encoding: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4. -	.byte	0x1b				# FDE Encoding: DW_EH_PE_pcrel -						# + DW_EH_PE_sdata4. -#else -	.uleb128 6				# Augmentation value length. -	.byte	0x0				# Personality: absolute -	.long	__gcc_personality_v0 -	.byte	0x0				# LSDA Encoding: absolute -#endif -	.byte 0x0c				# DW_CFA_def_cfa -	.uleb128 4 -	.uleb128 4 -	.byte	0x88				# DW_CFA_offset, column 0x8 -	.uleb128 1 -	.align 4 -.LENDCIE: - -	.long	.LENDFDE-.LSTARTFDE		# Length of the FDE. -.LSTARTFDE: -	.long	.LSTARTFDE-.LSTARTFRAME		# CIE pointer. -#ifdef SHARED -	.long	.LSTARTCODE-.			# PC-relative start address -						# of the code. -#else -	.long	.LSTARTCODE			# Start address of the code. -#endif -	.long	.LENDCODE-.LSTARTCODE		# Length of the code. -	.uleb128 4				# Augmentation size -#ifdef SHARED -	.long	.LexceptSTART-. -#else -	.long	.LexceptSTART -#endif -	.byte	0x40+.Lpush_edi-.LSTARTCODE	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 8 -	.byte	0x87				# DW_CFA_offset %edi -	.uleb128 2 -	.byte	0x40+.Lpush_esi-.Lpush_edi	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 12 -	.byte	0x86				# DW_CFA_offset %esi -	.uleb128 3 -	.byte	0x40+.Lpush_ebx-.Lpush_esi	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte	0x83				# DW_CFA_offset %ebx -	.uleb128 4 -	.byte	2				# DW_CFA_advance_loc1 -	.byte	.Lsubl-.Lpush_ebx -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16+FRAME_SIZE -	.byte	2				# DW_CFA_advance_loc1 -	.byte	.Laddl-.Lsubl -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte	0x40+ .Lpop_ebx-.Laddl		# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 12 -	.byte	0xc3				# DW_CFA_restore %ebx -	.byte	0x40+.Lpop_esi-.Lpop_ebx	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 8 -	.byte	0xc6				# DW_CFA_restore %esi -	.byte	0x40+.Lpop_edi-.Lpop_esi	# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 4 -	.byte	0xc7				# DW_CFA_restore %edi -	.byte	0x40+.LSbl1-.Lpop_edi		# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte	0x87				# DW_CFA_offset %edi -	.uleb128 2 -	.byte	0x86				# DW_CFA_offset %esi -	.uleb128 3 -	.byte	0x83				# DW_CFA_offset %ebx -	.uleb128 4 -	.byte	0x40+.LSbl2-.LSbl1		# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16+FRAME_SIZE -	.byte	0x40+.LSbl3-.LSbl2		# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte	0x40+.LSbl4-.LSbl3		# DW_CFA_advance_loc+N -	.byte	14				# DW_CFA_def_cfa_offset -	.uleb128 16+FRAME_SIZE -	.align	4 -.LENDFDE: - - -#ifdef PIC -	.section .gnu.linkonce.t.__i686.get_pc_thunk.cx,"ax",@progbits -	.globl	__i686.get_pc_thunk.cx -	.hidden	__i686.get_pc_thunk.cx -	.type	__i686.get_pc_thunk.cx,@function -__i686.get_pc_thunk.cx: -	movl (%esp), %ecx; -	ret -	.size	__i686.get_pc_thunk.cx,.-__i686.get_pc_thunk.cx -#endif - -#ifdef SHARED -	.hidden DW.ref.__gcc_personality_v0 -	.weak   DW.ref.__gcc_personality_v0 -	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits -	.align 4 -	.type   DW.ref.__gcc_personality_v0, @object -	.size   DW.ref.__gcc_personality_v0, 4 -DW.ref.__gcc_personality_v0: -	.long   __gcc_personality_v0 -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S index db0639d21..aec79f07e 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S @@ -20,9 +20,9 @@  #include <sysdep.h>  #include <lowlevelrwlock.h>  #include <pthread-errnos.h> +#include <tcb-offsets.h> -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S index eb5665b43..3717d7ef5 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S @@ -20,10 +20,9 @@  #include <sysdep.h>  #include <lowlevelrwlock.h>  #include <pthread-errnos.h> +#include <tcb-offsets.h> -#define SYS_gettimeofday	__NR_gettimeofday -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S index d9db77ba0..09c9e30ca 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S @@ -20,10 +20,9 @@  #include <sysdep.h>  #include <lowlevelrwlock.h>  #include <pthread-errnos.h> +#include <tcb-offsets.h> -#define SYS_gettimeofday	__NR_gettimeofday -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S index 64aac3255..597c82fa8 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S @@ -21,7 +21,6 @@  #include <lowlevelrwlock.h> -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S index ea9cc170d..bb384a267 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S @@ -20,9 +20,8 @@  #include <sysdep.h>  #include <lowlevelrwlock.h>  #include <pthread-errnos.h> +#include <tcb-offsets.h> - -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S index 22f23e9af..85bccd74d 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S @@ -18,7 +18,6 @@     02111-1307 USA.  */  #include <sysdep.h> -#include <shlib-compat.h>  #include <pthread-errnos.h>  #ifndef UP @@ -27,7 +26,6 @@  # define  #endif -#define SYS_futex		240  #define FUTEX_WAKE		1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S index 318b53a87..f306e400d 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S @@ -18,8 +18,8 @@     02111-1307 USA.  */  #include <sysdep.h> -#include <shlib-compat.h>  #include <pthread-errnos.h> +#include <tcb-offsets.h>  #ifndef UP  # define LOCK lock @@ -27,8 +27,6 @@  # define  #endif -#define SYS_gettimeofday	__NR_gettimeofday -#define SYS_futex		240  #define FUTEX_WAKE		1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S index bd5ffad07..b5e3df6b3 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S @@ -18,7 +18,6 @@     02111-1307 USA.  */  #include <sysdep.h> -#include <shlib-compat.h>  #include <pthread-errnos.h>  #ifndef UP diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S index ec274ba4e..56c4caef7 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S @@ -18,8 +18,8 @@     02111-1307 USA.  */  #include <sysdep.h> -#include <shlib-compat.h>  #include <pthread-errnos.h> +#include <tcb-offsets.h>  #ifndef UP  # define LOCK lock @@ -27,7 +27,6 @@  # define  #endif -#define SYS_futex		240  #define FUTEX_WAKE		1 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h index b86f11c9b..785f2acf2 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h @@ -23,16 +23,25 @@  #include <time.h>  #include <sys/param.h>  #include <bits/pthreadtypes.h> +#include <atomic.h> +#include <sysdep.h> + +/* We have a separate internal lock implementation which is not tied +   to binary compatibility.  */ + +/* Type for lock object.  */ +typedef int lll_lock_t; + +/* Initializers for lock.  */ +#define LLL_LOCK_INITIALIZER		(0) +#define LLL_LOCK_INITIALIZER_LOCKED	(1) + +#include <tls.h>  #ifndef LOCK_INSTR -# ifdef UP -#  define LOCK_INSTR	/* nothing */ -# else -#  define LOCK_INSTR "lock;" -# endif +# define LOCK_INSTR "lock;"  #endif -#define SYS_futex		240  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 @@ -51,47 +60,39 @@  # define LLL_EBX_REG	"b"  #endif -#ifdef I386_USE_SYSENTER -# ifdef SHARED -#  define LLL_ENTER_KERNEL	"call *%%gs:%P6\n\t" -# else -#  define LLL_ENTER_KERNEL	"call *_dl_sysinfo\n\t" -# endif -#else -# define LLL_ENTER_KERNEL	"int $0x80\n\t" -#endif +#define LLL_ENTER_KERNEL	"int $0x80\n\t"  /* Delay in spinlock loop.  */ -#define BUSY_WAIT_NOP          asm ("rep; nop") +#define BUSY_WAIT_NOP          __asm__ ("rep; nop")  #define lll_futex_wait(futex, val) \ -  do {									      \ -    int __ignore;							      \ -    register __typeof (val) _val asm ("edx") = (val);			      \ -    __asm __volatile (LLL_EBX_LOAD					      \ +  ({									      \ +    int __ret;							      \ +    register __typeof (val) _val __asm__ ("edx") = (val);		      \ +    __asm__ __volatile (LLL_EBX_LOAD					      \  		      LLL_ENTER_KERNEL					      \  		      LLL_EBX_LOAD					      \ -		      : "=a" (__ignore)					      \ +		      : "=a" (__ret)					      \  		      : "0" (SYS_futex), LLL_EBX_REG (futex), "S" (0),	      \  			"c" (FUTEX_WAIT), "d" (_val),			      \  			"i" (offsetof (tcbhead_t, sysinfo)));		      \ -  } while (0) +   __ret; })  #define lll_futex_wake(futex, nr) \ -  do {									      \ -    int __ignore;							      \ -    register __typeof (nr) _nr asm ("edx") = (nr);			      \ -    __asm __volatile (LLL_EBX_LOAD					      \ +  ({									      \ +    int __ret;							      \ +    register __typeof (nr) _nr __asm__ ("edx") = (nr);			      \ +    __asm__ __volatile (LLL_EBX_LOAD					      \  		      LLL_ENTER_KERNEL					      \  		      LLL_EBX_LOAD					      \ -		      : "=a" (__ignore)					      \ +		      : "=a" (__ret)					      \  		      : "0" (SYS_futex), LLL_EBX_REG (futex),		      \  			"c" (FUTEX_WAKE), "d" (_nr),			      \  			"i" (0) /* phony, to align next arg's number */,      \  			"i" (offsetof (tcbhead_t, sysinfo)));		      \ -  } while (0) +   __ret; })  /* Does not preserve %eax and %ecx.  */ @@ -113,7 +114,7 @@ extern int __lll_mutex_unlock_wake (int *__futex)     to be nonzero.  */  #define lll_mutex_trylock(futex) \    ({ int ret;								      \ -     __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1"			      \ +     __asm__ __volatile (LOCK_INSTR "cmpxchgl %2, %1"			      \  		       : "=a" (ret), "=m" (futex)			      \  		       : "r" (LLL_MUTEX_LOCK_INITIALIZER_LOCKED), "m" (futex),\  			 "0" (LLL_MUTEX_LOCK_INITIALIZER)		      \ @@ -123,7 +124,7 @@ extern int __lll_mutex_unlock_wake (int *__futex)  #define lll_mutex_cond_trylock(futex) \    ({ int ret;								      \ -     __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1"			      \ +     __asm__ __volatile (LOCK_INSTR "cmpxchgl %2, %1"			      \  		       : "=a" (ret), "=m" (futex)			      \  		       : "r" (LLL_MUTEX_LOCK_INITIALIZER_WAITERS),	      \  			  "m" (futex), "0" (LLL_MUTEX_LOCK_INITIALIZER)	      \ @@ -133,7 +134,7 @@ extern int __lll_mutex_unlock_wake (int *__futex)  #define lll_mutex_lock(futex) \    (void) ({ int ignore1, ignore2;					      \ -	    __asm __volatile (LOCK_INSTR "cmpxchgl %1, %2\n\t"		      \ +	    __asm__ __volatile (LOCK_INSTR "cmpxchgl %1, %2\n\t"	      \  			      "jnz _L_mutex_lock_%=\n\t"		      \  			      ".subsection 1\n\t"			      \  			      ".type _L_mutex_lock_%=,@function\n"	      \ @@ -153,7 +154,7 @@ extern int __lll_mutex_unlock_wake (int *__futex)     always wakeup waiters.  */  #define lll_mutex_cond_lock(futex) \    (void) ({ int ignore1, ignore2;					      \ -	    __asm __volatile (LOCK_INSTR "cmpxchgl %1, %2\n\t"		      \ +	    __asm__ __volatile (LOCK_INSTR "cmpxchgl %1, %2\n\t"	      \  			      "jnz _L_mutex_cond_lock_%=\n\t"		      \  			      ".subsection 1\n\t"			      \  			      ".type _L_mutex_cond_lock_%=,@function\n"	      \ @@ -171,7 +172,7 @@ extern int __lll_mutex_unlock_wake (int *__futex)  #define lll_mutex_timedlock(futex, timeout) \    ({ int result, ignore1, ignore2;					      \ -     __asm __volatile (LOCK_INSTR "cmpxchgl %1, %3\n\t"			      \ +     __asm__ __volatile (LOCK_INSTR "cmpxchgl %1, %3\n\t"		      \  		       "jnz _L_mutex_timedlock_%=\n\t"			      \  		       ".subsection 1\n\t"				      \  		       ".type _L_mutex_timedlock_%=,@function\n"	      \ @@ -192,7 +193,7 @@ extern int __lll_mutex_unlock_wake (int *__futex)  #define lll_mutex_unlock(futex) \    (void) ({ int ignore;							      \ -            __asm __volatile (LOCK_INSTR "subl $1,%0\n\t"		      \ +            __asm__ __volatile (LOCK_INSTR "subl $1,%0\n\t"		      \  			      "jne _L_mutex_unlock_%=\n\t"		      \  			      ".subsection 1\n\t"			      \  			      ".type _L_mutex_unlock_%=,@function\n"	      \ @@ -212,17 +213,6 @@ extern int __lll_mutex_unlock_wake (int *__futex)    (futex != 0) -/* We have a separate internal lock implementation which is not tied -   to binary compatibility.  */ - -/* Type for lock object.  */ -typedef int lll_lock_t; - -/* Initializers for lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) - -  extern int __lll_lock_wait (int val, int *__futex)       __attribute ((regparm (2))) attribute_hidden;  extern int __lll_unlock_wake (int *__futex) @@ -236,20 +226,19 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;      2  -  taken by more users */ -#if defined NOT_IN_libc || defined UP +#if defined NOT_IN_libc  # define lll_trylock(futex) lll_mutex_trylock (futex)  # define lll_lock(futex) lll_mutex_lock (futex)  # define lll_unlock(futex) lll_mutex_unlock (futex)  #else  /* Special versions of the macros for use in libc itself.  They avoid -   the lock prefix when the thread library is not used. +   the lock prefix when the thread library is not used. */ + -   XXX In future we might even want to avoid it on UP machines.  */ -# include <tls.h>  # define lll_trylock(futex) \    ({ unsigned char ret;							      \ -     __asm __volatile ("cmpl $0, %%gs:%P5\n\t"				      \ +     __asm__ __volatile ("cmpl $0, %%gs:%P5\n\t"			      \  		       "je,pt 0f\n\t"					      \  		       "lock\n"						      \  		       "0:\tcmpxchgl %2, %1; setne %0"			      \ @@ -263,7 +252,7 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;  # define lll_lock(futex) \    (void) ({ int ignore1, ignore2;					      \ -	    __asm __volatile ("cmpl $0, %%gs:%P6\n\t"			      \ +	    __asm__ __volatile ("cmpl $0, %%gs:%P6\n\t"			      \  			      "je,pt 0f\n\t"				      \  			      "lock\n"					      \  			      "0:\tcmpxchgl %1, %2\n\t"			      \ @@ -285,7 +274,7 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;  # define lll_unlock(futex) \    (void) ({ int ignore;							      \ -            __asm __volatile ("cmpl $0, %%gs:%P3\n\t"			      \ +            __asm__ __volatile ("cmpl $0, %%gs:%P3\n\t"			      \  			      "je,pt 0f\n\t"				      \  			      "lock\n"					      \  			      "0:\tsubl $1,%0\n\t"		      \ @@ -317,21 +306,21 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;     The macro parameter must not have any side effect.  */  #define lll_wait_tid(tid) \ -  do {									      \ -    int __ignore;							      \ -    register __typeof (tid) _tid asm ("edx") = (tid);			      \ +  ({									      \ +    int __ret;								      \ +    register __typeof (tid) _tid __asm__ ("edx") = (tid);		      \      if (_tid != 0)							      \ -      __asm __volatile (LLL_EBX_LOAD					      \ +      __asm__ __volatile (LLL_EBX_LOAD					      \  			"1:\tmovl %1, %%eax\n\t"			      \  			LLL_ENTER_KERNEL				      \  			"cmpl $0, (%%ebx)\n\t"				      \  			"jne,pn 1b\n\t"					      \  			LLL_EBX_LOAD					      \ -			: "=&a" (__ignore)				      \ +			: "=&a" (__ret)				              \  			: "i" (SYS_futex), LLL_EBX_REG (&tid), "S" (0),	      \  			  "c" (FUTEX_WAIT), "d" (_tid),			      \  			  "i" (offsetof (tcbhead_t, sysinfo)));		      \ -  } while (0) +   __ret; })  extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime)       __attribute__ ((regparm (2))) attribute_hidden; diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h index cc3282fbd..5bdba3f51 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/not-cancel.h @@ -26,13 +26,20 @@ extern int __close_nocancel (int) attribute_hidden;  extern int __read_nocancel (int, void *, size_t) attribute_hidden;  extern int __write_nocancel (int, const void *, size_t) attribute_hidden;  extern pid_t __waitpid_nocancel (pid_t, int *, int) attribute_hidden; + +libc_hidden_proto(__open_nocancel) +libc_hidden_proto(__close_nocancel) +libc_hidden_proto(__read_nocancel) +libc_hidden_proto(__write_nocancel) +libc_hidden_proto(__waitpid_nocancel) +  #else -#define __open_nocancel(name, ...) __open (name, __VA_ARGS__) -#define __close_nocancel(fd) __close (fd) -#define __read_nocancel(fd, buf, len) __read (fd, buf, len) -#define __write_nocancel(fd, buf, len) __write (fd, buf, len) +#define __open_nocancel(name, ...) open (name, __VA_ARGS__) +#define __close_nocancel(fd) close (fd) +#define __read_nocancel(fd, buf, len) read (fd, buf, len) +#define __write_nocancel(fd, buf, len) write (fd, buf, len)  #define __waitpid_nocancel(pid, stat_loc, options) \ -  __waitpid (pid, stat_loc, options) +  waitpid (pid, stat_loc, options)  #endif  /* Uncancelable open.  */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-__syscall_error.c b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-__syscall_error.c new file mode 100644 index 000000000..620640ad6 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-__syscall_error.c @@ -0,0 +1 @@ +#include <../../../../../../../libc/sysdeps/linux/i386/__syscall_error.c> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-vfork.S index 7ab222e1b..939538927 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-vfork.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-vfork.S @@ -17,10 +17,6 @@     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA     02111-1307 USA.  */ -#include <sysdep.h> -#define _ERRNO_H	1 -#include <bits/errno.h> -#include <bits/kernel-features.h>  #include <tcb-offsets.h>  /* Save the PID value.  */ @@ -37,32 +33,4 @@  	movl	%edx, %gs:PID;						      \  1: -/* Clone the calling process, but without copying the whole address space. -   The calling process is suspended until the new process exits or is -   replaced by a call to `execve'.  Return -1 for errors, 0 to the new process, -   and the process ID of the new process to the old process.  */ - -ENTRY (__vfork) -	/* Pop the return PC value into ECX.  */ -	popl	%ecx - -	SAVE_PID - -	/* Stuff the syscall number in EAX and enter into the kernel.  */ -	movl	$SYS_ify (vfork), %eax -	int	$0x80 - -	RESTORE_PID - -	/* Jump to the return PC.  Don't jump directly since this -	   disturbs the branch target cache.  Instead push the return -	   address back on the stack.  */ -	pushl	%ecx - -	cmpl	$-4095, %eax -	jae	SYSCALL_ERROR_LABEL	/* Branch forward if it failed.  */ -.Lpseudo_end: -	ret -PSEUDO_END (__vfork) - -weak_alias (__vfork, vfork) +#include <../../../../../../../libc/sysdeps/linux/i386/vfork.S> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S index 312933c5e..97b4afbf0 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_once.S @@ -26,7 +26,6 @@  # define LOCK  #endif -#define SYS_futex	240  #define FUTEX_WAKE	1  	.comm	__fork_generation, 4, 4 diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_init.c b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_init.c index 80c0b5216..d36e5373d 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_init.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_init.c @@ -1 +1 @@ -#include <nptl/sysdeps/i386/pthread_spin_init.c> +#include <sysdeps/i386/pthread_spin_init.c> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_unlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_unlock.S index 41c71f348..8bae0fd31 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_unlock.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pthread_spin_unlock.S @@ -1 +1 @@ -#include <nptl/sysdeps/i386/pthread_spin_unlock.S> +#include <sysdeps/i386/pthread_spin_unlock.S> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/smp.h b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/smp.h new file mode 100644 index 000000000..2c0cbe99a --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/smp.h @@ -0,0 +1,24 @@ +/* Determine whether the host has multiple processors.  SH version. +   Copyright (C) 2002 Free Software Foundation, Inc. +   This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Library General Public License as +   published by the Free Software Foundation; either version 2 of the +   License, or (at your option) any later version. + +   The GNU C Library is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   Library General Public License for more details. + +   You should have received a copy of the GNU Library General Public +   License along with the GNU C Library; see the file COPYING.LIB.  If not, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +static inline int +is_smp_system (void) +{ +  return 0; +} diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h index 147f5c847..f32c5bd20 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h @@ -20,7 +20,7 @@  #include <sysdep.h>  #include <tls.h>  #ifndef __ASSEMBLER__ -# include <nptl/pthreadP.h> +# include <pthreadP.h>  #endif  #if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/sysdep.h b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/sysdep.h new file mode 100644 index 000000000..6ab05606b --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -0,0 +1,336 @@ +/* Copyright (C) 1992,1993,1995-2000,2002-2006,2007 +   	Free Software Foundation, Inc. +   This file is part of the GNU C Library. +   Contributed by Ulrich Drepper, <drepper@gnu.org>, August 1995. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 of the License, or (at your option) any later version. + +   The GNU C Library is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +#ifndef _LINUX_I386_SYSDEP_H +#define _LINUX_I386_SYSDEP_H 1 + +#include <sys/syscall.h> +#include <sysdeps/i386/sysdep.h> + +#ifndef offsetof +# define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif + +/* For Linux we can use the system call table in the header file +	/usr/include/asm/unistd.h +   of the kernel.  But these symbols do not follow the SYS_* syntax +   so we have to redefine the `SYS_ify' macro here.  */ +#undef SYS_ify +#define SYS_ify(syscall_name)	__NR_##syscall_name + +#if defined USE_DL_SYSINFO \ +    && (!defined NOT_IN_libc || defined IS_IN_libpthread) +# define I386_USE_SYSENTER	1 +#else +# undef I386_USE_SYSENTER +#endif + +#ifdef __ASSEMBLER__ + +/* Linux uses a negative return value to indicate syscall errors, +   unlike most Unices, which use the condition codes' carry flag. + +   Since version 2.1 the return value of a system call might be +   negative even if the call succeeded.  E.g., the `lseek' system call +   might return a large offset.  Therefore we must not anymore test +   for < 0, but test for a real error by making sure the value in %eax +   is a real error number.  Linus said he will make sure the no syscall +   returns a value in -1 .. -4095 as a valid result so we can savely +   test with -4095.  */ + +/* We don't want the label for the error handle to be global when we define +   it here.  */ +#ifdef PIC +# define SYSCALL_ERROR_LABEL 0f +#else +# define SYSCALL_ERROR_LABEL syscall_error +#endif + +#undef	PSEUDO +#define	PSEUDO(name, syscall_name, args)				      \ +  .text;								      \ +  ENTRY (name)								      \ +    DO_CALL (syscall_name, args);					      \ +    cmpl $-4095, %eax;							      \ +    jae SYSCALL_ERROR_LABEL;						      \ +  L(pseudo_end): + +#undef	PSEUDO_END +#define	PSEUDO_END(name)						      \ +  SYSCALL_ERROR_HANDLER							      \ +  END (name) + +#undef	PSEUDO_NOERRNO +#define	PSEUDO_NOERRNO(name, syscall_name, args)			      \ +  .text;								      \ +  ENTRY (name)								      \ +    DO_CALL (syscall_name, args) + +#undef	PSEUDO_END_NOERRNO +#define	PSEUDO_END_NOERRNO(name)					      \ +  END (name) + +#define ret_NOERRNO ret + +/* The function has to return the error code.  */ +#undef	PSEUDO_ERRVAL +#define	PSEUDO_ERRVAL(name, syscall_name, args) \ +  .text;								      \ +  ENTRY (name)								      \ +    DO_CALL (syscall_name, args);					      \ +    negl %eax + +#undef	PSEUDO_END_ERRVAL +#define	PSEUDO_END_ERRVAL(name) \ +  END (name) + +#define ret_ERRVAL ret + +#ifndef PIC +# define SYSCALL_ERROR_HANDLER	/* Nothing here; code in sysdep.S is used.  */ +#else + +# if RTLD_PRIVATE_ERRNO +#  define SYSCALL_ERROR_HANDLER						      \ +0:SETUP_PIC_REG(cx);							      \ +  addl $_GLOBAL_OFFSET_TABLE_, %ecx;					      \ +  xorl %edx, %edx;							      \ +  subl %eax, %edx;							      \ +  movl %edx, rtld_errno@GOTOFF(%ecx);					      \ +  orl $-1, %eax;							      \ +  jmp L(pseudo_end); + +# elif defined _LIBC_REENTRANT + +#  if USE___THREAD +#   ifndef NOT_IN_libc +#    define SYSCALL_ERROR_ERRNO __libc_errno +#   else +#    define SYSCALL_ERROR_ERRNO errno +#   endif +#   define SYSCALL_ERROR_HANDLER					      \ +0:SETUP_PIC_REG (cx);							      \ +  addl $_GLOBAL_OFFSET_TABLE_, %ecx;					      \ +  movl SYSCALL_ERROR_ERRNO@GOTNTPOFF(%ecx), %ecx;			      \ +  xorl %edx, %edx;							      \ +  subl %eax, %edx;							      \ +  SYSCALL_ERROR_HANDLER_TLS_STORE (%edx, %ecx);				      \ +  orl $-1, %eax;							      \ +  jmp L(pseudo_end); +#   ifndef NO_TLS_DIRECT_SEG_REFS +#    define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff)		      \ +  movl src, %gs:(destoff) +#   else +#    define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff)		      \ +  addl %gs:0, destoff;							      \ +  movl src, (destoff) +#   endif +#  else +#   define SYSCALL_ERROR_HANDLER					      \ +0:pushl %ebx;								      \ +  cfi_adjust_cfa_offset (4);						      \ +  cfi_rel_offset (ebx, 0);						      \ +  SETUP_PIC_REG (bx);							      \ +  addl $_GLOBAL_OFFSET_TABLE_, %ebx;					      \ +  xorl %edx, %edx;							      \ +  subl %eax, %edx;							      \ +  pushl %edx;								      \ +  cfi_adjust_cfa_offset (4);						      \ +  call __errno_location@PLT;					              \ +  popl %ecx;								      \ +  cfi_adjust_cfa_offset (-4);						      \ +  popl %ebx;								      \ +  cfi_adjust_cfa_offset (-4);						      \ +  cfi_restore (ebx);							      \ +  movl %ecx, (%eax);							      \ +  orl $-1, %eax;							      \ +  jmp L(pseudo_end); +/* A quick note: it is assumed that the call to `__errno_location' does +   not modify the stack!  */ +#  endif +# else +/* Store (- %eax) into errno through the GOT.  */ +#  define SYSCALL_ERROR_HANDLER						      \ +0:SETUP_PIC_REG(cx);							      \ +  addl $_GLOBAL_OFFSET_TABLE_, %ecx;					      \ +  xorl %edx, %edx;							      \ +  subl %eax, %edx;							      \ +  movl errno@GOT(%ecx), %ecx;						      \ +  movl %edx, (%ecx);							      \ +  orl $-1, %eax;							      \ +  jmp L(pseudo_end); +# endif	/* _LIBC_REENTRANT */ +#endif	/* PIC */ + + +/* The original calling convention for system calls on Linux/i386 is +   to use int $0x80.  */ +#ifdef I386_USE_SYSENTER +# ifdef SHARED +#  define ENTER_KERNEL call *%gs:SYSINFO_OFFSET +# else +#  define ENTER_KERNEL call *_dl_sysinfo +# endif +#else +# define ENTER_KERNEL int $0x80 +#endif + +/* Linux takes system call arguments in registers: + +	syscall number	%eax	     call-clobbered +	arg 1		%ebx	     call-saved +	arg 2		%ecx	     call-clobbered +	arg 3		%edx	     call-clobbered +	arg 4		%esi	     call-saved +	arg 5		%edi	     call-saved +	arg 6		%ebp	     call-saved + +   The stack layout upon entering the function is: + +	24(%esp)	Arg# 6 +	20(%esp)	Arg# 5 +	16(%esp)	Arg# 4 +	12(%esp)	Arg# 3 +	 8(%esp)	Arg# 2 +	 4(%esp)	Arg# 1 +	  (%esp)	Return address + +   (Of course a function with say 3 arguments does not have entries for +   arguments 4, 5, and 6.) + +   The following code tries hard to be optimal.  A general assumption +   (which is true according to the data books I have) is that + +	2 * xchg	is more expensive than	pushl + movl + popl + +   Beside this a neat trick is used.  The calling conventions for Linux +   tell that among the registers used for parameters %ecx and %edx need +   not be saved.  Beside this we may clobber this registers even when +   they are not used for parameter passing. + +   As a result one can see below that we save the content of the %ebx +   register in the %edx register when we have less than 3 arguments +   (2 * movl is less expensive than pushl + popl). + +   Second unlike for the other registers we don't save the content of +   %ecx and %edx when we have more than 1 and 2 registers resp. + +   The code below might look a bit long but we have to take care for +   the pipelined processors (i586).  Here the `pushl' and `popl' +   instructions are marked as NP (not pairable) but the exception is +   two consecutive of these instruction.  This gives no penalty on +   other processors though.  */ + +#undef	DO_CALL +#define DO_CALL(syscall_name, args)			      		      \ +    PUSHARGS_##args							      \ +    DOARGS_##args							      \ +    movl $SYS_ify (syscall_name), %eax;					      \ +    ENTER_KERNEL							      \ +    POPARGS_##args + +#define PUSHARGS_0	/* No arguments to push.  */ +#define	DOARGS_0	/* No arguments to frob.  */ +#define	POPARGS_0	/* No arguments to pop.  */ +#define	_PUSHARGS_0	/* No arguments to push.  */ +#define _DOARGS_0(n)	/* No arguments to frob.  */ +#define	_POPARGS_0	/* No arguments to pop.  */ + +#define PUSHARGS_1	movl %ebx, %edx; L(SAVEBX1): PUSHARGS_0 +#define	DOARGS_1	_DOARGS_1 (4) +#define	POPARGS_1	POPARGS_0; movl %edx, %ebx; L(RESTBX1): +#define	_PUSHARGS_1	pushl %ebx; cfi_adjust_cfa_offset (4); \ +			cfi_rel_offset (ebx, 0); L(PUSHBX1): _PUSHARGS_0 +#define _DOARGS_1(n)	movl n(%esp), %ebx; _DOARGS_0(n-4) +#define	_POPARGS_1	_POPARGS_0; popl %ebx; cfi_adjust_cfa_offset (-4); \ +			cfi_restore (ebx); L(POPBX1): + +#define PUSHARGS_2	PUSHARGS_1 +#define	DOARGS_2	_DOARGS_2 (8) +#define	POPARGS_2	POPARGS_1 +#define _PUSHARGS_2	_PUSHARGS_1 +#define	_DOARGS_2(n)	movl n(%esp), %ecx; _DOARGS_1 (n-4) +#define	_POPARGS_2	_POPARGS_1 + +#define PUSHARGS_3	_PUSHARGS_2 +#define DOARGS_3	_DOARGS_3 (16) +#define POPARGS_3	_POPARGS_3 +#define _PUSHARGS_3	_PUSHARGS_2 +#define _DOARGS_3(n)	movl n(%esp), %edx; _DOARGS_2 (n-4) +#define _POPARGS_3	_POPARGS_2 + +#define PUSHARGS_4	_PUSHARGS_4 +#define DOARGS_4	_DOARGS_4 (24) +#define POPARGS_4	_POPARGS_4 +#define _PUSHARGS_4	pushl %esi; cfi_adjust_cfa_offset (4); \ +			cfi_rel_offset (esi, 0); L(PUSHSI1): _PUSHARGS_3 +#define _DOARGS_4(n)	movl n(%esp), %esi; _DOARGS_3 (n-4) +#define _POPARGS_4	_POPARGS_3; popl %esi; cfi_adjust_cfa_offset (-4); \ +			cfi_restore (esi); L(POPSI1): + +#define PUSHARGS_5	_PUSHARGS_5 +#define DOARGS_5	_DOARGS_5 (32) +#define POPARGS_5	_POPARGS_5 +#define _PUSHARGS_5	pushl %edi; cfi_adjust_cfa_offset (4); \ +			cfi_rel_offset (edi, 0); L(PUSHDI1): _PUSHARGS_4 +#define _DOARGS_5(n)	movl n(%esp), %edi; _DOARGS_4 (n-4) +#define _POPARGS_5	_POPARGS_4; popl %edi; cfi_adjust_cfa_offset (-4); \ +			cfi_restore (edi); L(POPDI1): + +#define PUSHARGS_6	_PUSHARGS_6 +#define DOARGS_6	_DOARGS_6 (40) +#define POPARGS_6	_POPARGS_6 +#define _PUSHARGS_6	pushl %ebp; cfi_adjust_cfa_offset (4); \ +			cfi_rel_offset (ebp, 0); L(PUSHBP1): _PUSHARGS_5 +#define _DOARGS_6(n)	movl n(%esp), %ebp; _DOARGS_5 (n-4) +#define _POPARGS_6	_POPARGS_5; popl %ebp; cfi_adjust_cfa_offset (-4); \ +			cfi_restore (ebp); L(POPBP1): + +#endif	/* __ASSEMBLER__ */ + + +/* Pointer mangling support.  */ +#if defined NOT_IN_libc && defined IS_IN_rtld +/* We cannot use the thread descriptor because in ld.so we use setjmp +   earlier than the descriptor is initialized.  Using a global variable +   is too complicated here since we have no PC-relative addressing mode.  */ +#else +# ifdef __ASSEMBLER__ +#  define PTR_MANGLE(reg)	xorl %gs:POINTER_GUARD, reg;		      \ +				roll $9, reg +#  define PTR_DEMANGLE(reg)	rorl $9, reg;				      \ +				xorl %gs:POINTER_GUARD, reg +# else +#  define PTR_MANGLE(var)	asm ("xorl %%gs:%c2, %0\n"		      \ +				     "roll $9, %0"			      \ +				     : "=r" (var)			      \ +				     : "0" (var),			      \ +				       "i" (offsetof (tcbhead_t,	      \ +						      pointer_guard))) +#  define PTR_DEMANGLE(var)	asm ("rorl $9, %0\n"			      \ +				     "xorl %%gs:%c2, %0"		      \ +				     : "=r" (var)			      \ +				     : "0" (var),			      \ +				       "i" (offsetof (tcbhead_t,	      \ +						      pointer_guard))) +# endif +#endif + +#endif /* linux/i386/sysdep.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/vfork.S index 52336102c..dc7fb2ec4 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/vfork.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/vfork.S @@ -35,4 +35,4 @@  1: -#include <sysdeps/unix/sysv/linux/i386/vfork.S> +#include <libc/sysdeps/linux/i386/vfork.S>  | 
