diff options
Diffstat (limited to 'arch/arm/kernel/entry-armv.S')
| -rw-r--r-- | arch/arm/kernel/entry-armv.S | 22 |
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 | ||
| 791 | vector_\name: | 798 | vector_\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) |
