1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
/**
* @file
*
* @brief Boot and system start code.
*/
/*
* Copyright (c) 2008
* Embedded Brains GmbH
* Obere Lagerstr. 30
* D-82178 Puchheim
* Germany
* rtems@embedded-brains.de
*
* The license and distribution terms for this file may be found in the file
* LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
*/
#include <bsp/linker-symbols.h>
#include <bsp/start.h>
/* External symbols */
.extern bsp_reset
.extern boot_card
/* Global symbols */
.globl start
.globl SWI_Handler
/* Program Status Register definitions */
.equ PSR_MODE_USR, 0x10
.equ PSR_MODE_FIQ, 0x11
.equ PSR_MODE_IRQ, 0x12
.equ PSR_MODE_SVC, 0x13
.equ PSR_MODE_ABT, 0x17
.equ PSR_MODE_UNDEF, 0x1b
.equ PSR_MODE_SYS, 0x1f
.equ PSR_I, 0x80
.equ PSR_F, 0x40
.equ PSR_T, 0x20
.arm
.section ".bsp_start", "x"
/*
* This is the exception vector table and the pointers to the default
* exceptions handlers.
*/
vector_block:
ldr pc, handler_addr_reset
ldr pc, handler_addr_undef
ldr pc, handler_addr_swi
ldr pc, handler_addr_prefetch
ldr pc, handler_addr_abort
/* Program signature checked by boot loader */
.word 0xb8a06f58
ldr pc, handler_addr_irq
ldr pc, handler_addr_fiq
handler_addr_reset:
.word start
handler_addr_undef:
.word twiddle
handler_addr_swi:
.word twiddle
handler_addr_prefetch:
.word twiddle
handler_addr_abort:
.word twiddle
handler_addr_reserved:
.word twiddle
handler_addr_irq:
.word twiddle
handler_addr_fiq:
.word twiddle
/* Start entry */
start:
/*
* We do not save the context since we do not return to the boot
* loader.
*/
/*
* Set SVC mode, disable interrupts and enable ARM instructions.
*/
mov r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
msr cpsr, r0
/* Initialize stack pointer registers for the various modes */
/* Enter IRQ mode and set up the IRQ stack pointer */
mov r0, #(PSR_MODE_IRQ | PSR_I | PSR_F)
msr cpsr, r0
ldr sp, =bsp_stack_irq_end
/* Enter FIQ mode and set up the FIQ stack pointer */
mov r0, #(PSR_MODE_FIQ | PSR_I | PSR_F)
msr cpsr, r0
ldr sp, =bsp_stack_fiq_end
/* Enter ABT mode and set up the ABT stack pointer */
mov r0, #(PSR_MODE_ABT | PSR_I | PSR_F)
msr cpsr, r0
ldr sp, =bsp_stack_abt_end
/* Enter UNDEF mode and set up the UNDEF stack pointer */
mov r0, #(PSR_MODE_UNDEF | PSR_I | PSR_F)
msr cpsr, r0
ldr sp, =bsp_stack_undef_end
/* Enter SVC mode and set up the SVC stack pointer */
mov r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
msr cpsr, r0
ldr sp, =bsp_stack_svc_end
/* Stay in SVC mode */
/* Brach to start hook 0 */
#ifdef __thumb__
ldr r3, =bsp_start_hook_0
mov lr, pc
bx r3
.thumb
bx pc
nop
.arm
#else
bl bsp_start_hook_0
#endif
/*
* Initialize the exception vectors. This includes the exceptions
* vectors and the pointers to the default exception handlers.
*/
ldr r0, =bsp_section_vector_begin
adr r1, vector_block
ldmia r1!, {r2-r9}
stmia r0!, {r2-r9}
ldmia r1!, {r2-r9}
stmia r0!, {r2-r9}
/* Brach to start hook 1 */
#ifdef __thumb__
ldr r3, =bsp_start_hook_1
mov lr, pc
bx r3
.thumb
bx pc
nop
.arm
#else
bl bsp_start_hook_1
#endif
/* Brach to boot card */
mov r0, #0
#ifdef __thumb__
ldr r3, =boot_card
mov lr, pc
bx r3
.thumb
bx pc
nop
.arm
#else
bl boot_card
#endif
/* Branch to reset function */
#ifdef __thumb__
ldr r3, =bsp_reset
mov lr, pc
bx r3
.thumb
bx pc
nop
.arm
#else
bl bsp_reset
#endif
/* Spin forever */
SWI_Handler:
twiddle:
b twiddle
|