mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 16:21:06 +00:00
Update.
2003-07-12 Kaz Kojima <kkojima@rr.iij4u.or.jp> * sysdeps/unix/sysv/linux/sh/socket.S: Save and restore the PR register across CENABLE and CDISABLE.
This commit is contained in:
parent
6080ecdf3c
commit
4a17085f15
@ -1,3 +1,8 @@
|
|||||||
|
2003-07-12 Kaz Kojima <kkojima@rr.iij4u.or.jp>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/sh/socket.S: Save and restore the PR
|
||||||
|
register across CENABLE and CDISABLE.
|
||||||
|
|
||||||
2003-07-11 Jakub Jelinek <jakub@redhat.com>
|
2003-07-11 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/sigwait.c: Include string.h.
|
* sysdeps/unix/sysv/linux/sigwait.c: Include string.h.
|
||||||
|
@ -1,3 +1,23 @@
|
|||||||
|
2003-07-12 Kaz Kojima <kkojima@rr.iij4u.or.jp>
|
||||||
|
|
||||||
|
* sysdeps/sh/tcb-offsets.sym: Add RESULT, TID, CANCELHANDLING and
|
||||||
|
CLEANUP_JMP_BUF.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Use more
|
||||||
|
registers as variables. Call __pthread_mutex_unlock_usercnt.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Store TID
|
||||||
|
not self pointer in __writer. Compare with TID to determine
|
||||||
|
deadlocks.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S:
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S:
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/sem_wait.S: Add cancellation support.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Define all the nice
|
||||||
|
macros also when compiling librt.
|
||||||
|
|
||||||
2003-07-11 Jakub Jelinek <jakub@redhat.com>
|
2003-07-11 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* Makefile (CFLAGS-pthread_once.c): Add -fexceptions
|
* Makefile (CFLAGS-pthread_once.c): Add -fexceptions
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
|
|
||||||
MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads)
|
RESULT offsetof (struct pthread, result)
|
||||||
TLS_PRE_TCB_SIZE sizeof (struct pthread)
|
TID offsetof (struct pthread, tid)
|
||||||
MUTEX_FUTEX offsetof (pthread_mutex_t, __data.__lock)
|
CANCELHANDLING offsetof (struct pthread, cancelhandling)
|
||||||
|
CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf)
|
||||||
|
MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads)
|
||||||
|
TLS_PRE_TCB_SIZE sizeof (struct pthread)
|
||||||
|
MUTEX_FUTEX offsetof (pthread_mutex_t, __data.__lock)
|
||||||
|
@ -36,15 +36,17 @@
|
|||||||
.type __pthread_cond_timedwait, @function
|
.type __pthread_cond_timedwait, @function
|
||||||
.align 5
|
.align 5
|
||||||
__pthread_cond_timedwait:
|
__pthread_cond_timedwait:
|
||||||
mov.l r12, @-r15
|
|
||||||
mov.l r10, @-r15
|
|
||||||
mov.l r9, @-r15
|
|
||||||
mov.l r8, @-r15
|
mov.l r8, @-r15
|
||||||
|
mov.l r9, @-r15
|
||||||
|
mov.l r10, @-r15
|
||||||
|
mov.l r11, @-r15
|
||||||
|
mov.l r12, @-r15
|
||||||
|
mov.l r13, @-r15
|
||||||
sts.l pr, @-r15
|
sts.l pr, @-r15
|
||||||
add #-64, r15
|
add #-64, r15
|
||||||
mov r4, r8
|
mov r4, r8
|
||||||
mov r5, r9
|
mov r5, r9
|
||||||
mov r6, r10
|
mov r6, r13
|
||||||
|
|
||||||
/* Get internal lock. */
|
/* Get internal lock. */
|
||||||
mov #1, r3
|
mov #1, r3
|
||||||
@ -64,13 +66,16 @@ __pthread_cond_timedwait:
|
|||||||
|
|
||||||
/* Unlock the mutex. */
|
/* Unlock the mutex. */
|
||||||
mov.l .Lmunlock1, r1
|
mov.l .Lmunlock1, r1
|
||||||
|
mov #0, r5
|
||||||
bsrf r1
|
bsrf r1
|
||||||
mov r9, r4
|
mov r9, r4
|
||||||
.Lmunlock1b:
|
.Lmunlock1b:
|
||||||
|
|
||||||
tst r0, r0
|
tst r0, r0
|
||||||
bf 16f
|
bt 0f
|
||||||
|
bra 16f
|
||||||
|
nop
|
||||||
|
0:
|
||||||
mov #1, r2
|
mov #1, r2
|
||||||
mov #0, r3
|
mov #0, r3
|
||||||
|
|
||||||
@ -93,7 +98,11 @@ __pthread_cond_timedwait:
|
|||||||
mov.l .Lccleanup1, r5
|
mov.l .Lccleanup1, r5
|
||||||
#endif
|
#endif
|
||||||
mov r15, r4
|
mov r15, r4
|
||||||
add #36, r4
|
add #32, r4
|
||||||
|
|
||||||
|
/* Prepare structure passed to cancellation handler. */
|
||||||
|
mov.l r8, @(4,r15)
|
||||||
|
mov.l r9, @(8,r15)
|
||||||
|
|
||||||
mov.l .Lccpush1, r1
|
mov.l .Lccpush1, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
@ -101,13 +110,8 @@ __pthread_cond_timedwait:
|
|||||||
.Lccpush1b:
|
.Lccpush1b:
|
||||||
|
|
||||||
/* Get and store current wakeup_seq value. */
|
/* Get and store current wakeup_seq value. */
|
||||||
mov.l @(wakeup_seq,r8), r0
|
mov.l @(wakeup_seq,r8), r10
|
||||||
mov.l @(wakeup_seq+4,r8), r1
|
mov.l @(wakeup_seq+4,r8), r11
|
||||||
mov.l r0, @(20,r15)
|
|
||||||
mov.l r1, @(24,r15)
|
|
||||||
/* Prepare structure passed to cancellation handler. */
|
|
||||||
mov.l r9, @r15
|
|
||||||
mov.l r8, @(4,r15)
|
|
||||||
|
|
||||||
/* Unlock. */
|
/* Unlock. */
|
||||||
8:
|
8:
|
||||||
@ -125,23 +129,23 @@ __pthread_cond_timedwait:
|
|||||||
bsrf r1
|
bsrf r1
|
||||||
nop
|
nop
|
||||||
.Lenable1b:
|
.Lenable1b:
|
||||||
mov.l r0, @(8,r15)
|
mov.l r0, @r15
|
||||||
|
|
||||||
/* Get current time. */
|
/* Get current time. */
|
||||||
mov r15, r4
|
mov r15, r4
|
||||||
add #12, r4
|
add #16, r4
|
||||||
mov #0, r5
|
mov #0, r5
|
||||||
mov #SYS_gettimeofday, r3
|
mov #SYS_gettimeofday, r3
|
||||||
trapa #0x12
|
trapa #0x12
|
||||||
SYSCALL_INST_PAD
|
SYSCALL_INST_PAD
|
||||||
|
|
||||||
/* Compute relative timeout. */
|
/* Compute relative timeout. */
|
||||||
mov.l @(16,r15), r0
|
mov.l @(20,r15), r0
|
||||||
mov.w .L1k, r1
|
mov.w .L1k, r1
|
||||||
dmulu.l r0, r1 /* Milli seconds to nano seconds. */
|
dmulu.l r0, r1 /* Milli seconds to nano seconds. */
|
||||||
mov.l @r10, r2
|
mov.l @r13, r2
|
||||||
mov.l @(4,r10), r3
|
mov.l @(4,r13), r3
|
||||||
mov.l @(12,r15), r0
|
mov.l @(16,r15), r0
|
||||||
sts macl, r1
|
sts macl, r1
|
||||||
sub r0, r2
|
sub r0, r2
|
||||||
clrt
|
clrt
|
||||||
@ -155,24 +159,24 @@ __pthread_cond_timedwait:
|
|||||||
bf 13f /* Time is already up. */
|
bf 13f /* Time is already up. */
|
||||||
|
|
||||||
/* Store relative timeout. */
|
/* Store relative timeout. */
|
||||||
mov.l r2, @(12,r15)
|
mov.l r2, @(16,r15)
|
||||||
mov.l r3, @(16,r15)
|
mov.l r3, @(20,r15)
|
||||||
|
|
||||||
mov r15, r7
|
mov r15, r7
|
||||||
add #12, r7
|
add #16, r7
|
||||||
mov #FUTEX_WAIT, r5
|
mov #FUTEX_WAIT, r5
|
||||||
mov.l @(20,r15), r6
|
mov r10, r6
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #wakeup_seq, r4
|
add #wakeup_seq, r4
|
||||||
mov #SYS_futex, r3
|
mov #SYS_futex, r3
|
||||||
extu.b r3, r3
|
extu.b r3, r3
|
||||||
trapa #0x14
|
trapa #0x14
|
||||||
SYSCALL_INST_PAD
|
SYSCALL_INST_PAD
|
||||||
mov.l r0, @(28,r15)
|
mov.l r0, @(12,r15)
|
||||||
|
|
||||||
mov.l .Ldisable1, r1
|
mov.l .Ldisable1, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
mov.l @(8,r15), r4
|
mov.l @r15, r4
|
||||||
.Ldisable1b:
|
.Ldisable1b:
|
||||||
|
|
||||||
/* Lock. */
|
/* Lock. */
|
||||||
@ -191,14 +195,12 @@ __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
|
||||||
|
|
||||||
mov.l @(24,r15), r5
|
cmp/hi r11, r3
|
||||||
cmp/hi r5, r3
|
|
||||||
bt 7f
|
bt 7f
|
||||||
cmp/hi r3, r5
|
cmp/hi r3, r11
|
||||||
bt 15f
|
bt 15f
|
||||||
|
|
||||||
mov.l @(20,r15), r5
|
cmp/hs r2, r10
|
||||||
cmp/hs r2, r5
|
|
||||||
bt 15f
|
bt 15f
|
||||||
7:
|
7:
|
||||||
cmp/hi r1, r3
|
cmp/hi r1, r3
|
||||||
@ -208,7 +210,7 @@ __pthread_cond_timedwait:
|
|||||||
cmp/hi r0, r2
|
cmp/hi r0, r2
|
||||||
bt 9f
|
bt 9f
|
||||||
15:
|
15:
|
||||||
mov.l @(28,r15),r0
|
mov.l @(12,r15),r0
|
||||||
cmp/eq #-ETIMEDOUT, r0
|
cmp/eq #-ETIMEDOUT, r0
|
||||||
bf 8b
|
bf 8b
|
||||||
13:
|
13:
|
||||||
@ -224,11 +226,11 @@ __pthread_cond_timedwait:
|
|||||||
mov.l r1,@(wakeup_seq+4,r8)
|
mov.l r1,@(wakeup_seq+4,r8)
|
||||||
mov #ETIMEDOUT, r0
|
mov #ETIMEDOUT, r0
|
||||||
bra 14f
|
bra 14f
|
||||||
mov.l r0, @(32,r15)
|
mov.l r0, @(24,r15)
|
||||||
|
|
||||||
9:
|
9:
|
||||||
mov #0, r0
|
mov #0, r0
|
||||||
mov.l r0, @(32,r15)
|
mov.l r0, @(24,r15)
|
||||||
14:
|
14:
|
||||||
mov #1, r2
|
mov #1, r2
|
||||||
mov #0, r3
|
mov #0, r3
|
||||||
@ -252,7 +254,7 @@ __pthread_cond_timedwait:
|
|||||||
11:
|
11:
|
||||||
/* Remove cancellation handler. */
|
/* Remove cancellation handler. */
|
||||||
mov r15, r4
|
mov r15, r4
|
||||||
add #36, r4
|
add #32, r4
|
||||||
mov.l .Lcpop1, r1
|
mov.l .Lcpop1, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
mov #0, r5
|
mov #0, r5
|
||||||
@ -267,23 +269,25 @@ __pthread_cond_timedwait:
|
|||||||
/* We return the result of the mutex_lock operation if it failed. */
|
/* We return the result of the mutex_lock operation if it failed. */
|
||||||
tst r0, r0
|
tst r0, r0
|
||||||
bf 18f
|
bf 18f
|
||||||
mov.l @(32,r15), r0
|
mov.l @(24,r15), r0
|
||||||
|
|
||||||
18:
|
18:
|
||||||
add #64, r15
|
add #64, r15
|
||||||
lds.l @r15+, pr
|
lds.l @r15+, pr
|
||||||
mov.l @r15+, r8
|
mov.l @r15+, r13
|
||||||
mov.l @r15+, r9
|
mov.l @r15+, r12
|
||||||
|
mov.l @r15+, r11
|
||||||
mov.l @r15+, r10
|
mov.l @r15+, r10
|
||||||
|
mov.l @r15+, r9
|
||||||
rts
|
rts
|
||||||
mov.l @r15+, r12
|
mov.l @r15+, r8
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.L1k:
|
.L1k:
|
||||||
.word 1000
|
.word 1000
|
||||||
.align 2
|
.align 2
|
||||||
.Lmunlock1:
|
.Lmunlock1:
|
||||||
.long __pthread_mutex_unlock_internal-.Lmunlock1b
|
.long __pthread_mutex_unlock_usercnt-.Lmunlock1b
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
.Lgot1:
|
.Lgot1:
|
||||||
.long _GLOBAL_OFFSET_TABLE_
|
.long _GLOBAL_OFFSET_TABLE_
|
||||||
@ -360,7 +364,7 @@ __pthread_cond_timedwait:
|
|||||||
|
|
||||||
16:
|
16:
|
||||||
/* The initial unlocking of the mutex failed. */
|
/* The initial unlocking of the mutex failed. */
|
||||||
mov.l r0, @(32,r15)
|
mov.l r0, @(24,r15)
|
||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
DEC (@(cond_lock,r8), r2)
|
DEC (@(cond_lock,r8), r2)
|
||||||
#else
|
#else
|
||||||
@ -379,7 +383,7 @@ __pthread_cond_timedwait:
|
|||||||
.Lmwake4b:
|
.Lmwake4b:
|
||||||
17:
|
17:
|
||||||
bra 18b
|
bra 18b
|
||||||
mov.l @(32,r15), r0
|
mov.l @(24,r15), r0
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
.Lmwait2:
|
.Lmwait2:
|
||||||
|
@ -133,9 +133,11 @@ __condvar_cleanup:
|
|||||||
.type __pthread_cond_wait, @function
|
.type __pthread_cond_wait, @function
|
||||||
.align 5
|
.align 5
|
||||||
__pthread_cond_wait:
|
__pthread_cond_wait:
|
||||||
mov.l r12, @-r15
|
|
||||||
mov.l r9, @-r15
|
|
||||||
mov.l r8, @-r15
|
mov.l r8, @-r15
|
||||||
|
mov.l r9, @-r15
|
||||||
|
mov.l r10, @-r15
|
||||||
|
mov.l r11, @-r15
|
||||||
|
mov.l r12, @-r15
|
||||||
sts.l pr, @-r15
|
sts.l pr, @-r15
|
||||||
add #-48, r15
|
add #-48, r15
|
||||||
mov r4, r8
|
mov r4, r8
|
||||||
@ -149,21 +151,27 @@ __pthread_cond_wait:
|
|||||||
XADD (r3, @r8, r2)
|
XADD (r3, @r8, r2)
|
||||||
#endif
|
#endif
|
||||||
tst r2, r2
|
tst r2, r2
|
||||||
bf 1f
|
bt 2f
|
||||||
|
bra 1f
|
||||||
|
nop
|
||||||
|
|
||||||
|
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 r9, @(dep_mutex,r8)
|
mov.l r9, @(dep_mutex,r8)
|
||||||
|
|
||||||
/* Unlock the mutex. */
|
/* Unlock the mutex. */
|
||||||
mov.l .Lmunlock0, r1
|
mov.l .Lmunlock0, r1
|
||||||
|
mov #0, r5
|
||||||
bsrf r1
|
bsrf r1
|
||||||
mov r9, r4
|
mov r9, r4
|
||||||
.Lmunlock0b:
|
.Lmunlock0b:
|
||||||
|
|
||||||
tst r0, r0
|
tst r0, r0
|
||||||
bf 12f
|
bt 0f
|
||||||
|
bra 12f
|
||||||
|
nop
|
||||||
|
0:
|
||||||
mov #1, r2
|
mov #1, r2
|
||||||
mov #0, r3
|
mov #0, r3
|
||||||
|
|
||||||
@ -186,7 +194,11 @@ __pthread_cond_wait:
|
|||||||
mov.l .Lccleanup0, r5
|
mov.l .Lccleanup0, r5
|
||||||
#endif
|
#endif
|
||||||
mov r15, r4
|
mov r15, r4
|
||||||
add #20, r4
|
add #16, r4
|
||||||
|
|
||||||
|
/* Prepare structure passed to cancellation handler. */
|
||||||
|
mov.l r8, @(4,r15)
|
||||||
|
mov.l r9, @(8,r15)
|
||||||
|
|
||||||
mov.l .Lccpush0, r1
|
mov.l .Lccpush0, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
@ -194,13 +206,8 @@ __pthread_cond_wait:
|
|||||||
.Lccpush0b:
|
.Lccpush0b:
|
||||||
|
|
||||||
/* Get and store current wakeup_seq value. */
|
/* Get and store current wakeup_seq value. */
|
||||||
mov.l @(wakeup_seq,r8), r0
|
mov.l @(wakeup_seq,r8), r10
|
||||||
mov.l @(wakeup_seq+4,r8), r1
|
mov.l @(wakeup_seq+4,r8), r11
|
||||||
mov.l r0, @(12,r15)
|
|
||||||
mov.l r1, @(16,r15)
|
|
||||||
/* Prepare structure passed to cancellation handler. */
|
|
||||||
mov.l r9, @r15
|
|
||||||
mov.l r8, @(4,r15)
|
|
||||||
|
|
||||||
8:
|
8:
|
||||||
/* Unlock. */
|
/* Unlock. */
|
||||||
@ -216,11 +223,11 @@ __pthread_cond_wait:
|
|||||||
bsrf r1
|
bsrf r1
|
||||||
nop
|
nop
|
||||||
.Lenable0b:
|
.Lenable0b:
|
||||||
mov.l r0, @(8,r15)
|
mov.l r0, @r15
|
||||||
|
|
||||||
mov #0, r7
|
mov #0, r7
|
||||||
mov #FUTEX_WAIT, r5
|
mov #FUTEX_WAIT, r5
|
||||||
mov.l @(12,r15), r6
|
mov r10, r6
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #wakeup_seq, r4
|
add #wakeup_seq, r4
|
||||||
mov #SYS_futex, r3
|
mov #SYS_futex, r3
|
||||||
@ -230,7 +237,7 @@ __pthread_cond_wait:
|
|||||||
|
|
||||||
mov.l .Ldisable0, r1
|
mov.l .Ldisable0, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
mov.l @(8,r15), r4
|
mov.l @r15, r4
|
||||||
.Ldisable0b:
|
.Ldisable0b:
|
||||||
|
|
||||||
/* Lock. */
|
/* Lock. */
|
||||||
@ -249,14 +256,12 @@ __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
|
||||||
|
|
||||||
mov.l @(16,r15), r5
|
cmp/hi r11, r3
|
||||||
cmp/hi r5, r3
|
|
||||||
bt 7f
|
bt 7f
|
||||||
cmp/hi r3, r5
|
cmp/hi r3, r11
|
||||||
bt 8b
|
bt 8b
|
||||||
|
|
||||||
mov.l @(12,r15), r5
|
cmp/hs r2, r10
|
||||||
cmp/hs r2, r5
|
|
||||||
bt 8b
|
bt 8b
|
||||||
7:
|
7:
|
||||||
cmp/hi r1, r3
|
cmp/hi r1, r3
|
||||||
@ -288,7 +293,7 @@ __pthread_cond_wait:
|
|||||||
11:
|
11:
|
||||||
/* Remove cancellation handler. */
|
/* Remove cancellation handler. */
|
||||||
mov r15, r4
|
mov r15, r4
|
||||||
add #20, r4
|
add #16, r4
|
||||||
mov.l .Lcpop0, r1
|
mov.l .Lcpop0, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
mov #0, r5
|
mov #0, r5
|
||||||
@ -304,14 +309,16 @@ __pthread_cond_wait:
|
|||||||
14:
|
14:
|
||||||
add #48, r15
|
add #48, r15
|
||||||
lds.l @r15+, pr
|
lds.l @r15+, pr
|
||||||
mov.l @r15+, r8
|
mov.l @r15+, r12
|
||||||
|
mov.l @r15+, r11
|
||||||
|
mov.l @r15+, r10
|
||||||
mov.l @r15+, r9
|
mov.l @r15+, r9
|
||||||
rts
|
rts
|
||||||
mov.l @r15+, r12
|
mov.l @r15+, r8
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
.Lmunlock0:
|
.Lmunlock0:
|
||||||
.long __pthread_mutex_unlock_internal-.Lmunlock0b
|
.long __pthread_mutex_unlock_usercnt-.Lmunlock0b
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
.Lgot0:
|
.Lgot0:
|
||||||
.long _GLOBAL_OFFSET_TABLE_
|
.long _GLOBAL_OFFSET_TABLE_
|
||||||
@ -385,7 +392,7 @@ __pthread_cond_wait:
|
|||||||
|
|
||||||
12:
|
12:
|
||||||
/* The initial unlocking of the mutex failed. */
|
/* The initial unlocking of the mutex failed. */
|
||||||
mov.l r0, @-r15
|
mov.l r0, @(12,r15)
|
||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
DEC (@(cond_lock,r8), r2)
|
DEC (@(cond_lock,r8), r2)
|
||||||
#else
|
#else
|
||||||
@ -405,7 +412,7 @@ __pthread_cond_wait:
|
|||||||
|
|
||||||
13:
|
13:
|
||||||
bra 14b
|
bra 14b
|
||||||
mov.l @r15+, r0
|
mov.l @(12,r15), r0
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
.Lmwait0:
|
.Lmwait0:
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <lowlevelrwlock.h>
|
#include <lowlevelrwlock.h>
|
||||||
#include <pthread-errnos.h>
|
#include <pthread-errnos.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
#include "lowlevel-atomic.h"
|
#include "lowlevel-atomic.h"
|
||||||
|
|
||||||
#define SYS_futex 240
|
#define SYS_futex 240
|
||||||
@ -137,12 +138,18 @@ __pthread_rwlock_rdlock:
|
|||||||
nop
|
nop
|
||||||
14:
|
14:
|
||||||
stc gbr, r1
|
stc gbr, r1
|
||||||
|
mov.w .Ltidoff, r2
|
||||||
|
add r2, r1
|
||||||
|
mov.l @r1, r1
|
||||||
cmp/eq r1, r0
|
cmp/eq r1, r0
|
||||||
bf 3b
|
bf 3b
|
||||||
/* Deadlock detected. */
|
/* Deadlock detected. */
|
||||||
bra 9b
|
bra 9b
|
||||||
mov #EDEADLK, r3
|
mov #EDEADLK, r3
|
||||||
|
|
||||||
|
.Ltidoff:
|
||||||
|
.word TID - TLS_PRE_TCB_SIZE
|
||||||
|
|
||||||
6:
|
6:
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
#if MUTEX != 0
|
#if MUTEX != 0
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <lowlevelrwlock.h>
|
#include <lowlevelrwlock.h>
|
||||||
#include <pthread-errnos.h>
|
#include <pthread-errnos.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
#include "lowlevel-atomic.h"
|
#include "lowlevel-atomic.h"
|
||||||
|
|
||||||
#define SYS_gettimeofday __NR_gettimeofday
|
#define SYS_gettimeofday __NR_gettimeofday
|
||||||
@ -196,12 +197,18 @@ pthread_rwlock_timedrdlock:
|
|||||||
nop
|
nop
|
||||||
14:
|
14:
|
||||||
stc gbr, r1
|
stc gbr, r1
|
||||||
|
mov.w .Ltidoff, r2
|
||||||
|
add r2, r1
|
||||||
|
mov.l @r1, r1
|
||||||
cmp/eq r1, r0
|
cmp/eq r1, r0
|
||||||
bf 3b
|
bf 3b
|
||||||
/* Deadlock detected. */
|
/* Deadlock detected. */
|
||||||
bra 9b
|
bra 9b
|
||||||
mov #EDEADLK, r3
|
mov #EDEADLK, r3
|
||||||
|
|
||||||
|
.Ltidoff:
|
||||||
|
.word TID - TLS_PRE_TCB_SIZE
|
||||||
|
|
||||||
6:
|
6:
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
#if MUTEX != 0
|
#if MUTEX != 0
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <lowlevelrwlock.h>
|
#include <lowlevelrwlock.h>
|
||||||
#include <pthread-errnos.h>
|
#include <pthread-errnos.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
#include "lowlevel-atomic.h"
|
#include "lowlevel-atomic.h"
|
||||||
|
|
||||||
#define SYS_gettimeofday __NR_gettimeofday
|
#define SYS_gettimeofday __NR_gettimeofday
|
||||||
@ -154,6 +155,8 @@ pthread_rwlock_timedwrlock:
|
|||||||
5:
|
5:
|
||||||
mov #0, r3
|
mov #0, r3
|
||||||
stc gbr, r0
|
stc gbr, r0
|
||||||
|
mov.w .Ltidoff, r1
|
||||||
|
mov.l @(r0,r1), r0
|
||||||
mov.l r0, @(WRITER,r8)
|
mov.l r0, @(WRITER,r8)
|
||||||
9:
|
9:
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
@ -193,6 +196,9 @@ pthread_rwlock_timedwrlock:
|
|||||||
nop
|
nop
|
||||||
14:
|
14:
|
||||||
stc gbr, r1
|
stc gbr, r1
|
||||||
|
mov.w .Ltidoff, r2
|
||||||
|
add r2, r1
|
||||||
|
mov.l @r1, r1
|
||||||
cmp/eq r1, r0
|
cmp/eq r1, r0
|
||||||
bf 3b
|
bf 3b
|
||||||
bra 9b
|
bra 9b
|
||||||
@ -209,6 +215,9 @@ pthread_rwlock_timedwrlock:
|
|||||||
bra 7b
|
bra 7b
|
||||||
mov #0, r3
|
mov #0, r3
|
||||||
|
|
||||||
|
.Ltidoff:
|
||||||
|
.word TID - TLS_PRE_TCB_SIZE
|
||||||
|
|
||||||
4:
|
4:
|
||||||
/* Overflow. */
|
/* Overflow. */
|
||||||
mov.l @(WRITERS_QUEUED,r8), r1
|
mov.l @(WRITERS_QUEUED,r8), r1
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <lowlevelrwlock.h>
|
#include <lowlevelrwlock.h>
|
||||||
#include <pthread-errnos.h>
|
#include <pthread-errnos.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
#include "lowlevel-atomic.h"
|
#include "lowlevel-atomic.h"
|
||||||
|
|
||||||
#define SYS_futex 240
|
#define SYS_futex 240
|
||||||
@ -99,6 +100,8 @@ __pthread_rwlock_wrlock:
|
|||||||
5:
|
5:
|
||||||
mov #0, r3
|
mov #0, r3
|
||||||
stc gbr, r0
|
stc gbr, r0
|
||||||
|
mov.w .Ltidoff, r1
|
||||||
|
mov.l @(r0,r1), r0
|
||||||
mov.l r0, @(WRITER,r8)
|
mov.l r0, @(WRITER,r8)
|
||||||
9:
|
9:
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
@ -130,6 +133,9 @@ __pthread_rwlock_wrlock:
|
|||||||
nop
|
nop
|
||||||
14:
|
14:
|
||||||
stc gbr, r1
|
stc gbr, r1
|
||||||
|
mov.w .Ltidoff, r2
|
||||||
|
add r2, r1
|
||||||
|
mov.l @r1, r1
|
||||||
cmp/eq r1, r0
|
cmp/eq r1, r0
|
||||||
bf 3b
|
bf 3b
|
||||||
bra 9b
|
bra 9b
|
||||||
@ -146,6 +152,9 @@ __pthread_rwlock_wrlock:
|
|||||||
bra 7b
|
bra 7b
|
||||||
mov #0, r3
|
mov #0, r3
|
||||||
|
|
||||||
|
.Ltidoff:
|
||||||
|
.word TID - TLS_PRE_TCB_SIZE
|
||||||
|
|
||||||
4:
|
4:
|
||||||
mov.l @(WRITERS_QUEUED,r8), r1
|
mov.l @(WRITERS_QUEUED,r8), r1
|
||||||
add #-1, r1
|
add #-1, r1
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <shlib-compat.h>
|
#include <shlib-compat.h>
|
||||||
#include <pthread-errnos.h>
|
#include <pthread-errnos.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
#include "lowlevel-atomic.h"
|
#include "lowlevel-atomic.h"
|
||||||
|
|
||||||
|
|
||||||
@ -33,6 +34,15 @@
|
|||||||
.type sem_timedwait,@function
|
.type sem_timedwait,@function
|
||||||
.align 5
|
.align 5
|
||||||
sem_timedwait:
|
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
|
||||||
|
bt 10f
|
||||||
|
|
||||||
mov.l @r4, r0
|
mov.l @r4, r0
|
||||||
2:
|
2:
|
||||||
tst r0, r0
|
tst r0, r0
|
||||||
@ -48,9 +58,10 @@ sem_timedwait:
|
|||||||
|
|
||||||
1:
|
1:
|
||||||
/* Check whether the timeout value is valid. */
|
/* Check whether the timeout value is valid. */
|
||||||
mov.l r12, @-r15
|
|
||||||
mov.l r9, @-r15
|
|
||||||
mov.l r8, @-r15
|
mov.l r8, @-r15
|
||||||
|
mov.l r9, @-r15
|
||||||
|
mov.l r10, @-r15
|
||||||
|
mov.l r12, @-r15
|
||||||
sts.l pr, @-r15
|
sts.l pr, @-r15
|
||||||
add #-8, r15
|
add #-8, r15
|
||||||
mov r4, r8
|
mov r4, r8
|
||||||
@ -63,6 +74,12 @@ sem_timedwait:
|
|||||||
bt/s 6f
|
bt/s 6f
|
||||||
mov #EINVAL, r0
|
mov #EINVAL, r0
|
||||||
7:
|
7:
|
||||||
|
mov.l .Lenable0, r1
|
||||||
|
bsrf r1
|
||||||
|
nop
|
||||||
|
.Lenable0b:
|
||||||
|
mov r0, r10
|
||||||
|
|
||||||
/* Compute relative timeout. */
|
/* Compute relative timeout. */
|
||||||
mov r15, r4
|
mov r15, r4
|
||||||
mov #0, r5
|
mov #0, r5
|
||||||
@ -102,6 +119,13 @@ sem_timedwait:
|
|||||||
trapa #0x14
|
trapa #0x14
|
||||||
SYSCALL_INST_PAD
|
SYSCALL_INST_PAD
|
||||||
|
|
||||||
|
mov.l .Ldisable0, r1
|
||||||
|
mov r10, r4
|
||||||
|
bsrf r1
|
||||||
|
mov r0, r10
|
||||||
|
.Ldisable0b:
|
||||||
|
mov r10, r0
|
||||||
|
|
||||||
tst r0, r0
|
tst r0, r0
|
||||||
bt 9f
|
bt 9f
|
||||||
cmp/eq #-EWOULDBLOCK, r0
|
cmp/eq #-EWOULDBLOCK, r0
|
||||||
@ -121,9 +145,10 @@ sem_timedwait:
|
|||||||
|
|
||||||
add #8, r15
|
add #8, r15
|
||||||
lds.l @r15+, pr
|
lds.l @r15+, pr
|
||||||
mov.l @r15+, r8
|
|
||||||
mov.l @r15+, r9
|
|
||||||
mov.l @r15+, r12
|
mov.l @r15+, r12
|
||||||
|
mov.l @r15+, r10
|
||||||
|
mov.l @r15+, r9
|
||||||
|
mov.l @r15+, r8
|
||||||
rts
|
rts
|
||||||
mov #0, r0
|
mov #0, r0
|
||||||
|
|
||||||
@ -150,14 +175,35 @@ sem_timedwait:
|
|||||||
#endif
|
#endif
|
||||||
add #8, r15
|
add #8, r15
|
||||||
lds.l @r15+, pr
|
lds.l @r15+, pr
|
||||||
mov.l @r15+, r8
|
|
||||||
mov.l @r15+, r9
|
|
||||||
mov.l @r15+, r12
|
mov.l @r15+, r12
|
||||||
|
mov.l @r15+, r10
|
||||||
|
mov.l @r15+, r9
|
||||||
|
mov.l @r15+, r8
|
||||||
rts
|
rts
|
||||||
mov #-1, r0
|
mov #-1, r0
|
||||||
|
|
||||||
|
10:
|
||||||
|
/* Canceled. */
|
||||||
|
stc gbr, r0
|
||||||
|
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
|
||||||
|
jmp @r2
|
||||||
|
mov.l @(r0,r1), r4
|
||||||
|
|
||||||
.L1k:
|
.L1k:
|
||||||
.word 1000
|
.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
|
.align 2
|
||||||
.L1g:
|
.L1g:
|
||||||
.long 1000000000
|
.long 1000000000
|
||||||
@ -170,4 +216,10 @@ sem_timedwait:
|
|||||||
.Lerrloc2:
|
.Lerrloc2:
|
||||||
.long __errno_location@PLT-(.Lerrloc2b+2-.)
|
.long __errno_location@PLT-(.Lerrloc2b+2-.)
|
||||||
#endif
|
#endif
|
||||||
|
.Lenable0:
|
||||||
|
.long __pthread_enable_asynccancel-.Lenable0b
|
||||||
|
.Ldisable0:
|
||||||
|
.long __pthread_disable_asynccancel-.Ldisable0b
|
||||||
|
.Lunwind:
|
||||||
|
.long __pthread_unwind
|
||||||
.size sem_timedwait,.-sem_timedwait
|
.size sem_timedwait,.-sem_timedwait
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <shlib-compat.h>
|
#include <shlib-compat.h>
|
||||||
#include <pthread-errnos.h>
|
#include <pthread-errnos.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
#include "lowlevel-atomic.h"
|
#include "lowlevel-atomic.h"
|
||||||
|
|
||||||
|
|
||||||
@ -33,8 +34,18 @@
|
|||||||
.type __new_sem_wait,@function
|
.type __new_sem_wait,@function
|
||||||
.align 5
|
.align 5
|
||||||
__new_sem_wait:
|
__new_sem_wait:
|
||||||
mov.l r12, @-r15
|
/* 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
|
||||||
|
bt 5f
|
||||||
|
|
||||||
mov.l r8, @-r15
|
mov.l r8, @-r15
|
||||||
|
mov.l r10, @-r15
|
||||||
|
mov.l r12, @-r15
|
||||||
sts.l pr, @-r15
|
sts.l pr, @-r15
|
||||||
mov r4, r8
|
mov r4, r8
|
||||||
3:
|
3:
|
||||||
@ -48,12 +59,19 @@ __new_sem_wait:
|
|||||||
CMPXCHG (r4, @r8, r3, r2)
|
CMPXCHG (r4, @r8, r3, r2)
|
||||||
bf 2b
|
bf 2b
|
||||||
lds.l @r15+, pr
|
lds.l @r15+, pr
|
||||||
mov.l @r15+, r8
|
|
||||||
mov.l @r15+, r12
|
mov.l @r15+, r12
|
||||||
|
mov.l @r15+, r10
|
||||||
|
mov.l @r15+, r8
|
||||||
rts
|
rts
|
||||||
mov #0, r0
|
mov #0, r0
|
||||||
|
|
||||||
1:
|
1:
|
||||||
|
mov.l .Lenable0, r1
|
||||||
|
bsrf r1
|
||||||
|
nop
|
||||||
|
.Lenable0b:
|
||||||
|
mov r0, r10
|
||||||
|
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
mov #FUTEX_WAIT, r5
|
mov #FUTEX_WAIT, r5
|
||||||
mov #0, r6
|
mov #0, r6
|
||||||
@ -63,6 +81,13 @@ __new_sem_wait:
|
|||||||
trapa #0x14
|
trapa #0x14
|
||||||
SYSCALL_INST_PAD
|
SYSCALL_INST_PAD
|
||||||
|
|
||||||
|
mov.l .Ldisable0, r1
|
||||||
|
mov r10, r4
|
||||||
|
bsrf r1
|
||||||
|
mov r0, r10
|
||||||
|
.Ldisable0b:
|
||||||
|
mov r10, r0
|
||||||
|
|
||||||
tst r0, r0
|
tst r0, r0
|
||||||
bt 3b
|
bt 3b
|
||||||
cmp/eq #-EWOULDBLOCK, r0
|
cmp/eq #-EWOULDBLOCK, r0
|
||||||
@ -88,11 +113,32 @@ __new_sem_wait:
|
|||||||
mov.l r8, @r0
|
mov.l r8, @r0
|
||||||
#endif
|
#endif
|
||||||
lds.l @r15+, pr
|
lds.l @r15+, pr
|
||||||
mov.l @r15+, r8
|
|
||||||
mov.l @r15+, r12
|
mov.l @r15+, r12
|
||||||
|
mov.l @r15+, r10
|
||||||
|
mov.l @r15+, r8
|
||||||
rts
|
rts
|
||||||
mov #-1, r0
|
mov #-1, r0
|
||||||
|
|
||||||
|
5:
|
||||||
|
/* Canceled. */
|
||||||
|
stc gbr, r0
|
||||||
|
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
|
||||||
|
jmp @r2
|
||||||
|
mov.l @(r0,r1), r4
|
||||||
|
|
||||||
|
.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
|
.align 2
|
||||||
.Lgot0:
|
.Lgot0:
|
||||||
.long _GLOBAL_OFFSET_TABLE_
|
.long _GLOBAL_OFFSET_TABLE_
|
||||||
@ -103,5 +149,11 @@ __new_sem_wait:
|
|||||||
.Lerrloc0:
|
.Lerrloc0:
|
||||||
.long __errno_location@PLT-(.Lerrloc0b+2-.)
|
.long __errno_location@PLT-(.Lerrloc0b+2-.)
|
||||||
#endif
|
#endif
|
||||||
|
.Lenable0:
|
||||||
|
.long __pthread_enable_asynccancel-.Lenable0b
|
||||||
|
.Ldisable0:
|
||||||
|
.long __pthread_disable_asynccancel-.Ldisable0b
|
||||||
|
.Lunwind:
|
||||||
|
.long __pthread_unwind
|
||||||
.size __new_sem_wait,.-__new_sem_wait
|
.size __new_sem_wait,.-__new_sem_wait
|
||||||
versioned_symbol(libpthread, __new_sem_wait, sem_wait, GLIBC_2_1)
|
versioned_symbol(libpthread, __new_sem_wait, sem_wait, GLIBC_2_1)
|
||||||
|
@ -90,9 +90,14 @@
|
|||||||
# ifdef IS_IN_libpthread
|
# ifdef IS_IN_libpthread
|
||||||
# define __local_enable_asynccancel __pthread_enable_asynccancel
|
# define __local_enable_asynccancel __pthread_enable_asynccancel
|
||||||
# define __local_disable_asynccancel __pthread_disable_asynccancel
|
# define __local_disable_asynccancel __pthread_disable_asynccancel
|
||||||
# else
|
# elif !defined NOT_IN_libc
|
||||||
# define __local_enable_asynccancel __libc_enable_asynccancel
|
# define __local_enable_asynccancel __libc_enable_asynccancel
|
||||||
# define __local_disable_asynccancel __libc_disable_asynccancel
|
# define __local_disable_asynccancel __libc_disable_asynccancel
|
||||||
|
# elif defined IS_IN_librt
|
||||||
|
# define __local_enable_asynccancel __librt_enable_asynccancel
|
||||||
|
# define __local_disable_asynccancel __librt_disable_asynccancel
|
||||||
|
# else
|
||||||
|
# error Unsupported library
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# define CENABLE \
|
# define CENABLE \
|
||||||
|
@ -94,7 +94,9 @@ ENTRY (__socket)
|
|||||||
#if defined NEED_CANCELLATION && defined CENABLE
|
#if defined NEED_CANCELLATION && defined CENABLE
|
||||||
.Lsocket_cancel:
|
.Lsocket_cancel:
|
||||||
/* Enable asynchronous cancellation. */
|
/* Enable asynchronous cancellation. */
|
||||||
|
sts.l pr,@-r15
|
||||||
CENABLE
|
CENABLE
|
||||||
|
lds.l @r15+,pr
|
||||||
|
|
||||||
/* Do the system call trap. */
|
/* Do the system call trap. */
|
||||||
mov #+P(SOCKOP_,socket), r4
|
mov #+P(SOCKOP_,socket), r4
|
||||||
@ -102,9 +104,11 @@ ENTRY (__socket)
|
|||||||
mov.l .L1,r3
|
mov.l .L1,r3
|
||||||
trapa #0x12
|
trapa #0x12
|
||||||
|
|
||||||
|
sts.l pr,@-r15
|
||||||
mov.l r0,@-r15
|
mov.l r0,@-r15
|
||||||
CDISABLE
|
CDISABLE
|
||||||
mov.l @r15+,r0
|
mov.l @r15+,r0
|
||||||
|
lds.l @r15+,pr
|
||||||
|
|
||||||
/* Pop args off the stack */
|
/* Pop args off the stack */
|
||||||
P(POPARGS_,NARGS)
|
P(POPARGS_,NARGS)
|
||||||
|
Loading…
Reference in New Issue
Block a user