From bc1da1765e901a9a9f532f91d09f5237655e01fd Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Thu, 10 Jul 2014 16:42:51 -0500 Subject: [PATCH] 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. --- ChangeLog | 7 +++++++ .../unix/sysv/linux/powerpc/lowlevellock.h | 19 +++++++++++++++++-- 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 + + * 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 * 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))