]>
Commit | Line | Data |
---|---|---|
1f0e1264 PS |
1 | |
2 | .set SYSTEM_MODE, 0x1F | |
3 | .set UNDEFINED_MODE, 0x1B | |
4 | .set ABORT_MODE, 0x17 | |
5 | .set SUPERVISOR_MODE, 0x13 | |
6 | .set IRQ_MODE, 0x12 | |
7 | .set FIQ_MODE, 0x11 | |
8 | .set USER_MODE, 0x10 | |
9 | ||
10 | .text | |
11 | .arm | |
12 | .org 0 | |
13 | .align 0 | |
14 | ||
15 | # exception vectors | |
16 | ||
17 | b reset_handler | |
18 | ldr pc, undefined_instruction_handler_addr | |
19 | ldr pc, software_interrupt_handler_addr | |
20 | ldr pc, prefetch_abort_handler_addr | |
21 | ldr pc, data_abort_handler_addr | |
22 | ldr pc, endless_loop /* ARM-reserved vector */ | |
23 | ldr pc, irq_handler_addr | |
24 | ldr pc, fiq_handler_addr | |
25 | ||
26 | undefined_instruction_handler_addr: .long undefined_instruction_handler | |
27 | software_interrupt_handler_addr: .long software_interrupt_handler | |
28 | prefetch_abort_handler_addr: .long prefetch_abort_handler | |
29 | data_abort_handler_addr: .long data_abort_handler | |
30 | irq_handler_addr: .long irq_handler | |
31 | fiq_handler_addr: .long fiq_handler | |
32 | ||
33 | .global reset_handler | |
34 | reset_handler: | |
35 | ||
36 | msr cpsr_c, #UNDEFINED_MODE | |
37 | ldr sp, =__UNDEFINED_SP__ | |
38 | msr cpsr_c, #ABORT_MODE | |
39 | ldr sp, =__ABORT_SP__ | |
40 | msr cpsr_c, #IRQ_MODE | |
41 | ldr sp, =__IRQ_SP__ | |
42 | msr cpsr_c, #FIQ_MODE | |
43 | ldr sp, =__FIQ_SP__ | |
44 | msr cpsr_c, #SUPERVISOR_MODE | |
45 | ldr sp, =__SUPERVISOR_SP__ | |
46 | ||
47 | # setup a default stack limit (when compiled with "-mapcs-stack-check"). | |
48 | # sub sl, sp, #__USER_STACK_SIZE__ | |
49 | ||
50 | # relocate .data(rw) section (copy from FLASH to RAM). | |
51 | ||
52 | ldr r1, =__text_end__ | |
53 | ldr r2, =__data_start__ | |
54 | ldr r3, =__data_end__ | |
55 | ||
56 | reset_handler_L01: | |
57 | ||
58 | cmp r2, r3 | |
59 | ldrlo r0, [r1], #4 | |
60 | strlo r0, [r2], #4 | |
61 | blo reset_handler_L01 | |
62 | ||
63 | # clear .bss(rw) section. | |
64 | ||
65 | mov r0, #0 | |
66 | ldr r1, =__bss_start__ | |
67 | ldr r2, =__bss_end__ | |
68 | ||
69 | reset_handler_L02: | |
70 | ||
71 | cmp r1, r2 | |
72 | strlo r0, [r1], #4 | |
73 | blo reset_handler_L02 | |
74 | ||
75 | # set up arguments to main() and call. | |
76 | ||
77 | mov r0, #0 | |
78 | mov r1, #0 | |
79 | bl main | |
80 | ||
81 | .global endless_loop | |
82 | endless_loop: | |
83 | b endless_loop | |
84 | ||
85 | .end |