1 /* Copyright (C) 2003-2014 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>. */
19 #include <shlib-compat.h>
20 #include <pthread-errnos.h>
21 #include <tcb-offsets.h>
22 #include <structsem.h>
23 #include <lowlevellock.h>
24 #include "lowlevel-atomic.h"
28 # error "code needs to be rewritten for VALUE != 0"
34 .type sem_timedwait,@function
40 cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect,
41 DW.ref.__gcc_personality_v0)
42 cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART)
44 cfi_personality(DW_EH_PE_absptr, __gcc_personality_v0)
45 cfi_lsda(DW_EH_PE_absptr, .LexceptSTART)
54 CMPXCHG (r6, @r4, r3, r2)
61 /* Check whether the timeout value is valid. */
63 cfi_adjust_cfa_offset (4)
64 cfi_rel_offset (r8, 0)
66 cfi_adjust_cfa_offset (4)
67 cfi_rel_offset (r9, 0)
69 cfi_adjust_cfa_offset (4)
70 cfi_rel_offset (r10, 0)
72 cfi_adjust_cfa_offset (4)
73 cfi_rel_offset (r12, 0)
75 cfi_adjust_cfa_offset (4)
76 cfi_rel_offset (pr, 0)
78 cfi_adjust_cfa_offset (8)
83 /* Check for invalid nanosecond field. */
89 INC (@(NWAITERS,r8),r2)
92 /* Compute relative timeout. */
95 mov #__NR_gettimeofday, r3
101 dmulu.l r0, r1 /* Milli seconds to nano seconds. */
115 bf/s 6f /* Time is already up. */
118 /* Store relative timeout. */
131 mov.l @(PRIVATE,r8), r5
133 mov.l @(PRIVATE,r8), r5
154 cmp/eq #-EWOULDBLOCK, r0
165 CMPXCHG (r4, @r8, r3, r2)
169 DEC (@(NWAITERS,r8), r2)
175 cfi_adjust_cfa_offset (-8)
177 cfi_adjust_cfa_offset (-4)
180 cfi_adjust_cfa_offset (-4)
183 cfi_adjust_cfa_offset (-4)
186 cfi_adjust_cfa_offset (-4)
189 cfi_adjust_cfa_offset (-4)
199 DEC (@(NWAITERS,r8), r2)
224 .long _GLOBAL_OFFSET_TABLE_
226 .long __pthread_enable_asynccancel-.Lenable0b
228 .long __pthread_disable_asynccancel-.Ldisable0b
229 .size sem_timedwait,.-sem_timedwait
231 .type sem_wait_cleanup,@function
233 DEC (@(NWAITERS,r8), r2)
246 .long _Unwind_Resume@GOTOFF
252 .size sem_wait_cleanup,.-sem_wait_cleanup
255 .section .gcc_except_table,"a",@progbits
257 .byte DW_EH_PE_omit ! @LPStart format (omit)
258 .byte DW_EH_PE_omit ! @TType format (omit)
259 .byte DW_EH_PE_uleb128 ! call-site format
260 .uleb128 .Lcstend-.Lcstbegin
262 .uleb128 .LcleanupSTART-.LSTARTCODE
263 .uleb128 .LcleanupEND-.LcleanupSTART
264 .uleb128 sem_wait_cleanup-.LSTARTCODE
266 .uleb128 .LcallUR-.LSTARTCODE
267 .uleb128 .LENDCODE-.LcallUR
273 .hidden DW.ref.__gcc_personality_v0
274 .weak DW.ref.__gcc_personality_v0
275 .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
277 .type DW.ref.__gcc_personality_v0, @object
278 .size DW.ref.__gcc_personality_v0, 4
279 DW.ref.__gcc_personality_v0:
280 .long __gcc_personality_v0