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