aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-03-15 21:46:30 +0000
committerUlrich Drepper <drepper@redhat.com>2003-03-15 21:46:30 +0000
commit7abed17041f92492ceadecf04d5d31f395f84ae1 (patch)
treed70f84726f01a681161c0c35842b63627c22b6b3
parent39d8c1a2f43ecac503ed39f6df16c93d9655c6dd (diff)
downloadglibc-7abed17041f92492ceadecf04d5d31f395f84ae1.tar
glibc-7abed17041f92492ceadecf04d5d31f395f84ae1.tar.gz
glibc-7abed17041f92492ceadecf04d5d31f395f84ae1.tar.bz2
glibc-7abed17041f92492ceadecf04d5d31f395f84ae1.zip
More random patches.
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h5
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S13
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S21
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S21
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S2
5 files changed, 48 insertions, 14 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
index 122b1c7ab0..cd233bf47a 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
@@ -82,14 +82,13 @@ extern int __lll_mutex_unlock_wait (int *__futex) attribute_hidden;
"testl %0, %0\n\t" \
"jne 1f\n\t" \
".subsection 1\n" \
- "1:\tmovl %0, %%esi\n\t" \
- "leaq %4, %%rdi\n\t" \
+ "1:\tleaq %4, %%rdi\n\t" \
"movq %7, %%rdx\n\t" \
"call __lll_mutex_timedlock_wait\n\t" \
"jmp 2f\n\t" \
".previous\n" \
"2:" \
- : "=a" (result), "=&D" (ignore1), "=&S" (ignore2), \
+ : "=S" (result), "=&D" (ignore1), "=&a" (ignore2), \
"=&d" (ignore3), "=m" (futex) \
: "0" (1), "4" (futex), "m" (timeout) \
: "memory", "cx", "cc", "r10"); \
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S
index b6dc9b57ba..e189dc1266 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S
@@ -80,13 +80,14 @@ __lll_mutex_timedlock_wait:
pushq %r12
pushq %r13
+ pushq %r14
/* Stack frame for the timespec and timeval structs. */
subq $16, %rsp
movq %rdi, %r12
movq %rdx, %r13
- leaq 1(%rax), %rdx
+ leaq 1(%rsi), %r14
/* Get current time. */
1: movq %rsp, %rdi
@@ -112,24 +113,26 @@ __lll_mutex_timedlock_wait:
/* Futex call. */
movq %rdi, (%rsp) /* Store relative timeout. */
- movq %rsi, 4(%rsp)
+ movq %rsi, 8(%rsp)
+ movl %r14d, %edx
movq %rsp, %r10
xorq %rsi, %rsi /* movq $FUTEX_WAIT, %rsi */
movq %r12, %rdi
movq $SYS_futex, %rax
syscall
- movl $1, %edx
+ movl $1, %r14d
LOCK
- xaddl %edx, (%rdi)
- testl %edx, %edx
+ xaddl %r14d, (%rdi)
+ testl %r14d, %r14d
jne 7f
movl $2, (%rdi)
xorl %eax, %eax
8: addq $16, %rsp
+ popq %r14
popq %r13
popq %r12
retq
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
index 2198c3a140..3c8acc1c25 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
@@ -48,6 +48,23 @@ __pthread_cond_timedwait:
pushq %r13
pushq %r14
subq $80, %rsp
+ /* Stack frame:
+
+ rsp + 80
+ +--------------------------+
+ rsp + 48 | cleanup buffer |
+ +--------------------------+
+ rsp + 40 | old wake_seq value |
+ +--------------------------+
+ rsp + 24 | timeout value |
+ +--------------------------+
+ rsp + 16 | mutex pointer |
+ +--------------------------+
+ rsp + 8 | condvar pointer |
+ +--------------------------+
+ rsp + 0 | old cancellation mode |
+ +--------------------------+
+ */
/* Prepare structure passed to cancellation handler. */
movq %rdi, 8(%rsp)
@@ -73,7 +90,7 @@ __pthread_cond_timedwait:
jne 16f
movq 8(%rsp), %rdi
- addq $1, total_seq(%rdi)
+ incq total_seq(%rdi)
/* Install cancellation handler. */
#ifdef PIC
@@ -113,7 +130,7 @@ __pthread_cond_timedwait:
movq $1000, %rdx
mul %rdx /* Milli seconds to nano seconds. */
movq (%r13), %rcx
- movq 4(%r13), %rdx
+ movq 8(%r13), %rdx
subq 24(%rsp), %rcx
subq %rax, %rdx
jns 12f
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
index 3bebbd3e49..4a0e3cce55 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
@@ -61,9 +61,9 @@ __condvar_cleanup:
subq $cond_lock, %rdi
#endif
-1: addq $1, wakeup_seq(%rdi)
+1: incq wakeup_seq(%rdi)
- addq $1, woken_seq(%rdi)
+ incq woken_seq(%rdi)
/* Wake up all waiters to make sure no signal gets lost. */
addq $wakeup_seq, %rdi
@@ -103,6 +103,21 @@ __condvar_cleanup:
__pthread_cond_wait:
pushq %r12
subq $64, %rsp
+ /* Stack frame:
+
+ rsp + 64
+ +--------------------------+
+ rsp + 32 | cleanup buffer |
+ +--------------------------+
+ rsp + 24 | old wake_seq value |
+ +--------------------------+
+ rsp + 16 | mutex pointer |
+ +--------------------------+
+ rsp + 8 | condvar pointer |
+ +--------------------------+
+ rsp + 0 | old cancellation mode |
+ +--------------------------+
+ */
/* Prepare structure passed to cancellation handler. */
movq %rdi, 8(%rsp)
@@ -127,7 +142,7 @@ __pthread_cond_wait:
jne 12f
movq 8(%rsp), %rdi
- addq $1, total_seq(%rdi)
+ incq total_seq(%rdi)
/* Install cancellation handler. */
#ifdef PIC
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
index 21eae3a14c..de9b934e3a 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
@@ -60,7 +60,7 @@ sem_timedwait:
movq %rsi, %r9
/* Check for invalid nanosecond field. */
- cmpq $1000000000, 4(%r9)
+ cmpq $1000000000, 8(%r9)
movl $EINVAL, %eax
jae 6f