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
|
.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_HF
.word _vec_stuck
.word _vec_stuck
.word _vec_UF
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_SVC
.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 r1, =0xe000e000
ldr r0, =0x00070000
str r0, [r1, #0xd24]
ldr r0, =0x80000000
str r0, [r1, #0xd1c]
blx board_setup
ldr r0, =in_main
blx puts
cpsie if
svc 42
.global abort
.thumb_func
abort:
ldr sp, =_main_stack_top
ldr r0, =0x05fa0004 /* reset request */
ldr r1, =0xe000e000
str r0, [r1, #0xd0c] /* AIRCR */
dsb
_stuck:
b _stuck
.global putc
.thumb_func
putc:
ldr r1, =0x4000c000
cmp r0, #'\n'
bne putc_loop
push {r0-r2,lr}
mov r0, #'\r'
blx putc
pop {r0-r2,lr}
putc_loop:
ldr r2, [r1, 0x18]
tst r2, #0x20
bne putc_loop
strb r0, [r1]
bx lr
.global puts
.thumb_func
puts:
push {lr}
mov r3, r0
puts_loop:
ldrb r0, [r3], #1
cmp r0, #0
it eq
popeq {pc}
blx putc
b puts_loop
.thumb_func
_vec_stuck:
mov r0, #'S'
ldr r1, =0x4000c000
strb r0, [r1]
mrs r0, IPSR
strb r0, [r1]
bl abort
.thumb_func
_vec_HF:
ldr r0, =bad_HF
blx puts
b abort
.thumb_func
_vec_UF:
ldr r0, =in_UF
blx puts
b abort
/* omit .thumb_func */
_vec_SVC:
ldr r0, =in_SVC
blx puts
bx lr
in_main:
.string "In Main\n"
bad_HF:
.string "Unexpected HF\n"
in_UF:
.string "In UsageFault\n"
in_SVC:
.string "In SVC, shouldn't be"
.section .bss
.align 4
.global _main_stack_bot
_main_stack_bot:
.skip 0x400
.global _main_stack_top
_main_stack_top:
|