about summary refs log tree commit diff
path: root/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S254
1 files changed, 187 insertions, 67 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S
index acb7d0f78b..e5e064b3a5 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+/* 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
@@ -20,32 +20,25 @@
 #include <shlib-compat.h>
 #include <pthread-errnos.h>
 #include <tcb-offsets.h>
+#include <structsem.h>
 #include "lowlevel-atomic.h"
 
 
 #define SYS_gettimeofday	__NR_gettimeofday
 #define SYS_futex		240
 #define FUTEX_WAIT		0
-#define FUTEX_WAKE		1
+
+#if VALUE != 0
+# error "code needs to be rewritten for VALUE != 0"
+#endif
 
 	.text
 
 	.globl	sem_timedwait
 	.type	sem_timedwait,@function
 	.align	5
-	cfi_startproc
 sem_timedwait:
-	/* First check for cancellation.  */
-	stc	gbr, r0
-	mov.w	.Lchand, r1
-	mov.l	@(r0,r1), r0
-	mov	#0xf9, r1
-	and	r1, r0
-	cmp/eq	#8, r0
-	bf	0f
-	bra	10f
-	 stc	gbr, r0
-0:
+.LSTARTCODE:
 	mov.l	@r4, r0
 2:
 	tst	r0, r0
@@ -62,22 +55,17 @@ sem_timedwait:
 1:
 	/* Check whether the timeout value is valid.  */
 	mov.l	r8, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r8, 0)
+.Lpush_r8:
 	mov.l	r9, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r9, 0)
+.Lpush_r9:
 	mov.l	r10, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r10, 0)
+.Lpush_r10:
 	mov.l	r12, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r12, 0)
+.Lpush_r12:
 	sts.l	pr, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (pr, 0)
+.Lpush_pr:
 	add	#-8, r15
-	cfi_adjust_cfa_offset(8)
+.Lalloc:
 	mov	r4, r8
 	mov	r5, r9
 
@@ -87,13 +75,9 @@ sem_timedwait:
 	cmp/hs	r1, r0
 	bt/s	6f
 	 mov	#EINVAL, r0
-7:
-	mov.l	.Lenable0, r1
-	bsrf	r1
-	 nop
-.Lenable0b:
-	mov	r0, r10
+	INC (@(NWAITERS,r8),r2)
 
+7:
 	/* Compute relative timeout.  */
 	mov	r15, r4
 	mov	#0, r5
@@ -124,9 +108,21 @@ sem_timedwait:
 	mov.l	r2, @r15
 	mov.l	r3, @(4,r15)
 
-	/* Futex call.  */
+.LcleanupSTART:
+	mov.l	.Lenable0, r1
+	bsrf	r1
+	 nop
+.Lenable0b:
+	mov	r0, r10
+
 	mov	r8, r4
-	mov	#FUTEX_WAIT, r5
+#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
@@ -140,6 +136,7 @@ sem_timedwait:
 	 mov	r0, r10
 .Ldisable0b:	
 	mov	r10, r0
+.LcleanupEND:
 
 	tst	r0, r0
 	bt	9f
@@ -158,6 +155,10 @@ sem_timedwait:
 	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
@@ -165,12 +166,12 @@ sem_timedwait:
 	mov.l	@r15+, r9
 	mov.l	@r15+, r8
 	rts
-	 mov	#0, r0
+	 nop
 
 3:
 	neg	r0, r0
 6:
-	mov	r0, r8
+	mov	r0, r10
 	mova	.Lgot2, r0
 	mov.l	.Lgot2, r12
 	add	r0, r12
@@ -180,46 +181,20 @@ sem_timedwait:
 	stc	gbr, r1
 	mov.l	@(r0, r12), r0
 	add	r1, r0
-	mov.l	r8, @r0
+	mov.l	r10, @r0
 #else
 	mov.l	.Lerrloc2, r1
 	bsrf	r1
 	 nop
 .Lerrloc2b:
-	mov.l	r8, @r0
+	mov.l	r10, @r0
 #endif
-	add	#8, r15
-	lds.l	@r15+, pr
-	mov.l	@r15+, r12
-	mov.l	@r15+, r10
-	mov.l	@r15+, r9
-	mov.l	@r15+, r8
-	rts
+	DEC (@(NWAITERS,r8), r2)
+	bra	10b
 	 mov	#-1, r0
 
-10:
-	/* Canceled.  */
-	mov.w	.Lresult, r1
-	mov	#-1, r2
-	mov.l	r2, @(r0,r1)
-	mov.w	.Lchand, r0
-	or.b	#0x10, @(r0,gbr)
-	stc	gbr, r0
-	mov.w	.Lclbuf, r1
-	mov.l	.Lunwind, r2
-	braf	r2
-	 mov.l	@(r0,r1), r4
-.Lunwindb:
-	cfi_endproc
-
 .L1k:
 	.word	1000
-.Lchand:
-	.word	CANCELHANDLING - TLS_PRE_TCB_SIZE
-.Lresult:
-	.word	RESULT - TLS_PRE_TCB_SIZE
-.Lclbuf:
-	.word	CLEANUP_JMP_BUF - TLS_PRE_TCB_SIZE
 	.align	2
 .L1g:
 	.long	1000000000
@@ -236,6 +211,151 @@ sem_timedwait:
 	.long	__pthread_enable_asynccancel-.Lenable0b
 .Ldisable0:
 	.long	__pthread_disable_asynccancel-.Ldisable0b
-.Lunwind:
-	.long	HIDDEN_JUMPTARGET (__pthread_unwind)-.Lunwindb
 	.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