1 /* Sample initialization file */
\r
5 .extern AT91F_LowLevelInit
\r
13 .extern __stack_end__
\r
16 .extern __data_beg__
\r
17 .extern __data_end__
\r
18 .extern __data+beg_src__
\r
21 .global endless_loop
\r
24 .set UND_STACK_SIZE, 0x00000004
\r
25 .set ABT_STACK_SIZE, 0x00000004
\r
26 .set FIQ_STACK_SIZE, 0x00000004
\r
27 .set IRQ_STACK_SIZE, 0X00000400
\r
28 .set SVC_STACK_SIZE, 0x00000400
\r
30 /* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */
\r
31 .set MODE_USR, 0x10 /* User Mode */
\r
32 .set MODE_FIQ, 0x11 /* FIQ Mode */
\r
33 .set MODE_IRQ, 0x12 /* IRQ Mode */
\r
34 .set MODE_SVC, 0x13 /* Supervisor Mode */
\r
35 .set MODE_ABT, 0x17 /* Abort Mode */
\r
36 .set MODE_UND, 0x1B /* Undefined Mode */
\r
37 .set MODE_SYS, 0x1F /* System Mode */
\r
39 .equ I_BIT, 0x80 /* when I bit is set, IRQ is disabled */
\r
40 .equ F_BIT, 0x40 /* when F bit is set, FIQ is disabled */
\r
47 /* Setup a stack for each mode - note that this only sets up a usable stack
\r
48 for system/user, SWI and IRQ modes. Also each mode is setup with
\r
49 interrupts initially disabled. */
\r
51 msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */
\r
53 sub r0, r0, #UND_STACK_SIZE
\r
54 msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */
\r
56 sub r0, r0, #ABT_STACK_SIZE
\r
57 msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */
\r
59 sub r0, r0, #FIQ_STACK_SIZE
\r
60 msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */
\r
62 sub r0, r0, #IRQ_STACK_SIZE
\r
63 msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */
\r
65 sub r0, r0, #SVC_STACK_SIZE
\r
66 msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* System Mode */
\r
69 /* We want to start in supervisor mode. Operation will switch to system
\r
70 mode when the first task starts. */
\r
71 msr CPSR_c, #MODE_SVC|I_BIT|F_BIT
\r
73 bl AT91F_LowLevelInit
\r
77 mov a2, #0 /* Fill value */
\r
78 mov fp, a2 /* Null frame pointer */
\r
79 mov r7, a2 /* Null frame pointer for Thumb */
\r
81 ldr r1, .LC1 /* Start of memory block */
\r
82 ldr r3, .LC2 /* End of memory block */
\r
83 subs r3, r3, r1 /* Length of block */
\r
94 /* Initialise data. */
\r
96 ldr r1, .LC3 /* Start of memory block */
\r
97 ldr r2, .LC4 /* End of memory block */
\r
99 subs r3, r3, r1 /* Length of block */
\r
110 mov r0, #0 /* no arguments */
\r
111 mov r1, #0 /* no argv either */
\r
129 .word __data_beg_src__
\r
133 .word __stack_end__
\r
136 /* Setup vector table. Note that undf, pabt, dabt, fiq just execute
\r
139 .section .startup,"ax"
\r
143 b _start /* reset - _start */
\r
144 ldr pc, _undf /* undefined - _undf */
\r
145 ldr pc, _swi /* SWI - _swi */
\r
146 ldr pc, _pabt /* program abort - _pabt */
\r
147 ldr pc, _dabt /* data abort - _dabt */
\r
149 ldr pc, [pc,#-0xF20] /* IRQ - read the AIC */
\r
150 ldr pc, _fiq /* FIQ - _fiq */
\r
152 _undf: .word __undf /* undefined */
\r
153 _swi: .word swi_handler /* SWI */
\r
154 _pabt: .word __pabt /* program abort */
\r
155 _dabt: .word __dabt /* data abort */
\r
156 _fiq: .word __fiq /* FIQ */
\r
158 __undf: b . /* undefined */
\r
159 __pabt: b . /* program abort */
\r
160 __dabt: b . /* data abort */
\r
161 __fiq: b . /* FIQ */
\r