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
|
.thumb
.syntax unified
.section .text.start
.global _boot_reset
.align 7
_boot_reset:
.word _main_stack_top
.word _start /* reset */
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.section .data
.global run_table
.align 7
run_table:
.word _main_stack_top
.word _vec_stuck /* reset */
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.section .text
.global _start
.thumb_func
_start:
/* zero bss */
mov r0, #0
ldr r1, =__bss_start
ldr r2, =__bss_end
_bss_loop:
cmp r1, r2
itt ne
strbne r0, [r1], 1
bne _bss_loop
/* copy data */
ldr r1, =__data_start
ldr r2, =__data_end
ldr r3, =__data_load
_data_loop:
cmp r1, r2
ittt ne
ldrbne r0, [r3], 1
strbne r0, [r1], 1
bne _data_loop
ldr r0, =run_table
ldr r1, =0xe000e000
str r0, [r1, #0xd08] /* VTOR */
mov r0, _proc_stack_top
msr PSP, r0
blx board_setup
blx main
/* fall through to abort() */
.global abort
.thumb_func
abort:
cpsid if
ldr sp, =_main_stack_top
ldr r0, =0x05fa0004 /* reset request */
ldr r1, =0xe000e000
str r0, [r1, #0xd0c] /* AIRCR */
dsb
_stuck:
b _stuck
.thumb_func
_vec_stuck:
mov r0, #'S'
ldr r1, =0x4000c000
str r0, [r1]
mrs r0, IPSR
str r0, [r1]
bl abort
.section .bss
.align 4
.global _main_stack_bot
_main_stack_bot:
.skip 0x400
.global _main_stack_top
_main_stack_top:
.global _proc_stack_bot
_proc_stack_bot:
.skip 0x400
.global _proc_stack_top
_proc_stack_top:
|