[PATCH] s390: fix in-user atomic futex operation.
From: Martin Schwidefsky <schwidefsky@de.ibm.com> __futex_atomic_op needs to do an atomic operation in the user address space, not the kernel address space. Add the missing sacf 256/sacf 0 to switch to the secondary mode before doing the compare-and-swap. In addition add another fixup for catch specification exceptions if the compare-and-swap address is not aligned. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
71601e2b33
commit
bafe00cc92
@@ -11,23 +11,24 @@
|
|||||||
#define __futex_atomic_fixup \
|
#define __futex_atomic_fixup \
|
||||||
".section __ex_table,\"a\"\n" \
|
".section __ex_table,\"a\"\n" \
|
||||||
" .align 4\n" \
|
" .align 4\n" \
|
||||||
" .long 0b,2b,1b,2b\n" \
|
" .long 0b,4b,2b,4b,3b,4b\n" \
|
||||||
".previous"
|
".previous"
|
||||||
#else /* __s390x__ */
|
#else /* __s390x__ */
|
||||||
#define __futex_atomic_fixup \
|
#define __futex_atomic_fixup \
|
||||||
".section __ex_table,\"a\"\n" \
|
".section __ex_table,\"a\"\n" \
|
||||||
" .align 8\n" \
|
" .align 8\n" \
|
||||||
" .quad 0b,2b,1b,2b\n" \
|
" .quad 0b,4b,2b,4b,3b,4b\n" \
|
||||||
".previous"
|
".previous"
|
||||||
#endif /* __s390x__ */
|
#endif /* __s390x__ */
|
||||||
|
|
||||||
#define __futex_atomic_op(insn, ret, oldval, newval, uaddr, oparg) \
|
#define __futex_atomic_op(insn, ret, oldval, newval, uaddr, oparg) \
|
||||||
asm volatile(" l %1,0(%6)\n" \
|
asm volatile(" sacf 256\n" \
|
||||||
"0: " insn \
|
"0: l %1,0(%6)\n" \
|
||||||
" cs %1,%2,0(%6)\n" \
|
"1: " insn \
|
||||||
"1: jl 0b\n" \
|
"2: cs %1,%2,0(%6)\n" \
|
||||||
|
"3: jl 1b\n" \
|
||||||
" lhi %0,0\n" \
|
" lhi %0,0\n" \
|
||||||
"2:\n" \
|
"4: sacf 0\n" \
|
||||||
__futex_atomic_fixup \
|
__futex_atomic_fixup \
|
||||||
: "=d" (ret), "=&d" (oldval), "=&d" (newval), \
|
: "=d" (ret), "=&d" (oldval), "=&d" (newval), \
|
||||||
"=m" (*uaddr) \
|
"=m" (*uaddr) \
|
||||||
|
Reference in New Issue
Block a user