Commit bafe00cc authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Linus Torvalds

[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: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 71601e2b
...@@ -11,23 +11,24 @@ ...@@ -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) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment