.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * INET An implementation of the TCP/IP protocol suite for the LINUX |
---|
3 | 4 | * operating system. INET is implemented using the BSD Socket |
---|
.. | .. |
---|
21 | 22 | * data-registers to hold input values and one tries to |
---|
22 | 23 | * specify d0 and d1 as scratch registers. Letting gcc |
---|
23 | 24 | * choose these registers itself solves the problem. |
---|
24 | | - * |
---|
25 | | - * This program is free software; you can redistribute it and/or |
---|
26 | | - * modify it under the terms of the GNU General Public License |
---|
27 | | - * as published by the Free Software Foundation; either version |
---|
28 | | - * 2 of the License, or (at your option) any later version. |
---|
29 | 25 | * |
---|
30 | 26 | * 1998/8/31 Andreas Schwab: |
---|
31 | 27 | * Zero out rest of buffer on exception in |
---|
.. | .. |
---|
133 | 129 | */ |
---|
134 | 130 | |
---|
135 | 131 | __wsum |
---|
136 | | -csum_partial_copy_from_user(const void __user *src, void *dst, |
---|
137 | | - int len, __wsum sum, int *csum_err) |
---|
| 132 | +csum_and_copy_from_user(const void __user *src, void *dst, int len) |
---|
138 | 133 | { |
---|
139 | 134 | /* |
---|
140 | 135 | * GCC doesn't like more than 10 operands for the asm |
---|
.. | .. |
---|
142 | 137 | * code. |
---|
143 | 138 | */ |
---|
144 | 139 | unsigned long tmp1, tmp2; |
---|
| 140 | + __wsum sum = ~0U; |
---|
145 | 141 | |
---|
146 | 142 | __asm__("movel %2,%4\n\t" |
---|
147 | 143 | "btst #1,%4\n\t" /* Check alignment */ |
---|
.. | .. |
---|
240 | 236 | "clrl %5\n\t" |
---|
241 | 237 | "addxl %5,%0\n\t" /* add X bit */ |
---|
242 | 238 | "7:\t" |
---|
243 | | - "clrl %5\n" /* no error - clear return value */ |
---|
244 | | - "8:\n" |
---|
245 | 239 | ".section .fixup,\"ax\"\n" |
---|
246 | 240 | ".even\n" |
---|
247 | | - /* If any exception occurs zero out the rest. |
---|
248 | | - Similarities with the code above are intentional :-) */ |
---|
| 241 | + /* If any exception occurs, return 0 */ |
---|
249 | 242 | "90:\t" |
---|
250 | | - "clrw %3@+\n\t" |
---|
251 | | - "movel %1,%4\n\t" |
---|
252 | | - "lsrl #5,%1\n\t" |
---|
253 | | - "jeq 1f\n\t" |
---|
254 | | - "subql #1,%1\n" |
---|
255 | | - "91:\t" |
---|
256 | | - "clrl %3@+\n" |
---|
257 | | - "92:\t" |
---|
258 | | - "clrl %3@+\n" |
---|
259 | | - "93:\t" |
---|
260 | | - "clrl %3@+\n" |
---|
261 | | - "94:\t" |
---|
262 | | - "clrl %3@+\n" |
---|
263 | | - "95:\t" |
---|
264 | | - "clrl %3@+\n" |
---|
265 | | - "96:\t" |
---|
266 | | - "clrl %3@+\n" |
---|
267 | | - "97:\t" |
---|
268 | | - "clrl %3@+\n" |
---|
269 | | - "98:\t" |
---|
270 | | - "clrl %3@+\n\t" |
---|
271 | | - "dbra %1,91b\n\t" |
---|
272 | | - "clrw %1\n\t" |
---|
273 | | - "subql #1,%1\n\t" |
---|
274 | | - "jcc 91b\n" |
---|
275 | | - "1:\t" |
---|
276 | | - "movel %4,%1\n\t" |
---|
277 | | - "andw #0x1c,%4\n\t" |
---|
278 | | - "jeq 1f\n\t" |
---|
279 | | - "lsrw #2,%4\n\t" |
---|
280 | | - "subqw #1,%4\n" |
---|
281 | | - "99:\t" |
---|
282 | | - "clrl %3@+\n\t" |
---|
283 | | - "dbra %4,99b\n\t" |
---|
284 | | - "1:\t" |
---|
285 | | - "andw #3,%1\n\t" |
---|
286 | | - "jeq 9f\n" |
---|
287 | | - "100:\t" |
---|
288 | | - "clrw %3@+\n\t" |
---|
289 | | - "tstw %1\n\t" |
---|
290 | | - "jeq 9f\n" |
---|
291 | | - "101:\t" |
---|
292 | | - "clrb %3@+\n" |
---|
293 | | - "9:\t" |
---|
294 | | -#define STR(X) STR1(X) |
---|
295 | | -#define STR1(X) #X |
---|
296 | | - "moveq #-" STR(EFAULT) ",%5\n\t" |
---|
297 | | - "jra 8b\n" |
---|
| 243 | + "clrl %0\n" |
---|
| 244 | + "jra 7b\n" |
---|
298 | 245 | ".previous\n" |
---|
299 | 246 | ".section __ex_table,\"a\"\n" |
---|
300 | 247 | ".long 10b,90b\n" |
---|
301 | | - ".long 11b,91b\n" |
---|
302 | | - ".long 12b,92b\n" |
---|
303 | | - ".long 13b,93b\n" |
---|
304 | | - ".long 14b,94b\n" |
---|
305 | | - ".long 15b,95b\n" |
---|
306 | | - ".long 16b,96b\n" |
---|
307 | | - ".long 17b,97b\n" |
---|
308 | | - ".long 18b,98b\n" |
---|
309 | | - ".long 19b,99b\n" |
---|
310 | | - ".long 20b,100b\n" |
---|
311 | | - ".long 21b,101b\n" |
---|
| 248 | + ".long 11b,90b\n" |
---|
| 249 | + ".long 12b,90b\n" |
---|
| 250 | + ".long 13b,90b\n" |
---|
| 251 | + ".long 14b,90b\n" |
---|
| 252 | + ".long 15b,90b\n" |
---|
| 253 | + ".long 16b,90b\n" |
---|
| 254 | + ".long 17b,90b\n" |
---|
| 255 | + ".long 18b,90b\n" |
---|
| 256 | + ".long 19b,90b\n" |
---|
| 257 | + ".long 20b,90b\n" |
---|
| 258 | + ".long 21b,90b\n" |
---|
312 | 259 | ".previous" |
---|
313 | 260 | : "=d" (sum), "=d" (len), "=a" (src), "=a" (dst), |
---|
314 | 261 | "=&d" (tmp1), "=d" (tmp2) |
---|
315 | 262 | : "0" (sum), "1" (len), "2" (src), "3" (dst) |
---|
316 | 263 | ); |
---|
317 | 264 | |
---|
318 | | - *csum_err = tmp2; |
---|
319 | | - |
---|
320 | | - return(sum); |
---|
| 265 | + return sum; |
---|
321 | 266 | } |
---|
322 | 267 | |
---|
323 | | -EXPORT_SYMBOL(csum_partial_copy_from_user); |
---|
| 268 | +EXPORT_SYMBOL(csum_and_copy_from_user); |
---|
324 | 269 | |
---|
325 | 270 | |
---|
326 | 271 | /* |
---|
.. | .. |
---|
328 | 273 | */ |
---|
329 | 274 | |
---|
330 | 275 | __wsum |
---|
331 | | -csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) |
---|
| 276 | +csum_partial_copy_nocheck(const void *src, void *dst, int len) |
---|
332 | 277 | { |
---|
333 | 278 | unsigned long tmp1, tmp2; |
---|
| 279 | + __wsum sum = 0; |
---|
334 | 280 | __asm__("movel %2,%4\n\t" |
---|
335 | 281 | "btst #1,%4\n\t" /* Check alignment */ |
---|
336 | 282 | "jeq 2f\n\t" |
---|