1 /* Copyright (C) 2003, 2004 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, write to the Free
16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20 #include <shlib-compat.h>
21 #include <lowlevelcond.h>
22 #include "lowlevel-atomic.h"
31 /* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) */
32 .globl __pthread_cond_wait
33 .type __pthread_cond_wait, @function
59 /* Get internal lock. */
63 CMPXCHG (r3, @(cond_lock,r8), r4, r2)
65 CMPXCHG (r3, @r8, r4, r2)
73 .long _GLOBAL_OFFSET_TABLE_
77 /* Store the reference to the mutex. If there is already a
78 different value in there this is a bad user bug. */
79 mov.l @(dep_mutex,r8),r0
82 mov.l r9, @(dep_mutex,r8)
85 /* Unlock the mutex. */
101 mov.l @(total_seq,r8),r0
102 mov.l @(total_seq+4,r8),r1
105 mov.l r0,@(total_seq,r8)
106 mov.l r1,@(total_seq+4,r8)
107 mov.l @(cond_futex,r8),r0
109 mov.l r0,@(cond_futex,r8)
110 mov #(1 << clock_bits), r2
111 mov.l @(cond_nwaiters,r8), r0
113 mov.l r0, @(cond_nwaiters,r8)
115 /* Get and store current wakeup_seq value. */
116 mov.l @(wakeup_seq,r8), r10
117 mov.l @(wakeup_seq+4,r8), r11
118 mov.l @(broadcast_seq,r8), r0
122 mov.l @(cond_futex,r8),r0
127 DEC (@(cond_lock,r8), r2)
161 CMPXCHG (r3, @(cond_lock,r8), r4, r2)
163 CMPXCHG (r3, @r8, r4, r2)
167 mov.l @(broadcast_seq,r8), r0
172 mov.l @(woken_seq,r8), r0
173 mov.l @(woken_seq+4,r8), r1
175 mov.l @(wakeup_seq,r8), r2
176 mov.l @(wakeup_seq+4,r8), r3
192 mov.l @(woken_seq,r8),r0
193 mov.l @(woken_seq+4,r8),r1
196 mov.l r0,@(woken_seq,r8)
197 mov.l r1,@(woken_seq+4,r8)
200 mov #(1 << clock_bits), r2
201 mov.l @(cond_nwaiters,r8),r0
203 mov.l r0,@(cond_nwaiters,r8)
205 /* Wake up a thread which wants to destroy the condvar object. */
206 mov.l @(total_seq,r8),r0
207 mov.l @(total_seq+4,r8),r1
212 mov #((1 << clock_bits) - 1), r1
214 mov.l @(cond_nwaiters,r8),r0
219 add #cond_nwaiters, r4
230 DEC (@(cond_lock,r8), r2)
242 /* We return the result of the mutex_lock operation. */
256 .long __pthread_mutex_unlock_usercnt-.Lmunlock0b
258 .long __pthread_enable_asynccancel-.Lenable0b
260 .long __pthread_disable_asynccancel-.Ldisable0b
262 .long __pthread_mutex_cond_lock-.Lmlocki0b
265 /* Initial locking failed. */
277 /* Unlock in loop requires waekup. */
290 /* Locking in loop failed. */
303 /* Unlock after loop requires wakeup. */
316 /* The initial unlocking of the mutex failed. */
319 DEC (@(cond_lock,r8), r2)
341 .long __lll_mutex_lock_wait-.Lmwait0b
343 .long __lll_mutex_unlock_wake-.Lmwake0b
345 .long __lll_mutex_lock_wait-.Lmwait1b
347 .long __lll_mutex_unlock_wake-.Lmwake1b
349 .long __lll_mutex_unlock_wake-.Lmwake2b
350 .size __pthread_cond_wait, .-__pthread_cond_wait
351 versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
355 .type __condvar_w_cleanup, @function
359 /* Get internal lock. */
363 CMPXCHG (r3, @(cond_lock,r8), r4, r2)
365 CMPXCHG (r3, @r8, r4, r2)
380 mov.l @(broadcast_seq,r8), r0
389 mov.l @(wakeup_seq,r8),r0
390 mov.l @(wakeup_seq+4,r8),r1
393 mov.l r0,@(wakeup_seq,r8)
394 mov.l r1,@(wakeup_seq+4,r8)
395 mov.l @(cond_futex,r8),r0
397 mov.l r0,@(cond_futex,r8)
400 mov.l @(woken_seq,r8),r0
401 mov.l @(woken_seq+4,r8),r1
404 mov.l r0,@(woken_seq,r8)
405 mov.l r1,@(woken_seq+4,r8)
408 mov #(1 << clock_bits), r2
409 mov.l @(cond_nwaiters,r8),r0
411 mov.l r0,@(cond_nwaiters,r8)
413 /* Wake up a thread which wants to destroy the condvar object. */
415 mov.l @(total_seq,r8),r0
416 mov.l @(total_seq+4,r8),r1
421 mov #((1 << clock_bits) - 1), r1
423 mov.l @(cond_nwaiters,r8),r0
428 add #cond_nwaiters, r4
440 DEC (@(cond_lock,r8), r2)
457 /* Wake up all waiters to make sure no signal gets lost. */
464 shlr r6 /* r6 = 0x7fffffff */
488 .long __lll_mutex_lock_wait-.Lmwait3b
490 .long __lll_mutex_unlock_wake-.Lmwake3b
492 .long __pthread_mutex_cond_lock-.Lmlocki3b
495 .long _Unwind_Resume@GOTOFF
500 .size __condvar_w_cleanup, .-__condvar_w_cleanup
503 .section .gcc_except_table,"a",@progbits
505 .byte 0xff ! @LPStart format (omit)
506 .byte 0xff ! @TType format (omit)
507 .byte 0x0b ! call-site format
509 .uleb128 .Lcstend-.Lcstbegin
511 .ualong .LcleanupSTART-.LSTARTCODE
512 .ualong .LcleanupEND-.LcleanupSTART
513 .ualong __condvar_w_cleanup-.LSTARTCODE
515 .ualong .LcallUR-.LSTARTCODE
516 .ualong .LENDCODE-.LcallUR
521 .section .eh_frame,"a",@progbits
523 .ualong .LENDCIE-.LSTARTCIE ! Length of the CIE.
526 .byte 1 ! Version number.
528 .string "zPLR" ! NUL-terminated augmentation
531 .string "zPL" ! NUL-terminated augmentation
534 .uleb128 1 ! Code alignment factor.
535 .sleb128 -4 ! Data alignment factor.
536 .byte 0x11 ! Return address register
539 .uleb128 7 ! Augmentation value length.
540 .byte 0x9b ! Personality: DW_EH_PE_pcrel
542 ! + DW_EH_PE_indirect
543 .ualong DW.ref.__gcc_personality_v0-.
544 .byte 0x1b ! LSDA Encoding: DW_EH_PE_pcrel
546 .byte 0x1b ! FDE Encoding: DW_EH_PE_pcrel
549 .uleb128 6 ! Augmentation value length.
550 .byte 0x0 ! Personality: absolute
551 .ualong __gcc_personality_v0
552 .byte 0x0 ! LSDA Encoding: absolute
554 .byte 0x0c ! DW_CFA_def_cfa
560 .ualong .LENDFDE-.LSTARTFDE ! Length of the FDE.
562 .ualong .LSTARTFDE-.LSTARTFRAME ! CIE pointer.
564 .ualong .LSTARTCODE-. ! PC-relative start address
567 .ualong .LSTARTCODE ! Start address of the code.
569 .ualong .LENDCODE-.LSTARTCODE ! Length of the code.
570 .uleb128 4 ! Augmentation size
572 .ualong .LexceptSTART-.
574 .ualong .LexceptSTART
577 .ualong .Lpush_r8-.LSTARTCODE
583 .ualong .Lpush_r9-.Lpush_r8
589 .ualong .Lpush_r10-.Lpush_r9
595 .ualong .Lpush_r11-.Lpush_r10
601 .ualong .Lpush_r12-.Lpush_r11
607 .ualong .Lpush_pr-.Lpush_r12
613 .ualong .Lalloc-.Lpush_pr
620 .hidden DW.ref.__gcc_personality_v0
621 .weak DW.ref.__gcc_personality_v0
622 .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
624 .type DW.ref.__gcc_personality_v0, @object
625 .size DW.ref.__gcc_personality_v0, 4
626 DW.ref.__gcc_personality_v0:
627 .long __gcc_personality_v0