diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | nptl/ChangeLog | 8 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S | 21 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S | 21 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/posix_fadvise64.S | 8 |
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 |