github.com/c0deoo1/golang1.5@v0.0.0-20220525150107-c87c805d4593/src/runtime/sys_linux_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 // 6 // System calls and other sys.stuff for AMD64, Linux 7 // 8 9 #include "go_asm.h" 10 #include "go_tls.h" 11 #include "textflag.h" 12 13 TEXT runtime·exit(SB),NOSPLIT,$0-4 14 MOVL code+0(FP), DI 15 MOVL $231, AX // exitgroup - force all os threads to exit 16 SYSCALL 17 RET 18 19 TEXT runtime·exit1(SB),NOSPLIT,$0-4 20 MOVL code+0(FP), DI 21 MOVL $60, AX // exit - exit the current os thread 22 SYSCALL 23 RET 24 25 TEXT runtime·open(SB),NOSPLIT,$0-20 26 MOVQ name+0(FP), DI 27 MOVL mode+8(FP), SI 28 MOVL perm+12(FP), DX 29 MOVL $2, AX // syscall entry 30 SYSCALL 31 CMPQ AX, $0xfffffffffffff001 32 JLS 2(PC) 33 MOVL $-1, AX 34 MOVL AX, ret+16(FP) 35 RET 36 37 TEXT runtime·closefd(SB),NOSPLIT,$0-12 38 MOVL fd+0(FP), DI 39 MOVL $3, AX // syscall entry 40 SYSCALL 41 CMPQ AX, $0xfffffffffffff001 42 JLS 2(PC) 43 MOVL $-1, AX 44 MOVL AX, ret+8(FP) 45 RET 46 47 TEXT runtime·write(SB),NOSPLIT,$0-28 48 MOVQ fd+0(FP), DI 49 MOVQ p+8(FP), SI 50 MOVL n+16(FP), DX 51 MOVL $1, AX // syscall entry 52 SYSCALL 53 CMPQ AX, $0xfffffffffffff001 54 JLS 2(PC) 55 MOVL $-1, AX 56 MOVL AX, ret+24(FP) 57 RET 58 59 TEXT runtime·read(SB),NOSPLIT,$0-28 60 MOVL fd+0(FP), DI 61 MOVQ p+8(FP), SI 62 MOVL n+16(FP), DX 63 MOVL $0, AX // syscall entry 64 SYSCALL 65 CMPQ AX, $0xfffffffffffff001 66 JLS 2(PC) 67 MOVL $-1, AX 68 MOVL AX, ret+24(FP) 69 RET 70 71 TEXT runtime·getrlimit(SB),NOSPLIT,$0-20 72 MOVL kind+0(FP), DI 73 MOVQ limit+8(FP), SI 74 MOVL $97, AX // syscall entry 75 SYSCALL 76 MOVL AX, ret+16(FP) 77 RET 78 79 TEXT runtime·usleep(SB),NOSPLIT,$16 80 MOVL $0, DX 81 MOVL usec+0(FP), AX 82 MOVL $1000000, CX 83 DIVL CX 84 MOVQ AX, 0(SP) 85 MOVQ DX, 8(SP) 86 87 // select(0, 0, 0, 0, &tv) 88 MOVL $0, DI 89 MOVL $0, SI 90 MOVL $0, DX 91 MOVL $0, R10 92 MOVQ SP, R8 93 MOVL $23, AX 94 SYSCALL 95 RET 96 97 TEXT runtime·gettid(SB),NOSPLIT,$0-4 98 MOVL $186, AX // syscall - gettid 99 SYSCALL 100 MOVL AX, ret+0(FP) 101 RET 102 103 TEXT runtime·raise(SB),NOSPLIT,$0 104 MOVL $186, AX // syscall - gettid 105 SYSCALL 106 MOVL AX, DI // arg 1 tid 107 MOVL sig+0(FP), SI // arg 2 108 MOVL $200, AX // syscall - tkill 109 SYSCALL 110 RET 111 112 TEXT runtime·raiseproc(SB),NOSPLIT,$0 113 MOVL $39, AX // syscall - getpid 114 SYSCALL 115 MOVL AX, DI // arg 1 pid 116 MOVL sig+0(FP), SI // arg 2 117 MOVL $62, AX // syscall - kill 118 SYSCALL 119 RET 120 121 TEXT runtime·setitimer(SB),NOSPLIT,$0-24 122 MOVL mode+0(FP), DI 123 MOVQ new+8(FP), SI 124 MOVQ old+16(FP), DX 125 MOVL $38, AX // syscall entry 126 SYSCALL 127 RET 128 129 TEXT runtime·mincore(SB),NOSPLIT,$0-28 130 MOVQ addr+0(FP), DI 131 MOVQ n+8(FP), SI 132 MOVQ dst+16(FP), DX 133 MOVL $27, AX // syscall entry 134 SYSCALL 135 MOVL AX, ret+24(FP) 136 RET 137 138 // func now() (sec int64, nsec int32) 139 // time.now的高效实现,通过vDSO来调用 140 TEXT time·now(SB),NOSPLIT,$16 141 // Be careful. We're calling a function with gcc calling convention here. 142 // We're guaranteed 128 bytes on entry, and we've taken 16, and the 143 // call uses another 8. 144 // That leaves 104 for the gettime code to use. Hope that's enough! 145 MOVQ runtime·__vdso_clock_gettime_sym(SB), AX 146 CMPQ AX, $0 147 JEQ fallback 148 MOVL $0, DI // CLOCK_REALTIME 149 LEAQ 0(SP), SI 150 CALL AX 151 MOVQ 0(SP), AX // sec 152 MOVQ 8(SP), DX // nsec 153 MOVQ AX, sec+0(FP) 154 MOVL DX, nsec+8(FP) 155 RET 156 fallback: 157 LEAQ 0(SP), DI 158 MOVQ $0, SI 159 MOVQ runtime·__vdso_gettimeofday_sym(SB), AX 160 CALL AX 161 MOVQ 0(SP), AX // sec 162 MOVL 8(SP), DX // usec 163 IMULQ $1000, DX 164 MOVQ AX, sec+0(FP) 165 MOVL DX, nsec+8(FP) 166 RET 167 168 TEXT runtime·nanotime(SB),NOSPLIT,$16 169 // Duplicate time.now here to avoid using up precious stack space. 170 // See comment above in time.now. 171 MOVQ runtime·__vdso_clock_gettime_sym(SB), AX 172 CMPQ AX, $0 173 JEQ fallback 174 MOVL $1, DI // CLOCK_MONOTONIC 175 LEAQ 0(SP), SI 176 CALL AX 177 MOVQ 0(SP), AX // sec 178 MOVQ 8(SP), DX // nsec 179 // sec is in AX, nsec in DX 180 // return nsec in AX 181 IMULQ $1000000000, AX 182 ADDQ DX, AX 183 MOVQ AX, ret+0(FP) 184 RET 185 fallback: 186 LEAQ 0(SP), DI 187 MOVQ $0, SI 188 MOVQ runtime·__vdso_gettimeofday_sym(SB), AX 189 CALL AX 190 MOVQ 0(SP), AX // sec 191 MOVL 8(SP), DX // usec 192 IMULQ $1000, DX 193 // sec is in AX, nsec in DX 194 // return nsec in AX 195 IMULQ $1000000000, AX 196 ADDQ DX, AX 197 MOVQ AX, ret+0(FP) 198 RET 199 200 TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0-28 201 MOVL sig+0(FP), DI 202 MOVQ new+8(FP), SI 203 MOVQ old+16(FP), DX 204 MOVL size+24(FP), R10 205 MOVL $14, AX // syscall entry 206 SYSCALL 207 CMPQ AX, $0xfffffffffffff001 208 JLS 2(PC) 209 MOVL $0xf1, 0xf1 // crash 210 RET 211 212 TEXT runtime·rt_sigaction(SB),NOSPLIT,$0-36 213 MOVQ sig+0(FP), DI 214 MOVQ new+8(FP), SI 215 MOVQ old+16(FP), DX 216 MOVQ size+24(FP), R10 217 MOVL $13, AX // syscall entry 218 SYSCALL 219 MOVL AX, ret+32(FP) 220 RET 221 222 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 223 MOVL sig+8(FP), DI 224 MOVQ info+16(FP), SI 225 MOVQ ctx+24(FP), DX 226 MOVQ fn+0(FP), AX 227 CALL AX 228 RET 229 230 TEXT runtime·sigtramp(SB),NOSPLIT,$24 231 MOVQ DI, 0(SP) // signum 232 MOVQ SI, 8(SP) // info 233 MOVQ DX, 16(SP) // ctx 234 MOVQ $runtime·sigtrampgo(SB), AX 235 CALL AX 236 RET 237 238 TEXT runtime·sigreturn(SB),NOSPLIT,$0 239 MOVL $15, AX // rt_sigreturn 240 SYSCALL 241 INT $3 // not reached 242 243 TEXT runtime·mmap(SB),NOSPLIT,$0 244 MOVQ addr+0(FP), DI 245 MOVQ n+8(FP), SI 246 MOVL prot+16(FP), DX 247 MOVL flags+20(FP), R10 248 MOVL fd+24(FP), R8 249 MOVL off+28(FP), R9 250 251 MOVL $9, AX // mmap 252 SYSCALL 253 CMPQ AX, $0xfffffffffffff001 254 JLS 3(PC) 255 NOTQ AX 256 INCQ AX 257 MOVQ AX, ret+32(FP) 258 RET 259 260 TEXT runtime·munmap(SB),NOSPLIT,$0 261 MOVQ addr+0(FP), DI 262 MOVQ n+8(FP), SI 263 MOVQ $11, AX // munmap 264 SYSCALL 265 CMPQ AX, $0xfffffffffffff001 266 JLS 2(PC) 267 MOVL $0xf1, 0xf1 // crash 268 RET 269 270 TEXT runtime·madvise(SB),NOSPLIT,$0 271 MOVQ addr+0(FP), DI 272 MOVQ n+8(FP), SI 273 MOVL flags+16(FP), DX 274 MOVQ $28, AX // madvise 275 SYSCALL 276 // ignore failure - maybe pages are locked 277 RET 278 279 // int64 futex(int32 *uaddr, int32 op, int32 val, 280 // struct timespec *timeout, int32 *uaddr2, int32 val2); 281 TEXT runtime·futex(SB),NOSPLIT,$0 282 MOVQ addr+0(FP), DI 283 MOVL op+8(FP), SI 284 MOVL val+12(FP), DX 285 MOVQ ts+16(FP), R10 286 MOVQ addr2+24(FP), R8 287 MOVL val3+32(FP), R9 288 MOVL $202, AX 289 SYSCALL 290 MOVL AX, ret+40(FP) 291 RET 292 293 // int32 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void)); 294 TEXT runtime·clone(SB),NOSPLIT,$0 295 MOVL flags+0(FP), DI 296 MOVQ stack+8(FP), SI 297 MOVQ $0, DX 298 MOVQ $0, R10 299 300 // Copy mp, gp, fn off parent stack for use by child. 301 // Careful: Linux system call clobbers CX and R11. 302 MOVQ mp+16(FP), R8 303 MOVQ gp+24(FP), R9 304 MOVQ fn+32(FP), R12 305 306 MOVL $56, AX 307 SYSCALL 308 309 // In parent, return. 310 CMPQ AX, $0 311 JEQ 3(PC) 312 MOVL AX, ret+40(FP) 313 RET 314 315 // In child, on new stack. 316 MOVQ SI, SP 317 318 // If g or m are nil, skip Go-related setup. 319 CMPQ R8, $0 // m 320 JEQ nog 321 CMPQ R9, $0 // g 322 JEQ nog 323 324 // Initialize m->procid to Linux tid 325 MOVL $186, AX // gettid 326 SYSCALL 327 MOVQ AX, m_procid(R8) 328 329 // Set FS to point at m->tls. 330 LEAQ m_tls(R8), DI 331 CALL runtime·settls(SB) 332 333 // In child, set up new stack 334 get_tls(CX) 335 MOVQ R8, g_m(R9) 336 MOVQ R9, g(CX) 337 CALL runtime·stackcheck(SB) 338 339 nog: 340 // Call fn 341 CALL R12 342 343 // It shouldn't return. If it does, exit that thread. 344 MOVL $111, DI 345 MOVL $60, AX 346 SYSCALL 347 JMP -3(PC) // keep exiting 348 349 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 350 MOVQ new+8(SP), DI 351 MOVQ old+16(SP), SI 352 MOVQ $131, AX 353 SYSCALL 354 CMPQ AX, $0xfffffffffffff001 355 JLS 2(PC) 356 MOVL $0xf1, 0xf1 // crash 357 RET 358 359 // set tls base to DI 360 TEXT runtime·settls(SB),NOSPLIT,$32 361 ADDQ $8, DI // ELF wants to use -8(FS) 362 363 MOVQ DI, SI 364 MOVQ $0x1002, DI // ARCH_SET_FS 365 MOVQ $158, AX // arch_prctl 366 SYSCALL 367 CMPQ AX, $0xfffffffffffff001 368 JLS 2(PC) 369 MOVL $0xf1, 0xf1 // crash 370 RET 371 372 TEXT runtime·osyield(SB),NOSPLIT,$0 373 MOVL $24, AX 374 SYSCALL 375 RET 376 377 TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 378 MOVQ pid+0(FP), DI 379 MOVQ len+8(FP), SI 380 MOVQ buf+16(FP), DX 381 MOVL $204, AX // syscall entry 382 SYSCALL 383 MOVL AX, ret+24(FP) 384 RET 385 386 // int32 runtime·epollcreate(int32 size); 387 TEXT runtime·epollcreate(SB),NOSPLIT,$0 388 MOVL size+0(FP), DI 389 MOVL $213, AX // syscall entry 390 SYSCALL 391 MOVL AX, ret+8(FP) 392 RET 393 394 // int32 runtime·epollcreate1(int32 flags); 395 TEXT runtime·epollcreate1(SB),NOSPLIT,$0 396 MOVL flags+0(FP), DI 397 MOVL $291, AX // syscall entry 398 SYSCALL 399 MOVL AX, ret+8(FP) 400 RET 401 402 // func epollctl(epfd, op, fd int32, ev *epollEvent) int 403 TEXT runtime·epollctl(SB),NOSPLIT,$0 404 MOVL epfd+0(FP), DI 405 MOVL op+4(FP), SI 406 MOVL fd+8(FP), DX 407 MOVQ ev+16(FP), R10 408 MOVL $233, AX // syscall entry 409 SYSCALL 410 MOVL AX, ret+24(FP) 411 RET 412 413 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout); 414 TEXT runtime·epollwait(SB),NOSPLIT,$0 415 MOVL epfd+0(FP), DI 416 MOVQ ev+8(FP), SI 417 MOVL nev+16(FP), DX 418 MOVL timeout+20(FP), R10 419 MOVL $232, AX // syscall entry 420 SYSCALL 421 MOVL AX, ret+24(FP) 422 RET 423 424 // void runtime·closeonexec(int32 fd); 425 TEXT runtime·closeonexec(SB),NOSPLIT,$0 426 MOVL fd+0(FP), DI // fd 427 MOVQ $2, SI // F_SETFD 428 MOVQ $1, DX // FD_CLOEXEC 429 MOVL $72, AX // fcntl 430 SYSCALL 431 RET