diff options
Diffstat (limited to 'arch/sh/kernel/entry.S')
-rw-r--r-- | arch/sh/kernel/entry.S | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/arch/sh/kernel/entry.S b/arch/sh/kernel/entry.S index 97c571fbcdf1..39aaefb2d83f 100644 --- a/arch/sh/kernel/entry.S +++ b/arch/sh/kernel/entry.S | |||
@@ -1,9 +1,8 @@ | |||
1 | /* $Id: entry.S,v 1.37 2004/06/11 13:02:46 doyu Exp $ | 1 | /* |
2 | * | ||
3 | * linux/arch/sh/entry.S | 2 | * linux/arch/sh/entry.S |
4 | * | 3 | * |
5 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka | 4 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka |
6 | * Copyright (C) 2003 Paul Mundt | 5 | * Copyright (C) 2003 - 2006 Paul Mundt |
7 | * | 6 | * |
8 | * This file is subject to the terms and conditions of the GNU General Public | 7 | * This file is subject to the terms and conditions of the GNU General Public |
9 | * License. See the file "COPYING" in the main directory of this archive | 8 | * License. See the file "COPYING" in the main directory of this archive |
@@ -78,7 +77,6 @@ OFF_TRA = (16*4+6*4) | |||
78 | #define k3 r3 | 77 | #define k3 r3 |
79 | #define k4 r4 | 78 | #define k4 r4 |
80 | 79 | ||
81 | #define k_ex_code r2_bank /* r2_bank1 */ | ||
82 | #define g_imask r6 /* r6_bank1 */ | 80 | #define g_imask r6 /* r6_bank1 */ |
83 | #define k_g_imask r6_bank /* r6_bank1 */ | 81 | #define k_g_imask r6_bank /* r6_bank1 */ |
84 | #define current r7 /* r7_bank1 */ | 82 | #define current r7 /* r7_bank1 */ |
@@ -691,7 +689,7 @@ interrupt: | |||
691 | 0: | 689 | 0: |
692 | #endif /* defined(CONFIG_KGDB_NMI) */ | 690 | #endif /* defined(CONFIG_KGDB_NMI) */ |
693 | bra handle_exception | 691 | bra handle_exception |
694 | mov.l @k2, k2 | 692 | mov #-1, k2 ! interrupt exception marker |
695 | 693 | ||
696 | .align 2 | 694 | .align 2 |
697 | 1: .long EXPEVT | 695 | 1: .long EXPEVT |
@@ -717,8 +715,7 @@ ENTRY(handle_exception) | |||
717 | add current, k1 | 715 | add current, k1 |
718 | mov k1, r15 ! change to kernel stack | 716 | mov k1, r15 ! change to kernel stack |
719 | ! | 717 | ! |
720 | 1: mov #-1, k4 | 718 | 1: mov.l 2f, k1 |
721 | mov.l 2f, k1 | ||
722 | ! | 719 | ! |
723 | #ifdef CONFIG_SH_DSP | 720 | #ifdef CONFIG_SH_DSP |
724 | mov.l r2, @-r15 ! Save r2, we need another reg | 721 | mov.l r2, @-r15 ! Save r2, we need another reg |
@@ -763,6 +760,8 @@ skip_save: | |||
763 | #endif | 760 | #endif |
764 | ! Save the user registers on the stack. | 761 | ! Save the user registers on the stack. |
765 | mov.l k2, @-r15 ! EXPEVT | 762 | mov.l k2, @-r15 ! EXPEVT |
763 | |||
764 | mov #-1, k4 | ||
766 | mov.l k4, @-r15 ! set TRA (default: -1) | 765 | mov.l k4, @-r15 ! set TRA (default: -1) |
767 | ! | 766 | ! |
768 | sts.l macl, @-r15 | 767 | sts.l macl, @-r15 |
@@ -797,8 +796,21 @@ skip_save: | |||
797 | mov.l r2, @-r15 | 796 | mov.l r2, @-r15 |
798 | mov.l r1, @-r15 | 797 | mov.l r1, @-r15 |
799 | mov.l r0, @-r15 | 798 | mov.l r0, @-r15 |
800 | ! Then, dispatch to the handler, according to the exception code. | 799 | |
801 | stc k_ex_code, r8 | 800 | /* |
801 | * This gets a bit tricky.. in the INTEVT case we don't want to use | ||
802 | * the VBR offset as a destination in the jump call table, since all | ||
803 | * of the destinations are the same. In this case, (interrupt) sets | ||
804 | * a marker in r2 (now r2_bank since SR.RB changed), which we check | ||
805 | * to determine the exception type. For all other exceptions, we | ||
806 | * forcibly read EXPEVT from memory and fix up the jump address, in | ||
807 | * the interrupt exception case we jump to do_IRQ() and defer the | ||
808 | * INTEVT read until there. As a bonus, we can also clean up the SR.RB | ||
809 | * checks that do_IRQ() was doing.. | ||
810 | */ | ||
811 | stc r2_bank, r8 | ||
812 | cmp/pz r8 | ||
813 | bf interrupt_exception | ||
802 | shlr2 r8 | 814 | shlr2 r8 |
803 | shlr r8 | 815 | shlr r8 |
804 | mov.l 4f, r9 | 816 | mov.l 4f, r9 |
@@ -806,6 +818,8 @@ skip_save: | |||
806 | mov.l @r9, r9 | 818 | mov.l @r9, r9 |
807 | jmp @r9 | 819 | jmp @r9 |
808 | nop | 820 | nop |
821 | rts | ||
822 | nop | ||
809 | 823 | ||
810 | .align 2 | 824 | .align 2 |
811 | 1: .long 0x00001000 ! DSP=1 | 825 | 1: .long 0x00001000 ! DSP=1 |
@@ -813,8 +827,17 @@ skip_save: | |||
813 | 3: .long 0xcfffffff ! RB=0, BL=0 | 827 | 3: .long 0xcfffffff ! RB=0, BL=0 |
814 | 4: .long exception_handling_table | 828 | 4: .long exception_handling_table |
815 | 829 | ||
830 | interrupt_exception: | ||
831 | mov.l 1f, r9 | ||
832 | jmp @r9 | ||
833 | nop | ||
834 | rts | ||
835 | nop | ||
836 | |||
837 | .align 2 | ||
838 | 1: .long do_IRQ | ||
839 | |||
816 | .align 2 | 840 | .align 2 |
817 | ENTRY(exception_none) | 841 | ENTRY(exception_none) |
818 | rts | 842 | rts |
819 | nop | 843 | nop |
820 | |||