diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | nptl/ChangeLog | 14 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/sem_timedwait.c | 26 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/sem_wait.c | 24 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c | 26 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c | 24 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c | 26 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c | 24 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/fpu/s_fabs.S | 29 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/fpu/s_fabs.c | 11 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/fpu/s_fabsf.S | 4 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/sparcv9/fpu/s_fabs.S | 29 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/fpu/Implies | 3 |
13 files changed, 179 insertions, 70 deletions
@@ -1,3 +1,12 @@ +2011-09-05 David S. Miller <davem@davemloft.net> + + * sysdeps/sparc/sparc32/fpu/s_fabsf.S: Use first argument + stack slot, rather than the struct return pointer slot. + * sysdeps/sparc/sparc32/fpu/s_fabs.c: Delete. + * sysdeps/sparc/sparc32/fpu/s_fabs.S: New file. + * sysdeps/sparc/sparc32/sparcv9/fpu/s_fabs.S: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/fpu/Implies: Likewise. + 2011-09-05 Ulrich Drepper <drepper@gmail.com> * po/ja.po: Update from translation team. diff --git a/nptl/ChangeLog b/nptl/ChangeLog index c44ce2a..caae5dc 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,17 @@ +2011-09-05 David S. Miller <davem@davemloft.net> + + * sysdeps/unix/sysv/linux/sem_timedwait.c (do_futex_timed_wait): + New function. + (sem_timedwait): Call it to force an exception region around + the async cancel enable and the futex operation. + * sysdeps/unix/sysv/linux/sparc/sem_timedwait.c: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c: Likewise. + * sysdeps/unix/sysv/linux/sem_wait.c (do_futex_wait): New function. + (__new_sem_wait): Call it to force an exception region around + the async cancel enable and the futex operation. + * sysdeps/unix/sysv/linux/sparc/sem_wait.c: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c: Likewise. + 2011-08-31 Andreas Schwab <schwab@redhat.com> * allocatestack.c (setxid_mark_thread): Ensure that the exiting diff --git a/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c b/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c index fdf0d74..cb3b78f 100644 --- a/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c +++ b/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c @@ -30,6 +30,21 @@ extern void __sem_wait_cleanup (void *arg) attribute_hidden; +/* This is in a seperate function in order to make sure gcc + puts the call site into an exception region, and thus the + cleanups get properly run. */ +static int +__attribute__ ((noinline)) +do_futex_timed_wait (struct new_sem *isem, struct timespec *rt) +{ + int err, oldtype = __pthread_enable_asynccancel (); + + err = lll_futex_timed_wait (&isem->value, 0, rt, + isem->private ^ FUTEX_PRIVATE_FLAG); + + __pthread_disable_asynccancel (oldtype); + return err; +} int sem_timedwait (sem_t *sem, const struct timespec *abstime) @@ -80,16 +95,7 @@ sem_timedwait (sem_t *sem, const struct timespec *abstime) /* Do wait. */ rt.tv_sec = sec; rt.tv_nsec = nsec; - - /* Enable asynchronous cancellation. Required by the standard. */ - int oldtype = __pthread_enable_asynccancel (); - - err = lll_futex_timed_wait (&isem->value, 0, &rt, - isem->private ^ FUTEX_PRIVATE_FLAG); - - /* Disable asynchronous cancellation. */ - __pthread_disable_asynccancel (oldtype); - + err = do_futex_timed_wait(isem, &rt); if (err != 0 && err != -EWOULDBLOCK) { __set_errno (-err); diff --git a/nptl/sysdeps/unix/sysv/linux/sem_wait.c b/nptl/sysdeps/unix/sysv/linux/sem_wait.c index 20e2b48..602c382 100644 --- a/nptl/sysdeps/unix/sysv/linux/sem_wait.c +++ b/nptl/sysdeps/unix/sysv/linux/sem_wait.c @@ -37,6 +37,20 @@ __sem_wait_cleanup (void *arg) atomic_decrement (&isem->nwaiters); } +/* This is in a seperate function in order to make sure gcc + puts the call site into an exception region, and thus the + cleanups get properly run. */ +static int +__attribute__ ((noinline)) +do_futex_wait (struct new_sem *isem) +{ + int err, oldtype = __pthread_enable_asynccancel (); + + err = lll_futex_wait (&isem->value, 0, isem->private ^ FUTEX_PRIVATE_FLAG); + + __pthread_disable_asynccancel (oldtype); + return err; +} int __new_sem_wait (sem_t *sem) @@ -53,15 +67,7 @@ __new_sem_wait (sem_t *sem) while (1) { - /* Enable asynchronous cancellation. Required by the standard. */ - int oldtype = __pthread_enable_asynccancel (); - - err = lll_futex_wait (&isem->value, 0, - isem->private ^ FUTEX_PRIVATE_FLAG); - - /* Disable asynchronous cancellation. */ - __pthread_disable_asynccancel (oldtype); - + err = do_futex_wait(isem); if (err != 0 && err != -EWOULDBLOCK) { __set_errno (-err); diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c b/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c index 01952f3..fdd09af 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c @@ -30,6 +30,21 @@ extern void __sem_wait_cleanup (void *arg) attribute_hidden; +/* This is in a seperate function in order to make sure gcc + puts the call site into an exception region, and thus the + cleanups get properly run. */ +static int +__attribute__ ((noinline)) +do_futex_timed_wait (struct sparc_new_sem *isem, struct timespec *rt) +{ + int err, oldtype = __pthread_enable_asynccancel (); + + err = lll_futex_timed_wait (&isem->value, 0, rt, + isem->private ^ FUTEX_PRIVATE_FLAG); + + __pthread_disable_asynccancel (oldtype); + return err; +} int sem_timedwait (sem_t *sem, const struct timespec *abstime) @@ -80,16 +95,7 @@ sem_timedwait (sem_t *sem, const struct timespec *abstime) /* Do wait. */ rt.tv_sec = sec; rt.tv_nsec = nsec; - - /* Enable asynchronous cancellation. Required by the standard. */ - int oldtype = __pthread_enable_asynccancel (); - - err = lll_futex_timed_wait (&isem->value, 0, &rt, - isem->private ^ FUTEX_PRIVATE_FLAG); - - /* Disable asynchronous cancellation. */ - __pthread_disable_asynccancel (oldtype); - + err = do_futex_timed_wait(isem, &rt); if (err != 0 && err != -EWOULDBLOCK) { __set_errno (-err); diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c b/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c index a846f20..4a2c935 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c @@ -37,6 +37,20 @@ __sem_wait_cleanup (void *arg) atomic_decrement (&isem->nwaiters); } +/* This is in a seperate function in order to make sure gcc + puts the call site into an exception region, and thus the + cleanups get properly run. */ +static int +__attribute__ ((noinline)) +do_futex_wait (struct sparc_new_sem *isem) +{ + int err, oldtype = __pthread_enable_asynccancel (); + + err = lll_futex_wait (&isem->value, 0, isem->private ^ FUTEX_PRIVATE_FLAG); + + __pthread_disable_asynccancel (oldtype); + return err; +} int __new_sem_wait (sem_t *sem) @@ -53,15 +67,7 @@ __new_sem_wait (sem_t *sem) while (1) { - /* Enable asynchronous cancellation. Required by the standard. */ - int oldtype = __pthread_enable_asynccancel (); - - err = lll_futex_wait (&isem->value, 0, - isem->private ^ FUTEX_PRIVATE_FLAG); - - /* Disable asynchronous cancellation. */ - __pthread_disable_asynccancel (oldtype); - + err = do_futex_wait(isem); if (err != 0 && err != -EWOULDBLOCK) { __set_errno (-err); diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c index 55f3e2e..90edbc5 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c @@ -30,6 +30,21 @@ extern void __sem_wait_cleanup (void *arg) attribute_hidden; +/* This is in a seperate function in order to make sure gcc + puts the call site into an exception region, and thus the + cleanups get properly run. */ +static int +__attribute__ ((noinline)) +do_futex_timed_wait (struct sparc_new_sem *isem, struct timespec *rt) +{ + int err, oldtype = __pthread_enable_asynccancel (); + + err = lll_futex_timed_wait (&isem->value, 0, rt, + isem->private ^ FUTEX_PRIVATE_FLAG); + + __pthread_disable_asynccancel (oldtype); + return err; +} int sem_timedwait (sem_t *sem, const struct timespec *abstime) @@ -99,16 +114,7 @@ sem_timedwait (sem_t *sem, const struct timespec *abstime) /* Do wait. */ rt.tv_sec = sec; rt.tv_nsec = nsec; - - /* Enable asynchronous cancellation. Required by the standard. */ - int oldtype = __pthread_enable_asynccancel (); - - err = lll_futex_timed_wait (&isem->value, 0, &rt, - isem->private ^ FUTEX_PRIVATE_FLAG); - - /* Disable asynchronous cancellation. */ - __pthread_disable_asynccancel (oldtype); - + err = do_futex_timed_wait(isem, &rt); if (err != 0 && err != -EWOULDBLOCK) { __set_errno (-err); diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c index b14f976..8fba4b7 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c @@ -44,6 +44,20 @@ __sem_wait_cleanup (void *arg) } } +/* This is in a seperate function in order to make sure gcc + puts the call site into an exception region, and thus the + cleanups get properly run. */ +static int +__attribute__ ((noinline)) +do_futex_wait (struct sparc_new_sem *isem) +{ + int err, oldtype = __pthread_enable_asynccancel (); + + err = lll_futex_wait (&isem->value, 0, isem->private ^ FUTEX_PRIVATE_FLAG); + + __pthread_disable_asynccancel (oldtype); + return err; +} int __new_sem_wait (sem_t *sem) @@ -77,15 +91,7 @@ __new_sem_wait (sem_t *sem) while (1) { - /* Enable asynchronous cancellation. Required by the standard. */ - int oldtype = __pthread_enable_asynccancel (); - - err = lll_futex_wait (&isem->value, 0, - isem->private ^ FUTEX_PRIVATE_FLAG); - - /* Disable asynchronous cancellation. */ - __pthread_disable_asynccancel (oldtype); - + err = do_futex_wait(isem); if (err != 0 && err != -EWOULDBLOCK) { __set_errno (-err); diff --git a/sysdeps/sparc/sparc32/fpu/s_fabs.S b/sysdeps/sparc/sparc32/fpu/s_fabs.S new file mode 100644 index 0000000..425fab4 --- /dev/null +++ b/sysdeps/sparc/sparc32/fpu/s_fabs.S @@ -0,0 +1,29 @@ +/* Float absolute value, sparc32 version. + Copyright (C) 2011 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +ENTRY (__fabs) + st %o0, [%sp+72] + st %o1, [%sp+76] + ldd [%sp+72], %f0 + retl + fabss %f0, %f0 +END (__fabs) +weak_alias (__fabs, fabs) diff --git a/sysdeps/sparc/sparc32/fpu/s_fabs.c b/sysdeps/sparc/sparc32/fpu/s_fabs.c deleted file mode 100644 index b883e6e..0000000 --- a/sysdeps/sparc/sparc32/fpu/s_fabs.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <math.h> -#include <math_ldbl_opt.h> - -double __fabs (double x) -{ - return __builtin_fabs (x); -} -weak_alias (__fabs, fabs) -#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) -compat_symbol (libm, __fabs, fabsl, GLIBC_2_0); -#endif diff --git a/sysdeps/sparc/sparc32/fpu/s_fabsf.S b/sysdeps/sparc/sparc32/fpu/s_fabsf.S index e148724..b233c62 100644 --- a/sysdeps/sparc/sparc32/fpu/s_fabsf.S +++ b/sysdeps/sparc/sparc32/fpu/s_fabsf.S @@ -21,8 +21,8 @@ #include <sysdep.h> ENTRY (__fabsf) - st %o0, [%sp+64] - ld [%sp+64], %f0 + st %o0, [%sp+68] + ld [%sp+68], %f0 retl fabss %f0, %f0 END (__fabsf) diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/s_fabs.S b/sysdeps/sparc/sparc32/sparcv9/fpu/s_fabs.S new file mode 100644 index 0000000..547840e --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/s_fabs.S @@ -0,0 +1,29 @@ +/* Float absolute value, sparc32+v9 version. + Copyright (C) 2011 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +ENTRY (__fabs) + st %o0, [%sp+72] + st %o1, [%sp+76] + ldd [%sp+72], %f0 + retl + fabsd %f0, %f0 +END (__fabs) +weak_alias (__fabs, fabs) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/fpu/Implies b/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/fpu/Implies new file mode 100644 index 0000000..70568c5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/fpu/Implies @@ -0,0 +1,3 @@ +# We must list this here to move it ahead of the ldbl-opt code. +sparc/sparc32/sparcv9/fpu +sparc/sparc32/fpu |