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#include <asm-offsets.h>
34#include <config.h>
35#include <version.h>
36
37
38#include <./configs/omap1510.h>
39#endif
40
41
42
43
44
45
46
47
48
49
50.globl _start
51_start: b reset
52 ldr pc, _undefined_instruction
53 ldr pc, _software_interrupt
54 ldr pc, _prefetch_abort
55 ldr pc, _data_abort
56 ldr pc, _not_used
57 ldr pc, _irq
58 ldr pc, _fiq
59
60_undefined_instruction: .word undefined_instruction
61_software_interrupt: .word software_interrupt
62_prefetch_abort: .word prefetch_abort
63_data_abort: .word data_abort
64_not_used: .word not_used
65_irq: .word irq
66_fiq: .word fiq
67
68 .balignl 16,0xdeadbeef
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84.globl _TEXT_BASE
85_TEXT_BASE:
86 .word CONFIG_SYS_TEXT_BASE
87
88
89
90
91
92
93
94.globl _bss_start_ofs
95_bss_start_ofs:
96 .word __bss_start - _start
97
98.globl _bss_end_ofs
99_bss_end_ofs:
100 .word __bss_end__ - _start
101
102.globl _end_ofs
103_end_ofs:
104 .word _end - _start
105
106#ifdef CONFIG_USE_IRQ
107
108.globl IRQ_STACK_START
109IRQ_STACK_START:
110 .word 0x0badc0de
111
112
113.globl FIQ_STACK_START
114FIQ_STACK_START:
115 .word 0x0badc0de
116#endif
117
118
119.globl IRQ_STACK_START_IN
120IRQ_STACK_START_IN:
121 .word 0x0badc0de
122
123
124
125
126
127reset:
128
129
130
131 mrs r0,cpsr
132 bic r0,r0,
133 orr r0,r0,
134 msr cpsr,r0
135
136
137
138
139 mov r1,
140 mcr p15, 0, r1, c15, c1, 0
141
142
143
144
145 mov r1,
146 ldr r0, =WDTIM_MODE
147 strh r1, [r0]
148 mov r1,
149 strh r1, [r0]
150
151
152
153
154 mov r1,
155 ldr r0, =REG_IHL1_MIR
156 str r1, [r0]
157 ldr r0, =REG_IHL2_MIR
158 str r1, [r0]
159
160
161
162
163 ldr r0, =CK_DPLL1
164 mov r1,
165 strh r1, [r0]
166poll1:
167 ldrh r1, [r0]
168 ands r1, r1,
169 beq poll1
170
171
172
173
174
175#ifndef CONFIG_SKIP_LOWLEVEL_INIT
176 bl cpu_init_crit
177#endif
178
179
180call_board_init_f:
181 ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
182 bic sp, sp,
183 ldr r0,=0x00000000
184 bl board_init_f
185
186
187
188
189
190
191
192
193
194
195 .globl relocate_code
196relocate_code:
197 mov r4, r0
198 mov r5, r1
199 mov r6, r2
200
201
202stack_setup:
203 mov sp, r4
204
205 adr r0, _start
206 cmp r0, r6
207 beq clear_bss
208 mov r1, r6
209 ldr r3, _bss_start_ofs
210 add r2, r0, r3
211
212copy_loop:
213 ldmia r0!, {r9-r10}
214 stmia r1!, {r9-r10}
215 cmp r0, r2
216 blo copy_loop
217
218#ifndef CONFIG_SPL_BUILD
219
220
221
222 ldr r0, _TEXT_BASE
223 sub r9, r6, r0
224 ldr r10, _dynsym_start_ofs
225 add r10, r10, r0
226 ldr r2, _rel_dyn_start_ofs
227 add r2, r2, r0
228 ldr r3, _rel_dyn_end_ofs
229 add r3, r3, r0
230fixloop:
231 ldr r0, [r2]
232 add r0, r0, r9
233 ldr r1, [r2,
234 and r7, r1,
235 cmp r7,
236 beq fixrel
237 cmp r7,
238 beq fixabs
239
240 b fixnext
241fixabs:
242
243 mov r1, r1, LSR
244 add r1, r10, r1
245 ldr r1, [r1,
246 add r1, r1, r9
247 b fixnext
248fixrel:
249
250 ldr r1, [r0]
251 add r1, r1, r9
252fixnext:
253 str r1, [r0]
254 add r2, r2,
255 cmp r2, r3
256 blo fixloop
257#endif
258
259clear_bss:
260#ifndef CONFIG_SPL_BUILD
261 ldr r0, _bss_start_ofs
262 ldr r1, _bss_end_ofs
263 mov r4, r6
264 add r0, r0, r4
265 add r1, r1, r4
266 mov r2,
267
268clbss_l:str r2, [r0]
269 add r0, r0,
270 cmp r0, r1
271 bne clbss_l
272
273 bl coloured_LED_init
274 bl red_led_on
275#endif
276
277
278
279
280
281#ifdef CONFIG_NAND_SPL
282 ldr r0, _nand_boot_ofs
283 mov pc, r0
284
285_nand_boot_ofs:
286 .word nand_boot
287#else
288 ldr r0, _board_init_r_ofs
289 adr r1, _start
290 add lr, r0, r1
291 add lr, lr, r9
292
293 mov r0, r5
294 mov r1, r6
295
296 mov pc, lr
297
298_board_init_r_ofs:
299 .word board_init_r - _start
300#endif
301
302_rel_dyn_start_ofs:
303 .word __rel_dyn_start - _start
304_rel_dyn_end_ofs:
305 .word __rel_dyn_end - _start
306_dynsym_start_ofs:
307 .word __dynsym_start - _start
308
309
310
311
312
313
314
315
316
317
318
319
320
321cpu_init_crit:
322
323
324
325 mov r0,
326 mcr p15, 0, r0, c7, c7, 0
327 mcr p15, 0, r0, c8, c7, 0
328
329
330
331
332 mrc p15, 0, r0, c1, c0, 0
333 bic r0, r0,
334 bic r0, r0,
335 orr r0, r0,
336 orr r0, r0,
337 mcr p15, 0, r0, c1, c0, 0
338
339
340
341
342 mov ip, lr
343 bl lowlevel_init
344 mov lr, ip
345 mov pc, lr
346
347
348
349
350
351
352
353
354@
355@ IRQ stack frame.
356@
357#define S_FRAME_SIZE 72
358
359#define S_OLD_R0 68
360#define S_PSR 64
361#define S_PC 60
362#define S_LR 56
363#define S_SP 52
364
365#define S_IP 48
366#define S_FP 44
367#define S_R10 40
368#define S_R9 36
369#define S_R8 32
370#define S_R7 28
371#define S_R6 24
372#define S_R5 20
373#define S_R4 16
374#define S_R3 12
375#define S_R2 8
376#define S_R1 4
377#define S_R0 0
378
379#define MODE_SVC 0x13
380#define I_BIT 0x80
381
382
383
384
385
386
387 .macro bad_save_user_regs
388 sub sp, sp,
389 stmia sp, {r0 - r12} @ Save user registers (now in svc mode) r0-r12
390
391 ldr r2, IRQ_STACK_START_IN
392 ldmia r2, {r2 - r3} @ get values for "aborted" pc and cpsr (into parm regs)
393 add r0, sp,
394
395 add r5, sp,
396 mov r1, lr
397 stmia r5, {r0 - r3} @ save sp_SVC, lr_SVC, pc, cpsr
398 mov r0, sp @ save current stack into r0 (param register)
399 .endm
400
401 .macro irq_save_user_regs
402 sub sp, sp,
403 stmia sp, {r0 - r12} @ Calling r0-r12
404 add r8, sp,
405 stmdb r8, {sp, lr}^ @ Calling SP, LR
406 str lr, [r8,
407 mrs r6, spsr
408 str r6, [r8,
409 str r0, [r8,
410 mov r0, sp
411 .endm
412
413 .macro irq_restore_user_regs
414 ldmia sp, {r0 - lr}^ @ Calling r0 - lr
415 mov r0, r0
416 ldr lr, [sp,
417 add sp, sp,
418 subs pc, lr,
419 .endm
420
421 .macro get_bad_stack
422 ldr r13, IRQ_STACK_START_IN
423
424 str lr, [r13] @ save caller lr in position 0 of saved stack
425 mrs lr, spsr @ get the spsr
426 str lr, [r13,
427
428 mov r13,
429 @ msr spsr_c, r13
430 msr spsr, r13 @ switch modes, make sure moves will execute
431 mov lr, pc @ capture return pc
432 movs pc, lr @ jump to next instruction & switch modes.
433 .endm
434
435 .macro get_irq_stack @ setup IRQ stack
436 ldr sp, IRQ_STACK_START
437 .endm
438
439 .macro get_fiq_stack @ setup FIQ stack
440 ldr sp, FIQ_STACK_START
441 .endm
442
443
444
445
446 .align 5
447undefined_instruction:
448 get_bad_stack
449 bad_save_user_regs
450 bl do_undefined_instruction
451
452 .align 5
453software_interrupt:
454 get_bad_stack
455 bad_save_user_regs
456 bl do_software_interrupt
457
458 .align 5
459prefetch_abort:
460 get_bad_stack
461 bad_save_user_regs
462 bl do_prefetch_abort
463
464 .align 5
465data_abort:
466 get_bad_stack
467 bad_save_user_regs
468 bl do_data_abort
469
470 .align 5
471not_used:
472 get_bad_stack
473 bad_save_user_regs
474 bl do_not_used
475
476#ifdef CONFIG_USE_IRQ
477
478 .align 5
479irq:
480 get_irq_stack
481 irq_save_user_regs
482 bl do_irq
483 irq_restore_user_regs
484
485 .align 5
486fiq:
487 get_fiq_stack
488
489 irq_save_user_regs
490 bl do_fiq
491 irq_restore_user_regs
492
493#else
494
495 .align 5
496irq:
497 get_bad_stack
498 bad_save_user_regs
499 bl do_irq
500
501 .align 5
502fiq:
503 get_bad_stack
504 bad_save_user_regs
505 bl do_fiq
506
507#endif
508
509 .align 5
510.globl reset_cpu
511reset_cpu:
512 ldr r1, rstctl1
513 mov r3,
514 strh r3, [r1]
515 mov r0, r0
516_loop_forever:
517 b _loop_forever
518rstctl1:
519 .word 0xfffece10
520