2002-07-02  H.J. Lu  <hjl@gnu.org>

	* sysdeps/mips/atomicity.h: Don't include <sgidefs.h>.  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.
This commit is contained in:
Ulrich Drepper 2002-07-16 01:02:04 +00:00
parent 807bce82b3
commit a99bfa85d8
8 changed files with 36 additions and 72 deletions

View File

@ -1,7 +1,16 @@
2002-07-02 H.J. Lu <hjl@gnu.org>
* sysdeps/mips/atomicity.h: Don't include <sgidefs.h>. 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 <drepper@redhat.com> 2002-07-15 Ulrich Drepper <drepper@redhat.com>
* elf/dl-load.c (_dl_map_object_from_fd): If loaded object uses * 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 * libio/wfileops.c (_IO_wfile_seekoff): Reposition wide pointers
and adjust state for seek position. [PR libc/4070] and adjust state for seek position. [PR libc/4070]

View File

@ -1,3 +1,9 @@
2002-07-02 H.J. Lu <hjl@gnu.org>
* sysdeps/mips/pspinlock.c: Don't include <sgidefs.h>. Always
use ll/sc.
* sysdeps/mips/pt-machine.h: Likewise.
2002-07-14 Ulrich Drepper <drepper@redhat.com> 2002-07-14 Ulrich Drepper <drepper@redhat.com>
* manager.c (pthread_handle_create): Initialize self-reference in * manager.c (pthread_handle_create): Initialize self-reference in

View File

@ -19,12 +19,9 @@
#include <errno.h> #include <errno.h>
#include <pthread.h> #include <pthread.h>
#include <sgidefs.h>
#include <sys/tas.h> #include <sys/tas.h>
#include "internals.h" #include "internals.h"
#if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
/* This implementation is similar to the one used in the Linux kernel. */ /* This implementation is similar to the one used in the Linux kernel. */
int int
__pthread_spin_lock (pthread_spinlock_t *lock) __pthread_spin_lock (pthread_spinlock_t *lock)
@ -34,10 +31,13 @@ __pthread_spin_lock (pthread_spinlock_t *lock)
asm volatile asm volatile
("\t\t\t# spin_lock\n" ("\t\t\t# spin_lock\n"
"1:\n\t" "1:\n\t"
".set push\n\t"
".set mips2\n\t"
"ll %1,%3\n\t" "ll %1,%3\n\t"
"li %2,1\n\t" "li %2,1\n\t"
"bnez %1,1b\n\t" "bnez %1,1b\n\t"
"sc %2,%0\n\t" "sc %2,%0\n\t"
".set pop\n\t"
"beqz %2,1b" "beqz %2,1b"
: "=m" (*lock), "=&r" (tmp1), "=&r" (tmp2) : "=m" (*lock), "=&r" (tmp1), "=&r" (tmp2)
: "m" (*lock) : "m" (*lock)
@ -46,17 +46,6 @@ __pthread_spin_lock (pthread_spinlock_t *lock)
return 0; 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) weak_alias (__pthread_spin_lock, pthread_spin_lock)

View File

@ -23,7 +23,6 @@
#ifndef _PT_MACHINE_H #ifndef _PT_MACHINE_H
#define _PT_MACHINE_H 1 #define _PT_MACHINE_H 1
#include <sgidefs.h>
#include <sys/tas.h> #include <sys/tas.h>
#ifndef PT_EI #ifndef PT_EI
@ -51,8 +50,6 @@ register char * stack_pointer __asm__ ("$29");
/* Compare-and-swap for semaphores. */ /* Compare-and-swap for semaphores. */
#if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
#define HAS_COMPARE_AND_SWAP #define HAS_COMPARE_AND_SWAP
PT_EI int PT_EI int
__compare_and_swap (long int *p, long int oldval, long int newval) __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__ __asm__ __volatile__
("/* Inline compare & swap */\n" ("/* Inline compare & swap */\n"
"1:\n\t" "1:\n\t"
".set push\n\t"
".set mips2\n\t"
"ll %1,%5\n\t" "ll %1,%5\n\t"
"move %0,$0\n\t" "move %0,$0\n\t"
"bne %1,%3,2f\n\t" "bne %1,%3,2f\n\t"
"move %0,%4\n\t" "move %0,%4\n\t"
"sc %0,%2\n\t" "sc %0,%2\n\t"
".set pop\n\t"
"beqz %0,1b\n" "beqz %0,1b\n"
"2:\n\t" "2:\n\t"
"/* End compare & swap */" "/* End compare & swap */"
@ -77,6 +77,4 @@ __compare_and_swap (long int *p, long int oldval, long int newval)
return ret; return ret;
} }
#endif /* (_MIPS_ISA >= _MIPS_ISA_MIPS2) */
#endif /* pt-machine.h */ #endif /* pt-machine.h */

View File

@ -20,11 +20,8 @@
#ifndef _MIPS_ATOMICITY_H #ifndef _MIPS_ATOMICITY_H
#define _MIPS_ATOMICITY_H 1 #define _MIPS_ATOMICITY_H 1
#include <sgidefs.h>
#include <inttypes.h> #include <inttypes.h>
#if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
static inline int static inline int
__attribute__ ((unused)) __attribute__ ((unused))
exchange_and_add (volatile uint32_t *mem, int val) exchange_and_add (volatile uint32_t *mem, int val)
@ -34,9 +31,12 @@ exchange_and_add (volatile uint32_t *mem, int val)
__asm__ __volatile__ __asm__ __volatile__
("/* Inline exchange & add */\n" ("/* Inline exchange & add */\n"
"1:\n\t" "1:\n\t"
".set push\n\t"
".set mips2\n\t"
"ll %0,%3\n\t" "ll %0,%3\n\t"
"addu %1,%4,%0\n\t" "addu %1,%4,%0\n\t"
"sc %1,%2\n\t" "sc %1,%2\n\t"
".set pop\n\t"
"beqz %1,1b\n\t" "beqz %1,1b\n\t"
"/* End exchange & add */" "/* End exchange & add */"
: "=&r"(result), "=&r"(tmp), "=m"(*mem) : "=&r"(result), "=&r"(tmp), "=m"(*mem)
@ -55,9 +55,12 @@ atomic_add (volatile uint32_t *mem, int val)
__asm__ __volatile__ __asm__ __volatile__
("/* Inline atomic add */\n" ("/* Inline atomic add */\n"
"1:\n\t" "1:\n\t"
".set push\n\t"
".set mips2\n\t"
"ll %0,%2\n\t" "ll %0,%2\n\t"
"addu %0,%3,%0\n\t" "addu %0,%3,%0\n\t"
"sc %0,%1\n\t" "sc %0,%1\n\t"
".set pop\n\t"
"beqz %0,1b\n\t" "beqz %0,1b\n\t"
"/* End atomic add */" "/* End atomic add */"
: "=&r"(result), "=m"(*mem) : "=&r"(result), "=m"(*mem)
@ -74,11 +77,14 @@ compare_and_swap (volatile long int *p, long int oldval, long int newval)
__asm__ __volatile__ __asm__ __volatile__
("/* Inline compare & swap */\n" ("/* Inline compare & swap */\n"
"1:\n\t" "1:\n\t"
".set push\n\t"
".set mips2\n\t"
"ll %1,%5\n\t" "ll %1,%5\n\t"
"move %0,$0\n\t" "move %0,$0\n\t"
"bne %1,%3,2f\n\t" "bne %1,%3,2f\n\t"
"move %0,%4\n\t" "move %0,%4\n\t"
"sc %0,%2\n\t" "sc %0,%2\n\t"
".set pop\n\t"
"beqz %0,1b\n" "beqz %0,1b\n"
"2:\n\t" "2:\n\t"
"/* End compare & swap */" "/* End compare & swap */"
@ -89,37 +95,4 @@ compare_and_swap (volatile long int *p, long int oldval, long int newval)
return ret; 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 */ #endif /* atomicity.h */

View File

@ -72,7 +72,7 @@ case "$machine" in
libc_cv_gcc_unwind_find_fde=yes libc_cv_gcc_unwind_find_fde=yes
;; ;;
mips*) mips*)
arch_minimum_kernel=2.2.15 arch_minimum_kernel=2.4.0
libc_cv_gcc_unwind_find_fde=yes libc_cv_gcc_unwind_find_fde=yes
;; ;;
powerpc*) powerpc*)

View File

@ -59,7 +59,7 @@ case "$machine" in
libc_cv_gcc_unwind_find_fde=yes libc_cv_gcc_unwind_find_fde=yes
;; ;;
mips*) mips*)
arch_minimum_kernel=2.2.15 arch_minimum_kernel=2.4.0
libc_cv_gcc_unwind_find_fde=yes libc_cv_gcc_unwind_find_fde=yes
;; ;;
powerpc*) powerpc*)

