about summary refs log tree commit diff
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.gz
glibc-7abed17041f92492ceadecf04d5d31f395f84ae1.tar.xz
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