aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/entry-armv.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel/entry-armv.S')
-rw-r--r--arch/arm/kernel/entry-armv.S22
1 files changed, 14 insertions, 8 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index be439cab92c6..d9fb819bf7cc 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -47,6 +47,13 @@
47 movne r0, sp 47 movne r0, sp
48 adrne lr, 1b 48 adrne lr, 1b
49 bne do_IPI 49 bne do_IPI
50
51#ifdef CONFIG_LOCAL_TIMERS
52 test_for_ltirq r0, r6, r5, lr
53 movne r0, sp
54 adrne lr, 1b
55 bne do_local_timer
56#endif
50#endif 57#endif
51 58
52 .endm 59 .endm
@@ -785,7 +792,7 @@ __kuser_helper_end:
785 * SP points to a minimal amount of processor-private memory, the address 792 * SP points to a minimal amount of processor-private memory, the address
786 * of which is copied into r0 for the mode specific abort handler. 793 * of which is copied into r0 for the mode specific abort handler.
787 */ 794 */
788 .macro vector_stub, name, correction=0 795 .macro vector_stub, name, mode, correction=0
789 .align 5 796 .align 5
790 797
791vector_\name: 798vector_\name:
@@ -805,15 +812,14 @@ vector_\name:
805 @ Prepare for SVC32 mode. IRQs remain disabled. 812 @ Prepare for SVC32 mode. IRQs remain disabled.
806 @ 813 @
807 mrs r0, cpsr 814 mrs r0, cpsr
808 bic r0, r0, #MODE_MASK 815 eor r0, r0, #(\mode ^ SVC_MODE)
809 orr r0, r0, #SVC_MODE
810 msr spsr_cxsf, r0 816 msr spsr_cxsf, r0
811 817
812 @ 818 @
813 @ the branch table must immediately follow this code 819 @ the branch table must immediately follow this code
814 @ 820 @
815 mov r0, sp
816 and lr, lr, #0x0f 821 and lr, lr, #0x0f
822 mov r0, sp
817 ldr lr, [pc, lr, lsl #2] 823 ldr lr, [pc, lr, lsl #2]
818 movs pc, lr @ branch to handler in SVC mode 824 movs pc, lr @ branch to handler in SVC mode
819 .endm 825 .endm
@@ -823,7 +829,7 @@ __stubs_start:
823/* 829/*
824 * Interrupt dispatcher 830 * Interrupt dispatcher
825 */ 831 */
826 vector_stub irq, 4 832 vector_stub irq, IRQ_MODE, 4
827 833
828 .long __irq_usr @ 0 (USR_26 / USR_32) 834 .long __irq_usr @ 0 (USR_26 / USR_32)
829 .long __irq_invalid @ 1 (FIQ_26 / FIQ_32) 835 .long __irq_invalid @ 1 (FIQ_26 / FIQ_32)
@@ -846,7 +852,7 @@ __stubs_start:
846 * Data abort dispatcher 852 * Data abort dispatcher
847 * Enter in ABT mode, spsr = USR CPSR, lr = USR PC 853 * Enter in ABT mode, spsr = USR CPSR, lr = USR PC
848 */ 854 */
849 vector_stub dabt, 8 855 vector_stub dabt, ABT_MODE, 8
850 856
851 .long __dabt_usr @ 0 (USR_26 / USR_32) 857 .long __dabt_usr @ 0 (USR_26 / USR_32)
852 .long __dabt_invalid @ 1 (FIQ_26 / FIQ_32) 858 .long __dabt_invalid @ 1 (FIQ_26 / FIQ_32)
@@ -869,7 +875,7 @@ __stubs_start:
869 * Prefetch abort dispatcher 875 * Prefetch abort dispatcher
870 * Enter in ABT mode, spsr = USR CPSR, lr = USR PC 876 * Enter in ABT mode, spsr = USR CPSR, lr = USR PC
871 */ 877 */
872 vector_stub pabt, 4 878 vector_stub pabt, ABT_MODE, 4
873 879
874 .long __pabt_usr @ 0 (USR_26 / USR_32) 880 .long __pabt_usr @ 0 (USR_26 / USR_32)
875 .long __pabt_invalid @ 1 (FIQ_26 / FIQ_32) 881 .long __pabt_invalid @ 1 (FIQ_26 / FIQ_32)
@@ -892,7 +898,7 @@ __stubs_start:
892 * Undef instr entry dispatcher 898 * Undef instr entry dispatcher
893 * Enter in UND mode, spsr = SVC/USR CPSR, lr = SVC/USR PC 899 * Enter in UND mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
894 */ 900 */
895 vector_stub und 901 vector_stub und, UND_MODE
896 902
897 .long __und_usr @ 0 (USR_26 / USR_32) 903 .long __und_usr @ 0 (USR_26 / USR_32)
898 .long __und_invalid @ 1 (FIQ_26 / FIQ_32) 904 .long __und_invalid @ 1 (FIQ_26 / FIQ_32)