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