-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdtb.s
244 lines (202 loc) · 2.45 KB
/
dtb.s
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
print_dtb:
###############
# DTB PARSING #
###############
#la a1, _start
#PRINT_BIN_64
#j shutdown
# assume x1 is *dtb
mv x1, a1
mv x21, a1
PRINT_BIN_64
li a7, 1
# put magic into a1
li a0, 'm'
ecall
li a0, ' '
ecall
READ_BE_32
li x22, 0xd00dfeed
bne a1, x22, fail
PRINT_BIN_32
addi x1, x1, 4
# a1 = totalsize
li a0, 't'
ecall
li a0, ' '
ecall
READ_BE_32
PRINT_BIN_32
addi x1, x1, 4
# a1 = off_dt_struct
li a0, 'S'
ecall
li a0, ' '
ecall
READ_BE_32
mv x22, a1
PRINT_BIN_32
addi x1, x1, 4
# a1 = off_dt_strings
li a0, 's'
ecall
li a0, ' '
ecall
READ_BE_32
mv x23, a1
PRINT_BIN_32
addi x1, x1, 4
# a1 = off_mem_rsvmap
li a0, 'r'
ecall
li a0, ' '
ecall
READ_BE_32
mv x24, a1
PRINT_BIN_32
addi x1, x1, 4
# a1 = version
li a0, 'v'
ecall
li a0, ' '
ecall
READ_BE_32
PRINT_BIN_32
addi x1, x1, 4
# a1 = last_comp_version
li a0, 'c'
ecall
li a0, ' '
ecall
READ_BE_32
PRINT_BIN_32
addi x1, x1, 4
# a1 = boot_cpuid_phys
li a0, 'i'
ecall
li a0, ' '
ecall
READ_BE_32
PRINT_BIN_32
addi x1, x1, 4
# a1 = size_dt_strings
li a0, 'l'
ecall
li a0, ' '
ecall
READ_BE_32
PRINT_BIN_32
addi x1, x1, 4
# a1 = size_dt_struct
li a0, 'L'
ecall
li a0, ' '
ecall
READ_BE_32
PRINT_BIN_32
addi x1, x1, 4
# x21 = *header
# x22 = off_dt_struct
# x23 = off_dt_strings
# x24 = off_mem_rsvmap
li a0, 'r'
ecall
li a0, 's'
ecall
li a0, 'v'
ecall
li a0, 10
ecall
add x1, x21, x24
print_rsv:
READ_BE_64
mv x25, a1
READ_BE_64
or x26, x25, a1
beqz x26, rsv_end
mv x26, a1
mv a1, x25
PRINT_BIN_64
li a0, ':'
ecall
mv a1, x25
PRINT_BIN_64
addi x1, x1, 16
j print_rsv
rsv_end:
li a0, 's'
ecall
li a0, 't'
ecall
li a0, 'r'
ecall
li a0, 'u'
ecall
li a0, 'c'
ecall
li a0, 't'
ecall
li a0, 10
ecall
add x1, x21, x22
fdt_parse:
READ_BE_32
li x25, 0x1
beq a1, x25, begin_node
li x25, 0x2
beq a1, x25, end_node
li x25, 0x3
beq a1, x25, prop
li x25, 0x4
beq a1, x25, fdt_nop
li x25, 0x9
beq a1, x25, fdt_end
j kernel_panic
begin_node:
addi x1, x1, 4
PRINT_ASCII
li a0, '{'
ecall
li a0, 10
ecall
addi x1, x1, 1
neg x25, x1
andi x25, x25, 3
add x1, x1, x25
j fdt_parse
prop:
addi x1, x1, 4
READ_BE_32
mv x25, a1
addi x1, x1, 4
READ_BE_32
mv x26, x1
add x1, x21, x23
add x1, x1, a1
PRINT_ASCII
mv x1, x26
li a0, 10
ecall
addi x1, x1, 4
beqz x25, prop_loop_end
prop_loop:
lbu a1, (x1)
addi x1, x1, 1
PRINT_BIN_8
addi x25, x25, -1
bnez x25, prop_loop
prop_loop_end:
neg x25, x1
andi x25, x25, 3
add x1, x1, x25
j fdt_parse
end_node:
li a0, '}'
ecall
li a0, 10
ecall
fdt_nop:
addi x1, x1, 4
j fdt_parse
fdt_end:
j boot_start