1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00
2003-08-11  Carlos O'Donell  <carlos@baldric.uwo.ca>

	* dlfcn/default.c (main): Cast dlsym loaded value to same type as main.
	Address passed to test_in_mod1 and test_in_mod2 without casting.
	* dlfcn/defaultmod1.c: Change prototype of test_in_mod1.
	(test_in_mod1): Cast dlsym loaded value to same type as mainp.
	* dlfcn/defaultmod2.c: Change prototype of test_in_mod2.
	(test_in_mod2): Cast dlsym loaded value to same type as mainp.

2003-08-15  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/sparc/sparc32/elf/configure.in (libc_cv_sparc32_tls):
	Change quotes before using [].

	* sysdeps/unix/sysv/linux/sparc/sys/user.h: New file.

	* sysdeps/sparc/sparc32/bits/atomic.h (__sparc32_atomic_lock):
	Renamed to...
	(__sparc32_atomic_locks): ...this.  Change into 64-byte array.
	(__sparc32_atomic_do_lock, __sparc32_atomic_do_unlock): Add addr
	argument.  Select one of 64 locks from address bits.
	(atomic_compare_and_exchange_val_acq,
	atomic_compare_and_exchange_bool_acq): Pass memory address to
	__sparc32_atomic_do_{,un}lock.
This commit is contained in:
Ulrich Drepper
2003-08-15 03:58:56 +00:00
parent 1ee598e6cd
commit d57a3f0e02
7 changed files with 138 additions and 22 deletions

View File

@ -22,28 +22,34 @@
#define _BITS_ATOMIC_H 1
/* We have no compare and swap, just test and set.
The following implementation contends on one single global lock
The following implementation contends on 64 global locks
per library and assumes no variable will be accessed using atomic.h
macros from two different libraries. */
volatile unsigned char __sparc32_atomic_lock
__attribute__ ((nocommon, section (".gnu.linkonce.b.__sparc32_atomic_lock"),
volatile unsigned char __sparc32_atomic_locks[64]
__attribute__ ((nocommon, section (".gnu.linkonce.b.__sparc32_atomic_locks"),
visibility ("hidden")));
#define __sparc32_atomic_do_lock() \
#define __sparc32_atomic_do_lock(addr) \
do \
{ \
unsigned int __old_lock; \
unsigned int __idx = (((long) addr >> 2) ^ ((long) addr >> 12)) \
& 63; \
do \
__asm ("ldstub %1, %0" \
: "=r" (__old_lock), "=m" (__sparc32_atomic_lock) \
: "m" (__sparc32_atomic_lock)); \
: "=r" (__old_lock), \
"=m" (__sparc32_atomic_locks[__idx]) \
: "m" (__sparc32_atomic_locks[__idx])); \
while (__old_lock); \
} \
while (0)
#define __sparc32_atomic_do_unlock() \
do __sparc32_atomic_lock = 0; while (0)
#define __sparc32_atomic_do_unlock(addr) \
do \
__sparc32_atomic_locks[(((long) addr >> 2) \
^ ((long) addr >> 12)) & 63] = 0; \
while (0)
/* The only basic operation needed is compare and exchange. */
#define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
@ -51,11 +57,11 @@ volatile unsigned char __sparc32_atomic_lock
__typeof (*mem) __acev_ret; \
__typeof (*mem) __acev_newval = (newval); \
\
__sparc32_atomic_do_lock (); \
__sparc32_atomic_do_lock (__acev_memp); \
__acev_ret = *__acev_memp; \
if (__acev_ret == (oldval)) \
*__acev_memp = __acev_newval; \
__sparc32_atomic_do_unlock (); \
__sparc32_atomic_do_unlock (__acev_memp); \
__acev_ret; })
#define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
@ -63,13 +69,13 @@ volatile unsigned char __sparc32_atomic_lock
int __aceb_ret; \
__typeof (*mem) __aceb_newval = (newval); \
\
__sparc32_atomic_do_lock (); \
__sparc32_atomic_do_lock (__aceb_memp); \
__aceb_ret = 0; \
if (*__aceb_memp == (oldval)) \
*__aceb_memp = __aceb_newval; \
else \
__aceb_ret = 1; \
__sparc32_atomic_do_unlock (); \
__sparc32_atomic_do_unlock (__aceb_memp); \
__aceb_ret; })
#endif /* bits/atomic.h */

View File

@ -29,7 +29,7 @@ baz: sethi %tgd_hi22(foo), %l1
add %o0, %l1, %l1, %tldo_add(bar)
sethi %tie_hi22(foo), %l1
add %l1, %tie_lo10(foo), %l1
ld %l7 + %l1, %l1, %tie_ld(foo)
ld [%l7 + %l1], %l1, %tie_ld(foo)
add %g7, %l1, %l1, %tie_add(foo)
sethi %tle_hix22(foo), %l1
xor %l1, %tle_lox10(foo), %l1