about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
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 /sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
parent6a42be57e8755c956a89d1cae02e99172eba082a (diff)
downloadglibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.tar.gz
glibc-bc1da1765e901a9a9f532f91d09f5237655e01fd.tar.xz
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.
Diffstat (limited to 'sysdeps/unix/sysv/linux/powerpc/lowlevellock.h')
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/lowlevellock.h19
1 files changed, 17 insertions, 2 deletions
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))