github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/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 MOVQ SP, BX // callee-saved 255 ANDQ $~15, SP // alignment for x86_64 ABI 256 CALL AX 257 MOVQ BX, SP 258 RET 259 260 // Called using C ABI. 261 TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0 262 // Transition from C ABI to Go ABI. 263 PUSH_REGS_HOST_TO_ABI0() 264 265 // Set up ABIInternal environment: g in R14, cleared X15. 266 get_tls(R12) 267 MOVQ g(R12), R14 268 PXOR X15, X15 269 270 // Reserve space for spill slots. 271 NOP SP // disable vet stack checking 272 ADJSP $24 273 274 // Call into the Go signal handler 275 MOVQ DI, AX // sig 276 MOVQ SI, BX // info 277 MOVQ DX, CX // ctx 278 CALL ·sigtrampgo<ABIInternal>(SB) 279 280 ADJSP $-24 281 282 POP_REGS_HOST_TO_ABI0() 283 RET 284 285 // Called using C ABI. 286 TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT|NOFRAME,$0 287 // Transition from C ABI to Go ABI. 288 PUSH_REGS_HOST_TO_ABI0() 289 290 // Set up ABIInternal environment: g in R14, cleared X15. 291 get_tls(R12) 292 MOVQ g(R12), R14 293 PXOR X15, X15 294 295 // Reserve space for spill slots. 296 NOP SP // disable vet stack checking 297 ADJSP $24 298 299 // Call into the Go signal handler 300 MOVQ DI, AX // sig 301 MOVQ SI, BX // info 302 MOVQ DX, CX // ctx 303 CALL ·sigprofNonGo<ABIInternal>(SB) 304 305 ADJSP $-24 306 307 POP_REGS_HOST_TO_ABI0() 308 RET 309 310 // Used instead of sigtramp in programs that use cgo. 311 // Arguments from kernel are in DI, SI, DX. 312 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0 313 // If no traceback function, do usual sigtramp. 314 MOVQ runtime·cgoTraceback(SB), AX 315 TESTQ AX, AX 316 JZ sigtramp 317 318 // If no traceback support function, which means that 319 // runtime/cgo was not linked in, do usual sigtramp. 320 MOVQ _cgo_callers(SB), AX 321 TESTQ AX, AX 322 JZ sigtramp 323 324 // Figure out if we are currently in a cgo call. 325 // If not, just do usual sigtramp. 326 get_tls(CX) 327 MOVQ g(CX),AX 328 TESTQ AX, AX 329 JZ sigtrampnog // g == nil 330 MOVQ g_m(AX), AX 331 TESTQ AX, AX 332 JZ sigtramp // g.m == nil 333 MOVL m_ncgo(AX), CX 334 TESTL CX, CX 335 JZ sigtramp // g.m.ncgo == 0 336 MOVQ m_curg(AX), CX 337 TESTQ CX, CX 338 JZ sigtramp // g.m.curg == nil 339 MOVQ g_syscallsp(CX), CX 340 TESTQ CX, CX 341 JZ sigtramp // g.m.curg.syscallsp == 0 342 MOVQ m_cgoCallers(AX), R8 343 TESTQ R8, R8 344 JZ sigtramp // g.m.cgoCallers == nil 345 MOVL m_cgoCallersUse(AX), CX 346 TESTL CX, CX 347 JNZ sigtramp // g.m.cgoCallersUse != 0 348 349 // Jump to a function in runtime/cgo. 350 // That function, written in C, will call the user's traceback 351 // function with proper unwind info, and will then call back here. 352 // The first three arguments, and the fifth, are already in registers. 353 // Set the two remaining arguments now. 354 MOVQ runtime·cgoTraceback(SB), CX 355 MOVQ $runtime·sigtramp(SB), R9 356 MOVQ _cgo_callers(SB), AX 357 JMP AX 358 359 sigtramp: 360 JMP runtime·sigtramp(SB) 361 362 sigtrampnog: 363 // Signal arrived on a non-Go thread. If this is SIGPROF, get a 364 // stack trace. 365 CMPL DI, $27 // 27 == SIGPROF 366 JNZ sigtramp 367 368 // Lock sigprofCallersUse. 369 MOVL $0, AX 370 MOVL $1, CX 371 MOVQ $runtime·sigprofCallersUse(SB), R11 372 LOCK 373 CMPXCHGL CX, 0(R11) 374 JNZ sigtramp // Skip stack trace if already locked. 375 376 // Jump to the traceback function in runtime/cgo. 377 // It will call back to sigprofNonGo, via sigprofNonGoWrapper, to convert 378 // the arguments to the Go calling convention. 379 // First three arguments to traceback function are in registers already. 380 MOVQ runtime·cgoTraceback(SB), CX 381 MOVQ $runtime·sigprofCallers(SB), R8 382 MOVQ $runtime·sigprofNonGoWrapper<>(SB), R9 383 MOVQ _cgo_callers(SB), AX 384 JMP AX 385 386 TEXT runtime·sysMmap(SB),NOSPLIT,$0 387 MOVQ addr+0(FP), DI // arg 1 addr 388 MOVQ n+8(FP), SI // arg 2 len 389 MOVL prot+16(FP), DX // arg 3 prot 390 MOVL flags+20(FP), R10 // arg 4 flags 391 MOVL fd+24(FP), R8 // arg 5 fid 392 MOVL off+28(FP), R9 // arg 6 offset 393 MOVL $SYS_mmap, AX 394 SYSCALL 395 JCC ok 396 MOVQ $0, p+32(FP) 397 MOVQ AX, err+40(FP) 398 RET 399 ok: 400 MOVQ AX, p+32(FP) 401 MOVQ $0, err+40(FP) 402 RET 403 404 // Call the function stored in _cgo_mmap using the GCC calling convention. 405 // This must be called on the system stack. 406 TEXT runtime·callCgoMmap(SB),NOSPLIT,$16 407 MOVQ addr+0(FP), DI 408 MOVQ n+8(FP), SI 409 MOVL prot+16(FP), DX 410 MOVL flags+20(FP), CX 411 MOVL fd+24(FP), R8 412 MOVL off+28(FP), R9 413 MOVQ _cgo_mmap(SB), AX 414 MOVQ SP, BX 415 ANDQ $~15, SP // alignment as per amd64 psABI 416 MOVQ BX, 0(SP) 417 CALL AX 418 MOVQ 0(SP), SP 419 MOVQ AX, ret+32(FP) 420 RET 421 422 TEXT runtime·sysMunmap(SB),NOSPLIT,$0 423 MOVQ addr+0(FP), DI // arg 1 addr 424 MOVQ n+8(FP), SI // arg 2 len 425 MOVL $SYS_munmap, AX 426 SYSCALL 427 JCC 2(PC) 428 MOVL $0xf1, 0xf1 // crash 429 RET 430 431 // Call the function stored in _cgo_munmap using the GCC calling convention. 432 // This must be called on the system stack. 433 TEXT runtime·callCgoMunmap(SB),NOSPLIT,$16-16 434 MOVQ addr+0(FP), DI 435 MOVQ n+8(FP), SI 436 MOVQ _cgo_munmap(SB), AX 437 MOVQ SP, BX 438 ANDQ $~15, SP // alignment as per amd64 psABI 439 MOVQ BX, 0(SP) 440 CALL AX 441 MOVQ 0(SP), SP 442 RET 443 444 TEXT runtime·madvise(SB),NOSPLIT,$0 445 MOVQ addr+0(FP), DI 446 MOVQ n+8(FP), SI 447 MOVL flags+16(FP), DX 448 MOVQ $SYS_madvise, AX 449 SYSCALL 450 JCC 2(PC) 451 MOVL $-1, AX 452 MOVL AX, ret+24(FP) 453 RET 454 455 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 456 MOVQ new+0(FP), DI 457 MOVQ old+8(FP), SI 458 MOVQ $SYS_sigaltstack, AX 459 SYSCALL 460 JCC 2(PC) 461 MOVL $0xf1, 0xf1 // crash 462 RET 463 464 TEXT runtime·usleep(SB),NOSPLIT,$16 465 MOVL $0, DX 466 MOVL usec+0(FP), AX 467 MOVL $1000000, CX 468 DIVL CX 469 MOVQ AX, 0(SP) // tv_sec 470 MOVL $1000, AX 471 MULL DX 472 MOVQ AX, 8(SP) // tv_nsec 473 474 MOVQ SP, DI // arg 1 - rqtp 475 MOVQ $0, SI // arg 2 - rmtp 476 MOVL $SYS_nanosleep, AX 477 SYSCALL 478 RET 479 480 // set tls base to DI 481 TEXT runtime·settls(SB),NOSPLIT,$8 482 ADDQ $8, DI // adjust for ELF: wants to use -8(FS) for g and m 483 MOVQ DI, 0(SP) 484 MOVQ SP, SI 485 MOVQ $AMD64_SET_FSBASE, DI 486 MOVQ $SYS_sysarch, AX 487 SYSCALL 488 JCC 2(PC) 489 MOVL $0xf1, 0xf1 // crash 490 RET 491 492 TEXT runtime·sysctl(SB),NOSPLIT,$0 493 MOVQ mib+0(FP), DI // arg 1 - name 494 MOVL miblen+8(FP), SI // arg 2 - namelen 495 MOVQ out+16(FP), DX // arg 3 - oldp 496 MOVQ size+24(FP), R10 // arg 4 - oldlenp 497 MOVQ dst+32(FP), R8 // arg 5 - newp 498 MOVQ ndst+40(FP), R9 // arg 6 - newlen 499 MOVQ $SYS___sysctl, AX 500 SYSCALL 501 JCC 4(PC) 502 NEGQ AX 503 MOVL AX, ret+48(FP) 504 RET 505 MOVL $0, AX 506 MOVL AX, ret+48(FP) 507 RET 508 509 TEXT runtime·osyield(SB),NOSPLIT,$-4 510 MOVL $SYS_sched_yield, AX 511 SYSCALL 512 RET 513 514 TEXT runtime·sigprocmask(SB),NOSPLIT,$0 515 MOVL how+0(FP), DI // arg 1 - how 516 MOVQ new+8(FP), SI // arg 2 - set 517 MOVQ old+16(FP), DX // arg 3 - oset 518 MOVL $SYS_sigprocmask, AX 519 SYSCALL 520 JAE 2(PC) 521 MOVL $0xf1, 0xf1 // crash 522 RET 523 524 // int32 runtime·kqueue(void); 525 TEXT runtime·kqueue(SB),NOSPLIT,$0 526 MOVQ $0, DI 527 MOVQ $0, SI 528 MOVQ $0, DX 529 MOVL $SYS_kqueue, AX 530 SYSCALL 531 JCC 2(PC) 532 NEGQ AX 533 MOVL AX, ret+0(FP) 534 RET 535 536 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout); 537 TEXT runtime·kevent(SB),NOSPLIT,$0 538 MOVL kq+0(FP), DI 539 MOVQ ch+8(FP), SI 540 MOVL nch+16(FP), DX 541 MOVQ ev+24(FP), R10 542 MOVL nev+32(FP), R8 543 MOVQ ts+40(FP), R9 544 MOVL $SYS_kevent, AX 545 SYSCALL 546 JCC 2(PC) 547 NEGQ AX 548 MOVL AX, ret+48(FP) 549 RET 550 551 // void runtime·closeonexec(int32 fd); 552 TEXT runtime·closeonexec(SB),NOSPLIT,$0 553 MOVL fd+0(FP), DI // fd 554 MOVQ $F_SETFD, SI 555 MOVQ $FD_CLOEXEC, DX 556 MOVL $SYS_fcntl, AX 557 SYSCALL 558 RET 559 560 // func cpuset_getaffinity(level int, which int, id int64, size int, mask *byte) int32 561 TEXT runtime·cpuset_getaffinity(SB), NOSPLIT, $0-44 562 MOVQ level+0(FP), DI 563 MOVQ which+8(FP), SI 564 MOVQ id+16(FP), DX 565 MOVQ size+24(FP), R10 566 MOVQ mask+32(FP), R8 567 MOVL $SYS_cpuset_getaffinity, AX 568 SYSCALL 569 JCC 2(PC) 570 NEGQ AX 571 MOVL AX, ret+40(FP) 572 RET