2004-03-17  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

	* sysdeps/unix/sysv/linux/kernel-features.h
	(__ASSUME_CLONE_THREAD_FLAGS ): Define for newer SH kernel.
	(__ASSUME_TGKILL, __ASSUME_UTIMES): Likewise.
	* sysdeps/unix/sysv/linux/sh/socket.S: Add unwind information.
This commit is contained in:
Ulrich Drepper 2004-03-20 06:16:26 +00:00
parent 3abb1ff7d1
commit 07bd2a3fda
14 changed files with 1025 additions and 320 deletions

View File

@ -1,3 +1,10 @@
2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/unix/sysv/linux/kernel-features.h
(__ASSUME_CLONE_THREAD_FLAGS ): Define for newer SH kernel.
(__ASSUME_TGKILL, __ASSUME_UTIMES): Likewise.
* sysdeps/unix/sysv/linux/sh/socket.S: Add unwind information.
2004-03-19 Ulrich Drepper <drepper@redhat.com> 2004-03-19 Ulrich Drepper <drepper@redhat.com>
* time/tzfile.c (__tzfile_default): Correct setting of rule_stdoff * time/tzfile.c (__tzfile_default): Correct setting of rule_stdoff

View File

@ -4,6 +4,27 @@
the return value to a safe register. the return value to a safe register.
(CDISABLE): Set the function argument correctly. (CDISABLE): Set the function argument correctly.
2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h (XCHG): Define.
* sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_mutex_lock_wait):
Rewrite so that only one locked memory operation per round is needed.
* sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S
(pthread_barrier_wait): After wakeup, release lock only when the
last thread stopped using the barrier object.
* sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
(__pthread_cond_wait): Don't store mutex address if the current
value is ~0l. Add correct cleanup support and unwind info.
* sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise.
* sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
(__pthread_cond_broadcast): Don't use requeue for pshared condvars.
* sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S: Update comment.
* sysdeps/unix/sysv/linux/sh/pthread_once.S (__pthread_once):
Add correct cleanup support and unwind info.
* sysdeps/unix/sysv/linux/sh/sem_wait.S (__new_sem_wait): Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Add unwind
information for syscall wrappers.
2004-03-18 Ulrich Drepper <drepper@redhat.com> 2004-03-18 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/internaltypes.h (struct pthread_attr): Add * sysdeps/unix/sysv/linux/internaltypes.h (struct pthread_attr): Add

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -20,6 +20,7 @@
#define _IMP1 #1 #define _IMP1 #1
#define _IMM1 #-1 #define _IMM1 #-1
#define _IMM4 #-4
#define _IMM6 #-6 #define _IMM6 #-6
#define _IMM8 #-8 #define _IMM8 #-8
@ -53,6 +54,16 @@
mov.l reg, mem; \ mov.l reg, mem; \
99: mov r1, r15 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) \ #define CMPXCHG(reg, mem, new, old) \
.align 2; \ .align 2; \
mova 99f, r0; \ mova 99f, r0; \

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -38,17 +38,12 @@ __lll_mutex_lock_wait:
mov r5, r8 mov r5, r8
mov #0, r7 /* No timeout. */ mov #0, r7 /* No timeout. */
mov #FUTEX_WAIT, r5 mov #FUTEX_WAIT, r5
1:
mov #2, r4 mov #2, r4
cmp/eq r4, r6 cmp/eq r4, r6
bt 3f bf 2f
mov #1, r3 1:
CMPXCHG (r3, @r8, r4, r2)
tst r2, r2
bt 2f
3:
mov r8, r4 mov r8, r4
mov #SYS_futex, r3 mov #SYS_futex, r3
extu.b r3, r3 extu.b r3, r3
@ -56,9 +51,9 @@ __lll_mutex_lock_wait:
SYSCALL_INST_PAD SYSCALL_INST_PAD
2: 2:
mov #0, r3
mov #2, r4 mov #2, r4
CMPXCHG (r3, @r8, r4, r2) XCHG (r4, @r8, r2)
tst r2, r2
bf 1b bf 1b
mov.l @r15+, r8 mov.l @r15+, r8

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -80,6 +80,23 @@ pthread_barrier_wait:
cmp/eq r0, r6 cmp/eq r0, r6
bt 8b 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)
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 */ mov #0, r0 /* != PTHREAD_BARRIER_SERIAL_THREAD */
lds.l @r15+, pr lds.l @r15+, pr
mov.l @r15+, r8 mov.l @r15+, r8
@ -88,8 +105,6 @@ pthread_barrier_wait:
3: 3:
/* The necessary number of threads arrived. */ /* The necessary number of threads arrived. */
mov.l @(INIT_COUNT,r8), r0
mov.l r0, @(LEFT,r8)
mov.l @(CURR_EVENT,r8), r1 mov.l @(CURR_EVENT,r8), r1
add #1, r1 add #1, r1
mov.l r1, @(CURR_EVENT,r8) mov.l r1, @(CURR_EVENT,r8)
@ -108,6 +123,15 @@ pthread_barrier_wait:
trapa #0x14 trapa #0x14
SYSCALL_INST_PAD 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)
add #-1, r4
cmp/eq r2, r4
bf 5f
/* Release the mutex. */ /* Release the mutex. */
DEC (@(MUTEX,r8), r2) DEC (@(MUTEX,r8), r2)
tst r2, r2 tst r2, r2
@ -148,6 +172,16 @@ pthread_barrier_wait:
bra 7b bra 7b
mov r9, r6 mov r9, r6
9:
mov r6, r9
mov r8, r4
mov.l .Lwake2, r1
bsrf r1
add #MUTEX, r4
.Lwake2b:
bra 10b
mov r9, r6
.align 2 .align 2
.Lall: .Lall:
.long 0x7fffffff .long 0x7fffffff
@ -157,4 +191,6 @@ pthread_barrier_wait:
.long __lll_mutex_unlock_wake-.Lwake0b .long __lll_mutex_unlock_wake-.Lwake0b
.Lwake1: .Lwake1:
.long __lll_mutex_unlock_wake-.Lwake1b .long __lll_mutex_unlock_wake-.Lwake1b
.Lwake2:
.long __lll_mutex_unlock_wake-.Lwake2b
.size pthread_barrier_wait,.-pthread_barrier_wait .size pthread_barrier_wait,.-pthread_barrier_wait

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -79,11 +79,16 @@ __pthread_cond_broadcast:
#endif #endif
tst r2, r2 tst r2, r2
bf 7f bf 7f
8: 8:
/* Wake up all threads. */ /* Don't use requeue for pshared condvars. */
mov #-1, r0
cmp/eq r0, r9
mov r8, r4 mov r8, r4
add #wakeup_seq, r4 bt/s 9f
#ifdef __ASSUME_FUTEX_REQUEUE add #wakeup_seq, r4
/* Wake up all threads. */
mov #FUTEX_REQUEUE, r5 mov #FUTEX_REQUEUE, r5
mov #1, r6 mov #1, r6
mov #-1, r7 mov #-1, r7
@ -95,17 +100,9 @@ __pthread_cond_broadcast:
mov #SYS_futex, r3 mov #SYS_futex, r3
extu.b r3, r3 extu.b r3, r3
trapa #0x15 trapa #0x15
#else
mov #FUTEX_WAKE, r5
mov #-1, r6
shlr r6 /* r6 = 0x7fffffff */
mov #0, r7
mov #SYS_futex, r3
extu.b r3, r3
trapa #0x14
#endif
SYSCALL_INST_PAD SYSCALL_INST_PAD
10:
mov #0, r0 mov #0, r0
lds.l @r15+, pr lds.l @r15+, pr
mov.l @r15+, r8 mov.l @r15+, r8
@ -167,6 +164,18 @@ __pthread_cond_broadcast:
bra 8b bra 8b
nop nop
9:
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
bra 10b
nop
.align 2 .align 2
.Lmwait5: .Lmwait5:
.long __lll_mutex_lock_wait-.Lmwait5b .long __lll_mutex_lock_wait-.Lmwait5b

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -73,7 +73,7 @@ __pthread_cond_signal:
mov.l r0,@(wakeup_seq,r8) mov.l r0,@(wakeup_seq,r8)
mov.l r1,@(wakeup_seq+4,r8) mov.l r1,@(wakeup_seq+4,r8)
/* Wake up one thread by moving it to the internal lock futex. */ /* Wake up one thread. */
mov r8, r4 mov r8, r4
add #wakeup_seq, r4 add #wakeup_seq, r4
mov #FUTEX_WAKE, r5 mov #FUTEX_WAKE, r5

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -36,17 +36,31 @@
.type __pthread_cond_timedwait, @function .type __pthread_cond_timedwait, @function
.align 5 .align 5
__pthread_cond_timedwait: __pthread_cond_timedwait:
.LSTARTCODE:
mov.l r8, @-r15 mov.l r8, @-r15
.Lpush_r8:
mov.l r9, @-r15 mov.l r9, @-r15
.Lpush_r9:
mov.l r10, @-r15 mov.l r10, @-r15
.Lpush_r10:
mov.l r11, @-r15 mov.l r11, @-r15
.Lpush_r11:
mov.l r12, @-r15 mov.l r12, @-r15
.Lpush_r12:
mov.l r13, @-r15 mov.l r13, @-r15
.Lpush_r13:
sts.l pr, @-r15 sts.l pr, @-r15
.Lpush_pr:
add #-64, r15 add #-64, r15
.Lalloc:
mov r4, r8 mov r4, r8
mov r5, r9 mov r5, r9
mov r6, r13 mov r6, r13
#ifdef PIC
mova .Lgot0, r0
mov.l .Lgot0, r12
add r0, r12
#endif
/* Get internal lock. */ /* Get internal lock. */
mov #0, r3 mov #0, r3
@ -59,11 +73,21 @@ __pthread_cond_timedwait:
bt 2f bt 2f
bra 1f bra 1f
nop nop
#ifdef PIC
.align 2
.Lgot0:
.long _GLOBAL_OFFSET_TABLE_
#endif
2: 2:
/* Store the reference to the mutex. If there is already a /* Store the reference to the mutex. If there is already a
different value in there this is a bad user bug. */ 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) mov.l r9, @(dep_mutex,r8)
17:
/* Unlock the mutex. */ /* Unlock the mutex. */
mov.l .Lmunlock1, r1 mov.l .Lmunlock1, r1
mov #0, r5 mov #0, r5
@ -87,50 +111,11 @@ __pthread_cond_timedwait:
mov.l r0,@(total_seq,r8) mov.l r0,@(total_seq,r8)
mov.l r1,@(total_seq+4,r8) mov.l r1,@(total_seq+4,r8)
/* Install cancellation handler. */
#ifdef PIC
mova .Lgot1, r0
mov.l .Lgot1, r12
add r0, r12
mov.l .Lccleanup1, r5
add r12, r5
#else
mov.l .Lccleanup1, r5
#endif
mov r15, r4
add #32, r4
/* Prepare structure passed to cancellation handler. */
mov.l r8, @(4,r15)
mov.l r9, @(8,r15)
mov.l .Lccpush1, r1
bsrf r1
mov r15, r6
.Lccpush1b:
/* Get and store current wakeup_seq value. */ /* Get and store current wakeup_seq value. */
mov.l @(wakeup_seq,r8), r10 mov.l @(wakeup_seq,r8), r10
mov.l @(wakeup_seq+4,r8), r11 mov.l @(wakeup_seq+4,r8), r11
/* Unlock. */
8: 8:
#if cond_lock != 0
DEC (@(cond_lock,r8), r2)
#else
DEC (@r8, r2)
#endif
tst r2, r2
bt 4f
bra 3f
nop
4:
mov.l .Lenable1, r1
bsrf r1
nop
.Lenable1b:
mov.l r0, @r15
/* Get current time. */ /* Get current time. */
mov r15, r4 mov r15, r4
add #16, r4 add #16, r4
@ -162,6 +147,24 @@ __pthread_cond_timedwait:
mov.l r2, @(16,r15) mov.l r2, @(16,r15)
mov.l r3, @(20,r15) mov.l r3, @(20,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 mov r15, r7
add #16, r7 add #16, r7
mov #FUTEX_WAIT, r5 mov #FUTEX_WAIT, r5
@ -178,6 +181,7 @@ __pthread_cond_timedwait:
bsrf r1 bsrf r1
mov.l @r15, r4 mov.l @r15, r4
.Ldisable1b: .Ldisable1b:
.LcleanupEND:
/* Lock. */ /* Lock. */
mov #0, r3 mov #0, r3
@ -195,20 +199,15 @@ __pthread_cond_timedwait:
mov.l @(wakeup_seq,r8), r2 mov.l @(wakeup_seq,r8), r2
mov.l @(wakeup_seq+4,r8), r3 mov.l @(wakeup_seq+4,r8), r3
cmp/hi r11, r3 cmp/eq r3, r11
bt 7f bf 7f
cmp/hi r3, r11 cmp/eq r2, r10
bt 15f
cmp/hs r2, r10
bt 15f bt 15f
7: 7:
cmp/hi r1, r3 cmp/eq r1, r3
bt 9f bf 9f
cmp/hi r3, r1 cmp/eq r0, r2
bt 15f bf 9f
cmp/hi r0, r2
bt 9f
15: 15:
mov.l @(12,r15),r0 mov.l @(12,r15),r0
cmp/eq #-ETIMEDOUT, r0 cmp/eq #-ETIMEDOUT, r0
@ -252,14 +251,6 @@ __pthread_cond_timedwait:
bf 10f bf 10f
11: 11:
/* Remove cancellation handler. */
mov r15, r4
add #32, r4
mov.l .Lcpop1, r1
bsrf r1
mov #0, r5
.Lcpop1b:
mov r9, r4 mov r9, r4
mov.l .Lmlocki1, r1 mov.l .Lmlocki1, r1
bsrf r1 bsrf r1
@ -273,44 +264,39 @@ __pthread_cond_timedwait:
18: 18:
add #64, r15 add #64, r15
.Lfree:
lds.l @r15+, pr lds.l @r15+, pr
.Lpop_pr:
mov.l @r15+, r13 mov.l @r15+, r13
.Lpop_r13:
mov.l @r15+, r12 mov.l @r15+, r12
.Lpop_r12:
mov.l @r15+, r11 mov.l @r15+, r11
.Lpop_r11:
mov.l @r15+, r10 mov.l @r15+, r10
.Lpop_r10:
mov.l @r15+, r9 mov.l @r15+, r9
.Lpop_r9:
rts rts
mov.l @r15+, r8 mov.l @r15+, r8
ret .Lpop_r8:
.L1k: .L1k:
.word 1000 .word 1000
.align 2 .align 2
.Lmunlock1: .Lmunlock1:
.long __pthread_mutex_unlock_usercnt-.Lmunlock1b .long __pthread_mutex_unlock_usercnt-.Lmunlock1b
#ifdef PIC
.Lgot1:
.long _GLOBAL_OFFSET_TABLE_
.Lccleanup1:
.long __condvar_cleanup@GOTOFF
#else
.Lccleanup1:
.long __condvar_cleanup
#endif
.Lccpush1:
.long __pthread_cleanup_push-.Lccpush1b
.Lenable1: .Lenable1:
.long __pthread_enable_asynccancel-.Lenable1b .long __pthread_enable_asynccancel-.Lenable1b
.Ldisable1: .Ldisable1:
.long __pthread_disable_asynccancel-.Ldisable1b .long __pthread_disable_asynccancel-.Ldisable1b
.Lcpop1:
.long __pthread_cleanup_pop-.Lcpop1b
.Lmlocki1: .Lmlocki1:
.long __pthread_mutex_cond_lock-.Lmlocki1b .long __pthread_mutex_cond_lock-.Lmlocki1b
.L1g: .L1g:
.long 1000000000 .long 1000000000
1: 1:
.LSblSTART:
/* Initial locking failed. */ /* Initial locking failed. */
mov r8, r5 mov r8, r5
#if cond_lock != 0 #if cond_lock != 0
@ -384,6 +370,7 @@ __pthread_cond_timedwait:
17: 17:
bra 18b bra 18b
mov.l @(24,r15), r0 mov.l @(24,r15), r0
.LSblEND:
.align 2 .align 2
.Lmwait2: .Lmwait2:
@ -399,3 +386,281 @@ __pthread_cond_timedwait:
.size __pthread_cond_timedwait, .-__pthread_cond_timedwait .size __pthread_cond_timedwait, .-__pthread_cond_timedwait
versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait, versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
GLIBC_2_3_2) GLIBC_2_3_2)
.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 .Lmwait5, r1
bsrf r1
mov r2, r4
.Lmwait5b:
1:
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)
#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 .Lmwake5, r1
bsrf r1
nop
.Lmwake5b:
2:
/* Wake up all waiters to make sure no signal gets lost. */
mov r8, r4
add #wakeup_seq, 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
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
.Lmwait5:
.long __lll_mutex_lock_wait-.Lmwait5b
.Lmwake5:
.long __lll_mutex_unlock_wake-.Lmwake5b
.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
.byte 0x4
.ualong .Lfree-.Lalloc
.byte 0xe
.uleb128 28
.byte 0x4
.ualong .Lpop_pr-.Lfree
.byte 0xe
.uleb128 24
.byte 0xd1
.byte 0x4
.ualong .Lpop_r13-.Lpop_pr
.byte 0xe
.uleb128 20
.byte 0xcd
.byte 0x4
.ualong .Lpop_r12-.Lpop_r13
.byte 0xe
.uleb128 16
.byte 0xcc
.byte 0x4
.ualong .Lpop_r11-.Lpop_r12
.byte 0xe
.uleb128 12
.byte 0xcb
.byte 0x4
.ualong .Lpop_r10-.Lpop_r11
.byte 0xe
.uleb128 8
.byte 0xca
.byte 0x4
.ualong .Lpop_r9-.Lpop_r10
.byte 0xe
.uleb128 4
.byte 0xc9
.byte 0x4
.ualong .Lpop_r8-.Lpop_r9
.byte 0xe
.uleb128 0
.byte 0xc8
.byte 0x4
.ualong .LSblSTART-.Lpop_r8
.byte 0xe
.uleb128 72
.byte 0x4
.ualong .LSblEND-.LSblSTART
.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

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -28,119 +28,33 @@
.text .text
.align 5
.type __condvar_cleanup, @function
.globl __condvar_cleanup
.hidden __condvar_cleanup
__condvar_cleanup:
mov.l r8, @-r15
mov.l r9, @-r15
sts.l pr, @-r15
mov r4, r9
mov.l @(4,r9), 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
bt 1f
mov r8, r5
#if cond_lock != 0
add #cond_lock, r5
#endif
mov.l .Lwait0, r1
bsrf r1
mov r2, r4
.Lwait0b:
1:
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)
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)
/* Release internal lock. */
#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 .Lwake0, r1
bsrf r1
nop
.Lwake0b:
2:
/* Wake up all waiters to make sure no signal gets lost. */
mov r8, r4
add #wakeup_seq, 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
mov.l .Lmlocki1, r1
bsrf r1
mov.l @(8,r9), r4
.Lmlocki1b:
lds.l @r15+, pr
mov.l @r15+, r9
rts
mov.l @r15+, r8
.align 2
.Lwait0:
.long __lll_mutex_lock_wait-.Lwait0b
.Lwake0:
.long __lll_mutex_unlock_wake-.Lwake0b
.Lmlocki1:
.long __pthread_mutex_cond_lock-.Lmlocki1b
.size __condvar_cleanup, .-__condvar_cleanup
/* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) */ /* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) */
.globl __pthread_cond_wait .globl __pthread_cond_wait
.type __pthread_cond_wait, @function .type __pthread_cond_wait, @function
.align 5 .align 5
__pthread_cond_wait: __pthread_cond_wait:
.LSTARTCODE:
mov.l r8, @-r15 mov.l r8, @-r15
.Lpush_r8:
mov.l r9, @-r15 mov.l r9, @-r15
.Lpush_r9:
mov.l r10, @-r15 mov.l r10, @-r15
.Lpush_r10:
mov.l r11, @-r15 mov.l r11, @-r15
.Lpush_r11:
mov.l r12, @-r15 mov.l r12, @-r15
.Lpush_r12:
sts.l pr, @-r15 sts.l pr, @-r15
.Lpush_pr:
add #-48, r15 add #-48, r15
.Lalloc:
mov r4, r8 mov r4, r8
mov r5, r9 mov r5, r9
#ifdef PIC
mova .Lgot0, r0
mov.l .Lgot0, r12
add r0, r12
#endif
/* Get internal lock. */ /* Get internal lock. */
mov #0, r3 mov #0, r3
@ -153,12 +67,21 @@ __pthread_cond_wait:
bt 2f bt 2f
bra 1f bra 1f
nop nop
#ifdef PIC
.align 2
.Lgot0:
.long _GLOBAL_OFFSET_TABLE_
#endif
2: 2:
/* Store the reference to the mutex. If there is already a /* Store the reference to the mutex. If there is already a
different value in there this is a bad user bug. */ 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) mov.l r9, @(dep_mutex,r8)
15:
/* Unlock the mutex. */ /* Unlock the mutex. */
mov.l .Lmunlock0, r1 mov.l .Lmunlock0, r1
mov #0, r5 mov #0, r5
@ -182,28 +105,6 @@ __pthread_cond_wait:
mov.l r0,@(total_seq,r8) mov.l r0,@(total_seq,r8)
mov.l r1,@(total_seq+4,r8) mov.l r1,@(total_seq+4,r8)
/* Install cancellation handler. */
#ifdef PIC
mova .Lgot0, r0
mov.l .Lgot0, r12
add r0, r12
mov.l .Lccleanup0, r5
add r12, r5
#else
mov.l .Lccleanup0, r5
#endif
mov r15, r4
add #16, r4
/* Prepare structure passed to cancellation handler. */
mov.l r8, @(4,r15)
mov.l r9, @(8,r15)
mov.l .Lccpush0, r1
bsrf r1
mov r15, r6
.Lccpush0b:
/* Get and store current wakeup_seq value. */ /* Get and store current wakeup_seq value. */
mov.l @(wakeup_seq,r8), r10 mov.l @(wakeup_seq,r8), r10
mov.l @(wakeup_seq+4,r8), r11 mov.l @(wakeup_seq+4,r8), r11
@ -218,6 +119,7 @@ __pthread_cond_wait:
tst r2, r2 tst r2, r2
bf 3f bf 3f
4: 4:
.LcleanupSTART:
mov.l .Lenable0, r1 mov.l .Lenable0, r1
bsrf r1 bsrf r1
nop nop
@ -238,6 +140,7 @@ __pthread_cond_wait:
bsrf r1 bsrf r1
mov.l @r15, r4 mov.l @r15, r4
.Ldisable0b: .Ldisable0b:
.LcleanupEND:
/* Lock. */ /* Lock. */
mov #0, r3 mov #0, r3
@ -255,20 +158,15 @@ __pthread_cond_wait:
mov.l @(wakeup_seq,r8), r2 mov.l @(wakeup_seq,r8), r2
mov.l @(wakeup_seq+4,r8), r3 mov.l @(wakeup_seq+4,r8), r3
cmp/hi r11, r3 cmp/eq r3, r11
bt 7f bf 7f
cmp/hi r3, r11 cmp/eq r2, r10
bt 8b
cmp/hs r2, r10
bt 8b bt 8b
7: 7:
cmp/hi r1, r3 cmp/eq r1, r3
bt 9f bf 9f
cmp/hi r3, r1 cmp/eq r0, r2
bt 8b bt 8b
cmp/hi r0, r2
bf 8b
9: 9:
mov #1, r2 mov #1, r2
mov #0, r3 mov #0, r3
@ -290,55 +188,41 @@ __pthread_cond_wait:
bf 10f bf 10f
11: 11:
/* Remove cancellation handler. */
mov r15, r4
add #16, r4
mov.l .Lcpop0, r1
bsrf r1
mov #0, r5
.Lcpop0b:
mov r9, r4
mov.l .Lmlocki0, r1 mov.l .Lmlocki0, r1
bsrf r1 bsrf r1
nop mov r9, r4
.Lmlocki0b: .Lmlocki0b:
/* We return the result of the mutex_lock operation. */ /* We return the result of the mutex_lock operation. */
14: 14:
add #48, r15 add #48, r15
.Lfree:
lds.l @r15+, pr lds.l @r15+, pr
.Lpop_pr:
mov.l @r15+, r12 mov.l @r15+, r12
.Lpop_r12:
mov.l @r15+, r11 mov.l @r15+, r11
.Lpop_r11:
mov.l @r15+, r10 mov.l @r15+, r10
.Lpop_r10:
mov.l @r15+, r9 mov.l @r15+, r9
.Lpop_r9:
rts rts
mov.l @r15+, r8 mov.l @r15+, r8
.Lpop_r8:
.align 2 .align 2
.Lmunlock0: .Lmunlock0:
.long __pthread_mutex_unlock_usercnt-.Lmunlock0b .long __pthread_mutex_unlock_usercnt-.Lmunlock0b
#ifdef PIC
.Lgot0:
.long _GLOBAL_OFFSET_TABLE_
.Lccleanup0:
.long __condvar_cleanup@GOTOFF
#else
.Lccleanup0:
.long __condvar_cleanup
#endif
.Lccpush0:
.long __pthread_cleanup_push-.Lccpush0b
.Lenable0: .Lenable0:
.long __pthread_enable_asynccancel-.Lenable0b .long __pthread_enable_asynccancel-.Lenable0b
.Ldisable0: .Ldisable0:
.long __pthread_disable_asynccancel-.Ldisable0b .long __pthread_disable_asynccancel-.Ldisable0b
.Lcpop0:
.long __pthread_cleanup_pop-.Lcpop0b
.Lmlocki0: .Lmlocki0:
.long __pthread_mutex_cond_lock-.Lmlocki0b .long __pthread_mutex_cond_lock-.Lmlocki0b
1: 1:
.LSblSTART:
/* Initial locking failed. */ /* Initial locking failed. */
mov r8, r5 mov r8, r5
#if cond_lock != 0 #if cond_lock != 0
@ -412,6 +296,7 @@ __pthread_cond_wait:
13: 13:
bra 14b bra 14b
mov.l @(12,r15), r0 mov.l @(12,r15), r0
.LSblEND:
.align 2 .align 2
.Lmwait0: .Lmwait0:
@ -427,3 +312,270 @@ __pthread_cond_wait:
.size __pthread_cond_wait, .-__pthread_cond_wait .size __pthread_cond_wait, .-__pthread_cond_wait
versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait, versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
GLIBC_2_3_2) GLIBC_2_3_2)
.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 .Lmwait3, r1
bsrf r1
mov r2, r4
.Lmwait3b:
1:
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)
#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 .Lmwake3, r1
bsrf r1
nop
.Lmwake3b:
2:
/* Wake up all waiters to make sure no signal gets lost. */
mov r8, r4
add #wakeup_seq, 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
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
.align 2
.Lmwait3:
.long __lll_mutex_lock_wait-.Lmwait3b
.Lmwake3:
.long __lll_mutex_unlock_wake-.Lmwake3b
.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
.byte 0x4
.ualong .Lfree-.Lalloc
.byte 0xe
.uleb128 24
.byte 0x4
.ualong .Lpop_pr-.Lfree
.byte 0xe
.uleb128 20
.byte 0xd1
.byte 0x4
.ualong .Lpop_r12-.Lpop_pr
.byte 0xe
.uleb128 16
.byte 0xcc
.byte 0x4
.ualong .Lpop_r11-.Lpop_r12
.byte 0xe
.uleb128 12
.byte 0xcb
.byte 0x4
.ualong .Lpop_r10-.Lpop_r11
.byte 0xe
.uleb128 8
.byte 0xca
.byte 0x4
.ualong .Lpop_r9-.Lpop_r10
.byte 0xe
.uleb128 4
.byte 0xc9
.byte 0x4
.ualong .Lpop_r8-.Lpop_r9
.byte 0xe
.uleb128 0
.byte 0xc8
.byte 0x4
.ualong .LSblSTART-.Lpop_r8
.byte 0xe
.uleb128 72
.byte 0x4
.ualong .LSblEND-.LSblSTART
.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

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -16,6 +16,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <unwindbuf.h>
#include <sysdep.h> #include <sysdep.h>
#include "lowlevel-atomic.h" #include "lowlevel-atomic.h"
@ -29,6 +30,7 @@
.globl __pthread_once .globl __pthread_once
.type __pthread_once,@function .type __pthread_once,@function
.align 5 .align 5
cfi_startproc
__pthread_once: __pthread_once:
mov.l @r4, r0 mov.l @r4, r0
tst #2, r0 tst #2, r0
@ -38,20 +40,27 @@ __pthread_once:
1: 1:
mov.l r12, @-r15 mov.l r12, @-r15
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r12, 0)
mov.l r9, @-r15 mov.l r9, @-r15
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r9, 0)
mov.l r8, @-r15 mov.l r8, @-r15
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r8, 0)
sts.l pr, @-r15 sts.l pr, @-r15
cfi_adjust_cfa_offset (4)
cfi_rel_offset (pr, 0)
mov r5, r8 mov r5, r8
mov r4, r9
/* Not yet initialized or initialization in progress. /* Not yet initialized or initialization in progress.
Get the fork generation counter now. */ Get the fork generation counter now. */
6: 6:
mov.l @r4, r1 mov.l @r4, r1
#ifdef PIC
mova .Lgot, r0 mova .Lgot, r0
mov.l .Lgot, r12 mov.l .Lgot, r12
add r0, r12 add r0, r12
#endif
5: 5:
mov r1, r0 mov r1, r0
@ -97,9 +106,9 @@ __pthread_once:
nop nop
.align 2 .align 2
#ifdef PIC
.Lgot: .Lgot:
.long _GLOBAL_OFFSET_TABLE_ .long _GLOBAL_OFFSET_TABLE_
#ifdef PIC
.Lfgen: .Lfgen:
.long __fork_generation@GOTOFF .long __fork_generation@GOTOFF
#else #else
@ -109,31 +118,40 @@ __pthread_once:
3: 3:
/* Call the initializer function after setting up the /* Call the initializer function after setting up the
cancellation handler. */ cancellation handler. Note that it is not possible here
/* Allocate a _pthread_cleanup_buffer on stack. */ to use the unwind-based cleanup handling. This would require
add #-16, r15 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
/* Push the cleanup handler. */
mov r4, r9
mov r15, r4
mov.l .Lconce, r5
#ifdef PIC
add r12, r5
#endif
mov.l .Lcpush, r1 mov.l .Lcpush, r1
bsrf r1 bsrf r1
mov r9, r6 mov r15, r4
.Lcpush0: .Lcpush0:
/* Call the user-provided initialization function. */
jsr @r8 jsr @r8
nop nop
/* Pop the cleanup handler. */ /* Pop the cleanup handler. */
mov r15, r4
mov.l .Lcpop, r1 mov.l .Lcpop, r1
bsrf r1 bsrf r1
mov #0, r5 mov r15, r4
.Lcpop0: .Lcpop0:
add #16, r15
add #UNWINDBUFSIZE, r15
cfi_adjust_cfa_offset (-UNWINDBUFSIZE)
/* Sucessful run of the initializer. Signal that we are done. */ /* Sucessful run of the initializer. Signal that we are done. */
INC (@r9, r2) INC (@r9, r2)
@ -150,24 +168,55 @@ __pthread_once:
4: 4:
lds.l @r15+, pr lds.l @r15+, pr
cfi_adjust_cfa_offset (-4)
cfi_restore (pr)
mov.l @r15+, r8 mov.l @r15+, r8
cfi_adjust_cfa_offset (-4)
cfi_restore (r8)
mov.l @r15+, r9 mov.l @r15+, r9
cfi_adjust_cfa_offset (-4)
cfi_restore (r9)
mov.l @r15+, r12 mov.l @r15+, r12
cfi_adjust_cfa_offset (-4)
cfi_restore (r12)
rts rts
mov #0, r0 mov #0, r0
.align 2 7:
.Lconce: /* __sigsetjmp returned for the second time. */
#ifdef PIC cfi_adjust_cfa_offset (UNWINDBUFSIZE+16)
.long clear_once_control@GOTOFF cfi_offset (r12, -4)
#else cfi_offset (r9, -8)
.long clear_once_control cfi_offset (r8, -12)
#endif cfi_offset (pr, -16)
.Lcpush: mov #0, r7
.long __pthread_cleanup_push - .Lcpush0 /* Note: no @PLT. */ mov.l r7, @r9
.Lcpop: mov r9, r4
.long __pthread_cleanup_pop - .Lcpop0 /* Note: no @PLT. */ mov #FUTEX_WAKE, 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
.align 2
.Lsigsetjmp:
.long __sigsetjmp@PLT-(.Lsigsetjmp0+2-.)
.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 .size __pthread_once,.-__pthread_once
.globl __pthread_once_internal .globl __pthread_once_internal

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -33,6 +33,7 @@
.globl __new_sem_wait .globl __new_sem_wait
.type __new_sem_wait,@function .type __new_sem_wait,@function
.align 5 .align 5
cfi_startproc
__new_sem_wait: __new_sem_wait:
/* First check for cancellation. */ /* First check for cancellation. */
stc gbr, r0 stc gbr, r0
@ -44,9 +45,17 @@ __new_sem_wait:
bt 5f bt 5f
mov.l r8, @-r15 mov.l r8, @-r15
cfi_adjust_cfa_offset(4)
cfi_rel_offset (r8, 0)
mov.l r10, @-r15 mov.l r10, @-r15
cfi_adjust_cfa_offset(4)
cfi_rel_offset (r10, 0)
mov.l r12, @-r15 mov.l r12, @-r15
cfi_adjust_cfa_offset(4)
cfi_rel_offset (r12, 0)
sts.l pr, @-r15 sts.l pr, @-r15
cfi_adjust_cfa_offset(4)
cfi_rel_offset (pr, 0)
mov r4, r8 mov r4, r8
3: 3:
mov.l @r8, r0 mov.l @r8, r0
@ -57,12 +66,9 @@ __new_sem_wait:
mov r0, r4 mov r0, r4
add #-1, r3 add #-1, r3
CMPXCHG (r4, @r8, r3, r2) CMPXCHG (r4, @r8, r3, r2)
bf 2b bf/s 2b
lds.l @r15+, pr mov r2, r0
mov.l @r15+, r12 bra 9f
mov.l @r15+, r10
mov.l @r15+, r8
rts
mov #0, r0 mov #0, r0
1: 1:
@ -112,13 +118,21 @@ __new_sem_wait:
.Lerrloc0b: .Lerrloc0b:
mov.l r8, @r0 mov.l r8, @r0
#endif #endif
mov #-1, r0
9:
lds.l @r15+, pr lds.l @r15+, pr
cfi_adjust_cfa_offset (-4)
cfi_restore (pr)
mov.l @r15+, r12 mov.l @r15+, r12
cfi_adjust_cfa_offset (-4)
cfi_restore (r12)
mov.l @r15+, r10 mov.l @r15+, r10
mov.l @r15+, r8 cfi_adjust_cfa_offset (-4)
cfi_restore (r10)
rts rts
mov #-1, r0 mov.l @r15+, r8
cfi_adjust_cfa_offset (-4)
cfi_restore (r8)
5: 5:
/* Canceled. */ /* Canceled. */
stc gbr, r0 stc gbr, r0
@ -132,6 +146,7 @@ __new_sem_wait:
mov.l .Lunwind, r2 mov.l .Lunwind, r2
jmp @r2 jmp @r2
mov.l @(r0,r1), r4 mov.l @(r0,r1), r4
cfi_endproc
.Lchand: .Lchand:
.word CANCELHANDLING - TLS_PRE_TCB_SIZE .word CANCELHANDLING - TLS_PRE_TCB_SIZE

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc. /* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -31,6 +31,7 @@
# define PSEUDO(name, syscall_name, args) \ # define PSEUDO(name, syscall_name, args) \
.text; \ .text; \
ENTRY (name); \ ENTRY (name); \
.Lpseudo_start: \
SINGLE_THREAD_P; \ SINGLE_THREAD_P; \
bf .Lpseudo_cancel; \ bf .Lpseudo_cancel; \
.type __##syscall_name##_nocancel,@function; \ .type __##syscall_name##_nocancel,@function; \
@ -48,19 +49,27 @@
.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \ .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
.Lpseudo_cancel: \ .Lpseudo_cancel: \
sts.l pr,@-r15; \ sts.l pr,@-r15; \
.LCFI0: \
add _IMM16,r15; \ add _IMM16,r15; \
SAVE_ARGS_##args; \ SAVE_ARGS_##args; \
.LCFI1: \
CENABLE; \ CENABLE; \
LOAD_ARGS_##args; \ LOAD_ARGS_##args; \
add _IMP16,r15; \ add _IMP16,r15; \
.LCFI2: \
lds.l @r15+,pr; \ lds.l @r15+,pr; \
.LCFI3: \
DO_CALL(syscall_name, args); \ DO_CALL(syscall_name, args); \
SYSCALL_INST_PAD; \ SYSCALL_INST_PAD; \
sts.l pr,@-r15; \ sts.l pr,@-r15; \
.LCFI4: \
mov.l r0,@-r15; \ mov.l r0,@-r15; \
.LCFI5: \
CDISABLE; \ CDISABLE; \
mov.l @r15+,r0; \ mov.l @r15+,r0; \
.LCFI6: \
lds.l @r15+,pr; \ lds.l @r15+,pr; \
.LCFI7: \
mov r0,r1; \ mov r0,r1; \
mov _IMM12,r2; \ mov _IMM12,r2; \
shad r2,r1; \ shad r2,r1; \
@ -69,7 +78,96 @@
bf .Lpseudo_end; \ bf .Lpseudo_end; \
.Lsyscall_error: \ .Lsyscall_error: \
SYSCALL_ERROR_HANDLER; \ SYSCALL_ERROR_HANDLER; \
.Lpseudo_end: .Lpseudo_end: \
/* Create unwinding information for the syscall wrapper. */ \
.section .eh_frame,"a",@progbits; \
.Lframe1: \
.ualong .LECIE1-.LSCIE1; \
.LSCIE1: \
.ualong 0x0; \
.byte 0x1; \
AUGMENTATION_STRING; \
.uleb128 0x1; \
.sleb128 -4; \
.byte 0x11; \
AUGMENTATION_PARAM; \
.byte 0xc; \
.uleb128 0xf; \
.uleb128 0x0; \
.align 2; \
.LECIE1: \
.LSFDE1: \
.ualong .LEFDE1-.LASFDE1; \
.LASFDE1: \
.ualong .LASFDE1-.Lframe1; \
START_SYMBOL_REF; \
.ualong .Lpseudo_end - .Lpseudo_start; \
AUGMENTATION_PARAM_FDE; \
.byte 0x4; \
.ualong .LCFI0-.Lpseudo_start; \
.byte 0xe; \
.uleb128 0x4; \
.byte 0x91; \
.uleb128 0x1; \
.byte 0x4; \
.ualong .LCFI1-.LCFI0; \
.byte 0xe; \
.uleb128 0x14; \
FRAME_REG_##args; \
.byte 0x4; \
.ualong .LCFI2-.LCFI1; \
.byte 0xe; \
.uleb128 0x4; \
.byte 0x4; \
.ualong .LCFI3-.LCFI2; \
.byte 0xe; \
.uleb128 0x0; \
.byte 0xd1; \
.byte 0x4; \
.ualong .LCFI4-.LCFI3; \
.byte 0xe; \
.uleb128 0x4; \
.byte 0x91; \
.uleb128 0x1; \
.byte 0x4; \
.ualong .LCFI5-.LCFI4; \
.byte 0xe; \
.uleb128 0x8; \
.byte 0x80; \
.uleb128 0x2; \
.byte 0x4; \
.ualong .LCFI6-.LCFI5; \
.byte 0xe; \
.uleb128 0x4; \
.byte 0xc0; \
.byte 0x4; \
.ualong .LCFI7-.LCFI6; \
.byte 0xe; \
.uleb128 0x0; \
.byte 0xd1; \
.align 2; \
.LEFDE1: \
.previous
# ifdef SHARED
# define AUGMENTATION_STRING .string "zR"
# define AUGMENTATION_PARAM .uleb128 1; .byte 0x1b
# define AUGMENTATION_PARAM_FDE .uleb128 0
# define START_SYMBOL_REF .long .Lpseudo_start-.
# else
# define AUGMENTATION_STRING .ascii "\0"
# define AUGMENTATION_PARAM
# define AUGMENTATION_PARAM_FDE
# define START_SYMBOL_REF .long .Lpseudo_start
# endif
# define FRAME_REG_0 /* Nothing. */
# define FRAME_REG_1 FRAME_REG_0; .byte 0x84; .uleb128 5
# define FRAME_REG_2 FRAME_REG_1; .byte 0x85; .uleb128 4
# define FRAME_REG_3 FRAME_REG_2; .byte 0x86; .uleb128 3
# define FRAME_REG_4 FRAME_REG_3; .byte 0x87; .uleb128 2
# define FRAME_REG_5 FRAME_REG_4
# define FRAME_REG_6 FRAME_REG_5
# undef PSEUDO_END # undef PSEUDO_END
# define PSEUDO_END(sym) \ # define PSEUDO_END(sym) \

