1/* $NetBSD: riscoscalls.S,v 1.10 2006/08/19 22:44:58 bjh21 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 ldmvsdb 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 ldmvsdb 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 ldmvsdb 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 ldmvsdb 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(xosfscontrol_shutdown) 258 mov ip, sp 259 stmfd sp!, {fp, ip, lr, pc} 260 sub fp, ip, #4 261 mov r0, #OSFSControl_Shutdown 262 swi XOS_FSControl 263 movvc r0, #0 264 ldmdb fp, {fp, sp, pc} 265 266ENTRY(service_pre_reset) 267 mov ip, sp 268 stmfd sp!, {fp, ip, lr, pc} 269 sub fp, ip, #4 270 mov r1, #Service_PreReset 271 swi OS_ServiceCall 272 ldmdb fp, {fp, sp, pc} 273 274ENTRY(os_read_vdu_variables) 275 mov ip, sp 276 stmfd sp!, {fp, ip, lr, pc} 277 sub fp, ip, #4 278 swi OS_ReadVduVariables 279 ldmdb fp, {fp, sp, pc} 280 281ENTRY(xos_swi_number_from_string) 282 mov ip, sp 283 stmfd sp!, {fp, ip, lr, pc} 284 sub fp, ip, #4 285 mov r2, r1 286 mov r1, r0 287 swi XOS_SWINumberFromString 288 ldmvsdb fp, {fp, sp, pc} 289 str r0, [r2] 290 mov r0, #0 291 ldmdb fp, {fp, sp, pc} 292 293ENTRY(os_read_monotonic_time) 294 mov ip, sp 295 stmfd sp!, {fp, ip, lr, pc} 296 sub fp, ip, #4 297 swi OS_ReadMonotonicTime 298 ldmdb fp, {fp, sp, pc} 299 300ENTRY(os_read_mem_map_info) 301 mov ip, sp 302 stmfd sp!, {fp, ip, lr, pc} 303 sub fp, ip, #4 304 mov r2, r0 305 mov r3, r1 306 swi OS_ReadMemMapInfo 307 teq r2, #0 308 strne r0, [r2] 309 teq r3, #0 310 strne r1, [r3] 311 ldmdb fp, {fp, sp, pc} 312 313ENTRY(os_readsysinfo) 314 mov ip, sp 315 stmfd sp!, {r4-r9, fp, ip, lr, pc} 316 sub fp, ip, #4 317 mov r9, r5 318 mov r8, r4 319 mov r7, r3 320 mov r6, r2 321 mov r5, r1 322 swi OS_ReadSysInfo 323 teq r5, #0 324 strne r0, [r5] 325 teq r6, #0 326 strne r1, [r6] 327 teq r7, #0 328 strne r2, [r7] 329 ldr r1, [ip, #0] 330 teq r1, #0 331 strne r3, [r1] 332 ldr r1, [ip, #4] 333 teq r1, #0 334 strne r4, [r1] 335 ldmdb fp, {r4-r9, fp, sp, pc} 336 337ENTRY(os_read_mem_map_entries) 338 mov ip, sp 339 stmfd sp!, {fp, ip, lr, pc} 340 sub fp, ip, #4 341 swi OS_ReadMemMapEntries 342 ldmdb fp, {fp, sp, pc} 343 344ENTRY(osmemory_read_arrangement_table_size) 345 mov ip, sp 346 stmfd sp!, {r4, fp, ip, lr, pc} 347 sub fp, ip, #4 348 mov r3, r0 349 mov r4, r1 350 mov r0, #OSMemory_ReadArrangementTableSize 351 swi OS_Memory 352 cmp r3, #0 353 strne r1, [r3] 354 cmp r4, #0 355 strne r2, [r4] 356 ldmdb fp, {r4, fp, sp, pc} 357 358ENTRY(xosmemory_read_arrangement_table_size) 359 mov ip, sp 360 stmfd sp!, {r4, fp, ip, lr, pc} 361 sub fp, ip, #4 362 mov r3, r0 363 mov r4, r1 364 mov r0, #OSMemory_ReadArrangementTableSize 365 swi XOS_Memory 366 ldmvsdb fp, {r4, fp, sp, pc} 367 cmp r3, #0 368 strne r1, [r3] 369 cmp r4, #0 370 strne r2, [r4] 371 mov r0, #0 372 ldmdb fp, {r4, fp, sp, pc} 373 374ENTRY(osmemory_read_arrangement_table) 375 mov ip, sp 376 stmfd sp!, {fp, ip, lr, pc} 377 sub fp, ip, #4 378 mov r1, r0 379 mov r0, #OSMemory_ReadArrangementTable 380 swi OS_Memory 381 ldmdb fp, {fp, sp, pc} 382 383ENTRY(xosmemory_read_arrangement_table) 384 mov ip, sp 385 stmfd sp!, {fp, ip, lr, pc} 386 sub fp, ip, #4 387 mov r1, r0 388 mov r0, #OSMemory_ReadArrangementTable 389 swi XOS_Memory 390 movvc r0, #0 391 ldmdb fp, {fp, sp, pc} 392 393ENTRY(osmemory_page_op) 394 mov ip, sp 395 stmfd sp!, {fp, ip, lr, pc} 396 sub fp, ip, #4 397 add r0, r0, #OSMemory_PageOp 398 swi OS_Memory 399 ldmdb fp, {fp, sp, pc} 400 401ENTRY(xcache_control) 402 mov ip, sp 403 stmfd sp!, {fp, ip, lr, pc} 404 sub fp, ip, #4 405 swi XCache_Control 406 ldmvsdb fp, {fp, sp, pc} 407 teq r2, #0 408 strne r0, [r2] 409 mov r0, #0 410 ldmdb fp, {fp, sp, pc} 411 412ENTRY(xfilecorediscop_read_sectors) 413 mov ip, sp 414 stmfd sp!, {r4, r8, fp, ip, lr, pc} 415 sub fp, ip, #4 416 mov r4, r3 417 mov r3, r2 418 mov r2, r1 419 orr r1, r0, #FileCoreDiscOp_ReadSectors 420 ldr r8, [fp, #4] 421 swi XFileCore_DiscOp 422 ldmvsdb fp, {r4, r8, fp, sp, pc} 423 ldr r0, [fp, #8] 424 teq r0, #0 425 strne r2, [r0] 426 ldr r0, [fp, #12] 427 teq r0, #0 428 strne r3, [r0] 429 ldr r0, [fp, #16] 430 teq r0, #0 431 strne r4, [r0] 432 mov r0, #0 433 ldmdb fp, {r4, r8, fp, sp, pc} 434 435ENTRY(xfilecore_drives) 436 mov ip, sp 437 stmfd sp!, {r4-r5, r8, fp, ip, lr, pc} 438 sub fp, ip, #4 439 mov r5, r3 440 mov r4, r2 441 mov r3, r1 442 mov r8, r0 443 swi XFileCore_Drives 444 ldmvsdb fp, {r4-r5, r8, fp, sp, pc} 445 teq r3, #0 446 strne r0, [r3] 447 teq r4, #0 448 strne r1, [r4] 449 teq r5, #0 450 strne r2, [r5] 451 mov r0, #0 452 ldmdb fp, {r4-r5, r8, fp, sp, pc} 453 454ENTRY(xfilecoresectorop_read_sectors) 455 mov ip, sp 456 stmfd sp!, {r4, r8, fp, ip, lr, pc} 457 sub fp, ip, #4 458 mov r4, r3 459 mov r3, r2 460 mov r2, r1 461 orr r1, r0, #FileCoreDiscOp_ReadSectors 462 ldr r8, [fp, #4] 463 swi XFileCore_SectorOp 464 ldmvsdb fp, {r4, r8, fp, sp, pc} 465 ldr r0, [fp, #8] 466 teq r0, #0 467 strne r2, [r0] 468 ldr r0, [fp, #12] 469 teq r0, #0 470 strne r3, [r0] 471 ldr r0, [fp, #16] 472 teq r0, #0 473 strne r4, [r0] 474 mov r0, #0 475 ldmdb fp, {r4, r8, fp, sp, pc} 476 477ENTRY(xfilecorediscop64_read_sectors) 478 mov ip, sp 479 stmfd sp!, {r4, r5, r8, fp, ip, lr, pc} 480 sub fp, ip, #4 481 mov r4, r3 482 mov r3, r2 483 mov r2, r1 484 orr r1, r0, #FileCoreDiscOp_ReadSectors 485 ldr r5, [fp, #4] 486 ldr r8, [fp, #8] 487 swi XFileCore_DiscOp64 488 ldmvsdb fp, {r4, r5, r8, fp, sp, pc} 489 ldr r0, [fp, #12] 490 teq r0, #0 491 strne r2, [r0] 492 ldr r0, [fp, #16] 493 teq r0, #0 494 strne r3, [r0] 495 ldr r0, [fp, #20] 496 teq r0, #0 497 strne r4, [r0] 498 mov r0, #0 499 ldmdb fp, {r4, r5, r8, fp, sp, pc} 500