diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/microblaze/kernel/entry-nommu.S | 13 | ||||
-rw-r--r-- | arch/microblaze/kernel/entry.S | 58 |
2 files changed, 42 insertions, 29 deletions
diff --git a/arch/microblaze/kernel/entry-nommu.S b/arch/microblaze/kernel/entry-nommu.S index 96f97f845495..7e394fc2c439 100644 --- a/arch/microblaze/kernel/entry-nommu.S +++ b/arch/microblaze/kernel/entry-nommu.S | |||
@@ -124,6 +124,7 @@ ret_from_intr: | |||
124 | lwi r11, r1, PT_MODE | 124 | lwi r11, r1, PT_MODE |
125 | bneid r11, no_intr_resched | 125 | bneid r11, no_intr_resched |
126 | 126 | ||
127 | 3: | ||
127 | lwi r6, r31, TS_THREAD_INFO /* get thread info */ | 128 | lwi r6, r31, TS_THREAD_INFO /* get thread info */ |
128 | lwi r19, r6, TI_FLAGS /* get flags in thread info */ | 129 | lwi r19, r6, TI_FLAGS /* get flags in thread info */ |
129 | /* do an extra work if any bits are set */ | 130 | /* do an extra work if any bits are set */ |
@@ -132,11 +133,13 @@ ret_from_intr: | |||
132 | beqi r11, 1f | 133 | beqi r11, 1f |
133 | bralid r15, schedule | 134 | bralid r15, schedule |
134 | nop | 135 | nop |
136 | bri 3b | ||
135 | 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME | 137 | 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME |
136 | beqid r11, no_intr_resched | 138 | beqid r11, no_intr_resched |
137 | addk r5, r1, r0 | 139 | addk r5, r1, r0 |
138 | bralid r15, do_notify_resume | 140 | bralid r15, do_notify_resume |
139 | addk r6, r0, r0 | 141 | addk r6, r0, r0 |
142 | bri 3b | ||
140 | 143 | ||
141 | no_intr_resched: | 144 | no_intr_resched: |
142 | /* Disable interrupts, we are now committed to the state restore */ | 145 | /* Disable interrupts, we are now committed to the state restore */ |
@@ -486,18 +489,24 @@ ENTRY(ret_from_kernel_thread) | |||
486 | work_pending: | 489 | work_pending: |
487 | lwi r11, r1, PT_MODE | 490 | lwi r11, r1, PT_MODE |
488 | bneid r11, 2f | 491 | bneid r11, 2f |
492 | 3: | ||
489 | enable_irq | 493 | enable_irq |
490 | |||
491 | andi r11, r19, _TIF_NEED_RESCHED | 494 | andi r11, r19, _TIF_NEED_RESCHED |
492 | beqi r11, 1f | 495 | beqi r11, 1f |
493 | bralid r15, schedule | 496 | bralid r15, schedule |
494 | nop | 497 | nop |
498 | bri 4f | ||
495 | 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME | 499 | 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME |
496 | beqi r11, no_work_pending | 500 | beqi r11, no_work_pending |
497 | addk r5, r30, r0 | 501 | addk r5, r30, r0 |
498 | bralid r15, do_notify_resume | 502 | bralid r15, do_notify_resume |
499 | addik r6, r0, 1 | 503 | addik r6, r0, 1 |
500 | bri no_work_pending | 504 | addk r30, r0, r0 /* no restarts from now on */ |
505 | 4: | ||
506 | disable_irq | ||
507 | lwi r6, r31, TS_THREAD_INFO /* get thread info */ | ||
508 | lwi r19, r6, TI_FLAGS /* get flags in thread info */ | ||
509 | bri 3b | ||
501 | 510 | ||
502 | ENTRY(ret_to_user) | 511 | ENTRY(ret_to_user) |
503 | disable_irq | 512 | disable_irq |
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index 18908d29248b..85b6b5d80c99 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S | |||
@@ -402,26 +402,27 @@ C_ENTRY(ret_from_trap): | |||
402 | * trigger rescheduling. */ | 402 | * trigger rescheduling. */ |
403 | /* get thread info from current task */ | 403 | /* get thread info from current task */ |
404 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; | 404 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; |
405 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 405 | lwi r19, r11, TI_FLAGS; /* get flags in thread info */ |
406 | andi r11, r11, _TIF_NEED_RESCHED; | 406 | andi r11, r19, _TIF_NEED_RESCHED; |
407 | beqi r11, 5f; | 407 | beqi r11, 5f; |
408 | 408 | ||
409 | bralid r15, schedule; /* Call scheduler */ | 409 | bralid r15, schedule; /* Call scheduler */ |
410 | nop; /* delay slot */ | 410 | nop; /* delay slot */ |
411 | bri 1b | ||
411 | 412 | ||
412 | /* Maybe handle a signal */ | 413 | /* Maybe handle a signal */ |
413 | 5: /* get thread info from current task*/ | 414 | 5: |
414 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; | 415 | andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; |
415 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 416 | beqi r11, 4f; /* Signals to handle, handle them */ |
416 | andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; | ||
417 | beqi r11, 1f; /* Signals to handle, handle them */ | ||
418 | 417 | ||
419 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ | 418 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ |
420 | bralid r15, do_notify_resume; /* Handle any signals */ | 419 | bralid r15, do_notify_resume; /* Handle any signals */ |
421 | add r6, r30, r0; /* Arg 2: int in_syscall */ | 420 | add r6, r30, r0; /* Arg 2: int in_syscall */ |
421 | add r30, r0, r0 /* no more restarts */ | ||
422 | bri 1b | ||
422 | 423 | ||
423 | /* Finally, return to user state. */ | 424 | /* Finally, return to user state. */ |
424 | 1: set_bip; /* Ints masked for state restore */ | 425 | 4: set_bip; /* Ints masked for state restore */ |
425 | swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ | 426 | swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ |
426 | VM_OFF; | 427 | VM_OFF; |
427 | tophys(r1,r1); | 428 | tophys(r1,r1); |
@@ -573,20 +574,20 @@ C_ENTRY(ret_from_exc): | |||
573 | 574 | ||
574 | /* We're returning to user mode, so check for various conditions that | 575 | /* We're returning to user mode, so check for various conditions that |
575 | trigger rescheduling. */ | 576 | trigger rescheduling. */ |
577 | 1: | ||
576 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ | 578 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ |
577 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 579 | lwi r19, r11, TI_FLAGS; /* get flags in thread info */ |
578 | andi r11, r11, _TIF_NEED_RESCHED; | 580 | andi r11, r19, _TIF_NEED_RESCHED; |
579 | beqi r11, 5f; | 581 | beqi r11, 5f; |
580 | 582 | ||
581 | /* Call the scheduler before returning from a syscall/trap. */ | 583 | /* Call the scheduler before returning from a syscall/trap. */ |
582 | bralid r15, schedule; /* Call scheduler */ | 584 | bralid r15, schedule; /* Call scheduler */ |
583 | nop; /* delay slot */ | 585 | nop; /* delay slot */ |
586 | bri 1b | ||
584 | 587 | ||
585 | /* Maybe handle a signal */ | 588 | /* Maybe handle a signal */ |
586 | 5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ | 589 | 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; |
587 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 590 | beqi r11, 4f; /* Signals to handle, handle them */ |
588 | andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; | ||
589 | beqi r11, 1f; /* Signals to handle, handle them */ | ||
590 | 591 | ||
591 | /* | 592 | /* |
592 | * Handle a signal return; Pending signals should be in r18. | 593 | * Handle a signal return; Pending signals should be in r18. |
@@ -602,9 +603,10 @@ C_ENTRY(ret_from_exc): | |||
602 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ | 603 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ |
603 | bralid r15, do_notify_resume; /* Handle any signals */ | 604 | bralid r15, do_notify_resume; /* Handle any signals */ |
604 | addi r6, r0, 0; /* Arg 2: int in_syscall */ | 605 | addi r6, r0, 0; /* Arg 2: int in_syscall */ |
606 | bri 1b | ||
605 | 607 | ||
606 | /* Finally, return to user state. */ | 608 | /* Finally, return to user state. */ |
607 | 1: set_bip; /* Ints masked for state restore */ | 609 | 4: set_bip; /* Ints masked for state restore */ |
608 | swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ | 610 | swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ |
609 | VM_OFF; | 611 | VM_OFF; |
610 | tophys(r1,r1); | 612 | tophys(r1,r1); |
@@ -684,22 +686,23 @@ ret_from_irq: | |||
684 | lwi r11, r1, PT_MODE; | 686 | lwi r11, r1, PT_MODE; |
685 | bnei r11, 2f; | 687 | bnei r11, 2f; |
686 | 688 | ||
689 | 1: | ||
687 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; | 690 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; |
688 | lwi r11, r11, TI_FLAGS; /* MS: get flags from thread info */ | 691 | lwi r19, r11, TI_FLAGS; /* MS: get flags from thread info */ |
689 | andi r11, r11, _TIF_NEED_RESCHED; | 692 | andi r11, r19, _TIF_NEED_RESCHED; |
690 | beqi r11, 5f | 693 | beqi r11, 5f |
691 | bralid r15, schedule; | 694 | bralid r15, schedule; |
692 | nop; /* delay slot */ | 695 | nop; /* delay slot */ |
696 | bri 1b | ||
693 | 697 | ||
694 | /* Maybe handle a signal */ | 698 | /* Maybe handle a signal */ |
695 | 5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* MS: get thread info */ | 699 | 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; |
696 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | ||
697 | andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; | ||
698 | beqid r11, no_intr_resched | 700 | beqid r11, no_intr_resched |
699 | /* Handle a signal return; Pending signals should be in r18. */ | 701 | /* Handle a signal return; Pending signals should be in r18. */ |
700 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ | 702 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ |
701 | bralid r15, do_notify_resume; /* Handle any signals */ | 703 | bralid r15, do_notify_resume; /* Handle any signals */ |
702 | addi r6, r0, 0; /* Arg 2: int in_syscall */ | 704 | addi r6, r0, 0; /* Arg 2: int in_syscall */ |
705 | bri 1b | ||
703 | 706 | ||
704 | /* Finally, return to user state. */ | 707 | /* Finally, return to user state. */ |
705 | no_intr_resched: | 708 | no_intr_resched: |
@@ -817,28 +820,29 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */ | |||
817 | lwi r11, r1, PT_MODE; | 820 | lwi r11, r1, PT_MODE; |
818 | bnei r11, 2f; | 821 | bnei r11, 2f; |
819 | /* MS: Return to user space - gdb */ | 822 | /* MS: Return to user space - gdb */ |
823 | 1: | ||
820 | /* Get current task ptr into r11 */ | 824 | /* Get current task ptr into r11 */ |
821 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ | 825 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ |
822 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 826 | lwi r19, r11, TI_FLAGS; /* get flags in thread info */ |
823 | andi r11, r11, _TIF_NEED_RESCHED; | 827 | andi r11, r19, _TIF_NEED_RESCHED; |
824 | beqi r11, 5f; | 828 | beqi r11, 5f; |
825 | 829 | ||
826 | /* Call the scheduler before returning from a syscall/trap. */ | 830 | /* Call the scheduler before returning from a syscall/trap. */ |
827 | bralid r15, schedule; /* Call scheduler */ | 831 | bralid r15, schedule; /* Call scheduler */ |
828 | nop; /* delay slot */ | 832 | nop; /* delay slot */ |
833 | bri 1b | ||
829 | 834 | ||
830 | /* Maybe handle a signal */ | 835 | /* Maybe handle a signal */ |
831 | 5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ | 836 | 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; |
832 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 837 | beqi r11, 4f; /* Signals to handle, handle them */ |
833 | andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; | ||
834 | beqi r11, 1f; /* Signals to handle, handle them */ | ||
835 | 838 | ||
836 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ | 839 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ |
837 | bralid r15, do_notify_resume; /* Handle any signals */ | 840 | bralid r15, do_notify_resume; /* Handle any signals */ |
838 | addi r6, r0, 0; /* Arg 2: int in_syscall */ | 841 | addi r6, r0, 0; /* Arg 2: int in_syscall */ |
842 | bri 1b | ||
839 | 843 | ||
840 | /* Finally, return to user state. */ | 844 | /* Finally, return to user state. */ |
841 | 1: swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ | 845 | 4: swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ |
842 | VM_OFF; | 846 | VM_OFF; |
843 | tophys(r1,r1); | 847 | tophys(r1,r1); |
844 | /* MS: Restore all regs */ | 848 | /* MS: Restore all regs */ |