aboutsummaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
index bfd109f080..2b58d2e63a 100644
--- a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
@@ -99,6 +99,18 @@
__val; \
})
+/* Atomically store newval and return the old value. */
+#define __lll_test_and_set(futex, newval) \
+ ({ int __val; \
+ __asm __volatile ("1: lwarx %0,0,%3\n" \
+ " stwcx. %2,0,%3\n" \
+ " bne- 1b" \
+ : "=&r" (__val), "=m" (*futex) \
+ : "r" (futex), "r" (newval), "1" (*futex) \
+ : "cr0"); \
+ __val; })
+
+
extern void __lll_lock_wait (int *futex, int val) attribute_hidden;
#define lll_mutex_lock(lock) \