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.S74
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
341: 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
449997:
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 )
472ENDPROC(__irq_usr) 462ENDPROC(__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}
9151: .word __ARM_NR_cmpxchg 9061: .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
9611: ldrex r3, [r2] 9521: 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
1247cr_no_alignment: 1235cr_no_alignment:
1248 .space 4 1236 .space 4
1237
1238#ifdef CONFIG_MULTI_IRQ_HANDLER
1239 .globl handle_arch_irq
1240handle_arch_irq:
1241 .space 4
1242#endif