github.com/mtsmfm/go/src@v0.0.0-20221020090648-44bdcb9f8fde/runtime/sys_freebsd_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 // System calls and other sys.stuff for AMD64, FreeBSD 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 #include "cgo/abi_amd64.h" 13 14 #define CLOCK_REALTIME 0 15 #define CLOCK_MONOTONIC 4 16 #define FD_CLOEXEC 1 17 #define F_SETFD 2 18 #define AMD64_SET_FSBASE 129 19 20 #define SYS_exit 1 21 #define SYS_read 3 22 #define SYS_write 4 23 #define SYS_open 5 24 #define SYS_close 6 25 #define SYS_getpid 20 26 #define SYS_kill 37 27 #define SYS_sigaltstack 53 28 #define SYS_munmap 73 29 #define SYS_madvise 75 30 #define SYS_setitimer 83 31 #define SYS_fcntl 92 32 #define SYS_sysarch 165 33 #define SYS___sysctl 202 34 #define SYS_clock_gettime 232 35 #define SYS_nanosleep 240 36 #define SYS_sched_yield 331 37 #define SYS_sigprocmask 340 38 #define SYS_kqueue 362 39 #define SYS_sigaction 416 40 #define SYS_thr_exit 431 41 #define SYS_thr_self 432 42 #define SYS_thr_kill 433 43 #define SYS__umtx_op 454 44 #define SYS_thr_new 455 45 #define SYS_mmap 477 46 #define SYS_cpuset_getaffinity 487 47 #define SYS_pipe2 542 48 #define SYS_kevent 560 49 50 TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0 51 MOVQ addr+0(FP), DI 52 MOVL mode+8(FP), SI 53 MOVL val+12(FP), DX 54 MOVQ uaddr1+16(FP), R10 55 MOVQ ut+24(FP), R8 56 MOVL $SYS__umtx_op, AX 57 SYSCALL 58 JCC 2(PC) 59 NEGQ AX 60 MOVL AX, ret+32(FP) 61 RET 62 63 TEXT runtime·thr_new(SB),NOSPLIT,$0 64 MOVQ param+0(FP), DI 65 MOVL size+8(FP), SI 66 MOVL $SYS_thr_new, AX 67 SYSCALL 68 JCC 2(PC) 69 NEGQ AX 70 MOVL AX, ret+16(FP) 71 RET 72 73 TEXT runtime·thr_start(SB),NOSPLIT,$0 74 MOVQ DI, R13 // m 75 76 // set up FS to point at m->tls 77 LEAQ m_tls(R13), DI 78 CALL runtime·settls(SB) // smashes DI 79 80 // set up m, g 81 get_tls(CX) 82 MOVQ m_g0(R13), DI 83 MOVQ R13, g_m(DI) 84 MOVQ DI, g(CX) 85 86 CALL runtime·stackcheck(SB) 87 CALL runtime·mstart(SB) 88 89 MOVQ 0, AX // crash (not reached) 90 91 // Exit the entire program (like C exit) 92 TEXT runtime·exit(SB),NOSPLIT,$-8 93 MOVL code+0(FP), DI // arg 1 exit status 94 MOVL $SYS_exit, AX 95 SYSCALL 96 MOVL $0xf1, 0xf1 // crash 97 RET 98 99 // func exitThread(wait *atomic.uint32) 100 TEXT runtime·exitThread(SB),NOSPLIT,$0-8 101 MOVQ wait+0(FP), AX 102 // We're done using the stack. 103 MOVL $0, (AX) 104 MOVL $0, DI // arg 1 long *state 105 MOVL $SYS_thr_exit, AX 106 SYSCALL 107 MOVL $0xf1, 0xf1 // crash 108 JMP 0(PC) 109 110 TEXT runtime·open(SB),NOSPLIT,$-8 111 MOVQ name+0(FP), DI // arg 1 pathname 112 MOVL mode+8(FP), SI // arg 2 flags 113 MOVL perm+12(FP), DX // arg 3 mode 114 MOVL $SYS_open, AX 115 SYSCALL 116 JCC 2(PC) 117 MOVL $-1, AX 118 MOVL AX, ret+16(FP) 119 RET 120 121 TEXT runtime·closefd(SB),NOSPLIT,$-8 122 MOVL fd+0(FP), DI // arg 1 fd 123 MOVL $SYS_close, AX 124 SYSCALL 125 JCC 2(PC) 126 MOVL $-1, AX 127 MOVL AX, ret+8(FP) 128 RET 129 130 TEXT runtime·read(SB),NOSPLIT,$-8 131 MOVL fd+0(FP), DI // arg 1 fd 132 MOVQ p+8(FP), SI // arg 2 buf 133 MOVL n+16(FP), DX // arg 3 count 134 MOVL $SYS_read, AX 135 SYSCALL 136 JCC 2(PC) 137 NEGQ AX // caller expects negative errno 138 MOVL AX, ret+24(FP) 139 RET 140 141 // func pipe2(flags int32) (r, w int32, errno int32) 142 TEXT runtime·pipe2(SB),NOSPLIT,$0-20 143 LEAQ r+8(FP), DI 144 MOVL flags+0(FP), SI 145 MOVL $SYS_pipe2, AX 146 SYSCALL 147 JCC 2(PC) 148 NEGQ AX 149 MOVL AX, errno+16(FP) 150 RET 151 152 TEXT runtime·write1(SB),NOSPLIT,$-8 153 MOVQ fd+0(FP), DI // arg 1 fd 154 MOVQ p+8(FP), SI // arg 2 buf 155 MOVL n+16(FP), DX // arg 3 count 156 MOVL $SYS_write, AX 157 SYSCALL 158 JCC 2(PC) 159 NEGQ AX // caller expects negative errno 160 MOVL AX, ret+24(FP) 161 RET 162 163 TEXT runtime·thr_self(SB),NOSPLIT,$0-8 164 // thr_self(&0(FP)) 165 LEAQ ret+0(FP), DI // arg 1 166 MOVL $SYS_thr_self, AX 167 SYSCALL 168 RET 169 170 TEXT runtime·thr_kill(SB),NOSPLIT,$0-16 171 // thr_kill(tid, sig) 172 MOVQ tid+0(FP), DI // arg 1 id 173 MOVQ sig+8(FP), SI // arg 2 sig 174 MOVL $SYS_thr_kill, AX 175 SYSCALL 176 RET 177 178 TEXT runtime·raiseproc(SB),NOSPLIT,$0 179 // getpid 180 MOVL $SYS_getpid, AX 181 SYSCALL 182 // kill(self, sig) 183 MOVQ AX, DI // arg 1 pid 184 MOVL sig+0(FP), SI // arg 2 sig 185 MOVL $SYS_kill, AX 186 SYSCALL 187 RET 188 189 TEXT runtime·setitimer(SB), NOSPLIT, $-8 190 MOVL mode+0(FP), DI 191 MOVQ new+8(FP), SI 192 MOVQ old+16(FP), DX 193 MOVL $SYS_setitimer, AX 194 SYSCALL 195 RET 196 197 // func fallback_walltime() (sec int64, nsec int32) 198 TEXT runtime·fallback_walltime(SB), NOSPLIT, $32-12 199 MOVL $SYS_clock_gettime, AX 200 MOVQ $CLOCK_REALTIME, DI 201 LEAQ 8(SP), SI 202 SYSCALL 203 MOVQ 8(SP), AX // sec 204 MOVQ 16(SP), DX // nsec 205 206 // sec is in AX, nsec in DX 207 MOVQ AX, sec+0(FP) 208 MOVL DX, nsec+8(FP) 209 RET 210 211 TEXT runtime·fallback_nanotime(SB), NOSPLIT, $32-8 212 MOVL $SYS_clock_gettime, AX 213 MOVQ $CLOCK_MONOTONIC, DI 214 LEAQ 8(SP), SI 215 SYSCALL 216 MOVQ 8(SP), AX // sec 217 MOVQ 16(SP), DX // nsec 218 219 // sec is in AX, nsec in DX 220 // return nsec in AX 221 IMULQ $1000000000, AX 222 ADDQ DX, AX 223 MOVQ AX, ret+0(FP) 224 RET 225 226 TEXT runtime·asmSigaction(SB),NOSPLIT,$0 227 MOVQ sig+0(FP), DI // arg 1 sig 228 MOVQ new+8(FP), SI // arg 2 act 229 MOVQ old+16(FP), DX // arg 3 oact 230 MOVL $SYS_sigaction, AX 231 SYSCALL 232 JCC 2(PC) 233 MOVL $-1, AX 234 MOVL AX, ret+24(FP) 235 RET 236 237 TEXT runtime·callCgoSigaction(SB),NOSPLIT,$16 238 MOVQ sig+0(FP), DI // arg 1 sig 239 MOVQ new+8(FP), SI // arg 2 act 240 MOVQ old+16(FP), DX // arg 3 oact 241 MOVQ _cgo_sigaction(SB), AX 242 MOVQ SP, BX // callee-saved 243 ANDQ $~15, SP // alignment as per amd64 psABI 244 CALL AX 245 MOVQ BX, SP 246 MOVL AX, ret+24(FP) 247 RET 248 249 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 250 MOVQ fn+0(FP), AX 251 MOVL sig+8(FP), DI 252 MOVQ info+16(FP), SI 253 MOVQ ctx+24(FP), DX 254 PUSHQ BP 255 MOVQ SP, BP 256 ANDQ $~15, SP // alignment for x86_64 ABI 257 CALL AX 258 MOVQ BP, SP 259 POPQ BP 260 RET 261 262 // Called using C ABI. 263 TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0 264 // Transition from C ABI to Go ABI. 265 PUSH_REGS_HOST_TO_ABI0() 266 267 // Set up ABIInternal environment: g in R14, cleared X15. 268 get_tls(R12) 269 MOVQ g(R12), R14 270 PXOR X15, X15 271 272 // Reserve space for spill slots. 273 NOP SP // disable vet stack checking 274 ADJSP $24 275 276 // Call into the Go signal handler 277 MOVQ DI, AX // sig 278 MOVQ SI, BX // info 279 MOVQ DX, CX // ctx 280 CALL ·sigtrampgo<ABIInternal>(SB) 281 282 ADJSP $-24 283 284 POP_REGS_HOST_TO_ABI0() 285 RET 286 287 // Called using C ABI. 288 TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0 289 // Transition from C ABI to Go ABI. 290 PUSH_REGS_HOST_TO_ABI0() 291 292 // Set up ABIInternal environment: g in R14, cleared X15. 293 get_tls(R12) 294 MOVQ g(R12), R14 295 PXOR X15, X15 296 297 // Reserve space for spill slots. 298 NOP SP // disable vet stack checking 299 ADJSP $24 300 301 // Call into the Go signal handler 302 MOVQ DI, AX // sig 303 MOVQ SI, BX // info 304 MOVQ DX, CX // ctx 305 CALL ·sigprofNonGo<ABIInternal>(SB) 306 307 ADJSP $-24 308 309 POP_REGS_HOST_TO_ABI0() 310 RET 311 312 // Used instead of sigtramp in programs that use cgo. 313 // Arguments from kernel are in DI, SI, DX. 314 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0 315 // If no traceback function, do usual sigtramp. 316 MOVQ runtime·cgoTraceback(SB), AX 317 TESTQ AX, AX 318 JZ sigtramp 319 320 // If no traceback support function, which means that 321 // runtime/cgo was not linked in, do usual sigtramp. 322 MOVQ _cgo_callers(SB), AX 323 TESTQ AX, AX 324 JZ sigtramp 325 326 // Figure out if we are currently in a cgo call. 327 // If not, just do usual sigtramp. 328 get_tls(CX) 329 MOVQ g(CX),AX 330 TESTQ AX, AX 331 JZ sigtrampnog // g == nil 332 MOVQ g_m(AX), AX 333 TESTQ AX, AX 334 JZ sigtramp // g.m == nil 335 MOVL m_ncgo(AX), CX 336 TESTL CX, CX 337 JZ sigtramp // g.m.ncgo == 0 338 MOVQ m_curg(AX), CX 339 TESTQ CX, CX 340 JZ sigtramp // g.m.curg == nil 341 MOVQ g_syscallsp(CX), CX 342 TESTQ CX, CX 343 JZ sigtramp // g.m.curg.syscallsp == 0 344 MOVQ m_cgoCallers(AX), R8 345 TESTQ R8, R8 346 JZ sigtramp // g.m.cgoCallers == nil 347 MOVL m_cgoCallersUse(AX), CX 348 TESTL CX, CX 349 JNZ sigtramp // g.m.cgoCallersUse != 0 350 351 // Jump to a function in runtime/cgo. 352 // That function, written in C, will call the user's traceback 353 // function with proper unwind info, and will then call back here. 354 // The first three arguments, and the fifth, are already in registers. 355 // Set the two remaining arguments now. 356 MOVQ runtime·cgoTraceback(SB), CX 357 MOVQ $runtime·sigtramp(SB), R9 358 MOVQ _cgo_callers(SB), AX 359 JMP AX 360 361 sigtramp: 362 JMP runtime·sigtramp(SB) 363 364 sigtrampnog: 365 // Signal arrived on a non-Go thread. If this is SIGPROF, get a 366 // stack trace. 367 CMPL DI, $27 // 27 == SIGPROF 368 JNZ sigtramp 369 370 // Lock sigprofCallersUse. 371 MOVL $0, AX 372 MOVL $1, CX 373 MOVQ $runtime·sigprofCallersUse(SB), R11 374 LOCK 375 CMPXCHGL CX, 0(R11) 376 JNZ sigtramp // Skip stack trace if already locked. 377 378 // Jump to the traceback function in runtime/cgo. 379 // It will call back to sigprofNonGo, via sigprofNonGoWrapper, to convert 380 // the arguments to the Go calling convention. 381 // First three arguments to traceback function are in registers already. 382 MOVQ runtime·cgoTraceback(SB), CX 383 MOVQ $runtime·sigprofCallers(SB), R8 384 MOVQ $runtime·sigprofNonGoWrapper<>(SB), R9 385 MOVQ _cgo_callers(SB), AX 386 JMP AX 387 388 TEXT runtime·sysMmap(SB),NOSPLIT,$0 389 MOVQ addr+0(FP), DI // arg 1 addr 390 MOVQ n+8(FP), SI // arg 2 len 391 MOVL prot+16(FP), DX // arg 3 prot 392 MOVL flags+20(FP), R10 // arg 4 flags 393 MOVL fd+24(FP), R8 // arg 5 fid 394 MOVL off+28(FP), R9 // arg 6 offset 395 MOVL $SYS_mmap, AX 396 SYSCALL 397 JCC ok 398 MOVQ $0, p+32(FP) 399 MOVQ AX, err+40(FP) 400 RET 401 ok: 402 MOVQ AX, p+32(FP) 403 MOVQ $0, err+40(FP) 404 RET 405 406 // Call the function stored in _cgo_mmap using the GCC calling convention. 407 // This must be called on the system stack. 408 TEXT runtime·callCgoMmap(SB),NOSPLIT,$16 409 MOVQ addr+0(FP), DI 410 MOVQ n+8(FP), SI 411 MOVL prot+16(FP), DX 412 MOVL flags+20(FP), CX 413 MOVL fd+24(FP), R8 414 MOVL off+28(FP), R9 415 MOVQ _cgo_mmap(SB), AX 416 MOVQ SP, BX 417 ANDQ $~15, SP // alignment as per amd64 psABI 418 MOVQ BX, 0(SP) 419 CALL AX 420 MOVQ 0(SP), SP 421 MOVQ AX, ret+32(FP) 422 RET 423 424 TEXT runtime·sysMunmap(SB),NOSPLIT,$0 425 MOVQ addr+0(FP), DI // arg 1 addr 426 MOVQ n+8(FP), SI // arg 2 len 427 MOVL $SYS_munmap, AX 428 SYSCALL 429 JCC 2(PC) 430 MOVL $0xf1, 0xf1 // crash 431 RET 432 433 // Call the function stored in _cgo_munmap using the GCC calling convention. 434 // This must be called on the system stack. 435 TEXT runtime·callCgoMunmap(SB),NOSPLIT,$16-16 436 MOVQ addr+0(FP), DI 437 MOVQ n+8(FP), SI 438 MOVQ _cgo_munmap(SB), AX 439 MOVQ SP, BX 440 ANDQ $~15, SP // alignment as per amd64 psABI 441 MOVQ BX, 0(SP) 442 CALL AX 443 MOVQ 0(SP), SP 444 RET 445 446 TEXT runtime·madvise(SB),NOSPLIT,$0 447 MOVQ addr+0(FP), DI 448 MOVQ n+8(FP), SI 449 MOVL flags+16(FP), DX 450 MOVQ $SYS_madvise, AX 451 SYSCALL 452 JCC 2(PC) 453 MOVL $-1, AX 454 MOVL AX, ret+24(FP) 455 RET 456 457 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 458 MOVQ new+0(FP), DI 459 MOVQ old+8(FP), SI 460 MOVQ $SYS_sigaltstack, AX 461 SYSCALL 462 JCC 2(PC) 463 MOVL $0xf1, 0xf1 // crash 464 RET 465 466 TEXT runtime·usleep(SB),NOSPLIT,$16 467 MOVL $0, DX 468 MOVL usec+0(FP), AX 469 MOVL $1000000, CX 470 DIVL CX 471 MOVQ AX, 0(SP) // tv_sec 472 MOVL $1000, AX 473 MULL DX 474 MOVQ AX, 8(SP) // tv_nsec 475 476 MOVQ SP, DI // arg 1 - rqtp 477 MOVQ $0, SI // arg 2 - rmtp 478 MOVL $SYS_nanosleep, AX 479 SYSCALL 480 RET 481 482 // set tls base to DI 483 TEXT runtime·settls(SB),NOSPLIT,$8 484 ADDQ $8, DI // adjust for ELF: wants to use -8(FS) for g and m 485 MOVQ DI, 0(SP) 486 MOVQ SP, SI 487 MOVQ $AMD64_SET_FSBASE, DI 488 MOVQ $SYS_sysarch, AX 489 SYSCALL 490 JCC 2(PC) 491 MOVL $0xf1, 0xf1 // crash 492 RET 493 494 TEXT runtime·sysctl(SB),NOSPLIT,$0 495 MOVQ mib+0(FP), DI // arg 1 - name 496 MOVL miblen+8(FP), SI // arg 2 - namelen 497 MOVQ out+16(FP), DX // arg 3 - oldp 498 MOVQ size+24(FP), R10 // arg 4 - oldlenp 499 MOVQ dst+32(FP), R8 // arg 5 - newp 500 MOVQ ndst+40(FP), R9 // arg 6 - newlen 501 MOVQ $SYS___sysctl, AX 502 SYSCALL 503 JCC 4(PC) 504 NEGQ AX 505 MOVL AX, ret+48(FP) 506 RET 507 MOVL $0, AX 508 MOVL AX, ret+48(FP) 509 RET 510 511 TEXT runtime·osyield(SB),NOSPLIT,$-4 512 MOVL $SYS_sched_yield, AX 513 SYSCALL 514 RET 515 516 TEXT runtime·sigprocmask(SB),NOSPLIT,$0 517 MOVL how+0(FP), DI // arg 1 - how 518 MOVQ new+8(FP), SI // arg 2 - set 519 MOVQ old+16(FP), DX // arg 3 - oset 520 MOVL $SYS_sigprocmask, AX 521 SYSCALL 522 JAE 2(PC) 523 MOVL $0xf1, 0xf1 // crash 524 RET 525 526 // int32 runtime·kqueue(void); 527 TEXT runtime·kqueue(SB),NOSPLIT,$0 528 MOVQ $0, DI 529 MOVQ $0, SI 530 MOVQ $0, DX 531 MOVL $SYS_kqueue, AX 532 SYSCALL 533 JCC 2(PC) 534 NEGQ AX 535 MOVL AX, ret+0(FP) 536 RET 537 538 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout); 539 TEXT runtime·kevent(SB),NOSPLIT,$0 540 MOVL kq+0(FP), DI 541 MOVQ ch+8(FP), SI 542 MOVL nch+16(FP), DX 543 MOVQ ev+24(FP), R10 544 MOVL nev+32(FP), R8 545 MOVQ ts+40(FP), R9 546 MOVL $SYS_kevent, AX 547 SYSCALL 548 JCC 2(PC) 549 NEGQ AX 550 MOVL AX, ret+48(FP) 551 RET 552 553 // void runtime·closeonexec(int32 fd); 554 TEXT runtime·closeonexec(SB),NOSPLIT,$0 555 MOVL fd+0(FP), DI // fd 556 MOVQ $F_SETFD, SI 557 MOVQ $FD_CLOEXEC, DX 558 MOVL $SYS_fcntl, AX 559 SYSCALL 560 RET 561 562 // func cpuset_getaffinity(level int, which int, id int64, size int, mask *byte) int32 563 TEXT runtime·cpuset_getaffinity(SB), NOSPLIT, $0-44 564 MOVQ level+0(FP), DI 565 MOVQ which+8(FP), SI 566 MOVQ id+16(FP), DX 567 MOVQ size+24(FP), R10 568 MOVQ mask+32(FP), R8 569 MOVL $SYS_cpuset_getaffinity, AX 570 SYSCALL 571 JCC 2(PC) 572 NEGQ AX 573 MOVL AX, ret+40(FP) 574 RET