This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
The sparc atomics were missing "memory" clobbers in their asm statements. This caused miscompilation of the various pthread atomic primitives. In one case, pthread_mutex_lock() was miscompiled such that the ->owner field of the mutex was sampled before we acquired the lock, thus triggering the "owner == 0" assertion if things were just right. Surprisingly nothing in the nptl tests caught this, instead I discovered it when trying to build MONO, which seemed to be able to trigger this case quite readily. :-) Please apply, thanks. 2006-03-24 David S. Miller <davem@sunset.davemloft.net> * sysdeps/sparc/sparc32/bits/atomic.h (__v9_compare_and_exchange_val_32_acq): Add "memory" clobber. * sysdeps/sparc/sparc32/sparcv9/bits/atomic.h (__arch_compare_and_exchange_val_32_acq, atomic_exchange_acq): Likewise. * sysdeps/sparc/sparc64/bits/atomic.h (__arch_compare_and_exchange_val_32_acq, __arch_compare_and_exchange_val_64_acq, atomic_exchange_acq): Likewise. --- ./sysdeps/sparc/sparc32/bits/atomic.h.~1~ 2006-01-03 16:05:07.000000000 -0800 +++ ./sysdeps/sparc/sparc32/bits/atomic.h 2006-03-24 00:00:06.000000000 -0800 @@ -122,7 +122,7 @@ volatile unsigned char __sparc32_atomic_ __asm __volatile (".word 0xcde05005" \ : "+r" (__acev_tmp), "=m" (*__acev_mem) \ : "r" (__acev_oldval), "m" (*__acev_mem), \ - "r" (__acev_mem)); \ + "r" (__acev_mem) : "memory"); \ __acev_tmp; }) #endif --- ./sysdeps/sparc/sparc32/sparcv9/bits/atomic.h.~1~ 2006-01-03 16:05:07.000000000 -0800 +++ ./sysdeps/sparc/sparc32/sparcv9/bits/atomic.h 2006-03-24 00:00:32.000000000 -0800 @@ -59,7 +59,7 @@ typedef uintmax_t uatomic_max_t; __asm __volatile ("cas [%4], %2, %0" \ : "=r" (__acev_tmp), "=m" (*__acev_mem) \ : "r" (oldval), "m" (*__acev_mem), "r" (__acev_mem), \ - "0" (newval)); \ + "0" (newval) : "memory"); \ __acev_tmp; }) /* This can be implemented if needed. */ @@ -74,7 +74,7 @@ typedef uintmax_t uatomic_max_t; if (sizeof (*(mem)) == 4) \ __asm ("swap %0, %1" \ : "=m" (*__memp), "=r" (__oldval) \ - : "m" (*__memp), "1" (__value)); \ + : "m" (*__memp), "1" (__value) : "memory"); \ else \ abort (); \ __oldval; }) --- ./sysdeps/sparc/sparc64/bits/atomic.h.~1~ 2006-01-03 16:05:07.000000000 -0800 +++ ./sysdeps/sparc/sparc64/bits/atomic.h 2006-03-24 00:01:04.000000000 -0800 @@ -59,7 +59,7 @@ typedef uintmax_t uatomic_max_t; __asm __volatile ("cas [%4], %2, %0" \ : "=r" (__acev_tmp), "=m" (*__acev_mem) \ : "r" (oldval), "m" (*__acev_mem), "r" (__acev_mem), \ - "0" (newval)); \ + "0" (newval) : "memory"); \ __acev_tmp; }) #define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ @@ -69,7 +69,7 @@ typedef uintmax_t uatomic_max_t; __asm __volatile ("casx [%4], %2, %0" \ : "=r" (__acev_tmp), "=m" (*__acev_mem) \ : "r" ((long) (oldval)), "m" (*__acev_mem), \ - "r" (__acev_mem), "0" ((long) (newval))); \ + "r" (__acev_mem), "0" ((long) (newval)) : "memory"); \ __acev_tmp; }) #define atomic_exchange_acq(mem, newvalue) \ @@ -80,7 +80,7 @@ typedef uintmax_t uatomic_max_t; if (sizeof (*(mem)) == 4) \ __asm ("swap %0, %1" \ : "=m" (*__memp), "=r" (__oldval) \ - : "m" (*__memp), "1" (__value)); \ + : "m" (*__memp), "1" (__value) : "memory"); \ else \ { \ __val = *__memp; \
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |