github.com/megatontech/mynoteforgo@v0.0.0-20200507084910-5d0c6ea6e890/源码/runtime/sys_linux_arm64.s (about) 1 // Copyright 2014 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, Linux 7 // 8 9 #include "go_asm.h" 10 #include "go_tls.h" 11 #include "textflag.h" 12 13 #define AT_FDCWD -100 14 15 #define CLOCK_REALTIME 0 16 #define CLOCK_MONOTONIC 1 17 18 #define SYS_exit 93 19 #define SYS_read 63 20 #define SYS_write 64 21 #define SYS_openat 56 22 #define SYS_close 57 23 #define SYS_fcntl 25 24 #define SYS_nanosleep 101 25 #define SYS_mmap 222 26 #define SYS_munmap 215 27 #define SYS_setitimer 103 28 #define SYS_clone 220 29 #define SYS_sched_yield 124 30 #define SYS_rt_sigreturn 139 31 #define SYS_rt_sigaction 134 32 #define SYS_rt_sigprocmask 135 33 #define SYS_sigaltstack 132 34 #define SYS_madvise 233 35 #define SYS_mincore 232 36 #define SYS_getpid 172 37 #define SYS_gettid 178 38 #define SYS_kill 129 39 #define SYS_tgkill 131 40 #define SYS_futex 98 41 #define SYS_sched_getaffinity 123 42 #define SYS_exit_group 94 43 #define SYS_epoll_create1 20 44 #define SYS_epoll_ctl 21 45 #define SYS_epoll_pwait 22 46 #define SYS_clock_gettime 113 47 #define SYS_faccessat 48 48 #define SYS_socket 198 49 #define SYS_connect 203 50 #define SYS_brk 214 51 52 TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4 53 MOVW code+0(FP), R0 54 MOVD $SYS_exit_group, R8 55 SVC 56 RET 57 58 // func exitThread(wait *uint32) 59 TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8 60 MOVD wait+0(FP), R0 61 // We're done using the stack. 62 MOVW $0, R1 63 STLRW R1, (R0) 64 MOVW $0, R0 // exit code 65 MOVD $SYS_exit, R8 66 SVC 67 JMP 0(PC) 68 69 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20 70 MOVD $AT_FDCWD, R0 71 MOVD name+0(FP), R1 72 MOVW mode+8(FP), R2 73 MOVW perm+12(FP), R3 74 MOVD $SYS_openat, R8 75 SVC 76 CMN $4095, R0 77 BCC done 78 MOVW $-1, R0 79 done: 80 MOVW R0, ret+16(FP) 81 RET 82 83 TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12 84 MOVW fd+0(FP), R0 85 MOVD $SYS_close, R8 86 SVC 87 CMN $4095, R0 88 BCC done 89 MOVW $-1, R0 90 done: 91 MOVW R0, ret+8(FP) 92 RET 93 94 TEXT runtime·write(SB),NOSPLIT|NOFRAME,$0-28 95 MOVD fd+0(FP), R0 96 MOVD p+8(FP), R1 97 MOVW n+16(FP), R2 98 MOVD $SYS_write, R8 99 SVC 100 CMN $4095, R0 101 BCC done 102 MOVW $-1, R0 103 done: 104 MOVW R0, ret+24(FP) 105 RET 106 107 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28 108 MOVW fd+0(FP), R0 109 MOVD p+8(FP), R1 110 MOVW n+16(FP), R2 111 MOVD $SYS_read, R8 112 SVC 113 CMN $4095, R0 114 BCC done 115 MOVW $-1, R0 116 done: 117 MOVW R0, ret+24(FP) 118 RET 119 120 TEXT runtime·usleep(SB),NOSPLIT,$24-4 121 MOVWU usec+0(FP), R3 122 MOVD R3, R5 123 MOVW $1000000, R4 124 UDIV R4, R3 125 MOVD R3, 8(RSP) 126 MUL R3, R4 127 SUB R4, R5 128 MOVW $1000, R4 129 MUL R4, R5 130 MOVD R5, 16(RSP) 131 132 // nanosleep(&ts, 0) 133 ADD $8, RSP, R0 134 MOVD $0, R1 135 MOVD $SYS_nanosleep, R8 136 SVC 137 RET 138 139 TEXT runtime·gettid(SB),NOSPLIT,$0-4 140 MOVD $SYS_gettid, R8 141 SVC 142 MOVW R0, ret+0(FP) 143 RET 144 145 TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0 146 MOVD $SYS_getpid, R8 147 SVC 148 MOVW R0, R19 149 MOVD $SYS_gettid, R8 150 SVC 151 MOVW R0, R1 // arg 2 tid 152 MOVW R19, R0 // arg 1 pid 153 MOVW sig+0(FP), R2 // arg 3 154 MOVD $SYS_tgkill, R8 155 SVC 156 RET 157 158 TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0 159 MOVD $SYS_getpid, R8 160 SVC 161 MOVW R0, R0 // arg 1 pid 162 MOVW sig+0(FP), R1 // arg 2 163 MOVD $SYS_kill, R8 164 SVC 165 RET 166 167 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24 168 MOVW mode+0(FP), R0 169 MOVD new+8(FP), R1 170 MOVD old+16(FP), R2 171 MOVD $SYS_setitimer, R8 172 SVC 173 RET 174 175 TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28 176 MOVD addr+0(FP), R0 177 MOVD n+8(FP), R1 178 MOVD dst+16(FP), R2 179 MOVD $SYS_mincore, R8 180 SVC 181 MOVW R0, ret+24(FP) 182 RET 183 184 // func walltime() (sec int64, nsec int32) 185 TEXT runtime·walltime(SB),NOSPLIT,$24-12 186 MOVD RSP, R20 // R20 is unchanged by C code 187 MOVD RSP, R1 188 189 MOVD g_m(g), R21 // R21 = m 190 191 // Set vdsoPC and vdsoSP for SIGPROF traceback. 192 MOVD LR, m_vdsoPC(R21) 193 MOVD R20, m_vdsoSP(R21) 194 195 MOVD m_curg(R21), R0 196 CMP g, R0 197 BNE noswitch 198 199 MOVD m_g0(R21), R3 200 MOVD (g_sched+gobuf_sp)(R3), R1 // Set RSP to g0 stack 201 202 noswitch: 203 SUB $16, R1 204 BIC $15, R1 // Align for C code 205 MOVD R1, RSP 206 207 MOVW $CLOCK_REALTIME, R0 208 MOVD runtime·vdsoClockgettimeSym(SB), R2 209 CBZ R2, fallback 210 BL (R2) 211 B finish 212 213 fallback: 214 MOVD $SYS_clock_gettime, R8 215 SVC 216 217 finish: 218 MOVD 0(RSP), R3 // sec 219 MOVD 8(RSP), R5 // nsec 220 221 MOVD R20, RSP // restore SP 222 MOVD $0, m_vdsoSP(R21) // clear vdsoSP 223 224 MOVD R3, sec+0(FP) 225 MOVW R5, nsec+8(FP) 226 RET 227 228 TEXT runtime·nanotime(SB),NOSPLIT,$24-8 229 MOVD RSP, R20 // R20 is unchanged by C code 230 MOVD RSP, R1 231 232 MOVD g_m(g), R21 // R21 = m 233 234 // Set vdsoPC and vdsoSP for SIGPROF traceback. 235 MOVD LR, m_vdsoPC(R21) 236 MOVD R20, m_vdsoSP(R21) 237 238 MOVD m_curg(R21), R0 239 CMP g, R0 240 BNE noswitch 241 242 MOVD m_g0(R21), R3 243 MOVD (g_sched+gobuf_sp)(R3), R1 // Set RSP to g0 stack 244 245 noswitch: 246 SUB $32, R1 247 BIC $15, R1 248 MOVD R1, RSP 249 250 MOVW $CLOCK_MONOTONIC, R0 251 MOVD runtime·vdsoClockgettimeSym(SB), R2 252 CBZ R2, fallback 253 BL (R2) 254 B finish 255 256 fallback: 257 MOVD $SYS_clock_gettime, R8 258 SVC 259 260 finish: 261 MOVD 0(RSP), R3 // sec 262 MOVD 8(RSP), R5 // nsec 263 264 MOVD R20, RSP // restore SP 265 MOVD $0, m_vdsoSP(R21) // clear vdsoSP 266 267 // sec is in R3, nsec in R5 268 // return nsec in R3 269 MOVD $1000000000, R4 270 MUL R4, R3 271 ADD R5, R3 272 MOVD R3, ret+0(FP) 273 RET 274 275 TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28 276 MOVW how+0(FP), R0 277 MOVD new+8(FP), R1 278 MOVD old+16(FP), R2 279 MOVW size+24(FP), R3 280 MOVD $SYS_rt_sigprocmask, R8 281 SVC 282 CMN $4095, R0 283 BCC done 284 MOVD $0, R0 285 MOVD R0, (R0) // crash 286 done: 287 RET 288 289 TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36 290 MOVD sig+0(FP), R0 291 MOVD new+8(FP), R1 292 MOVD old+16(FP), R2 293 MOVD size+24(FP), R3 294 MOVD $SYS_rt_sigaction, R8 295 SVC 296 MOVW R0, ret+32(FP) 297 RET 298 299 // Call the function stored in _cgo_sigaction using the GCC calling convention. 300 TEXT runtime·callCgoSigaction(SB),NOSPLIT,$0 301 MOVD sig+0(FP), R0 302 MOVD new+8(FP), R1 303 MOVD old+16(FP), R2 304 MOVD _cgo_sigaction(SB), R3 305 SUB $16, RSP // reserve 16 bytes for sp-8 where fp may be saved. 306 BL R3 307 ADD $16, RSP 308 MOVW R0, ret+24(FP) 309 RET 310 311 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 312 MOVW sig+8(FP), R0 313 MOVD info+16(FP), R1 314 MOVD ctx+24(FP), R2 315 MOVD fn+0(FP), R11 316 BL (R11) 317 RET 318 319 TEXT runtime·sigtramp(SB),NOSPLIT,$24 320 // this might be called in external code context, 321 // where g is not set. 322 // first save R0, because runtime·load_g will clobber it 323 MOVW R0, 8(RSP) 324 MOVBU runtime·iscgo(SB), R0 325 CMP $0, R0 326 BEQ 2(PC) 327 BL runtime·load_g(SB) 328 329 MOVD R1, 16(RSP) 330 MOVD R2, 24(RSP) 331 MOVD $runtime·sigtrampgo(SB), R0 332 BL (R0) 333 RET 334 335 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0 336 MOVD $runtime·sigtramp(SB), R3 337 B (R3) 338 339 TEXT runtime·sysMmap(SB),NOSPLIT|NOFRAME,$0 340 MOVD addr+0(FP), R0 341 MOVD n+8(FP), R1 342 MOVW prot+16(FP), R2 343 MOVW flags+20(FP), R3 344 MOVW fd+24(FP), R4 345 MOVW off+28(FP), R5 346 347 MOVD $SYS_mmap, R8 348 SVC 349 CMN $4095, R0 350 BCC ok 351 NEG R0,R0 352 MOVD $0, p+32(FP) 353 MOVD R0, err+40(FP) 354 RET 355 ok: 356 MOVD R0, p+32(FP) 357 MOVD $0, err+40(FP) 358 RET 359 360 // Call the function stored in _cgo_mmap using the GCC calling convention. 361 // This must be called on the system stack. 362 TEXT runtime·callCgoMmap(SB),NOSPLIT,$0 363 MOVD addr+0(FP), R0 364 MOVD n+8(FP), R1 365 MOVW prot+16(FP), R2 366 MOVW flags+20(FP), R3 367 MOVW fd+24(FP), R4 368 MOVW off+28(FP), R5 369 MOVD _cgo_mmap(SB), R9 370 SUB $16, RSP // reserve 16 bytes for sp-8 where fp may be saved. 371 BL R9 372 ADD $16, RSP 373 MOVD R0, ret+32(FP) 374 RET 375 376 TEXT runtime·sysMunmap(SB),NOSPLIT|NOFRAME,$0 377 MOVD addr+0(FP), R0 378 MOVD n+8(FP), R1 379 MOVD $SYS_munmap, R8 380 SVC 381 CMN $4095, R0 382 BCC cool 383 MOVD R0, 0xf0(R0) 384 cool: 385 RET 386 387 // Call the function stored in _cgo_munmap using the GCC calling convention. 388 // This must be called on the system stack. 389 TEXT runtime·callCgoMunmap(SB),NOSPLIT,$0 390 MOVD addr+0(FP), R0 391 MOVD n+8(FP), R1 392 MOVD _cgo_munmap(SB), R9 393 SUB $16, RSP // reserve 16 bytes for sp-8 where fp may be saved. 394 BL R9 395 ADD $16, RSP 396 RET 397 398 TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0 399 MOVD addr+0(FP), R0 400 MOVD n+8(FP), R1 401 MOVW flags+16(FP), R2 402 MOVD $SYS_madvise, R8 403 SVC 404 MOVW R0, ret+24(FP) 405 RET 406 407 // int64 futex(int32 *uaddr, int32 op, int32 val, 408 // struct timespec *timeout, int32 *uaddr2, int32 val2); 409 TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0 410 MOVD addr+0(FP), R0 411 MOVW op+8(FP), R1 412 MOVW val+12(FP), R2 413 MOVD ts+16(FP), R3 414 MOVD addr2+24(FP), R4 415 MOVW val3+32(FP), R5 416 MOVD $SYS_futex, R8 417 SVC 418 MOVW R0, ret+40(FP) 419 RET 420 421 // int64 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void)); 422 TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0 423 MOVW flags+0(FP), R0 424 MOVD stk+8(FP), R1 425 426 // Copy mp, gp, fn off parent stack for use by child. 427 MOVD mp+16(FP), R10 428 MOVD gp+24(FP), R11 429 MOVD fn+32(FP), R12 430 431 MOVD R10, -8(R1) 432 MOVD R11, -16(R1) 433 MOVD R12, -24(R1) 434 MOVD $1234, R10 435 MOVD R10, -32(R1) 436 437 MOVD $SYS_clone, R8 438 SVC 439 440 // In parent, return. 441 CMP ZR, R0 442 BEQ child 443 MOVW R0, ret+40(FP) 444 RET 445 child: 446 447 // In child, on new stack. 448 MOVD -32(RSP), R10 449 MOVD $1234, R0 450 CMP R0, R10 451 BEQ good 452 MOVD $0, R0 453 MOVD R0, (R0) // crash 454 455 good: 456 // Initialize m->procid to Linux tid 457 MOVD $SYS_gettid, R8 458 SVC 459 460 MOVD -24(RSP), R12 // fn 461 MOVD -16(RSP), R11 // g 462 MOVD -8(RSP), R10 // m 463 464 CMP $0, R10 465 BEQ nog 466 CMP $0, R11 467 BEQ nog 468 469 MOVD R0, m_procid(R10) 470 471 // TODO: setup TLS. 472 473 // In child, set up new stack 474 MOVD R10, g_m(R11) 475 MOVD R11, g 476 //CALL runtime·stackcheck(SB) 477 478 nog: 479 // Call fn 480 MOVD R12, R0 481 BL (R0) 482 483 // It shouldn't return. If it does, exit that thread. 484 MOVW $111, R0 485 again: 486 MOVD $SYS_exit, R8 487 SVC 488 B again // keep exiting 489 490 TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0 491 MOVD new+0(FP), R0 492 MOVD old+8(FP), R1 493 MOVD $SYS_sigaltstack, R8 494 SVC 495 CMN $4095, R0 496 BCC ok 497 MOVD $0, R0 498 MOVD R0, (R0) // crash 499 ok: 500 RET 501 502 TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0 503 MOVD $SYS_sched_yield, R8 504 SVC 505 RET 506 507 TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0 508 MOVD pid+0(FP), R0 509 MOVD len+8(FP), R1 510 MOVD buf+16(FP), R2 511 MOVD $SYS_sched_getaffinity, R8 512 SVC 513 MOVW R0, ret+24(FP) 514 RET 515 516 // int32 runtime·epollcreate(int32 size); 517 TEXT runtime·epollcreate(SB),NOSPLIT|NOFRAME,$0 518 MOVW $0, R0 519 MOVD $SYS_epoll_create1, R8 520 SVC 521 MOVW R0, ret+8(FP) 522 RET 523 524 // int32 runtime·epollcreate1(int32 flags); 525 TEXT runtime·epollcreate1(SB),NOSPLIT|NOFRAME,$0 526 MOVW flags+0(FP), R0 527 MOVD $SYS_epoll_create1, R8 528 SVC 529 MOVW R0, ret+8(FP) 530 RET 531 532 // func epollctl(epfd, op, fd int32, ev *epollEvent) int 533 TEXT runtime·epollctl(SB),NOSPLIT|NOFRAME,$0 534 MOVW epfd+0(FP), R0 535 MOVW op+4(FP), R1 536 MOVW fd+8(FP), R2 537 MOVD ev+16(FP), R3 538 MOVD $SYS_epoll_ctl, R8 539 SVC 540 MOVW R0, ret+24(FP) 541 RET 542 543 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout); 544 TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0 545 MOVW epfd+0(FP), R0 546 MOVD ev+8(FP), R1 547 MOVW nev+16(FP), R2 548 MOVW timeout+20(FP), R3 549 MOVD $0, R4 550 MOVD $SYS_epoll_pwait, R8 551 SVC 552 MOVW R0, ret+24(FP) 553 RET 554 555 // void runtime·closeonexec(int32 fd); 556 TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0 557 MOVW fd+0(FP), R0 // fd 558 MOVD $2, R1 // F_SETFD 559 MOVD $1, R2 // FD_CLOEXEC 560 MOVD $SYS_fcntl, R8 561 SVC 562 RET 563 564 // int access(const char *name, int mode) 565 TEXT runtime·access(SB),NOSPLIT,$0-20 566 MOVD $AT_FDCWD, R0 567 MOVD name+0(FP), R1 568 MOVW mode+8(FP), R2 569 MOVD $SYS_faccessat, R8 570 SVC 571 MOVW R0, ret+16(FP) 572 RET 573 574 // int connect(int fd, const struct sockaddr *addr, socklen_t len) 575 TEXT runtime·connect(SB),NOSPLIT,$0-28 576 MOVW fd+0(FP), R0 577 MOVD addr+8(FP), R1 578 MOVW len+16(FP), R2 579 MOVD $SYS_connect, R8 580 SVC 581 MOVW R0, ret+24(FP) 582 RET 583 584 // int socket(int domain, int typ, int prot) 585 TEXT runtime·socket(SB),NOSPLIT,$0-20 586 MOVW domain+0(FP), R0 587 MOVW typ+4(FP), R1 588 MOVW prot+8(FP), R2 589 MOVD $SYS_socket, R8 590 SVC 591 MOVW R0, ret+16(FP) 592 RET 593 594 // func sbrk0() uintptr 595 TEXT runtime·sbrk0(SB),NOSPLIT,$0-8 596 // Implemented as brk(NULL). 597 MOVD $0, R0 598 MOVD $SYS_brk, R8 599 SVC 600 MOVD R0, ret+0(FP) 601 RET