aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin/mach-common/entry.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/blackfin/mach-common/entry.S')
-rw-r--r--arch/blackfin/mach-common/entry.S70
1 files changed, 61 insertions, 9 deletions
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S
index fae774651374..21e65a339a22 100644
--- a/arch/blackfin/mach-common/entry.S
+++ b/arch/blackfin/mach-common/entry.S
@@ -151,13 +151,6 @@ ENTRY(_ex_syscall)
151 jump.s _bfin_return_from_exception; 151 jump.s _bfin_return_from_exception;
152ENDPROC(_ex_syscall) 152ENDPROC(_ex_syscall)
153 153
154ENTRY(_ex_soft_bp)
155 r7 = retx;
156 r7 += -2;
157 retx = r7;
158 jump.s _ex_trap_c;
159ENDPROC(_ex_soft_bp)
160
161ENTRY(_ex_single_step) 154ENTRY(_ex_single_step)
162 /* If we just returned from an interrupt, the single step event is 155 /* If we just returned from an interrupt, the single step event is
163 for the RTI instruction. */ 156 for the RTI instruction. */
@@ -607,6 +600,19 @@ ENTRY(_system_call)
607 p2 = [p2]; 600 p2 = [p2];
608 601
609 [p2+(TASK_THREAD+THREAD_KSP)] = sp; 602 [p2+(TASK_THREAD+THREAD_KSP)] = sp;
603#ifdef CONFIG_IPIPE
604 r0 = sp;
605 SP += -12;
606 call ___ipipe_syscall_root;
607 SP += 12;
608 cc = r0 == 1;
609 if cc jump .Lsyscall_really_exit;
610 cc = r0 == -1;
611 if cc jump .Lresume_userspace;
612 r3 = [sp + PT_R3];
613 r4 = [sp + PT_R4];
614 p0 = [sp + PT_ORIG_P0];
615#endif /* CONFIG_IPIPE */
610 616
611 /* Check the System Call */ 617 /* Check the System Call */
612 r7 = __NR_syscall; 618 r7 = __NR_syscall;
@@ -661,6 +667,17 @@ ENTRY(_system_call)
661 r7 = r7 & r4; 667 r7 = r7 & r4;
662 668
663.Lsyscall_resched: 669.Lsyscall_resched:
670#ifdef CONFIG_IPIPE
671 cc = BITTST(r7, TIF_IRQ_SYNC);
672 if !cc jump .Lsyscall_no_irqsync;
673 [--sp] = reti;
674 r0 = [sp++];
675 SP += -12;
676 call ___ipipe_sync_root;
677 SP += 12;
678 jump .Lresume_userspace_1;
679.Lsyscall_no_irqsync:
680#endif
664 cc = BITTST(r7, TIF_NEED_RESCHED); 681 cc = BITTST(r7, TIF_NEED_RESCHED);
665 if !cc jump .Lsyscall_sigpending; 682 if !cc jump .Lsyscall_sigpending;
666 683
@@ -692,6 +709,10 @@ ENTRY(_system_call)
692.Lsyscall_really_exit: 709.Lsyscall_really_exit:
693 r5 = [sp + PT_RESERVED]; 710 r5 = [sp + PT_RESERVED];
694 rets = r5; 711 rets = r5;
712#ifdef CONFIG_IPIPE
713 [--sp] = reti;
714 r5 = [sp++];
715#endif /* CONFIG_IPIPE */
695 rts; 716 rts;
696ENDPROC(_system_call) 717ENDPROC(_system_call)
697 718
@@ -778,6 +799,15 @@ _new_old_task:
778ENDPROC(_resume) 799ENDPROC(_resume)
779 800
780ENTRY(_ret_from_exception) 801ENTRY(_ret_from_exception)
802#ifdef CONFIG_IPIPE
803 [--sp] = rets;
804 SP += -12;
805 call ___ipipe_check_root
806 SP += 12
807 rets = [sp++];
808 cc = r0 == 0;
809 if cc jump 4f; /* not on behalf of Linux, get out */
810#endif /* CONFIG_IPIPE */
781 p2.l = lo(IPEND); 811 p2.l = lo(IPEND);
782 p2.h = hi(IPEND); 812 p2.h = hi(IPEND);
783 813
@@ -834,6 +864,28 @@ ENTRY(_ret_from_exception)
834 rts; 864 rts;
835ENDPROC(_ret_from_exception) 865ENDPROC(_ret_from_exception)
836 866
867#ifdef CONFIG_IPIPE
868
869_sync_root_irqs:
870 [--sp] = reti; /* Reenable interrupts */
871 r0 = [sp++];
872 jump.l ___ipipe_sync_root
873
874_resume_kernel_from_int:
875 r0.l = _sync_root_irqs
876 r0.h = _sync_root_irqs
877 [--sp] = rets;
878 [--sp] = ( r7:4, p5:3 );
879 SP += -12;
880 call ___ipipe_call_irqtail
881 SP += 12;
882 ( r7:4, p5:3 ) = [sp++];
883 rets = [sp++];
884 rts
885#else
886#define _resume_kernel_from_int 2f
887#endif
888
837ENTRY(_return_from_int) 889ENTRY(_return_from_int)
838 /* If someone else already raised IRQ 15, do nothing. */ 890 /* If someone else already raised IRQ 15, do nothing. */
839 csync; 891 csync;
@@ -855,7 +907,7 @@ ENTRY(_return_from_int)
855 r1 = r0 - r1; 907 r1 = r0 - r1;
856 r2 = r0 & r1; 908 r2 = r0 & r1;
857 cc = r2 == 0; 909 cc = r2 == 0;
858 if !cc jump 2f; 910 if !cc jump _resume_kernel_from_int;
859 911
860 /* Lower the interrupt level to 15. */ 912 /* Lower the interrupt level to 15. */
861 p0.l = lo(EVT15); 913 p0.l = lo(EVT15);
@@ -1087,7 +1139,7 @@ ENTRY(_ex_table)
1087 * EXCPT instruction can provide 4 bits of EXCAUSE, allowing 16 to be user defined 1139 * EXCPT instruction can provide 4 bits of EXCAUSE, allowing 16 to be user defined
1088 */ 1140 */
1089 .long _ex_syscall /* 0x00 - User Defined - Linux Syscall */ 1141 .long _ex_syscall /* 0x00 - User Defined - Linux Syscall */
1090 .long _ex_soft_bp /* 0x01 - User Defined - Software breakpoint */ 1142 .long _ex_trap_c /* 0x01 - User Defined - Software breakpoint */
1091#ifdef CONFIG_KGDB 1143#ifdef CONFIG_KGDB
1092 .long _ex_trap_c /* 0x02 - User Defined - KGDB initial connection 1144 .long _ex_trap_c /* 0x02 - User Defined - KGDB initial connection
1093 and break signal trap */ 1145 and break signal trap */