github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/src/runtime/sys_linux_amd64.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 // 6 // System calls and other sys.stuff for AMD64, Linux 7 // 8 9 #include "go_asm.h" 10 #include "go_tls.h" 11 #include "textflag.h" 12 13 #define SYS_read 0 14 #define SYS_write 1 15 #define SYS_open 2 16 #define SYS_close 3 17 #define SYS_mmap 9 18 #define SYS_munmap 11 19 #define SYS_brk 12 20 #define SYS_rt_sigaction 13 21 #define SYS_rt_sigprocmask 14 22 #define SYS_rt_sigreturn 15 23 #define SYS_access 21 24 #define SYS_sched_yield 24 25 #define SYS_mincore 27 26 #define SYS_madvise 28 27 #define SYS_setittimer 38 28 #define SYS_getpid 39 29 #define SYS_socket 41 30 #define SYS_connect 42 31 #define SYS_clone 56 32 #define SYS_exit 60 33 #define SYS_kill 62 34 #define SYS_fcntl 72 35 #define SYS_getrlimit 97 36 #define SYS_sigaltstack 131 37 #define SYS_arch_prctl 158 38 #define SYS_gettid 186 39 #define SYS_tkill 200 40 #define SYS_futex 202 41 #define SYS_sched_getaffinity 204 42 #define SYS_epoll_create 213 43 #define SYS_exit_group 231 44 #define SYS_epoll_wait 232 45 #define SYS_epoll_ctl 233 46 #define SYS_pselect6 270 47 #define SYS_epoll_create1 291 48 49 TEXT runtime·exit(SB),NOSPLIT,$0-4 50 MOVL code+0(FP), DI 51 MOVL $SYS_exit_group, AX 52 SYSCALL 53 RET 54 55 // func exitThread(wait *uint32) 56 TEXT runtime·exitThread(SB),NOSPLIT,$0-8 57 MOVQ wait+0(FP), AX 58 // We're done using the stack. 59 MOVL $0, (AX) 60 MOVL $0, DI // exit code 61 MOVL $SYS_exit, AX 62 SYSCALL 63 // We may not even have a stack any more. 64 INT $3 65 JMP 0(PC) 66 67 TEXT runtime·open(SB),NOSPLIT,$0-20 68 MOVQ name+0(FP), DI 69 MOVL mode+8(FP), SI 70 MOVL perm+12(FP), DX 71 MOVL $SYS_open, AX 72 SYSCALL 73 CMPQ AX, $0xfffffffffffff001 74 JLS 2(PC) 75 MOVL $-1, AX 76 MOVL AX, ret+16(FP) 77 RET 78 79 TEXT runtime·closefd(SB),NOSPLIT,$0-12 80 MOVL fd+0(FP), DI 81 MOVL $SYS_close, AX 82 SYSCALL 83 CMPQ AX, $0xfffffffffffff001 84 JLS 2(PC) 85 MOVL $-1, AX 86 MOVL AX, ret+8(FP) 87 RET 88 89 TEXT runtime·write(SB),NOSPLIT,$0-28 90 MOVQ fd+0(FP), DI 91 MOVQ p+8(FP), SI 92 MOVL n+16(FP), DX 93 MOVL $SYS_write, AX 94 SYSCALL 95 CMPQ AX, $0xfffffffffffff001 96 JLS 2(PC) 97 MOVL $-1, AX 98 MOVL AX, ret+24(FP) 99 RET 100 101 TEXT runtime·read(SB),NOSPLIT,$0-28 102 MOVL fd+0(FP), DI 103 MOVQ p+8(FP), SI 104 MOVL n+16(FP), DX 105 MOVL $SYS_read, AX 106 SYSCALL 107 CMPQ AX, $0xfffffffffffff001 108 JLS 2(PC) 109 MOVL $-1, AX 110 MOVL AX, ret+24(FP) 111 RET 112 113 TEXT runtime·getrlimit(SB),NOSPLIT,$0-20 114 MOVL kind+0(FP), DI 115 MOVQ limit+8(FP), SI 116 MOVL $SYS_getrlimit, AX 117 SYSCALL 118 MOVL AX, ret+16(FP) 119 RET 120 121 TEXT runtime·usleep(SB),NOSPLIT,$16 122 MOVL $0, DX 123 MOVL usec+0(FP), AX 124 MOVL $1000000, CX 125 DIVL CX 126 MOVQ AX, 0(SP) 127 MOVL $1000, AX // usec to nsec 128 MULL DX 129 MOVQ AX, 8(SP) 130 131 // pselect6(0, 0, 0, 0, &ts, 0) 132 MOVL $0, DI 133 MOVL $0, SI 134 MOVL $0, DX 135 MOVL $0, R10 136 MOVQ SP, R8 137 MOVL $0, R9 138 MOVL $SYS_pselect6, AX 139 SYSCALL 140 RET 141 142 TEXT runtime·gettid(SB),NOSPLIT,$0-4 143 MOVL $SYS_gettid, AX 144 SYSCALL 145 MOVL AX, ret+0(FP) 146 RET 147 148 TEXT runtime·raise(SB),NOSPLIT,$0 149 MOVL $SYS_gettid, AX 150 SYSCALL 151 MOVL AX, DI // arg 1 tid 152 MOVL sig+0(FP), SI // arg 2 153 MOVL $SYS_tkill, AX 154 SYSCALL 155 RET 156 157 TEXT runtime·raiseproc(SB),NOSPLIT,$0 158 MOVL $SYS_getpid, AX 159 SYSCALL 160 MOVL AX, DI // arg 1 pid 161 MOVL sig+0(FP), SI // arg 2 162 MOVL $SYS_kill, AX 163 SYSCALL 164 RET 165 166 TEXT runtime·setitimer(SB),NOSPLIT,$0-24 167 MOVL mode+0(FP), DI 168 MOVQ new+8(FP), SI 169 MOVQ old+16(FP), DX 170 MOVL $SYS_setittimer, AX 171 SYSCALL 172 RET 173 174 TEXT runtime·mincore(SB),NOSPLIT,$0-28 175 MOVQ addr+0(FP), DI 176 MOVQ n+8(FP), SI 177 MOVQ dst+16(FP), DX 178 MOVL $SYS_mincore, AX 179 SYSCALL 180 MOVL AX, ret+24(FP) 181 RET 182 183 // func walltime() (sec int64, nsec int32) 184 TEXT runtime·walltime(SB),NOSPLIT,$16 185 // Be careful. We're calling a function with gcc calling convention here. 186 // We're guaranteed 128 bytes on entry, and we've taken 16, and the 187 // call uses another 8. 188 // That leaves 104 for the gettime code to use. Hope that's enough! 189 MOVQ runtime·__vdso_clock_gettime_sym(SB), AX 190 CMPQ AX, $0 191 JEQ fallback 192 MOVL $0, DI // CLOCK_REALTIME 193 LEAQ 0(SP), SI 194 CALL AX 195 MOVQ 0(SP), AX // sec 196 MOVQ 8(SP), DX // nsec 197 MOVQ AX, sec+0(FP) 198 MOVL DX, nsec+8(FP) 199 RET 200 fallback: 201 LEAQ 0(SP), DI 202 MOVQ $0, SI 203 MOVQ runtime·__vdso_gettimeofday_sym(SB), AX 204 CALL AX 205 MOVQ 0(SP), AX // sec 206 MOVL 8(SP), DX // usec 207 IMULQ $1000, DX 208 MOVQ AX, sec+0(FP) 209 MOVL DX, nsec+8(FP) 210 RET 211 212 TEXT runtime·nanotime(SB),NOSPLIT,$16 213 // Duplicate time.now here to avoid using up precious stack space. 214 // See comment above in time.now. 215 MOVQ runtime·__vdso_clock_gettime_sym(SB), AX 216 CMPQ AX, $0 217 JEQ fallback 218 MOVL $1, DI // CLOCK_MONOTONIC 219 LEAQ 0(SP), SI 220 CALL AX 221 MOVQ 0(SP), AX // sec 222 MOVQ 8(SP), DX // nsec 223 // sec is in AX, nsec in DX 224 // return nsec in AX 225 IMULQ $1000000000, AX 226 ADDQ DX, AX 227 MOVQ AX, ret+0(FP) 228 RET 229 fallback: 230 LEAQ 0(SP), DI 231 MOVQ $0, SI 232 MOVQ runtime·__vdso_gettimeofday_sym(SB), AX 233 CALL AX 234 MOVQ 0(SP), AX // sec 235 MOVL 8(SP), DX // usec 236 IMULQ $1000, DX 237 // sec is in AX, nsec in DX 238 // return nsec in AX 239 IMULQ $1000000000, AX 240 ADDQ DX, AX 241 MOVQ AX, ret+0(FP) 242 RET 243 244 TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0-28 245 MOVL how+0(FP), DI 246 MOVQ new+8(FP), SI 247 MOVQ old+16(FP), DX 248 MOVL size+24(FP), R10 249 MOVL $SYS_rt_sigprocmask, AX 250 SYSCALL 251 CMPQ AX, $0xfffffffffffff001 252 JLS 2(PC) 253 MOVL $0xf1, 0xf1 // crash 254 RET 255 256 TEXT runtime·sysSigaction(SB),NOSPLIT,$0-36 257 MOVQ sig+0(FP), DI 258 MOVQ new+8(FP), SI 259 MOVQ old+16(FP), DX 260 MOVQ size+24(FP), R10 261 MOVL $SYS_rt_sigaction, AX 262 SYSCALL 263 MOVL AX, ret+32(FP) 264 RET 265 266 // Call the function stored in _cgo_sigaction using the GCC calling convention. 267 TEXT runtime·callCgoSigaction(SB),NOSPLIT,$16 268 MOVQ sig+0(FP), DI 269 MOVQ new+8(FP), SI 270 MOVQ old+16(FP), DX 271 MOVQ _cgo_sigaction(SB), AX 272 MOVQ SP, BX // callee-saved 273 ANDQ $~15, SP // alignment as per amd64 psABI 274 CALL AX 275 MOVQ BX, SP 276 MOVL AX, ret+24(FP) 277 RET 278 279 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 280 MOVQ fn+0(FP), AX 281 MOVL sig+8(FP), DI 282 MOVQ info+16(FP), SI 283 MOVQ ctx+24(FP), DX 284 PUSHQ BP 285 MOVQ SP, BP 286 ANDQ $~15, SP // alignment for x86_64 ABI 287 CALL AX 288 MOVQ BP, SP 289 POPQ BP 290 RET 291 292 TEXT runtime·sigtramp(SB),NOSPLIT,$72 293 // Save callee-saved C registers, since the caller may be a C signal handler. 294 MOVQ BX, bx-8(SP) 295 MOVQ BP, bp-16(SP) // save in case GOEXPERIMENT=noframepointer is set 296 MOVQ R12, r12-24(SP) 297 MOVQ R13, r13-32(SP) 298 MOVQ R14, r14-40(SP) 299 MOVQ R15, r15-48(SP) 300 // We don't save mxcsr or the x87 control word because sigtrampgo doesn't 301 // modify them. 302 303 MOVQ DX, ctx-56(SP) 304 MOVQ SI, info-64(SP) 305 MOVQ DI, signum-72(SP) 306 MOVQ $runtime·sigtrampgo(SB), AX 307 CALL AX 308 309 MOVQ r15-48(SP), R15 310 MOVQ r14-40(SP), R14 311 MOVQ r13-32(SP), R13 312 MOVQ r12-24(SP), R12 313 MOVQ bp-16(SP), BP 314 MOVQ bx-8(SP), BX 315 RET 316 317 // Used instead of sigtramp in programs that use cgo. 318 // Arguments from kernel are in DI, SI, DX. 319 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0 320 // If no traceback function, do usual sigtramp. 321 MOVQ runtime·cgoTraceback(SB), AX 322 TESTQ AX, AX 323 JZ sigtramp 324 325 // If no traceback support function, which means that 326 // runtime/cgo was not linked in, do usual sigtramp. 327 MOVQ _cgo_callers(SB), AX 328 TESTQ AX, AX 329 JZ sigtramp 330 331 // Figure out if we are currently in a cgo call. 332 // If not, just do usual sigtramp. 333 get_tls(CX) 334 MOVQ g(CX),AX 335 TESTQ AX, AX 336 JZ sigtrampnog // g == nil 337 MOVQ g_m(AX), AX 338 TESTQ AX, AX 339 JZ sigtramp // g.m == nil 340 MOVL m_ncgo(AX), CX 341 TESTL CX, CX 342 JZ sigtramp // g.m.ncgo == 0 343 MOVQ m_curg(AX), CX 344 TESTQ CX, CX 345 JZ sigtramp // g.m.curg == nil 346 MOVQ g_syscallsp(CX), CX 347 TESTQ CX, CX 348 JZ sigtramp // g.m.curg.syscallsp == 0 349 MOVQ m_cgoCallers(AX), R8 350 TESTQ R8, R8 351 JZ sigtramp // g.m.cgoCallers == nil 352 MOVL m_cgoCallersUse(AX), CX 353 TESTL CX, CX 354 JNZ sigtramp // g.m.cgoCallersUse != 0 355 356 // Jump to a function in runtime/cgo. 357 // That function, written in C, will call the user's traceback 358 // function with proper unwind info, and will then call back here. 359 // The first three arguments, and the fifth, are already in registers. 360 // Set the two remaining arguments now. 361 MOVQ runtime·cgoTraceback(SB), CX 362 MOVQ $runtime·sigtramp(SB), R9 363 MOVQ _cgo_callers(SB), AX 364 JMP AX 365 366 sigtramp: 367 JMP runtime·sigtramp(SB) 368 369 sigtrampnog: 370 // Signal arrived on a non-Go thread. If this is SIGPROF, get a 371 // stack trace. 372 CMPL DI, $27 // 27 == SIGPROF 373 JNZ sigtramp 374 375 // Lock sigprofCallersUse. 376 MOVL $0, AX 377 MOVL $1, CX 378 MOVQ $runtime·sigprofCallersUse(SB), R11 379 LOCK 380 CMPXCHGL CX, 0(R11) 381 JNZ sigtramp // Skip stack trace if already locked. 382 383 // Jump to the traceback function in runtime/cgo. 384 // It will call back to sigprofNonGo, which will ignore the 385 // arguments passed in registers. 386 // First three arguments to traceback function are in registers already. 387 MOVQ runtime·cgoTraceback(SB), CX 388 MOVQ $runtime·sigprofCallers(SB), R8 389 MOVQ $runtime·sigprofNonGo(SB), R9 390 MOVQ _cgo_callers(SB), AX 391 JMP AX 392 393 // For cgo unwinding to work, this function must look precisely like 394 // the one in glibc. The glibc source code is: 395 // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86_64/sigaction.c 396 // The code that cares about the precise instructions used is: 397 // https://gcc.gnu.org/viewcvs/gcc/trunk/libgcc/config/i386/linux-unwind.h?revision=219188&view=markup 398 TEXT runtime·sigreturn(SB),NOSPLIT,$0 399 MOVQ $SYS_rt_sigreturn, AX 400 SYSCALL 401 INT $3 // not reached 402 403 TEXT runtime·sysMmap(SB),NOSPLIT,$0 404 MOVQ addr+0(FP), DI 405 MOVQ n+8(FP), SI 406 MOVL prot+16(FP), DX 407 MOVL flags+20(FP), R10 408 MOVL fd+24(FP), R8 409 MOVL off+28(FP), R9 410 411 MOVL $SYS_mmap, AX 412 SYSCALL 413 CMPQ AX, $0xfffffffffffff001 414 JLS ok 415 NOTQ AX 416 INCQ AX 417 MOVQ $0, p+32(FP) 418 MOVQ AX, err+40(FP) 419 RET 420 ok: 421 MOVQ AX, p+32(FP) 422 MOVQ $0, err+40(FP) 423 RET 424 425 // Call the function stored in _cgo_mmap using the GCC calling convention. 426 // This must be called on the system stack. 427 TEXT runtime·callCgoMmap(SB),NOSPLIT,$16 428 MOVQ addr+0(FP), DI 429 MOVQ n+8(FP), SI 430 MOVL prot+16(FP), DX 431 MOVL flags+20(FP), CX 432 MOVL fd+24(FP), R8 433 MOVL off+28(FP), R9 434 MOVQ _cgo_mmap(SB), AX 435 MOVQ SP, BX 436 ANDQ $~15, SP // alignment as per amd64 psABI 437 MOVQ BX, 0(SP) 438 CALL AX 439 MOVQ 0(SP), SP 440 MOVQ AX, ret+32(FP) 441 RET 442 443 TEXT runtime·sysMunmap(SB),NOSPLIT,$0 444 MOVQ addr+0(FP), DI 445 MOVQ n+8(FP), SI 446 MOVQ $SYS_munmap, AX 447 SYSCALL 448 CMPQ AX, $0xfffffffffffff001 449 JLS 2(PC) 450 MOVL $0xf1, 0xf1 // crash 451 RET 452 453 // Call the function stored in _cgo_munmap using the GCC calling convention. 454 // This must be called on the system stack. 455 TEXT runtime·callCgoMunmap(SB),NOSPLIT,$16-16 456 MOVQ addr+0(FP), DI 457 MOVQ n+8(FP), SI 458 MOVQ _cgo_munmap(SB), AX 459 MOVQ SP, BX 460 ANDQ $~15, SP // alignment as per amd64 psABI 461 MOVQ BX, 0(SP) 462 CALL AX 463 MOVQ 0(SP), SP 464 RET 465 466 TEXT runtime·madvise(SB),NOSPLIT,$0 467 MOVQ addr+0(FP), DI 468 MOVQ n+8(FP), SI 469 MOVL flags+16(FP), DX 470 MOVQ $SYS_madvise, AX 471 SYSCALL 472 // ignore failure - maybe pages are locked 473 RET 474 475 // int64 futex(int32 *uaddr, int32 op, int32 val, 476 // struct timespec *timeout, int32 *uaddr2, int32 val2); 477 TEXT runtime·futex(SB),NOSPLIT,$0 478 MOVQ addr+0(FP), DI 479 MOVL op+8(FP), SI 480 MOVL val+12(FP), DX 481 MOVQ ts+16(FP), R10 482 MOVQ addr2+24(FP), R8 483 MOVL val3+32(FP), R9 484 MOVL $SYS_futex, AX 485 SYSCALL 486 MOVL AX, ret+40(FP) 487 RET 488 489 // int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void)); 490 TEXT runtime·clone(SB),NOSPLIT,$0 491 MOVL flags+0(FP), DI 492 MOVQ stk+8(FP), SI 493 MOVQ $0, DX 494 MOVQ $0, R10 495 496 // Copy mp, gp, fn off parent stack for use by child. 497 // Careful: Linux system call clobbers CX and R11. 498 MOVQ mp+16(FP), R8 499 MOVQ gp+24(FP), R9 500 MOVQ fn+32(FP), R12 501 502 MOVL $SYS_clone, AX 503 SYSCALL 504 505 // In parent, return. 506 CMPQ AX, $0 507 JEQ 3(PC) 508 MOVL AX, ret+40(FP) 509 RET 510 511 // In child, on new stack. 512 MOVQ SI, SP 513 514 // If g or m are nil, skip Go-related setup. 515 CMPQ R8, $0 // m 516 JEQ nog 517 CMPQ R9, $0 // g 518 JEQ nog 519 520 // Initialize m->procid to Linux tid 521 MOVL $SYS_gettid, AX 522 SYSCALL 523 MOVQ AX, m_procid(R8) 524 525 // Set FS to point at m->tls. 526 LEAQ m_tls(R8), DI 527 CALL runtime·settls(SB) 528 529 // In child, set up new stack 530 get_tls(CX) 531 MOVQ R8, g_m(R9) 532 MOVQ R9, g(CX) 533 CALL runtime·stackcheck(SB) 534 535 nog: 536 // Call fn 537 CALL R12 538 539 // It shouldn't return. If it does, exit that thread. 540 MOVL $111, DI 541 MOVL $SYS_exit, AX 542 SYSCALL 543 JMP -3(PC) // keep exiting 544 545 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 546 MOVQ new+0(FP), DI 547 MOVQ old+8(FP), SI 548 MOVQ $SYS_sigaltstack, AX 549 SYSCALL 550 CMPQ AX, $0xfffffffffffff001 551 JLS 2(PC) 552 MOVL $0xf1, 0xf1 // crash 553 RET 554 555 // set tls base to DI 556 TEXT runtime·settls(SB),NOSPLIT,$32 557 #ifdef GOOS_android 558 // Same as in sys_darwin_386.s:/ugliness, different constant. 559 // DI currently holds m->tls, which must be fs:0x1d0. 560 // See cgo/gcc_android_amd64.c for the derivation of the constant. 561 SUBQ $0x1d0, DI // In android, the tls base 562 #else 563 ADDQ $8, DI // ELF wants to use -8(FS) 564 #endif 565 MOVQ DI, SI 566 MOVQ $0x1002, DI // ARCH_SET_FS 567 MOVQ $SYS_arch_prctl, AX 568 SYSCALL 569 CMPQ AX, $0xfffffffffffff001 570 JLS 2(PC) 571 MOVL $0xf1, 0xf1 // crash 572 RET 573 574 TEXT runtime·osyield(SB),NOSPLIT,$0 575 MOVL $SYS_sched_yield, AX 576 SYSCALL 577 RET 578 579 TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 580 MOVQ pid+0(FP), DI 581 MOVQ len+8(FP), SI 582 MOVQ buf+16(FP), DX 583 MOVL $SYS_sched_getaffinity, AX 584 SYSCALL 585 MOVL AX, ret+24(FP) 586 RET 587 588 // int32 runtime·epollcreate(int32 size); 589 TEXT runtime·epollcreate(SB),NOSPLIT,$0 590 MOVL size+0(FP), DI 591 MOVL $SYS_epoll_create, AX 592 SYSCALL 593 MOVL AX, ret+8(FP) 594 RET 595 596 // int32 runtime·epollcreate1(int32 flags); 597 TEXT runtime·epollcreate1(SB),NOSPLIT,$0 598 MOVL flags+0(FP), DI 599 MOVL $SYS_epoll_create1, AX 600 SYSCALL 601 MOVL AX, ret+8(FP) 602 RET 603 604 // func epollctl(epfd, op, fd int32, ev *epollEvent) int 605 TEXT runtime·epollctl(SB),NOSPLIT,$0 606 MOVL epfd+0(FP), DI 607 MOVL op+4(FP), SI 608 MOVL fd+8(FP), DX 609 MOVQ ev+16(FP), R10 610 MOVL $SYS_epoll_ctl, AX 611 SYSCALL 612 MOVL AX, ret+24(FP) 613 RET 614 615 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout); 616 TEXT runtime·epollwait(SB),NOSPLIT,$0 617 MOVL epfd+0(FP), DI 618 MOVQ ev+8(FP), SI 619 MOVL nev+16(FP), DX 620 MOVL timeout+20(FP), R10 621 MOVL $SYS_epoll_wait, AX 622 SYSCALL 623 MOVL AX, ret+24(FP) 624 RET 625 626 // void runtime·closeonexec(int32 fd); 627 TEXT runtime·closeonexec(SB),NOSPLIT,$0 628 MOVL fd+0(FP), DI // fd 629 MOVQ $2, SI // F_SETFD 630 MOVQ $1, DX // FD_CLOEXEC 631 MOVL $SYS_fcntl, AX 632 SYSCALL 633 RET 634 635 636 // int access(const char *name, int mode) 637 TEXT runtime·access(SB),NOSPLIT,$0 638 MOVQ name+0(FP), DI 639 MOVL mode+8(FP), SI 640 MOVL $SYS_access, AX 641 SYSCALL 642 MOVL AX, ret+16(FP) 643 RET 644 645 // int connect(int fd, const struct sockaddr *addr, socklen_t addrlen) 646 TEXT runtime·connect(SB),NOSPLIT,$0-28 647 MOVL fd+0(FP), DI 648 MOVQ addr+8(FP), SI 649 MOVL len+16(FP), DX 650 MOVL $SYS_connect, AX 651 SYSCALL 652 MOVL AX, ret+24(FP) 653 RET 654 655 // int socket(int domain, int type, int protocol) 656 TEXT runtime·socket(SB),NOSPLIT,$0-20 657 MOVL domain+0(FP), DI 658 MOVL typ+4(FP), SI 659 MOVL prot+8(FP), DX 660 MOVL $SYS_socket, AX 661 SYSCALL 662 MOVL AX, ret+16(FP) 663 RET 664 665 // func sbrk0() uintptr 666 TEXT runtime·sbrk0(SB),NOSPLIT,$0-8 667 // Implemented as brk(NULL). 668 MOVQ $0, DI 669 MOVL $SYS_brk, AX 670 SYSCALL 671 MOVQ AX, ret+0(FP) 672 RET