about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--nptl/ChangeLog8
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S21
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S21
-rw-r--r--sysdeps/unix/sysv/linux/i386/posix_fadvise64.S8
5 files changed, 38 insertions, 26 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c5d354c8f..93eae38c9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-02-22  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/unix/sysv/linux/i386/posix_fadvise64.S: Pop register
+	content also in case of an overflow in the parameter.
+	Reported by Momchil Velikov <velco@fadata.bg>.
+
 2004-02-21  Ulrich Drepper  <drepper@redhat.com>
 
 	* elf/dynamic-link.h (elf_get_dynamic_info): Recognize DF_1_NOW.
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index bb7fe88cfe..6ad2f615c8 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,11 @@
+2004-02-22  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
+	(__lll_mutex_lock_wait): Rewrite so that only one locked memory
+	operation per round is needed.
+	* sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
+	(__lll_mutex_lock_wait): Likewise.
+
 2004-02-20  Ulrich Drepper  <drepper@redhat.com>
 
 	* tst-cancel9.c (cleanup): Don't print to stderr.
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
index c5ec154af2..600ba75874 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -50,26 +50,25 @@ __lll_mutex_lock_wait:
 	xorl	%esi, %esi	/* No timeout.  */
 	xorl	%ecx, %ecx	/* movl $FUTEX_WAIT, %ecx */
 
-1:	cmpl	%edx, %eax	/* NB:	 %edx == 2 */
-	je 3f
+	cmpl	%edx, %eax	/* NB:	 %edx == 2 */
+	je 1f
 
-	movl	$1, %eax
-	LOCK
-	cmpxchgl %edx, (%ebx)
+	movl	%edx, %eax
+	xchgl	%eax, (%ebx)	/* NB:	 lock is implied */
 
 	testl	%eax, %eax
 	je	2f
 
-3:	movl	$SYS_futex, %eax
+1:	movl	$SYS_futex, %eax
 	ENTER_KERNEL
 
-	xorl	%eax, %eax
-2:	LOCK
-	cmpxchgl %edx, (%ebx)
+	movl	%edx, %eax
+	xchgl	%eax, (%ebx)	/* NB:	 lock is implied */
 
+	testl	%eax, %eax
 	jnz,pn	1b
 
-	popl	%esi
+2:	popl	%esi
 	popl	%ebx
 	popl	%edx
 	ret
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
index a56c714aeb..3c56daecf5 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -50,24 +50,25 @@ __lll_mutex_lock_wait:
 	movl	$2, %edx
 	movq	%r10, %rsi	/* movq $FUTEX_WAIT, %rsi */
 
-1:
-	movl	$1, %eax
-	LOCK
-	cmpxchgl %edx, (%rdi)
+	cmpl	%edx, %eax	/* NB:	 %edx == 2 */
+	je	1f
+
+	movl	%edx, %eax
+	xchgl	%eax, (%rdi)	/* NB:	 lock is implied */
 
 	testl	%eax, %eax
 	je	2f
 
-	movq	$SYS_futex, %rax
+1:	movq	$SYS_futex, %rax
 	syscall
 
-	xorl	%eax, %eax
-2:	LOCK
-	cmpxchgl %edx, (%rdi)
+	movl	%edx, %eax
+	xchgl	%eax, (%rdi)	/* NB:	 lock is implied */
 
+	testl	%eax, %eax
 	jnz	1b
 
-	popq	%rdx
+2:	popq	%rdx
 	popq	%r10
 	retq
 	.size	__lll_mutex_lock_wait,.-__lll_mutex_lock_wait
diff --git a/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S b/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S
index 428ed2f9f8..b577f2284e 100644
--- a/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S
+++ b/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995,96,97,98,99,2000,2002,2003 Free Software Foundation, Inc.
+/* Copyright (C) 1995-2000,2002,2003,2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -85,6 +85,7 @@ ENTRY (BP_SYM (__posix_fadvise64_l64))
 
 	/* Overflow check.  */
 	cmpl	$0, LENHI(%esp)
+	movl	$-EOVERFLOW, %eax
 	jne	L(overflow)
 
 	movl	FD(%esp), %ebx
@@ -97,6 +98,7 @@ ENTRY (BP_SYM (__posix_fadvise64_l64))
 	ENTER_KERNEL
 
 	/* Restore registers.  */
+L(overflow):
 	popl	%edi
 	popl	%esi
 	popl	%ebx
@@ -106,10 +108,6 @@ ENTRY (BP_SYM (__posix_fadvise64_l64))
 
 	/* Successful; return the syscall's value.  */
 	ret
-
-L(overflow):
-	movl	$EOVERFLOW, %eax
-	ret
 #else
 	movl	$ENOSYS, %eax
 	ret