mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-30 22:43:12 +03:00
Update.
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:
@ -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 */
|
||||
|
2
sysdeps/sparc/sparc32/elf/configure
vendored
2
sysdeps/sparc/sparc32/elf/configure
vendored
@ -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
|
||||
|
Reference in New Issue
Block a user