aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'arch/xtensa/include/asm/futex.h')
-rw-r--r--arch/xtensa/include/asm/futex.h23
1 files changed, 10 insertions, 13 deletions
diff --git a/arch/xtensa/include/asm/futex.h b/arch/xtensa/include/asm/futex.h
index b39531babec0..72bfc1cbc2b5 100644
--- a/arch/xtensa/include/asm/futex.h
+++ b/arch/xtensa/include/asm/futex.h
@@ -109,7 +109,6 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
109 u32 oldval, u32 newval) 109 u32 oldval, u32 newval)
110{ 110{
111 int ret = 0; 111 int ret = 0;
112 u32 prev;
113 112
114 if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) 113 if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
115 return -EFAULT; 114 return -EFAULT;
@@ -120,26 +119,24 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
120 119
121 __asm__ __volatile__ ( 120 __asm__ __volatile__ (
122 " # futex_atomic_cmpxchg_inatomic\n" 121 " # futex_atomic_cmpxchg_inatomic\n"
123 "1: l32i %1, %3, 0\n" 122 " wsr %5, scompare1\n"
124 " mov %0, %5\n" 123 "1: s32c1i %1, %4, 0\n"
125 " wsr %1, scompare1\n" 124 " s32i %1, %6, 0\n"
126 "2: s32c1i %0, %3, 0\n" 125 "2:\n"
127 "3:\n"
128 " .section .fixup,\"ax\"\n" 126 " .section .fixup,\"ax\"\n"
129 " .align 4\n" 127 " .align 4\n"
130 "4: .long 3b\n" 128 "3: .long 2b\n"
131 "5: l32r %1, 4b\n" 129 "4: l32r %1, 3b\n"
132 " movi %0, %6\n" 130 " movi %0, %7\n"
133 " jx %1\n" 131 " jx %1\n"
134 " .previous\n" 132 " .previous\n"
135 " .section __ex_table,\"a\"\n" 133 " .section __ex_table,\"a\"\n"
136 " .long 1b,5b,2b,5b\n" 134 " .long 1b,4b\n"
137 " .previous\n" 135 " .previous\n"
138 : "+r" (ret), "=&r" (prev), "+m" (*uaddr) 136 : "+r" (ret), "+r" (newval), "+m" (*uaddr), "+m" (*uval)
139 : "r" (uaddr), "r" (oldval), "r" (newval), "I" (-EFAULT) 137 : "r" (uaddr), "r" (oldval), "r" (uval), "I" (-EFAULT)
140 : "memory"); 138 : "memory");
141 139
142 *uval = prev;
143 return ret; 140 return ret;
144} 141}
145 142