[PATCH] s390: fix in-user atomic futex operation.
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 8 Jun 2006 08:36:20 +0000 (01:36 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 8 Jun 2006 22:15:30 +0000 (15:15 -0700)
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>
include/asm-s390/futex.h

index 40c25e1..1802775 100644 (file)
 #define __futex_atomic_fixup \
                     ".section __ex_table,\"a\"\n"                      \
                     "   .align 4\n"                                    \
-                    "   .long  0b,2b,1b,2b\n"                          \
+                    "   .long  0b,4b,2b,4b,3b,4b\n"                    \
                     ".previous"
 #else /* __s390x__ */
 #define __futex_atomic_fixup \
                     ".section __ex_table,\"a\"\n"                      \
                     "   .align 8\n"                                    \
-                    "   .quad  0b,2b,1b,2b\n"                          \
+                    "   .quad  0b,4b,2b,4b,3b,4b\n"                    \
                     ".previous"
 #endif /* __s390x__ */
 
 #define __futex_atomic_op(insn, ret, oldval, newval, uaddr, oparg)     \
-       asm volatile("   l   %1,0(%6)\n"                                \
-                    "0: " insn                                         \
-                    "   cs  %1,%2,0(%6)\n"                             \
-                    "1: jl  0b\n"                                      \
+       asm volatile("   sacf 256\n"                                    \
+                    "0: l   %1,0(%6)\n"                                \
+                    "1: " insn                                         \
+                    "2: cs  %1,%2,0(%6)\n"                             \
+                    "3: jl  1b\n"                                      \
                     "   lhi %0,0\n"                                    \
-                    "2:\n"                                             \
+                    "4: sacf 0\n"                                      \
                     __futex_atomic_fixup                               \
                     : "=d" (ret), "=&d" (oldval), "=&d" (newval),      \
                       "=m" (*uaddr)                                    \