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 34ENTRY(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 41ENTRY(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 48ENTRY(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 55ENTRY(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 62ENTRY(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 70ENTRY(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 82ENTRY(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 92ENTRY(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 99ENTRY(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 111ENTRY(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 119ENTRY(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 134ENTRY(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 149ENTRY(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 159ENTRY(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 170ENTRY(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 183ENTRY(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} 191Labex: 192 .ascii "ABEX" 193 194ENTRY(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 201ENTRY(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 208ENTRY(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 221ENTRY(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 231ENTRY(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 257ENTRY(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 287ENTRY(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 296ENTRY(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 304ENTRY(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 311ENTRY(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 323ENTRY(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 330ENTRY(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 343ENTRY(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 367ENTRY(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 374ENTRY(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 388ENTRY(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 404ENTRY(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 413ENTRY(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 423ENTRY(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 431ENTRY(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 442ENTRY(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 465ENTRY(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 484ENTRY(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 507ENTRY(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