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