github.com/shijuvar/go@v0.0.0-20141209052335-e8f13700b70c/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 TEXT runtime·exit1(SB),NOSPLIT,$-8 83 MOVL $310, AX // sys__lwp_exit 84 SYSCALL 85 MOVL $0xf1, 0xf1 // crash 86 RET 87 88 TEXT runtime·open(SB),NOSPLIT,$-8 89 MOVQ name+0(FP), DI // arg 1 pathname 90 MOVL mode+8(FP), SI // arg 2 flags 91 MOVL perm+12(FP), DX // arg 3 mode 92 MOVL $5, AX 93 SYSCALL 94 MOVL AX, ret+16(FP) 95 RET 96 97 TEXT runtime·close(SB),NOSPLIT,$-8 98 MOVL fd+0(FP), DI // arg 1 fd 99 MOVL $6, AX 100 SYSCALL 101 MOVL AX, ret+8(FP) 102 RET 103 104 TEXT runtime·read(SB),NOSPLIT,$-8 105 MOVL fd+0(FP), DI // arg 1 fd 106 MOVQ p+8(FP), SI // arg 2 buf 107 MOVL n+16(FP), DX // arg 3 count 108 MOVL $3, AX 109 SYSCALL 110 MOVL AX, ret+24(FP) 111 RET 112 113 TEXT runtime·write(SB),NOSPLIT,$-8 114 MOVQ fd+0(FP), DI // arg 1 - fd 115 MOVQ p+8(FP), SI // arg 2 - buf 116 MOVL n+16(FP), DX // arg 3 - nbyte 117 MOVL $4, AX // sys_write 118 SYSCALL 119 MOVL AX, ret+24(FP) 120 RET 121 122 TEXT runtime·usleep(SB),NOSPLIT,$16 123 MOVL $0, DX 124 MOVL usec+0(FP), AX 125 MOVL $1000000, CX 126 DIVL CX 127 MOVQ AX, 0(SP) // tv_sec 128 MOVL $1000, AX 129 MULL DX 130 MOVQ AX, 8(SP) // tv_nsec 131 132 MOVQ SP, DI // arg 1 - rqtp 133 MOVQ $0, SI // arg 2 - rmtp 134 MOVL $430, AX // sys_nanosleep 135 SYSCALL 136 RET 137 138 TEXT runtime·raise(SB),NOSPLIT,$16 139 MOVL $311, AX // sys__lwp_self 140 SYSCALL 141 MOVQ AX, DI // arg 1 - target 142 MOVL sig+0(FP), SI // arg 2 - signo 143 MOVL $318, AX // sys__lwp_kill 144 SYSCALL 145 RET 146 147 TEXT runtime·setitimer(SB),NOSPLIT,$-8 148 MOVL mode+0(FP), DI // arg 1 - which 149 MOVQ new+8(FP), SI // arg 2 - itv 150 MOVQ old+16(FP), DX // arg 3 - oitv 151 MOVL $425, AX // sys_setitimer 152 SYSCALL 153 RET 154 155 // func now() (sec int64, nsec int32) 156 TEXT time·now(SB), NOSPLIT, $32 157 MOVQ $0, DI // arg 1 - clock_id 158 LEAQ 8(SP), SI // arg 2 - tp 159 MOVL $427, AX // sys_clock_gettime 160 SYSCALL 161 MOVQ 8(SP), AX // sec 162 MOVL 16(SP), DX // nsec 163 164 // sec is in AX, nsec in DX 165 MOVQ AX, sec+0(FP) 166 MOVL DX, nsec+8(FP) 167 RET 168 169 TEXT runtime·nanotime(SB),NOSPLIT,$32 170 MOVQ $0, DI // arg 1 - clock_id 171 LEAQ 8(SP), SI // arg 2 - tp 172 MOVL $427, AX // sys_clock_gettime 173 SYSCALL 174 MOVQ 8(SP), AX // sec 175 MOVL 16(SP), DX // nsec 176 177 // sec is in AX, nsec in DX 178 // return nsec in AX 179 IMULQ $1000000000, AX 180 ADDQ DX, AX 181 MOVQ AX, ret+0(FP) 182 RET 183 184 TEXT runtime·getcontext(SB),NOSPLIT,$-8 185 MOVQ ctxt+0(FP), DI // arg 1 - context 186 MOVL $307, AX // sys_getcontext 187 SYSCALL 188 JCC 2(PC) 189 MOVL $0xf1, 0xf1 // crash 190 RET 191 192 TEXT runtime·sigprocmask(SB),NOSPLIT,$0 193 MOVL mode+0(FP), DI // arg 1 - how 194 MOVQ new+8(FP), SI // arg 2 - set 195 MOVQ old+16(FP), DX // arg 3 - oset 196 MOVL $293, AX // sys_sigprocmask 197 SYSCALL 198 JCC 2(PC) 199 MOVL $0xf1, 0xf1 // crash 200 RET 201 202 TEXT runtime·sigreturn_tramp(SB),NOSPLIT,$-8 203 MOVQ R15, DI // Load address of ucontext 204 MOVQ $308, AX // sys_setcontext 205 SYSCALL 206 MOVQ $-1, DI // Something failed... 207 MOVL $1, AX // sys_exit 208 SYSCALL 209 210 TEXT runtime·sigaction(SB),NOSPLIT,$-8 211 MOVL sig+0(FP), DI // arg 1 - signum 212 MOVQ new+8(FP), SI // arg 2 - nsa 213 MOVQ old+16(FP), DX // arg 3 - osa 214 // arg 4 - tramp 215 LEAQ runtime·sigreturn_tramp(SB), R10 216 MOVQ $2, R8 // arg 5 - vers 217 MOVL $340, AX // sys___sigaction_sigtramp 218 SYSCALL 219 JCC 2(PC) 220 MOVL $0xf1, 0xf1 // crash 221 RET 222 223 TEXT runtime·sigtramp(SB),NOSPLIT,$64 224 get_tls(BX) 225 226 // check that g exists 227 MOVQ g(BX), R10 228 CMPQ R10, $0 229 JNE 5(PC) 230 MOVQ DI, 0(SP) 231 MOVQ $runtime·badsignal(SB), AX 232 CALL AX 233 RET 234 235 // save g 236 MOVQ R10, 40(SP) 237 238 // g = m->signal 239 MOVQ g_m(R10), BP 240 MOVQ m_gsignal(BP), BP 241 MOVQ BP, g(BX) 242 243 MOVQ DI, 0(SP) 244 MOVQ SI, 8(SP) 245 MOVQ DX, 16(SP) 246 MOVQ R10, 24(SP) 247 248 CALL runtime·sighandler(SB) 249 250 // restore g 251 get_tls(BX) 252 MOVQ 40(SP), R10 253 MOVQ R10, g(BX) 254 RET 255 256 TEXT runtime·mmap(SB),NOSPLIT,$0 257 MOVQ addr+0(FP), DI // arg 1 - addr 258 MOVQ n+8(FP), SI // arg 2 - len 259 MOVL prot+16(FP), DX // arg 3 - prot 260 MOVL flags+20(FP), R10 // arg 4 - flags 261 MOVL fd+24(FP), R8 // arg 5 - fd 262 MOVL off+28(FP), R9 263 SUBQ $16, SP 264 MOVQ R9, 8(SP) // arg 7 - offset (passed on stack) 265 MOVQ $0, R9 // arg 6 - pad 266 MOVL $197, AX // sys_mmap 267 SYSCALL 268 ADDQ $16, SP 269 MOVQ AX, ret+32(FP) 270 RET 271 272 TEXT runtime·munmap(SB),NOSPLIT,$0 273 MOVQ addr+0(FP), DI // arg 1 - addr 274 MOVQ n+8(FP), SI // arg 2 - len 275 MOVL $73, AX // sys_munmap 276 SYSCALL 277 JCC 2(PC) 278 MOVL $0xf1, 0xf1 // crash 279 RET 280 281 282 TEXT runtime·madvise(SB),NOSPLIT,$0 283 MOVQ addr+0(FP), DI // arg 1 - addr 284 MOVQ n+8(FP), SI // arg 2 - len 285 MOVL flags+16(FP), DX // arg 3 - behav 286 MOVQ $75, AX // sys_madvise 287 SYSCALL 288 // ignore failure - maybe pages are locked 289 RET 290 291 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 292 MOVQ new+8(SP), DI // arg 1 - nss 293 MOVQ old+16(SP), SI // arg 2 - oss 294 MOVQ $281, AX // sys___sigaltstack14 295 SYSCALL 296 JCC 2(PC) 297 MOVL $0xf1, 0xf1 // crash 298 RET 299 300 // set tls base to DI 301 TEXT runtime·settls(SB),NOSPLIT,$8 302 // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m 303 ADDQ $16, DI // arg 1 - ptr 304 MOVQ $317, AX // sys__lwp_setprivate 305 SYSCALL 306 JCC 2(PC) 307 MOVL $0xf1, 0xf1 // crash 308 RET 309 310 TEXT runtime·sysctl(SB),NOSPLIT,$0 311 MOVQ mib+0(FP), DI // arg 1 - name 312 MOVL miblen+8(FP), SI // arg 2 - namelen 313 MOVQ out+16(FP), DX // arg 3 - oldp 314 MOVQ size+24(FP), R10 // arg 4 - oldlenp 315 MOVQ dst+32(FP), R8 // arg 5 - newp 316 MOVQ ndst+40(FP), R9 // arg 6 - newlen 317 MOVQ $202, AX // sys___sysctl 318 SYSCALL 319 JCC 4(PC) 320 NEGQ AX 321 MOVL AX, ret+48(FP) 322 RET 323 MOVL $0, AX 324 MOVL AX, ret+48(FP) 325 RET 326 327 // int32 runtime·kqueue(void) 328 TEXT runtime·kqueue(SB),NOSPLIT,$0 329 MOVQ $0, DI 330 MOVL $344, AX 331 SYSCALL 332 JCC 2(PC) 333 NEGQ AX 334 MOVL AX, ret+0(FP) 335 RET 336 337 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout) 338 TEXT runtime·kevent(SB),NOSPLIT,$0 339 MOVL fd+0(FP), DI 340 MOVQ ev1+8(FP), SI 341 MOVL nev1+16(FP), DX 342 MOVQ ev2+24(FP), R10 343 MOVL nev2+32(FP), R8 344 MOVQ ts+40(FP), R9 345 MOVL $435, AX 346 SYSCALL 347 JCC 2(PC) 348 NEGQ AX 349 MOVL AX, ret+48(FP) 350 RET 351 352 // void runtime·closeonexec(int32 fd) 353 TEXT runtime·closeonexec(SB),NOSPLIT,$0 354 MOVL fd+0(FP), DI // fd 355 MOVQ $2, SI // F_SETFD 356 MOVQ $1, DX // FD_CLOEXEC 357 MOVL $92, AX // fcntl 358 SYSCALL 359 RET