From 9ed213c6ce86f43e7116c1d7aff6f91652d7caa2 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Thu, 1 Jul 2010 19:07:14 -0700 Subject: Work around kernel rejecting valid absolute timestamps (cherry picked from commit 2983d85ee5492c4ab1f09ca554e47192fa5c97a2) --- nptl/ChangeLog | 20 ++++++++++++++++++++ nptl/Makefile | 1 + .../sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S | 8 +++++++- nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S | 9 ++++++++- .../unix/sysv/linux/x86_64/lowlevelrobustlock.S | 9 +++++++-- .../unix/sysv/linux/x86_64/pthread_cond_timedwait.S | 6 +++++- .../sysv/linux/x86_64/pthread_rwlock_timedrdlock.S | 5 ++++- .../sysv/linux/x86_64/pthread_rwlock_timedwrlock.S | 5 ++++- nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S | 18 +++++++++++++++++- 9 files changed, 73 insertions(+), 8 deletions(-) diff --git a/nptl/ChangeLog b/nptl/ChangeLog index c3c11043a6..0e363e46a2 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,23 @@ +2010-07-01 Andreas Schwab + Ulrich Drepper + + * Makefile (tests): Add tst-abstime. + * tst-abstime.c: New file. + * sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S + (__lll_timedlock_wait): Check for timestamp before the Epoch. + * sysdeps/unix/sysv/linux/x86_64/lowlevellock.S + (__lll_timedlock_wait): Likewise. + * sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S + (__lll_robust_timedlock_wait): Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S + (__pthread_cond_timedwait): Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S + (pthread_rwlock_timedrdlock): Likewise. + * sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S + (pthread_rwlock_timedwrlock): Likewise. + * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait): + Likewise. + 2010-08-12 H.J. Lu * nptl/sysdeps/unix/sysv/linux/i386/Makefile: New file. diff --git a/nptl/Makefile b/nptl/Makefile index 3dcc876b2b..51b6ae51d7 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -256,6 +256,7 @@ tests = tst-typesizes \ tst-sched1 \ tst-backtrace1 \ tst-oddstacklimit \ + tst-abstime \ tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x \ tst-getpid1 tst-getpid2 tst-getpid3 \ tst-initializers1 $(patsubst %,tst-initializers1-%,c89 gnu89 c99 gnu99) diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S index 7578c7ece0..2198ccf55a 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-2004, 2006, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002-2004,2006,2007,2009,2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -188,6 +188,9 @@ __lll_timedlock_wait: je .Lreltmo # endif + cmpl $0, (%edx) + js 8f + movl %ecx, %ebx movl %esi, %ecx movl %edx, %esi @@ -223,6 +226,9 @@ __lll_timedlock_wait: cfi_restore(%ebp) ret +8: movl $ETIMEDOUT, %eax + jmp 7b + # ifndef __ASSUME_FUTEX_CLOCK_REALTIME .Lreltmo: /* Check for a valid timeout value. */ diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S index 8de9cf461a..3195db259f 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-2006, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002-2006, 2007, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -169,9 +169,13 @@ __lll_timedlock_wait: je .Lreltmo # endif + cmpq $0, (%rdx) + js 5f + pushq %r9 cfi_adjust_cfa_offset(8) cfi_rel_offset(%r9, 0) + movq %rdx, %r10 movl $0xffffffff, %r9d LOAD_FUTEX_WAIT_ABS (%esi) @@ -202,6 +206,9 @@ __lll_timedlock_wait: cfi_restore(%r9) retq +5: movl $ETIMEDOUT, %eax + retq + # ifndef __ASSUME_FUTEX_CLOCK_REALTIME .Lreltmo: /* Check for a valid timeout value. */ diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S index 02db0a4f9d..5218a4f57a 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelrobustlock.S @@ -1,5 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009 - Free Software Foundation, Inc. +/* Copyright (C) 2002=2007, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -125,6 +124,9 @@ __lll_robust_timedlock_wait: je .Lreltmo # endif + cmpq $0, (%rdx) + js 7f + pushq %r9 cfi_adjust_cfa_offset(8) cfi_rel_offset(%r9, 0) @@ -180,6 +182,9 @@ __lll_robust_timedlock_wait: cfi_adjust_cfa_offset(-8) cfi_restore(%r9) +7: movl $ETIMEDOUT, %eax + retq + # ifndef __ASSUME_FUTEX_CLOCK_REALTIME .Lreltmo: 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 be14fc897e..e6535fb9a7 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 @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2005, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002-2005, 2007, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -144,6 +144,10 @@ __pthread_cond_timedwait: movq %r9, 24(%rsp) movl %edx, 4(%rsp) + cmpq $0, (%r13) + movq $-ETIMEDOUT, %r14 + js 36f + 38: movl cond_futex(%rdi), %r12d /* Unlock. */ diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S index 23b218af34..f5d055c77e 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2005, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002-2005, 2007, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -102,6 +102,9 @@ pthread_rwlock_timedrdlock: je .Lreltmo #endif + cmpq $0, (%r13) + js 16f /* Time is already up. */ + movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %esi xorl PSHARED(%r12), %esi movq %r13, %r10 diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S index cd867b60dc..6ed8b49bd6 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2007, 2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -99,6 +99,9 @@ pthread_rwlock_timedwrlock: je .Lreltmo #endif + cmpq $0, (%r13) + js 16f /* Time is already up. */ + movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %esi xorl PSHARED(%r12), %esi movq %r13, %r10 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 0291beb169..ca49cb89d0 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2005,2007,2009,2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -77,6 +77,9 @@ sem_timedwait: je .Lreltmo #endif + cmpq $0, (%rsi) + js 16f + /* This push is only needed to store the sem_t pointer for the exception handler. */ pushq %rdi @@ -169,6 +172,19 @@ sem_timedwait: retq +16: +#if USE___THREAD + movq errno@gottpoff(%rip), %rdx + movl $ETIMEDOUT, %fs:(%rdx) +#else + callq __errno_location@plt + movl $ETIMEDOUT, (%rax) +#endif + + orl $-1, %eax + + retq + #ifndef __ASSUME_FUTEX_CLOCK_REALTIME .Lreltmo: pushq %r12 -- cgit 1.4.1