Skip to content

Commit

Permalink
[POWERPC] Implement PowerPC futex_atomic_cmpxchg_inatomic().
Browse files Browse the repository at this point in the history
The sys_[gs]et_robust_list() syscalls were wired up on PowerPC but
didn't work correctly because futex_atomic_cmpxchg_inatomic() wasn't
implemented.  Implement it, based on __cmpxchg_u32().

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
David Woodhouse authored and Paul Mackerras committed Sep 13, 2006
1 parent 20fb96e commit 6958829
Showing 1 changed file with 27 additions and 1 deletion.
28 changes: 27 additions & 1 deletion include/asm-powerpc/futex.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,33 @@ static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr)
static inline int
futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
{
return -ENOSYS;
int prev;

if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
return -EFAULT;

__asm__ __volatile__ (
LWSYNC_ON_SMP
"1: lwarx %0,0,%2 # futex_atomic_cmpxchg_inatomic\n\
cmpw 0,%0,%3\n\
bne- 3f\n"
PPC405_ERR77(0,%2)
"2: stwcx. %4,0,%2\n\
bne- 1b\n"
ISYNC_ON_SMP
"3: .section .fixup,\"ax\"\n\
4: li %0,%5\n\
b 3b\n\
.previous\n\
.section __ex_table,\"a\"\n\
.align 3\n\
" PPC_LONG "1b,4b,2b,4b\n\
.previous" \
: "=&r" (prev), "+m" (*uaddr)
: "r" (uaddr), "r" (oldval), "r" (newval), "i" (-EFAULT)
: "cc", "memory");

return prev;
}

#endif /* __KERNEL__ */
Expand Down

0 comments on commit 6958829

Please sign in to comment.