-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sh: add working futex atomic ops on userspace addresses for smp
The version of futex.h in asm-generic should really be adapted to do the same thing so that this hideous code does not have to be duplicated per-arch. Signed-off-by: Rich Felker <dalias@libc.org>
- Loading branch information
Rich Felker
committed
Aug 5, 2016
1 parent
2b47d54
commit 00b73d8
Showing
4 changed files
with
134 additions
and
124 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
#ifndef __ASM_SH_FUTEX_CAS_H | ||
#define __ASM_SH_FUTEX_CAS_H | ||
|
||
static inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval, | ||
u32 __user *uaddr, | ||
u32 oldval, u32 newval) | ||
{ | ||
int err = 0; | ||
__asm__ __volatile__( | ||
"1:\n\t" | ||
"cas.l %2, %1, @r0\n" | ||
"2:\n\t" | ||
#ifdef CONFIG_MMU | ||
".section .fixup,\"ax\"\n" | ||
"3:\n\t" | ||
"mov.l 4f, %0\n\t" | ||
"jmp @%0\n\t" | ||
" mov %3, %0\n\t" | ||
".balign 4\n" | ||
"4: .long 2b\n\t" | ||
".previous\n" | ||
".section __ex_table,\"a\"\n\t" | ||
".long 1b, 3b\n\t" | ||
".previous" | ||
#endif | ||
:"+r" (err), "+r" (newval) | ||
:"r" (oldval), "i" (-EFAULT), "z" (uaddr) | ||
:"t", "memory"); | ||
if (err) return err; | ||
*uval = newval; | ||
return 0; | ||
} | ||
|
||
#endif /* __ASM_SH_FUTEX_CAS_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
#ifndef __ASM_SH_FUTEX_LLSC_H | ||
#define __ASM_SH_FUTEX_LLSC_H | ||
|
||
static inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval, | ||
u32 __user *uaddr, | ||
u32 oldval, u32 newval) | ||
{ | ||
int err = 0; | ||
__asm__ __volatile__( | ||
"synco\n" | ||
"1:\n\t" | ||
"movli.l @%2, r0\n\t" | ||
"mov r0, %1\n\t" | ||
"cmp/eq %1, %4\n\t" | ||
"bf 2f\n\t" | ||
"mov %5, r0\n\t" | ||
"movco.l r0, @%2\n\t" | ||
"bf 1b\n" | ||
"2:\n\t" | ||
"synco\n\t" | ||
#ifdef CONFIG_MMU | ||
".section .fixup,\"ax\"\n" | ||
"3:\n\t" | ||
"mov.l 4f, %0\n\t" | ||
"jmp @%0\n\t" | ||
" mov %3, %0\n\t" | ||
".balign 4\n" | ||
"4: .long 2b\n\t" | ||
".previous\n" | ||
".section __ex_table,\"a\"\n\t" | ||
".long 1b, 3b\n\t" | ||
".previous" | ||
#endif | ||
:"+r" (err), "=&r" (*uval) | ||
:"r" (uaddr), "i" (-EFAULT), "r" (oldval), "r" (newval) | ||
:"t", "memory", "r0"); | ||
if (err) return err; | ||
return 0; | ||
} | ||
|
||
#endif /* __ASM_SH_FUTEX_LLSC_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters