github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/runtime/sys_openbsd_arm.s (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 // 5 // System calls and other sys.stuff for ARM, OpenBSD 6 // /usr/src/sys/kern/syscalls.master for syscall numbers. 7 // 8 9 #include "go_asm.h" 10 #include "go_tls.h" 11 #include "textflag.h" 12 13 #define CLOCK_REALTIME $0 14 #define CLOCK_MONOTONIC $3 15 16 // With OpenBSD 6.7 onwards, an armv7 syscall returns two instructions 17 // after the SWI instruction, to allow for a speculative execution 18 // barrier to be placed after the SWI without impacting performance. 19 // For now use hardware no-ops as this works with both older and newer 20 // kernels. After OpenBSD 6.8 is released this should be changed to 21 // speculation barriers. 22 #define NOOP MOVW R0, R0 23 #define INVOKE_SYSCALL \ 24 SWI $0; \ 25 NOOP; \ 26 NOOP 27 28 // mstart_stub is the first function executed on a new thread started by pthread_create. 29 // It just does some low-level setup and then calls mstart. 30 // Note: called with the C calling convention. 31 TEXT runtime·mstart_stub(SB),NOSPLIT,$0 32 // R0 points to the m. 33 // We are already on m's g0 stack. 34 35 // Save callee-save registers. 36 MOVM.DB.W [R4-R11], (R13) 37 38 MOVW m_g0(R0), g 39 BL runtime·save_g(SB) 40 41 BL runtime·mstart(SB) 42 43 // Restore callee-save registers. 44 MOVM.IA.W (R13), [R4-R11] 45 46 // Go is all done with this OS thread. 47 // Tell pthread everything is ok (we never join with this thread, so 48 // the value here doesn't really matter). 49 MOVW $0, R0 50 RET 51 52 TEXT runtime·sigfwd(SB),NOSPLIT,$0-16 53 MOVW sig+4(FP), R0 54 MOVW info+8(FP), R1 55 MOVW ctx+12(FP), R2 56 MOVW fn+0(FP), R3 57 MOVW R13, R9 58 SUB $24, R13 59 BIC $0x7, R13 // alignment for ELF ABI 60 BL (R3) 61 MOVW R9, R13 62 RET 63 64 TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0 65 // Reserve space for callee-save registers and arguments. 66 MOVM.DB.W [R4-R11], (R13) 67 SUB $16, R13 68 69 // If called from an external code context, g will not be set. 70 // Save R0, since runtime·load_g will clobber it. 71 MOVW R0, 4(R13) // signum 72 BL runtime·load_g(SB) 73 74 MOVW R1, 8(R13) 75 MOVW R2, 12(R13) 76 BL runtime·sigtrampgo(SB) 77 78 // Restore callee-save registers. 79 ADD $16, R13 80 MOVM.IA.W (R13), [R4-R11] 81 82 RET 83 84 TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0 85 B runtime·armPublicationBarrier(SB) 86 87 // TODO(jsing): OpenBSD only supports GOARM=7 machines... this 88 // should not be needed, however the linker still allows GOARM=5 89 // on this platform. 90 TEXT runtime·read_tls_fallback(SB),NOSPLIT|NOFRAME,$0 91 MOVM.WP [R1, R2, R3, R12], (R13) 92 MOVW $330, R12 // sys___get_tcb 93 INVOKE_SYSCALL 94 MOVM.IAW (R13), [R1, R2, R3, R12] 95 RET 96 97 // These trampolines help convert from Go calling convention to C calling convention. 98 // They should be called with asmcgocall - note that while asmcgocall does 99 // stack alignment, creation of a frame undoes it again. 100 // A pointer to the arguments is passed in R0. 101 // A single int32 result is returned in R0. 102 // (For more results, make an args/results structure.) 103 TEXT runtime·pthread_attr_init_trampoline(SB),NOSPLIT,$0 104 MOVW R13, R9 105 BIC $0x7, R13 // align for ELF ABI 106 MOVW 0(R0), R0 // arg 1 attr 107 CALL libc_pthread_attr_init(SB) 108 MOVW R9, R13 109 RET 110 111 TEXT runtime·pthread_attr_destroy_trampoline(SB),NOSPLIT,$0 112 MOVW R13, R9 113 BIC $0x7, R13 // align for ELF ABI 114 MOVW 0(R0), R0 // arg 1 attr 115 CALL libc_pthread_attr_destroy(SB) 116 MOVW R9, R13 117 RET 118 119 TEXT runtime·pthread_attr_getstacksize_trampoline(SB),NOSPLIT,$0 120 MOVW R13, R9 121 BIC $0x7, R13 // align for ELF ABI 122 MOVW 4(R0), R1 // arg 2 size 123 MOVW 0(R0), R0 // arg 1 attr 124 CALL libc_pthread_attr_getstacksize(SB) 125 MOVW R9, R13 126 RET 127 128 TEXT runtime·pthread_attr_setdetachstate_trampoline(SB),NOSPLIT,$0 129 MOVW R13, R9 130 BIC $0x7, R13 // align for ELF ABI 131 MOVW 4(R0), R1 // arg 2 state 132 MOVW 0(R0), R0 // arg 1 attr 133 CALL libc_pthread_attr_setdetachstate(SB) 134 MOVW R9, R13 135 RET 136 137 TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0 138 MOVW R13, R9 139 SUB $16, R13 140 BIC $0x7, R13 // align for ELF ABI 141 MOVW 0(R0), R1 // arg 2 attr 142 MOVW 4(R0), R2 // arg 3 start 143 MOVW 8(R0), R3 // arg 4 arg 144 MOVW R13, R0 // arg 1 &threadid (discarded) 145 CALL libc_pthread_create(SB) 146 MOVW R9, R13 147 RET 148 149 TEXT runtime·thrkill_trampoline(SB),NOSPLIT,$0 150 MOVW R13, R9 151 BIC $0x7, R13 // align for ELF ABI 152 MOVW 4(R0), R1 // arg 2 - signal 153 MOVW $0, R2 // arg 3 - tcb 154 MOVW 0(R0), R0 // arg 1 - tid 155 CALL libc_thrkill(SB) 156 MOVW R9, R13 157 RET 158 159 TEXT runtime·thrsleep_trampoline(SB),NOSPLIT,$0 160 MOVW R13, R9 161 SUB $16, R13 162 BIC $0x7, R13 // align for ELF ABI 163 MOVW 4(R0), R1 // arg 2 - clock_id 164 MOVW 8(R0), R2 // arg 3 - abstime 165 MOVW 12(R0), R3 // arg 4 - lock 166 MOVW 16(R0), R4 // arg 5 - abort (on stack) 167 MOVW R4, 0(R13) 168 MOVW 0(R0), R0 // arg 1 - id 169 CALL libc_thrsleep(SB) 170 MOVW R9, R13 171 RET 172 173 TEXT runtime·thrwakeup_trampoline(SB),NOSPLIT,$0 174 MOVW R13, R9 175 BIC $0x7, R13 // align for ELF ABI 176 MOVW 4(R0), R1 // arg 2 - count 177 MOVW 0(R0), R0 // arg 1 - id 178 CALL libc_thrwakeup(SB) 179 MOVW R9, R13 180 RET 181 182 TEXT runtime·exit_trampoline(SB),NOSPLIT,$0 183 MOVW R13, R9 184 BIC $0x7, R13 // align for ELF ABI 185 MOVW 0(R0), R0 // arg 1 exit status 186 BL libc_exit(SB) 187 MOVW $0, R8 // crash on failure 188 MOVW R8, (R8) 189 MOVW R9, R13 190 RET 191 192 TEXT runtime·getthrid_trampoline(SB),NOSPLIT,$0 193 MOVW R13, R9 194 MOVW R0, R8 195 BIC $0x7, R13 // align for ELF ABI 196 BL libc_getthrid(SB) 197 MOVW R0, 0(R8) 198 MOVW R9, R13 199 RET 200 201 TEXT runtime·raiseproc_trampoline(SB),NOSPLIT,$0 202 MOVW R13, R9 203 BIC $0x7, R13 // align for ELF ABI 204 MOVW R0, R4 205 BL libc_getpid(SB) // arg 1 pid 206 MOVW R4, R1 // arg 2 signal 207 BL libc_kill(SB) 208 MOVW R9, R13 209 RET 210 211 TEXT runtime·sched_yield_trampoline(SB),NOSPLIT,$0 212 MOVW R13, R9 213 BIC $0x7, R13 // align for ELF ABI 214 BL libc_sched_yield(SB) 215 MOVW R9, R13 216 RET 217 218 TEXT runtime·mmap_trampoline(SB),NOSPLIT,$0 219 MOVW R13, R9 220 SUB $16, R13 221 BIC $0x7, R13 // align for ELF ABI 222 MOVW R0, R8 223 MOVW 4(R0), R1 // arg 2 len 224 MOVW 8(R0), R2 // arg 3 prot 225 MOVW 12(R0), R3 // arg 4 flags 226 MOVW 16(R0), R4 // arg 5 fid (on stack) 227 MOVW R4, 0(R13) 228 MOVW $0, R5 // pad (on stack) 229 MOVW R5, 4(R13) 230 MOVW 20(R0), R6 // arg 6 offset (on stack) 231 MOVW R6, 8(R13) // low 32 bits 232 MOVW $0, R7 233 MOVW R7, 12(R13) // high 32 bits 234 MOVW 0(R0), R0 // arg 1 addr 235 BL libc_mmap(SB) 236 MOVW $0, R1 237 CMP $-1, R0 238 BNE ok 239 BL libc_errno(SB) 240 MOVW (R0), R1 // errno 241 MOVW $0, R0 242 ok: 243 MOVW R0, 24(R8) 244 MOVW R1, 28(R8) 245 MOVW R9, R13 246 RET 247 248 TEXT runtime·munmap_trampoline(SB),NOSPLIT,$0 249 MOVW R13, R9 250 BIC $0x7, R13 // align for ELF ABI 251 MOVW 4(R0), R1 // arg 2 len 252 MOVW 0(R0), R0 // arg 1 addr 253 BL libc_munmap(SB) 254 CMP $-1, R0 255 BNE 3(PC) 256 MOVW $0, R8 // crash on failure 257 MOVW R8, (R8) 258 MOVW R9, R13 259 RET 260 261 TEXT runtime·madvise_trampoline(SB), NOSPLIT, $0 262 MOVW R13, R9 263 BIC $0x7, R13 // align for ELF ABI 264 MOVW 4(R0), R1 // arg 2 len 265 MOVW 8(R0), R2 // arg 3 advice 266 MOVW 0(R0), R0 // arg 1 addr 267 BL libc_madvise(SB) 268 // ignore failure - maybe pages are locked 269 MOVW R9, R13 270 RET 271 272 TEXT runtime·open_trampoline(SB),NOSPLIT,$0 273 MOVW R13, R9 274 SUB $8, R13 275 BIC $0x7, R13 // align for ELF ABI 276 MOVW 4(R0), R1 // arg 2 - flags 277 MOVW 8(R0), R2 // arg 3 - mode (vararg, on stack) 278 MOVW R2, 0(R13) 279 MOVW 0(R0), R0 // arg 1 - path 280 MOVW R13, R4 281 BIC $0x7, R13 // align for ELF ABI 282 BL libc_open(SB) 283 MOVW R9, R13 284 RET 285 286 TEXT runtime·close_trampoline(SB),NOSPLIT,$0 287 MOVW R13, R9 288 BIC $0x7, R13 // align for ELF ABI 289 MOVW 0(R0), R0 // arg 1 - fd 290 BL libc_close(SB) 291 MOVW R9, R13 292 RET 293 294 TEXT runtime·read_trampoline(SB),NOSPLIT,$0 295 MOVW R13, R9 296 BIC $0x7, R13 // align for ELF ABI 297 MOVW 4(R0), R1 // arg 2 - buf 298 MOVW 8(R0), R2 // arg 3 - count 299 MOVW 0(R0), R0 // arg 1 - fd 300 BL libc_read(SB) 301 CMP $-1, R0 302 BNE noerr 303 BL libc_errno(SB) 304 MOVW (R0), R0 // errno 305 RSB.CS $0, R0 // caller expects negative errno 306 noerr: 307 MOVW R9, R13 308 RET 309 310 TEXT runtime·write_trampoline(SB),NOSPLIT,$0 311 MOVW R13, R9 312 BIC $0x7, R13 // align for ELF ABI 313 MOVW 4(R0), R1 // arg 2 buf 314 MOVW 8(R0), R2 // arg 3 count 315 MOVW 0(R0), R0 // arg 1 fd 316 BL libc_write(SB) 317 CMP $-1, R0 318 BNE noerr 319 BL libc_errno(SB) 320 MOVW (R0), R0 // errno 321 RSB.CS $0, R0 // caller expects negative errno 322 noerr: 323 MOVW R9, R13 324 RET 325 326 TEXT runtime·pipe2_trampoline(SB),NOSPLIT,$0 327 MOVW R13, R9 328 BIC $0x7, R13 // align for ELF ABI 329 MOVW 4(R0), R1 // arg 2 flags 330 MOVW 0(R0), R0 // arg 1 filedes 331 BL libc_pipe2(SB) 332 CMP $-1, R0 333 BNE 3(PC) 334 BL libc_errno(SB) 335 MOVW (R0), R0 // errno 336 RSB.CS $0, R0 // caller expects negative errno 337 MOVW R9, R13 338 RET 339 340 TEXT runtime·setitimer_trampoline(SB),NOSPLIT,$0 341 MOVW R13, R9 342 BIC $0x7, R13 // align for ELF ABI 343 MOVW 4(R0), R1 // arg 2 new 344 MOVW 8(R0), R2 // arg 3 old 345 MOVW 0(R0), R0 // arg 1 which 346 BL libc_setitimer(SB) 347 MOVW R9, R13 348 RET 349 350 TEXT runtime·usleep_trampoline(SB),NOSPLIT,$0 351 MOVW R13, R9 352 BIC $0x7, R13 // align for ELF ABI 353 MOVW 0(R0), R0 // arg 1 usec 354 BL libc_usleep(SB) 355 MOVW R9, R13 356 RET 357 358 TEXT runtime·sysctl_trampoline(SB),NOSPLIT,$0 359 MOVW R13, R9 360 SUB $8, R13 361 BIC $0x7, R13 // align for ELF ABI 362 MOVW 4(R0), R1 // arg 2 miblen 363 MOVW 8(R0), R2 // arg 3 out 364 MOVW 12(R0), R3 // arg 4 size 365 MOVW 16(R0), R4 // arg 5 dst (on stack) 366 MOVW R4, 0(R13) 367 MOVW 20(R0), R5 // arg 6 ndst (on stack) 368 MOVW R5, 4(R13) 369 MOVW 0(R0), R0 // arg 1 mib 370 BL libc_sysctl(SB) 371 MOVW R9, R13 372 RET 373 374 TEXT runtime·kqueue_trampoline(SB),NOSPLIT,$0 375 MOVW R13, R9 376 BIC $0x7, R13 // align for ELF ABI 377 BL libc_kqueue(SB) 378 MOVW R9, R13 379 RET 380 381 TEXT runtime·kevent_trampoline(SB),NOSPLIT,$0 382 MOVW R13, R9 383 SUB $8, R13 384 BIC $0x7, R13 // align for ELF ABI 385 MOVW 4(R0), R1 // arg 2 keventt 386 MOVW 8(R0), R2 // arg 3 nch 387 MOVW 12(R0), R3 // arg 4 ev 388 MOVW 16(R0), R4 // arg 5 nev (on stack) 389 MOVW R4, 0(R13) 390 MOVW 20(R0), R5 // arg 6 ts (on stack) 391 MOVW R5, 4(R13) 392 MOVW 0(R0), R0 // arg 1 kq 393 BL libc_kevent(SB) 394 CMP $-1, R0 395 BNE ok 396 BL libc_errno(SB) 397 MOVW (R0), R0 // errno 398 RSB.CS $0, R0 // caller expects negative errno 399 ok: 400 MOVW R9, R13 401 RET 402 403 TEXT runtime·clock_gettime_trampoline(SB),NOSPLIT,$0 404 MOVW R13, R9 405 BIC $0x7, R13 // align for ELF ABI 406 MOVW 4(R0), R1 // arg 2 tp 407 MOVW 0(R0), R0 // arg 1 clock_id 408 BL libc_clock_gettime(SB) 409 CMP $-1, R0 410 BNE noerr 411 BL libc_errno(SB) 412 MOVW (R0), R0 // errno 413 RSB.CS $0, R0 // caller expects negative errno 414 noerr: 415 MOVW R9, R13 416 RET 417 418 TEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0 419 MOVW R13, R9 420 SUB $8, R13 421 BIC $0x7, R13 // align for ELF ABI 422 MOVW R0, R8 423 MOVW 0(R8), R0 // arg 1 fd 424 MOVW 4(R8), R1 // arg 2 cmd 425 MOVW 8(R8), R2 // arg 3 arg (vararg, on stack) 426 MOVW R2, 0(R13) 427 BL libc_fcntl(SB) 428 MOVW $0, R1 429 CMP $-1, R0 430 BNE noerr 431 BL libc_errno(SB) 432 MOVW (R0), R1 433 MOVW $-1, R0 434 noerr: 435 MOVW R0, 12(R8) 436 MOVW R1, 16(R8) 437 MOVW R9, R13 438 RET 439 440 TEXT runtime·sigaction_trampoline(SB),NOSPLIT,$0 441 MOVW R13, R9 442 BIC $0x7, R13 // align for ELF ABI 443 MOVW 4(R0), R1 // arg 2 new 444 MOVW 8(R0), R2 // arg 3 old 445 MOVW 0(R0), R0 // arg 1 sig 446 BL libc_sigaction(SB) 447 CMP $-1, R0 448 BNE 3(PC) 449 MOVW $0, R8 // crash on failure 450 MOVW R8, (R8) 451 MOVW R9, R13 452 RET 453 454 TEXT runtime·sigprocmask_trampoline(SB),NOSPLIT,$0 455 MOVW R13, R9 456 BIC $0x7, R13 // align for ELF ABI 457 MOVW 4(R0), R1 // arg 2 new 458 MOVW 8(R0), R2 // arg 3 old 459 MOVW 0(R0), R0 // arg 1 how 460 BL libc_pthread_sigmask(SB) 461 CMP $-1, R0 462 BNE 3(PC) 463 MOVW $0, R8 // crash on failure 464 MOVW R8, (R8) 465 MOVW R9, R13 466 RET 467 468 TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0 469 MOVW R13, R9 470 BIC $0x7, R13 // align for ELF ABI 471 MOVW 4(R0), R1 // arg 2 old 472 MOVW 0(R0), R0 // arg 1 new 473 BL libc_sigaltstack(SB) 474 CMP $-1, R0 475 BNE 3(PC) 476 MOVW $0, R8 // crash on failure 477 MOVW R8, (R8) 478 MOVW R9, R13 479 RET 480 481 // syscall calls a function in libc on behalf of the syscall package. 482 // syscall takes a pointer to a struct like: 483 // struct { 484 // fn uintptr 485 // a1 uintptr 486 // a2 uintptr 487 // a3 uintptr 488 // r1 uintptr 489 // r2 uintptr 490 // err uintptr 491 // } 492 // syscall must be called on the g0 stack with the 493 // C calling convention (use libcCall). 494 // 495 // syscall expects a 32-bit result and tests for 32-bit -1 496 // to decide there was an error. 497 TEXT runtime·syscall(SB),NOSPLIT,$0 498 MOVW R13, R9 499 BIC $0x7, R13 // align for ELF ABI 500 501 MOVW R0, R8 502 503 MOVW (0*4)(R8), R7 // fn 504 MOVW (1*4)(R8), R0 // a1 505 MOVW (2*4)(R8), R1 // a2 506 MOVW (3*4)(R8), R2 // a3 507 508 BL (R7) 509 510 MOVW R0, (4*4)(R8) // r1 511 MOVW R1, (5*4)(R8) // r2 512 513 // Standard libc functions return -1 on error and set errno. 514 CMP $-1, R0 515 BNE ok 516 517 // Get error code from libc. 518 BL libc_errno(SB) 519 MOVW (R0), R1 520 MOVW R1, (6*4)(R8) // err 521 522 ok: 523 MOVW $0, R0 // no error (it's ignored anyway) 524 MOVW R9, R13 525 RET 526 527 // syscallX calls a function in libc on behalf of the syscall package. 528 // syscallX takes a pointer to a struct like: 529 // struct { 530 // fn uintptr 531 // a1 uintptr 532 // a2 uintptr 533 // a3 uintptr 534 // r1 uintptr 535 // r2 uintptr 536 // err uintptr 537 // } 538 // syscallX must be called on the g0 stack with the 539 // C calling convention (use libcCall). 540 // 541 // syscallX is like syscall but expects a 64-bit result 542 // and tests for 64-bit -1 to decide there was an error. 543 TEXT runtime·syscallX(SB),NOSPLIT,$0 544 MOVW R13, R9 545 BIC $0x7, R13 // align for ELF ABI 546 547 MOVW R0, R8 548 549 MOVW (0*4)(R8), R7 // fn 550 MOVW (1*4)(R8), R0 // a1 551 MOVW (2*4)(R8), R1 // a2 552 MOVW (3*4)(R8), R2 // a3 553 554 BL (R7) 555 556 MOVW R0, (4*4)(R8) // r1 557 MOVW R1, (5*4)(R8) // r2 558 559 // Standard libc functions return -1 on error and set errno. 560 CMP $-1, R0 561 BNE ok 562 CMP $-1, R1 563 BNE ok 564 565 // Get error code from libc. 566 BL libc_errno(SB) 567 MOVW (R0), R1 568 MOVW R1, (6*4)(R8) // err 569 570 ok: 571 MOVW $0, R0 // no error (it's ignored anyway) 572 MOVW R9, R13 573 RET 574 575 // syscall6 calls a function in libc on behalf of the syscall package. 576 // syscall6 takes a pointer to a struct like: 577 // struct { 578 // fn uintptr 579 // a1 uintptr 580 // a2 uintptr 581 // a3 uintptr 582 // a4 uintptr 583 // a5 uintptr 584 // a6 uintptr 585 // r1 uintptr 586 // r2 uintptr 587 // err uintptr 588 // } 589 // syscall6 must be called on the g0 stack with the 590 // C calling convention (use libcCall). 591 // 592 // syscall6 expects a 32-bit result and tests for 32-bit -1 593 // to decide there was an error. 594 TEXT runtime·syscall6(SB),NOSPLIT,$0 595 MOVW R13, R9 596 SUB $8, R13 597 BIC $0x7, R13 // align for ELF ABI 598 599 MOVW R0, R8 600 601 MOVW (0*4)(R8), R7 // fn 602 MOVW (1*4)(R8), R0 // a1 603 MOVW (2*4)(R8), R1 // a2 604 MOVW (3*4)(R8), R2 // a3 605 MOVW (4*4)(R8), R3 // a4 606 MOVW (5*4)(R8), R4 // a5 607 MOVW R4, 0(R13) 608 MOVW (6*4)(R8), R5 // a6 609 MOVW R5, 4(R13) 610 611 BL (R7) 612 613 MOVW R0, (7*4)(R8) // r1 614 MOVW R1, (8*4)(R8) // r2 615 616 // Standard libc functions return -1 on error and set errno. 617 CMP $-1, R0 618 BNE ok 619 620 // Get error code from libc. 621 BL libc_errno(SB) 622 MOVW (R0), R1 623 MOVW R1, (9*4)(R8) // err 624 625 ok: 626 MOVW $0, R0 // no error (it's ignored anyway) 627 MOVW R9, R13 628 RET 629 630 // syscall6X calls a function in libc on behalf of the syscall package. 631 // syscall6X takes a pointer to a struct like: 632 // struct { 633 // fn uintptr 634 // a1 uintptr 635 // a2 uintptr 636 // a3 uintptr 637 // a4 uintptr 638 // a5 uintptr 639 // a6 uintptr 640 // r1 uintptr 641 // r2 uintptr 642 // err uintptr 643 // } 644 // syscall6X must be called on the g0 stack with the 645 // C calling convention (use libcCall). 646 // 647 // syscall6X is like syscall6 but expects a 64-bit result 648 // and tests for 64-bit -1 to decide there was an error. 649 TEXT runtime·syscall6X(SB),NOSPLIT,$0 650 MOVW R13, R9 651 SUB $8, R13 652 BIC $0x7, R13 // align for ELF ABI 653 654 MOVW R0, R8 655 656 MOVW (0*4)(R8), R7 // fn 657 MOVW (1*4)(R8), R0 // a1 658 MOVW (2*4)(R8), R1 // a2 659 MOVW (3*4)(R8), R2 // a3 660 MOVW (4*4)(R8), R3 // a4 661 MOVW (5*4)(R8), R4 // a5 662 MOVW R4, 0(R13) 663 MOVW (6*4)(R8), R5 // a6 664 MOVW R5, 4(R13) 665 666 BL (R7) 667 668 MOVW R0, (7*4)(R8) // r1 669 MOVW R1, (8*4)(R8) // r2 670 671 // Standard libc functions return -1 on error and set errno. 672 CMP $-1, R0 673 BNE ok 674 CMP $-1, R1 675 BNE ok 676 677 // Get error code from libc. 678 BL libc_errno(SB) 679 MOVW (R0), R1 680 MOVW R1, (9*4)(R8) // err 681 682 ok: 683 MOVW $0, R0 // no error (it's ignored anyway) 684 MOVW R9, R13 685 RET 686 687 // syscall10 calls a function in libc on behalf of the syscall package. 688 // syscall10 takes a pointer to a struct like: 689 // struct { 690 // fn uintptr 691 // a1 uintptr 692 // a2 uintptr 693 // a3 uintptr 694 // a4 uintptr 695 // a5 uintptr 696 // a6 uintptr 697 // a7 uintptr 698 // a8 uintptr 699 // a9 uintptr 700 // a10 uintptr 701 // r1 uintptr 702 // r2 uintptr 703 // err uintptr 704 // } 705 // syscall10 must be called on the g0 stack with the 706 // C calling convention (use libcCall). 707 TEXT runtime·syscall10(SB),NOSPLIT,$0 708 MOVW R13, R9 709 SUB $24, R13 710 BIC $0x7, R13 // align for ELF ABI 711 712 MOVW R0, R8 713 714 MOVW (0*4)(R8), R7 // fn 715 MOVW (1*4)(R8), R0 // a1 716 MOVW (2*4)(R8), R1 // a2 717 MOVW (3*4)(R8), R2 // a3 718 MOVW (4*4)(R8), R3 // a4 719 MOVW (5*4)(R8), R4 // a5 720 MOVW R4, 0(R13) 721 MOVW (6*4)(R8), R5 // a6 722 MOVW R5, 4(R13) 723 MOVW (7*4)(R8), R6 // a7 724 MOVW R6, 8(R13) 725 MOVW (8*4)(R8), R4 // a8 726 MOVW R4, 12(R13) 727 MOVW (9*4)(R8), R5 // a9 728 MOVW R5, 16(R13) 729 MOVW (10*4)(R8), R6 // a10 730 MOVW R6, 20(R13) 731 732 BL (R7) 733 734 MOVW R0, (11*4)(R8) // r1 735 MOVW R1, (12*4)(R8) // r2 736 737 // Standard libc functions return -1 on error and set errno. 738 CMP $-1, R0 739 BNE ok 740 741 // Get error code from libc. 742 BL libc_errno(SB) 743 MOVW (R0), R1 744 MOVW R1, (13*4)(R8) // err 745 746 ok: 747 MOVW $0, R0 // no error (it's ignored anyway) 748 MOVW R9, R13 749 RET 750 751 // syscall10X calls a function in libc on behalf of the syscall package. 752 // syscall10X takes a pointer to a struct like: 753 // struct { 754 // fn uintptr 755 // a1 uintptr 756 // a2 uintptr 757 // a3 uintptr 758 // a4 uintptr 759 // a5 uintptr 760 // a6 uintptr 761 // a7 uintptr 762 // a8 uintptr 763 // a9 uintptr 764 // a10 uintptr 765 // r1 uintptr 766 // r2 uintptr 767 // err uintptr 768 // } 769 // syscall10X must be called on the g0 stack with the 770 // C calling convention (use libcCall). 771 // 772 // syscall10X is like syscall10 but expects a 64-bit result 773 // and tests for 64-bit -1 to decide there was an error. 774 TEXT runtime·syscall10X(SB),NOSPLIT,$0 775 MOVW R13, R9 776 SUB $24, R13 777 BIC $0x7, R13 // align for ELF ABI 778 779 MOVW R0, R8 780 781 MOVW (0*4)(R8), R7 // fn 782 MOVW (1*4)(R8), R0 // a1 783 MOVW (2*4)(R8), R1 // a2 784 MOVW (3*4)(R8), R2 // a3 785 MOVW (4*4)(R8), R3 // a4 786 MOVW (5*4)(R8), R4 // a5 787 MOVW R4, 0(R13) 788 MOVW (6*4)(R8), R5 // a6 789 MOVW R5, 4(R13) 790 MOVW (7*4)(R8), R6 // a7 791 MOVW R6, 8(R13) 792 MOVW (8*4)(R8), R4 // a8 793 MOVW R4, 12(R13) 794 MOVW (9*4)(R8), R5 // a9 795 MOVW R5, 16(R13) 796 MOVW (10*4)(R8), R6 // a10 797 MOVW R6, 20(R13) 798 799 BL (R7) 800 801 MOVW R0, (11*4)(R8) // r1 802 MOVW R1, (12*4)(R8) // r2 803 804 // Standard libc functions return -1 on error and set errno. 805 CMP $-1, R0 806 BNE ok 807 CMP $-1, R1 808 BNE ok 809 810 // Get error code from libc. 811 BL libc_errno(SB) 812 MOVW (R0), R1 813 MOVW R1, (13*4)(R8) // err 814 815 ok: 816 MOVW $0, R0 // no error (it's ignored anyway) 817 MOVW R9, R13 818 RET 819 820 TEXT runtime·issetugid_trampoline(SB),NOSPLIT,$0 821 MOVW R13, R9 822 MOVW R0, R8 823 BIC $0x7, R13 // align for ELF ABI 824 BL libc_issetugid(SB) 825 MOVW R0, 0(R8) 826 MOVW R9, R13 827 RET