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
|
/* SPDX-License-Identifier: MIT */
#include "soc.h"
#define UTRSTAT 0x010
#define UTXH 0x020
.extern _start_c
.extern _stack_bot
.extern _v_sp0_sync
.extern _v_sp0_irq
.extern _v_sp0_fiq
.extern _v_sp0_serr
.extern _reset_stack
.extern _cpu_reset_c
.extern wdt_reboot
.section .init, "ax"
.align 11
.globl _vectors_start
_vectors_start:
mov x9, '0'
b cpu_reset
.align 7
mov x9, '1'
b exc_unk
.align 7
mov x9, '2'
b exc_unk
.align 7
mov x9, '3'
b exc_unk
.align 7
b _v_sp0_sync
.align 7
b _v_sp0_irq
.align 7
b _v_sp0_fiq
.align 7
b _v_sp0_serr
.align 7
b _v_sp0_sync
.align 7
b _v_sp0_irq
.align 7
b _v_sp0_fiq
.align 7
b _v_sp0_serr
.align 7
mov x9, 'p'
b exc_unk
.align 7
mov x9, 'q'
b exc_unk
.align 7
mov x9, 'r'
b exc_unk
.align 7
mov x9, 's'
b exc_unk
.align 7
.globl _start
.type _start, @function
_start:
mov x19, x0
mov w0, 'm'
bl debug_putc
adrp x1, _stack_bot
mov sp, x1
mov w0, '1'
bl debug_putc
ldr x2, [sp, #-8]
mov w0, 'n'
bl debug_putc
adrp x0, _base
mov x20, x0
adrp x1, _rela_start
add x1, x1, :lo12:_rela_start
adrp x2, _rela_end
add x2, x2, :lo12:_rela_end
bl apply_rela
mov w0, '1'
bl debug_putc
mov w0, 0xd /* '\r', clang compat */
bl debug_putc
mov w0, '\n'
bl debug_putc
mov x0, x19
mov x1, x20
bl _start_c
b .
.globl exc_unk
.type exc_unk, @function
exc_unk:
mov w0, 0xd /* '\r', clang compat */
bl debug_putc
mov w0, '\n'
bl debug_putc
mov w0, '!'
bl debug_putc
mov w0, 'E'
bl debug_putc
mov w0, 'x'
bl debug_putc
mov w0, 'C'
bl debug_putc
mov w0, ':'
bl debug_putc
mov w0, w9
bl debug_putc
mov w0, '!'
bl debug_putc
mov w0, 0xd /* '\r', clang compat */
bl debug_putc
mov w0, '\n'
bl debug_putc
b reboot
.globl cpu_reset
.type cpu_reset, @function
cpu_reset:
mov w0, 'O'
bl debug_putc
adrp x1, _reset_stack
add x1, x1, :lo12:_reset_stack
ldr x1, [x1]
mov sp, x1
ldr x2, [sp, #-8]
mov w0, 'K'
bl debug_putc
mov x0, sp
bl _cpu_reset_c
b .
.globl debug_putc
.type debug_putc, @function
debug_putc:
#ifdef EARLY_UART_BASE
ldr x1, =EARLY_UART_BASE
1:
ldr w2, [x1, UTRSTAT]
tst w2, #2
beq 1b
str w0, [x1, UTXH]
#endif
ret
.globl reboot
.type reboot, @function
reboot:
mrs x0, CurrentEL
cmp x0, #8
beq 1f
hvc #0
1:
bl wdt_reboot
b .
.pool
|