| .. | .. |
|---|
| 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 |
|---|