.. | .. |
---|
144 | 144 | cpout: retl ! get outta here |
---|
145 | 145 | mov %o2, %o0 ! return computed csum |
---|
146 | 146 | |
---|
147 | | - .globl __csum_partial_copy_start, __csum_partial_copy_end |
---|
148 | | -__csum_partial_copy_start: |
---|
149 | | - |
---|
150 | 147 | /* Work around cpp -rob */ |
---|
151 | 148 | #define ALLOC #alloc |
---|
152 | 149 | #define EXECINSTR #execinstr |
---|
153 | | -#define EX(x,y,a,b) \ |
---|
154 | | -98: x,y; \ |
---|
155 | | - .section .fixup,ALLOC,EXECINSTR; \ |
---|
156 | | - .align 4; \ |
---|
157 | | -99: ba 30f; \ |
---|
158 | | - a, b, %o3; \ |
---|
159 | | - .section __ex_table,ALLOC; \ |
---|
160 | | - .align 4; \ |
---|
161 | | - .word 98b, 99b; \ |
---|
162 | | - .text; \ |
---|
163 | | - .align 4 |
---|
164 | | - |
---|
165 | | -#define EX2(x,y) \ |
---|
| 150 | +#define EX(x,y) \ |
---|
166 | 151 | 98: x,y; \ |
---|
167 | 152 | .section __ex_table,ALLOC; \ |
---|
168 | 153 | .align 4; \ |
---|
169 | | - .word 98b, 30f; \ |
---|
| 154 | + .word 98b, cc_fault; \ |
---|
170 | 155 | .text; \ |
---|
171 | 156 | .align 4 |
---|
172 | 157 | |
---|
173 | | -#define EX3(x,y) \ |
---|
174 | | -98: x,y; \ |
---|
| 158 | +#define EXT(start,end) \ |
---|
175 | 159 | .section __ex_table,ALLOC; \ |
---|
176 | 160 | .align 4; \ |
---|
177 | | - .word 98b, 96f; \ |
---|
178 | | - .text; \ |
---|
179 | | - .align 4 |
---|
180 | | - |
---|
181 | | -#define EXT(start,end,handler) \ |
---|
182 | | - .section __ex_table,ALLOC; \ |
---|
183 | | - .align 4; \ |
---|
184 | | - .word start, 0, end, handler; \ |
---|
| 161 | + .word start, 0, end, cc_fault; \ |
---|
185 | 162 | .text; \ |
---|
186 | 163 | .align 4 |
---|
187 | 164 | |
---|
.. | .. |
---|
252 | 229 | cc_end_cruft: |
---|
253 | 230 | be 1f |
---|
254 | 231 | andcc %o3, 4, %g0 |
---|
255 | | - EX(ldd [%o0 + 0x00], %g2, and %o3, 0xf) |
---|
| 232 | + EX(ldd [%o0 + 0x00], %g2) |
---|
256 | 233 | add %o1, 8, %o1 |
---|
257 | 234 | addcc %g2, %g7, %g7 |
---|
258 | 235 | add %o0, 8, %o0 |
---|
259 | 236 | addxcc %g3, %g7, %g7 |
---|
260 | | - EX2(st %g2, [%o1 - 0x08]) |
---|
| 237 | + EX(st %g2, [%o1 - 0x08]) |
---|
261 | 238 | addx %g0, %g7, %g7 |
---|
262 | 239 | andcc %o3, 4, %g0 |
---|
263 | | - EX2(st %g3, [%o1 - 0x04]) |
---|
| 240 | + EX(st %g3, [%o1 - 0x04]) |
---|
264 | 241 | 1: be 1f |
---|
265 | 242 | andcc %o3, 3, %o3 |
---|
266 | | - EX(ld [%o0 + 0x00], %g2, add %o3, 4) |
---|
| 243 | + EX(ld [%o0 + 0x00], %g2) |
---|
267 | 244 | add %o1, 4, %o1 |
---|
268 | 245 | addcc %g2, %g7, %g7 |
---|
269 | | - EX2(st %g2, [%o1 - 0x04]) |
---|
| 246 | + EX(st %g2, [%o1 - 0x04]) |
---|
270 | 247 | addx %g0, %g7, %g7 |
---|
271 | 248 | andcc %o3, 3, %g0 |
---|
272 | 249 | add %o0, 4, %o0 |
---|
.. | .. |
---|
276 | 253 | subcc %o3, 2, %o3 |
---|
277 | 254 | b 4f |
---|
278 | 255 | or %g0, %g0, %o4 |
---|
279 | | -2: EX(lduh [%o0 + 0x00], %o4, add %o3, 2) |
---|
| 256 | +2: EX(lduh [%o0 + 0x00], %o4) |
---|
280 | 257 | add %o0, 2, %o0 |
---|
281 | | - EX2(sth %o4, [%o1 + 0x00]) |
---|
| 258 | + EX(sth %o4, [%o1 + 0x00]) |
---|
282 | 259 | be 6f |
---|
283 | 260 | add %o1, 2, %o1 |
---|
284 | 261 | sll %o4, 16, %o4 |
---|
285 | | -4: EX(ldub [%o0 + 0x00], %o5, add %g0, 1) |
---|
286 | | - EX2(stb %o5, [%o1 + 0x00]) |
---|
| 262 | +4: EX(ldub [%o0 + 0x00], %o5) |
---|
| 263 | + EX(stb %o5, [%o1 + 0x00]) |
---|
287 | 264 | sll %o5, 8, %o5 |
---|
288 | 265 | or %o5, %o4, %o4 |
---|
289 | 266 | 6: addcc %o4, %g7, %g7 |
---|
.. | .. |
---|
306 | 283 | andcc %o0, 0x2, %g0 |
---|
307 | 284 | be 1f |
---|
308 | 285 | andcc %o0, 0x4, %g0 |
---|
309 | | - EX(lduh [%o0 + 0x00], %g4, add %g1, 0) |
---|
| 286 | + EX(lduh [%o0 + 0x00], %g4) |
---|
310 | 287 | sub %g1, 2, %g1 |
---|
311 | | - EX2(sth %g4, [%o1 + 0x00]) |
---|
| 288 | + EX(sth %g4, [%o1 + 0x00]) |
---|
312 | 289 | add %o0, 2, %o0 |
---|
313 | 290 | sll %g4, 16, %g4 |
---|
314 | 291 | addcc %g4, %g7, %g7 |
---|
.. | .. |
---|
322 | 299 | or %g3, %g7, %g7 |
---|
323 | 300 | 1: be 3f |
---|
324 | 301 | andcc %g1, 0xffffff80, %g0 |
---|
325 | | - EX(ld [%o0 + 0x00], %g4, add %g1, 0) |
---|
| 302 | + EX(ld [%o0 + 0x00], %g4) |
---|
326 | 303 | sub %g1, 4, %g1 |
---|
327 | | - EX2(st %g4, [%o1 + 0x00]) |
---|
| 304 | + EX(st %g4, [%o1 + 0x00]) |
---|
328 | 305 | add %o0, 4, %o0 |
---|
329 | 306 | addcc %g4, %g7, %g7 |
---|
330 | 307 | add %o1, 4, %o1 |
---|
.. | .. |
---|
354 | 331 | CSUMCOPY_BIGCHUNK(%o0,%o1,%g7,0x20,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) |
---|
355 | 332 | CSUMCOPY_BIGCHUNK(%o0,%o1,%g7,0x40,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) |
---|
356 | 333 | CSUMCOPY_BIGCHUNK(%o0,%o1,%g7,0x60,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) |
---|
357 | | -10: EXT(5b, 10b, 20f) ! note for exception handling |
---|
| 334 | +10: EXT(5b, 10b) ! note for exception handling |
---|
358 | 335 | sub %g1, 128, %g1 ! detract from length |
---|
359 | 336 | addx %g0, %g7, %g7 ! add in last carry bit |
---|
360 | 337 | andcc %g1, 0xffffff80, %g0 ! more to csum? |
---|
.. | .. |
---|
379 | 356 | CSUMCOPY_LASTCHUNK(%o0,%o1,%g7,0x28,%g2,%g3,%g4,%g5) |
---|
380 | 357 | CSUMCOPY_LASTCHUNK(%o0,%o1,%g7,0x18,%g2,%g3,%g4,%g5) |
---|
381 | 358 | CSUMCOPY_LASTCHUNK(%o0,%o1,%g7,0x08,%g2,%g3,%g4,%g5) |
---|
382 | | -12: EXT(cctbl, 12b, 22f) ! note for exception table handling |
---|
| 359 | +12: EXT(cctbl, 12b) ! note for exception table handling |
---|
383 | 360 | addx %g0, %g7, %g7 |
---|
384 | 361 | andcc %o3, 0xf, %g0 ! check for low bits set |
---|
385 | 362 | ccte: bne cc_end_cruft ! something left, handle it out of band |
---|
.. | .. |
---|
390 | 367 | CSUMCOPY_BIGCHUNK_ALIGNED(%o0,%o1,%g7,0x20,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) |
---|
391 | 368 | CSUMCOPY_BIGCHUNK_ALIGNED(%o0,%o1,%g7,0x40,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) |
---|
392 | 369 | CSUMCOPY_BIGCHUNK_ALIGNED(%o0,%o1,%g7,0x60,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) |
---|
393 | | -11: EXT(ccdbl, 11b, 21f) ! note for exception table handling |
---|
| 370 | +11: EXT(ccdbl, 11b) ! note for exception table handling |
---|
394 | 371 | sub %g1, 128, %g1 ! detract from length |
---|
395 | 372 | addx %g0, %g7, %g7 ! add in last carry bit |
---|
396 | 373 | andcc %g1, 0xffffff80, %g0 ! more to csum? |
---|
.. | .. |
---|
407 | 384 | be,a 1f |
---|
408 | 385 | srl %g1, 1, %g4 |
---|
409 | 386 | sub %g1, 1, %g1 |
---|
410 | | - EX(ldub [%o0], %g5, add %g1, 1) |
---|
| 387 | + EX(ldub [%o0], %g5) |
---|
411 | 388 | add %o0, 1, %o0 |
---|
412 | | - EX2(stb %g5, [%o1]) |
---|
| 389 | + EX(stb %g5, [%o1]) |
---|
413 | 390 | srl %g1, 1, %g4 |
---|
414 | 391 | add %o1, 1, %o1 |
---|
415 | 392 | 1: cmp %g4, 0 |
---|
.. | .. |
---|
418 | 395 | andcc %o0, 2, %g0 |
---|
419 | 396 | be,a 1f |
---|
420 | 397 | srl %g4, 1, %g4 |
---|
421 | | - EX(lduh [%o0], %o4, add %g1, 0) |
---|
| 398 | + EX(lduh [%o0], %o4) |
---|
422 | 399 | sub %g1, 2, %g1 |
---|
423 | 400 | srl %o4, 8, %g2 |
---|
424 | 401 | sub %g4, 1, %g4 |
---|
425 | | - EX2(stb %g2, [%o1]) |
---|
| 402 | + EX(stb %g2, [%o1]) |
---|
426 | 403 | add %o4, %g5, %g5 |
---|
427 | | - EX2(stb %o4, [%o1 + 1]) |
---|
| 404 | + EX(stb %o4, [%o1 + 1]) |
---|
428 | 405 | add %o0, 2, %o0 |
---|
429 | 406 | srl %g4, 1, %g4 |
---|
430 | 407 | add %o1, 2, %o1 |
---|
431 | 408 | 1: cmp %g4, 0 |
---|
432 | 409 | be,a 2f |
---|
433 | 410 | andcc %g1, 2, %g0 |
---|
434 | | - EX3(ld [%o0], %o4) |
---|
| 411 | + EX(ld [%o0], %o4) |
---|
435 | 412 | 5: srl %o4, 24, %g2 |
---|
436 | 413 | srl %o4, 16, %g3 |
---|
437 | | - EX2(stb %g2, [%o1]) |
---|
| 414 | + EX(stb %g2, [%o1]) |
---|
438 | 415 | srl %o4, 8, %g2 |
---|
439 | | - EX2(stb %g3, [%o1 + 1]) |
---|
| 416 | + EX(stb %g3, [%o1 + 1]) |
---|
440 | 417 | add %o0, 4, %o0 |
---|
441 | | - EX2(stb %g2, [%o1 + 2]) |
---|
| 418 | + EX(stb %g2, [%o1 + 2]) |
---|
442 | 419 | addcc %o4, %g5, %g5 |
---|
443 | | - EX2(stb %o4, [%o1 + 3]) |
---|
| 420 | + EX(stb %o4, [%o1 + 3]) |
---|
444 | 421 | addx %g5, %g0, %g5 ! I am now to lazy to optimize this (question it |
---|
445 | 422 | add %o1, 4, %o1 ! is worthy). Maybe some day - with the sll/srl |
---|
446 | 423 | subcc %g4, 1, %g4 ! tricks |
---|
447 | 424 | bne,a 5b |
---|
448 | | - EX3(ld [%o0], %o4) |
---|
| 425 | + EX(ld [%o0], %o4) |
---|
449 | 426 | sll %g5, 16, %g2 |
---|
450 | 427 | srl %g5, 16, %g5 |
---|
451 | 428 | srl %g2, 16, %g2 |
---|
.. | .. |
---|
453 | 430 | add %g2, %g5, %g5 |
---|
454 | 431 | 2: be,a 3f |
---|
455 | 432 | andcc %g1, 1, %g0 |
---|
456 | | - EX(lduh [%o0], %o4, and %g1, 3) |
---|
| 433 | + EX(lduh [%o0], %o4) |
---|
457 | 434 | andcc %g1, 1, %g0 |
---|
458 | 435 | srl %o4, 8, %g2 |
---|
459 | 436 | add %o0, 2, %o0 |
---|
460 | | - EX2(stb %g2, [%o1]) |
---|
| 437 | + EX(stb %g2, [%o1]) |
---|
461 | 438 | add %g5, %o4, %g5 |
---|
462 | | - EX2(stb %o4, [%o1 + 1]) |
---|
| 439 | + EX(stb %o4, [%o1 + 1]) |
---|
463 | 440 | add %o1, 2, %o1 |
---|
464 | 441 | 3: be,a 1f |
---|
465 | 442 | sll %g5, 16, %o4 |
---|
466 | | - EX(ldub [%o0], %g2, add %g0, 1) |
---|
| 443 | + EX(ldub [%o0], %g2) |
---|
467 | 444 | sll %g2, 8, %o4 |
---|
468 | | - EX2(stb %g2, [%o1]) |
---|
| 445 | + EX(stb %g2, [%o1]) |
---|
469 | 446 | add %g5, %o4, %g5 |
---|
470 | 447 | sll %g5, 16, %o4 |
---|
471 | 448 | 1: addcc %o4, %g5, %g5 |
---|
.. | .. |
---|
481 | 458 | 4: addcc %g7, %g5, %g7 |
---|
482 | 459 | retl |
---|
483 | 460 | addx %g0, %g7, %o0 |
---|
484 | | -__csum_partial_copy_end: |
---|
485 | 461 | |
---|
486 | 462 | /* We do these strange calculations for the csum_*_from_user case only, ie. |
---|
487 | 463 | * we only bother with faults on loads... */ |
---|
488 | 464 | |
---|
489 | | -/* o2 = ((g2%20)&3)*8 |
---|
490 | | - * o3 = g1 - (g2/20)*32 - o2 */ |
---|
491 | | -20: |
---|
492 | | - cmp %g2, 20 |
---|
493 | | - blu,a 1f |
---|
494 | | - and %g2, 3, %o2 |
---|
495 | | - sub %g1, 32, %g1 |
---|
496 | | - b 20b |
---|
497 | | - sub %g2, 20, %g2 |
---|
498 | | -1: |
---|
499 | | - sll %o2, 3, %o2 |
---|
500 | | - b 31f |
---|
501 | | - sub %g1, %o2, %o3 |
---|
502 | | - |
---|
503 | | -/* o2 = (!(g2 & 15) ? 0 : (((g2 & 15) + 1) & ~1)*8) |
---|
504 | | - * o3 = g1 - (g2/16)*32 - o2 */ |
---|
505 | | -21: |
---|
506 | | - andcc %g2, 15, %o3 |
---|
507 | | - srl %g2, 4, %g2 |
---|
508 | | - be,a 1f |
---|
509 | | - clr %o2 |
---|
510 | | - add %o3, 1, %o3 |
---|
511 | | - and %o3, 14, %o3 |
---|
512 | | - sll %o3, 3, %o2 |
---|
513 | | -1: |
---|
514 | | - sll %g2, 5, %g2 |
---|
515 | | - sub %g1, %g2, %o3 |
---|
516 | | - b 31f |
---|
517 | | - sub %o3, %o2, %o3 |
---|
518 | | - |
---|
519 | | -/* o0 += (g2/10)*16 - 0x70 |
---|
520 | | - * 01 += (g2/10)*16 - 0x70 |
---|
521 | | - * o2 = (g2 % 10) ? 8 : 0 |
---|
522 | | - * o3 += 0x70 - (g2/10)*16 - o2 */ |
---|
523 | | -22: |
---|
524 | | - cmp %g2, 10 |
---|
525 | | - blu,a 1f |
---|
526 | | - sub %o0, 0x70, %o0 |
---|
527 | | - add %o0, 16, %o0 |
---|
528 | | - add %o1, 16, %o1 |
---|
529 | | - sub %o3, 16, %o3 |
---|
530 | | - b 22b |
---|
531 | | - sub %g2, 10, %g2 |
---|
532 | | -1: |
---|
533 | | - sub %o1, 0x70, %o1 |
---|
534 | | - add %o3, 0x70, %o3 |
---|
535 | | - clr %o2 |
---|
536 | | - tst %g2 |
---|
537 | | - bne,a 1f |
---|
538 | | - mov 8, %o2 |
---|
539 | | -1: |
---|
540 | | - b 31f |
---|
541 | | - sub %o3, %o2, %o3 |
---|
542 | | -96: |
---|
543 | | - and %g1, 3, %g1 |
---|
544 | | - sll %g4, 2, %g4 |
---|
545 | | - add %g1, %g4, %o3 |
---|
546 | | -30: |
---|
547 | | -/* %o1 is dst |
---|
548 | | - * %o3 is # bytes to zero out |
---|
549 | | - * %o4 is faulting address |
---|
550 | | - * %o5 is %pc where fault occurred */ |
---|
551 | | - clr %o2 |
---|
552 | | -31: |
---|
553 | | -/* %o0 is src |
---|
554 | | - * %o1 is dst |
---|
555 | | - * %o2 is # of bytes to copy from src to dst |
---|
556 | | - * %o3 is # bytes to zero out |
---|
557 | | - * %o4 is faulting address |
---|
558 | | - * %o5 is %pc where fault occurred */ |
---|
559 | | - save %sp, -104, %sp |
---|
560 | | - mov %i5, %o0 |
---|
561 | | - mov %i7, %o1 |
---|
562 | | - mov %i4, %o2 |
---|
563 | | - call lookup_fault |
---|
564 | | - mov %g7, %i4 |
---|
565 | | - cmp %o0, 2 |
---|
566 | | - bne 1f |
---|
567 | | - add %g0, -EFAULT, %i5 |
---|
568 | | - tst %i2 |
---|
569 | | - be 2f |
---|
570 | | - mov %i0, %o1 |
---|
571 | | - mov %i1, %o0 |
---|
572 | | -5: |
---|
573 | | - call memcpy |
---|
574 | | - mov %i2, %o2 |
---|
575 | | - tst %o0 |
---|
576 | | - bne,a 2f |
---|
577 | | - add %i3, %i2, %i3 |
---|
578 | | - add %i1, %i2, %i1 |
---|
579 | | -2: |
---|
580 | | - mov %i1, %o0 |
---|
581 | | -6: |
---|
582 | | - call __bzero |
---|
583 | | - mov %i3, %o1 |
---|
584 | | -1: |
---|
585 | | - ld [%sp + 168], %o2 ! struct_ptr of parent |
---|
586 | | - st %i5, [%o2] |
---|
| 465 | +cc_fault: |
---|
587 | 466 | ret |
---|
588 | | - restore |
---|
589 | | - |
---|
590 | | - .section __ex_table,#alloc |
---|
591 | | - .align 4 |
---|
592 | | - .word 5b,2 |
---|
593 | | - .word 6b,2 |
---|
| 467 | + clr %o0 |
---|