View File

@ -21,8 +21,6 @@
#define _SYS_TAS_H 1 #define _SYS_TAS_H 1
#include <features.h> #include <features.h>
#include <sgidefs.h>
#include <sys/sysmips.h>
__BEGIN_DECLS __BEGIN_DECLS
@ -34,8 +32,6 @@ extern int _test_and_set (int *p, int v) __THROW;
# define _EXTERN_INLINE extern __inline # define _EXTERN_INLINE extern __inline
# endif # endif
# if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
_EXTERN_INLINE int _EXTERN_INLINE int
_test_and_set (int *p, int v) __THROW _test_and_set (int *p, int v) __THROW
{ {
@ -44,10 +40,13 @@ _test_and_set (int *p, int v) __THROW
__asm__ __volatile__ __asm__ __volatile__
("/* Inline test and set */\n" ("/* Inline test and set */\n"
"1:\n\t" "1:\n\t"
".set push\n\t"
".set mips2\n\t"
"ll %0,%3\n\t" "ll %0,%3\n\t"
"move %1,%4\n\t" "move %1,%4\n\t"
"beq %0,%4,2f\n\t" "beq %0,%4,2f\n\t"
"sc %1,%2\n\t" "sc %1,%2\n\t"
".set pop\n\t"
"beqz %1,1b\n" "beqz %1,1b\n"
"2:\n\t" "2:\n\t"
"/* End test and set */" "/* End test and set */"
@ -58,16 +57,6 @@ _test_and_set (int *p, int v) __THROW
return r; 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 */ #endif /* __USE_EXTERN_INLINES */
__END_DECLS __END_DECLS