.. | .. |
---|
| 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 |
---|
.. | .. |
---|
18 | 19 | * handling. |
---|
19 | 20 | * Andi Kleen, add zeroing on error |
---|
20 | 21 | * converted to pure assembler |
---|
21 | | - * |
---|
22 | | - * This program is free software; you can redistribute it and/or |
---|
23 | | - * modify it under the terms of the GNU General Public License |
---|
24 | | - * as published by the Free Software Foundation; either version |
---|
25 | | - * 2 of the License, or (at your option) any later version. |
---|
26 | 22 | */ |
---|
27 | 23 | |
---|
28 | 24 | #include <linux/linkage.h> |
---|
.. | .. |
---|
50 | 46 | * Fortunately, it is easy to convert 2-byte alignment to 4-byte |
---|
51 | 47 | * alignment for the unrolled loop. |
---|
52 | 48 | */ |
---|
53 | | -ENTRY(csum_partial) |
---|
| 49 | +SYM_FUNC_START(csum_partial) |
---|
54 | 50 | pushl %esi |
---|
55 | 51 | pushl %ebx |
---|
56 | 52 | movl 20(%esp),%eax # Function arg: unsigned int sum |
---|
.. | .. |
---|
131 | 127 | 8: |
---|
132 | 128 | popl %ebx |
---|
133 | 129 | popl %esi |
---|
134 | | - ret |
---|
135 | | -ENDPROC(csum_partial) |
---|
| 130 | + RET |
---|
| 131 | +SYM_FUNC_END(csum_partial) |
---|
136 | 132 | |
---|
137 | 133 | #else |
---|
138 | 134 | |
---|
139 | 135 | /* Version for PentiumII/PPro */ |
---|
140 | 136 | |
---|
141 | | -ENTRY(csum_partial) |
---|
| 137 | +SYM_FUNC_START(csum_partial) |
---|
142 | 138 | pushl %esi |
---|
143 | 139 | pushl %ebx |
---|
144 | 140 | movl 20(%esp),%eax # Function arg: unsigned int sum |
---|
.. | .. |
---|
157 | 153 | negl %ebx |
---|
158 | 154 | lea 45f(%ebx,%ebx,2), %ebx |
---|
159 | 155 | testl %esi, %esi |
---|
160 | | - JMP_NOSPEC %ebx |
---|
| 156 | + JMP_NOSPEC ebx |
---|
161 | 157 | |
---|
162 | 158 | # Handle 2-byte-aligned regions |
---|
163 | 159 | 20: addw (%esi), %ax |
---|
.. | .. |
---|
249 | 245 | 90: |
---|
250 | 246 | popl %ebx |
---|
251 | 247 | popl %esi |
---|
252 | | - ret |
---|
253 | | -ENDPROC(csum_partial) |
---|
| 248 | + RET |
---|
| 249 | +SYM_FUNC_END(csum_partial) |
---|
254 | 250 | |
---|
255 | 251 | #endif |
---|
256 | 252 | EXPORT_SYMBOL(csum_partial) |
---|
257 | 253 | |
---|
258 | 254 | /* |
---|
259 | 255 | unsigned int csum_partial_copy_generic (const char *src, char *dst, |
---|
260 | | - int len, int sum, int *src_err_ptr, int *dst_err_ptr) |
---|
| 256 | + int len) |
---|
261 | 257 | */ |
---|
262 | 258 | |
---|
263 | 259 | /* |
---|
264 | 260 | * Copy from ds while checksumming, otherwise like csum_partial |
---|
265 | | - * |
---|
266 | | - * The macros SRC and DST specify the type of access for the instruction. |
---|
267 | | - * thus we can call a custom exception handler for all access types. |
---|
268 | | - * |
---|
269 | | - * FIXME: could someone double-check whether I haven't mixed up some SRC and |
---|
270 | | - * DST definitions? It's damn hard to trigger all cases. I hope I got |
---|
271 | | - * them all but there's no guarantee. |
---|
272 | 261 | */ |
---|
273 | 262 | |
---|
274 | | -#define SRC(y...) \ |
---|
| 263 | +#define EXC(y...) \ |
---|
275 | 264 | 9999: y; \ |
---|
276 | | - _ASM_EXTABLE(9999b, 6001f) |
---|
277 | | - |
---|
278 | | -#define DST(y...) \ |
---|
279 | | - 9999: y; \ |
---|
280 | | - _ASM_EXTABLE(9999b, 6002f) |
---|
| 265 | + _ASM_EXTABLE_UA(9999b, 6001f) |
---|
281 | 266 | |
---|
282 | 267 | #ifndef CONFIG_X86_USE_PPRO_CHECKSUM |
---|
283 | 268 | |
---|
284 | 269 | #define ARGBASE 16 |
---|
285 | 270 | #define FP 12 |
---|
286 | 271 | |
---|
287 | | -ENTRY(csum_partial_copy_generic) |
---|
| 272 | +SYM_FUNC_START(csum_partial_copy_generic) |
---|
288 | 273 | subl $4,%esp |
---|
289 | 274 | pushl %edi |
---|
290 | 275 | pushl %esi |
---|
291 | 276 | pushl %ebx |
---|
292 | | - movl ARGBASE+16(%esp),%eax # sum |
---|
293 | 277 | movl ARGBASE+12(%esp),%ecx # len |
---|
294 | 278 | movl ARGBASE+4(%esp),%esi # src |
---|
295 | 279 | movl ARGBASE+8(%esp),%edi # dst |
---|
296 | 280 | |
---|
| 281 | + movl $-1, %eax # sum |
---|
297 | 282 | testl $2, %edi # Check alignment. |
---|
298 | 283 | jz 2f # Jump if alignment is ok. |
---|
299 | 284 | subl $2, %ecx # Alignment uses up two bytes. |
---|
300 | 285 | jae 1f # Jump if we had at least two bytes. |
---|
301 | 286 | addl $2, %ecx # ecx was < 2. Deal with it. |
---|
302 | 287 | jmp 4f |
---|
303 | | -SRC(1: movw (%esi), %bx ) |
---|
| 288 | +EXC(1: movw (%esi), %bx ) |
---|
304 | 289 | addl $2, %esi |
---|
305 | | -DST( movw %bx, (%edi) ) |
---|
| 290 | +EXC( movw %bx, (%edi) ) |
---|
306 | 291 | addl $2, %edi |
---|
307 | 292 | addw %bx, %ax |
---|
308 | 293 | adcl $0, %eax |
---|
.. | .. |
---|
310 | 295 | movl %ecx, FP(%esp) |
---|
311 | 296 | shrl $5, %ecx |
---|
312 | 297 | jz 2f |
---|
313 | | - testl %esi, %esi |
---|
314 | | -SRC(1: movl (%esi), %ebx ) |
---|
315 | | -SRC( movl 4(%esi), %edx ) |
---|
| 298 | + testl %esi, %esi # what's wrong with clc? |
---|
| 299 | +EXC(1: movl (%esi), %ebx ) |
---|
| 300 | +EXC( movl 4(%esi), %edx ) |
---|
316 | 301 | adcl %ebx, %eax |
---|
317 | | -DST( movl %ebx, (%edi) ) |
---|
| 302 | +EXC( movl %ebx, (%edi) ) |
---|
318 | 303 | adcl %edx, %eax |
---|
319 | | -DST( movl %edx, 4(%edi) ) |
---|
| 304 | +EXC( movl %edx, 4(%edi) ) |
---|
320 | 305 | |
---|
321 | | -SRC( movl 8(%esi), %ebx ) |
---|
322 | | -SRC( movl 12(%esi), %edx ) |
---|
| 306 | +EXC( movl 8(%esi), %ebx ) |
---|
| 307 | +EXC( movl 12(%esi), %edx ) |
---|
323 | 308 | adcl %ebx, %eax |
---|
324 | | -DST( movl %ebx, 8(%edi) ) |
---|
| 309 | +EXC( movl %ebx, 8(%edi) ) |
---|
325 | 310 | adcl %edx, %eax |
---|
326 | | -DST( movl %edx, 12(%edi) ) |
---|
| 311 | +EXC( movl %edx, 12(%edi) ) |
---|
327 | 312 | |
---|
328 | | -SRC( movl 16(%esi), %ebx ) |
---|
329 | | -SRC( movl 20(%esi), %edx ) |
---|
| 313 | +EXC( movl 16(%esi), %ebx ) |
---|
| 314 | +EXC( movl 20(%esi), %edx ) |
---|
330 | 315 | adcl %ebx, %eax |
---|
331 | | -DST( movl %ebx, 16(%edi) ) |
---|
| 316 | +EXC( movl %ebx, 16(%edi) ) |
---|
332 | 317 | adcl %edx, %eax |
---|
333 | | -DST( movl %edx, 20(%edi) ) |
---|
| 318 | +EXC( movl %edx, 20(%edi) ) |
---|
334 | 319 | |
---|
335 | | -SRC( movl 24(%esi), %ebx ) |
---|
336 | | -SRC( movl 28(%esi), %edx ) |
---|
| 320 | +EXC( movl 24(%esi), %ebx ) |
---|
| 321 | +EXC( movl 28(%esi), %edx ) |
---|
337 | 322 | adcl %ebx, %eax |
---|
338 | | -DST( movl %ebx, 24(%edi) ) |
---|
| 323 | +EXC( movl %ebx, 24(%edi) ) |
---|
339 | 324 | adcl %edx, %eax |
---|
340 | | -DST( movl %edx, 28(%edi) ) |
---|
| 325 | +EXC( movl %edx, 28(%edi) ) |
---|
341 | 326 | |
---|
342 | 327 | lea 32(%esi), %esi |
---|
343 | 328 | lea 32(%edi), %edi |
---|
.. | .. |
---|
349 | 334 | andl $0x1c, %edx |
---|
350 | 335 | je 4f |
---|
351 | 336 | shrl $2, %edx # This clears CF |
---|
352 | | -SRC(3: movl (%esi), %ebx ) |
---|
| 337 | +EXC(3: movl (%esi), %ebx ) |
---|
353 | 338 | adcl %ebx, %eax |
---|
354 | | -DST( movl %ebx, (%edi) ) |
---|
| 339 | +EXC( movl %ebx, (%edi) ) |
---|
355 | 340 | lea 4(%esi), %esi |
---|
356 | 341 | lea 4(%edi), %edi |
---|
357 | 342 | dec %edx |
---|
.. | .. |
---|
361 | 346 | jz 7f |
---|
362 | 347 | cmpl $2, %ecx |
---|
363 | 348 | jb 5f |
---|
364 | | -SRC( movw (%esi), %cx ) |
---|
| 349 | +EXC( movw (%esi), %cx ) |
---|
365 | 350 | leal 2(%esi), %esi |
---|
366 | | -DST( movw %cx, (%edi) ) |
---|
| 351 | +EXC( movw %cx, (%edi) ) |
---|
367 | 352 | leal 2(%edi), %edi |
---|
368 | 353 | je 6f |
---|
369 | 354 | shll $16,%ecx |
---|
370 | | -SRC(5: movb (%esi), %cl ) |
---|
371 | | -DST( movb %cl, (%edi) ) |
---|
| 355 | +EXC(5: movb (%esi), %cl ) |
---|
| 356 | +EXC( movb %cl, (%edi) ) |
---|
372 | 357 | 6: addl %ecx, %eax |
---|
373 | 358 | adcl $0, %eax |
---|
374 | 359 | 7: |
---|
375 | | -5000: |
---|
376 | 360 | |
---|
377 | 361 | # Exception handler: |
---|
378 | 362 | .section .fixup, "ax" |
---|
379 | 363 | |
---|
380 | 364 | 6001: |
---|
381 | | - movl ARGBASE+20(%esp), %ebx # src_err_ptr |
---|
382 | | - movl $-EFAULT, (%ebx) |
---|
383 | | - |
---|
384 | | - # zero the complete destination - computing the rest |
---|
385 | | - # is too much work |
---|
386 | | - movl ARGBASE+8(%esp), %edi # dst |
---|
387 | | - movl ARGBASE+12(%esp), %ecx # len |
---|
388 | | - xorl %eax,%eax |
---|
389 | | - rep ; stosb |
---|
390 | | - |
---|
391 | | - jmp 5000b |
---|
392 | | - |
---|
393 | | -6002: |
---|
394 | | - movl ARGBASE+24(%esp), %ebx # dst_err_ptr |
---|
395 | | - movl $-EFAULT,(%ebx) |
---|
396 | | - jmp 5000b |
---|
| 365 | + xorl %eax, %eax |
---|
| 366 | + jmp 7b |
---|
397 | 367 | |
---|
398 | 368 | .previous |
---|
399 | 369 | |
---|
.. | .. |
---|
401 | 371 | popl %esi |
---|
402 | 372 | popl %edi |
---|
403 | 373 | popl %ecx # equivalent to addl $4,%esp |
---|
404 | | - ret |
---|
405 | | -ENDPROC(csum_partial_copy_generic) |
---|
| 374 | + RET |
---|
| 375 | +SYM_FUNC_END(csum_partial_copy_generic) |
---|
406 | 376 | |
---|
407 | 377 | #else |
---|
408 | 378 | |
---|
409 | 379 | /* Version for PentiumII/PPro */ |
---|
410 | 380 | |
---|
411 | 381 | #define ROUND1(x) \ |
---|
412 | | - SRC(movl x(%esi), %ebx ) ; \ |
---|
| 382 | + EXC(movl x(%esi), %ebx ) ; \ |
---|
413 | 383 | addl %ebx, %eax ; \ |
---|
414 | | - DST(movl %ebx, x(%edi) ) ; |
---|
| 384 | + EXC(movl %ebx, x(%edi) ) ; |
---|
415 | 385 | |
---|
416 | 386 | #define ROUND(x) \ |
---|
417 | | - SRC(movl x(%esi), %ebx ) ; \ |
---|
| 387 | + EXC(movl x(%esi), %ebx ) ; \ |
---|
418 | 388 | adcl %ebx, %eax ; \ |
---|
419 | | - DST(movl %ebx, x(%edi) ) ; |
---|
| 389 | + EXC(movl %ebx, x(%edi) ) ; |
---|
420 | 390 | |
---|
421 | 391 | #define ARGBASE 12 |
---|
422 | 392 | |
---|
423 | | -ENTRY(csum_partial_copy_generic) |
---|
| 393 | +SYM_FUNC_START(csum_partial_copy_generic) |
---|
424 | 394 | pushl %ebx |
---|
425 | 395 | pushl %edi |
---|
426 | 396 | pushl %esi |
---|
427 | 397 | movl ARGBASE+4(%esp),%esi #src |
---|
428 | 398 | movl ARGBASE+8(%esp),%edi #dst |
---|
429 | 399 | movl ARGBASE+12(%esp),%ecx #len |
---|
430 | | - movl ARGBASE+16(%esp),%eax #sum |
---|
| 400 | + movl $-1, %eax #sum |
---|
431 | 401 | # movl %ecx, %edx |
---|
432 | 402 | movl %ecx, %ebx |
---|
433 | 403 | movl %esi, %edx |
---|
.. | .. |
---|
440 | 410 | andl $-32,%edx |
---|
441 | 411 | lea 3f(%ebx,%ebx), %ebx |
---|
442 | 412 | testl %esi, %esi |
---|
443 | | - JMP_NOSPEC %ebx |
---|
| 413 | + JMP_NOSPEC ebx |
---|
444 | 414 | 1: addl $64,%esi |
---|
445 | 415 | addl $64,%edi |
---|
446 | | - SRC(movb -32(%edx),%bl) ; SRC(movb (%edx),%bl) |
---|
| 416 | + EXC(movb -32(%edx),%bl) ; EXC(movb (%edx),%bl) |
---|
447 | 417 | ROUND1(-64) ROUND(-60) ROUND(-56) ROUND(-52) |
---|
448 | 418 | ROUND (-48) ROUND(-44) ROUND(-40) ROUND(-36) |
---|
449 | 419 | ROUND (-32) ROUND(-28) ROUND(-24) ROUND(-20) |
---|
.. | .. |
---|
457 | 427 | jz 7f |
---|
458 | 428 | cmpl $2, %edx |
---|
459 | 429 | jb 5f |
---|
460 | | -SRC( movw (%esi), %dx ) |
---|
| 430 | +EXC( movw (%esi), %dx ) |
---|
461 | 431 | leal 2(%esi), %esi |
---|
462 | | -DST( movw %dx, (%edi) ) |
---|
| 432 | +EXC( movw %dx, (%edi) ) |
---|
463 | 433 | leal 2(%edi), %edi |
---|
464 | 434 | je 6f |
---|
465 | 435 | shll $16,%edx |
---|
466 | 436 | 5: |
---|
467 | | -SRC( movb (%esi), %dl ) |
---|
468 | | -DST( movb %dl, (%edi) ) |
---|
| 437 | +EXC( movb (%esi), %dl ) |
---|
| 438 | +EXC( movb %dl, (%edi) ) |
---|
469 | 439 | 6: addl %edx, %eax |
---|
470 | 440 | adcl $0, %eax |
---|
471 | 441 | 7: |
---|
472 | 442 | .section .fixup, "ax" |
---|
473 | | -6001: movl ARGBASE+20(%esp), %ebx # src_err_ptr |
---|
474 | | - movl $-EFAULT, (%ebx) |
---|
475 | | - # zero the complete destination (computing the rest is too much work) |
---|
476 | | - movl ARGBASE+8(%esp),%edi # dst |
---|
477 | | - movl ARGBASE+12(%esp),%ecx # len |
---|
478 | | - xorl %eax,%eax |
---|
479 | | - rep; stosb |
---|
480 | | - jmp 7b |
---|
481 | | -6002: movl ARGBASE+24(%esp), %ebx # dst_err_ptr |
---|
482 | | - movl $-EFAULT, (%ebx) |
---|
| 443 | +6001: xorl %eax, %eax |
---|
483 | 444 | jmp 7b |
---|
484 | 445 | .previous |
---|
485 | 446 | |
---|
486 | 447 | popl %esi |
---|
487 | 448 | popl %edi |
---|
488 | 449 | popl %ebx |
---|
489 | | - ret |
---|
490 | | -ENDPROC(csum_partial_copy_generic) |
---|
| 450 | + RET |
---|
| 451 | +SYM_FUNC_END(csum_partial_copy_generic) |
---|
491 | 452 | |
---|
492 | 453 | #undef ROUND |
---|
493 | 454 | #undef ROUND1 |
---|