Update.
authorUlrich Drepper <drepper@redhat.com>
Sun, 22 Feb 2004 19:37:31 +0000 (19:37 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 22 Feb 2004 19:37:31 +0000 (19:37 +0000)
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>.

ChangeLog
nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
sysdeps/unix/sysv/linux/i386/posix_fadvise64.S

index 6c5d354..93eae38 100644 (file)
--- 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.
index bb7fe88..6ad2f61 100644 (file)
@@ -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.
index c5ec154..600ba75 100644 (file)
@@ -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
index a56c714..3c56dae 100644 (file)
@@ -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
index 428ed2f..b577f22 100644 (file)
@@ -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