.. | .. |
---|
16 | 16 | #include <asm/barrier.h> |
---|
17 | 17 | #include <asm/compiler.h> |
---|
18 | 18 | #include <asm/errno.h> |
---|
| 19 | +#include <asm/sync.h> |
---|
19 | 20 | #include <asm/war.h> |
---|
20 | 21 | |
---|
21 | 22 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ |
---|
22 | 23 | { \ |
---|
23 | | - if (cpu_has_llsc && R10000_LLSC_WAR) { \ |
---|
| 24 | + if (cpu_has_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) { \ |
---|
24 | 25 | __asm__ __volatile__( \ |
---|
25 | 26 | " .set push \n" \ |
---|
26 | 27 | " .set noat \n" \ |
---|
| 28 | + " .set push \n" \ |
---|
27 | 29 | " .set arch=r4000 \n" \ |
---|
28 | 30 | "1: ll %1, %4 # __futex_atomic_op \n" \ |
---|
29 | | - " .set mips0 \n" \ |
---|
| 31 | + " .set pop \n" \ |
---|
30 | 32 | " " insn " \n" \ |
---|
31 | 33 | " .set arch=r4000 \n" \ |
---|
32 | 34 | "2: sc $1, %2 \n" \ |
---|
33 | 35 | " beqzl $1, 1b \n" \ |
---|
34 | | - __WEAK_LLSC_MB \ |
---|
| 36 | + __stringify(__WEAK_LLSC_MB) " \n" \ |
---|
35 | 37 | "3: \n" \ |
---|
36 | 38 | " .insn \n" \ |
---|
37 | 39 | " .set pop \n" \ |
---|
38 | | - " .set mips0 \n" \ |
---|
39 | 40 | " .section .fixup,\"ax\" \n" \ |
---|
40 | 41 | "4: li %0, %6 \n" \ |
---|
41 | 42 | " j 3b \n" \ |
---|
.. | .. |
---|
53 | 54 | __asm__ __volatile__( \ |
---|
54 | 55 | " .set push \n" \ |
---|
55 | 56 | " .set noat \n" \ |
---|
| 57 | + " .set push \n" \ |
---|
56 | 58 | " .set "MIPS_ISA_ARCH_LEVEL" \n" \ |
---|
| 59 | + " " __SYNC(full, loongson3_war) " \n" \ |
---|
57 | 60 | "1: "user_ll("%1", "%4")" # __futex_atomic_op\n" \ |
---|
58 | | - " .set mips0 \n" \ |
---|
| 61 | + " .set pop \n" \ |
---|
59 | 62 | " " insn " \n" \ |
---|
60 | 63 | " .set "MIPS_ISA_ARCH_LEVEL" \n" \ |
---|
61 | 64 | "2: "user_sc("$1", "%2")" \n" \ |
---|
62 | 65 | " beqz $1, 1b \n" \ |
---|
63 | | - __WEAK_LLSC_MB \ |
---|
| 66 | + __stringify(__WEAK_LLSC_MB) " \n" \ |
---|
64 | 67 | "3: \n" \ |
---|
65 | 68 | " .insn \n" \ |
---|
66 | 69 | " .set pop \n" \ |
---|
67 | | - " .set mips0 \n" \ |
---|
68 | 70 | " .section .fixup,\"ax\" \n" \ |
---|
69 | 71 | "4: li %0, %6 \n" \ |
---|
70 | 72 | " j 3b \n" \ |
---|
.. | .. |
---|
87 | 89 | { |
---|
88 | 90 | int oldval = 0, ret; |
---|
89 | 91 | |
---|
90 | | - pagefault_disable(); |
---|
| 92 | + if (!access_ok(uaddr, sizeof(u32))) |
---|
| 93 | + return -EFAULT; |
---|
91 | 94 | |
---|
92 | 95 | switch (op) { |
---|
93 | 96 | case FUTEX_OP_SET: |
---|
.. | .. |
---|
114 | 117 | ret = -ENOSYS; |
---|
115 | 118 | } |
---|
116 | 119 | |
---|
117 | | - pagefault_enable(); |
---|
118 | | - |
---|
119 | 120 | if (!ret) |
---|
120 | 121 | *oval = oldval; |
---|
121 | 122 | |
---|
.. | .. |
---|
129 | 130 | int ret = 0; |
---|
130 | 131 | u32 val; |
---|
131 | 132 | |
---|
132 | | - if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) |
---|
| 133 | + if (!access_ok(uaddr, sizeof(u32))) |
---|
133 | 134 | return -EFAULT; |
---|
134 | 135 | |
---|
135 | | - if (cpu_has_llsc && R10000_LLSC_WAR) { |
---|
| 136 | + if (cpu_has_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) { |
---|
136 | 137 | __asm__ __volatile__( |
---|
137 | 138 | "# futex_atomic_cmpxchg_inatomic \n" |
---|
138 | 139 | " .set push \n" |
---|
139 | 140 | " .set noat \n" |
---|
| 141 | + " .set push \n" |
---|
140 | 142 | " .set arch=r4000 \n" |
---|
141 | 143 | "1: ll %1, %3 \n" |
---|
142 | 144 | " bne %1, %z4, 3f \n" |
---|
143 | | - " .set mips0 \n" |
---|
| 145 | + " .set pop \n" |
---|
144 | 146 | " move $1, %z5 \n" |
---|
145 | 147 | " .set arch=r4000 \n" |
---|
146 | 148 | "2: sc $1, %2 \n" |
---|
147 | 149 | " beqzl $1, 1b \n" |
---|
148 | | - __WEAK_LLSC_MB |
---|
| 150 | + __stringify(__WEAK_LLSC_MB) " \n" |
---|
149 | 151 | "3: \n" |
---|
150 | 152 | " .insn \n" |
---|
151 | 153 | " .set pop \n" |
---|
.. | .. |
---|
166 | 168 | "# futex_atomic_cmpxchg_inatomic \n" |
---|
167 | 169 | " .set push \n" |
---|
168 | 170 | " .set noat \n" |
---|
| 171 | + " .set push \n" |
---|
169 | 172 | " .set "MIPS_ISA_ARCH_LEVEL" \n" |
---|
| 173 | + " " __SYNC(full, loongson3_war) " \n" |
---|
170 | 174 | "1: "user_ll("%1", "%3")" \n" |
---|
171 | 175 | " bne %1, %z4, 3f \n" |
---|
172 | | - " .set mips0 \n" |
---|
| 176 | + " .set pop \n" |
---|
173 | 177 | " move $1, %z5 \n" |
---|
174 | 178 | " .set "MIPS_ISA_ARCH_LEVEL" \n" |
---|
175 | 179 | "2: "user_sc("$1", "%2")" \n" |
---|
176 | 180 | " beqz $1, 1b \n" |
---|
177 | | - __WEAK_LLSC_MB |
---|
178 | | - "3: \n" |
---|
| 181 | + "3: " __SYNC_ELSE(full, loongson3_war, __WEAK_LLSC_MB) "\n" |
---|
179 | 182 | " .insn \n" |
---|
180 | 183 | " .set pop \n" |
---|
181 | 184 | " .section .fixup,\"ax\" \n" |
---|