Home | History | Annotate | Line # | Download | only in lib
      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