View File

@ -311,7 +311,7 @@
with support. */ with support. */
#if __LINUX_KERNEL_VERSION >= 132416 \ #if __LINUX_KERNEL_VERSION >= 132416 \
&& (defined __ia64__ || defined __s390__ || defined __powerpc__ \ && (defined __ia64__ || defined __s390__ || defined __powerpc__ \
|| defined __x86_64__) || defined __x86_64__ || __sh__)
# define __ASSUME_CLONE_THREAD_FLAGS 1 # define __ASSUME_CLONE_THREAD_FLAGS 1
#endif #endif
@ -349,7 +349,8 @@
2.6.0-test3. */ 2.6.0-test3. */
#if (__LINUX_KERNEL_VERSION >= 132427 && defined __i386__) \ #if (__LINUX_KERNEL_VERSION >= 132427 && defined __i386__) \
|| (__LINUX_KERNEL_VERSION >= 132609 && defined __alpha__) \ || (__LINUX_KERNEL_VERSION >= 132609 && defined __alpha__) \
|| (__LINUX_KERNEL_VERSION >= 132609 && defined __x86_64__) || (__LINUX_KERNEL_VERSION >= 132609 && defined __x86_64__) \
|| (__LINUX_KERNEL_VERSION >= 132609 && defined __sh__)
# define __ASSUME_TGKILL 1 # define __ASSUME_TGKILL 1
#endif #endif
@ -359,7 +360,8 @@
#if defined __alpha__ || defined __ia64__ || defined __hppa__ \ #if defined __alpha__ || defined __ia64__ || defined __hppa__ \
|| defined __sparc__ \ || defined __sparc__ \
|| (__LINUX_KERNEL_VERSION > 132427 && defined __i386__) \ || (__LINUX_KERNEL_VERSION > 132427 && defined __i386__) \
|| (__LINUX_KERNEL_VERSION > 132609 && defined __x86_64__) || (__LINUX_KERNEL_VERSION > 132609 && defined __x86_64__) \
|| (__LINUX_KERNEL_VERSION >= 132609 && defined __sh__)
# define __ASSUME_UTIMES 1 # define __ASSUME_UTIMES 1
#endif #endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc. /* Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -36,30 +36,60 @@
#define __socket P(__,socket) #define __socket P(__,socket)
#endif #endif
#define PUSHARGS_1 mov.l r4,@-r15 #define PUSHARGS_1 mov.l r4,@-r15; \
#define PUSHARGS_2 mov.l r5,@-r15; PUSHARGS_1 cfi_adjust_cfa_offset (4); \
#define PUSHARGS_3 mov.l r6,@-r15; PUSHARGS_2 cfi_rel_offset (r4, 0)
#define PUSHARGS_4 mov.l r7,@-r15; PUSHARGS_3 #define PUSHARGS_2 mov.l r5,@-r15; \
cfi_adjust_cfa_offset (4); \
cfi_rel_offset (r5, 0); \
PUSHARGS_1
#define PUSHARGS_3 mov.l r6,@-r15; \
cfi_adjust_cfa_offset (4); \
cfi_rel_offset (r6, 0); \
PUSHARGS_2
#define PUSHARGS_4 mov.l r7,@-r15; \
cfi_adjust_cfa_offset (4); \
cfi_rel_offset (r7, 0); \
PUSHARGS_3
#define PUSHARGS_5 PUSHARGS_4 /* Caller has already pushed arg 5 */ #define PUSHARGS_5 PUSHARGS_4 /* Caller has already pushed arg 5 */
#define PUSHARGS_6 PUSHARGS_4 /* Caller has already pushed arg 5,6 */ #define PUSHARGS_6 PUSHARGS_4 /* Caller has already pushed arg 5,6 */
#define POPARGS_1 add #4,r15 #define POPARGS_1 add #4,r15; cfi_adjust_cfa_offset (-4)
#define POPARGS_2 add #8,r15 #define POPARGS_2 add #8,r15; cfi_adjust_cfa_offset (-8)
#define POPARGS_3 add #12,r15 #define POPARGS_3 add #12,r15; cfi_adjust_cfa_offset (-12)
#define POPARGS_4 add #16,r15 #define POPARGS_4 add #16,r15; cfi_adjust_cfa_offset (-16)
#define POPARGS_5 add #16,r15 #define POPARGS_5 POPARGS_4
#define POPARGS_6 add #16,r15 #define POPARGS_6 POPARGS_4
#define ADJUSTCFI_1 cfi_adjust_cfa_offset (4); \
cfi_offset (r4, -4)
#define ADJUSTCFI_2 cfi_adjust_cfa_offset (8); \
cfi_offset (r4, -4); \
cfi_offset (r5, -8)
#define ADJUSTCFI_3 cfi_adjust_cfa_offset (12); \
cfi_offset (r4, -4); \
cfi_offset (r5, -8); \
cfi_offset (r6, -12)
#define ADJUSTCFI_4 cfi_adjust_cfa_offset (16); \
cfi_offset (r4, -4); \
cfi_offset (r5, -8); \
cfi_offset (r6, -12); \
cfi_offset (r7, -16)
#define ADJUSTCFI_5 ADJUSTCFI_4
#define ADJUSTCFI_6 ADJUSTCFI_4
#ifndef NARGS #ifndef NARGS
#define NARGS 3 /* If we were called with no wrapper, this is really socket() */ /* If we were called with no wrapper, this is really socket(). */
#define NARGS 3
#endif #endif
.globl __socket .globl __socket
cfi_startproc
ENTRY (__socket) ENTRY (__socket)
/* This will not work in the case of a socket call being interrupted /* This will not work in the case of a socket call being interrupted
by a signal. If the signal handler uses any stack the arguments by a signal. If the signal handler uses any stack the arguments
to socket will be trashed. The results of a restart of any to socket will be trashed. The results of a restart of any
socket call are then unpredictable. */ socket call are then unpredictable. */
/* Push args onto the stack. */ /* Push args onto the stack. */
P(PUSHARGS_,NARGS) P(PUSHARGS_,NARGS)
@ -94,9 +124,14 @@ ENTRY (__socket)
#if defined NEED_CANCELLATION && defined CENABLE #if defined NEED_CANCELLATION && defined CENABLE
.Lsocket_cancel: .Lsocket_cancel:
/* Enable asynchronous cancellation. */ /* Enable asynchronous cancellation. */
P(ADJUSTCFI_,NARGS)
sts.l pr,@-r15 sts.l pr,@-r15
cfi_adjust_cfa_offset (4)
cfi_rel_offset (pr, 0)
CENABLE CENABLE
lds.l @r15+,pr lds.l @r15+,pr
cfi_adjust_cfa_offset (-4)
cfi_restore (pr)
/* Do the system call trap. */ /* Do the system call trap. */
mov #+P(SOCKOP_,socket), r4 mov #+P(SOCKOP_,socket), r4
@ -105,10 +140,18 @@ ENTRY (__socket)
trapa #0x12 trapa #0x12
sts.l pr,@-r15 sts.l pr,@-r15
cfi_adjust_cfa_offset (4)
cfi_rel_offset (pr, 0)
mov.l r0,@-r15 mov.l r0,@-r15
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r0, 0)
CDISABLE CDISABLE
mov.l @r15+,r0 mov.l @r15+,r0
cfi_adjust_cfa_offset (-4)
cfi_restore (r0)
lds.l @r15+,pr lds.l @r15+,pr
cfi_adjust_cfa_offset (-4)
cfi_restore (pr)
/* Pop args off the stack */ /* Pop args off the stack */
P(POPARGS_,NARGS) P(POPARGS_,NARGS)
@ -122,6 +165,8 @@ ENTRY (__socket)
bra .Lsyscall_error bra .Lsyscall_error
nop nop
#endif #endif
cfi_endproc
.align 2 .align 2
.L1: .L1:
.long SYS_ify(socketcall) .long SYS_ify(socketcall)