github.com/geraldss/go/src@v0.0.0-20210511222824-ac7d0ebfc235/runtime/sys_netbsd_arm64.s (about) 1 // Copyright 2019 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 // 6 // System calls and other sys.stuff for arm64, NetBSD 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 #define FD_CLOEXEC 1 16 #define F_SETFD 2 17 #define F_GETFL 3 18 #define F_SETFL 4 19 #define O_NONBLOCK 4 20 21 #define SYS_exit 1 22 #define SYS_read 3 23 #define SYS_write 4 24 #define SYS_open 5 25 #define SYS_close 6 26 #define SYS_getpid 20 27 #define SYS_kill 37 28 #define SYS_munmap 73 29 #define SYS_madvise 75 30 #define SYS_fcntl 92 31 #define SYS_mmap 197 32 #define SYS___sysctl 202 33 #define SYS___sigaltstack14 281 34 #define SYS___sigprocmask14 293 35 #define SYS_getcontext 307 36 #define SYS_setcontext 308 37 #define SYS__lwp_create 309 38 #define SYS__lwp_exit 310 39 #define SYS__lwp_self 311 40 #define SYS__lwp_kill 318 41 #define SYS__lwp_unpark 321 42 #define SYS___sigaction_sigtramp 340 43 #define SYS_kqueue 344 44 #define SYS_sched_yield 350 45 #define SYS___setitimer50 425 46 #define SYS___clock_gettime50 427 47 #define SYS___nanosleep50 430 48 #define SYS___kevent50 435 49 #define SYS_pipe2 453 50 #define SYS_openat 468 51 #define SYS____lwp_park60 478 52 53 // int32 lwp_create(void *context, uintptr flags, void *lwpid) 54 TEXT runtime·lwp_create(SB),NOSPLIT,$0 55 MOVD ctxt+0(FP), R0 56 MOVD flags+8(FP), R1 57 MOVD lwpid+16(FP), R2 58 SVC $SYS__lwp_create 59 BCC ok 60 NEG R0, R0 61 ok: 62 MOVW R0, ret+24(FP) 63 RET 64 65 TEXT runtime·lwp_tramp(SB),NOSPLIT,$0 66 CMP $0, R1 67 BEQ nog 68 CMP $0, R2 69 BEQ nog 70 71 MOVD R0, g_m(R1) 72 MOVD R1, g 73 nog: 74 CALL (R2) 75 76 MOVD $0, R0 // crash (not reached) 77 MOVD R0, (R8) 78 79 TEXT runtime·osyield(SB),NOSPLIT,$0 80 SVC $SYS_sched_yield 81 RET 82 83 TEXT runtime·lwp_park(SB),NOSPLIT,$0 84 MOVW clockid+0(FP), R0 // arg 1 - clockid 85 MOVW flags+4(FP), R1 // arg 2 - flags 86 MOVD ts+8(FP), R2 // arg 3 - ts 87 MOVW unpark+16(FP), R3 // arg 4 - unpark 88 MOVD hint+24(FP), R4 // arg 5 - hint 89 MOVD unparkhint+32(FP), R5 // arg 6 - unparkhint 90 SVC $SYS____lwp_park60 91 MOVW R0, ret+40(FP) 92 RET 93 94 TEXT runtime·lwp_unpark(SB),NOSPLIT,$0 95 MOVW lwp+0(FP), R0 // arg 1 - lwp 96 MOVD hint+8(FP), R1 // arg 2 - hint 97 SVC $SYS__lwp_unpark 98 MOVW R0, ret+16(FP) 99 RET 100 101 TEXT runtime·lwp_self(SB),NOSPLIT,$0 102 SVC $SYS__lwp_self 103 MOVW R0, ret+0(FP) 104 RET 105 106 // Exit the entire program (like C exit) 107 TEXT runtime·exit(SB),NOSPLIT,$-8 108 MOVW code+0(FP), R0 // arg 1 - exit status 109 SVC $SYS_exit 110 MOVD $0, R0 // If we're still running, 111 MOVD R0, (R0) // crash 112 113 // func exitThread(wait *uint32) 114 TEXT runtime·exitThread(SB),NOSPLIT,$0-8 115 MOVD wait+0(FP), R0 116 // We're done using the stack. 117 MOVW $0, R1 118 STLRW R1, (R0) 119 SVC $SYS__lwp_exit 120 JMP 0(PC) 121 122 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$-8 123 MOVD name+0(FP), R0 // arg 1 - pathname 124 MOVW mode+8(FP), R1 // arg 2 - flags 125 MOVW perm+12(FP), R2 // arg 3 - mode 126 SVC $SYS_open 127 BCC ok 128 MOVW $-1, R0 129 ok: 130 MOVW R0, ret+16(FP) 131 RET 132 133 TEXT runtime·closefd(SB),NOSPLIT,$-8 134 MOVW fd+0(FP), R0 // arg 1 - fd 135 SVC $SYS_close 136 BCC ok 137 MOVW $-1, R0 138 ok: 139 MOVW R0, ret+8(FP) 140 RET 141 142 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0 143 MOVW fd+0(FP), R0 // arg 1 - fd 144 MOVD p+8(FP), R1 // arg 2 - buf 145 MOVW n+16(FP), R2 // arg 3 - count 146 SVC $SYS_read 147 BCC ok 148 NEG R0, R0 149 ok: 150 MOVW R0, ret+24(FP) 151 RET 152 153 // func pipe() (r, w int32, errno int32) 154 TEXT runtime·pipe(SB),NOSPLIT|NOFRAME,$0-12 155 ADD $8, RSP, R0 156 MOVW $0, R1 157 SVC $SYS_pipe2 158 BCC pipeok 159 NEG R0, R0 160 pipeok: 161 MOVW R0, errno+8(FP) 162 RET 163 164 // func pipe2(flags int32) (r, w int32, errno int32) 165 TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20 166 ADD $16, RSP, R0 167 MOVW flags+0(FP), R1 168 SVC $SYS_pipe2 169 BCC pipe2ok 170 NEG R0, R0 171 pipe2ok: 172 MOVW R0, errno+16(FP) 173 RET 174 175 TEXT runtime·write1(SB),NOSPLIT,$-8 176 MOVD fd+0(FP), R0 // arg 1 - fd 177 MOVD p+8(FP), R1 // arg 2 - buf 178 MOVW n+16(FP), R2 // arg 3 - nbyte 179 SVC $SYS_write 180 BCC ok 181 NEG R0, R0 182 ok: 183 MOVW R0, ret+24(FP) 184 RET 185 186 TEXT runtime·usleep(SB),NOSPLIT,$24-4 187 MOVWU usec+0(FP), R3 188 MOVD R3, R5 189 MOVW $1000000, R4 190 UDIV R4, R3 191 MOVD R3, 8(RSP) // sec 192 MUL R3, R4 193 SUB R4, R5 194 MOVW $1000, R4 195 MUL R4, R5 196 MOVD R5, 16(RSP) // nsec 197 198 MOVD $8(RSP), R0 // arg 1 - rqtp 199 MOVD $0, R1 // arg 2 - rmtp 200 SVC $SYS___nanosleep50 201 RET 202 203 TEXT runtime·lwp_kill(SB),NOSPLIT,$0-16 204 MOVW tid+0(FP), R0 // arg 1 - target 205 MOVD sig+8(FP), R1 // arg 2 - signo 206 SVC $SYS__lwp_kill 207 RET 208 209 TEXT runtime·raiseproc(SB),NOSPLIT,$16 210 SVC $SYS_getpid 211 // arg 1 - pid (from getpid) 212 MOVD sig+0(FP), R1 // arg 2 - signo 213 SVC $SYS_kill 214 RET 215 216 TEXT runtime·setitimer(SB),NOSPLIT,$-8 217 MOVW mode+0(FP), R0 // arg 1 - which 218 MOVD new+8(FP), R1 // arg 2 - itv 219 MOVD old+16(FP), R2 // arg 3 - oitv 220 SVC $SYS___setitimer50 221 RET 222 223 // func walltime1() (sec int64, nsec int32) 224 TEXT runtime·walltime1(SB), NOSPLIT, $32 225 MOVW $CLOCK_REALTIME, R0 // arg 1 - clock_id 226 MOVD $8(RSP), R1 // arg 2 - tp 227 SVC $SYS___clock_gettime50 228 229 MOVD 8(RSP), R0 // sec 230 MOVD 16(RSP), R1 // nsec 231 232 // sec is in R0, nsec in R1 233 MOVD R0, sec+0(FP) 234 MOVW R1, nsec+8(FP) 235 RET 236 237 // int64 nanotime1(void) so really 238 // void nanotime1(int64 *nsec) 239 TEXT runtime·nanotime1(SB), NOSPLIT, $32 240 MOVD $CLOCK_MONOTONIC, R0 // arg 1 - clock_id 241 MOVD $8(RSP), R1 // arg 2 - tp 242 SVC $SYS___clock_gettime50 243 MOVD 8(RSP), R0 // sec 244 MOVD 16(RSP), R2 // nsec 245 246 // sec is in R0, nsec in R2 247 // return nsec in R2 248 MOVD $1000000000, R3 249 MUL R3, R0 250 ADD R2, R0 251 252 MOVD R0, ret+0(FP) 253 RET 254 255 TEXT runtime·getcontext(SB),NOSPLIT,$-8 256 MOVD ctxt+0(FP), R0 // arg 1 - context 257 SVC $SYS_getcontext 258 BCS fail 259 RET 260 fail: 261 MOVD $0, R0 262 MOVD R0, (R0) // crash 263 264 TEXT runtime·sigprocmask(SB),NOSPLIT,$0 265 MOVW how+0(FP), R0 // arg 1 - how 266 MOVD new+8(FP), R1 // arg 2 - set 267 MOVD old+16(FP), R2 // arg 3 - oset 268 SVC $SYS___sigprocmask14 269 BCS fail 270 RET 271 fail: 272 MOVD $0, R0 273 MOVD R0, (R0) // crash 274 275 TEXT sigreturn_tramp<>(SB),NOSPLIT,$-8 276 MOVD g, R0 277 SVC $SYS_setcontext 278 MOVD $0x4242, R0 // Something failed, return magic number 279 SVC $SYS_exit 280 281 TEXT runtime·sigaction(SB),NOSPLIT,$-8 282 MOVW sig+0(FP), R0 // arg 1 - signum 283 MOVD new+8(FP), R1 // arg 2 - nsa 284 MOVD old+16(FP), R2 // arg 3 - osa 285 // arg 4 - tramp 286 MOVD $sigreturn_tramp<>(SB), R3 287 MOVW $2, R4 // arg 5 - vers 288 SVC $SYS___sigaction_sigtramp 289 BCS fail 290 RET 291 fail: 292 MOVD $0, R0 293 MOVD R0, (R0) // crash 294 295 // XXX ??? 296 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 297 MOVW sig+8(FP), R0 298 MOVD info+16(FP), R1 299 MOVD ctx+24(FP), R2 300 MOVD fn+0(FP), R11 301 BL (R11) 302 RET 303 304 TEXT runtime·sigtramp(SB),NOSPLIT,$192 305 // Save callee-save registers in the case of signal forwarding. 306 // Please refer to https://golang.org/issue/31827 . 307 MOVD R19, 8*4(RSP) 308 MOVD R20, 8*5(RSP) 309 MOVD R21, 8*6(RSP) 310 MOVD R22, 8*7(RSP) 311 MOVD R23, 8*8(RSP) 312 MOVD R24, 8*9(RSP) 313 MOVD R25, 8*10(RSP) 314 MOVD R26, 8*11(RSP) 315 MOVD R27, 8*12(RSP) 316 MOVD g, 8*13(RSP) 317 // Unclobber g for now (kernel uses it as ucontext ptr) 318 // See https://github.com/golang/go/issues/30824#issuecomment-492772426 319 // This is only correct in the non-cgo case. 320 // XXX should use lwp_getprivate as suggested. 321 // 8*36 is ucontext.uc_mcontext.__gregs[_REG_X28] 322 MOVD 8*36(g), g 323 MOVD R29, 8*14(RSP) 324 FMOVD F8, 8*15(RSP) 325 FMOVD F9, 8*16(RSP) 326 FMOVD F10, 8*17(RSP) 327 FMOVD F11, 8*18(RSP) 328 FMOVD F12, 8*19(RSP) 329 FMOVD F13, 8*20(RSP) 330 FMOVD F14, 8*21(RSP) 331 FMOVD F15, 8*22(RSP) 332 333 // this might be called in external code context, 334 // where g is not set. 335 // first save R0, because runtime·load_g will clobber it 336 MOVD R0, 8(RSP) // signum 337 MOVB runtime·iscgo(SB), R0 338 CMP $0, R0 339 // XXX branch destination 340 BEQ 2(PC) 341 BL runtime·load_g(SB) 342 343 MOVD R1, 16(RSP) 344 MOVD R2, 24(RSP) 345 BL runtime·sigtrampgo(SB) 346 347 // Restore callee-save registers. 348 MOVD 8*4(RSP), R19 349 MOVD 8*5(RSP), R20 350 MOVD 8*6(RSP), R21 351 MOVD 8*7(RSP), R22 352 MOVD 8*8(RSP), R23 353 MOVD 8*9(RSP), R24 354 MOVD 8*10(RSP), R25 355 MOVD 8*11(RSP), R26 356 MOVD 8*12(RSP), R27 357 MOVD 8*13(RSP), g 358 MOVD 8*14(RSP), R29 359 FMOVD 8*15(RSP), F8 360 FMOVD 8*16(RSP), F9 361 FMOVD 8*17(RSP), F10 362 FMOVD 8*18(RSP), F11 363 FMOVD 8*19(RSP), F12 364 FMOVD 8*20(RSP), F13 365 FMOVD 8*21(RSP), F14 366 FMOVD 8*22(RSP), F15 367 368 RET 369 370 TEXT runtime·mmap(SB),NOSPLIT,$0 371 MOVD addr+0(FP), R0 // arg 1 - addr 372 MOVD n+8(FP), R1 // arg 2 - len 373 MOVW prot+16(FP), R2 // arg 3 - prot 374 MOVW flags+20(FP), R3 // arg 4 - flags 375 MOVW fd+24(FP), R4 // arg 5 - fd 376 MOVW $0, R5 // arg 6 - pad 377 MOVD off+28(FP), R6 // arg 7 - offset 378 SVC $SYS_mmap 379 BCS fail 380 MOVD R0, p+32(FP) 381 MOVD $0, err+40(FP) 382 RET 383 fail: 384 MOVD $0, p+32(FP) 385 MOVD R0, err+40(FP) 386 RET 387 388 TEXT runtime·munmap(SB),NOSPLIT,$0 389 MOVD addr+0(FP), R0 // arg 1 - addr 390 MOVD n+8(FP), R1 // arg 2 - len 391 SVC $SYS_munmap 392 BCS fail 393 RET 394 fail: 395 MOVD $0, R0 396 MOVD R0, (R0) // crash 397 398 TEXT runtime·madvise(SB),NOSPLIT,$0 399 MOVD addr+0(FP), R0 // arg 1 - addr 400 MOVD n+8(FP), R1 // arg 2 - len 401 MOVW flags+16(FP), R2 // arg 3 - behav 402 SVC $SYS_madvise 403 BCC ok 404 MOVD $-1, R0 405 ok: 406 MOVD R0, ret+24(FP) 407 RET 408 409 TEXT runtime·sigaltstack(SB),NOSPLIT,$0 410 MOVD new+0(FP), R0 // arg 1 - nss 411 MOVD old+8(FP), R1 // arg 2 - oss 412 SVC $SYS___sigaltstack14 413 BCS fail 414 RET 415 fail: 416 MOVD $0, R0 417 MOVD R0, (R0) // crash 418 419 TEXT runtime·sysctl(SB),NOSPLIT,$0 420 MOVD mib+0(FP), R0 // arg 1 - name 421 MOVW miblen+8(FP), R1 // arg 2 - namelen 422 MOVD out+16(FP), R2 // arg 3 - oldp 423 MOVD size+24(FP), R3 // arg 4 - oldlenp 424 MOVD dst+32(FP), R4 // arg 5 - newp 425 MOVD ndst+40(FP), R5 // arg 6 - newlen 426 SVC $SYS___sysctl 427 BCC ok 428 NEG R0, R0 429 ok: 430 MOVW R0, ret+48(FP) 431 RET 432 433 // int32 runtime·kqueue(void) 434 TEXT runtime·kqueue(SB),NOSPLIT,$0 435 MOVD $0, R0 436 SVC $SYS_kqueue 437 BCC ok 438 NEG R0, R0 439 ok: 440 MOVW R0, ret+0(FP) 441 RET 442 443 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout) 444 TEXT runtime·kevent(SB),NOSPLIT,$0 445 MOVW kq+0(FP), R0 // arg 1 - kq 446 MOVD ch+8(FP), R1 // arg 2 - changelist 447 MOVW nch+16(FP), R2 // arg 3 - nchanges 448 MOVD ev+24(FP), R3 // arg 4 - eventlist 449 MOVW nev+32(FP), R4 // arg 5 - nevents 450 MOVD ts+40(FP), R5 // arg 6 - timeout 451 SVC $SYS___kevent50 452 BCC ok 453 NEG R0, R0 454 ok: 455 MOVW R0, ret+48(FP) 456 RET 457 458 // void runtime·closeonexec(int32 fd) 459 TEXT runtime·closeonexec(SB),NOSPLIT,$0 460 MOVW fd+0(FP), R0 // arg 1 - fd 461 MOVW $F_SETFD, R1 462 MOVW $FD_CLOEXEC, R2 463 SVC $SYS_fcntl 464 RET 465 466 // func runtime·setNonblock(int32 fd) 467 TEXT runtime·setNonblock(SB),NOSPLIT|NOFRAME,$0-4 468 MOVW fd+0(FP), R0 // arg 1 - fd 469 MOVD $F_GETFL, R1 // arg 2 - cmd 470 MOVD $0, R2 // arg 3 471 SVC $SYS_fcntl 472 MOVD $O_NONBLOCK, R2 473 EOR R0, R2 // arg 3 - flags 474 MOVW fd+0(FP), R0 // arg 1 - fd 475 MOVD $F_SETFL, R1 // arg 2 - cmd 476 SVC $SYS_fcntl 477 RET