1da50c9ec09415d4e841ea52659b8040c823c530
[reactos.git] / reactos / boot / freeldr / bootsect / ofw_util.s
1 .section .text
2 prim_strlen:
3 mr %r5,%r3
4 prim_strlen_loop:
5 lbz %r4,0(%r3)
6 cmpi 0,0,%r4,0
7 beq prim_strlen_done
8 addi %r3,%r3,1
9 b prim_strlen_loop
10
11 prim_strlen_done:
12 sub %r3,%r3,%r5
13 blr
14
15 copy_bits:
16 cmp 0,0,%r3,%r4
17 beqlr
18
19 lwz %r6,0(%r3)
20 stw %r6,0(%r5)
21 addi %r3,%r3,4
22 addi %r5,%r5,4
23 b copy_bits
24
25 ofw_print_string:
26 /* Reserve some stack space */
27 subi %r1,%r1,32
28
29 /* Save args */
30 stw %r3,0(%r1)
31
32 /* Save the lr, a scratch register */
33 stw %r8,8(%r1)
34 mflr %r8
35 stw %r8,12(%r1)
36
37 /* Load the package name */
38 lis %r3,0xe00000@ha
39 addi %r3,%r3,ofw_chosen_name - _start
40
41 /* Fire */
42 bl ofw_finddevice
43
44 /* Load up for getprop */
45 stw %r3,16(%r1)
46
47 lis %r4,0xe00000@ha
48 addi %r4,%r4,ofw_stdout_name - _start
49
50 addi %r5,%r1,20
51
52 li %r6,4
53
54 bl ofw_getprop
55
56 /* Measure the string and remember the length */
57 lwz %r3,0(%r1)
58 bl prim_strlen
59 mr %r5,%r3
60
61 lwz %r3,20(%r1)
62 lwz %r4,0(%r1)
63
64 /* Write the string */
65 bl ofw_write
66
67 /* Return */
68 lwz %r8,12(%r1)
69 mtlr %r8
70 lwz %r8,8(%r1)
71
72 addi %r1,%r1,32
73 blr
74
75 /* Print 8 hex digits representing a number in r3 */
76 ofw_print_number:
77 subi %r1,%r1,32
78 stw %r8,0(%r1)
79 mflr %r8
80 stw %r8,4(%r1)
81 stw %r9,8(%r1)
82
83 xor %r9,%r9,%r9
84 stw %r9,12(%r1)
85
86 /* Set up and, devide, shift */
87 mr %r8,%r3
88 lis %r6,0xf0000000@ha
89 lis %r7,0x10000000@ha
90 li %r9,8
91
92 ofw_number_loop:
93 nop
94 cmpi 0,0,%r9,0
95 beq ofw_number_return
96 subi %r9,%r9,1
97
98 /* Body: isolate digit, divide, print */
99 and %r5,%r6,%r8
100 divwu %r4,%r5,%r7
101 srwi %r6,%r6,4
102 srwi %r7,%r7,4
103
104 nop
105
106 cmpi 0,0,%r4,10
107 bge ofw_number_letter
108 addi %r4,%r4,'0'
109 b ofw_number_digit_out
110
111 ofw_number_letter:
112 addi %r4,%r4,'A' - 10
113
114 ofw_number_digit_out:
115 stb %r4,12(%r1)
116 addi %r3,%r1,12
117
118 stw %r6,16(%r1)
119 stw %r7,20(%r1)
120 stw %r8,24(%r1)
121 stw %r9,28(%r1)
122
123 bl ofw_print_string
124
125 lwz %r6,16(%r1)
126 lwz %r7,20(%r1)
127 lwz %r8,24(%r1)
128 lwz %r9,28(%r1)
129
130 b ofw_number_loop
131
132 ofw_number_return:
133 /* Return */
134 lwz %r9,8(%r1)
135 lwz %r8,4(%r1)
136 mtlr %r8
137 lwz %r8,0(%r1)
138 addi %r1,%r1,32
139 blr
140
141 ofw_print_eol:
142 subi %r1,%r1,16
143 stw %r8,0(%r1)
144 mflr %r8
145 stw %r8,4(%r1)
146 li %r4,0x0d0a
147 sth %r4,8(%r1)
148 xor %r4,%r4,%r4
149 sth %r4,10(%r1)
150 addi %r3,%r1,8
151 bl ofw_print_string
152 lwz %r8,4(%r1)
153 mtlr %r8
154 lwz %r8,0(%r1)
155 addi %r1,%r1,16
156 blr
157
158 ofw_print_nothing:
159 subi %r1,%r1,16
160 stw %r8,0(%r1)
161 mflr %r8
162 stw %r8,4(%r1)
163 li %r4,0
164 sth %r4,8(%r1)
165 xor %r4,%r4,%r4
166 sth %r4,10(%r1)
167 addi %r3,%r1,8
168 bl ofw_print_string
169 lwz %r8,4(%r1)
170 mtlr %r8
171 lwz %r8,0(%r1)
172 addi %r1,%r1,16
173 blr
174
175 ofw_print_space:
176 subi %r1,%r1,16
177 stw %r8,0(%r1)
178 mflr %r8
179 stw %r8,4(%r1)
180 li %r4,0x2000
181 sth %r4,8(%r1)
182 xor %r4,%r4,%r4
183 sth %r4,10(%r1)
184 addi %r3,%r1,8
185 bl ofw_print_string
186 lwz %r8,4(%r1)
187 mtlr %r8
188 lwz %r8,0(%r1)
189 addi %r1,%r1,16
190 blr
191
192 ofw_dumpregs:
193 /* Construct ofw exit call */
194 subi %r1,%r1,0xa0
195
196 stw %r0,0(%r1)
197 stw %r1,4(%r1)
198 stw %r2,8(%r1)
199 stw %r3,12(%r1)
200
201 stw %r4,16(%r1)
202 stw %r5,20(%r1)
203 stw %r6,24(%r1)
204 stw %r7,28(%r1)
205
206 stw %r8,32(%r1)
207 stw %r9,36(%r1)
208 stw %r10,40(%r1)
209 stw %r11,44(%r1)
210
211 stw %r12,48(%r1)
212 stw %r13,52(%r1)
213 stw %r14,56(%r1)
214 stw %r15,60(%r1)
215
216 stw %r16,64(%r1)
217 stw %r17,68(%r1)
218 stw %r18,72(%r1)
219 stw %r19,76(%r1)
220
221 stw %r20,80(%r1)
222 stw %r21,84(%r1)
223 stw %r22,88(%r1)
224 stw %r23,92(%r1)
225
226 stw %r24,96(%r1)
227 stw %r25,100(%r1)
228 stw %r26,104(%r1)
229 stw %r27,108(%r1)
230
231 stw %r28,112(%r1)
232 stw %r29,116(%r1)
233 stw %r30,120(%r1)
234 stw %r31,124(%r1)
235
236 mflr %r0
237 stw %r0,128(%r1)
238 mfcr %r0
239 stw %r0,132(%r1)
240 mfctr %r0
241 stw %r0,136(%r1)
242 mfmsr %r0
243 stw %r0,140(%r1)
244
245 /* Count at zero */
246 xor %r0,%r0,%r0
247 stw %r0,144(%r1)
248 mr %r3,%r1
249 stw %r3,148(%r1)
250
251 /* Body, print the regname, then the register */
252 ofw_register_loop:
253 lwz %r3,144(%r1)
254 cmpi 0,0,%r3,32
255 beq ofw_register_special
256 lis %r3,0xe00000@ha
257 addi %r3,%r3,freeldr_reg_init - _start
258 bl ofw_print_string
259 lwz %r3,144(%r1)
260 bl ofw_print_number
261 bl ofw_print_space
262 lwz %r3,144(%r1)
263 mulli %r3,%r3,4
264 add %r3,%r1,%r3
265 lwz %r3,0(%r3)
266 stw %r3,152(%r1)
267 bl ofw_print_number
268 lwz %r3,144(%r1)
269 addi %r3,%r3,1
270 stw %r3,144(%r1)
271
272 bl ofw_print_space
273
274 lis %r3,0xe00000@ha
275 addi %r3,%r3,freeldr_reg_init - _start
276 bl ofw_print_string
277 lwz %r3,144(%r1)
278 bl ofw_print_number
279 bl ofw_print_space
280 lwz %r3,144(%r1)
281 mulli %r3,%r3,4
282 add %r3,%r1,%r3
283 lwz %r3,0(%r3)
284 stw %r3,152(%r1)
285 bl ofw_print_number
286 lwz %r3,144(%r1)
287 addi %r3,%r3,1
288 stw %r3,144(%r1)
289
290 b done_dump
291
292 dump_optional:
293 bl ofw_print_space
294 bl ofw_print_space
295 lwz %r3,152(%r1)
296 lwz %r3,0(%r3)
297 bl ofw_print_number
298 bl ofw_print_space
299 lwz %r3,152(%r1)
300 lwz %r3,4(%r3)
301 bl ofw_print_number
302 bl ofw_print_space
303 lwz %r3,152(%r1)
304 lwz %r3,8(%r3)
305 bl ofw_print_number
306 bl ofw_print_space
307 lwz %r3,152(%r1)
308 lwz %r3,12(%r3)
309 bl ofw_print_number
310 bl ofw_print_space
311 done_dump:
312 bl ofw_print_eol
313 b ofw_register_loop
314
315 ofw_register_special:
316 /* LR */
317 lis %r3,0xe00000@ha
318 addi %r3,%r3,freeldr_reg_lr - _start
319 bl ofw_print_string
320 bl ofw_print_space
321 lwz %r3,128(%r1)
322 bl ofw_print_number
323 bl ofw_print_eol
324
325 /* CR */
326 lis %r3,0xe00000@ha
327 addi %r3,%r3,freeldr_reg_cr - _start
328 bl ofw_print_string
329 bl ofw_print_space
330 lwz %r3,132(%r1)
331 bl ofw_print_number
332 bl ofw_print_eol
333
334 /* CTR */
335 lis %r3,0xe00000@ha
336 addi %r3,%r3,freeldr_reg_ctr - _start
337 bl ofw_print_string
338 bl ofw_print_space
339 lwz %r3,136(%r1)
340 bl ofw_print_number
341 bl ofw_print_eol
342
343 /* MSR */
344 lis %r3,0xe00000@ha
345 addi %r3,%r3,freeldr_reg_msr - _start
346 bl ofw_print_string
347 bl ofw_print_space
348 lwz %r3,140(%r1)
349 bl ofw_print_number
350 bl ofw_print_eol
351
352 /* Return */
353 lwz %r0,128(%r1)
354 mtlr %r0
355
356 lwz %r0,0(%r1)
357 lwz %r2,8(%r1)
358 lwz %r3,12(%r1)
359
360 lwz %r4,16(%r1)
361 lwz %r5,20(%r1)
362 lwz %r6,24(%r1)
363 lwz %r7,28(%r1)
364
365 addi %r1,%r1,0xa0
366
367 blr
368