aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-07-10 16:42:51 -0500
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-07-10 16:46:33 -0500
commitbc1da1765e901a9a9f532f91d09f5237655e01fd (patch)
tree46c0b670d468807531183032471d0203fde9b193
parent6a42be57e8755c956a89d1cae02e99172eba082a (diff)
downloadglibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.tar
glibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.tar.gz
glibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.tar.bz2
glibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.zip
PowerPC: Fix build due missing lll_robust_trylock
Commit 887865f remove the lll_robust_trylock definition on all architectures, however for powerpc both __lll_trylock and __lll_cond_trylock were based on lll_robust_trylock definition. This patch restore it with a different name.
-rw-r--r--ChangeLog7
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/lowlevellock.h19
2 files changed, 24 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index b65dfa8e91..99b87329d5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2014-07-10 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
+
+ * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (__lll_base_trylock):
+ New define.
+ (__lll_trylock): Use __lll_base_trylock.
+ (__lll_cond_trylock): Likewise.
+
2014-07-10 Roland McGrath <roland@hack.frob.com>
* nptl/pthread_create.c (start_thread): Use atomic_or and
diff --git a/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
index d7e1e38cc6..a651d23c50 100644
--- a/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
+++ b/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
@@ -190,13 +190,28 @@
# endif
#endif
+/* Set *futex to ID if it is 0, atomically. Returns the old value */
+#define __lll_base_trylock(futex, id) \
+ ({ int __val; \
+ __asm __volatile ("1: lwarx %0,0,%2" MUTEX_HINT_ACQ "\n" \
+ " cmpwi 0,%0,0\n" \
+ " bne 2f\n" \
+ " stwcx. %3,0,%2\n" \
+ " bne- 1b\n" \
+ "2: " __lll_acq_instr \
+ : "=&r" (__val), "=m" (*futex) \
+ : "r" (futex), "r" (id), "m" (*futex) \
+ : "cr0", "memory"); \
+ __val; \
+ })
+
/* Set *futex to 1 if it is 0, atomically. Returns the old value */
-#define __lll_trylock(futex) __lll_robust_trylock (futex, 1)
+#define __lll_trylock(futex) __lll_base_trylock (futex, 1)
#define lll_trylock(lock) __lll_trylock (&(lock))
/* Set *futex to 2 if it is 0, atomically. Returns the old value */
-#define __lll_cond_trylock(futex) __lll_robust_trylock (futex, 2)
+#define __lll_cond_trylock(futex) __lll_base_trylock (futex, 2)
#define lll_cond_trylock(lock) __lll_cond_trylock (&(lock))