diff options
23 files changed, 293 insertions, 5927 deletions
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile deleted file mode 100644 index 43a6fad84..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# 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/sh/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile.arch index e3b2f7c4e..77ac2868f 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile.arch @@ -5,13 +5,7 @@  # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.  # -libpthread_linux_arch_SSRC = pthread_once.S pthread_rwlock_wrlock.S \ -			pthread_rwlock_rdlock.S pthread_rwlock_unlock.S \ -			lowlevellock.S lowlevelrobustlock.S pthread_barrier_wait.S \ -			pthread_cond_broadcast.S pthread_cond_signal.S \ -			pthread_rwlock_timedwrlock.S pthread_rwlock_timedrdlock.S \ -			sem_post.S sem_timedwait.S sem_trywait.S sem_wait.S - +libpthread_linux_arch_CSRC = pthread_once.c  libc_linux_arch_CSRC = fork.c  ASFLAGS += -DUSE___THREAD diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h deleted file mode 100644 index 939fb0cb6..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (C) 2003, 2004, 2008 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#ifdef __ASSEMBLER__ - -#define _IMP1 #1 -#define _IMM1 #-1 -#define _IMM4 #-4 -#define _IMM6 #-6 -#define _IMM8 #-8 - -#define	INC(mem, reg) \ -	.align	2; \ -	mova	99f, r0; \ -	mov	r15, r1; \ -	mov	_IMM6, r15; \ -98:	mov.l	mem, reg; \ -	add	_IMP1, reg; \ -	mov.l	reg, mem; \ -99:	mov	r1, r15 - -#define	DEC(mem, reg) \ -	.align	2; \ -	mova	99f, r0; \ -	mov	r15, r1; \ -	mov	_IMM6, r15; \ -98:	mov.l	mem, reg; \ -	add	_IMM1, reg; \ -	mov.l	reg, mem; \ -99:	mov	r1, r15 - -#define	XADD(reg, mem, old, tmp) \ -	.align	2; \ -	mova	99f, r0; \ -	nop; \ -	mov	r15, r1; \ -	mov	_IMM8, r15; \ -98:	mov.l	mem, old; \ -	mov	reg, tmp; \ -	add	old, tmp; \ -	mov.l	tmp, mem; \ -99:	mov	r1, r15 - -#define	XCHG(reg, mem, old) \ -	.align	2; \ -	mova	99f, r0; \ -	nop; \ -	mov	r15, r1; \ -	mov	_IMM4, r15; \ -98:	mov.l	mem, old; \ -	mov.l	reg, mem; \ -99:	mov	r1, r15 - -#define	CMPXCHG(reg, mem, new, old) \ -	.align	2; \ -	mova	99f, r0; \ -	nop; \ -	mov	r15, r1; \ -	mov	_IMM8, r15; \ -98:	mov.l	mem, old; \ -	cmp/eq	old, reg; \ -	bf	99f; \ -	mov.l	new, mem; \ -99:	mov	r1, r15 - -#endif  /* __ASSEMBLER__ */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S deleted file mode 100644 index bac9dd4f2..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S +++ /dev/null @@ -1,539 +0,0 @@ -/* Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 -   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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <bits/kernel-features.h> -#include <lowlevellock.h> -#include <tcb-offsets.h> -#include "lowlevel-atomic.h" - -	.text - -#ifdef __ASSUME_PRIVATE_FUTEX -# define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \ -	mov	#(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg; \ -	extu.b	reg, reg -# define LOAD_PRIVATE_FUTEX_WAKE(reg,tmp,tmp2) \ -	mov	#(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), reg; \ -	extu.b	reg, reg -# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ -	mov	#(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), tmp; \ -	extu.b	tmp, tmp; \ -	xor	tmp, reg -# define LOAD_FUTEX_WAIT_ABS(reg,tmp,tmp2) \ -	mov	#(FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG), tmp; \ -	extu.b	tmp, tmp; \ -	mov	#(FUTEX_CLOCK_REALTIME >> 8), tmp2; \ -	swap.b	tmp2, tmp2; \ -	or	tmp2, tmp; \ -	xor	tmp, reg -# define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \ -	mov	#(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), tmp; \ -	extu.b	tmp, tmp; \ -	xor	tmp, reg -#else -# if FUTEX_WAIT == 0 -#  define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \ -	stc	gbr, tmp	; \ -	mov.w	99f, reg	; \ -	add	reg, tmp	; \ -	bra	98f		; \ -	 mov.l	@tmp, reg	; \ -99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98: -# else -#  define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \ -	stc	gbr, tmp	; \ -	mov.w	99f, reg	; \ -	add	reg, tmp	; \ -	mov.l	@tmp, reg	; \ -	bra	98f		; \ -	 mov	#FUTEX_WAIT, tmp ; \ -99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98:	or	tmp, reg -# endif -# define LOAD_PRIVATE_FUTEX_WAKE(reg,tmp,tmp2) \ -	stc	gbr, tmp	; \ -	mov.w	99f, reg	; \ -	add	reg, tmp	; \ -	mov.l	@tmp, reg	; \ -	bra	98f		; \ -	 mov	#FUTEX_WAKE, tmp ; \ -99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98:	or	tmp, reg -# if FUTEX_WAIT == 0 -#  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ -	stc	gbr, tmp	; \ -	mov.w	99f, tmp2	; \ -	add	tmp2, tmp	; \ -	mov.l	@tmp, tmp2	; \ -	bra	98f		; \ -	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \ -99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98:	extu.b	tmp, tmp	; \ -	xor	tmp, reg	; \ -	and	tmp2, reg -# else -#  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ -	stc	gbr, tmp	; \ -	mov.w	99f, tmp2	; \ -	add	tmp2, tmp	; \ -	mov.l	@tmp, tmp2	; \ -	bra	98f		; \ -	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \ -99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98:	extu.b	tmp, tmp	; \ -	xor	tmp, reg	; \ -	and	tmp2, reg	; \ -	mov	#FUTEX_WAIT, tmp ; \ -	or	tmp, reg -# endif -# define LOAD_FUTEX_WAIT_ABS(reg,tmp,tmp2) \ -	stc	gbr, tmp	; \ -	mov.w	99f, tmp2	; \ -	add	tmp2, tmp	; \ -	mov.l	@tmp, tmp2	; \ -	bra	98f		; \ -	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \ -99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98:	extu.b	tmp, tmp	; \ -	xor	tmp, reg	; \ -	and	tmp2, reg	; \ -	mov	#FUTEX_WAIT_BITSET, tmp ; \ -	mov	#(FUTEX_CLOCK_REALTIME >> 8), tmp2; \ -	swap.b	tmp2, tmp2; \ -	or	tmp2, tmp; \ -	or	tmp, reg -# define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \ -	stc	gbr, tmp	; \ -	mov.w	99f, tmp2	; \ -	add	tmp2, tmp	; \ -	mov.l	@tmp, tmp2	; \ -	bra	98f		; \ -	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \ -99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98:	extu.b	tmp, tmp	; \ -	xor	tmp, reg	; \ -	and	tmp2, reg	; \ -	mov	#FUTEX_WAKE, tmp ; \ -	or	tmp, reg -#endif - -	.globl	__lll_lock_wait_private -	.type	__lll_lock_wait_private,@function -	.hidden	__lll_lock_wait_private -	.align	5 -	cfi_startproc -__lll_lock_wait_private: -	mov.l	r8, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r8, 0) -	mov	r4, r6 -	mov	r5, r8 -	mov	#0, r7		/* No timeout.  */ -	LOAD_PRIVATE_FUTEX_WAIT (r5, r0, r1) - -	mov	#2, r4 -	cmp/eq	r4, r6 -	bf	2f - -1: -	mov	r8, r4 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -2: -	mov	#2, r6 -	XCHG (r6, @r8, r2) -	tst	r2, r2 -	bf	1b - -	mov.l	@r15+, r8 -	rts -	 mov	r2, r0 -	cfi_endproc -	.size	__lll_lock_wait_private,.-__lll_lock_wait_private - -#ifdef NOT_IN_libc -	.globl	__lll_lock_wait -	.type	__lll_lock_wait,@function -	.hidden	__lll_lock_wait -	.align	5 -	cfi_startproc -__lll_lock_wait: -	mov.l	r9, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r9, 0) -	mov.l	r8, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r8, 0) -	mov	r6, r9 -	mov	r4, r6 -	mov	r5, r8 -	mov	#0, r7		/* No timeout.  */ -	mov	r9, r5 -	LOAD_FUTEX_WAIT (r5, r0, r1) - -	mov	#2, r4 -	cmp/eq	r4, r6 -	bf	2f - -1: -	mov	r8, r4 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -2: -	mov	#2, r6 -	XCHG (r6, @r8, r2) -	tst	r2, r2 -	bf	1b - -	mov.l	@r15+, r8 -	mov.l	@r15+, r9 -	ret -	 mov	r2, r0 -	cfi_endproc -	.size	__lll_lock_wait,.-__lll_lock_wait - -	/*      r5  (r8): futex -		r7 (r11): flags -		r6  (r9): timeout -		r4 (r10): futex value -	*/ -	.globl	__lll_timedlock_wait -	.type	__lll_timedlock_wait,@function -	.hidden	__lll_timedlock_wait -	.align	5 -	cfi_startproc -__lll_timedlock_wait: -	mov.l	r12, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r12, 0) - -# ifndef __ASSUME_FUTEX_CLOCK_REALTIME -	mov.l	.Lhave, r1 -#  ifdef __PIC__ -	mova	.Lgot, r0 -	mov.l	.Lgot, r12 -	add	r0, r12 -	add	r12, r1 -#  endif -	mov.l	@r1, r0 -	tst	r0, r0 -	bt	.Lreltmo -# endif - -	mov	r4, r2 -	mov	r5, r4 -	mov	r7, r5 -	mov	r6, r7 -	LOAD_FUTEX_WAIT_ABS (r5, r0, r1) - -	mov	#2, r6 -	cmp/eq	r6, r2 -	bf/s	2f -	 mov	r6, r2 - -1: -	mov	#2, r6 -	mov	#-1, r1 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x16 -	SYSCALL_INST_PAD -	mov	r0, r6 - -2: -	XCHG	(r2, @r4, r3)	/* NB:   lock is implied */ - -	tst	r3, r3 -	bt/s	3f -	 mov	r6, r0 - -	cmp/eq	#-ETIMEDOUT, r0 -	bt	4f -	cmp/eq	#-EINVAL, r0 -	bf	1b -4: -	neg	r0, r3 -3: -	mov	r3, r0 -	rts -	 mov.l	@r15+, r12 - -	.align	2 -# ifndef __ASSUME_FUTEX_CLOCK_REALTIME -# ifdef __PIC__ -.Lgot: -	.long	_GLOBAL_OFFSET_TABLE_ -.Lhave: -	.long	__have_futex_clock_realtime@GOTOFF -# else -.Lhave: -	.long	__have_futex_clock_realtime -# endif - -.Lreltmo: -	/* Check for a valid timeout value.  */ -	mov.l	@(4,r6), r1 -	mov.l	.L1g, r0 -	cmp/hs	r0, r1 -	bt	3f - -	mov.l	r11, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r11, 0) -	mov.l	r10, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r10, 0) -	mov.l	r9, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r9, 0) -	mov.l	r8, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r8, 0) -	mov	r7, r11 -	mov	r4, r10 -	mov	r6, r9 -	mov	r5, r8 - -	/* Stack frame for the timespec and timeval structs.  */ -	add	#-8, r15 -	cfi_adjust_cfa_offset(8) - -	mov	#2, r2 -	XCHG (r2, @r8, r3) - -	tst	r3, r3 -	bt	6f - -1: -	/* Get current time.  */ -	mov	r15, r4 -	mov	#0, r5 -	mov	#__NR_gettimeofday, r3 -	trapa	#0x12 -	SYSCALL_INST_PAD - -	/* Compute relative timeout.  */ -	mov.l	@(4,r15), r0 -	mov.w	.L1k, r1 -	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */ -	mov.l	@r9, r2 -	mov.l	@(4,r9), r3 -	mov.l	@r15, r0 -	sts	macl, r1 -	sub	r0, r2 -	clrt -	subc	r1, r3 -	bf	4f -	mov.l	.L1g, r1 -	add	r1, r3 -	add	#-1, r2 -4: -	cmp/pz	r2 -	bf	2f		/* Time is already up.  */ - -	mov.l	r2, @r15	/* Store relative timeout.  */ -	mov.l	r3, @(4,r15) - -	mov	r8, r4 -	mov	r11, r5 -	LOAD_FUTEX_WAIT (r5, r0, r1) -	mov	r10, r6 -	mov	r15, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	mov	r0, r5 - -	mov	#2, r2 -	XCHG (r2, @r8, r3) - -	tst	r3, r3 -	bt/s	6f -	 mov	#-ETIMEDOUT, r1 -	cmp/eq	r5, r1 -	bf	1b - -2:	mov	#ETIMEDOUT, r3 - -6: -	mov	r3, r0 -	add	#8, r15 -	mov.l	@r15+, r8 -	mov.l	@r15+, r9 -	mov.l	@r15+, r10 -	mov.l	@r15+, r11 -	rts -	 mov.l	@r15+, r12 - -3: -	mov.l	@r15+, r12 -	rts -	 mov	#EINVAL, r0 -# endif -	cfi_endproc - -.L1k: -	.word	1000 -	.align	2 -.L1g: -	.long	1000000000 - -	.size	__lll_timedlock_wait,.-__lll_timedlock_wait -#endif - -	.globl	__lll_unlock_wake_private -	.type	__lll_unlock_wake_private,@function -	.hidden	__lll_unlock_wake_private -	.align	5 -	cfi_startproc -__lll_unlock_wake_private: -	LOAD_PRIVATE_FUTEX_WAKE (r5, r0, r1) -	mov	#1, r6		/* Wake one thread.  */ -	mov	#0, r7 -	mov.l	r7, @r4		/* Stores 0.  */ -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	rts -	 nop -	cfi_endproc -	.size	__lll_unlock_wake_private,.-__lll_unlock_wake_private - -#ifdef NOT_IN_libc -	.globl	__lll_unlock_wake -	.type	__lll_unlock_wake,@function -	.hidden	__lll_unlock_wake -	.align	5 -	cfi_startproc -__lll_unlock_wake: -	LOAD_FUTEX_WAKE (r5, r0, r1) -	mov	#1, r6		/* Wake one thread.  */ -	mov	#0, r7 -	mov.l	r7, @r4		/* Stores 0.  */ -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	rts -	 nop -	cfi_endproc -	.size	__lll_unlock_wake,.-__lll_unlock_wake - -	.globl	__lll_timedwait_tid -	.type	__lll_timedwait_tid,@function -	.hidden	__lll_timedwait_tid -	.align	5 -	cfi_startproc -__lll_timedwait_tid: -	mov.l	r9, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r9, 0) -	mov.l	r8, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r8, 0) -	mov	r4, r8 -	mov	r5, r9 - -	/* Stack frame for the timespec and timeval structs.  */ -	add	#-8, r15 -	cfi_adjust_cfa_offset(8) - -2: -	/* Get current time.  */ -	mov	r15, r4 -	mov	#0, r5 -	mov	#__NR_gettimeofday, r3 -	trapa	#0x12 -	SYSCALL_INST_PAD - -	/* Compute relative timeout.  */ -	mov.l	@(4,r15), r0 -	mov.w	.L1k2, r1 -	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */ -	mov.l	@r9, r2 -	mov.l	@(4,r9), r3 -	mov.l	@r15, r0 -	sts	macl, r1 -	sub	r0, r2 -	clrt -	subc	r1, r3 -	bf	5f -	mov.l	.L1g2, r1 -	add	r1, r3 -	add	#-1, r2 -5: -	cmp/pz	r2 -	bf	6f		/* Time is already up.  */ - -	mov.l	r2, @r15	/* Store relative timeout.  */ -	mov.l	r3, @(4,r15) - -	mov.l	@r8, r2 -	tst	r2, r2 -	bt	4f - -	mov	r8, r4 -	/* XXX The kernel so far uses global futex for the wakeup at -	   all times.  */ -	mov	#0, r5 -	extu.b	r5, r5 -	mov	r2, r6 -	mov	r15, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	mov.l	@r8, r2 -	tst	r2, r2 -	bf	1f -4: -	mov	#0, r0 -3: -	add	#8, r15 -	mov.l	@r15+, r8 -	rts -	 mov.l	@r15+, r9 -1: -	/* Check whether the time expired.  */ -	mov	#-ETIMEDOUT, r1 -	cmp/eq	r0, r1 -	bf	2b -6: -	bra	3b -	 mov	#ETIMEDOUT, r0 -	cfi_endproc - -.L1k2: -	.word	1000 -	.align	2 -.L1g2: -	.long	1000000000 -	.size	__lll_timedwait_tid,.-__lll_timedwait_tid -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h index a9652bbb1..abe6e9c37 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h @@ -1,5 +1,4 @@ -/* Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009 -   Free Software Foundation, Inc. +/* Copyright (C) 2005-2013 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 @@ -9,27 +8,29 @@     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 +   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, see +   License along with the GNU C Library.  If not, see     <http://www.gnu.org/licenses/>.  */  #ifndef _LOWLEVELLOCK_H  #define _LOWLEVELLOCK_H	1 -#ifndef __ASSEMBLER__  #include <time.h>  #include <sys/param.h>  #include <bits/pthreadtypes.h> +#include <atomic.h> +#include <sysdep.h>  #include <bits/kernel-features.h> -#endif  #define FUTEX_WAIT		0  #define FUTEX_WAKE		1 +#define FUTEX_REQUEUE		3  #define FUTEX_CMP_REQUEUE	4  #define FUTEX_WAKE_OP		5 +#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1)  #define FUTEX_LOCK_PI		6  #define FUTEX_UNLOCK_PI		7  #define FUTEX_TRYLOCK_PI	8 @@ -40,13 +41,11 @@  #define FUTEX_BITSET_MATCH_ANY	0xffffffff -#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1) -  /* Values for 'private' parameter of locking macros.  Yes, the     definition seems to be backwards.  But it is not.  The bit will be     reversed before passing to the system call.  */ -#define LLL_PRIVATE    0 -#define LLL_SHARED     FUTEX_PRIVATE_FLAG +#define LLL_PRIVATE	0 +#define LLL_SHARED	FUTEX_PRIVATE_FLAG  #if !defined NOT_IN_libc || defined IS_IN_rtld @@ -73,347 +72,222 @@  # endif  #endif -#ifndef __ASSEMBLER__ -/* Initializer for compatibility lock.  */ -#define LLL_LOCK_INITIALIZER		(0) -#define LLL_LOCK_INITIALIZER_LOCKED	(1) -#define LLL_LOCK_INITIALIZER_WAITERS	(2) - -extern int __lll_lock_wait_private (int val, int *__futex) -  attribute_hidden; -extern int __lll_lock_wait (int val, int *__futex, int private) -  attribute_hidden; -extern int __lll_timedlock_wait (int val, int *__futex, -				 const struct timespec *abstime, int private) -  attribute_hidden; -extern int __lll_robust_lock_wait (int val, int *__futex, int private) -  attribute_hidden; -extern int __lll_robust_timedlock_wait (int val, int *__futex, -					const struct timespec *abstime, -					int private) -  attribute_hidden; -extern int __lll_unlock_wake_private (int *__futex) attribute_hidden; -extern int __lll_unlock_wake (int *__futex, int private) attribute_hidden; - -#define lll_trylock(futex) \ -  ({ unsigned char __ret; \ -     __asm__ __volatile__ ("\ -	.align 2\n\ -	mova 1f,r0\n\ -	nop\n\ -	mov r15,r1\n\ -	mov #-8,r15\n\ -     0: mov.l @%1,r2\n\ -	cmp/eq r2,%3\n\ -	bf 1f\n\ -	mov.l %2,@%1\n\ -     1: mov r1,r15\n\ -	mov #-1,%0\n\ -	negc %0,%0"\ -	: "=r" (__ret) \ -	: "r" (&(futex)), \ -	  "r" (LLL_LOCK_INITIALIZER_LOCKED), \ -	  "r" (LLL_LOCK_INITIALIZER) \ -	: "r0", "r1", "r2", "t", "memory"); \ -     __ret; }) - -#define lll_robust_trylock(futex, id)	\ -  ({ unsigned char __ret; \ -     __asm__ __volatile__ ("\ -	.align 2\n\ -	mova 1f,r0\n\ -	nop\n\ -	mov r15,r1\n\ -	mov #-8,r15\n\ -     0: mov.l @%1,r2\n\ -	cmp/eq r2,%3\n\ -	bf 1f\n\ -	mov.l %2,@%1\n\ -     1: mov r1,r15\n\ -	mov #-1,%0\n\ -	negc %0,%0"\ -	: "=r" (__ret) \ -	: "r" (&(futex)), \ -	  "r" (id), \ -	  "r" (LLL_LOCK_INITIALIZER) \ -	: "r0", "r1", "r2", "t", "memory"); \ -     __ret; }) - -#define lll_cond_trylock(futex) \ -  ({ unsigned char __ret; \ -     __asm__ __volatile__ ("\ -	.align 2\n\ -	mova 1f,r0\n\ -	nop\n\ -	mov r15,r1\n\ -	mov #-8,r15\n\ -     0: mov.l @%1,r2\n\ -	cmp/eq r2,%3\n\ -	bf 1f\n\ -	mov.l %2,@%1\n\ -     1: mov r1,r15\n\ -	mov #-1,%0\n\ -	negc %0,%0"\ -	: "=r" (__ret) \ -	: "r" (&(futex)), \ -	  "r" (LLL_LOCK_INITIALIZER_WAITERS), \ -	  "r" (LLL_LOCK_INITIALIZER) \ -	: "r0", "r1", "r2", "t", "memory"); \ -     __ret; }) - -#define lll_lock(futex, private) \ -  (void) ({ int __ret, *__futex = &(futex); \ -	    __asm__ __volatile__ ("\ -		.align 2\n\ -		mova 1f,r0\n\ -		nop\n\ -		mov r15,r1\n\ -		mov #-8,r15\n\ -	     0: mov.l @%2,%0\n\ -		tst %0,%0\n\ -		bf 1f\n\ -		mov.l %1,@%2\n\ -	     1: mov r1,r15"\ -		: "=&r" (__ret) : "r" (1), "r" (__futex) \ -		: "r0", "r1", "t", "memory"); \ -	    if (__ret) \ -	      { \ -		if (__builtin_constant_p (private) \ -		    && (private) == LLL_PRIVATE) \ -		  __lll_lock_wait_private (__ret, __futex); \ -	        else \ -		  __lll_lock_wait (__ret, __futex, (private));	\ -	      } \ -    }) +#define lll_futex_wait(futexp, val, private) \ +  lll_futex_timed_wait(futexp, val, NULL, private) + +#define lll_futex_timed_wait(futexp, val, timespec, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret;							      \ +    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ +			      __lll_private_flag (FUTEX_WAIT, private),	      \ +			      (val), (timespec));			      \ +    __ret;								      \ +  }) + +#define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \ +  ({									\ +    INTERNAL_SYSCALL_DECL (__err);					\ +    long int __ret;							\ +    int __op = FUTEX_WAIT_BITSET | clockbit;				\ +    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		\ +			      __lll_private_flag (__op, private),	\ +			      (val), (timespec), NULL /* Unused.  */,	\ +			      FUTEX_BITSET_MATCH_ANY);			\ +    __ret;								\ +  }) + +#define lll_futex_wake(futexp, nr, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret;							      \ +    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \ +			      __lll_private_flag (FUTEX_WAKE, private),	      \ +			      (nr), 0);					      \ +    __ret;								      \ +  }) + +#define lll_robust_dead(futexv, private) \ +  do									      \ +    {									      \ +      int *__futexp = &(futexv);					      \ +      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \ +      lll_futex_wake (__futexp, 1, private);				      \ +    }									      \ +  while (0) + +/* Returns non-zero if error happened, zero if success.  */ +#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret;							      \ +    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ +			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ +			      (nr_wake), (nr_move), (mutex), (val));	      \ +    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ +  }) + + +/* Returns non-zero if error happened, zero if success.  */ +#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ +  ({									      \ +    INTERNAL_SYSCALL_DECL (__err);					      \ +    long int __ret;							      \ +    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \ +			      __lll_private_flag (FUTEX_WAKE_OP, private),    \ +			      (nr_wake), (nr_wake2), (futexp2),		      \ +			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \ +    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \ +  }) + + +#define lll_trylock(lock)	\ +  atomic_compare_and_exchange_val_acq(&(lock), 1, 0) + +#define lll_cond_trylock(lock)	\ +  atomic_compare_and_exchange_val_acq(&(lock), 2, 0) + +#define __lll_robust_trylock(futex, id) \ +  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) +#define lll_robust_trylock(lock, id) \ +  __lll_robust_trylock (&(lock), id) + +extern void __lll_lock_wait_private (int *futex) attribute_hidden; +extern void __lll_lock_wait (int *futex, int private) attribute_hidden; +extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; + +#define __lll_lock(futex, private)					      \ +  ((void) ({								      \ +    int *__futex = (futex);						      \ +    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \ +								1, 0), 0))    \ +      {									      \ +	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \ +	  __lll_lock_wait_private (__futex);				      \ +	else								      \ +	  __lll_lock_wait (__futex, private);				      \ +      }									      \ +  })) +#define lll_lock(futex, private) __lll_lock (&(futex), private) + +#define __lll_robust_lock(futex, id, private)				      \ +  ({									      \ +    int *__futex = (futex);						      \ +    int __val = 0;							      \ +									      \ +    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ +								0), 0))	      \ +      __val = __lll_robust_lock_wait (__futex, private);		      \ +    __val;								      \ +  })  #define lll_robust_lock(futex, id, private) \ -  ({ int __ret, *__futex = &(futex); \ -     __asm__ __volatile__ ("\ -	.align 2\n\ -	mova 1f,r0\n\ -	nop\n\ -	mov r15,r1\n\ -	mov #-8,r15\n\ -      0: mov.l @%2,%0\n\ -	tst %0,%0\n\ -	bf 1f\n\ -	mov.l %1,@%2\n\ -      1: mov r1,r15"\ -	: "=&r" (__ret) : "r" (id), "r" (__futex) \ -	: "r0", "r1", "t", "memory"); \ -     if (__ret) \ -       __ret = __lll_robust_lock_wait (__ret, __futex, private); \ -     __ret; }) - -/* Special version of lll_mutex_lock which causes the unlock function to -   always wakeup waiters.  */ -#define lll_cond_lock(futex, private) \ -  (void) ({ int __ret, *__futex = &(futex); \ -	    __asm__ __volatile__ ("\ -		.align 2\n\ -		mova 1f,r0\n\ -		nop\n\ -		mov r15,r1\n\ -		mov #-8,r15\n\ -	     0: mov.l @%2,%0\n\ -		tst %0,%0\n\ -		bf 1f\n\ -		mov.l %1,@%2\n\ -	     1: mov r1,r15"\ -		: "=&r" (__ret) : "r" (2), "r" (__futex) \ -		: "r0", "r1", "t", "memory"); \ -	    if (__ret) \ -	      __lll_lock_wait (__ret, __futex, private); }) +  __lll_robust_lock (&(futex), id, private) + + +#define __lll_cond_lock(futex, private)					      \ +  ((void) ({								      \ +    int *__futex = (futex);						      \ +    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \ +      __lll_lock_wait (__futex, private);				      \ +  })) +#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) +  #define lll_robust_cond_lock(futex, id, private) \ -  ({ int __ret, *__futex = &(futex); \ -     __asm__ __volatile__ ("\ -	.align 2\n\ -	mova 1f,r0\n\ -	nop\n\ -	mov r15,r1\n\ -	mov #-8,r15\n\ -     0: mov.l @%2,%0\n\ -	tst %0,%0\n\ -	bf 1f\n\ -	mov.l %1,@%2\n\ -     1: mov r1,r15"\ -	: "=&r" (__ret) : "r" (id | FUTEX_WAITERS), "r" (__futex) \ -	: "r0", "r1", "t", "memory"); \ -      if (__ret) \ -	__ret = __lll_robust_lock_wait (__ret, __futex, private); \ -      __ret; }) - -#define lll_timedlock(futex, timeout, private) \ -  ({ int __ret, *__futex = &(futex); \ -     __asm__ __volatile__ ("\ -	.align 2\n\ -	mova 1f,r0\n\ -	nop\n\ -	mov r15,r1\n\ -	mov #-8,r15\n\ -     0: mov.l @%2,%0\n\ -	tst %0,%0\n\ -	bf 1f\n\ -	mov.l %1,@%2\n\ -     1: mov r1,r15"\ -	: "=&r" (__ret) : "r" (1), "r" (__futex) \ -	: "r0", "r1", "t", "memory"); \ -    if (__ret) \ -      __ret = __lll_timedlock_wait (__ret, __futex, timeout, private); \ -    __ret; }) - -#define lll_robust_timedlock(futex, timeout, id, private) \ -  ({ int __ret, *__futex = &(futex); \ -     __asm__ __volatile__ ("\ -	.align 2\n\ -	mova 1f,r0\n\ -	nop\n\ -	mov r15,r1\n\ -	mov #-8,r15\n\ -     0: mov.l @%2,%0\n\ -	tst %0,%0\n\ -	bf 1f\n\ -	mov.l %1,@%2\n\ -     1: mov r1,r15"\ -	: "=&r" (__ret) : "r" (id), "r" (__futex) \ -	: "r0", "r1", "t", "memory"); \ -    if (__ret) \ -      __ret = __lll_robust_timedlock_wait (__ret, __futex, \ -					      timeout, private); \ -    __ret; }) - -#define lll_unlock(futex, private) \ -  (void) ({ int __ret, *__futex = &(futex); \ -	    __asm__ __volatile__ ("\ -		.align 2\n\ -		mova 1f,r0\n\ -		mov r15,r1\n\ -		mov #-6,r15\n\ -	     0: mov.l @%1,%0\n\ -		add #-1,%0\n\ -		mov.l %0,@%1\n\ -	     1: mov r1,r15"\ -		: "=&r" (__ret) : "r" (__futex) \ -		: "r0", "r1", "memory"); \ -	    if (__ret) \ -	      { \ -		if (__builtin_constant_p (private) \ -		    && (private) == LLL_PRIVATE) \ -		  __lll_unlock_wake_private (__futex); \ -	        else \ -		  __lll_unlock_wake (__futex, (private)); \ -	      } \ -    }) +  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) -#define lll_robust_unlock(futex, private) \ -  (void) ({ int __ret, *__futex = &(futex); \ -	    __asm__ __volatile__ ("\ -		.align 2\n\ -		mova 1f,r0\n\ -		mov r15,r1\n\ -		mov #-6,r15\n\ -	     0: mov.l @%1,%0\n\ -		and %2,%0\n\ -		mov.l %0,@%1\n\ -	     1: mov r1,r15"\ -		: "=&r" (__ret) : "r" (__futex), "r" (FUTEX_WAITERS) \ -		: "r0", "r1", "memory");	\ -	    if (__ret) \ -	      __lll_unlock_wake (__futex, private); }) - -#define lll_robust_dead(futex, private)		       \ -  (void) ({ int __ignore, *__futex = &(futex); \ -	    __asm__ __volatile__ ("\ -		.align 2\n\ -		mova 1f,r0\n\ -		mov r15,r1\n\ -		mov #-6,r15\n\ -	     0: mov.l @%1,%0\n\ -		or %2,%0\n\ -		mov.l %0,@%1\n\ -	     1: mov r1,r15"\ -		: "=&r" (__ignore) : "r" (__futex), "r" (FUTEX_OWNER_DIED) \ -		: "r0", "r1", "memory");	\ -	    lll_futex_wake (__futex, 1, private); }) - -# ifdef NEED_SYSCALL_INST_PAD -#  define SYSCALL_WITH_INST_PAD "\ -	trapa #0x14; or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0" -# else -#  define SYSCALL_WITH_INST_PAD "\ -	trapa #0x14" -# endif -#define lll_futex_wait(futex, val, private) \ -  lll_futex_timed_wait (futex, val, NULL, private) +extern int __lll_timedlock_wait (int *futex, const struct timespec *, +				 int private) attribute_hidden; +extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, +					int private) attribute_hidden; + +#define __lll_timedlock(futex, abstime, private)			      \ +  ({									      \ +     int *__futex = (futex);						      \ +     int __val = 0;							      \ +									      \ +     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \ +       __val = __lll_timedlock_wait (__futex, abstime, private);	      \ +     __val;								      \ +  }) +#define lll_timedlock(futex, abstime, private) \ +  __lll_timedlock (&(futex), abstime, private) -#define lll_futex_timed_wait(futex, val, timeout, private) \ +#define __lll_robust_timedlock(futex, abstime, id, private)		      \    ({									      \ -    int __status;							      \ -    register unsigned long __r3 __asm__ ("r3") = SYS_futex;			      \ -    register unsigned long __r4 __asm__ ("r4") = (unsigned long) (futex);	      \ -    register unsigned long __r5 __asm__ ("r5")				      \ -      = __lll_private_flag (FUTEX_WAIT, private);			      \ -    register unsigned long __r6 __asm__ ("r6") = (unsigned long) (val);	      \ -    register unsigned long __r7 __asm__ ("r7") = (unsigned long) (timeout);   \ -    __asm__ __volatile__ (SYSCALL_WITH_INST_PAD				      \ -		      : "=z" (__status)					      \ -		      : "r" (__r3), "r" (__r4), "r" (__r5),		      \ -			"r" (__r6), "r" (__r7)				      \ -		      : "memory", "t");					      \ -    __status;								      \ +    int *__futex = (futex);						      \ +    int __val = 0;							      \ +									      \ +    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \ +								0), 0))	      \ +      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \ +    __val;								      \    }) +#define lll_robust_timedlock(futex, abstime, id, private) \ +  __lll_robust_timedlock (&(futex), abstime, id, private) -#define lll_futex_wake(futex, nr, private) \ -  do {									      \ -    int __ignore;							      \ -    register unsigned long __r3 __asm__ ("r3") = SYS_futex;			      \ -    register unsigned long __r4 __asm__ ("r4") = (unsigned long) (futex);	      \ -    register unsigned long __r5 __asm__ ("r5")				      \ -      = __lll_private_flag (FUTEX_WAKE, private);			      \ -    register unsigned long __r6 __asm__ ("r6") = (unsigned long) (nr);	      \ -    register unsigned long __r7 __asm__ ("r7") = 0;				      \ -    __asm__ __volatile__ (SYSCALL_WITH_INST_PAD				      \ -		      : "=z" (__ignore)					      \ -		      : "r" (__r3), "r" (__r4), "r" (__r5),		      \ -			"r" (__r6), "r" (__r7)				      \ -		      : "memory", "t");					      \ -  } while (0) +#define __lll_unlock(futex, private) \ +  (void)							\ +    ({ int *__futex = (futex);					\ +       int __oldval = atomic_exchange_rel (__futex, 0);		\ +       if (__builtin_expect (__oldval > 1, 0))			\ +	 lll_futex_wake (__futex, 1, private);			\ +    }) +#define lll_unlock(futex, private) __lll_unlock(&(futex), private) + + +#define __lll_robust_unlock(futex, private) \ +  (void)							\ +    ({ int *__futex = (futex);					\ +       int __oldval = atomic_exchange_rel (__futex, 0);		\ +       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\ +	 lll_futex_wake (__futex, 1, private);			\ +    }) +#define lll_robust_unlock(futex, private) \ +  __lll_robust_unlock(&(futex), private)  #define lll_islocked(futex) \ -  (futex != LLL_LOCK_INITIALIZER) +  (futex != 0) + + +/* Our internal lock implementation is identical to the binary-compatible +   mutex implementation. */ + +/* Initializers for lock.  */ +#define LLL_LOCK_INITIALIZER		(0) +#define LLL_LOCK_INITIALIZER_LOCKED	(1) + +/* The states of a lock are: +    0  -  untaken +    1  -  taken by one user +   >1  -  taken by more users */ -/* The kernel notifies a process with uses CLONE_CLEARTID via futex +/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex     wakeup when the clone terminates.  The memory location contains the     thread ID while the clone is running and is reset to zero -   afterwards.  */ - +   afterwards.	*/  #define lll_wait_tid(tid) \ -  do {									      \ -    __typeof (tid) __tid;						      \ -    while ((__tid = (tid)) != 0)						      \ -      lll_futex_wait (&(tid), __tid, LLL_SHARED);			      \ +  do {					\ +    __typeof (tid) __tid;		\ +    while ((__tid = (tid)) != 0)	\ +      lll_futex_wait (&(tid), __tid, LLL_SHARED);\    } while (0) -extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime) +extern int __lll_timedwait_tid (int *, const struct timespec *)       attribute_hidden; -#define lll_timedwait_tid(tid, abstime) \ -  ({									      \ -    int __ret = 0;							      \ -    if (tid != 0)							      \ -      {									      \ -	if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)	      \ -	  __ret = EINVAL;						      \ -	else								      \ -	  __ret = __lll_timedwait_tid (&tid, abstime);		      \ -      }									      \ -    __ret; }) -#endif  /* !__ASSEMBLER__ */ +#define lll_timedwait_tid(tid, abstime) \ +  ({							\ +    int __res = 0;					\ +    if ((tid) != 0)					\ +      __res = __lll_timedwait_tid (&(tid), (abstime));	\ +    __res;						\ +  }) -#endif  /* lowlevellock.h */ +#endif	/* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S deleted file mode 100644 index 7ec8e1ab7..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S +++ /dev/null @@ -1,264 +0,0 @@ -/* Copyright (C) 2003, 2004, 2005, 2006, 2007 -   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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <lowlevellock.h> -#include <lowlevelrobustlock.h> -#include <bits/kernel-features.h> -#include <tcb-offsets.h> -#include "lowlevel-atomic.h" - -	.text - -#define FUTEX_WAITERS		0x80000000 -#define FUTEX_OWNER_DIED	0x40000000 - -#ifdef __ASSUME_PRIVATE_FUTEX -# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ -	mov	#(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), tmp; \ -	extu.b	tmp, tmp; \ -	xor	tmp, reg -#else -# if FUTEX_WAIT == 0 -#  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ -	stc	gbr, tmp	; \ -	mov.w	99f, tmp2	; \ -	add	tmp2, tmp 	; \ -	mov.l	@tmp, tmp2	; \ -	bra	98f		; \ -	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \ -99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98:	extu.b	tmp, tmp	; \ -	xor	tmp, reg	; \ -	and	tmp2, reg -# else -#  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \ -	stc	gbr, tmp	; \ -	mov.w	99f, tmp2	; \ -	add	tmp2, tmp 	; \ -	mov.l	@tmp, tmp2	; \ -	bra	98f		; \ -	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \ -99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \ -98:	extu.b	tmp, tmp	; \ -	xor	tmp, reg	; \ -	and	tmp2, reg	; \ -	mov	#FUTEX_WAIT, tmp ; \ -	or	tmp, reg -# endif -#endif - -	.globl	__lll_robust_lock_wait -	.type	__lll_robust_lock_wait,@function -	.hidden	__lll_robust_lock_wait -	.align	5 -	cfi_startproc -__lll_robust_lock_wait: -	mov.l	r8, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r8, 0) -	mov	r5, r8 -	mov	#0, r7		/* No timeout.  */ -	mov	r6, r5 -	LOAD_FUTEX_WAIT (r5, r0, r1) - -4: -	mov	r4, r6 -	mov.l	.L_FUTEX_WAITERS, r0 -	or	r0, r6 -	shlr	r0		/* r0 = FUTEX_OWNER_DIED */ -	tst	r0, r4 -	bf/s	3f -	 cmp/eq	r4, r6 -	bt	1f - -	CMPXCHG (r4, @r8, r6, r2) -	bf	2f - -1: -	mov	r8, r4 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	mov.l	@r8, r2 - -2: -	tst	r2, r2 -	bf/s	4b -	 mov	r2, r4 - -	stc	gbr, r1 -	mov.w	.Ltidoff, r2 -	add	r2, r1 -	mov.l	@r1, r6 -	mov	#0, r3 -	CMPXCHG (r3, @r8, r6, r4) -	bf	4b -	mov	#0, r4 - -3: -	mov.l	@r15+, r8 -	ret -	 mov	r4, r0 -	cfi_endproc -	.align	2 -.L_FUTEX_WAITERS: -	.long	FUTEX_WAITERS -.Ltidoff: -	.word	TID - TLS_PRE_TCB_SIZE -	.size	__lll_robust_lock_wait,.-__lll_robust_lock_wait - - -	.globl	__lll_robust_timedlock_wait -	.type	__lll_robust_timedlock_wait,@function -	.hidden	__lll_robust_timedlock_wait -	.align	5 -	cfi_startproc -__lll_robust_timedlock_wait: -	/* Check for a valid timeout value.  */ -	mov.l	@(4,r6), r1 -	mov.l	.L1g, r0 -	cmp/hs	r0, r1 -	bt	3f - -	mov.l	r11, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r11, 0) -	mov.l	r10, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r10, 0) -	mov.l	r9, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r9, 0) -	mov.l	r8, @-r15 -	cfi_adjust_cfa_offset(4) -	cfi_rel_offset (r8, 0) -	mov	r7, r11 -	mov	r4, r10 -	mov	r6, r9 -	mov	r5, r8 - -	/* Stack frame for the timespec and timeval structs.  */ -	add	#-8, r15 -	cfi_adjust_cfa_offset(8) - -1: -	/* Get current time.  */ -	mov	r15, r4 -	mov	#0, r5 -	mov	#__NR_gettimeofday, r3 -	trapa	#0x12 -	SYSCALL_INST_PAD - -	/* Compute relative timeout.  */ -	mov.l	@(4,r15), r0 -	mov.w	.L1k, r1 -	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */ -	mov.l	@r9, r2 -	mov.l	@(4,r9), r3 -	mov.l	@r15, r0 -	sts	macl, r1 -	sub	r0, r2 -	clrt -	subc	r1, r3 -	bf	4f -	mov.l	.L1g, r1 -	add	r1, r3 -	add	#-1, r2 -4: -	cmp/pz	r2 -	bf	8f		/* Time is already up.  */ - -	mov.l	r2, @r15	/* Store relative timeout.  */ -	mov.l	r3, @(4,r15) - -	mov	r10, r6 -	mov.l	.L_FUTEX_WAITERS2, r0 -	or	r0, r6 -	shlr	r0		/* r0 = FUTEX_OWNER_DIED */ -	tst	r0, r4 -	bf/s	6f -	 cmp/eq	r4, r6 -	bt	2f - -	CMPXCHG (r4, @r8, r6, r2) -	bf/s	5f -	 mov	#0, r5 - -2: -	mov	r8, r4 -	mov	r11, r5 -	LOAD_FUTEX_WAIT (r5, r0, r1) -	mov	r10, r6 -	mov	r15, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	mov	r0, r5 - -	mov.l	@r8, r2 - -5: -	tst	r2, r2 -	bf/s	7f -	 mov	r2, r10 - -	stc	gbr, r1 -	mov.w	.Ltidoff2, r2 -	add	r2, r1 -	mov.l	@r1, r4 -	mov	#0, r3 -	CMPXCHG (r3, @r8, r4, r10) -	bf	7f -	mov	#0, r0 - -6: -	add	#8, r15 -	mov.l	@r15+, r8 -	mov.l	@r15+, r9 -	mov.l	@r15+, r10 -	rts -	 mov.l	@r15+, r11 - -7: -	/* Check whether the time expired.  */ -	mov	#-ETIMEDOUT, r1 -	cmp/eq	r5, r1 -	bf	1b - -8: -	bra	6b -	 mov	#ETIMEDOUT, r0 -3: -	rts -	 mov	#EINVAL, r0 -	cfi_endproc -	.align	2 -.L_FUTEX_WAITERS2: -	.long	FUTEX_WAITERS -.L1g: -	.long	1000000000 -.Ltidoff2: -	.word	TID - TLS_PRE_TCB_SIZE -.L1k: -	.word	1000 -	.size	__lll_robust_timedlock_wait,.-__lll_robust_timedlock_wait diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S deleted file mode 100644 index 58a9cdef5..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S +++ /dev/null @@ -1,215 +0,0 @@ -/* Copyright (C) 2003, 2004, 2007, 2008 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelbarrier.h> -#include "lowlevel-atomic.h" - -	.text - -	.globl	pthread_barrier_wait -	.type	pthread_barrier_wait,@function -	.align	5 -pthread_barrier_wait: -	mov.l	r9, @-r15 -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	mov	r4, r8 - -	/* Get the mutex.  */ -	mov	#0, r3 -	mov	#1, r4 -	CMPXCHG (r3, @(MUTEX,r8), r4, r2) -	bf	1f - -	/* One less waiter.  If this was the last one needed wake -	   everybody.  */ -2: -	mov.l	@(LEFT,r8), r0 -	add	#-1, r0 -	mov.l	r0, @(LEFT,r8) -	tst	r0, r0 -	bt	3f - -	/* There are more threads to come.  */ -	mov.l	@(CURR_EVENT,r8), r6 - -	/* Release the mutex.  */ -	DEC (@(MUTEX,r8), r2) -	tst	r2, r2 -	bf	6f -7: -	/* Wait for the remaining threads.  The call will return immediately -	   if the CURR_EVENT memory has meanwhile been changed.  */ -	mov	r8, r4 -#if CURR_EVENT != 0 -	add	#CURR_EVENT, r4 -#endif -#if FUTEX_WAIT == 0 -	mov.l	@(PRIVATE,r8), r5 -#else -	mov	#FUTEX_WAIT, r5 -	mov.l	@(PRIVATE,r8), r0 -	or	r0, r5 -#endif -	mov	#0, r7 -8: -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	/* Don't return on spurious wakeups.  The syscall does not change -	   any register except r0 so there is no need to reload any of -	   them.  */ -	mov.l	@(CURR_EVENT,r8), r0 -	cmp/eq	r0, r6 -	bt	8b - -	/* Increment LEFT.  If this brings the count back to the -	   initial count unlock the object.  */ -	mov	#1, r3 -	mov.l	@(INIT_COUNT,r8), r4 -	XADD	(r3, @(LEFT,r8), r2, r5) -	add	#-1, r4 -	cmp/eq	r2, r4 -	bf	10f - -	/* Release the mutex.  We cannot release the lock before -	   waking the waiting threads since otherwise a new thread might -	   arrive and gets waken up, too.  */ -	DEC (@(MUTEX,r8), r2) -	tst	r2, r2 -	bf	9f - -10: -	mov	#0, r0		/* != PTHREAD_BARRIER_SERIAL_THREAD */ -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	rts -	 mov.l	@r15+, r9 - -3: -	/* The necessary number of threads arrived.  */ -	mov.l	@(CURR_EVENT,r8), r1 -	add	#1, r1 -	mov.l	r1, @(CURR_EVENT,r8) - -	/* Wake up all waiters.  The count is a signed number in the kernel -	   so 0x7fffffff is the highest value.  */ -	mov.l	.Lall, r6 -	mov	r8, r4 -#if CURR_EVENT != 0 -	add	#CURR_EVENT, r4 -#endif -	mov	#0, r7 -	mov	#FUTEX_WAKE, r5 -	mov.l	@(PRIVATE,r8), r0 -	or	r0, r5 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	/* Increment LEFT.  If this brings the count back to the -	   initial count unlock the object.  */ -	mov	#1, r3 -	mov.l	@(INIT_COUNT,r8), r4 -	XADD	(r3, @(LEFT,r8), r2, r5) -	add	#-1, r4 -	cmp/eq	r2, r4 -	bf	5f - -	/* Release the mutex.  */ -	DEC (@(MUTEX,r8), r2) -	tst	r2, r2 -	bf	4f -5: -	mov	#-1, r0		/* == PTHREAD_BARRIER_SERIAL_THREAD */ -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	rts -	 mov.l	@r15+, r9 - -1: -	mov.l	@(PRIVATE,r8), r6 -	mov	#LLL_SHARED, r0 -	extu.b	r0, r0 -	xor	r0, r6 -	mov	r2, r4 -	mov	r8, r5 -	mov.l	.Lwait0, r1 -	bsrf	r1 -	 add	#MUTEX, r5 -.Lwait0b: -	bra	2b -	 nop - -4: -	mov.l	@(PRIVATE,r8), r5 -	mov	#LLL_SHARED, r0 -	extu.b	r0, r0 -	xor	r0, r5 -	mov	r8, r4 -	mov.l	.Lwake0, r1 -	bsrf	r1 -	 add	#MUTEX, r4 -.Lwake0b: -	bra	5b -	 nop - -6: -	mov	r6, r9 -	mov.l	@(PRIVATE,r8), r5 -	mov	#LLL_SHARED, r0 -	extu.b	r0, r0 -	xor	r0, r5 -	mov	r8, r4 -	mov.l	.Lwake1, r1 -	bsrf	r1 -	 add	#MUTEX, r4 -.Lwake1b: -	bra	7b -	 mov	r9, r6 - -9:	 -	mov	r6, r9 -	mov.l	@(PRIVATE,r8), r5 -	mov	#LLL_SHARED, r0 -	extu.b	r0, r0 -	xor	r0, r5 -	mov	r8, r4 -	mov.l	.Lwake2, r1 -	bsrf	r1 -	 add	#MUTEX, r4 -.Lwake2b: -	bra	10b -	 mov	r9, r6 - -	.align	2 -.Lall: -	.long	0x7fffffff -.Lwait0: -	.long	__lll_lock_wait-.Lwait0b -.Lwake0: -	.long	__lll_unlock_wake-.Lwake0b -.Lwake1: -	.long	__lll_unlock_wake-.Lwake1b -.Lwake2: -	.long	__lll_unlock_wake-.Lwake2b -	.size	pthread_barrier_wait,.-pthread_barrier_wait diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S deleted file mode 100644 index ca0fe7966..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S +++ /dev/null @@ -1,262 +0,0 @@ -/* Copyright (C) 2003, 2004, 2006, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelcond.h> -#include <bits/kernel-features.h> -#include <pthread-pi-defines.h> -#include <pthread-errnos.h> -#include <tcb-offsets.h> -#include "lowlevel-atomic.h" - -	.text - -	/* int pthread_cond_broadcast (pthread_cond_t *cond) */ -	.globl	__pthread_cond_broadcast -	.type	__pthread_cond_broadcast, @function -	.protected	__pthread_cond_broadcast -	.align	5 -__pthread_cond_broadcast: -	mov.l   r10, @-r15 -	mov.l   r9, @-r15 -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	mov	r4, r8 - -	/* Get internal lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if cond_lock != 0 -	CMPXCHG (r3, @(cond_lock,r8), r4, r2) -#else -	CMPXCHG (r3, @r8, r4, r2) -#endif -	bf	1f -2: -	mov.l	@(total_seq+4,r8),r0 -	mov.l	@(total_seq,r8),r1 -	mov.l	@(wakeup_seq+4,r8), r2 -	cmp/hi	r2, r0 -	bt	3f -	cmp/hi	r0, r2 -	bt	4f -	mov.l	@(wakeup_seq,r8), r2 -	cmp/hi	r2, r1 -	bf	4f - -3: -	/* Cause all currently waiting threads to recognize they are -	   woken up.  */ -	mov.l	r1, @(wakeup_seq,r8) -	mov.l	r0, @(wakeup_seq+4,r8) -	mov.l	r1, @(woken_seq,r8) -	mov.l	r0, @(woken_seq+4,r8) -	mov.l	@(broadcast_seq,r8), r2 -	add	#1, r2 -	mov.l	r2, @(broadcast_seq,r8) -	add	r1, r1 -	mov	r1, r10 -	mov.l	r10, @(cond_futex,r8) - -	/* Get the address of the mutex used.  */ -	mov.l	@(dep_mutex,r8), r9 - -	/* Unlock.  */ -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bf	7f - -8: -	/* Don't use requeue for pshared condvars.  */ -	mov	#-1, r0 -	cmp/eq	r0, r9 -	mov	r8, r4 -	bt/s	9f -	 add	#cond_futex, r4 - -	/* XXX: The kernel only supports FUTEX_CMP_REQUEUE to the same -	   type of futex (private resp. shared).  */ -	mov.l	@(MUTEX_KIND,r9), r0 -	tst	#(PI_BIT|PS_BIT), r0 -	bf	9f - -	/* Wake up all threads.  */ -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_CMP_REQUEUE, r0 -	or	r0, r5 -#endif -	mov	#1, r6 -	mov	#-1, r7 -	shlr	r7		/* r7 = 0x7fffffff */ -	mov	r9, r0 -# if MUTEX_FUTEX != 0 -	add	#MUTEX_FUTEX, r0 -# endif -	mov	r10, r1 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x16 -	SYSCALL_INST_PAD - -	/* For any kind of error, which mainly is EAGAIN, we try again -	   with WAKE.  The general test also covers running on old -	   kernels.  */ -	mov	r0, r1 -	mov	#-12, r2 -	shad	r2, r1 -	not	r1, r1 -	tst	r1, r1 -	mov	r8, r4 -	bt/s	9f -	 add	#cond_futex, r4 - -10: -	mov	#0, r0 -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r9 -	rts -	 mov.l	@r15+, r10 - -4: -	/* Unlock.  */ -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bf	5f -6: -	mov	#0, r0 -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r9 -	rts -	 mov.l	@r15+, r10 - -1: -	/* Initial locking failed.  */ -	mov	r8, r5 -#if cond_lock != 0 -	add	#cond_lock, r5 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r6 -	mov	#LLL_SHARED, r6 -99: -	extu.b	r6, r6 -	mov.l	.Lwait5, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait5b: -	bra	2b -	 nop - -5: -	/* Unlock in loop requires wakeup.  */ -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lwake5, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lwake5b: -	bra	6b -	 nop - -7: -	/* Unlock in loop requires wakeup.  */ -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov	#-1, r0 -	cmp/eq	r0, r9 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lwake6, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lwake6b: -	bra	8b -	 nop - -9: -	mov	#-1, r0 -	cmp/eq	r0, r9 -	bt/s	99f -	 mov	#FUTEX_WAKE, r5 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAKE, r0 -	or	r0, r5 -#endif -99: -	mov	#-1, r6 -	shlr	r6		/* r6 = 0x7fffffff */ -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	bra	10b -	 nop - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif - -	.align	2 -.Lwait5: -	.long	__lll_lock_wait-.Lwait5b -.Lwake5: -	.long	__lll_unlock_wake-.Lwake5b -.Lwake6: -	.long	__lll_unlock_wake-.Lwake6b -	.size	__pthread_cond_broadcast, .-__pthread_cond_broadcast -weak_alias (__pthread_cond_broadcast, pthread_cond_broadcast) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S deleted file mode 100644 index 8a9bb0b65..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S +++ /dev/null @@ -1,189 +0,0 @@ -/* Copyright (C) 2003, 2004, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelcond.h> -#include <bits/kernel-features.h> -#include <pthread-errnos.h> -#include <tcb-offsets.h> -#include "lowlevel-atomic.h" - -	.text - -	/* int pthread_cond_signal (pthread_cond_t *cond) */ -	.globl	__pthread_cond_signal -	.type	__pthread_cond_signal, @function -	.protected	__pthread_cond_signal -	.align	5 -__pthread_cond_signal: -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	mov	r4, r8 - -	/* Get internal lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if cond_lock != 0 -	CMPXCHG (r3, @(cond_lock,r8), r4, r2) -#else -	CMPXCHG (r3, @r8, r4, r2) -#endif -	bf	1f -2: -	mov.l	@(total_seq+4,r8),r0 -	mov.l	@(total_seq,r8),r1 -	mov.l	@(wakeup_seq+4,r8), r2 -	cmp/hi	r2, r0 -	bt	3f -	cmp/hi	r0, r2 -	bt	4f -	mov.l	@(wakeup_seq,r8), r2 -	cmp/hi	r2, r1 -	bf	4f - -3: -	/* Bump the wakeup number.  */ -	mov	#1, r2 -	mov	#0, r3 -	clrt -	mov.l	@(wakeup_seq,r8),r0 -	mov.l	@(wakeup_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(wakeup_seq,r8) -	mov.l	r1,@(wakeup_seq+4,r8) -	mov.l	@(cond_futex,r8),r0 -	add	r2, r0 -	mov.l	r0,@(cond_futex,r8) - -	/* Wake up one thread.  */ -	mov	r8, r4 -	add	#cond_futex, r4 -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bt/s	99f -	 mov	#FUTEX_WAKE_OP, r5 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAKE_OP, r0 -	or	r0, r5 -#endif -99: -	mov	#1, r6 -	mov	#0, r7 -	mov	r8, r0 -	add	#cond_lock, r0 -	mov.l	.Lfutexop, r1 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	/* For any kind of error, we try again with WAKE. -	   The general test also covers running on old kernels.  */ -	mov	r0, r1 -	mov	#-12, r2 -	shad	r2, r1 -	not	r1, r1 -	tst	r1, r1 -	bt	7f - -6: -	mov	#0, r0 -	lds.l	@r15+, pr -	rts -	 mov.l	@r15+, r8 - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif -	.align	2 -.Lfutexop: -	.long	FUTEX_OP_CLEAR_WAKE_IF_GT_ONE - -7: -	/* r5 should be either FUTEX_WAKE_OP or -	   FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG from the previous syscall.  */ -	mov	#(FUTEX_WAKE ^ FUTEX_WAKE_OP), r0 -	xor	r0, r5 -	trapa	#0x14 -	SYSCALL_INST_PAD - -4: -	/* Unlock.  */ -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bt	6b - -5: -	/* Unlock in loop requires wakeup.  */ -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99:	 -	mov.l	.Lwake4, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lwake4b: -	bra	6b -	 nop - -1: -	/* Initial locking failed.  */ -	mov	r8, r5 -#if cond_lock != 0 -	add	#cond_lock, r5 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r6 -	mov	#LLL_SHARED, r6 -99:	 -	extu.b	r6, r6 -	mov.l	.Lwait4, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait4b: -	bra	2b -	 nop - -	.align	2 -.Lwait4: -	.long	__lll_lock_wait-.Lwait4b -.Lwake4: -	.long	__lll_unlock_wake-.Lwake4b -	.size	__pthread_cond_signal, .-__pthread_cond_signal -weak_alias (__pthread_cond_signal, pthread_cond_signal) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S deleted file mode 100644 index 0f79e1821..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S +++ /dev/null @@ -1,860 +0,0 @@ -/* Copyright (C) 2003, 2004, 2006, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelcond.h> -#include <pthread-errnos.h> -#include <bits/kernel-features.h> -#include <tcb-offsets.h> -#include "lowlevel-atomic.h" - -	.text - -/* int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, -			       const struct timespec *abstime)  */ -	.globl	__pthread_cond_timedwait -	.type	__pthread_cond_timedwait, @function -	.protected	__pthread_cond_timedwait -	.align	5 -__pthread_cond_timedwait: -.LSTARTCODE: -	mov.l	r8, @-r15 -.Lpush_r8: -	mov.l	r9, @-r15 -.Lpush_r9: -	mov.l	r10, @-r15 -.Lpush_r10: -	mov.l	r11, @-r15 -.Lpush_r11: -	mov.l	r12, @-r15 -.Lpush_r12: -	mov.l	r13, @-r15 -.Lpush_r13: -	sts.l	pr, @-r15 -.Lpush_pr: -	add	#-64, r15 -.Lalloc: -	mov	r4, r8 -	mov	r5, r9 -	mov	r6, r13 -#ifdef __PIC__ -	mova	.Lgot0, r0 -	mov.l	.Lgot0, r12 -	add	r0, r12 -#endif - -	mov.l	@(4,r13), r0 -	mov.l	.L1g, r1 -	cmp/hs	r1, r0 -	bf	0f -	bra	18f -	 mov	#EINVAL, r0 -0: -	/* Get internal lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if cond_lock != 0 -	CMPXCHG (r3, @(cond_lock,r8), r4, r2) -#else -	CMPXCHG (r3, @r8, r4, r2) -#endif -	bt	2f -	bra	1f -	 nop -#ifdef __PIC__ -	.align	2 -.Lgot0: -	.long	_GLOBAL_OFFSET_TABLE_ -#endif - -2: -	/* Store the reference to the mutex.  If there is already a -	   different value in there this is a bad user bug.  */ -	mov.l	@(dep_mutex,r8),r0 -	cmp/eq	#-1, r0 -	bt	17f -	mov.l	r9, @(dep_mutex,r8) - -17: -	/* Unlock the mutex.  */ -	mov.l	.Lmunlock1, r1 -	mov	#0, r5 -	bsrf	r1 -	 mov	r9, r4 -.Lmunlock1b: - -	tst	r0, r0 -	bt	0f -	bra	16f -	 nop -0: -	mov	#1, r2 -	mov	#0, r3 - -	clrt -	mov.l	@(total_seq,r8),r0 -	mov.l	@(total_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(total_seq,r8) -	mov.l	r1,@(total_seq+4,r8) -	mov.l	@(cond_futex,r8), r0 -	add	r2, r0 -	mov.l	r0, @(cond_futex,r8) -	mov	#(1 << nwaiters_shift), r2 -	mov.l	@(cond_nwaiters,r8), r0 -	add	r2, r0 -	mov.l	r0, @(cond_nwaiters,r8) - -	/* Get and store current wakeup_seq value.  */ -	mov.l	@(wakeup_seq,r8), r10 -	mov.l	@(wakeup_seq+4,r8), r11 -	mov.l	@(broadcast_seq,r8), r0 -	mov.l	r0, @(4,r15) - -8: -	/* Get current time.  */ -#ifdef __NR_clock_gettime -	/* Get the clock number.	 */ -	mov.l	@(cond_nwaiters,r8), r4 -	mov	#((1 << nwaiters_shift) - 1), r0 -	and	r0, r4 -	/* Only clocks 0 and 1 are allowed.  Both are handled in the -	   kernel.  */ -	mov	r15, r5 -	add	#16, r5 -	mov.w	.L__NR_clock_gettime, r3 -	trapa	#0x12 -	SYSCALL_INST_PAD -# ifndef __ASSUME_POSIX_TIMERS -	cmp/eq	#-ENOSYS, r0 -	bt	19f -# endif - -	/* Compute relative timeout.  */ -	mov.l	@r13, r2 -	mov.l	@(4,r13), r3 -	mov.l	@(16,r15), r0 -	bra	0f -	 mov.l	@(20,r15), r1 -.L__NR_clock_gettime: -	.word	__NR_clock_gettime - -# ifndef __ASSUME_POSIX_TIMERS -19: -	mov	r15, r4 -	add	#16, r4 -	mov	#0, r5 -	mov	#__NR_gettimeofday, r3 -	trapa	#0x12 -	SYSCALL_INST_PAD - -	/* Compute relative timeout.  */ -	mov.l	@(20,r15), r0 -	mov.w	.L1k, r1 -	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */ -	mov.l	@r13, r2 -	mov.l	@(4,r13), r3 -	mov.l	@(16,r15), r0 -	sts	macl, r1 -#endif -0: -#else -	mov	r15, r4 -	add	#16, r4 -	mov	#0, r5 -	mov	#__NR_gettimeofday, r3 -	trapa	#0x12 -	SYSCALL_INST_PAD - -	/* Compute relative timeout.  */ -	mov.l	@(20,r15), r0 -	mov.w	.L1k, r1 -	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */ -	mov.l	@r13, r2 -	mov.l	@(4,r13), r3 -	mov.l	@(16,r15), r0 -	sts	macl, r1 -#endif -	sub	r0, r2 -	clrt -	subc	r1, r3 -	bf	12f -	mov.l	.L1g, r1 -	add	r1, r3 -	add	#-1, r2 -12: -	mov	#-ETIMEDOUT, r1 -	mov.l	r1, @(12,r15) -	cmp/pz	r2 -	bf	6f		/* Time is already up.  */ - -	/* Store relative timeout.  */ -	mov.l	r2, @(16,r15) -	mov.l	r3, @(20,r15) -	mov.l	@(cond_futex,r8), r1 -	mov.l	r1, @(8,r15) - -	/* Unlock.  */ -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bt	4f -	bra	3f -	 nop -4: -.LcleanupSTART: -	mov.l	.Lenable1, r1 -	bsrf	r1 -	 nop -.Lenable1b: -	mov.l	r0, @r15 - -	mov	r15, r7 -	add	#16, r7 -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bt/s	99f -	 mov	#FUTEX_WAIT, r5 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_WAIT|FUTEX_PRIVATE_FLAG), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAIT, r0 -	or	r0, r5 -#endif -99: -	mov.l	@(8,r15), r6 -	mov	r8, r4 -	add	#cond_futex, r4 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	mov.l	r0, @(12,r15) - -	mov.l	.Ldisable1, r1 -	bsrf	r1 -	 mov.l	@r15, r4 -.Ldisable1b: -.LcleanupEND: - -	/* Lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if cond_lock != 0 -	CMPXCHG (r3, @(cond_lock,r8), r4, r2) -#else -	CMPXCHG (r3, @r8, r4, r2) -#endif -	bf	5f -6: -	mov.l	@(broadcast_seq,r8), r0 -	mov.l	@(4,r15), r1 -	cmp/eq	r0, r1 -	bf	23f - -	mov.l	@(woken_seq,r8), r0 -	mov.l	@(woken_seq+4,r8), r1 - -	mov.l	@(wakeup_seq,r8), r2 -	mov.l	@(wakeup_seq+4,r8), r3 - -	cmp/eq	r3, r11 -	bf	7f -	cmp/eq	r2, r10 -	bt	15f -7: -	cmp/eq	r1, r3 -	bf	9f -	cmp/eq	r0, r2 -	bf	9f -15: -	mov.l	@(12,r15),r0 -	cmp/eq	#-ETIMEDOUT, r0 -	bf	8b - -	mov	#1, r2 -	mov	#0, r3 - -	clrt -	mov.l	@(wakeup_seq,r8),r0 -	mov.l	@(wakeup_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(wakeup_seq,r8) -	mov.l	r1,@(wakeup_seq+4,r8) -	mov.l	@(cond_futex,r8),r0 -	add	r2, r0 -	mov.l	r0,@(cond_futex,r8) -	mov	#ETIMEDOUT, r0 -	bra	14f -	 mov.l	r0, @(24,r15) - -23: -	mov	#0, r0 -	bra	24f -	 mov.l	r0, @(24,r15) - -9: -	mov	#0, r0 -	mov.l	r0, @(24,r15) -14: -	mov	#1, r2 -	mov	#0, r3 - -	clrt -	mov.l	@(woken_seq,r8),r0 -	mov.l	@(woken_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(woken_seq,r8) -	mov.l	r1,@(woken_seq+4,r8) - -24: -	mov	#(1 << nwaiters_shift), r2 -	mov.l	@(cond_nwaiters,r8),r0 -	sub	r2, r0 -	mov.l	r0,@(cond_nwaiters,r8) - -	/* Wake up a thread which wants to destroy the condvar object.  */ -	mov.l	@(total_seq,r8),r0 -	mov.l	@(total_seq+4,r8),r1 -	and	r1, r0 -	not	r0, r0 -	cmp/eq	#0, r0 -	bf/s	25f -	 mov	#((1 << nwaiters_shift) - 1), r1 -	not	r1, r1 -	mov.l	@(cond_nwaiters,r8),r0 -	tst	r1, r0 -	bf	25f - -	mov	r8, r4 -	add	#cond_nwaiters, r4 -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bt/s	99f -	 mov	#FUTEX_WAKE, r5 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAKE, r0 -	or	r0, r5 -#endif -99: -	mov	#1, r6 -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -25: -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bf	10f - -11: -	mov	r9, r4 -	mov.l	.Lmlocki1, r1 -	bsrf	r1 -	 nop -.Lmlocki1b: - -	/* We return the result of the mutex_lock operation if it failed.  */ -	tst	r0, r0 -	bf	18f -	mov.l	@(24,r15), r0 - -18: -	add	#64, r15 -	lds.l	@r15+, pr -	mov.l	@r15+, r13 -	mov.l	@r15+, r12 -	mov.l	@r15+, r11 -	mov.l	@r15+, r10 -	mov.l	@r15+, r9 -	rts -	 mov.l	@r15+, r8 - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif -.L1k: -	.word	1000 -	.align	2 -.Lmunlock1: -	.long	__pthread_mutex_unlock_usercnt-.Lmunlock1b -.Lenable1: -	.long	__pthread_enable_asynccancel-.Lenable1b -.Ldisable1: -	.long	__pthread_disable_asynccancel-.Ldisable1b -.Lmlocki1: -	.long	__pthread_mutex_cond_lock-.Lmlocki1b -.L1g: -	.long	1000000000 - -1: -	/* Initial locking failed.  */ -	mov	r8, r5 -#if cond_lock != 0 -	add	#cond_lock, r5 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r6 -	mov	#LLL_SHARED, r6 -99: -	extu.b	r6, r6 -	mov.l	.Lwait2, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait2b: -	bra	2b -	 nop - -3: -	/* Unlock in loop requires wakeup.  */ -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lmwait2, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lmwait2b: -	bra	4b -	 nop - -5: -	/* Locking in loop failed.  */ -	mov	r8, r5 -#if cond_lock != 0 -	add	#cond_lock, r5 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r6 -	mov	#LLL_SHARED, r6 -99: -	extu.b	r6, r6 -	mov.l	.Lwait3, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait3b: -	bra	6b -	 nop - -10: -	/* Unlock after loop requires wakeup.  */ -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lmwait3, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lmwait3b: -	bra	11b -	 nop - -16: -	/* The initial unlocking of the mutex failed.  */ -	mov.l	r0, @(24,r15) -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bf	17f - -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lmwait4, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lmwait4b: -17: -	bra	18b -	 mov.l	@(24,r15), r0 - -	.align	2 -.Lwait2: -	.long	__lll_lock_wait-.Lwait2b -.Lmwait2: -	.long	__lll_unlock_wake-.Lmwait2b -.Lwait3: -	.long	__lll_lock_wait-.Lwait3b -.Lmwait3: -	.long	__lll_unlock_wake-.Lmwait3b -.Lmwait4: -	.long	__lll_unlock_wake-.Lmwait4b -	.size	__pthread_cond_timedwait, .-__pthread_cond_timedwait -weak_alias (__pthread_cond_timedwait, pthread_cond_timedwait) - - -	.type	__condvar_tw_cleanup, @function -__condvar_tw_cleanup: -	mov	r4, r11 - -	/* Get internal lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if cond_lock != 0 -	CMPXCHG (r3, @(cond_lock,r8), r4, r2) -#else -	CMPXCHG (r3, @r8, r4, r2) -#endif -	bt	1f -	 nop - -	mov	r8, r5 -#if cond_lock != 0 -	add	#cond_lock, r5 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r6 -	mov	#LLL_SHARED, r6 -99: -	extu.b	r6, r6 -	mov.l	.Lwait5, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait5b: - -1: -	mov.l	@(broadcast_seq,r8), r0 -	mov.l	@(4,r15), r1 -	cmp/eq	r0, r1 -	bf	3f - -	mov	#1, r2 -	mov	#0, r3 - -	/* We increment the wakeup_seq counter only if it is lower than -	   total_seq.  If this is not the case the thread was woken and -	   then canceled.  In this case we ignore the signal.  */ -	mov.l	@(total_seq+4,r8), r0 -	mov.l	@(wakeup_seq+4,r8), r1 -	cmp/hi	r1, r0 -	bt/s	6f -	 cmp/hi	r0, r1 -	bt	7f -	mov.l	@(total_seq,r8), r0 -	mov.l	@(wakeup_seq,r8), r1 -	cmp/hs	r0, r1 -	bt	7f - -6: -	clrt -	mov.l	@(wakeup_seq,r8),r0 -	mov.l	@(wakeup_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(wakeup_seq,r8) -	mov.l	r1,@(wakeup_seq+4,r8) -	mov.l	@(cond_futex,r8),r0 -	add	r2, r0 -	mov.l	r0,@(cond_futex,r8) - -7: -	clrt -	mov.l	@(woken_seq,r8),r0 -	mov.l	@(woken_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(woken_seq,r8) -	mov.l	r1,@(woken_seq+4,r8) - -3: -	mov	#(1 << nwaiters_shift), r2 -	mov.l	@(cond_nwaiters,r8),r0 -	sub	r2, r0 -	mov.l	r0,@(cond_nwaiters,r8) - -	/* Wake up a thread which wants to destroy the condvar object.  */ -	mov	#0, r10 -	mov.l	@(total_seq,r8),r0 -	mov.l	@(total_seq+4,r8),r1 -	and	r1, r0 -	not	r0, r0 -	cmp/eq	#0, r0 -	bf/s	4f -	 mov	#((1 << nwaiters_shift) - 1), r1 -	not	r1, r1 -	mov.l	@(cond_nwaiters,r8),r0 -	tst	r1, r0 -	bf	4f - -	mov	r8, r4 -	add	#cond_nwaiters, r4 -	mov	#FUTEX_WAKE, r5 -	mov	#1, r6 -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	mov	#1, r10 - -4: -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bt	2f - -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lmwait5, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lmwait5b: - -2: -	/* Wake up all waiters to make sure no signal gets lost.  */ -	tst	r10, r10 -	bf/s	5f -	 mov	r8, r4 -	add	#cond_futex, r4 -	mov	#FUTEX_WAKE, r5 -	mov	#-1, r6 -	shlr	r6		/* r6 = 0x7fffffff */ -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -5: -        mov.l   .Lmlocki5, r1 -        bsrf    r1 -         mov     r9, r4 -.Lmlocki5b: - -.LcallUR: -	mov.l	.Lresume, r1 -#ifdef __PIC__ -	add	r12, r1 -#endif -	jsr	@r1 -	 mov	r11, r4 -	sleep - -	.align	2 -.Lwait5: -	.long   __lll_lock_wait-.Lwait5b -.Lmwait5: -        .long   __lll_unlock_wake-.Lmwait5b -.Lmlocki5: -	.long   __pthread_mutex_cond_lock-.Lmlocki5b -.Lresume: -#ifdef __PIC__ -	.long	_Unwind_Resume@GOTOFF -#else -	.long	_Unwind_Resume -#endif -.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: -	.ualong	.LcleanupSTART-.LSTARTCODE -	.ualong	.LcleanupEND-.LcleanupSTART -	.ualong	__condvar_tw_cleanup-.LSTARTCODE -	.uleb128  0 -	.ualong	.LcallUR-.LSTARTCODE -	.ualong	.LENDCODE-.LcallUR -	.ualong	0 -	.uleb128  0 -.Lcstend: - -	.section .eh_frame,"a",@progbits -.LSTARTFRAME: -	.ualong	.LENDCIE-.LSTARTCIE		! Length of the CIE. -.LSTARTCIE: -	.ualong	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	0x11				! 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 -	.ualong	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 -	.ualong	__gcc_personality_v0 -	.byte	0x0				! LSDA Encoding: absolute -#endif -	.byte 0x0c				! DW_CFA_def_cfa -	.uleb128 0xf -	.uleb128 0 -	.align 2 -.LENDCIE: - -	.ualong	.LENDFDE-.LSTARTFDE		! Length of the FDE. -.LSTARTFDE: -	.ualong	.LSTARTFDE-.LSTARTFRAME		! CIE pointer. -#ifdef SHARED -	.ualong	.LSTARTCODE-.			! PC-relative start address -						! of the code. -#else -	.ualong	.LSTARTCODE			! Start address of the code. -#endif -	.ualong	.LENDCODE-.LSTARTCODE		! Length of the code. -	.uleb128 4				! Augmentation size -#ifdef SHARED -	.ualong	.LexceptSTART-. -#else -	.ualong	.LexceptSTART -#endif -	.byte	0x4 -	.ualong	.Lpush_r8-.LSTARTCODE -	.byte	0xe -	.uleb128 4 -	.byte	0x88 -	.uleb128 1 -	.byte	0x4 -	.ualong	.Lpush_r9-.Lpush_r8 -	.byte	0xe -	.uleb128 8 -	.byte	0x89 -	.uleb128 2 -	.byte	0x4 -	.ualong	.Lpush_r10-.Lpush_r9 -	.byte	0xe -	.uleb128 12 -	.byte	0x8a -	.uleb128 3 -	.byte	0x4 -	.ualong	.Lpush_r11-.Lpush_r10 -	.byte	0xe -	.uleb128 16 -	.byte	0x8b -	.uleb128 4 -	.byte	0x4 -	.ualong	.Lpush_r12-.Lpush_r11 -	.byte	0xe -	.uleb128 20 -	.byte	0x8c -	.uleb128 5 -	.byte	0x4 -	.ualong	.Lpush_r13-.Lpush_r12 -	.byte	0xe -	.uleb128 24 -	.byte	0x8d -	.uleb128 6 -	.byte	0x4 -	.ualong	.Lpush_pr-.Lpush_r13 -	.byte	0xe -	.uleb128 28 -	.byte	0x91 -	.uleb128 7 -	.byte	0x4 -	.ualong	.Lalloc-.Lpush_pr -	.byte	0xe -	.uleb128 92 -	.align	2 -.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/sh/pthread_cond_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S deleted file mode 100644 index e1c5c41ba..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S +++ /dev/null @@ -1,753 +0,0 @@ -/* Copyright (C) 2003, 2004, 2006, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelcond.h> -#include <tcb-offsets.h> -#include <bits/kernel-features.h> -#include "lowlevel-atomic.h" - -	.text - -/* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex)  */ -	.globl	__pthread_cond_wait -	.type	__pthread_cond_wait, @function -	.protected	__pthread_cond_wait -	.align	5 -__pthread_cond_wait: -.LSTARTCODE: -	mov.l	r8, @-r15 -.Lpush_r8: -	mov.l	r9, @-r15 -.Lpush_r9: -	mov.l	r10, @-r15 -.Lpush_r10: -	mov.l	r11, @-r15 -.Lpush_r11: -	mov.l	r12, @-r15 -.Lpush_r12: -	sts.l	pr, @-r15 -.Lpush_pr: -	add	#-48, r15 -.Lalloc: -	mov	r4, r8 -	mov	r5, r9 -#ifdef __PIC__ -	mova	.Lgot0, r0 -	mov.l	.Lgot0, r12 -	add	r0, r12 -#endif - -	/* Get internal lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if cond_lock != 0 -	CMPXCHG (r3, @(cond_lock,r8), r4, r2) -#else -	CMPXCHG (r3, @r8, r4, r2) -#endif -	bt	2f -	bra	1f -	 nop -#ifdef __PIC__ -	.align	2 -.Lgot0: -	.long	_GLOBAL_OFFSET_TABLE_ -#endif - -2: -	/* Store the reference to the mutex.  If there is already a -	   different value in there this is a bad user bug.  */ -	mov.l	@(dep_mutex,r8),r0 -	cmp/eq	#-1, r0 -	bt	15f -	mov.l	r9, @(dep_mutex,r8) - -15: -	/* Unlock the mutex.  */ -	mov.l	.Lmunlock0, r1 -	mov	#0, r5 -	bsrf	r1 -	 mov	r9, r4 -.Lmunlock0b: - -	tst	r0, r0 -	bt	0f -	bra	12f -	 nop -0: -	mov	#1, r2 -	mov	#0, r3 - -	clrt -	mov.l	@(total_seq,r8),r0 -	mov.l	@(total_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(total_seq,r8) -	mov.l	r1,@(total_seq+4,r8) -	mov.l	@(cond_futex,r8),r0 -	add	r2, r0 -	mov.l	r0,@(cond_futex,r8) -	mov	#(1 << nwaiters_shift), r2 -	mov.l	@(cond_nwaiters,r8), r0 -	add	r2, r0 -	mov.l	r0, @(cond_nwaiters,r8) - -	/* Get and store current wakeup_seq value.  */ -	mov.l	@(wakeup_seq,r8), r10 -	mov.l	@(wakeup_seq+4,r8), r11 -	mov.l	@(broadcast_seq,r8), r0 -	mov.l	r0, @(4,r15) - -8: -	mov.l	@(cond_futex,r8),r0 -	mov.l	r0, @(8,r15) - -	/* Unlock.  */ -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bf	3f -4: -.LcleanupSTART: -	mov.l	.Lenable0, r1 -	bsrf	r1 -	 nop -.Lenable0b: -	mov.l	r0, @r15 - -	mov	#0, r7 -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bt/s	99f -	 mov	#FUTEX_WAIT, r5 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_WAIT|FUTEX_PRIVATE_FLAG), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff0, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAIT, r0 -	or	r0, r5 -#endif -99: -	mov.l	@(8,r15), r6 -	mov	r8, r4 -	add	#cond_futex, r4 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	mov.l	.Ldisable0, r1 -	bsrf	r1 -	 mov.l	@r15, r4 -.Ldisable0b: -.LcleanupEND: - -	/* Lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if cond_lock != 0 -	CMPXCHG (r3, @(cond_lock,r8), r4, r2) -#else -	CMPXCHG (r3, @r8, r4, r2) -#endif -	bf	5f -6: -	mov.l	@(broadcast_seq,r8), r0 -	mov.l	@(4,r15), r1 -	cmp/eq	r0, r1 -	bf	16f - -	mov.l	@(woken_seq,r8), r0 -	mov.l	@(woken_seq+4,r8), r1 - -	mov.l	@(wakeup_seq,r8), r2 -	mov.l	@(wakeup_seq+4,r8), r3 - -	cmp/eq	r3, r11 -	bf	7f -	cmp/eq	r2, r10 -	bt	8b -7: -	cmp/eq	r1, r3 -	bf	9f -	cmp/eq	r0, r2 -	bt	8b -9: -	mov	#1, r2 -	mov	#0, r3 - -	clrt -	mov.l	@(woken_seq,r8),r0 -	mov.l	@(woken_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(woken_seq,r8) -	mov.l	r1,@(woken_seq+4,r8) - -16: -	mov	#(1 << nwaiters_shift), r2 -	mov.l	@(cond_nwaiters,r8),r0 -	sub	r2, r0 -	mov.l	r0,@(cond_nwaiters,r8) - -	/* Wake up a thread which wants to destroy the condvar object.  */ -	mov.l	@(total_seq,r8),r0 -	mov.l	@(total_seq+4,r8),r1 -	and	r1, r0 -	not	r0, r0 -	cmp/eq	#0, r0 -	bf/s	17f -	 mov	#((1 << nwaiters_shift) - 1), r1 -	not	r1, r1 -	mov.l	@(cond_nwaiters,r8),r0 -	tst	r1, r0 -	bf	17f - -	mov	r8, r4 -	add	#cond_nwaiters, r4 -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bt/s	99f -	 mov	#FUTEX_WAKE, r5 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff0, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAKE, r0 -	or	r0, r5 -#endif -99: -	mov	#1, r6 -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -17: -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bf	10f - -11: -	mov.l	.Lmlocki0, r1 -	bsrf	r1 -	 mov	r9, r4 -.Lmlocki0b: -	/* We return the result of the mutex_lock operation.  */ - -14: -	add	#48, r15 -	lds.l	@r15+, pr -	mov.l	@r15+, r12 -	mov.l	@r15+, r11 -	mov.l	@r15+, r10 -	mov.l	@r15+, r9 -	rts -	 mov.l	@r15+, r8 - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff0: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif -	.align	2 -.Lmunlock0: -	.long	__pthread_mutex_unlock_usercnt-.Lmunlock0b -.Lenable0: -	.long	__pthread_enable_asynccancel-.Lenable0b -.Ldisable0: -	.long	__pthread_disable_asynccancel-.Ldisable0b -.Lmlocki0: -	.long	__pthread_mutex_cond_lock-.Lmlocki0b - -1: -	/* Initial locking failed.  */ -	mov	r8, r5 -#if cond_lock != 0 -	add	#cond_lock, r5 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r6 -	mov	#LLL_SHARED, r6 -99: -	extu.b	r6, r6 -	mov.l	.Lwait0, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait0b: -	bra	2b -	 nop -3: -	/* Unlock in loop requires waekup.  */ -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lwake0, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lwake0b: -	bra	4b -	 nop - -5: -	/* Locking in loop failed.  */ -	mov	r8, r5 -#if cond_lock != 0 -	add	#cond_lock, r5 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r6 -	mov	#LLL_SHARED, r6 -99: -	extu.b	r6, r6 -	mov.l	.Lwait1, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait1b: -	bra	6b -	 nop - -10: -	/* Unlock after loop requires wakeup.  */ -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lwake1, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lwake1b: -	bra	11b -	 nop - -12: -	/* The initial unlocking of the mutex failed.  */ -	mov.l	r0, @(12,r15) -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bf	13f - -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lwake2, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lwake2b: - -13: -	bra	14b -	 mov.l	@(12,r15), r0 - -	.align	2 -.Lwait0: -	.long	__lll_lock_wait-.Lwait0b -.Lwake0: -	.long	__lll_unlock_wake-.Lwake0b -.Lwait1: -	.long	__lll_lock_wait-.Lwait1b -.Lwake1: -	.long	__lll_unlock_wake-.Lwake1b -.Lwake2: -	.long	__lll_unlock_wake-.Lwake2b -	.size	__pthread_cond_wait, .-__pthread_cond_wait -weak_alias (__pthread_cond_wait, pthread_cond_wait) - - -	.type	__condvar_w_cleanup, @function -__condvar_w_cleanup: -	mov	r4, r11 - -	/* Get internal lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if cond_lock != 0 -	CMPXCHG (r3, @(cond_lock,r8), r4, r2) -#else -	CMPXCHG (r3, @r8, r4, r2) -#endif -	bt	1f -	 nop - -	mov	r8, r5 -#if cond_lock != 0 -	add	#cond_lock, r5 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r6 -	mov	#LLL_SHARED, r6 -99: -	extu.b	r6, r6 -	mov.l	.Lwait3, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait3b: - -1: -	mov.l	@(broadcast_seq,r8), r0 -	mov.l	@(4,r15), r1 -	cmp/eq	r0, r1 -	bf	3f - -	mov	#1, r2 -	mov	#0, r3 - -	/* We increment the wakeup_seq counter only if it is lower than -	   total_seq.  If this is not the case the thread was woken and -	   then canceled.  In this case we ignore the signal.  */ -	mov.l	@(total_seq+4,r8), r0 -	mov.l	@(wakeup_seq+4,r8), r1 -	cmp/hi	r1, r0 -	bt/s	6f -	 cmp/hi	r0, r1 -	bt	7f -	mov.l	@(total_seq,r8), r0 -	mov.l	@(wakeup_seq,r8), r1 -	cmp/hs	r0, r1 -	bt	7f - -6: -	clrt -	mov.l	@(wakeup_seq,r8),r0 -	mov.l	@(wakeup_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(wakeup_seq,r8) -	mov.l	r1,@(wakeup_seq+4,r8) -	mov.l	@(cond_futex,r8),r0 -	add	r2, r0 -	mov.l	r0,@(cond_futex,r8) - -7: -	clrt -	mov.l	@(woken_seq,r8),r0 -	mov.l	@(woken_seq+4,r8),r1 -	addc	r2, r0 -	addc	r3, r1 -	mov.l	r0,@(woken_seq,r8) -	mov.l	r1,@(woken_seq+4,r8) - -3: -	mov	#(1 << nwaiters_shift), r2 -	mov.l	@(cond_nwaiters,r8),r0 -	sub	r2, r0 -	mov.l	r0,@(cond_nwaiters,r8) - -	/* Wake up a thread which wants to destroy the condvar object.  */ -	mov	#0, r10 -	mov.l	@(total_seq,r8),r0 -	mov.l	@(total_seq+4,r8),r1 -	and	r1, r0 -	not	r0, r0 -	cmp/eq	#0, r0 -	bf/s	4f -	 mov	#((1 << nwaiters_shift) - 1), r1 -	not	r1, r1 -	mov.l	@(cond_nwaiters,r8),r0 -	tst	r1, r0 -	bf	4f - -	mov	r8, r4 -	add	#cond_nwaiters, r4 -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bt/s	99f -	 mov	#FUTEX_WAKE, r5 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff1, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAKE, r0 -	or	r0, r5 -#endif -99: -	mov	#1, r6 -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	mov	#1, r10 - -4: -#if cond_lock != 0 -	DEC (@(cond_lock,r8), r2) -#else -	DEC (@r8, r2) -#endif -	tst	r2, r2 -	bt	2f - -	mov	r8, r4 -#if cond_lock != 0 -	add	#cond_lock, r4 -#endif -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bf/s	99f -	 mov	#LLL_PRIVATE, r5 -	mov	#LLL_SHARED, r5 -99: -	mov.l	.Lwake3, r1 -	bsrf	r1 -	 extu.b	r5, r5 -.Lwake3b: - -2: -	/* Wake up all waiters to make sure no signal gets lost.  */ -	tst	r10, r10 -	bf/s	5f -	 mov	r8, r4 -	add	#cond_futex, r4 -	mov.l	@(dep_mutex,r8), r0 -	cmp/eq	#-1, r0 -	bt/s	99f -	 mov	#FUTEX_WAKE, r5 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff1, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAKE, r0 -	or	r0, r5 -#endif -99: -	mov	#-1, r6 -	shlr	r6		/* r6 = 0x7fffffff */ -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -5: -        mov.l   .Lmlocki3, r1 -        bsrf    r1 -         mov     r9, r4 -.Lmlocki3b: - -.LcallUR: -	mov.l	.Lresume, r1 -#ifdef __PIC__ -	add	r12, r1 -#endif -	jsr	@r1 -	 mov	r11, r4 -	sleep - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff1: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif -	.align	2 -.Lwait3: -	.long   __lll_lock_wait-.Lwait3b -.Lwake3: -        .long   __lll_unlock_wake-.Lwake3b -.Lmlocki3: -	.long   __pthread_mutex_cond_lock-.Lmlocki3b -.Lresume: -#ifdef __PIC__ -	.long	_Unwind_Resume@GOTOFF -#else -	.long	_Unwind_Resume -#endif -.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: -	.ualong	.LcleanupSTART-.LSTARTCODE -	.ualong	.LcleanupEND-.LcleanupSTART -	.ualong	__condvar_w_cleanup-.LSTARTCODE -	.uleb128  0 -	.ualong	.LcallUR-.LSTARTCODE -	.ualong	.LENDCODE-.LcallUR -	.ualong	0 -	.uleb128  0 -.Lcstend: - -	.section .eh_frame,"a",@progbits -.LSTARTFRAME: -	.ualong	.LENDCIE-.LSTARTCIE		! Length of the CIE. -.LSTARTCIE: -	.ualong	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	0x11				! 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 -	.ualong	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 -	.ualong	__gcc_personality_v0 -	.byte	0x0				! LSDA Encoding: absolute -#endif -	.byte 0x0c				! DW_CFA_def_cfa -	.uleb128 0xf -	.uleb128 0 -	.align 2 -.LENDCIE: - -	.ualong	.LENDFDE-.LSTARTFDE		! Length of the FDE. -.LSTARTFDE: -	.ualong	.LSTARTFDE-.LSTARTFRAME		! CIE pointer. -#ifdef SHARED -	.ualong	.LSTARTCODE-.			! PC-relative start address -						! of the code. -#else -	.ualong	.LSTARTCODE			! Start address of the code. -#endif -	.ualong	.LENDCODE-.LSTARTCODE		! Length of the code. -	.uleb128 4				! Augmentation size -#ifdef SHARED -	.ualong	.LexceptSTART-. -#else -	.ualong	.LexceptSTART -#endif -	.byte	0x4 -	.ualong	.Lpush_r8-.LSTARTCODE -	.byte	0xe -	.uleb128 4 -	.byte	0x88 -	.uleb128 1 -	.byte	0x4 -	.ualong	.Lpush_r9-.Lpush_r8 -	.byte	0xe -	.uleb128 8 -	.byte	0x89 -	.uleb128 2 -	.byte	0x4 -	.ualong	.Lpush_r10-.Lpush_r9 -	.byte	0xe -	.uleb128 12 -	.byte	0x8a -	.uleb128 3 -	.byte	0x4 -	.ualong	.Lpush_r11-.Lpush_r10 -	.byte	0xe -	.uleb128 16 -	.byte	0x8b -	.uleb128 4 -	.byte	0x4 -	.ualong	.Lpush_r12-.Lpush_r11 -	.byte	0xe -	.uleb128 20 -	.byte	0x8c -	.uleb128 5 -	.byte	0x4 -	.ualong	.Lpush_pr-.Lpush_r12 -	.byte	0xe -	.uleb128 24 -	.byte	0x91 -	.uleb128 6 -	.byte	0x4 -	.ualong	.Lalloc-.Lpush_pr -	.byte	0xe -	.uleb128 72 -	.align	2 -.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/sh/pthread_once.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S deleted file mode 100644 index b03173d82..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S +++ /dev/null @@ -1,262 +0,0 @@ -/* Copyright (C) 2003, 2004, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <unwindbuf.h> -#include <sysdep.h> -#include <bits/kernel-features.h> -#include <lowlevellock.h> -#include <tcb-offsets.h> -#include "lowlevel-atomic.h" - - -	.comm	__fork_generation, 4, 4 - -	.text -	.globl	__pthread_once -	.type	__pthread_once,@function -	.protected	__pthread_once -	.align	5 -	cfi_startproc -__pthread_once: -	mov.l	@r4, r0 -	tst	#2, r0 -	bt	1f -	rts -	 mov	#0, r0 - -1: -	mov.l	r12, @-r15 -	cfi_adjust_cfa_offset (4) -	cfi_rel_offset (r12, 0) -	mov.l	r9, @-r15 -	cfi_adjust_cfa_offset (4) -	cfi_rel_offset (r9, 0) -	mov.l	r8, @-r15 -	cfi_adjust_cfa_offset (4) -	cfi_rel_offset (r8, 0) -	sts.l	pr, @-r15 -	cfi_adjust_cfa_offset (4) -	cfi_rel_offset (pr, 0) -	mov	r5, r8 -	mov	r4, r9 - -	/* Not yet initialized or initialization in progress. -	   Get the fork generation counter now.  */ -6: -	mov.l	@r4, r1 -	mova	.Lgot, r0 -	mov.l	.Lgot, r12 -	add	r0, r12 - -5: -	mov	r1, r0 - -	tst	#2, r0 -	bf	4f - -	and	#3, r0 -	mov.l	.Lfgen, r2 -#ifdef __PIC__ -	add	r12, r2 -#endif -	mov.l	@r2, r3 -	or	r3, r0 -	or	#1, r0 -	mov	r0, r3 -	mov	r1, r5 - -	CMPXCHG (r5, @r4, r3, r2) -	bf	5b - -	/* Check whether another thread already runs the initializer.  */ -	mov	r2, r0 -	tst	#1, r0 -	bt	3f	/* No -> do it.  */ - -	/* Check whether the initializer execution was interrupted -	   by a fork.  */ -	xor	r3, r0 -	mov	#-4, r1	/* -4 = 0xfffffffc */ -	tst	r1, r0 -	bf	3f	/* Different for generation -> run initializer.  */ - -	/* Somebody else got here first.  Wait.  */ -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r5 -# if FUTEX_WAIT != 0 -	mov	#FUTEX_WAIT, r0 -	or	r0, r5 -# endif -#endif -	mov	r3, r6 -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	bra	6b -	 nop - -	.align	2 -.Lgot: -	.long	_GLOBAL_OFFSET_TABLE_ -#ifdef __PIC__ -.Lfgen: -	.long	__fork_generation@GOTOFF -#else -.Lfgen: -	.long	__fork_generation -#endif - -3: -	/* Call the initializer function after setting up the -	   cancellation handler.  Note that it is not possible here -	   to use the unwind-based cleanup handling.  This would require -	   that the user-provided function and all the code it calls -	   is compiled with exceptions.  Unfortunately this cannot be -	   guaranteed.  */ -	add	#-UNWINDBUFSIZE, r15 -	cfi_adjust_cfa_offset (UNWINDBUFSIZE) - -	mov.l	.Lsigsetjmp, r1 -	mov	#UWJMPBUF, r4 -	add	r15, r4 -	bsrf	r1 -	 mov	#0, r5 -.Lsigsetjmp0: -	tst	r0, r0 -	bf	7f - -	mov.l	.Lcpush, r1 -	bsrf	r1 -	 mov	r15, r4 -.Lcpush0: - -	/* Call the user-provided initialization function.  */ -	jsr	@r8 -	 nop - -	/* Pop the cleanup handler.  */ -	mov.l	.Lcpop, r1 -	bsrf	r1 -	 mov	r15, r4 -.Lcpop0: - -	add	#UNWINDBUFSIZE, r15 -	cfi_adjust_cfa_offset (-UNWINDBUFSIZE) - -	/* Sucessful run of the initializer.  Signal that we are done.  */ -	INC (@r9, r2) -	/* Wake up all other threads.  */ -	mov	r9, r4 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5 -	extu.b	r5, r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAKE, r0 -	or	r0, r5 -#endif -	mov	#-1, r6 -	shlr	r6		/* r6 = 0x7fffffff */ -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -4: -	lds.l	@r15+, pr -	cfi_adjust_cfa_offset (-4) -	cfi_restore (pr) -	mov.l	@r15+, r8 -	cfi_adjust_cfa_offset (-4) -	cfi_restore (r8) -	mov.l	@r15+, r9 -	cfi_adjust_cfa_offset (-4) -	cfi_restore (r9) -	mov.l	@r15+, r12 -	cfi_adjust_cfa_offset (-4) -	cfi_restore (r12) -	rts -	 mov	#0, r0 - -7: -	/* __sigsetjmp returned for the second time.  */ -	cfi_adjust_cfa_offset (UNWINDBUFSIZE+16) -	cfi_offset (r12, -4) -	cfi_offset (r9, -8) -	cfi_offset (r8, -12) -	cfi_offset (pr, -16) -	mov	#0, r7 -	mov.l	r7, @r9 -	mov	r9, r4 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5 -#else -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r5 -	mov	#FUTEX_WAKE, r0 -	or	r0, r5 -#endif -	extu.b	r5, r5 -	mov	#-1, r6 -	shlr	r6		/* r6 = 0x7fffffff */ -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	mov.l	.Lunext, r1 -	bsrf	r1 -	 mov	r15, r4 -.Lunext0: -	/* NOTREACHED */ -	sleep -	cfi_endproc - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif -	.align	2 -.Lsigsetjmp: -	.long	__sigsetjmp@PLT-(.Lsigsetjmp0-.) -.Lcpush: -	.long	HIDDEN_JUMPTARGET(__pthread_register_cancel)-.Lcpush0 -.Lcpop: -	.long	HIDDEN_JUMPTARGET(__pthread_unregister_cancel)-.Lcpop0 -.Lunext: -	.long	HIDDEN_JUMPTARGET(__pthread_unwind_next)-.Lunext0 -	.size	__pthread_once,.-__pthread_once - -	.globl	__pthread_once_internal -__pthread_once_internal = __pthread_once - -	.globl	pthread_once -pthread_once = __pthread_once diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.c new file mode 100644 index 000000000..46085d3b5 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.c @@ -0,0 +1,89 @@ +/* Copyright (C) 2004-2013 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 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, see +   <http://www.gnu.org/licenses/>.  */ + +#include "pthreadP.h" +#include <lowlevellock.h> + +unsigned long int __fork_generation attribute_hidden; + +static void +clear_once_control (void *arg) +{ +  pthread_once_t *once_control = (pthread_once_t *) arg; + +  *once_control = 0; +  lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +} + +int +__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +{ +  for (;;) +    { +      int oldval; +      int newval; + +      /* Pseudo code: +	 newval = __fork_generation | 1; +	 oldval = *once_control; +	 if ((oldval & 2) == 0) +	   *once_control = newval; +	 Do this atomically. +      */ +      do +	{ +	  newval = __fork_generation | 1; +	  oldval = *once_control; +	  if (oldval & 2) +	    break; +	} while (atomic_compare_and_exchange_val_acq (once_control, newval, oldval) != oldval); + +      /* Check if the initializer has already been done.  */ +      if ((oldval & 2) != 0) +	return 0; + +      /* Check if another thread already runs the initializer.	*/ +      if ((oldval & 1) == 0) +	break; + +      /* Check whether the initializer execution was interrupted by a fork.  */ +      if (oldval != newval) +	break; + +      /* Same generation, some other thread was faster. Wait.  */ +      lll_futex_wait (once_control, oldval, LLL_PRIVATE); +    } + +  /* This thread is the first here.  Do the initialization. +     Register a cleanup handler so that in case the thread gets +     interrupted the initialization can be restarted.  */ +  pthread_cleanup_push (clear_once_control, once_control); + +  init_routine (); + +  pthread_cleanup_pop (0); + +  /* Say that the initialisation is done.  */ +  *once_control = __fork_generation | 2; + +  /* Wake up all other threads.  */ +  lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); + +  return 0; +} +weak_alias (__pthread_once, pthread_once) +strong_alias (__pthread_once, __pthread_once_internal) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S deleted file mode 100644 index f1efab181..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S +++ /dev/null @@ -1,254 +0,0 @@ -/* Copyright (C) 2003, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <tcb-offsets.h> -#include <bits/kernel-features.h> -#include "lowlevel-atomic.h" - - -	.text - -	.globl	__pthread_rwlock_rdlock -	.type	__pthread_rwlock_rdlock,@function -	.protected	__pthread_rwlock_rdlock -	.align	5 -__pthread_rwlock_rdlock: -	mov.l	r12, @-r15 -	mov.l	r9, @-r15 -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	mov	r4, r8 - -	/* Get the lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if MUTEX == 0 -	CMPXCHG (r3, @r8, r4, r2) -#else -	CMPXCHG (r3, @(MUTEX,r8), r4, r2) -#endif -	bf	1f -2: -	mov.l	@(WRITER,r8), r0 -	tst	r0, r0 -	bf	14f -	mov.l	@(WRITERS_QUEUED,r8), r0 -	tst	r0, r0 -	bt	5f -	mov	#FLAGS, r0 -	mov.b	@(r0,r8), r0 -	tst	r0, r0 -	bt	5f -3: -	mov.l	@(READERS_QUEUED,r8), r0 -	add	#1, r0 -	mov.l	r0, @(READERS_QUEUED,r8) -	tst	r0, r0 -	bt	4f - -	mov.l	@(READERS_WAKEUP,r8), r9 - -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	10f -11: -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0 -	xor	r0, r5 -	extu.b	r5, r5 -#else -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -# if FUTEX_WAIT != 0 -	mov	#FUTEX_WAIT, r0 -	or	r0, r5 -# endif -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r0 -	xor	r0, r5 -#endif -	mov	r8, r4 -	add	#READERS_WAKEUP, r4 -	mov	r9, r6 -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	/* Reget the lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if MUTEX == 0 -	CMPXCHG (r3, @r8, r4, r2) -#else -	CMPXCHG (r3, @(MUTEX,r8), r4, r2) -#endif -	bf	12f -13: -	mov.l	@(READERS_QUEUED,r8), r0 -	add	#-1, r0 -	bra	2b -	 mov.l	r0, @(READERS_QUEUED,r8) - -5: -	mov	#0, r3 -	mov.l	@(NR_READERS,r8), r0 -	add	#1, r0 -	mov.l	r0, @(NR_READERS,r8) -	tst	r0, r0 -	bt	8f - -9: -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	6f -7: -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r9 -	mov.l	@r15+, r12 -	rts -	 mov	r3, r0 - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif - -1: -	mov	r8, r5 -#if MUTEX != 0 -	add	#MUTEX, r5 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r6 -	extu.b	r6, r6 -	mov.l	.Lwait0, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait0b: -	bra	2b -	 nop -14: -	stc	gbr, r1 -	mov.w	.Ltidoff, r2 -	add	r2, r1 -	mov.l	@r1, r1 -	cmp/eq	r1, r0 -	bf	3b -	/* Deadlock detected.  */ -	bra	9b -	 mov	#EDEADLK, r3 - -.Ltidoff: -	.word	TID - TLS_PRE_TCB_SIZE - -6: -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake0, r1 -	bsrf	r1 -	 nop -.Lwake0b: -	bra	7b -	 mov	#0, r3 - -8: -	/* Overflow.  */ -	mov.l	@(NR_READERS,r8), r1 -	add	#-1, r1 -	mov.l	r1, @(NR_READERS,r8) -	bra	9b -	 mov	#EAGAIN, r3 - -4: -	/* Overflow.  */ -	mov.l	@(READERS_QUEUED,r8), r1 -	add	#-1, r1 -	mov.l	r1, @(READERS_QUEUED,r8) -	bra	9b -	 mov	#EAGAIN, r3 - -10: -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake1, r1 -	bsrf	r1 -	 nop -.Lwake1b: -	bra	11b -	 nop - -12: -	mov	r8, r5 -#if MUTEX != 0 -	add	#MUTEX, r5 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r6 -	extu.b	r6, r6 -	mov.l	.Lwait1, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait1b: -	bra	13b -	 nop - -	.align	2 -.Lwait0: -	.long	__lll_lock_wait-.Lwait0b -.Lwake0: -	.long	__lll_unlock_wake-.Lwake0b -.Lwait1: -	.long	__lll_lock_wait-.Lwait1b -.Lwake1: -	.long	__lll_unlock_wake-.Lwake1b -	.size	__pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock - -	.globl	pthread_rwlock_rdlock -pthread_rwlock_rdlock = __pthread_rwlock_rdlock - -	.globl	__pthread_rwlock_rdlock_internal -__pthread_rwlock_rdlock_internal = __pthread_rwlock_rdlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S deleted file mode 100644 index 122e6199d..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S +++ /dev/null @@ -1,313 +0,0 @@ -/* Copyright (C) 2003, 2007, 2008 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <tcb-offsets.h> -#include <bits/kernel-features.h> -#include "lowlevel-atomic.h" - - -	.text - -	.globl	pthread_rwlock_timedrdlock -	.type	pthread_rwlock_timedrdlock,@function -	.align	5 -pthread_rwlock_timedrdlock: -	mov.l	r12, @-r15 -	mov.l	r10, @-r15 -	mov.l	r9, @-r15 -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	add	#-8, r15 -	mov	r4, r8 -	mov	r5, r9 - -	/* Get the lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if MUTEX == 0 -	CMPXCHG (r3, @r8, r4, r2) -#else -	CMPXCHG (r3, @(MUTEX,r8), r4, r2) -#endif -	bf	1f -2: -	mov.l	@(WRITER,r8), r0 -	tst	r0, r0 -	bf	14f -	mov.l	@(WRITERS_QUEUED,r8), r0 -	tst	r0, r0 -	bt	5f -	mov	#FLAGS, r0 -	mov.b	@(r0,r8), r0 -	tst	r0, r0 -	bt	5f -3: -	/* Check the value of the timeout parameter.  */ -	mov.l	.L1g0, r1 -	mov.l	@(4,r9), r0 -	cmp/hs	r1, r0 -	bt	19f - -	mov.l	@(READERS_QUEUED,r8), r0 -	add	#1, r0 -	mov.l	r0, @(READERS_QUEUED,r8) -	tst	r0, r0 -	bt	4f - -	mov.l	@(READERS_WAKEUP,r8), r10 - -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	10f - -11: -	/* Get current time.  */ -	mov	r15, r4 -	mov	#0, r5 -	mov	#__NR_gettimeofday, r3 -	trapa	#0x12 -	SYSCALL_INST_PAD - -	mov.l	@(4,r15), r0 -	mov.w	.L1k0, r1 -	dmulu.l	r0, r1		/* Milli seconds to nano seconds.  */ -	mov.l	@r9, r2 -	mov.l	@(4,r9), r3 -	mov.l	@r15, r0 -	sts	macl, r1 -	sub	r0, r2 -	clrt -	subc	r1, r3 -	bf	15f -	mov.l	.L1g0, r1 -	add	r1, r3 -	add	#-1, r2 -15: -	cmp/pz	r2 -	bf	16f		/* Time is already up.  */ - -	/* Store relative timeout.  */ -	mov.l	r2, @r15 -	mov.l	r3, @(4,r15) - -	/* Futex call.  */ -	mov	r15, r7 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0 -	xor	r0, r5 -	extu.b	r5, r5 -#else -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -# if FUTEX_WAIT != 0 -	mov	#FUTEX_WAIT, r0 -	or	r0, r5 -# endif -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r0 -	xor	r0, r5 -#endif -	mov	r10, r6 -	mov	r8, r4 -	add	#READERS_WAKEUP, r4 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	mov	r0, r3 - -17: -	/* Reget the lock.  */ -	mov	#0, r5 -	mov	#1, r4 -#if MUTEX == 0 -	CMPXCHG (r5, @r8, r4, r2) -#else -	CMPXCHG (r5, @(MUTEX,r8), r4, r2) -#endif -	bf	12f - -13: -	mov.l	@(READERS_QUEUED,r8), r0 -	add	#-1, r0 -	mov.l	r0, @(READERS_QUEUED,r8) -	mov	#-ETIMEDOUT, r0 -	cmp/eq	r0, r3 -	bf	2b - -18: -	bra	9f -	 mov	#ETIMEDOUT, r3 - -5: -	mov	#0, r3 -	mov.l	@(NR_READERS,r8), r0 -	add	#1, r0 -	mov.l	r0, @(NR_READERS,r8) -	tst	r0, r0 -	bt	8f - -9: -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	6f -7: -	add	#8,r15 -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r9 -	mov.l	@r15+, r10 -	mov.l	@r15+, r12 -	rts -	 mov	r3, r0 - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif -	.align	2 -.L1k0: -	.long	1000 -.L1g0: -	.long	1000000000 - -1: -	mov	r8, r5 -#if MUTEX != 0 -	add	#MUTEX, r5 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r6 -	extu.b	r6, r6 -	mov.l	.Lwait2, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait2b: -	bra	2b -	 nop -14: -	stc	gbr, r1 -	mov.w	.Ltidoff, r2 -	add	r2, r1 -	mov.l	@r1, r1 -	cmp/eq	r1, r0 -	bf	3b -	/* Deadlock detected.  */ -	bra	9b -	 mov	#EDEADLK, r3 - -.Ltidoff: -	.word	TID - TLS_PRE_TCB_SIZE - -6: -	mov	r3, r10 -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake2, r1 -	bsrf	r1 -	 nop -.Lwake2b: -	bra	7b -	 mov	r10, r3 - -8: -	/* Overflow.  */ -	mov.l	@(NR_READERS,r8), r1 -	add	#-1, r1 -	mov.l	r1, @(NR_READERS,r8) -	bra	9b -	 mov	#EAGAIN, r3 - -4: -	/* Overflow.  */ -	mov.l	@(READERS_QUEUED,r8), r1 -	add	#-1, r1 -	mov.l	r1, @(READERS_QUEUED,r8) -	bra	9b -	 mov	#EAGAIN, r3 - -10: -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake3, r1 -	bsrf	r1 -	 nop -.Lwake3b: -	bra	11b -	 nop - -12: -	mov	r3, r10 -	mov	r8, r5 -#if MUTEX != 0 -	add	#MUTEX, r5 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r6 -	extu.b	r6, r6 -	mov.l	.Lwait3, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait3b: -	bra	13b -	 mov	r10, r3 - -16: -	bra	17b -	 mov	#-ETIMEDOUT, r3 - -19: -	bra	9b -	 mov	#EINVAL, r3 - -	.align	2 -.Lwait2: -	.long	__lll_lock_wait-.Lwait2b -.Lwake2: -	.long	__lll_unlock_wake-.Lwake2b -.Lwait3: -	.long	__lll_lock_wait-.Lwait3b -.Lwake3: -	.long	__lll_unlock_wake-.Lwake3b -	.size	pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S deleted file mode 100644 index 174165d14..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S +++ /dev/null @@ -1,297 +0,0 @@ -/* Copyright (C) 2003, 2007, 2008 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <tcb-offsets.h> -#include <bits/kernel-features.h> -#include "lowlevel-atomic.h" - - -	.text - -	.globl	pthread_rwlock_timedwrlock -	.type	pthread_rwlock_timedwrlock,@function -	.align	5 -pthread_rwlock_timedwrlock: -	mov.l	r12, @-r15 -	mov.l	r10, @-r15 -	mov.l	r9, @-r15 -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	add	#-8, r15 -	mov	r4, r8 -	mov	r5, r9 - -	/* Get the lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if MUTEX == 0 -	CMPXCHG (r3, @r8, r4, r2) -#else -	CMPXCHG (r3, @(MUTEX,r8), r4, r2) -#endif -	bf	1f -2: -	mov.l	@(WRITER,r8), r0 -	tst	r0, r0 -	bf	14f -	mov.l	@(NR_READERS,r8), r0 -	tst	r0, r0 -	bt	5f -3: -	/* Check the value of the timeout parameter.  */ -	mov.l	.L1g1, r1 -	mov.l	@(4,r9), r0 -	cmp/hs	r1, r0 -	bt	19f - -	mov.l	@(WRITERS_QUEUED,r8), r0 -	add	#1, r0 -	mov.l	r0, @(WRITERS_QUEUED,r8) -	tst	r0, r0 -	bt	4f - -	mov.l	@(WRITERS_WAKEUP,r8), r10 - -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	10f - -11: -	/* Get current time.  */ -	mov	r15, r4 -	mov	#0, r5 -	mov	#__NR_gettimeofday, r3 -	trapa	#0x12 -	SYSCALL_INST_PAD - -	mov.l	@(4,r15), r0 -	mov.w	.L1k1, r1 -	dmulu.l	r0, r1		/* Milli seconds to nano seconds.  */ -	mov.l	@r9, r2 -	mov.l	@(4,r9), r3 -	mov.l	@r15, r0 -	sts	macl, r1 -	sub	r0, r2 -	clrt -	subc	r1, r3 -	bf	15f -	mov.l	.L1g1, r1 -	add	r1, r3 -	add	#-1, r2 -15: -	cmp/pz	r2 -	bf	16f		/* Time is already up.  */ - -	/* Store relative timeout.  */ -	mov.l	r2, @r15 -	mov.l	r3, @(4,r15) - -	/* Futex call.  */ -	mov	r15, r7 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0 -	xor	r0, r5 -	extu.b	r5, r5 -#else -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -# if FUTEX_WAIT != 0 -	mov	#FUTEX_WAIT, r0 -	or	r0, r5 -# endif -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r0 -	xor	r0, r5 -#endif -	mov	r10, r6 -	mov	r8, r4 -	add	#WRITERS_WAKEUP, r4 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD -	mov	r0, r3 - -17: -	/* Reget the lock.  */ -	mov	#0, r5 -	mov	#1, r4 -#if MUTEX == 0 -	CMPXCHG (r5, @r8, r4, r2) -#else -	CMPXCHG (r5, @(MUTEX,r8), r4, r2) -#endif -	bf	12f - -13: -	mov.l	@(WRITERS_QUEUED,r8), r0 -	add	#-1, r0 -	mov.l	r0, @(WRITERS_QUEUED,r8) -	mov	#-ETIMEDOUT, r0 -	cmp/eq	r0, r3 -	bf	2b - -18: -	bra	9f -	 mov	#ETIMEDOUT, r3 - -19: -	bra	9f -	 mov	#EINVAL, r3 - -5: -	mov	#0, r3 -	stc	gbr, r0 -	mov.w	.Ltidoff, r1 -	mov.l	@(r0,r1), r0 -	mov.l	r0, @(WRITER,r8) -9: -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	6f -7: -	add	#8,r15 -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r9 -	mov.l	@r15+, r10 -	mov.l	@r15+, r12 -	rts -	 mov	r3, r0 - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif -.L1k1: -	.word	1000 -	.align	2 -.L1g1: -	.long	1000000000 - -1: -	mov	r8, r5 -#if MUTEX != 0 -	add	#MUTEX, r5 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r6 -	extu.b	r6, r6 -	mov.l	.Lwait6, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait6b: -	bra	2b -	 nop -14: -	stc	gbr, r1 -	mov.w	.Ltidoff, r2 -	add	r2, r1 -	mov.l	@r1, r1 -	cmp/eq	r1, r0 -	bf	3b -	bra	9b -	 mov	#EDEADLK, r3 -6: -	mov	r3, r10 -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake6, r1 -	bsrf	r1 -	 nop -.Lwake6b: -	bra	7b -	 mov	r10, r3 - -.Ltidoff: -	.word	TID - TLS_PRE_TCB_SIZE - -4: -	/* Overflow.  */ -	mov.l	@(WRITERS_QUEUED,r8), r1 -	add	#-1, r1 -	mov.l	r1, @(WRITERS_QUEUED,r8) -	bra	9b -	 mov	#EAGAIN, r3 - -10: -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake7, r1 -	bsrf	r1 -	 nop -.Lwake7b: -	bra	11b -	 nop - -12: -	mov	r3, r10 -	mov	r8, r5 -#if MUTEX != 0 -	add	#MUTEX, r5 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r6 -	extu.b	r6, r6 -	mov.l	.Lwait7, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait7b: -	bra	13b -	 mov	r10, r3 - -16: -	bra	17b -	 mov	#-ETIMEDOUT, r3 - -	.align	2 -.Lwait6: -	.long	__lll_lock_wait-.Lwait6b -.Lwake6: -	.long	__lll_unlock_wake-.Lwake6b -.Lwait7: -	.long	__lll_lock_wait-.Lwait7b -.Lwake7: -	.long	__lll_unlock_wake-.Lwake7b -	.size	pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S deleted file mode 100644 index ad492aad9..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S +++ /dev/null @@ -1,198 +0,0 @@ -/* Copyright (C) 2003, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <bits/kernel-features.h> -#include <tcb-offsets.h> -#include "lowlevel-atomic.h" - - -	.text - -	.globl	__pthread_rwlock_unlock -	.type	__pthread_rwlock_unlock,@function -	.protected	__pthread_rwlock_unlock -	.align	5 -__pthread_rwlock_unlock: -	mov.l	r12, @-r15 -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	mov	r4, r8 - -	/* Get the lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if MUTEX == 0 -	CMPXCHG (r3, @r8, r4, r2) -#else -	CMPXCHG (r3, @(MUTEX,r8), r4, r2) -#endif -	bf	1f -2: -	mov.l	@(WRITER,r8), r0 -	tst	r0, r0 -	bf	5f -	mov.l	@(NR_READERS,r8), r0 -	add	#-1, r0 -	mov.l	r0, @(NR_READERS,r8) -	tst	r0, r0 -	bf	6f -5: -	mov	#0, r0 -	mov.l	r0, @(WRITER,r8) -	mov	#1, r6 -	mov	r8, r4 -	add	#WRITERS_WAKEUP, r4 -	mov.l	@(WRITERS_QUEUED,r8), r0 -	tst	r0, r0 -	bf	0f - -	/* If also no readers waiting nothing to do.  */ -	mov.l	@(READERS_QUEUED,r8), r0 -	tst	r0, r0 -	bt	6f - -	mov	#-1, r6 -	shlr	r6		/* r6 = 0x7fffffff */ -	mov	r8, r4 -	add	#READERS_WAKEUP, r4 - -0: -	mov.l	@r4, r0 -	add	#1, r0 -	mov.l	r0, @r4 -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	7f - -8: -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r0 -	xor	r0, r5 -	extu.b	r5, r5 -#else -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov	#FUTEX_WAKE, r0 -	or	r0, r5 -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r0 -	xor	r0, r5 -#endif -	mov	#SYS_futex, r3 -	mov	#0, r7 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r12 -	rts -	 mov	#0, r0 -6: -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	3f -4: -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r12 -	rts -	 mov	#0, r0 - -1: -	mov	r8, r5 -#if MUTEX != 0 -	add	#MUTEX, r5 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r6 -	extu.b	r6, r6 -	mov.l	.Lwait8, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait8b: -	bra	2b -	 nop -3: -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake8, r1 -	bsrf	r1 -	 nop -.Lwake8b: -	bra	4b -	 nop - -7: -	mov.l	r4, @-r15 -	mov.l	r6, @-r15 -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake9, r1 -	bsrf	r1 -	 nop -.Lwake9b: - -	mov.l	@r15+, r6 -	bra	8b -	 mov.l	@r15+, r4 - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif -	.align	2 -.Lwait8: -	.long	__lll_lock_wait-.Lwait8b -.Lwake8: -	.long	__lll_unlock_wake-.Lwake8b -.Lwake9: -	.long	__lll_unlock_wake-.Lwake9b -	.size	__pthread_rwlock_unlock,.-__pthread_rwlock_unlock - -	.globl	pthread_rwlock_unlock -pthread_rwlock_unlock = __pthread_rwlock_unlock - -	.globl	__pthread_rwlock_unlock_internal -__pthread_rwlock_unlock_internal = __pthread_rwlock_unlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S deleted file mode 100644 index ee28fcea9..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S +++ /dev/null @@ -1,234 +0,0 @@ -/* Copyright (C) 2003, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <tcb-offsets.h> -#include <bits/kernel-features.h> -#include "lowlevel-atomic.h" - - -	.text - -	.globl	__pthread_rwlock_wrlock -	.type	__pthread_rwlock_wrlock,@function -	.protected	__pthread_rwlock_wrlock -	.align	5 -__pthread_rwlock_wrlock: -	mov.l	r12, @-r15 -	mov.l	r9, @-r15 -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	mov	r4, r8 - -	/* Get the lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if MUTEX == 0 -	CMPXCHG (r3, @r8, r4, r2) -#else -	CMPXCHG (r3, @(MUTEX,r8), r4, r2) -#endif -	bf	1f -2: -	mov.l	@(WRITER,r8), r0 -	tst	r0, r0 -	bf	14f -	mov.l	@(NR_READERS,r8), r0 -	tst	r0, r0 -	bt	5f -3: -	mov.l	@(WRITERS_QUEUED,r8), r0 -	add	#1, r0 -	mov.l	r0, @(WRITERS_QUEUED,r8) -	tst	r0, r0 -	bt	4f - -	mov.l	@(WRITERS_WAKEUP,r8), r9 - -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	10f -11: -	mov	r8, r4 -	add	#WRITERS_WAKEUP, r4 -#ifdef __ASSUME_PRIVATE_FUTEX -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0 -	xor	r0, r5 -	extu.b	r5, r5 -#else -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -# if FUTEX_WAIT != 0 -	mov	#FUTEX_WAIT, r0 -	or	r0, r5 -# endif -	stc	gbr, r1 -	mov.w	.Lpfoff, r2 -	add	r2, r1 -	mov.l	@r1, r0 -	xor	r0, r5 -#endif -	mov	r9, r6 -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	/* Reget the lock.  */ -	mov	#0, r3 -	mov	#1, r4 -#if MUTEX == 0 -	CMPXCHG (r3, @r8, r4, r2) -#else -	CMPXCHG (r3, @(MUTEX,r8), r4, r2) -#endif -	bf	12f -13: -	mov.l	@(WRITERS_QUEUED,r8), r0 -	add	#-1, r0 -	bra	2b -	 mov.l	r0, @(WRITERS_QUEUED,r8) - -5: -	mov	#0, r3 -	stc	gbr, r0 -	mov.w	.Ltidoff, r1 -	mov.l	@(r0,r1), r0 -	mov.l	r0, @(WRITER,r8) -9: -#if MUTEX == 0 -	DEC (@r8, r2) -#else -	DEC (@(MUTEX,r8), r2) -#endif -	tst	r2, r2 -	bf	6f -7: -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r9 -	mov.l	@r15+, r12 -	rts -	 mov	r3, r0 - -1: -	mov	r8, r5 -#if MUTEX != 0 -	add	#MUTEX, r5 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r6 -	extu.b	r6, r6 -	mov.l	.Lwait4, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait4b: -	bra	2b -	 nop -14: -	stc	gbr, r1 -	mov.w	.Ltidoff, r2 -	add	r2, r1 -	mov.l	@r1, r1 -	cmp/eq	r1, r0 -	bf	3b -	bra	9b -	 mov	#EDEADLK, r3 -6: -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake4, r1 -	bsrf	r1 -	 nop -.Lwake4b: -	bra	7b -	 mov	#0, r3 - -#ifndef __ASSUME_PRIVATE_FUTEX -.Lpfoff: -	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE -#endif -.Ltidoff: -	.word	TID - TLS_PRE_TCB_SIZE - -4: -	mov.l	@(WRITERS_QUEUED,r8), r1 -	add	#-1, r1 -	mov.l	r1, @(WRITERS_QUEUED,r8) -	bra	9b -	 mov	#EAGAIN, r3 - -10: -	mov	r8, r4 -#if MUTEX != 0 -	add	#MUTEX, r4 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r5 -	extu.b	r5, r5 -	mov.l	.Lwake5, r1 -	bsrf	r1 -	 nop -.Lwake5b: -	bra	11b -	 nop - -12: -	mov	r8, r5 -#if MUTEX != 0 -	add	#MUTEX, r5 -#endif -	mov	#PSHARED, r0 -	mov.b	@(r0,r8), r6 -	extu.b	r6, r6 -	mov.l	.Lwait5, r1 -	bsrf	r1 -	 mov	r2, r4 -.Lwait5b: -	bra	13b -	 nop - -	.align	2 -.Lwait4: -	.long	__lll_lock_wait-.Lwait4b -.Lwake4: -	.long	__lll_unlock_wake-.Lwake4b -.Lwait5: -	.long	__lll_lock_wait-.Lwait5b -.Lwake5: -	.long	__lll_unlock_wake-.Lwake5b -	.globl	pthread_rwlock_wrlock -pthread_rwlock_wrlock = __pthread_rwlock_wrlock - -	.globl	__pthread_rwlock_wrlock_internal -__pthread_rwlock_wrlock_internal = __pthread_rwlock_wrlock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S deleted file mode 100644 index 290209b7b..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S +++ /dev/null @@ -1,108 +0,0 @@ -/* Copyright (C) 2003, 2004, 2007, 2008 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <structsem.h> -#include <lowlevellock.h> -#include "lowlevel-atomic.h" - - -	.text - -	.globl	sem_post -	.type	sem_post,@function -	.align	5 -sem_post: -	mov.l	@(VALUE,r4), r2 -0: -	mov.l	.Lmax, r1 -	cmp/eq	r1, r2 -	bt/s	3f -	 mov	r2, r3 -	mov	r3, r5 -	add	#1, r5 -	CMPXCHG (r3, @(VALUE,r4), r5, r2) -	bf	0b -	mov.l	@(NWAITERS,r4), r2 -	tst	r2, r2 -	bt	2f -	mov	#FUTEX_WAKE, r5 -	mov.l	@(PRIVATE,r4), r1 -	or	r1, r5 -	mov	#1, r6 -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	cmp/pz	r0 -	bf	1f -2: -	rts -	 mov	#0, r0 - -1: -	bra	4f -	 mov	#EINVAL, r2 - -3: -	mov	#EOVERFLOW, r2 -4: -	mov.l	r12, @-r15 -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	mova	.Lgot3, r0 -	mov.l	.Lgot3, r12 -	add	r0, r12 - -#if USE___THREAD -	mov.l	.Lerrno3, r0 -	stc	gbr, r1 -	mov.l	@(r0, r12), r0 -	bra	.Lexit -	 add	r1, r0 -	.align	2 -.Lerrno3: -	.long	errno@GOTTPOFF -.Lexit: -	mov.l	r2, @r0 -#else -	mov	r2, r8 -	mov.l	.Lerrloc3, r1 -	bsrf	r1 -	 nop -.Lerrloc3b: -	mov	r8, @r0 -#endif -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r12 -	rts -	 mov	#-1, r0 - -	.align	2 -.Lmax: -	.long	SEM_VALUE_MAX -.Lgot3: -	.long	_GLOBAL_OFFSET_TABLE_ -#if !USE___THREAD -.Lerrloc3: -	.long	__errno_location@PLT-(.Lerrloc3b-.) -#endif -	.size	sem_post,.-sem_post diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S deleted file mode 100644 index f8e801306..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S +++ /dev/null @@ -1,357 +0,0 @@ -/* Copyright (C) 2003, 2004, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <tcb-offsets.h> -#include <structsem.h> -#include <lowlevellock.h> -#include "lowlevel-atomic.h" - - -#if VALUE != 0 -# error "code needs to be rewritten for VALUE != 0" -#endif - -	.text - -	.globl	sem_timedwait -	.type	sem_timedwait,@function -	.align	5 -sem_timedwait: -.LSTARTCODE: -	mov.l	@r4, r0 -2: -	tst	r0, r0 -	bt	1f -	mov	r0, r3 -	mov	r0, r6 -	add	#-1, r3 -	CMPXCHG (r6, @r4, r3, r2) -	bf/s	2b -	 mov	r2, r0 -	rts -	 mov	#0, r0 - -1: -	/* Check whether the timeout value is valid.  */ -	mov.l	r8, @-r15 -.Lpush_r8: -	mov.l	r9, @-r15 -.Lpush_r9: -	mov.l	r10, @-r15 -.Lpush_r10: -	mov.l	r12, @-r15 -.Lpush_r12: -	sts.l	pr, @-r15 -.Lpush_pr: -	add	#-8, r15 -.Lalloc: -	mov	r4, r8 -	mov	r5, r9 - -	/* Check for invalid nanosecond field.  */ -	mov.l	@(4,r9), r0 -	mov.l	.L1g, r1 -	cmp/hs	r1, r0 -	bt/s	6f -	 mov	#EINVAL, r0 -	INC (@(NWAITERS,r8),r2) - -7: -	/* Compute relative timeout.  */ -	mov	r15, r4 -	mov	#0, r5 -	mov	#__NR_gettimeofday, r3 -	trapa	#0x12 -	SYSCALL_INST_PAD - -	mov.l	@(4,r15), r0 -	mov.w	.L1k, r1 -	dmulu.l	r0, r1		/* Milli seconds to nano seconds.  */ -	mov.l	@r9, r2 -	mov.l	@(4,r9), r3 -	mov.l	@r15, r0 -	sts	macl, r1 -	sub	r0, r2 -	clrt -	subc	r1, r3 -	bf	5f -	mov.l	.L1g, r1 -	add	r1, r3 -	add	#-1, r2 -5: -	cmp/pz	r2 -	bf/s	6f		/* Time is already up.  */ -	 mov	#ETIMEDOUT, r0 - -	/* Store relative timeout.  */ -	mov.l	r2, @r15 -	mov.l	r3, @(4,r15) - -.LcleanupSTART: -	mov.l	.Lenable0, r1 -	bsrf	r1 -	 nop -.Lenable0b: -	mov	r0, r10 - -	mov	r8, r4 -#if FUTEX_WAIT == 0 -	mov.l	@(PRIVATE,r8), r5 -#else -	mov.l	@(PRIVATE,r8), r5 -	mov	#FUTEX_WAIT, r0 -	or	r0, r5 -#endif -	mov	#0, r6 -	mov	r15, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	mov.l	.Ldisable0, r1 -	mov	r10, r4 -	bsrf	r1 -	 mov	r0, r10 -.Ldisable0b: -	mov	r10, r0 -.LcleanupEND: - -	tst	r0, r0 -	bt	9f -	cmp/eq	#-EWOULDBLOCK, r0 -	bf	3f -9: -	mov.l	@r8, r0 -8: -	tst	r0, r0 -	bt	7b - -	mov	r0, r3 -	mov	r0, r4 -	add	#-1, r3 -	CMPXCHG (r4, @r8, r3, r2) -	bf/s	8b -	 mov	r2, r0 - -	DEC (@(NWAITERS,r8), r2) -	mov	#0, r0 - -10: -	add	#8, r15 -	lds.l	@r15+, pr -	mov.l	@r15+, r12 -	mov.l	@r15+, r10 -	mov.l	@r15+, r9 -	mov.l	@r15+, r8 -	rts -	 nop - -3: -	neg	r0, r0 -6: -	mov	r0, r10 -	mova	.Lgot2, r0 -	mov.l	.Lgot2, r12 -	add	r0, r12 - -#if USE___THREAD -	mov.l	.Lerrno2, r0 -	stc	gbr, r1 -	mov.l	@(r0, r12), r0 -	bra	.Lexit -	 add	r1, r0 -	.align	2 -.Lerrno2: - 	.long	errno@GOTTPOFF -.Lexit: -#else -	mov.l	.Lerrloc2, r1 -	bsrf	r1 -	 nop -.Lerrloc2b: -#endif -	mov.l	r10, @r0 -	DEC (@(NWAITERS,r8), r2) -	bra	10b -	 mov	#-1, r0 - -.L1k: -	.word	1000 -	.align	2 -.L1g: -	.long	1000000000 -.Lgot2: -	.long	_GLOBAL_OFFSET_TABLE_ -#if !USE___THREAD -.Lerrloc2: -	.long	__errno_location@PLT-(.Lerrloc2b-.) -#endif -.Lenable0: -	.long	__pthread_enable_asynccancel-.Lenable0b -.Ldisable0: -	.long	__pthread_disable_asynccancel-.Ldisable0b -	.size	sem_timedwait,.-sem_timedwait - -	.type	sem_wait_cleanup,@function -sem_wait_cleanup: - 	DEC (@(NWAITERS,r8), r2) -.LcallUR: -	mov.l	.Lresume, r1 -#ifdef __PIC__ -	add	r12, r1 -#endif -	jsr	@r1 -	 nop -	sleep - -	.align	2 -.Lresume: -#ifdef __PIC__ -	.long	_Unwind_Resume@GOTOFF -#else -	.long	_Unwind_Resume -#endif -.LENDCODE: -	.size	sem_wait_cleanup,.-sem_wait_cleanup - - -	.section .gcc_except_table,"a",@progbits -.LexceptSTART: -	.byte	0xff				! @LPStart format (omit) -	.byte	0xff				! @TType format (omit) -	.byte	0x01				! call-site format -						! DW_EH_PE_uleb128 -	.uleb128 .Lcstend-.Lcstbegin -.Lcstbegin: -	.uleb128 .LcleanupSTART-.LSTARTCODE -	.uleb128 .LcleanupEND-.LcleanupSTART -	.uleb128 sem_wait_cleanup-.LSTARTCODE -	.uleb128  0 -	.uleb128 .LcallUR-.LSTARTCODE -	.uleb128 .LENDCODE-.LcallUR -	.uleb128 0 -	.uleb128  0 -.Lcstend: - - -	.section .eh_frame,"a",@progbits -.LSTARTFRAME: -	.ualong	.LENDCIE-.LSTARTCIE		! Length of the CIE. -.LSTARTCIE: -	.ualong	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	0x11				! 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 -	.ualong	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 -	.ualong	__gcc_personality_v0 -	.byte	0x0				! LSDA Encoding: absolute -#endif -	.byte 0x0c				! DW_CFA_def_cfa -	.uleb128 0xf -	.uleb128 0 -	.align 4 -.LENDCIE: - -	.ualong	.LENDFDE-.LSTARTFDE		! Length of the FDE. -.LSTARTFDE: -	.ualong	.LSTARTFDE-.LSTARTFRAME		! CIE pointer. -#ifdef SHARED -	.ualong	.LSTARTCODE-.			! PC-relative start address -						! of the code. -#else -	.ualong	.LSTARTCODE			! Start address of the code. -#endif -	.ualong	.LENDCODE-.LSTARTCODE		! Length of the code. -	.uleb128 4				! Augmentation size -#ifdef SHARED -	.ualong	.LexceptSTART-. -#else -	.ualong	.LexceptSTART -#endif - -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lpush_r8-.LSTARTCODE -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 4 -	.byte   0x88				! DW_CFA_offset r8 -        .uleb128 1 -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lpush_r9-.Lpush_r8 -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 8 -	.byte   0x89				! DW_CFA_offset r9 -        .uleb128 2 -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lpush_r10-.Lpush_r9 -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 12 -	.byte   0x8a				! DW_CFA_offset r10 -        .uleb128 3 -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lpush_r12-.Lpush_r10 -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte   0x8c				! DW_CFA_offset r12 -        .uleb128 4 -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lpush_pr-.Lpush_r12 -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 20 -	.byte	0x91				! DW_CFA_offset pr -	.uleb128 5 -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lalloc-.Lpush_pr -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 28 -	.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/sh/sem_trywait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S deleted file mode 100644 index 8e84f2589..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 2003, 2004, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <lowlevellock.h> -#include "lowlevel-atomic.h" - - -	.text - -	.globl	sem_trywait -	.type	sem_trywait,@function -	.align	5 -sem_trywait: -	mov.l	r12, @-r15 -	mov.l	r8, @-r15 -	sts.l	pr, @-r15 -	mov	r4, r8 -	mov.l	@r8, r0 -2: -	tst	r0, r0 -	bt	1f - -	mov	r0, r3 -	mov	r0, r4 -	add	#-1, r3 -	CMPXCHG (r4, @r8, r3, r2) -	bf/s	2b -	 mov	r2, r0 - -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r12 -	rts -	 mov	#0, r0 - -1: -	mov	#EAGAIN, r8 -	mova	.Lgot1, r0 -	mov.l	.Lgot1, r12 -	add	r0, r12 - -#if USE___THREAD -	mov.l	.Lerrno1, r0 -	stc	gbr, r1 -	mov.l	@(r0, r12), r0 -	bra	.Lexit -	 add	r1, r0 -	.align	2 -.Lerrno1: -	.long	errno@GOTTPOFF -.Lexit: -#else -	mov.l	.Lerrloc1, r1 -	bsrf	r1 -	 nop -.Lerrloc1b: -#endif -	mov.l	r8, @r0 -	lds.l	@r15+, pr -	mov.l	@r15+, r8 -	mov.l	@r15+, r12 -	rts -	 mov	#-1, r0 - -	.align	2 -.Lgot1: -	.long	_GLOBAL_OFFSET_TABLE_ -#if !USE___THREAD -.Lerrloc1: -	.long	__errno_location@PLT-(.Lerrloc1b-.) -#endif -	.size	sem_trywait,.-sem_trywait diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S deleted file mode 100644 index b8c25092a..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S +++ /dev/null @@ -1,301 +0,0 @@ -/* Copyright (C) 2003, 2004, 2007 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 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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <sysdep.h> -#include <pthread-errnos.h> -#include <tcb-offsets.h> -#include <structsem.h> -#include <lowlevellock.h> -#include "lowlevel-atomic.h" - - -#if VALUE != 0 -# error "code needs to be rewritten for VALUE != 0" -#endif - -	.text - -	.globl	sem_wait -	.type	sem_wait,@function -	.align	5 -sem_wait: -.LSTARTCODE: -	mov.l	r8, @-r15 -.Lpush_r8: -	mov.l	r10, @-r15 -.Lpush_r10: -	mov.l	r12, @-r15 -.Lpush_r12: -	sts.l	pr, @-r15 -.Lpush_pr: -	mov	r4, r8 - -	mov.l	@r8, r0 -2: -	tst	r0, r0 -	bt	1f -	mov	r0, r3 -	mov	r0, r4 -	add	#-1, r3 -	CMPXCHG (r4, @r8, r3, r2) -	bf/s	2b -	 mov	r2, r0 -7: -	mov	#0, r0 -9: -	lds.l	@r15+, pr -	mov.l	@r15+, r12 -	mov.l	@r15+, r10 -	rts -	 mov.l	@r15+, r8 - -.Lafter_ret: -1: -	INC (@(NWAITERS,r8),r2) - -.LcleanupSTART: -6: -	mov.l	.Lenable0, r1 -	bsrf	r1 -	 nop -.Lenable0b: -	mov	r0, r10 - -	mov	r8, r4 -#if FUTEX_WAIT == 0 -	mov.l	@(PRIVATE,r8), r5 -#else -	mov.l	@(PRIVATE,r8), r5 -	mov	#FUTEX_WAIT, r0 -	or	r0, r5 -#endif -	mov	#0, r6 -	mov	#0, r7 -	mov	#SYS_futex, r3 -	extu.b	r3, r3 -	trapa	#0x14 -	SYSCALL_INST_PAD - -	mov.l	.Ldisable0, r1 -	mov	r10, r4 -	bsrf	r1 -	 mov	r0, r10 -.Ldisable0b: -	mov	r10, r0 -.LcleanupEND: - -	tst	r0, r0 -	bt	3f -	cmp/eq	#-EWOULDBLOCK, r0 -	bf	4f - -3: -	mov.l	@r8, r0 -5: -	tst	r0, r0 -	bt	6b - -	mov	r0, r3 -	mov	r0, r4 -	add	#-1, r3 -	CMPXCHG (r4, @r8, r3, r2) -	bf/s	5b -	 mov	r2, r0 - -	DEC (@(NWAITERS,r8), r2) -	bra	7b -	 nop - -4: -	neg	r0, r0 -	mov	r0, r4 -	DEC (@(NWAITERS,r8), r2) -	mov	r4, r8 -	mova	.Lgot0, r0 -	mov.l	.Lgot0, r12 -	add	r0, r12 - -#if USE___THREAD -	mov.l	.Lerrno0, r0 -	stc	gbr, r1 -	mov.l	@(r0, r12), r0 -	bra	.Lexit -	 add	r1, r0 -	.align	2 -.Lerrno0: -	.long	errno@GOTTPOFF -.Lexit: -#else -	mov.l	.Lerrloc0, r1 -	bsrf	r1 -	 nop -.Lerrloc0b: -#endif -	mov.l	r8, @r0 -	bra	9b -	 mov	#-1, r0 - -	.align	2 -.Lgot0: -	.long	_GLOBAL_OFFSET_TABLE_ -#if !USE___THREAD -.Lerrloc0: -	.long	__errno_location@PLT-(.Lerrloc0b-.) -#endif -.Lenable0: -	.long	__pthread_enable_asynccancel-.Lenable0b -.Ldisable0: -	.long	__pthread_disable_asynccancel-.Ldisable0b -	.size	sem_wait,.-sem_wait - - -	.type	sem_wait_cleanup,@function -sem_wait_cleanup: - 	DEC (@(NWAITERS,r8), r2) -.LcallUR: -	mov.l	.Lresume, r1 -#ifdef __PIC__ -	add	r12, r1 -#endif -	jsr	@r1 -	 nop -	sleep - -	.align	2 -.Lresume: -#ifdef __PIC__ -	.long	_Unwind_Resume@GOTOFF -#else -	.long	_Unwind_Resume -#endif -.LENDCODE: -	.size	sem_wait_cleanup,.-sem_wait_cleanup - - -	.section .gcc_except_table,"a",@progbits -.LexceptSTART: -	.byte	0xff				! @LPStart format (omit) -	.byte	0xff				! @TType format (omit) -	.byte	0x01				! call-site format -						! DW_EH_PE_uleb128 -	.uleb128 .Lcstend-.Lcstbegin -.Lcstbegin: -	.uleb128 .LcleanupSTART-.LSTARTCODE -	.uleb128 .LcleanupEND-.LcleanupSTART -	.uleb128 sem_wait_cleanup-.LSTARTCODE -	.uleb128  0 -	.uleb128 .LcallUR-.LSTARTCODE -	.uleb128 .LENDCODE-.LcallUR -	.uleb128 0 -	.uleb128  0 -.Lcstend: - - -	.section .eh_frame,"a",@progbits -.LSTARTFRAME: -	.ualong	.LENDCIE-.LSTARTCIE		! Length of the CIE. -.LSTARTCIE: -	.ualong	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	0x11				! 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 -	.ualong	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 -	.ualong	__gcc_personality_v0 -	.byte	0x0				! LSDA Encoding: absolute -#endif -	.byte 0x0c				! DW_CFA_def_cfa -	.uleb128 0xf -	.uleb128 0 -	.align 4 -.LENDCIE: - -	.ualong	.LENDFDE-.LSTARTFDE		! Length of the FDE. -.LSTARTFDE: -	.ualong	.LSTARTFDE-.LSTARTFRAME		! CIE pointer. -#ifdef SHARED -	.ualong	.LSTARTCODE-.			! PC-relative start address -						! of the code. -#else -	.ualong	.LSTARTCODE			! Start address of the code. -#endif -	.ualong	.LENDCODE-.LSTARTCODE		! Length of the code. -	.uleb128 4				! Augmentation size -#ifdef SHARED -	.ualong	.LexceptSTART-. -#else -	.ualong	.LexceptSTART -#endif - -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lpush_r8-.LSTARTCODE -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 4 -	.byte   0x88				! DW_CFA_offset r8 -        .uleb128 1 -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lpush_r10-.Lpush_r8 -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 8 -	.byte   0x8a				! DW_CFA_offset r10 -        .uleb128 2 -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lpush_r12-.Lpush_r10 -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 12 -	.byte   0x8c				! DW_CFA_offset r12 -        .uleb128 3 -	.byte	4				! DW_CFA_advance_loc4 -	.ualong	.Lpush_pr-.Lpush_r12 -	.byte	14				! DW_CFA_def_cfa_offset -	.uleb128 16 -	.byte   0x91				! DW_CFA_offset pr -        .uleb128 4 -	.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/sh/sh4/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h deleted file mode 100644 index 8cdcac556..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h +++ /dev/null @@ -1,4 +0,0 @@ -/*  4 instruction cycles not accessing cache and TLB are needed after -    trapa instruction to avoid an SH-4 silicon bug.  */ -#define NEED_SYSCALL_INST_PAD -#include <sysdeps/unix/sysv/linux/sh/lowlevellock.h>  | 
