mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 04:06:22 +00:00
[POWERPC] Implement PowerPC futex_atomic_cmpxchg_inatomic().
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>
This commit is contained in:
parent
20fb96e2aa
commit
6958829818
1 changed files with 27 additions and 1 deletions
|
@ -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__ */
|
||||
|
|
Loading…
Reference in a new issue