diff options
Diffstat (limited to 'arch/alpha/kernel/entry.S')
| -rw-r--r-- | arch/alpha/kernel/entry.S | 100 |
1 files changed, 34 insertions, 66 deletions
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index 7e43e1156d10..a7607832dd4f 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S | |||
| @@ -311,7 +311,7 @@ entSys: | |||
| 311 | 311 | ||
| 312 | .align 4 | 312 | .align 4 |
| 313 | ret_from_sys_call: | 313 | ret_from_sys_call: |
| 314 | cmovne $26, 0, $19 /* $19 = 0 => non-restartable */ | 314 | cmovne $26, 0, $18 /* $18 = 0 => non-restartable */ |
| 315 | ldq $0, SP_OFF($sp) | 315 | ldq $0, SP_OFF($sp) |
| 316 | and $0, 8, $0 | 316 | and $0, 8, $0 |
| 317 | beq $0, ret_to_kernel | 317 | beq $0, ret_to_kernel |
| @@ -320,8 +320,8 @@ ret_to_user: | |||
| 320 | sampling and the rti. */ | 320 | sampling and the rti. */ |
| 321 | lda $16, 7 | 321 | lda $16, 7 |
| 322 | call_pal PAL_swpipl | 322 | call_pal PAL_swpipl |
| 323 | ldl $5, TI_FLAGS($8) | 323 | ldl $17, TI_FLAGS($8) |
| 324 | and $5, _TIF_WORK_MASK, $2 | 324 | and $17, _TIF_WORK_MASK, $2 |
| 325 | bne $2, work_pending | 325 | bne $2, work_pending |
| 326 | restore_all: | 326 | restore_all: |
| 327 | RESTORE_ALL | 327 | RESTORE_ALL |
| @@ -341,10 +341,10 @@ $syscall_error: | |||
| 341 | * frame to indicate that a negative return value wasn't an | 341 | * frame to indicate that a negative return value wasn't an |
| 342 | * error number.. | 342 | * error number.. |
| 343 | */ | 343 | */ |
| 344 | ldq $19, 0($sp) /* old syscall nr (zero if success) */ | 344 | ldq $18, 0($sp) /* old syscall nr (zero if success) */ |
| 345 | beq $19, $ret_success | 345 | beq $18, $ret_success |
| 346 | 346 | ||
| 347 | ldq $20, 72($sp) /* .. and this a3 */ | 347 | ldq $19, 72($sp) /* .. and this a3 */ |
| 348 | subq $31, $0, $0 /* with error in v0 */ | 348 | subq $31, $0, $0 /* with error in v0 */ |
| 349 | addq $31, 1, $1 /* set a3 for errno return */ | 349 | addq $31, 1, $1 /* set a3 for errno return */ |
| 350 | stq $0, 0($sp) | 350 | stq $0, 0($sp) |
| @@ -362,51 +362,35 @@ $ret_success: | |||
| 362 | * Do all cleanup when returning from all interrupts and system calls. | 362 | * Do all cleanup when returning from all interrupts and system calls. |
| 363 | * | 363 | * |
| 364 | * Arguments: | 364 | * Arguments: |
| 365 | * $5: TI_FLAGS. | ||
| 366 | * $8: current. | 365 | * $8: current. |
| 367 | * $19: The old syscall number, or zero if this is not a return | 366 | * $17: TI_FLAGS. |
| 367 | * $18: The old syscall number, or zero if this is not a return | ||
| 368 | * from a syscall that errored and is possibly restartable. | 368 | * from a syscall that errored and is possibly restartable. |
| 369 | * $20: The old a3 value | 369 | * $19: The old a3 value |
| 370 | */ | 370 | */ |
| 371 | 371 | ||
| 372 | .align 4 | 372 | .align 4 |
| 373 | .ent work_pending | 373 | .ent work_pending |
| 374 | work_pending: | 374 | work_pending: |
| 375 | and $5, _TIF_NEED_RESCHED, $2 | 375 | and $17, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING, $2 |
| 376 | beq $2, $work_notifysig | 376 | bne $2, $work_notifysig |
| 377 | 377 | ||
| 378 | $work_resched: | 378 | $work_resched: |
| 379 | subq $sp, 16, $sp | 379 | /* |
| 380 | stq $19, 0($sp) /* save syscall nr */ | 380 | * We can get here only if we returned from syscall without SIGPENDING |
| 381 | stq $20, 8($sp) /* and error indication (a3) */ | 381 | * or got through work_notifysig already. Either case means no syscall |
| 382 | * restarts for us, so let $18 and $19 burn. | ||
| 383 | */ | ||
| 382 | jsr $26, schedule | 384 | jsr $26, schedule |
| 383 | ldq $19, 0($sp) | 385 | mov 0, $18 |
| 384 | ldq $20, 8($sp) | 386 | br ret_to_user |
| 385 | addq $sp, 16, $sp | ||
| 386 | /* Make sure need_resched and sigpending don't change between | ||
| 387 | sampling and the rti. */ | ||
| 388 | lda $16, 7 | ||
| 389 | call_pal PAL_swpipl | ||
| 390 | ldl $5, TI_FLAGS($8) | ||
| 391 | and $5, _TIF_WORK_MASK, $2 | ||
| 392 | beq $2, restore_all | ||
| 393 | and $5, _TIF_NEED_RESCHED, $2 | ||
| 394 | bne $2, $work_resched | ||
| 395 | 387 | ||
| 396 | $work_notifysig: | 388 | $work_notifysig: |
| 397 | mov $sp, $16 | 389 | mov $sp, $16 |
| 398 | bsr $1, do_switch_stack | 390 | bsr $1, do_switch_stack |
| 399 | mov $sp, $17 | 391 | jsr $26, do_work_pending |
| 400 | mov $5, $18 | ||
| 401 | mov $19, $9 /* save old syscall number */ | ||
| 402 | mov $20, $10 /* save old a3 */ | ||
| 403 | and $5, _TIF_SIGPENDING, $2 | ||
| 404 | cmovne $2, 0, $9 /* we don't want double syscall restarts */ | ||
| 405 | jsr $26, do_notify_resume | ||
| 406 | mov $9, $19 | ||
| 407 | mov $10, $20 | ||
| 408 | bsr $1, undo_switch_stack | 392 | bsr $1, undo_switch_stack |
| 409 | br ret_to_user | 393 | br restore_all |
| 410 | .end work_pending | 394 | .end work_pending |
| 411 | 395 | ||
| 412 | /* | 396 | /* |
| @@ -418,11 +402,10 @@ $work_notifysig: | |||
| 418 | strace: | 402 | strace: |
| 419 | /* set up signal stack, call syscall_trace */ | 403 | /* set up signal stack, call syscall_trace */ |
| 420 | bsr $1, do_switch_stack | 404 | bsr $1, do_switch_stack |
| 421 | jsr $26, syscall_trace | 405 | jsr $26, syscall_trace_enter /* returns the syscall number */ |
| 422 | bsr $1, undo_switch_stack | 406 | bsr $1, undo_switch_stack |
| 423 | 407 | ||
| 424 | /* get the system call number and the arguments back.. */ | 408 | /* get the arguments back.. */ |
| 425 | ldq $0, 0($sp) | ||
| 426 | ldq $16, SP_OFF+24($sp) | 409 | ldq $16, SP_OFF+24($sp) |
| 427 | ldq $17, SP_OFF+32($sp) | 410 | ldq $17, SP_OFF+32($sp) |
| 428 | ldq $18, SP_OFF+40($sp) | 411 | ldq $18, SP_OFF+40($sp) |
| @@ -449,15 +432,15 @@ $strace_success: | |||
| 449 | stq $0, 0($sp) /* save return value */ | 432 | stq $0, 0($sp) /* save return value */ |
| 450 | 433 | ||
| 451 | bsr $1, do_switch_stack | 434 | bsr $1, do_switch_stack |
| 452 | jsr $26, syscall_trace | 435 | jsr $26, syscall_trace_leave |
| 453 | bsr $1, undo_switch_stack | 436 | bsr $1, undo_switch_stack |
| 454 | br $31, ret_from_sys_call | 437 | br $31, ret_from_sys_call |
| 455 | 438 | ||
| 456 | .align 3 | 439 | .align 3 |
| 457 | $strace_error: | 440 | $strace_error: |
| 458 | ldq $19, 0($sp) /* old syscall nr (zero if success) */ | 441 | ldq $18, 0($sp) /* old syscall nr (zero if success) */ |
| 459 | beq $19, $strace_success | 442 | beq $18, $strace_success |
| 460 | ldq $20, 72($sp) /* .. and this a3 */ | 443 | ldq $19, 72($sp) /* .. and this a3 */ |
| 461 | 444 | ||
| 462 | subq $31, $0, $0 /* with error in v0 */ | 445 | subq $31, $0, $0 /* with error in v0 */ |
| 463 | addq $31, 1, $1 /* set a3 for errno return */ | 446 | addq $31, 1, $1 /* set a3 for errno return */ |
| @@ -465,11 +448,11 @@ $strace_error: | |||
| 465 | stq $1, 72($sp) /* a3 for return */ | 448 | stq $1, 72($sp) /* a3 for return */ |
| 466 | 449 | ||
| 467 | bsr $1, do_switch_stack | 450 | bsr $1, do_switch_stack |
| 468 | mov $19, $9 /* save old syscall number */ | 451 | mov $18, $9 /* save old syscall number */ |
| 469 | mov $20, $10 /* save old a3 */ | 452 | mov $19, $10 /* save old a3 */ |
| 470 | jsr $26, syscall_trace | 453 | jsr $26, syscall_trace_leave |
| 471 | mov $9, $19 | 454 | mov $9, $18 |
| 472 | mov $10, $20 | 455 | mov $10, $19 |
| 473 | bsr $1, undo_switch_stack | 456 | bsr $1, undo_switch_stack |
| 474 | 457 | ||
| 475 | mov $31, $26 /* tell "ret_from_sys_call" we can restart */ | 458 | mov $31, $26 /* tell "ret_from_sys_call" we can restart */ |
| @@ -620,24 +603,9 @@ ret_from_kernel_thread: | |||
| 620 | mov $9, $27 | 603 | mov $9, $27 |
| 621 | mov $10, $16 | 604 | mov $10, $16 |
| 622 | jsr $26, ($9) | 605 | jsr $26, ($9) |
| 623 | ldgp $gp, 0($26) | ||
| 624 | mov $0, $16 | ||
| 625 | mov $31, $26 | ||
| 626 | jmp $31, sys_exit | ||
| 627 | .end ret_from_kernel_thread | ||
| 628 | |||
| 629 | .globl ret_from_kernel_execve | ||
| 630 | .align 4 | ||
| 631 | .ent ret_from_kernel_execve | ||
| 632 | ret_from_kernel_execve: | ||
| 633 | mov $16, $sp | ||
| 634 | /* Avoid the HAE being gratuitously wrong, to avoid restoring it. */ | ||
| 635 | ldq $2, alpha_mv+HAE_CACHE | ||
| 636 | stq $2, 152($sp) /* HAE */ | ||
| 637 | mov $31, $19 /* to disable syscall restarts */ | 606 | mov $31, $19 /* to disable syscall restarts */ |
| 638 | br $31, ret_to_user | 607 | br $31, ret_to_user |
| 639 | 608 | .end ret_from_kernel_thread | |
| 640 | .end ret_from_kernel_execve | ||
| 641 | 609 | ||
| 642 | 610 | ||
| 643 | /* | 611 | /* |
| @@ -698,7 +666,7 @@ sys_sigreturn: | |||
| 698 | lda $sp, -SWITCH_STACK_SIZE($sp) | 666 | lda $sp, -SWITCH_STACK_SIZE($sp) |
| 699 | jsr $26, do_sigreturn | 667 | jsr $26, do_sigreturn |
| 700 | bne $9, 1f | 668 | bne $9, 1f |
| 701 | jsr $26, syscall_trace | 669 | jsr $26, syscall_trace_leave |
| 702 | 1: br $1, undo_switch_stack | 670 | 1: br $1, undo_switch_stack |
| 703 | br ret_from_sys_call | 671 | br ret_from_sys_call |
| 704 | .end sys_sigreturn | 672 | .end sys_sigreturn |
| @@ -715,7 +683,7 @@ sys_rt_sigreturn: | |||
| 715 | lda $sp, -SWITCH_STACK_SIZE($sp) | 683 | lda $sp, -SWITCH_STACK_SIZE($sp) |
| 716 | jsr $26, do_rt_sigreturn | 684 | jsr $26, do_rt_sigreturn |
| 717 | bne $9, 1f | 685 | bne $9, 1f |
| 718 | jsr $26, syscall_trace | 686 | jsr $26, syscall_trace_leave |
| 719 | 1: br $1, undo_switch_stack | 687 | 1: br $1, undo_switch_stack |
| 720 | br ret_from_sys_call | 688 | br ret_from_sys_call |
| 721 | .end sys_rt_sigreturn | 689 | .end sys_rt_sigreturn |
