Redid arm/exceptions.S.
[tart.git] / arch / arm / start.S
blobbd857d60d22fd6af185b19df68ede85e866c0f6c
1 /*
2  * ARM entry point, and initialization code.
3  */
5 #include <asm.h>
6 #include <arm.h>
8 #if ARMV < 6
9     #error ARM versions below ARMv6 not supported yet.
10 #endif
12 #define STACK_SIZE     0x1000
14 // Text section.
15 .section ".text.boot"
18  * Entry point for the kernel.
19  *     r15 -> entry point.
20  *     r0  -> 0x00000000.
21  *     r1  -> machine type number.
22  *     r2  -> start address of ATAGS.
23  */
24 GLOBAL(_start)
25 FUNCTION(_start)
27 # Since these can only branch to 32MiB from instruction, put the address
28 # of the handlers nearby, and copy them too.
29 .vectors:
30     # Execution starts here too, so we set this to "Start."
31     ldr pc, reset
32     ldr pc, ud
33     ldr pc, swi
34     ldr pc, prefetch_abort
35     ldr pc, data_abort
36     ldr pc, unused
37     ldr pc, irq
38     ldr pc, fiq
40 reset:              .word start
41 ud:                 .word exception_ud
42 swi:                .word exception_swi
43 prefetch_abort:     .word exception_prefetch_abort
44 data_abort:         .word exception_data_abort
45 unused:             .word exception_unused
46 irq:                .word exception_irq
47 fiq:                .word exception_fiq
49 start:
50     // Move vectors to 0x00000000.
51     mov r3, r0
52     ldr r4, =.vectors
53     
54     // 64 bytes.
55     ldmia r4!, {r5-r12}
56     stmia r3!, {r5-r12}
58     ldmia r4!, {r5-r12}
59     stmia r3!, {r5-r12}
61     .stack_init:
62 #if ARMV >= 6
63         // Switch to FIQ mode. 
64         cpsid if, #FIQ_MODE
65         ldr sp, =fiq_stack + (STACK_SIZE)
67         cpsid if, #IRQ_MODE
68         ldr sp, =abort_stack + (STACK_SIZE)
70         cpsid if, #ABT_MODE
71         ldr sp, =abort_stack + (STACK_SIZE)
73         cpsid if, #UND_MODE
74         ldr sp, =abort_stack + (STACK_SIZE)
76         cpsid if, #SYS_MODE
77         ldr sp, =abort_stack + (STACK_SIZE)
79         cpsid if, #SVC_MODE
80         ldr sp, =abort_stack + (STACK_SIZE)
81 #endif
83     // Clear out bss.
84     ldr r3, =bss_start
85     ldr r4, =bss_end
87     .bss_zero:
88         // If lower than end, continue.
89         cmp r3, r4
90         strlt r0, [r3], #4
91         blt .bss_zero
93     // Jump to init().
94     blx init
96     // DO NOT RETURN HERE.
97     b .
99 // The stacks in the BSS section.
100 .bss
102 // Stack for abort.
103 DATA(abort_stack)
104     .skip STACK_SIZE
106 // Stack for FIQ.
107 DATA(fiq_stack)
108     .skip STACK_SIZE