diff options
Diffstat (limited to 'arch/arm/kernel/entry-armv.S')
-rw-r--r-- | arch/arm/kernel/entry-armv.S | 74 |
1 files changed, 34 insertions, 40 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index bb8e93a76407..90c62cd51ca9 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -16,7 +16,8 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <asm/memory.h> | 18 | #include <asm/memory.h> |
19 | #include <asm/glue.h> | 19 | #include <asm/glue-df.h> |
20 | #include <asm/glue-pf.h> | ||
20 | #include <asm/vfpmacros.h> | 21 | #include <asm/vfpmacros.h> |
21 | #include <mach/entry-macro.S> | 22 | #include <mach/entry-macro.S> |
22 | #include <asm/thread_notify.h> | 23 | #include <asm/thread_notify.h> |
@@ -25,40 +26,22 @@ | |||
25 | #include <asm/tls.h> | 26 | #include <asm/tls.h> |
26 | 27 | ||
27 | #include "entry-header.S" | 28 | #include "entry-header.S" |
29 | #include <asm/entry-macro-multi.S> | ||
28 | 30 | ||
29 | /* | 31 | /* |
30 | * Interrupt handling. Preserves r7, r8, r9 | 32 | * Interrupt handling. Preserves r7, r8, r9 |
31 | */ | 33 | */ |
32 | .macro irq_handler | 34 | .macro irq_handler |
33 | get_irqnr_preamble r5, lr | 35 | #ifdef CONFIG_MULTI_IRQ_HANDLER |
34 | 1: get_irqnr_and_base r0, r6, r5, lr | 36 | ldr r5, =handle_arch_irq |
35 | movne r1, sp | 37 | mov r0, sp |
36 | @ | 38 | ldr r5, [r5] |
37 | @ routine called with r0 = irq number, r1 = struct pt_regs * | 39 | adr lr, BSYM(9997f) |
38 | @ | 40 | teq r5, #0 |
39 | adrne lr, BSYM(1b) | 41 | movne pc, r5 |
40 | bne asm_do_IRQ | ||
41 | |||
42 | #ifdef CONFIG_SMP | ||
43 | /* | ||
44 | * XXX | ||
45 | * | ||
46 | * this macro assumes that irqstat (r6) and base (r5) are | ||
47 | * preserved from get_irqnr_and_base above | ||
48 | */ | ||
49 | test_for_ipi r0, r6, r5, lr | ||
50 | movne r0, sp | ||
51 | adrne lr, BSYM(1b) | ||
52 | bne do_IPI | ||
53 | |||
54 | #ifdef CONFIG_LOCAL_TIMERS | ||
55 | test_for_ltirq r0, r6, r5, lr | ||
56 | movne r0, sp | ||
57 | adrne lr, BSYM(1b) | ||
58 | bne do_local_timer | ||
59 | #endif | ||
60 | #endif | 42 | #endif |
61 | 43 | arch_irq_handler_default | |
44 | 9997: | ||
62 | .endm | 45 | .endm |
63 | 46 | ||
64 | #ifdef CONFIG_KPROBES | 47 | #ifdef CONFIG_KPROBES |
@@ -196,6 +179,7 @@ __dabt_svc: | |||
196 | @ | 179 | @ |
197 | @ set desired IRQ state, then call main handler | 180 | @ set desired IRQ state, then call main handler |
198 | @ | 181 | @ |
182 | debug_entry r1 | ||
199 | msr cpsr_c, r9 | 183 | msr cpsr_c, r9 |
200 | mov r2, sp | 184 | mov r2, sp |
201 | bl do_DataAbort | 185 | bl do_DataAbort |
@@ -322,6 +306,7 @@ __pabt_svc: | |||
322 | #else | 306 | #else |
323 | bl CPU_PABORT_HANDLER | 307 | bl CPU_PABORT_HANDLER |
324 | #endif | 308 | #endif |
309 | debug_entry r1 | ||
325 | msr cpsr_c, r9 @ Maybe enable interrupts | 310 | msr cpsr_c, r9 @ Maybe enable interrupts |
326 | mov r2, sp @ regs | 311 | mov r2, sp @ regs |
327 | bl do_PrefetchAbort @ call abort handler | 312 | bl do_PrefetchAbort @ call abort handler |
@@ -437,6 +422,7 @@ __dabt_usr: | |||
437 | @ | 422 | @ |
438 | @ IRQs on, then call the main handler | 423 | @ IRQs on, then call the main handler |
439 | @ | 424 | @ |
425 | debug_entry r1 | ||
440 | enable_irq | 426 | enable_irq |
441 | mov r2, sp | 427 | mov r2, sp |
442 | adr lr, BSYM(ret_from_exception) | 428 | adr lr, BSYM(ret_from_exception) |
@@ -449,6 +435,10 @@ __irq_usr: | |||
449 | usr_entry | 435 | usr_entry |
450 | kuser_cmpxchg_check | 436 | kuser_cmpxchg_check |
451 | 437 | ||
438 | #ifdef CONFIG_IRQSOFF_TRACER | ||
439 | bl trace_hardirqs_off | ||
440 | #endif | ||
441 | |||
452 | get_thread_info tsk | 442 | get_thread_info tsk |
453 | #ifdef CONFIG_PREEMPT | 443 | #ifdef CONFIG_PREEMPT |
454 | ldr r8, [tsk, #TI_PREEMPT] @ get preempt count | 444 | ldr r8, [tsk, #TI_PREEMPT] @ get preempt count |
@@ -467,7 +457,7 @@ __irq_usr: | |||
467 | #endif | 457 | #endif |
468 | 458 | ||
469 | mov why, #0 | 459 | mov why, #0 |
470 | b ret_to_user | 460 | b ret_to_user_from_irq |
471 | UNWIND(.fnend ) | 461 | UNWIND(.fnend ) |
472 | ENDPROC(__irq_usr) | 462 | ENDPROC(__irq_usr) |
473 | 463 | ||
@@ -701,6 +691,7 @@ __pabt_usr: | |||
701 | #else | 691 | #else |
702 | bl CPU_PABORT_HANDLER | 692 | bl CPU_PABORT_HANDLER |
703 | #endif | 693 | #endif |
694 | debug_entry r1 | ||
704 | enable_irq @ Enable interrupts | 695 | enable_irq @ Enable interrupts |
705 | mov r2, sp @ regs | 696 | mov r2, sp @ regs |
706 | bl do_PrefetchAbort @ call abort handler | 697 | bl do_PrefetchAbort @ call abort handler |
@@ -733,7 +724,7 @@ ENTRY(__switch_to) | |||
733 | THUMB( stmia ip!, {r4 - sl, fp} ) @ Store most regs on stack | 724 | THUMB( stmia ip!, {r4 - sl, fp} ) @ Store most regs on stack |
734 | THUMB( str sp, [ip], #4 ) | 725 | THUMB( str sp, [ip], #4 ) |
735 | THUMB( str lr, [ip], #4 ) | 726 | THUMB( str lr, [ip], #4 ) |
736 | #ifdef CONFIG_MMU | 727 | #ifdef CONFIG_CPU_USE_DOMAINS |
737 | ldr r6, [r2, #TI_CPU_DOMAIN] | 728 | ldr r6, [r2, #TI_CPU_DOMAIN] |
738 | #endif | 729 | #endif |
739 | set_tls r3, r4, r5 | 730 | set_tls r3, r4, r5 |
@@ -742,7 +733,7 @@ ENTRY(__switch_to) | |||
742 | ldr r8, =__stack_chk_guard | 733 | ldr r8, =__stack_chk_guard |
743 | ldr r7, [r7, #TSK_STACK_CANARY] | 734 | ldr r7, [r7, #TSK_STACK_CANARY] |
744 | #endif | 735 | #endif |
745 | #ifdef CONFIG_MMU | 736 | #ifdef CONFIG_CPU_USE_DOMAINS |
746 | mcr p15, 0, r6, c3, c0, 0 @ Set domain register | 737 | mcr p15, 0, r6, c3, c0, 0 @ Set domain register |
747 | #endif | 738 | #endif |
748 | mov r5, r0 | 739 | mov r5, r0 |
@@ -840,7 +831,7 @@ __kuser_helper_start: | |||
840 | */ | 831 | */ |
841 | 832 | ||
842 | __kuser_memory_barrier: @ 0xffff0fa0 | 833 | __kuser_memory_barrier: @ 0xffff0fa0 |
843 | smp_dmb | 834 | smp_dmb arm |
844 | usr_ret lr | 835 | usr_ret lr |
845 | 836 | ||
846 | .align 5 | 837 | .align 5 |
@@ -909,7 +900,7 @@ __kuser_cmpxchg: @ 0xffff0fc0 | |||
909 | * A special ghost syscall is used for that (see traps.c). | 900 | * A special ghost syscall is used for that (see traps.c). |
910 | */ | 901 | */ |
911 | stmfd sp!, {r7, lr} | 902 | stmfd sp!, {r7, lr} |
912 | ldr r7, =1f @ it's 20 bits | 903 | ldr r7, 1f @ it's 20 bits |
913 | swi __ARM_NR_cmpxchg | 904 | swi __ARM_NR_cmpxchg |
914 | ldmfd sp!, {r7, pc} | 905 | ldmfd sp!, {r7, pc} |
915 | 1: .word __ARM_NR_cmpxchg | 906 | 1: .word __ARM_NR_cmpxchg |
@@ -957,7 +948,7 @@ kuser_cmpxchg_fixup: | |||
957 | 948 | ||
958 | #else | 949 | #else |
959 | 950 | ||
960 | smp_dmb | 951 | smp_dmb arm |
961 | 1: ldrex r3, [r2] | 952 | 1: ldrex r3, [r2] |
962 | subs r3, r3, r0 | 953 | subs r3, r3, r0 |
963 | strexeq r3, r1, [r2] | 954 | strexeq r3, r1, [r2] |
@@ -965,11 +956,8 @@ kuser_cmpxchg_fixup: | |||
965 | beq 1b | 956 | beq 1b |
966 | rsbs r0, r3, #0 | 957 | rsbs r0, r3, #0 |
967 | /* beware -- each __kuser slot must be 8 instructions max */ | 958 | /* beware -- each __kuser slot must be 8 instructions max */ |
968 | #ifdef CONFIG_SMP | 959 | ALT_SMP(b __kuser_memory_barrier) |
969 | b __kuser_memory_barrier | 960 | ALT_UP(usr_ret lr) |
970 | #else | ||
971 | usr_ret lr | ||
972 | #endif | ||
973 | 961 | ||
974 | #endif | 962 | #endif |
975 | 963 | ||
@@ -1246,3 +1234,9 @@ cr_alignment: | |||
1246 | .space 4 | 1234 | .space 4 |
1247 | cr_no_alignment: | 1235 | cr_no_alignment: |
1248 | .space 4 | 1236 | .space 4 |
1237 | |||
1238 | #ifdef CONFIG_MULTI_IRQ_HANDLER | ||
1239 | .globl handle_arch_irq | ||
1240 | handle_arch_irq: | ||
1241 | .space 4 | ||
1242 | #endif | ||