github.com/dannin/go@v0.0.0-20161031215817-d35dfd405eaa/src/runtime/sys_dragonfly_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 13 TEXT runtime·sys_umtx_sleep(SB),NOSPLIT,$0 14 MOVQ addr+0(FP), DI // arg 1 - ptr 15 MOVL val+8(FP), SI // arg 2 - value 16 MOVL timeout+12(FP), DX // arg 3 - timeout 17 MOVL $469, AX // umtx_sleep 18 SYSCALL 19 JCC 2(PC) 20 NEGQ AX 21 MOVL AX, ret+16(FP) 22 RET 23 24 TEXT runtime·sys_umtx_wakeup(SB),NOSPLIT,$0 25 MOVQ addr+0(FP), DI // arg 1 - ptr 26 MOVL val+8(FP), SI // arg 2 - count 27 MOVL $470, AX // umtx_wakeup 28 SYSCALL 29 JCC 2(PC) 30 NEGQ AX 31 MOVL AX, ret+16(FP) 32 RET 33 34 TEXT runtime·lwp_create(SB),NOSPLIT,$0 35 MOVQ param+0(FP), DI // arg 1 - params 36 MOVL $495, AX // lwp_create 37 SYSCALL 38 MOVL AX, ret+8(FP) 39 RET 40 41 TEXT runtime·lwp_start(SB),NOSPLIT,$0 42 MOVQ DI, R13 // m 43 44 // set up FS to point at m->tls 45 LEAQ m_tls(R13), DI 46 CALL runtime·settls(SB) // smashes DI 47 48 // set up m, g 49 get_tls(CX) 50 MOVQ m_g0(R13), DI 51 MOVQ R13, g_m(DI) 52 MOVQ DI, g(CX) 53 54 CALL runtime·stackcheck(SB) 55 CALL runtime·mstart(SB) 56 57 MOVQ 0, AX // crash (not reached) 58 59 // Exit the entire program (like C exit) 60 TEXT runtime·exit(SB),NOSPLIT,$-8 61 MOVL code+0(FP), DI // arg 1 exit status 62 MOVL $1, AX 63 SYSCALL 64 MOVL $0xf1, 0xf1 // crash 65 RET 66 67 TEXT runtime·exit1(SB),NOSPLIT,$-8 68 MOVL code+0(FP), DI // arg 1 exit status 69 MOVL $431, AX 70 SYSCALL 71 MOVL $0xf1, 0xf1 // crash 72 RET 73 74 TEXT runtime·open(SB),NOSPLIT,$-8 75 MOVQ name+0(FP), DI // arg 1 pathname 76 MOVL mode+8(FP), SI // arg 2 flags 77 MOVL perm+12(FP), DX // arg 3 mode 78 MOVL $5, AX 79 SYSCALL 80 JCC 2(PC) 81 MOVL $-1, AX 82 MOVL AX, ret+16(FP) 83 RET 84 85 TEXT runtime·closefd(SB),NOSPLIT,$-8 86 MOVL fd+0(FP), DI // arg 1 fd 87 MOVL $6, AX 88 SYSCALL 89 JCC 2(PC) 90 MOVL $-1, AX 91 MOVL AX, ret+8(FP) 92 RET 93 94 TEXT runtime·read(SB),NOSPLIT,$-8 95 MOVL fd+0(FP), DI // arg 1 fd 96 MOVQ p+8(FP), SI // arg 2 buf 97 MOVL n+16(FP), DX // arg 3 count 98 MOVL $3, AX 99 SYSCALL 100 JCC 2(PC) 101 MOVL $-1, AX 102 MOVL AX, ret+24(FP) 103 RET 104 105 TEXT runtime·write(SB),NOSPLIT,$-8 106 MOVQ fd+0(FP), DI // arg 1 fd 107 MOVQ p+8(FP), SI // arg 2 buf 108 MOVL n+16(FP), DX // arg 3 count 109 MOVL $4, AX 110 SYSCALL 111 JCC 2(PC) 112 MOVL $-1, AX 113 MOVL AX, ret+24(FP) 114 RET 115 116 TEXT runtime·getrlimit(SB),NOSPLIT,$-8 117 MOVL kind+0(FP), DI 118 MOVQ limit+8(FP), SI 119 MOVL $194, AX 120 SYSCALL 121 MOVL AX, ret+16(FP) 122 RET 123 124 TEXT runtime·raise(SB),NOSPLIT,$16 125 MOVL $496, AX // lwp_gettid 126 SYSCALL 127 MOVQ $-1, DI // arg 1 - pid 128 MOVQ AX, SI // arg 2 - tid 129 MOVL sig+0(FP), DX // arg 3 - signum 130 MOVL $497, AX // lwp_kill 131 SYSCALL 132 RET 133 134 TEXT runtime·raiseproc(SB),NOSPLIT,$0 135 MOVL $20, AX // getpid 136 SYSCALL 137 MOVQ AX, DI // arg 1 - pid 138 MOVL sig+0(FP), SI // arg 2 - signum 139 MOVL $37, AX // kill 140 SYSCALL 141 RET 142 143 TEXT runtime·setitimer(SB), NOSPLIT, $-8 144 MOVL mode+0(FP), DI 145 MOVQ new+8(FP), SI 146 MOVQ old+16(FP), DX 147 MOVL $83, AX 148 SYSCALL 149 RET 150 151 // func now() (sec int64, nsec int32) 152 TEXT time·now(SB), NOSPLIT, $32 153 MOVL $232, AX // clock_gettime 154 MOVQ $0, DI // CLOCK_REALTIME 155 LEAQ 8(SP), SI 156 SYSCALL 157 MOVQ 8(SP), AX // sec 158 MOVQ 16(SP), DX // nsec 159 160 // sec is in AX, nsec in DX 161 MOVQ AX, sec+0(FP) 162 MOVL DX, nsec+8(FP) 163 RET 164 165 TEXT runtime·nanotime(SB), NOSPLIT, $32 166 MOVL $232, AX 167 MOVQ $4, DI // CLOCK_MONOTONIC 168 LEAQ 8(SP), SI 169 SYSCALL 170 MOVQ 8(SP), AX // sec 171 MOVQ 16(SP), DX // nsec 172 173 // sec is in AX, nsec in DX 174 // return nsec in AX 175 IMULQ $1000000000, AX 176 ADDQ DX, AX 177 MOVQ AX, ret+0(FP) 178 RET 179 180 TEXT runtime·sigaction(SB),NOSPLIT,$-8 181 MOVL sig+0(FP), DI // arg 1 sig 182 MOVQ new+8(FP), SI // arg 2 act 183 MOVQ old+16(FP), DX // arg 3 oact 184 MOVL $342, AX 185 SYSCALL 186 JCC 2(PC) 187 MOVL $0xf1, 0xf1 // crash 188 RET 189 190 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 191 MOVL sig+8(FP), DI 192 MOVQ info+16(FP), SI 193 MOVQ ctx+24(FP), DX 194 MOVQ fn+0(FP), AX 195 CALL AX 196 RET 197 198 TEXT runtime·sigtramp(SB),NOSPLIT,$24 199 MOVQ DI, 0(SP) 200 MOVQ SI, 8(SP) 201 MOVQ DX, 16(SP) 202 CALL runtime·sigtrampgo(SB) 203 RET 204 205 TEXT runtime·mmap(SB),NOSPLIT,$0 206 MOVQ addr+0(FP), DI // arg 1 - addr 207 MOVQ n+8(FP), SI // arg 2 - len 208 MOVL prot+16(FP), DX // arg 3 - prot 209 MOVL flags+20(FP), R10 // arg 4 - flags 210 MOVL fd+24(FP), R8 // arg 5 - fd 211 MOVL off+28(FP), R9 212 SUBQ $16, SP 213 MOVQ R9, 8(SP) // arg 7 - offset (passed on stack) 214 MOVQ $0, R9 // arg 6 - pad 215 MOVL $197, AX 216 SYSCALL 217 ADDQ $16, SP 218 MOVQ AX, ret+32(FP) 219 RET 220 221 TEXT runtime·munmap(SB),NOSPLIT,$0 222 MOVQ addr+0(FP), DI // arg 1 addr 223 MOVQ n+8(FP), SI // arg 2 len 224 MOVL $73, AX 225 SYSCALL 226 JCC 2(PC) 227 MOVL $0xf1, 0xf1 // crash 228 RET 229 230 TEXT runtime·madvise(SB),NOSPLIT,$0 231 MOVQ addr+0(FP), DI 232 MOVQ n+8(FP), SI 233 MOVL flags+16(FP), DX 234 MOVQ $75, AX // madvise 235 SYSCALL 236 // ignore failure - maybe pages are locked 237 RET 238 239 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 240 MOVQ new+0(FP), DI 241 MOVQ old+8(FP), SI 242 MOVQ $53, AX 243 SYSCALL 244 JCC 2(PC) 245 MOVL $0xf1, 0xf1 // crash 246 RET 247 248 TEXT runtime·usleep(SB),NOSPLIT,$16 249 MOVL $0, DX 250 MOVL usec+0(FP), AX 251 MOVL $1000000, CX 252 DIVL CX 253 MOVQ AX, 0(SP) // tv_sec 254 MOVL $1000, AX 255 MULL DX 256 MOVQ AX, 8(SP) // tv_nsec 257 258 MOVQ SP, DI // arg 1 - rqtp 259 MOVQ $0, SI // arg 2 - rmtp 260 MOVL $240, AX // sys_nanosleep 261 SYSCALL 262 RET 263 264 // set tls base to DI 265 TEXT runtime·settls(SB),NOSPLIT,$16 266 ADDQ $8, DI // adjust for ELF: wants to use -8(FS) for g 267 MOVQ DI, 0(SP) 268 MOVQ $16, 8(SP) 269 MOVQ $0, DI // arg 1 - which 270 MOVQ SP, SI // arg 2 - tls_info 271 MOVQ $16, DX // arg 3 - infosize 272 MOVQ $472, AX // set_tls_area 273 SYSCALL 274 JCC 2(PC) 275 MOVL $0xf1, 0xf1 // crash 276 RET 277 278 TEXT runtime·sysctl(SB),NOSPLIT,$0 279 MOVQ mib+0(FP), DI // arg 1 - name 280 MOVL miblen+8(FP), SI // arg 2 - namelen 281 MOVQ out+16(FP), DX // arg 3 - oldp 282 MOVQ size+24(FP), R10 // arg 4 - oldlenp 283 MOVQ dst+32(FP), R8 // arg 5 - newp 284 MOVQ ndst+40(FP), R9 // arg 6 - newlen 285 MOVQ $202, AX // sys___sysctl 286 SYSCALL 287 JCC 4(PC) 288 NEGQ AX 289 MOVL AX, ret+48(FP) 290 RET 291 MOVL $0, AX 292 MOVL AX, ret+48(FP) 293 RET 294 295 TEXT runtime·osyield(SB),NOSPLIT,$-4 296 MOVL $331, AX // sys_sched_yield 297 SYSCALL 298 RET 299 300 TEXT runtime·sigprocmask(SB),NOSPLIT,$0 301 MOVL how+0(FP), DI // arg 1 - how 302 MOVQ new+8(FP), SI // arg 2 - set 303 MOVQ old+16(FP), DX // arg 3 - oset 304 MOVL $340, AX // sys_sigprocmask 305 SYSCALL 306 JAE 2(PC) 307 MOVL $0xf1, 0xf1 // crash 308 RET 309 310 // int32 runtime·kqueue(void); 311 TEXT runtime·kqueue(SB),NOSPLIT,$0 312 MOVQ $0, DI 313 MOVQ $0, SI 314 MOVQ $0, DX 315 MOVL $362, AX 316 SYSCALL 317 JCC 2(PC) 318 NEGQ AX 319 MOVL AX, ret+0(FP) 320 RET 321 322 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout); 323 TEXT runtime·kevent(SB),NOSPLIT,$0 324 MOVL kq+0(FP), DI 325 MOVQ ch+8(FP), SI 326 MOVL nch+16(FP), DX 327 MOVQ ev+24(FP), R10 328 MOVL nev+32(FP), R8 329 MOVQ ts+40(FP), R9 330 MOVL $363, AX 331 SYSCALL 332 JCC 2(PC) 333 NEGQ AX 334 MOVL AX, ret+48(FP) 335 RET 336 337 // void runtime·closeonexec(int32 fd); 338 TEXT runtime·closeonexec(SB),NOSPLIT,$0 339 MOVL fd+0(FP), DI // fd 340 MOVQ $2, SI // F_SETFD 341 MOVQ $1, DX // FD_CLOEXEC 342 MOVL $92, AX // fcntl 343 SYSCALL 344 RET