github.com/comwrg/go/src@v0.0.0-20220319063731-c238d0440370/runtime/sys_netbsd_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, NetBSD 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 3 16 #define FD_CLOEXEC 1 17 #define F_SETFD 2 18 19 #define SYS_exit 1 20 #define SYS_read 3 21 #define SYS_write 4 22 #define SYS_open 5 23 #define SYS_close 6 24 #define SYS_getpid 20 25 #define SYS_kill 37 26 #define SYS_munmap 73 27 #define SYS_madvise 75 28 #define SYS_fcntl 92 29 #define SYS_mmap 197 30 #define SYS___sysctl 202 31 #define SYS___sigaltstack14 281 32 #define SYS___sigprocmask14 293 33 #define SYS_getcontext 307 34 #define SYS_setcontext 308 35 #define SYS__lwp_create 309 36 #define SYS__lwp_exit 310 37 #define SYS__lwp_self 311 38 #define SYS__lwp_setprivate 317 39 #define SYS__lwp_kill 318 40 #define SYS__lwp_unpark 321 41 #define SYS___sigaction_sigtramp 340 42 #define SYS_kqueue 344 43 #define SYS_sched_yield 350 44 #define SYS___setitimer50 425 45 #define SYS___clock_gettime50 427 46 #define SYS___nanosleep50 430 47 #define SYS___kevent50 435 48 #define SYS____lwp_park60 478 49 50 // int32 lwp_create(void *context, uintptr flags, void *lwpid) 51 TEXT runtime·lwp_create(SB),NOSPLIT,$0 52 MOVQ ctxt+0(FP), DI 53 MOVQ flags+8(FP), SI 54 MOVQ lwpid+16(FP), DX 55 MOVL $SYS__lwp_create, AX 56 SYSCALL 57 JCC 2(PC) 58 NEGQ AX 59 MOVL AX, ret+24(FP) 60 RET 61 62 TEXT runtime·lwp_tramp(SB),NOSPLIT,$0 63 64 // Set FS to point at m->tls. 65 LEAQ m_tls(R8), DI 66 CALL runtime·settls(SB) 67 68 // Set up new stack. 69 get_tls(CX) 70 MOVQ R8, g_m(R9) 71 MOVQ R9, g(CX) 72 CALL runtime·stackcheck(SB) 73 74 // Call fn. This is an ABI0 PC. 75 CALL R12 76 77 // It shouldn't return. If it does, exit. 78 MOVL $SYS__lwp_exit, AX 79 SYSCALL 80 JMP -3(PC) // keep exiting 81 82 TEXT ·netbsdMstart(SB),NOSPLIT|TOPFRAME,$0 83 CALL ·netbsdMstart0(SB) 84 RET // not reached 85 86 TEXT runtime·osyield(SB),NOSPLIT,$0 87 MOVL $SYS_sched_yield, AX 88 SYSCALL 89 RET 90 91 TEXT runtime·lwp_park(SB),NOSPLIT,$0 92 MOVL clockid+0(FP), DI // arg 1 - clockid 93 MOVL flags+4(FP), SI // arg 2 - flags 94 MOVQ ts+8(FP), DX // arg 3 - ts 95 MOVL unpark+16(FP), R10 // arg 4 - unpark 96 MOVQ hint+24(FP), R8 // arg 5 - hint 97 MOVQ unparkhint+32(FP), R9 // arg 6 - unparkhint 98 MOVL $SYS____lwp_park60, AX 99 SYSCALL 100 MOVL AX, ret+40(FP) 101 RET 102 103 TEXT runtime·lwp_unpark(SB),NOSPLIT,$0 104 MOVL lwp+0(FP), DI // arg 1 - lwp 105 MOVQ hint+8(FP), SI // arg 2 - hint 106 MOVL $SYS__lwp_unpark, AX 107 SYSCALL 108 MOVL AX, ret+16(FP) 109 RET 110 111 TEXT runtime·lwp_self(SB),NOSPLIT,$0 112 MOVL $SYS__lwp_self, AX 113 SYSCALL 114 MOVL AX, ret+0(FP) 115 RET 116 117 // Exit the entire program (like C exit) 118 TEXT runtime·exit(SB),NOSPLIT,$-8 119 MOVL code+0(FP), DI // arg 1 - exit status 120 MOVL $SYS_exit, AX 121 SYSCALL 122 MOVL $0xf1, 0xf1 // crash 123 RET 124 125 // func exitThread(wait *uint32) 126 TEXT runtime·exitThread(SB),NOSPLIT,$0-8 127 MOVQ wait+0(FP), AX 128 // We're done using the stack. 129 MOVL $0, (AX) 130 MOVL $SYS__lwp_exit, AX 131 SYSCALL 132 MOVL $0xf1, 0xf1 // crash 133 JMP 0(PC) 134 135 TEXT runtime·open(SB),NOSPLIT,$-8 136 MOVQ name+0(FP), DI // arg 1 pathname 137 MOVL mode+8(FP), SI // arg 2 flags 138 MOVL perm+12(FP), DX // arg 3 mode 139 MOVL $SYS_open, AX 140 SYSCALL 141 JCC 2(PC) 142 MOVL $-1, AX 143 MOVL AX, ret+16(FP) 144 RET 145 146 TEXT runtime·closefd(SB),NOSPLIT,$-8 147 MOVL fd+0(FP), DI // arg 1 fd 148 MOVL $SYS_close, AX 149 SYSCALL 150 JCC 2(PC) 151 MOVL $-1, AX 152 MOVL AX, ret+8(FP) 153 RET 154 155 TEXT runtime·read(SB),NOSPLIT,$-8 156 MOVL fd+0(FP), DI // arg 1 fd 157 MOVQ p+8(FP), SI // arg 2 buf 158 MOVL n+16(FP), DX // arg 3 count 159 MOVL $SYS_read, AX 160 SYSCALL 161 JCC 2(PC) 162 NEGQ AX // caller expects negative errno 163 MOVL AX, ret+24(FP) 164 RET 165 166 // func pipe() (r, w int32, errno int32) 167 TEXT runtime·pipe(SB),NOSPLIT,$0-12 168 MOVL $42, AX 169 SYSCALL 170 JCC pipeok 171 MOVL $-1, r+0(FP) 172 MOVL $-1, w+4(FP) 173 MOVL AX, errno+8(FP) 174 RET 175 pipeok: 176 MOVL AX, r+0(FP) 177 MOVL DX, w+4(FP) 178 MOVL $0, errno+8(FP) 179 RET 180 181 // func pipe2(flags int32) (r, w int32, errno int32) 182 TEXT runtime·pipe2(SB),NOSPLIT,$0-20 183 LEAQ r+8(FP), DI 184 MOVL flags+0(FP), SI 185 MOVL $453, AX 186 SYSCALL 187 MOVL AX, errno+16(FP) 188 RET 189 190 TEXT runtime·write1(SB),NOSPLIT,$-8 191 MOVQ fd+0(FP), DI // arg 1 - fd 192 MOVQ p+8(FP), SI // arg 2 - buf 193 MOVL n+16(FP), DX // arg 3 - nbyte 194 MOVL $SYS_write, AX 195 SYSCALL 196 JCC 2(PC) 197 NEGQ AX // caller expects negative errno 198 MOVL AX, ret+24(FP) 199 RET 200 201 TEXT runtime·usleep(SB),NOSPLIT,$16 202 MOVL $0, DX 203 MOVL usec+0(FP), AX 204 MOVL $1000000, CX 205 DIVL CX 206 MOVQ AX, 0(SP) // tv_sec 207 MOVL $1000, AX 208 MULL DX 209 MOVQ AX, 8(SP) // tv_nsec 210 211 MOVQ SP, DI // arg 1 - rqtp 212 MOVQ $0, SI // arg 2 - rmtp 213 MOVL $SYS___nanosleep50, AX 214 SYSCALL 215 RET 216 217 TEXT runtime·lwp_kill(SB),NOSPLIT,$0-16 218 MOVL tid+0(FP), DI // arg 1 - target 219 MOVQ sig+8(FP), SI // arg 2 - signo 220 MOVL $SYS__lwp_kill, AX 221 SYSCALL 222 RET 223 224 TEXT runtime·raiseproc(SB),NOSPLIT,$16 225 MOVL $SYS_getpid, AX 226 SYSCALL 227 MOVQ AX, DI // arg 1 - pid 228 MOVL sig+0(FP), SI // arg 2 - signo 229 MOVL $SYS_kill, AX 230 SYSCALL 231 RET 232 233 TEXT runtime·setitimer(SB),NOSPLIT,$-8 234 MOVL mode+0(FP), DI // arg 1 - which 235 MOVQ new+8(FP), SI // arg 2 - itv 236 MOVQ old+16(FP), DX // arg 3 - oitv 237 MOVL $SYS___setitimer50, AX 238 SYSCALL 239 RET 240 241 // func walltime() (sec int64, nsec int32) 242 TEXT runtime·walltime(SB), NOSPLIT, $32 243 MOVQ $CLOCK_REALTIME, DI // arg 1 - clock_id 244 LEAQ 8(SP), SI // arg 2 - tp 245 MOVL $SYS___clock_gettime50, AX 246 SYSCALL 247 MOVQ 8(SP), AX // sec 248 MOVQ 16(SP), DX // nsec 249 250 // sec is in AX, nsec in DX 251 MOVQ AX, sec+0(FP) 252 MOVL DX, nsec+8(FP) 253 RET 254 255 TEXT runtime·nanotime1(SB),NOSPLIT,$32 256 MOVQ $CLOCK_MONOTONIC, DI // arg 1 - clock_id 257 LEAQ 8(SP), SI // arg 2 - tp 258 MOVL $SYS___clock_gettime50, AX 259 SYSCALL 260 MOVQ 8(SP), AX // sec 261 MOVQ 16(SP), DX // nsec 262 263 // sec is in AX, nsec in DX 264 // return nsec in AX 265 IMULQ $1000000000, AX 266 ADDQ DX, AX 267 MOVQ AX, ret+0(FP) 268 RET 269 270 TEXT runtime·getcontext(SB),NOSPLIT,$-8 271 MOVQ ctxt+0(FP), DI // arg 1 - context 272 MOVL $SYS_getcontext, AX 273 SYSCALL 274 JCC 2(PC) 275 MOVL $0xf1, 0xf1 // crash 276 RET 277 278 TEXT runtime·sigprocmask(SB),NOSPLIT,$0 279 MOVL how+0(FP), DI // arg 1 - how 280 MOVQ new+8(FP), SI // arg 2 - set 281 MOVQ old+16(FP), DX // arg 3 - oset 282 MOVL $SYS___sigprocmask14, AX 283 SYSCALL 284 JCC 2(PC) 285 MOVL $0xf1, 0xf1 // crash 286 RET 287 288 TEXT sigreturn_tramp<>(SB),NOSPLIT,$-8 289 MOVQ R15, DI // Load address of ucontext 290 MOVQ $SYS_setcontext, AX 291 SYSCALL 292 MOVQ $-1, DI // Something failed... 293 MOVL $SYS_exit, AX 294 SYSCALL 295 296 TEXT runtime·sigaction(SB),NOSPLIT,$-8 297 MOVL sig+0(FP), DI // arg 1 - signum 298 MOVQ new+8(FP), SI // arg 2 - nsa 299 MOVQ old+16(FP), DX // arg 3 - osa 300 // arg 4 - tramp 301 LEAQ sigreturn_tramp<>(SB), R10 302 MOVQ $2, R8 // arg 5 - vers 303 MOVL $SYS___sigaction_sigtramp, AX 304 SYSCALL 305 JCC 2(PC) 306 MOVL $0xf1, 0xf1 // crash 307 RET 308 309 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 310 MOVQ fn+0(FP), AX 311 MOVL sig+8(FP), DI 312 MOVQ info+16(FP), SI 313 MOVQ ctx+24(FP), DX 314 PUSHQ BP 315 MOVQ SP, BP 316 ANDQ $~15, SP // alignment for x86_64 ABI 317 CALL AX 318 MOVQ BP, SP 319 POPQ BP 320 RET 321 322 // Called using C ABI. 323 TEXT runtime·sigtramp(SB),NOSPLIT,$0 324 // Transition from C ABI to Go ABI. 325 PUSH_REGS_HOST_TO_ABI0() 326 327 // Call into the Go signal handler 328 NOP SP // disable vet stack checking 329 ADJSP $24 330 MOVQ DI, 0(SP) // sig 331 MOVQ SI, 8(SP) // info 332 MOVQ DX, 16(SP) // ctx 333 CALL ·sigtrampgo(SB) 334 ADJSP $-24 335 336 POP_REGS_HOST_TO_ABI0() 337 RET 338 339 TEXT runtime·mmap(SB),NOSPLIT,$0 340 MOVQ addr+0(FP), DI // arg 1 - addr 341 MOVQ n+8(FP), SI // arg 2 - len 342 MOVL prot+16(FP), DX // arg 3 - prot 343 MOVL flags+20(FP), R10 // arg 4 - flags 344 MOVL fd+24(FP), R8 // arg 5 - fd 345 MOVL off+28(FP), R9 346 SUBQ $16, SP 347 MOVQ R9, 8(SP) // arg 7 - offset (passed on stack) 348 MOVQ $0, R9 // arg 6 - pad 349 MOVL $SYS_mmap, AX 350 SYSCALL 351 JCC ok 352 ADDQ $16, SP 353 MOVQ $0, p+32(FP) 354 MOVQ AX, err+40(FP) 355 RET 356 ok: 357 ADDQ $16, SP 358 MOVQ AX, p+32(FP) 359 MOVQ $0, err+40(FP) 360 RET 361 362 TEXT runtime·munmap(SB),NOSPLIT,$0 363 MOVQ addr+0(FP), DI // arg 1 - addr 364 MOVQ n+8(FP), SI // arg 2 - len 365 MOVL $SYS_munmap, AX 366 SYSCALL 367 JCC 2(PC) 368 MOVL $0xf1, 0xf1 // crash 369 RET 370 371 372 TEXT runtime·madvise(SB),NOSPLIT,$0 373 MOVQ addr+0(FP), DI // arg 1 - addr 374 MOVQ n+8(FP), SI // arg 2 - len 375 MOVL flags+16(FP), DX // arg 3 - behav 376 MOVQ $SYS_madvise, AX 377 SYSCALL 378 JCC 2(PC) 379 MOVL $-1, AX 380 MOVL AX, ret+24(FP) 381 RET 382 383 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 384 MOVQ new+0(FP), DI // arg 1 - nss 385 MOVQ old+8(FP), SI // arg 2 - oss 386 MOVQ $SYS___sigaltstack14, AX 387 SYSCALL 388 JCC 2(PC) 389 MOVL $0xf1, 0xf1 // crash 390 RET 391 392 // set tls base to DI 393 TEXT runtime·settls(SB),NOSPLIT,$8 394 // adjust for ELF: wants to use -8(FS) for g 395 ADDQ $8, DI // arg 1 - ptr 396 MOVQ $SYS__lwp_setprivate, AX 397 SYSCALL 398 JCC 2(PC) 399 MOVL $0xf1, 0xf1 // crash 400 RET 401 402 TEXT runtime·sysctl(SB),NOSPLIT,$0 403 MOVQ mib+0(FP), DI // arg 1 - name 404 MOVL miblen+8(FP), SI // arg 2 - namelen 405 MOVQ out+16(FP), DX // arg 3 - oldp 406 MOVQ size+24(FP), R10 // arg 4 - oldlenp 407 MOVQ dst+32(FP), R8 // arg 5 - newp 408 MOVQ ndst+40(FP), R9 // arg 6 - newlen 409 MOVQ $SYS___sysctl, AX 410 SYSCALL 411 JCC 4(PC) 412 NEGQ AX 413 MOVL AX, ret+48(FP) 414 RET 415 MOVL $0, AX 416 MOVL AX, ret+48(FP) 417 RET 418 419 // int32 runtime·kqueue(void) 420 TEXT runtime·kqueue(SB),NOSPLIT,$0 421 MOVQ $0, DI 422 MOVL $SYS_kqueue, AX 423 SYSCALL 424 JCC 2(PC) 425 NEGQ AX 426 MOVL AX, ret+0(FP) 427 RET 428 429 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout) 430 TEXT runtime·kevent(SB),NOSPLIT,$0 431 MOVL kq+0(FP), DI 432 MOVQ ch+8(FP), SI 433 MOVL nch+16(FP), DX 434 MOVQ ev+24(FP), R10 435 MOVL nev+32(FP), R8 436 MOVQ ts+40(FP), R9 437 MOVL $SYS___kevent50, AX 438 SYSCALL 439 JCC 2(PC) 440 NEGQ AX 441 MOVL AX, ret+48(FP) 442 RET 443 444 // void runtime·closeonexec(int32 fd) 445 TEXT runtime·closeonexec(SB),NOSPLIT,$0 446 MOVL fd+0(FP), DI // fd 447 MOVQ $F_SETFD, SI 448 MOVQ $FD_CLOEXEC, DX 449 MOVL $SYS_fcntl, AX 450 SYSCALL 451 RET 452 453 // func runtime·setNonblock(int32 fd) 454 TEXT runtime·setNonblock(SB),NOSPLIT,$0-4 455 MOVL fd+0(FP), DI // fd 456 MOVQ $3, SI // F_GETFL 457 MOVQ $0, DX 458 MOVL $92, AX // fcntl 459 SYSCALL 460 MOVL fd+0(FP), DI // fd 461 MOVQ $4, SI // F_SETFL 462 MOVQ $4, DX // O_NONBLOCK 463 ORL AX, DX 464 MOVL $92, AX // fcntl 465 SYSCALL 466 RET