github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/src/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 13 // int32 lwp_create(void *context, uintptr flags, void *lwpid) 14 TEXT runtime·lwp_create(SB),NOSPLIT,$0 15 MOVQ ctxt+0(FP), DI 16 MOVQ flags+8(FP), SI 17 MOVQ lwpid+16(FP), DX 18 MOVL $309, AX // sys__lwp_create 19 SYSCALL 20 JCC 2(PC) 21 NEGQ AX 22 MOVL AX, ret+24(FP) 23 RET 24 25 TEXT runtime·lwp_tramp(SB),NOSPLIT,$0 26 27 // Set FS to point at m->tls. 28 LEAQ m_tls(R8), DI 29 CALL runtime·settls(SB) 30 31 // Set up new stack. 32 get_tls(CX) 33 MOVQ R8, g_m(R9) 34 MOVQ R9, g(CX) 35 CALL runtime·stackcheck(SB) 36 37 // Call fn 38 CALL R12 39 40 // It shouldn't return. If it does, exit. 41 MOVL $310, AX // sys__lwp_exit 42 SYSCALL 43 JMP -3(PC) // keep exiting 44 45 TEXT runtime·osyield(SB),NOSPLIT,$0 46 MOVL $350, AX // sys_sched_yield 47 SYSCALL 48 RET 49 50 TEXT runtime·lwp_park(SB),NOSPLIT,$0 51 MOVQ abstime+0(FP), DI // arg 1 - abstime 52 MOVL unpark+8(FP), SI // arg 2 - unpark 53 MOVQ hint+16(FP), DX // arg 3 - hint 54 MOVQ unparkhint+24(FP), R10 // arg 4 - unparkhint 55 MOVL $434, AX // sys__lwp_park 56 SYSCALL 57 MOVL AX, ret+32(FP) 58 RET 59 60 TEXT runtime·lwp_unpark(SB),NOSPLIT,$0 61 MOVL lwp+0(FP), DI // arg 1 - lwp 62 MOVQ hint+8(FP), SI // arg 2 - hint 63 MOVL $321, AX // sys__lwp_unpark 64 SYSCALL 65 MOVL AX, ret+16(FP) 66 RET 67 68 TEXT runtime·lwp_self(SB),NOSPLIT,$0 69 MOVL $311, AX // sys__lwp_self 70 SYSCALL 71 MOVL AX, ret+0(FP) 72 RET 73 74 // Exit the entire program (like C exit) 75 TEXT runtime·exit(SB),NOSPLIT,$-8 76 MOVL code+0(FP), DI // arg 1 - exit status 77 MOVL $1, AX // sys_exit 78 SYSCALL 79 MOVL $0xf1, 0xf1 // crash 80 RET 81 82 // func exitThread(wait *uint32) 83 TEXT runtime·exitThread(SB),NOSPLIT,$0-8 84 MOVQ wait+0(FP), AX 85 // We're done using the stack. 86 MOVL $0, (AX) 87 MOVL $310, AX // sys__lwp_exit 88 SYSCALL 89 MOVL $0xf1, 0xf1 // crash 90 JMP 0(PC) 91 92 TEXT runtime·open(SB),NOSPLIT,$-8 93 MOVQ name+0(FP), DI // arg 1 pathname 94 MOVL mode+8(FP), SI // arg 2 flags 95 MOVL perm+12(FP), DX // arg 3 mode 96 MOVL $5, AX 97 SYSCALL 98 JCC 2(PC) 99 MOVL $-1, AX 100 MOVL AX, ret+16(FP) 101 RET 102 103 TEXT runtime·closefd(SB),NOSPLIT,$-8 104 MOVL fd+0(FP), DI // arg 1 fd 105 MOVL $6, AX 106 SYSCALL 107 JCC 2(PC) 108 MOVL $-1, AX 109 MOVL AX, ret+8(FP) 110 RET 111 112 TEXT runtime·read(SB),NOSPLIT,$-8 113 MOVL fd+0(FP), DI // arg 1 fd 114 MOVQ p+8(FP), SI // arg 2 buf 115 MOVL n+16(FP), DX // arg 3 count 116 MOVL $3, AX 117 SYSCALL 118 JCC 2(PC) 119 MOVL $-1, AX 120 MOVL AX, ret+24(FP) 121 RET 122 123 TEXT runtime·write(SB),NOSPLIT,$-8 124 MOVQ fd+0(FP), DI // arg 1 - fd 125 MOVQ p+8(FP), SI // arg 2 - buf 126 MOVL n+16(FP), DX // arg 3 - nbyte 127 MOVL $4, AX // sys_write 128 SYSCALL 129 JCC 2(PC) 130 MOVL $-1, AX 131 MOVL AX, ret+24(FP) 132 RET 133 134 TEXT runtime·usleep(SB),NOSPLIT,$16 135 MOVL $0, DX 136 MOVL usec+0(FP), AX 137 MOVL $1000000, CX 138 DIVL CX 139 MOVQ AX, 0(SP) // tv_sec 140 MOVL $1000, AX 141 MULL DX 142 MOVQ AX, 8(SP) // tv_nsec 143 144 MOVQ SP, DI // arg 1 - rqtp 145 MOVQ $0, SI // arg 2 - rmtp 146 MOVL $430, AX // sys_nanosleep 147 SYSCALL 148 RET 149 150 TEXT runtime·raise(SB),NOSPLIT,$16 151 MOVL $311, AX // sys__lwp_self 152 SYSCALL 153 MOVQ AX, DI // arg 1 - target 154 MOVL sig+0(FP), SI // arg 2 - signo 155 MOVL $318, AX // sys__lwp_kill 156 SYSCALL 157 RET 158 159 TEXT runtime·raiseproc(SB),NOSPLIT,$16 160 MOVL $20, AX // sys_getpid 161 SYSCALL 162 MOVQ AX, DI // arg 1 - pid 163 MOVL sig+0(FP), SI // arg 2 - signo 164 MOVL $37, AX // sys_kill 165 SYSCALL 166 RET 167 168 TEXT runtime·setitimer(SB),NOSPLIT,$-8 169 MOVL mode+0(FP), DI // arg 1 - which 170 MOVQ new+8(FP), SI // arg 2 - itv 171 MOVQ old+16(FP), DX // arg 3 - oitv 172 MOVL $425, AX // sys_setitimer 173 SYSCALL 174 RET 175 176 // func walltime() (sec int64, nsec int32) 177 TEXT runtime·walltime(SB), NOSPLIT, $32 178 MOVQ $0, DI // arg 1 - clock_id 179 LEAQ 8(SP), SI // arg 2 - tp 180 MOVL $427, AX // sys_clock_gettime 181 SYSCALL 182 MOVQ 8(SP), AX // sec 183 MOVL 16(SP), DX // nsec 184 185 // sec is in AX, nsec in DX 186 MOVQ AX, sec+0(FP) 187 MOVL DX, nsec+8(FP) 188 RET 189 190 TEXT runtime·nanotime(SB),NOSPLIT,$32 191 MOVQ $0, DI // arg 1 - clock_id 192 LEAQ 8(SP), SI // arg 2 - tp 193 MOVL $427, AX // sys_clock_gettime 194 SYSCALL 195 MOVQ 8(SP), AX // sec 196 MOVL 16(SP), DX // nsec 197 198 // sec is in AX, nsec in DX 199 // return nsec in AX 200 IMULQ $1000000000, AX 201 ADDQ DX, AX 202 MOVQ AX, ret+0(FP) 203 RET 204 205 TEXT runtime·getcontext(SB),NOSPLIT,$-8 206 MOVQ ctxt+0(FP), DI // arg 1 - context 207 MOVL $307, AX // sys_getcontext 208 SYSCALL 209 JCC 2(PC) 210 MOVL $0xf1, 0xf1 // crash 211 RET 212 213 TEXT runtime·sigprocmask(SB),NOSPLIT,$0 214 MOVL how+0(FP), DI // arg 1 - how 215 MOVQ new+8(FP), SI // arg 2 - set 216 MOVQ old+16(FP), DX // arg 3 - oset 217 MOVL $293, AX // sys_sigprocmask 218 SYSCALL 219 JCC 2(PC) 220 MOVL $0xf1, 0xf1 // crash 221 RET 222 223 TEXT runtime·sigreturn_tramp(SB),NOSPLIT,$-8 224 MOVQ R15, DI // Load address of ucontext 225 MOVQ $308, AX // sys_setcontext 226 SYSCALL 227 MOVQ $-1, DI // Something failed... 228 MOVL $1, AX // sys_exit 229 SYSCALL 230 231 TEXT runtime·sigaction(SB),NOSPLIT,$-8 232 MOVL sig+0(FP), DI // arg 1 - signum 233 MOVQ new+8(FP), SI // arg 2 - nsa 234 MOVQ old+16(FP), DX // arg 3 - osa 235 // arg 4 - tramp 236 LEAQ runtime·sigreturn_tramp(SB), R10 237 MOVQ $2, R8 // arg 5 - vers 238 MOVL $340, AX // sys___sigaction_sigtramp 239 SYSCALL 240 JCC 2(PC) 241 MOVL $0xf1, 0xf1 // crash 242 RET 243 244 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 245 MOVQ fn+0(FP), AX 246 MOVL sig+8(FP), DI 247 MOVQ info+16(FP), SI 248 MOVQ ctx+24(FP), DX 249 PUSHQ BP 250 MOVQ SP, BP 251 ANDQ $~15, SP // alignment for x86_64 ABI 252 CALL AX 253 MOVQ BP, SP 254 POPQ BP 255 RET 256 257 TEXT runtime·sigtramp(SB),NOSPLIT,$72 258 // Save callee-saved C registers, since the caller may be a C signal handler. 259 MOVQ BX, bx-8(SP) 260 MOVQ BP, bp-16(SP) // save in case GOEXPERIMENT=noframepointer is set 261 MOVQ R12, r12-24(SP) 262 MOVQ R13, r13-32(SP) 263 MOVQ R14, r14-40(SP) 264 MOVQ R15, r15-48(SP) 265 // We don't save mxcsr or the x87 control word because sigtrampgo doesn't 266 // modify them. 267 268 MOVQ DX, ctx-56(SP) 269 MOVQ SI, info-64(SP) 270 MOVQ DI, signum-72(SP) 271 CALL runtime·sigtrampgo(SB) 272 273 MOVQ r15-48(SP), R15 274 MOVQ r14-40(SP), R14 275 MOVQ r13-32(SP), R13 276 MOVQ r12-24(SP), R12 277 MOVQ bp-16(SP), BP 278 MOVQ bx-8(SP), BX 279 RET 280 281 TEXT runtime·mmap(SB),NOSPLIT,$0 282 MOVQ addr+0(FP), DI // arg 1 - addr 283 MOVQ n+8(FP), SI // arg 2 - len 284 MOVL prot+16(FP), DX // arg 3 - prot 285 MOVL flags+20(FP), R10 // arg 4 - flags 286 MOVL fd+24(FP), R8 // arg 5 - fd 287 MOVL off+28(FP), R9 288 SUBQ $16, SP 289 MOVQ R9, 8(SP) // arg 7 - offset (passed on stack) 290 MOVQ $0, R9 // arg 6 - pad 291 MOVL $197, AX // sys_mmap 292 SYSCALL 293 JCC ok 294 ADDQ $16, SP 295 MOVQ $0, p+32(FP) 296 MOVQ AX, err+40(FP) 297 RET 298 ok: 299 ADDQ $16, SP 300 MOVQ AX, p+32(FP) 301 MOVQ $0, err+40(FP) 302 RET 303 304 TEXT runtime·munmap(SB),NOSPLIT,$0 305 MOVQ addr+0(FP), DI // arg 1 - addr 306 MOVQ n+8(FP), SI // arg 2 - len 307 MOVL $73, AX // sys_munmap 308 SYSCALL 309 JCC 2(PC) 310 MOVL $0xf1, 0xf1 // crash 311 RET 312 313 314 TEXT runtime·madvise(SB),NOSPLIT,$0 315 MOVQ addr+0(FP), DI // arg 1 - addr 316 MOVQ n+8(FP), SI // arg 2 - len 317 MOVL flags+16(FP), DX // arg 3 - behav 318 MOVQ $75, AX // sys_madvise 319 SYSCALL 320 // ignore failure - maybe pages are locked 321 RET 322 323 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 324 MOVQ new+0(FP), DI // arg 1 - nss 325 MOVQ old+8(FP), SI // arg 2 - oss 326 MOVQ $281, AX // sys___sigaltstack14 327 SYSCALL 328 JCC 2(PC) 329 MOVL $0xf1, 0xf1 // crash 330 RET 331 332 // set tls base to DI 333 TEXT runtime·settls(SB),NOSPLIT,$8 334 // adjust for ELF: wants to use -8(FS) for g 335 ADDQ $8, DI // arg 1 - ptr 336 MOVQ $317, AX // sys__lwp_setprivate 337 SYSCALL 338 JCC 2(PC) 339 MOVL $0xf1, 0xf1 // crash 340 RET 341 342 TEXT runtime·sysctl(SB),NOSPLIT,$0 343 MOVQ mib+0(FP), DI // arg 1 - name 344 MOVL miblen+8(FP), SI // arg 2 - namelen 345 MOVQ out+16(FP), DX // arg 3 - oldp 346 MOVQ size+24(FP), R10 // arg 4 - oldlenp 347 MOVQ dst+32(FP), R8 // arg 5 - newp 348 MOVQ ndst+40(FP), R9 // arg 6 - newlen 349 MOVQ $202, AX // sys___sysctl 350 SYSCALL 351 JCC 4(PC) 352 NEGQ AX 353 MOVL AX, ret+48(FP) 354 RET 355 MOVL $0, AX 356 MOVL AX, ret+48(FP) 357 RET 358 359 // int32 runtime·kqueue(void) 360 TEXT runtime·kqueue(SB),NOSPLIT,$0 361 MOVQ $0, DI 362 MOVL $344, AX 363 SYSCALL 364 JCC 2(PC) 365 NEGQ AX 366 MOVL AX, ret+0(FP) 367 RET 368 369 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout) 370 TEXT runtime·kevent(SB),NOSPLIT,$0 371 MOVL kq+0(FP), DI 372 MOVQ ch+8(FP), SI 373 MOVL nch+16(FP), DX 374 MOVQ ev+24(FP), R10 375 MOVL nev+32(FP), R8 376 MOVQ ts+40(FP), R9 377 MOVL $435, AX 378 SYSCALL 379 JCC 2(PC) 380 NEGQ AX 381 MOVL AX, ret+48(FP) 382 RET 383 384 // void runtime·closeonexec(int32 fd) 385 TEXT runtime·closeonexec(SB),NOSPLIT,$0 386 MOVL fd+0(FP), DI // fd 387 MOVQ $2, SI // F_SETFD 388 MOVQ $1, DX // FD_CLOEXEC 389 MOVL $92, AX // fcntl 390 SYSCALL 391 RET