riscoscalls.S revision 1.12 1 /* $NetBSD: riscoscalls.S,v 1.12 2019/01/23 14:49:00 sborrill Exp $ */
2
3 /*-
4 * Copyright (c) 2001 Ben Harris
5 * Copyright (c) 2002 Reinoud Zandijk
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include <machine/asm.h>
32 #include <riscoscalls.h>
33
34 ENTRY(os_writec)
35 mov ip, sp
36 stmfd sp!, {fp, ip, lr, pc}
37 sub fp, ip, #4
38 swi OS_WriteC
39 ldmdb fp, {fp, sp, pc}
40
41 ENTRY(os_new_line)
42 mov ip, sp
43 stmfd sp!, {fp, ip, lr, pc}
44 sub fp, ip, #4
45 swi OS_NewLine
46 ldmdb fp, {fp, sp, pc}
47
48 ENTRY(os_readc)
49 mov ip, sp
50 stmfd sp!, {fp, ip, lr, pc}
51 sub fp, ip, #4
52 swi OS_ReadC
53 ldmdb fp, {fp, sp, pc}
54
55 ENTRY(os_cli)
56 mov ip, sp
57 stmfd sp!, {fp, ip, lr, pc}
58 sub fp, ip, #4
59 swi OS_CLI
60 ldmdb fp, {fp, sp, pc}
61
62 ENTRY(xos_cli)
63 mov ip, sp
64 stmfd sp!, {fp, ip, lr, pc}
65 sub fp, ip, #4
66 swi XOS_CLI
67 movvc r0, #0
68 ldmdb fp, {fp, sp, pc}
69
70 ENTRY(os_byte)
71 mov ip, sp
72 stmfd sp!, {fp, ip, lr, pc}
73 sub fp, ip, #4
74 swi OS_Byte
75 teq r3, #0
76 strne r1, [r3]
77 ldr r3, [fp, #4]
78 teq r3, #0
79 strne r2, [r3]
80 ldmdb fp, {fp, sp, pc}
81
82 ENTRY(osbyte_read)
83 mov ip, sp
84 stmfd sp!, {fp, ip, lr, pc}
85 sub fp, ip, #4
86 mov r1, #0
87 mov r2, #255
88 swi OS_Byte
89 mov r0, r1
90 ldmdb fp, {fp, sp, pc}
91
92 ENTRY(os_word)
93 mov ip, sp
94 stmfd sp!, {fp, ip, lr, pc}
95 sub fp, ip, #4
96 swi OS_Word
97 ldmdb fp, {fp, sp, pc}
98
99 ENTRY(xosargs_read)
100 mov ip, sp
101 stmfd sp!, {fp, ip, lr, pc}
102 sub fp, ip, #4
103 mov r3, r2
104 swi XOS_Args
105 ldmdbvs fp, {fp, sp, pc}
106 teq r3, #0
107 strne r2, [r3]
108 mov r0, #0
109 ldmdb fp, {fp, sp, pc}
110
111 ENTRY(xosargs_set)
112 mov ip, sp
113 stmfd sp!, {fp, ip, lr, pc}
114 sub fp, ip, #4
115 swi XOS_Args
116 movvc r0, #0
117 ldmdb fp, {fp, sp, pc}
118
119 ENTRY(xosgbpb_write)
120 mov ip, sp
121 stmfd sp!, {r4, fp, ip, lr, pc}
122 sub fp, ip, #4
123 mov ip, r3
124 mov r3, r2
125 mov r2, r1
126 mov r1, r0
127 mov r0, #OSGBPB_Write
128 swi XOS_GBPB
129 teq ip, #0
130 strne r3, [ip]
131 movvc r0, #0
132 ldmdb fp, {r4, fp, sp, pc}
133
134 ENTRY(xosgbpb_read)
135 mov ip, sp
136 stmfd sp!, {r4, fp, ip, lr, pc}
137 sub fp, ip, #4
138 mov ip, r3
139 mov r3, r2
140 mov r2, r1
141 mov r1, r0
142 mov r0, #OSGBPB_Read
143 swi XOS_GBPB
144 teq ip, #0
145 strne r3, [ip]
146 movvc r0, #0
147 ldmdb fp, {r4, fp, sp, pc}
148
149 ENTRY(xosfind_close)
150 mov ip, sp
151 stmfd sp!, {fp, ip, lr, pc}
152 sub fp, ip, #4
153 mov r1, r0
154 mov r0, #OSFind_Close
155 swi XOS_Find
156 movvc r0, #0
157 ldmdb fp, {fp, sp, pc}
158
159 ENTRY(xosfind_open)
160 mov ip, sp
161 stmfd sp!, {fp, ip, lr, pc}
162 sub fp, ip, #4
163 swi XOS_Find
164 ldmdbvs fp, {fp, sp, pc}
165 teq r3, #0
166 strne r0, [r3]
167 mov r0, #0
168 ldmdb fp, {fp, sp, pc}
169
170 ENTRY(os_get_env)
171 mov ip, sp
172 stmfd sp!, {r4, fp, ip, lr, pc}
173 sub fp, ip, #4
174 mov r3, r0
175 mov r4, r1
176 swi OS_GetEnv
177 teq r3, #0
178 strne r1, [r3]
179 teq r4, #0
180 strne r2, [r4]
181 ldmdb fp, {r4, fp, sp, pc}
182
183 ENTRY(os_exit)
184 mov ip, sp
185 stmfd sp!, {fp, ip, lr, pc}
186 sub fp, ip, #4
187 mov r2, r1
188 ldr r1, Labex
189 swi OS_Exit
190 ldmdb fp, {fp, sp, pc}
191 Labex:
192 .ascii "ABEX"
193
194 ENTRY(os_int_off)
195 mov ip, sp
196 stmfd sp!, {fp, ip, lr, pc}
197 sub fp, ip, #4
198 swi OS_IntOff
199 ldmdb fp, {fp, sp, pc}
200
201 ENTRY(os_enter_os)
202 mov ip, sp
203 stmfd sp!, {fp, ip, lr, pc}
204 sub fp, ip, #4
205 swi OS_EnterOS
206 ldmdb fp, {fp, sp, pc}
207
208 ENTRY(xosmodule_alloc)
209 mov ip, sp
210 stmfd sp!, {fp, ip, lr, pc}
211 sub fp, ip, #4
212 mov r3, r0
213 mov r0, #OSModule_Alloc
214 swi XOS_Module
215 ldmdbvs fp, {fp, sp, pc}
216 teq r1, #0
217 strne r2, [r1]
218 mov r0, #0
219 ldmdb fp, {fp, sp, pc}
220
221 ENTRY(xosmodule_free)
222 mov ip, sp
223 stmfd sp!, {fp, ip, lr, pc}
224 sub fp, ip, #4
225 mov r2, r0
226 mov r0, #OSModule_Free
227 swi XOS_Module
228 movvc r0, #0
229 ldmdb fp, {fp, sp, pc}
230
231 ENTRY(xosmodule_lookup)
232 mov ip, sp
233 stmfd sp!, {r4-r8, fp, ip, lr, pc}
234 sub fp, ip, #4
235 mov r6, r1
236 mov r7, r2
237 mov r8, r3
238 mov r1, r0
239 mov r0, #OSModule_Lookup
240 swi XOS_Module
241 ldmdbvs fp, {r4-r8, fp, sp, pc}
242 teq r6, #0
243 strne r1, [r6]
244 teq r7, #0
245 strne r2, [r7]
246 teq r8, #0
247 strne r3, [r8]
248 ldr r8, [fp, #4]
249 teq r8, #0
250 strne r4, [r8]
251 ldr r8, [fp, #8]
252 teq r8, #0
253 strne r5, [r8]
254 mov r0, #0
255 ldmdb fp, {r4-r8, fp, sp, pc}
256
257 ENTRY(xosmodule_enumeratewithversion)
258 mov ip, sp
259 stmfd sp!, {r4-r10, fp, ip, lr, pc}
260 sub fp, ip, #4
261 mov r7, r0
262 mov r8, r1
263 mov r9, r2
264 mov r10, r3
265 ldr r1, [r7]
266 ldr r2, [r8]
267 mov r0, #OSModule_EnumerateWithVersion
268 swi XOS_Module
269 ldmdbvs fp, {r4-r10, fp, sp, pc}
270 str r1, [r7]
271 str r2, [r8]
272 teq r9, #0
273 strne r3, [r9]
274 teq r9, #0
275 strne r3, [r9]
276 teq r10, #0
277 strne r4, [r10]
278 ldr r10, [fp, #4]
279 teq r10, #0
280 strne r5, [r10]
281 ldr r10, [fp, #8]
282 teq r10, #0
283 strne r6, [r10]
284 mov r0, #0
285 ldmdb fp, {r4-r10, fp, sp, pc}
286
287 ENTRY(xosfscontrol_shutdown)
288 mov ip, sp
289 stmfd sp!, {fp, ip, lr, pc}
290 sub fp, ip, #4
291 mov r0, #OSFSControl_Shutdown
292 swi XOS_FSControl
293 movvc r0, #0
294 ldmdb fp, {fp, sp, pc}
295
296 ENTRY(service_pre_reset)
297 mov ip, sp
298 stmfd sp!, {fp, ip, lr, pc}
299 sub fp, ip, #4
300 mov r1, #Service_PreReset
301 swi OS_ServiceCall
302 ldmdb fp, {fp, sp, pc}
303
304 ENTRY(os_read_vdu_variables)
305 mov ip, sp
306 stmfd sp!, {fp, ip, lr, pc}
307 sub fp, ip, #4
308 swi OS_ReadVduVariables
309 ldmdb fp, {fp, sp, pc}
310
311 ENTRY(xos_swi_number_from_string)
312 mov ip, sp
313 stmfd sp!, {fp, ip, lr, pc}
314 sub fp, ip, #4
315 mov r2, r1
316 mov r1, r0
317 swi XOS_SWINumberFromString
318 ldmdbvs fp, {fp, sp, pc}
319 str r0, [r2]
320 mov r0, #0
321 ldmdb fp, {fp, sp, pc}
322
323 ENTRY(os_read_monotonic_time)
324 mov ip, sp
325 stmfd sp!, {fp, ip, lr, pc}
326 sub fp, ip, #4
327 swi OS_ReadMonotonicTime
328 ldmdb fp, {fp, sp, pc}
329
330 ENTRY(os_read_mem_map_info)
331 mov ip, sp
332 stmfd sp!, {fp, ip, lr, pc}
333 sub fp, ip, #4
334 mov r2, r0
335 mov r3, r1
336 swi OS_ReadMemMapInfo
337 teq r2, #0
338 strne r0, [r2]
339 teq r3, #0
340 strne r1, [r3]
341 ldmdb fp, {fp, sp, pc}
342
343 ENTRY(os_readsysinfo)
344 mov ip, sp
345 stmfd sp!, {r4-r9, fp, ip, lr, pc}
346 sub fp, ip, #4
347 mov r9, r5
348 mov r8, r4
349 mov r7, r3
350 mov r6, r2
351 mov r5, r1
352 swi OS_ReadSysInfo
353 teq r5, #0
354 strne r0, [r5]
355 teq r6, #0
356 strne r1, [r6]
357 teq r7, #0
358 strne r2, [r7]
359 ldr r1, [ip, #0]
360 teq r1, #0
361 strne r3, [r1]
362 ldr r1, [ip, #4]
363 teq r1, #0
364 strne r4, [r1]
365 ldmdb fp, {r4-r9, fp, sp, pc}
366
367 ENTRY(os_read_mem_map_entries)
368 mov ip, sp
369 stmfd sp!, {fp, ip, lr, pc}
370 sub fp, ip, #4
371 swi OS_ReadMemMapEntries
372 ldmdb fp, {fp, sp, pc}
373
374 ENTRY(osmemory_read_arrangement_table_size)
375 mov ip, sp
376 stmfd sp!, {r4, fp, ip, lr, pc}
377 sub fp, ip, #4
378 mov r3, r0
379 mov r4, r1
380 mov r0, #OSMemory_ReadArrangementTableSize
381 swi OS_Memory
382 cmp r3, #0
383 strne r1, [r3]
384 cmp r4, #0
385 strne r2, [r4]
386 ldmdb fp, {r4, fp, sp, pc}
387
388 ENTRY(xosmemory_read_arrangement_table_size)
389 mov ip, sp
390 stmfd sp!, {r4, fp, ip, lr, pc}
391 sub fp, ip, #4
392 mov r3, r0
393 mov r4, r1
394 mov r0, #OSMemory_ReadArrangementTableSize
395 swi XOS_Memory
396 ldmdbvs fp, {r4, fp, sp, pc}
397 cmp r3, #0
398 strne r1, [r3]
399 cmp r4, #0
400 strne r2, [r4]
401 mov r0, #0
402 ldmdb fp, {r4, fp, sp, pc}
403
404 ENTRY(osmemory_read_arrangement_table)
405 mov ip, sp
406 stmfd sp!, {fp, ip, lr, pc}
407 sub fp, ip, #4
408 mov r1, r0
409 mov r0, #OSMemory_ReadArrangementTable
410 swi OS_Memory
411 ldmdb fp, {fp, sp, pc}
412
413 ENTRY(xosmemory_read_arrangement_table)
414 mov ip, sp
415 stmfd sp!, {fp, ip, lr, pc}
416 sub fp, ip, #4
417 mov r1, r0
418 mov r0, #OSMemory_ReadArrangementTable
419 swi XOS_Memory
420 movvc r0, #0
421 ldmdb fp, {fp, sp, pc}
422
423 ENTRY(osmemory_page_op)
424 mov ip, sp
425 stmfd sp!, {fp, ip, lr, pc}
426 sub fp, ip, #4
427 add r0, r0, #OSMemory_PageOp
428 swi OS_Memory
429 ldmdb fp, {fp, sp, pc}
430
431 ENTRY(xcache_control)
432 mov ip, sp
433 stmfd sp!, {fp, ip, lr, pc}
434 sub fp, ip, #4
435 swi XCache_Control
436 ldmdbvs fp, {fp, sp, pc}
437 teq r2, #0
438 strne r0, [r2]
439 mov r0, #0
440 ldmdb fp, {fp, sp, pc}
441
442 ENTRY(xfilecorediscop_read_sectors)
443 mov ip, sp
444 stmfd sp!, {r4, r8, fp, ip, lr, pc}
445 sub fp, ip, #4
446 mov r4, r3
447 mov r3, r2
448 mov r2, r1
449 orr r1, r0, #FileCoreDiscOp_ReadSectors
450 ldr r8, [fp, #4]
451 swi XFileCore_DiscOp
452 ldmdbvs fp, {r4, r8, fp, sp, pc}
453 ldr r0, [fp, #8]
454 teq r0, #0
455 strne r2, [r0]
456 ldr r0, [fp, #12]
457 teq r0, #0
458 strne r3, [r0]
459 ldr r0, [fp, #16]
460 teq r0, #0
461 strne r4, [r0]
462 mov r0, #0
463 ldmdb fp, {r4, r8, fp, sp, pc}
464
465 ENTRY(xfilecore_drives)
466 mov ip, sp
467 stmfd sp!, {r4-r5, r8, fp, ip, lr, pc}
468 sub fp, ip, #4
469 mov r5, r3
470 mov r4, r2
471 mov r3, r1
472 mov r8, r0
473 swi XFileCore_Drives
474 ldmdbvs fp, {r4-r5, r8, fp, sp, pc}
475 teq r3, #0
476 strne r0, [r3]
477 teq r4, #0
478 strne r1, [r4]
479 teq r5, #0
480 strne r2, [r5]
481 mov r0, #0
482 ldmdb fp, {r4-r5, r8, fp, sp, pc}
483
484 ENTRY(xfilecoresectorop_read_sectors)
485 mov ip, sp
486 stmfd sp!, {r4, r8, fp, ip, lr, pc}
487 sub fp, ip, #4
488 mov r4, r3
489 mov r3, r2
490 mov r2, r1
491 orr r1, r0, #FileCoreDiscOp_ReadSectors
492 ldr r8, [fp, #4]
493 swi XFileCore_SectorOp
494 ldmdbvs fp, {r4, r8, fp, sp, pc}
495 ldr r0, [fp, #8]
496 teq r0, #0
497 strne r2, [r0]
498 ldr r0, [fp, #12]
499 teq r0, #0
500 strne r3, [r0]
501 ldr r0, [fp, #16]
502 teq r0, #0
503 strne r4, [r0]
504 mov r0, #0
505 ldmdb fp, {r4, r8, fp, sp, pc}
506
507 ENTRY(xfilecorediscop64_read_sectors)
508 mov ip, sp
509 stmfd sp!, {r4, r5, r8, fp, ip, lr, pc}
510 sub fp, ip, #4
511 mov r4, r3
512 mov r3, r2
513 mov r2, r1
514 orr r1, r0, #FileCoreDiscOp_ReadSectors
515 ldr r5, [fp, #4]
516 ldr r8, [fp, #8]
517 swi XFileCore_DiscOp64
518 ldmdbvs fp, {r4, r5, r8, fp, sp, pc}
519 ldr r0, [fp, #12]
520 teq r0, #0
521 strne r2, [r0]
522 ldr r0, [fp, #16]
523 teq r0, #0
524 strne r3, [r0]
525 ldr r0, [fp, #20]
526 teq r0, #0
527 strne r4, [r0]
528 mov r0, #0
529 ldmdb fp, {r4, r5, r8, fp, sp, pc}
530