enhanced linker script and startup
[my-code/arm.git] / betty / startup.s
1 #
2 # startup.s - starup code for the lpc2220
3 #
4 # author: hackbard@hackdaworld.org
5 #
6
7 #
8 # some definitions
9 #
10
11 # sram
12
13 .equ    sram_size,      (64*1024)
14 .equ    sram_addr,      0x40000000
15 .equ    sram_top,       (sram_addr+sram_size-4)
16
17 # stack
18
19 .equ    stack_size,     (4*1024)
20 .equ    stack_top,      sram_top
21 .equ    stack_limit,    (sram_top-stack_size)
22
23 .equ    stack_size_fiq,         64
24 .equ    stack_size_irq,         256
25 .equ    stack_size_supervisor,  64
26 .equ    stack_size_abort,       64
27 .equ    stack_size_undefined,   64
28 .equ    stack_size_system,      1024
29
30 # arm modes - control bits of the program status register
31 # ref: chapter 2.8, arm7tdmi-s technical reference manual
32
33 .equ    mode_user,              0x10
34 .equ    mode_fiq,               0x11
35 .equ    mode_irq,               0x12
36 .equ    mode_supervisor,        0x13
37 .equ    mode_abort,             0x17
38 .equ    mode_undefined,         0x1b
39 .equ    mode_system,            0x1f
40
41 .equ    fiq_disable,    0x40
42 .equ    irq_disable,    0x80
43
44 #
45 # the startup code
46 #
47
48 .text
49 .arm
50
51         # exception handling must go to the very beginning
52
53         b handler_reset
54         b handler_undef_instruction
55         b handler_soft_ir
56         b handler_prefetch_abort
57         b handler_data_abort
58         nop
59         b handler_irq
60         b handler_fiq
61
62         handler_undef_instruction: .word interrupt_handler_undef_instruction
63         handler_soft_ir: .word interrupt_handler_soft_ir
64         handler_prefetch_abort: .word interrupt_handler_prefetch_abort
65         handler_data_abort: .word interrupt_handler_data_abort
66         handler_irq: .word interrupt_handler_irq
67         handler_fiq: .word interrupt_handler_fiq
68
69         # reset handling goes here
70
71 handler_reset:
72
73         # init stack pointer for each mode + set stack limit
74
75         ldr r0, =sram_top
76
77         msr cpsr_c, #mode_undefined|irq_disable|fiq_disable
78         mov sp, r0
79         sub r0, r0, #stack_size_undefined
80
81         msr cpsr_c, #mode_abort|irq_disable|fiq_disable
82         mov sp, r0
83         sub r0, r0, #stack_size_abort
84
85         msr cpsr_c, #mode_fiq|irq_disable|fiq_disable
86         mov sp, r0
87         sub r0, r0, #stack_size_fiq
88
89         msr cpsr_c, #mode_irq|irq_disable|fiq_disable
90         mov sp, r0
91         sub r0, r0, #stack_size_irq
92
93         msr cpsr_c, #mode_supervisor|irq_disable|fiq_disable
94         mov sp, r0
95         sub r0, r0, #stack_size_supervisor
96
97         msr cpsr_c, #mode_system|irq_disable|fiq_disable
98         mov sp, r0
99         sub r0, r0, #stack_size_system
100
101         ldr r0, =stack_limit
102         mov sl, r0
103
104         # copy data section
105
106         ldr r1, =_etext
107         ldr r2, =_data
108         ldr r3, =_edata
109
110 copy_data_loop:
111
112         cmp r2, r3
113         ldrlo r0, [r1], #4
114         strlo r0, [r2], #4
115         blo copy_data_loop
116
117         # jump to c code
118
119         adr lr, loop_forever
120         mov r0, #0
121         mov r1, #0
122         ldr r2, =main
123         bx r2
124
125 loop_forever:
126         b loop_forever
127