From a99bfa85d82aecc3eb780779377a9e178e7189d2 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 16 Jul 2002 01:02:04 +0000 Subject: [PATCH] Update. 2002-07-02 H.J. Lu * sysdeps/mips/atomicity.h: Don't include . Always use ll/sc. * sysdeps/unix/sysv/linux/mips/sys/tas.h: Likewise. * sysdeps/unix/sysv/linux/configure.in: Set arch_minimum_kernel to 2.4.0 for mips. TLS fail if USE_TLS is not defined. --- ChangeLog | 11 ++++++- linuxthreads/ChangeLog | 6 ++++ linuxthreads/sysdeps/mips/pspinlock.c | 17 ++-------- linuxthreads/sysdeps/mips/pt-machine.h | 8 ++--- sysdeps/mips/atomicity.h | 45 ++++++-------------------- sysdeps/unix/sysv/linux/configure | 2 +- sysdeps/unix/sysv/linux/configure.in | 2 +- sysdeps/unix/sysv/linux/mips/sys/tas.h | 17 ++-------- 8 files changed, 36 insertions(+), 72 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2b8d53a762..43ee14c897 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,16 @@ +2002-07-02 H.J. Lu + + * sysdeps/mips/atomicity.h: Don't include . Always + use ll/sc. + * sysdeps/unix/sysv/linux/mips/sys/tas.h: Likewise. + + * sysdeps/unix/sysv/linux/configure.in: Set arch_minimum_kernel + to 2.4.0 for mips. + 2002-07-15 Ulrich Drepper * elf/dl-load.c (_dl_map_object_from_fd): If loaded object uses - TLS fail is USE_TLS is not defined. + TLS fail if USE_TLS is not defined. * libio/wfileops.c (_IO_wfile_seekoff): Reposition wide pointers and adjust state for seek position. [PR libc/4070] diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index ec04411bbe..e70be81c13 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,9 @@ +2002-07-02 H.J. Lu + + * sysdeps/mips/pspinlock.c: Don't include . Always + use ll/sc. + * sysdeps/mips/pt-machine.h: Likewise. + 2002-07-14 Ulrich Drepper * manager.c (pthread_handle_create): Initialize self-reference in diff --git a/linuxthreads/sysdeps/mips/pspinlock.c b/linuxthreads/sysdeps/mips/pspinlock.c index 1aa372b4b8..7dd66af2c4 100644 --- a/linuxthreads/sysdeps/mips/pspinlock.c +++ b/linuxthreads/sysdeps/mips/pspinlock.c @@ -19,12 +19,9 @@ #include #include -#include #include #include "internals.h" -#if (_MIPS_ISA >= _MIPS_ISA_MIPS2) - /* This implementation is similar to the one used in the Linux kernel. */ int __pthread_spin_lock (pthread_spinlock_t *lock) @@ -34,10 +31,13 @@ __pthread_spin_lock (pthread_spinlock_t *lock) asm volatile ("\t\t\t# spin_lock\n" "1:\n\t" + ".set push\n\t" + ".set mips2\n\t" "ll %1,%3\n\t" "li %2,1\n\t" "bnez %1,1b\n\t" "sc %2,%0\n\t" + ".set pop\n\t" "beqz %2,1b" : "=m" (*lock), "=&r" (tmp1), "=&r" (tmp2) : "m" (*lock) @@ -46,17 +46,6 @@ __pthread_spin_lock (pthread_spinlock_t *lock) return 0; } -#else /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */ - -int -__pthread_spin_lock (pthread_spinlock_t *lock) -{ - while (_test_and_set ((int *) lock, 1)); - return 0; -} - -#endif /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */ - weak_alias (__pthread_spin_lock, pthread_spin_lock) diff --git a/linuxthreads/sysdeps/mips/pt-machine.h b/linuxthreads/sysdeps/mips/pt-machine.h index 31a3421fba..2bad9427ef 100644 --- a/linuxthreads/sysdeps/mips/pt-machine.h +++ b/linuxthreads/sysdeps/mips/pt-machine.h @@ -23,7 +23,6 @@ #ifndef _PT_MACHINE_H #define _PT_MACHINE_H 1 -#include #include #ifndef PT_EI @@ -51,8 +50,6 @@ register char * stack_pointer __asm__ ("$29"); /* Compare-and-swap for semaphores. */ -#if (_MIPS_ISA >= _MIPS_ISA_MIPS2) - #define HAS_COMPARE_AND_SWAP PT_EI int __compare_and_swap (long int *p, long int oldval, long int newval) @@ -62,11 +59,14 @@ __compare_and_swap (long int *p, long int oldval, long int newval) __asm__ __volatile__ ("/* Inline compare & swap */\n" "1:\n\t" + ".set push\n\t" + ".set mips2\n\t" "ll %1,%5\n\t" "move %0,$0\n\t" "bne %1,%3,2f\n\t" "move %0,%4\n\t" "sc %0,%2\n\t" + ".set pop\n\t" "beqz %0,1b\n" "2:\n\t" "/* End compare & swap */" @@ -77,6 +77,4 @@ __compare_and_swap (long int *p, long int oldval, long int newval) return ret; } -#endif /* (_MIPS_ISA >= _MIPS_ISA_MIPS2) */ - #endif /* pt-machine.h */ diff --git a/sysdeps/mips/atomicity.h b/sysdeps/mips/atomicity.h index b4b7b64dd0..bccacd9c90 100644 --- a/sysdeps/mips/atomicity.h +++ b/sysdeps/mips/atomicity.h @@ -20,11 +20,8 @@ #ifndef _MIPS_ATOMICITY_H #define _MIPS_ATOMICITY_H 1 -#include #include -#if (_MIPS_ISA >= _MIPS_ISA_MIPS2) - static inline int __attribute__ ((unused)) exchange_and_add (volatile uint32_t *mem, int val) @@ -34,9 +31,12 @@ exchange_and_add (volatile uint32_t *mem, int val) __asm__ __volatile__ ("/* Inline exchange & add */\n" "1:\n\t" + ".set push\n\t" + ".set mips2\n\t" "ll %0,%3\n\t" "addu %1,%4,%0\n\t" "sc %1,%2\n\t" + ".set pop\n\t" "beqz %1,1b\n\t" "/* End exchange & add */" : "=&r"(result), "=&r"(tmp), "=m"(*mem) @@ -55,9 +55,12 @@ atomic_add (volatile uint32_t *mem, int val) __asm__ __volatile__ ("/* Inline atomic add */\n" "1:\n\t" + ".set push\n\t" + ".set mips2\n\t" "ll %0,%2\n\t" "addu %0,%3,%0\n\t" "sc %0,%1\n\t" + ".set pop\n\t" "beqz %0,1b\n\t" "/* End atomic add */" : "=&r"(result), "=m"(*mem) @@ -74,11 +77,14 @@ compare_and_swap (volatile long int *p, long int oldval, long int newval) __asm__ __volatile__ ("/* Inline compare & swap */\n" "1:\n\t" + ".set push\n\t" + ".set mips2\n\t" "ll %1,%5\n\t" "move %0,$0\n\t" "bne %1,%3,2f\n\t" "move %0,%4\n\t" "sc %0,%2\n\t" + ".set pop\n\t" "beqz %0,1b\n" "2:\n\t" "/* End compare & swap */" @@ -89,37 +95,4 @@ compare_and_swap (volatile long int *p, long int oldval, long int newval) return ret; } -#else /* (_MIPS_ISA >= _MIPS_ISA_MIPS2) */ - -#warning MIPS I atomicity functions are not atomic - -static inline int -__attribute__ ((unused)) -exchange_and_add (volatile uint32_t *mem, int val) -{ - int result = *mem; - *mem += val; - return result; -} - -static inline void -__attribute__ ((unused)) -atomic_add (volatile uint32_t *mem, int val) -{ - *mem += val; -} - -static inline int -__attribute__ ((unused)) -compare_and_swap (volatile long int *p, long int oldval, long int newval) -{ - if (*p != oldval) - return 0; - - *p = newval; - return 1; -} - -#endif /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */ - #endif /* atomicity.h */ diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure index b08bbb2973..3b30a9ce62 100644 --- a/sysdeps/unix/sysv/linux/configure +++ b/sysdeps/unix/sysv/linux/configure @@ -72,7 +72,7 @@ case "$machine" in libc_cv_gcc_unwind_find_fde=yes ;; mips*) - arch_minimum_kernel=2.2.15 + arch_minimum_kernel=2.4.0 libc_cv_gcc_unwind_find_fde=yes ;; powerpc*) diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in index 5362d45aab..c5aa4e81cf 100644 --- a/sysdeps/unix/sysv/linux/configure.in +++ b/sysdeps/unix/sysv/linux/configure.in @@ -59,7 +59,7 @@ case "$machine" in libc_cv_gcc_unwind_find_fde=yes ;; mips*) - arch_minimum_kernel=2.2.15 + arch_minimum_kernel=2.4.0 libc_cv_gcc_unwind_find_fde=yes ;; powerpc*) diff --git a/sysdeps/unix/sysv/linux/mips/sys/tas.h b/sysdeps/unix/sysv/linux/mips/sys/tas.h index 2a1a04546e..7ad916c3c9 100644 --- a/sysdeps/unix/sysv/linux/mips/sys/tas.h +++ b/sysdeps/unix/sysv/linux/mips/sys/tas.h @@ -21,8 +21,6 @@ #define _SYS_TAS_H 1 #include -#include -#include __BEGIN_DECLS @@ -34,8 +32,6 @@ extern int _test_and_set (int *p, int v) __THROW; # define _EXTERN_INLINE extern __inline # endif -# if (_MIPS_ISA >= _MIPS_ISA_MIPS2) - _EXTERN_INLINE int _test_and_set (int *p, int v) __THROW { @@ -44,10 +40,13 @@ _test_and_set (int *p, int v) __THROW __asm__ __volatile__ ("/* Inline test and set */\n" "1:\n\t" + ".set push\n\t" + ".set mips2\n\t" "ll %0,%3\n\t" "move %1,%4\n\t" "beq %0,%4,2f\n\t" "sc %1,%2\n\t" + ".set pop\n\t" "beqz %1,1b\n" "2:\n\t" "/* End test and set */" @@ -58,16 +57,6 @@ _test_and_set (int *p, int v) __THROW return r; } -# else /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */ - -_EXTERN_INLINE int -_test_and_set (int *p, int v) __THROW -{ - return sysmips (MIPS_ATOMIC_SET, (int) p, v, 0); -} - -# endif /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */ - #endif /* __USE_EXTERN_INLINES */ __END_DECLS