fighting with interrupt vectors
[rpikern] / src / startup.s
1         .extern main
2
3         .section .startup
4         .code 32
5
6         .global startup
7 startup:
8         cpsid if
9
10         @ stop all but one of the cores
11         mrc p15, 0, r0, c0, c0, 5
12         ands r0, r0, #0xff
13         bne exit
14
15         @ detect if we're running in hyp mode, and drop to svc
16         mrs r0, cpsr
17         and r1, r0, #0x1f
18         cmp r1, #0x1a
19         bne hypend
20
21         bic r0, #0x1f
22         orr r0, #0x13
23         @msr spsr_cxsf, r0
24         add r0, pc, #4
25         msr elr_hyp, r0
26         @eret
27         mov pc, r0
28 hypend:
29
30         @ setup initial stacks, allow 4k stack for IRQs
31         @mov r0, #0x12  @ switch to IRQ mode
32         @msr cpsr, r0
33         @ldr sp, =_stacktop
34         @mov r0, #0x13  @ switch to supervisor mode
35         @msr cpsr, r0
36         ldr sp, =_stacktop - 4096
37
38         @ clear bss
39         ldr r0, =_bss_start
40         ldr r1, =_bss_size
41         cmp r1, #0
42         beq 1f          @ 0-sized bss, skip clear
43         mov r2, #0
44 0:      str r2, [r0], #4
45         subs r1, #4
46         bne 0b
47 1:
48         blx main
49
50         .global exit
51 exit:   wfe
52         b exit
53
54 @ vi:set filetype=armasm: