blob: aac741b7131f511665a651a5705087f0765b6860 [file] [log] [blame]
Rob Pike8e82a672008-06-30 11:50:36 -07001// 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
Russ Cox15ced2d2014-11-11 17:06:22 -05009#include "go_asm.h"
10#include "go_tls.h"
Russ Coxcb040d52014-09-04 23:05:18 -040011#include "textflag.h"
Russ Cox7343e032009-06-17 15:12:16 -070012
Russ Cox25f6b022014-08-27 11:32:17 -040013TEXT runtime·exit(SB),NOSPLIT,$0-4
14 MOVL code+0(FP), DI
Christopher Wedgwoodd166d162010-03-29 22:51:39 -070015 MOVL $231, AX // exitgroup - force all os threads to exit
Russ Coxd28acc42008-08-04 16:43:49 -070016 SYSCALL
17 RET
18
Russ Cox25f6b022014-08-27 11:32:17 -040019TEXT runtime·exit1(SB),NOSPLIT,$0-4
20 MOVL code+0(FP), DI
Russ Cox96824002008-08-05 14:18:47 -070021 MOVL $60, AX // exit - exit the current os thread
Rob Pike8e82a672008-06-30 11:50:36 -070022 SYSCALL
23 RET
24
Russ Cox25f6b022014-08-27 11:32:17 -040025TEXT runtime·open(SB),NOSPLIT,$0-20
26 MOVQ name+0(FP), DI
27 MOVL mode+8(FP), SI
28 MOVL perm+12(FP), DX
Rob Pike8e82a672008-06-30 11:50:36 -070029 MOVL $2, AX // syscall entry
30 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -040031 MOVL AX, ret+16(FP)
Rob Pike8e82a672008-06-30 11:50:36 -070032 RET
33
Russ Cox25f6b022014-08-27 11:32:17 -040034TEXT runtime·close(SB),NOSPLIT,$0-12
35 MOVL fd+0(FP), DI
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040036 MOVL $3, AX // syscall entry
37 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -040038 MOVL AX, ret+8(FP)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040039 RET
40
Russ Cox25f6b022014-08-27 11:32:17 -040041TEXT runtime·write(SB),NOSPLIT,$0-28
42 MOVQ fd+0(FP), DI
43 MOVQ p+8(FP), SI
44 MOVL n+16(FP), DX
Rob Pikecbdaa102008-07-15 08:27:50 -070045 MOVL $1, AX // syscall entry
46 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -040047 MOVL AX, ret+24(FP)
Rob Pikecbdaa102008-07-15 08:27:50 -070048 RET
49
Russ Cox25f6b022014-08-27 11:32:17 -040050TEXT runtime·read(SB),NOSPLIT,$0-28
51 MOVL fd+0(FP), DI
52 MOVQ p+8(FP), SI
53 MOVL n+16(FP), DX
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040054 MOVL $0, AX // syscall entry
55 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -040056 MOVL AX, ret+24(FP)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040057 RET
58
Russ Cox25f6b022014-08-27 11:32:17 -040059TEXT runtime·getrlimit(SB),NOSPLIT,$0-20
60 MOVL kind+0(FP), DI
61 MOVQ limit+8(FP), SI
Russ Cox102274a2012-02-24 15:28:51 -050062 MOVL $97, AX // syscall entry
63 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -040064 MOVL AX, ret+16(FP)
Russ Cox102274a2012-02-24 15:28:51 -050065 RET
66
Keith Randall0273dc12013-08-07 12:20:05 -070067TEXT runtime·usleep(SB),NOSPLIT,$16
Russ Coxd324f212011-09-30 09:40:01 -040068 MOVL $0, DX
69 MOVL usec+0(FP), AX
70 MOVL $1000000, CX
71 DIVL CX
72 MOVQ AX, 0(SP)
73 MOVQ DX, 8(SP)
74
75 // select(0, 0, 0, 0, &tv)
76 MOVL $0, DI
77 MOVL $0, SI
78 MOVL $0, DX
79 MOVL $0, R10
80 MOVQ SP, R8
81 MOVL $23, AX
82 SYSCALL
83 RET
84
Russ Cox4a000b92014-02-25 17:00:08 -050085TEXT runtime·raise(SB),NOSPLIT,$0
Russ Cox8698bb62011-04-25 16:58:00 -040086 MOVL $186, AX // syscall - gettid
87 SYSCALL
88 MOVL AX, DI // arg 1 tid
Russ Cox5146a932013-03-15 01:11:03 -040089 MOVL sig+0(FP), SI // arg 2
Russ Cox8698bb62011-04-25 16:58:00 -040090 MOVL $200, AX // syscall - tkill
91 SYSCALL
92 RET
93
Russ Cox5bfed7c2015-01-14 11:18:24 -050094TEXT runtime·raiseproc(SB),NOSPLIT,$0
95 MOVL $39, AX // syscall - getpid
96 SYSCALL
97 MOVL AX, DI // arg 1 pid
98 MOVL sig+0(FP), SI // arg 2
99 MOVL $62, AX // syscall - kill
100 SYSCALL
101 RET
102
Keith Randall0273dc12013-08-07 12:20:05 -0700103TEXT runtime·setitimer(SB),NOSPLIT,$0-24
Russ Cox25f6b022014-08-27 11:32:17 -0400104 MOVL mode+0(FP), DI
105 MOVQ new+8(FP), SI
106 MOVQ old+16(FP), DX
Russ Cox8dee8722011-03-23 11:31:42 -0400107 MOVL $38, AX // syscall entry
108 SYSCALL
109 RET
110
Russ Cox25f6b022014-08-27 11:32:17 -0400111TEXT runtime·mincore(SB),NOSPLIT,$0-28
112 MOVQ addr+0(FP), DI
113 MOVQ n+8(FP), SI
114 MOVQ dst+16(FP), DX
Jonathan Markddde52a2011-06-07 21:50:10 -0700115 MOVL $27, AX // syscall entry
116 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -0400117 MOVL AX, ret+24(FP)
Jonathan Markddde52a2011-06-07 21:50:10 -0700118 RET
119
Russ Coxefe3d352011-11-30 11:59:44 -0500120// func now() (sec int64, nsec int32)
Keith Randall0273dc12013-08-07 12:20:05 -0700121TEXT time·now(SB),NOSPLIT,$16
Shenghou Ma26377772012-11-27 01:42:01 +0800122 // Be careful. We're calling a function with gcc calling convention here.
123 // We're guaranteed 128 bytes on entry, and we've taken 16, and the
124 // call uses another 8.
125 // That leaves 104 for the gettime code to use. Hope that's enough!
Shenghou Ma4022fc42012-11-09 14:19:07 +0800126 MOVQ runtime·__vdso_clock_gettime_sym(SB), AX
127 CMPQ AX, $0
Russ Coxb55791e2014-10-28 21:50:16 -0400128 JEQ fallback
Shenghou Ma4022fc42012-11-09 14:19:07 +0800129 MOVL $0, DI // CLOCK_REALTIME
Shenghou Ma26377772012-11-27 01:42:01 +0800130 LEAQ 0(SP), SI
Shenghou Ma4022fc42012-11-09 14:19:07 +0800131 CALL AX
Shenghou Ma26377772012-11-27 01:42:01 +0800132 MOVQ 0(SP), AX // sec
133 MOVQ 8(SP), DX // nsec
Shenghou Ma4022fc42012-11-09 14:19:07 +0800134 MOVQ AX, sec+0(FP)
135 MOVL DX, nsec+8(FP)
136 RET
Russ Coxb55791e2014-10-28 21:50:16 -0400137fallback:
Shenghou Ma26377772012-11-27 01:42:01 +0800138 LEAQ 0(SP), DI
Russ Coxefe3d352011-11-30 11:59:44 -0500139 MOVQ $0, SI
Anthony Martin024a92c2012-11-07 18:29:31 -0800140 MOVQ runtime·__vdso_gettimeofday_sym(SB), AX
Russ Coxefe3d352011-11-30 11:59:44 -0500141 CALL AX
Shenghou Ma26377772012-11-27 01:42:01 +0800142 MOVQ 0(SP), AX // sec
143 MOVL 8(SP), DX // usec
Russ Coxefe3d352011-11-30 11:59:44 -0500144 IMULQ $1000, DX
Shenghou Ma4022fc42012-11-09 14:19:07 +0800145 MOVQ AX, sec+0(FP)
Russ Coxefe3d352011-11-30 11:59:44 -0500146 MOVL DX, nsec+8(FP)
147 RET
148
Keith Randall0273dc12013-08-07 12:20:05 -0700149TEXT runtime·nanotime(SB),NOSPLIT,$16
Shenghou Ma26377772012-11-27 01:42:01 +0800150 // Duplicate time.now here to avoid using up precious stack space.
151 // See comment above in time.now.
152 MOVQ runtime·__vdso_clock_gettime_sym(SB), AX
153 CMPQ AX, $0
Russ Coxb55791e2014-10-28 21:50:16 -0400154 JEQ fallback
Jay Weisskopf86c976f2014-02-24 10:57:46 -0500155 MOVL $1, DI // CLOCK_MONOTONIC
Shenghou Ma26377772012-11-27 01:42:01 +0800156 LEAQ 0(SP), SI
157 CALL AX
Shenghou Ma4022fc42012-11-09 14:19:07 +0800158 MOVQ 0(SP), AX // sec
Shenghou Ma26377772012-11-27 01:42:01 +0800159 MOVQ 8(SP), DX // nsec
160 // sec is in AX, nsec in DX
161 // return nsec in AX
162 IMULQ $1000000000, AX
163 ADDQ DX, AX
Russ Cox25f6b022014-08-27 11:32:17 -0400164 MOVQ AX, ret+0(FP)
Shenghou Ma26377772012-11-27 01:42:01 +0800165 RET
Russ Coxb55791e2014-10-28 21:50:16 -0400166fallback:
Shenghou Ma26377772012-11-27 01:42:01 +0800167 LEAQ 0(SP), DI
168 MOVQ $0, SI
169 MOVQ runtime·__vdso_gettimeofday_sym(SB), AX
170 CALL AX
171 MOVQ 0(SP), AX // sec
172 MOVL 8(SP), DX // usec
173 IMULQ $1000, DX
174 // sec is in AX, nsec in DX
Russ Coxf4373312011-11-03 17:35:28 -0400175 // return nsec in AX
176 IMULQ $1000000000, AX
Russ Coxf4373312011-11-03 17:35:28 -0400177 ADDQ DX, AX
Russ Cox25f6b022014-08-27 11:32:17 -0400178 MOVQ AX, ret+0(FP)
Russ Coxe4f06812010-02-08 14:32:22 -0800179 RET
180
Russ Cox25f6b022014-08-27 11:32:17 -0400181TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0-28
182 MOVL sig+0(FP), DI
183 MOVQ new+8(FP), SI
184 MOVQ old+16(FP), DX
185 MOVL size+24(FP), R10
Russ Cox240b1d52012-02-23 14:43:58 -0500186 MOVL $14, AX // syscall entry
187 SYSCALL
188 CMPQ AX, $0xfffffffffffff001
189 JLS 2(PC)
Russ Cox36aa7d42012-03-08 14:03:56 -0500190 MOVL $0xf1, 0xf1 // crash
Russ Cox240b1d52012-02-23 14:43:58 -0500191 RET
192
Russ Cox25f6b022014-08-27 11:32:17 -0400193TEXT runtime·rt_sigaction(SB),NOSPLIT,$0-36
194 MOVQ sig+0(FP), DI
195 MOVQ new+8(FP), SI
196 MOVQ old+16(FP), DX
197 MOVQ size+24(FP), R10
Rob Pike8e82a672008-06-30 11:50:36 -0700198 MOVL $13, AX // syscall entry
199 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -0400200 MOVL AX, ret+32(FP)
Rob Pike8e82a672008-06-30 11:50:36 -0700201 RET
202
Keith Randall0273dc12013-08-07 12:20:05 -0700203TEXT runtime·sigtramp(SB),NOSPLIT,$64
Russ Coxe473f422010-08-04 17:50:22 -0700204 get_tls(BX)
205
Russ Cox89f185f2014-06-26 11:54:39 -0400206 // check that g exists
207 MOVQ g(BX), R10
208 CMPQ R10, $0
Shenghou Ma2f1ead72013-07-12 04:39:39 +0800209 JNE 5(PC)
Alan Donovan532dee32012-09-04 14:40:49 -0400210 MOVQ DI, 0(SP)
Shenghou Ma2f1ead72013-07-12 04:39:39 +0800211 MOVQ $runtime·badsignal(SB), AX
212 CALL AX
Alan Donovan532dee32012-09-04 14:40:49 -0400213 RET
Russ Coxb2369112012-03-12 15:55:18 -0400214
Russ Coxe473f422010-08-04 17:50:22 -0700215 // save g
Russ Cox690291a2011-02-23 14:47:42 -0500216 MOVQ R10, 40(SP)
Russ Coxe473f422010-08-04 17:50:22 -0700217
218 // g = m->gsignal
Austin Clements20a6ff72015-01-27 18:29:02 -0500219 MOVQ g_m(R10), AX
220 MOVQ m_gsignal(AX), AX
221 MOVQ AX, g(BX)
Russ Coxe473f422010-08-04 17:50:22 -0700222
Russ Cox7343e032009-06-17 15:12:16 -0700223 MOVQ DI, 0(SP)
224 MOVQ SI, 8(SP)
225 MOVQ DX, 16(SP)
Russ Cox690291a2011-02-23 14:47:42 -0500226 MOVQ R10, 24(SP)
227
Russ Cox68b42552010-11-04 14:00:19 -0400228 CALL runtime·sighandler(SB)
Russ Coxe473f422010-08-04 17:50:22 -0700229
230 // restore g
231 get_tls(BX)
Russ Cox690291a2011-02-23 14:47:42 -0500232 MOVQ 40(SP), R10
233 MOVQ R10, g(BX)
Rob Pike8e82a672008-06-30 11:50:36 -0700234 RET
235
Keith Randall0273dc12013-08-07 12:20:05 -0700236TEXT runtime·sigreturn(SB),NOSPLIT,$0
Russ Coxdfa58932008-12-03 14:21:28 -0800237 MOVL $15, AX // rt_sigreturn
238 SYSCALL
239 INT $3 // not reached
240
Keith Randall0273dc12013-08-07 12:20:05 -0700241TEXT runtime·mmap(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400242 MOVQ addr+0(FP), DI
243 MOVQ n+8(FP), SI
244 MOVL prot+16(FP), DX
245 MOVL flags+20(FP), R10
246 MOVL fd+24(FP), R8
247 MOVL off+28(FP), R9
Rob Pike8e82a672008-06-30 11:50:36 -0700248
Russ Coxd4cc5572010-09-07 09:57:22 -0400249 MOVL $9, AX // mmap
Rob Pike8e82a672008-06-30 11:50:36 -0700250 SYSCALL
251 CMPQ AX, $0xfffffffffffff001
Adam Langley3f7a3242009-11-13 10:08:51 -0800252 JLS 3(PC)
253 NOTQ AX
254 INCQ AX
Russ Cox25f6b022014-08-27 11:32:17 -0400255 MOVQ AX, ret+32(FP)
Rob Pike8e82a672008-06-30 11:50:36 -0700256 RET
257
Keith Randall0273dc12013-08-07 12:20:05 -0700258TEXT runtime·munmap(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400259 MOVQ addr+0(FP), DI
260 MOVQ n+8(FP), SI
Russ Coxd4cc5572010-09-07 09:57:22 -0400261 MOVQ $11, AX // munmap
262 SYSCALL
263 CMPQ AX, $0xfffffffffffff001
264 JLS 2(PC)
Russ Cox36aa7d42012-03-08 14:03:56 -0500265 MOVL $0xf1, 0xf1 // crash
Russ Coxd4cc5572010-09-07 09:57:22 -0400266 RET
267
Keith Randall0273dc12013-08-07 12:20:05 -0700268TEXT runtime·madvise(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400269 MOVQ addr+0(FP), DI
270 MOVQ n+8(FP), SI
271 MOVL flags+16(FP), DX
Sébastien Paolaccie6f5a902011-12-12 16:33:13 -0500272 MOVQ $28, AX // madvise
273 SYSCALL
Russ Cox295a4d82012-12-22 15:06:28 -0500274 // ignore failure - maybe pages are locked
Rob Pike8e82a672008-06-30 11:50:36 -0700275 RET
276
Russ Cox96824002008-08-05 14:18:47 -0700277// int64 futex(int32 *uaddr, int32 op, int32 val,
Russ Coxd28acc42008-08-04 16:43:49 -0700278// struct timespec *timeout, int32 *uaddr2, int32 val2);
Keith Randall0273dc12013-08-07 12:20:05 -0700279TEXT runtime·futex(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400280 MOVQ addr+0(FP), DI
281 MOVL op+8(FP), SI
282 MOVL val+12(FP), DX
283 MOVQ ts+16(FP), R10
284 MOVQ addr2+24(FP), R8
285 MOVL val3+32(FP), R9
Russ Coxd28acc42008-08-04 16:43:49 -0700286 MOVL $202, AX
287 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -0400288 MOVL AX, ret+40(FP)
Russ Coxd28acc42008-08-04 16:43:49 -0700289 RET
290
Russ Cox25f6b022014-08-27 11:32:17 -0400291// int32 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void));
Keith Randall0273dc12013-08-07 12:20:05 -0700292TEXT runtime·clone(SB),NOSPLIT,$0
Russ Cox96824002008-08-05 14:18:47 -0700293 MOVL flags+8(SP), DI
294 MOVQ stack+16(SP), SI
Russ Coxf7f63292008-08-05 14:21:42 -0700295
Jingcheng Zhang70e967b2012-12-19 00:30:29 +0800296 // Copy mp, gp, fn off parent stack for use by child.
Russ Coxd28acc42008-08-04 16:43:49 -0700297 // Careful: Linux system call clobbers CX and R11.
Russ Cox7343e032009-06-17 15:12:16 -0700298 MOVQ mm+24(SP), R8
299 MOVQ gg+32(SP), R9
Russ Cox96824002008-08-05 14:18:47 -0700300 MOVQ fn+40(SP), R12
Russ Coxd28acc42008-08-04 16:43:49 -0700301
302 MOVL $56, AX
303 SYSCALL
304
305 // In parent, return.
306 CMPQ AX, $0
Russ Cox25f6b022014-08-27 11:32:17 -0400307 JEQ 3(PC)
308 MOVL AX, ret+40(FP)
Russ Coxd28acc42008-08-04 16:43:49 -0700309 RET
Russ Coxd324f212011-09-30 09:40:01 -0400310
Russ Coxe473f422010-08-04 17:50:22 -0700311 // In child, on new stack.
Russ Coxd28acc42008-08-04 16:43:49 -0700312 MOVQ SI, SP
Russ Coxd324f212011-09-30 09:40:01 -0400313
Russ Cox376898c2008-09-09 11:50:14 -0700314 // Initialize m->procid to Linux tid
315 MOVL $186, AX // gettid
316 SYSCALL
Russ Coxe473f422010-08-04 17:50:22 -0700317 MOVQ AX, m_procid(R8)
318
319 // Set FS to point at m->tls.
320 LEAQ m_tls(R8), DI
Russ Cox68b42552010-11-04 14:00:19 -0400321 CALL runtime·settls(SB)
Russ Coxe473f422010-08-04 17:50:22 -0700322
323 // In child, set up new stack
324 get_tls(CX)
Russ Cox89f185f2014-06-26 11:54:39 -0400325 MOVQ R8, g_m(R9)
Russ Coxe473f422010-08-04 17:50:22 -0700326 MOVQ R9, g(CX)
Russ Cox68b42552010-11-04 14:00:19 -0400327 CALL runtime·stackcheck(SB)
Russ Cox36096242009-01-16 14:58:14 -0800328
Russ Cox376898c2008-09-09 11:50:14 -0700329 // Call fn
Russ Coxd28acc42008-08-04 16:43:49 -0700330 CALL R12
Russ Coxf7f63292008-08-05 14:21:42 -0700331
Christopher Wedgwoodd166d162010-03-29 22:51:39 -0700332 // It shouldn't return. If it does, exit
Russ Coxd28acc42008-08-04 16:43:49 -0700333 MOVL $111, DI
334 MOVL $60, AX
335 SYSCALL
336 JMP -3(PC) // keep exiting
337
Keith Randall0273dc12013-08-07 12:20:05 -0700338TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
Russ Coxa67258f2008-09-18 15:56:46 -0700339 MOVQ new+8(SP), DI
340 MOVQ old+16(SP), SI
341 MOVQ $131, AX
342 SYSCALL
343 CMPQ AX, $0xfffffffffffff001
344 JLS 2(PC)
Russ Cox36aa7d42012-03-08 14:03:56 -0500345 MOVL $0xf1, 0xf1 // crash
Russ Coxa67258f2008-09-18 15:56:46 -0700346 RET
Russ Coxe473f422010-08-04 17:50:22 -0700347
348// set tls base to DI
Keith Randall0273dc12013-08-07 12:20:05 -0700349TEXT runtime·settls(SB),NOSPLIT,$32
Russ Coxe473f422010-08-04 17:50:22 -0700350 ADDQ $16, DI // ELF wants to use -16(FS), -8(FS)
351
352 MOVQ DI, SI
353 MOVQ $0x1002, DI // ARCH_SET_FS
354 MOVQ $158, AX // arch_prctl
355 SYSCALL
356 CMPQ AX, $0xfffffffffffff001
357 JLS 2(PC)
Russ Cox36aa7d42012-03-08 14:03:56 -0500358 MOVL $0xf1, 0xf1 // crash
Russ Coxe473f422010-08-04 17:50:22 -0700359 RET
360
Keith Randall0273dc12013-08-07 12:20:05 -0700361TEXT runtime·osyield(SB),NOSPLIT,$0
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -0400362 MOVL $24, AX
363 SYSCALL
364 RET
Shenghou Ma4f308ed2012-08-10 10:05:26 +0800365
Keith Randall0273dc12013-08-07 12:20:05 -0700366TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400367 MOVQ pid+0(FP), DI
368 MOVQ len+8(FP), SI
369 MOVQ buf+16(FP), DX
Shenghou Ma4f308ed2012-08-10 10:05:26 +0800370 MOVL $204, AX // syscall entry
371 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -0400372 MOVL AX, ret+24(FP)
Shenghou Ma4f308ed2012-08-10 10:05:26 +0800373 RET
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400374
375// int32 runtime·epollcreate(int32 size);
Keith Randall0273dc12013-08-07 12:20:05 -0700376TEXT runtime·epollcreate(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400377 MOVL size+0(FP), DI
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400378 MOVL $213, AX // syscall entry
379 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -0400380 MOVL AX, ret+8(FP)
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400381 RET
382
383// int32 runtime·epollcreate1(int32 flags);
Keith Randall0273dc12013-08-07 12:20:05 -0700384TEXT runtime·epollcreate1(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400385 MOVL flags+0(FP), DI
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400386 MOVL $291, AX // syscall entry
387 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -0400388 MOVL AX, ret+8(FP)
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400389 RET
390
Dmitriy Vyukov91a670d2014-09-04 10:04:04 +0400391// func epollctl(epfd, op, fd int32, ev *epollEvent) int
Keith Randall0273dc12013-08-07 12:20:05 -0700392TEXT runtime·epollctl(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400393 MOVL epfd+0(FP), DI
394 MOVL op+4(FP), SI
395 MOVL fd+8(FP), DX
396 MOVQ ev+16(FP), R10
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400397 MOVL $233, AX // syscall entry
398 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -0400399 MOVL AX, ret+24(FP)
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400400 RET
401
402// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
Keith Randall0273dc12013-08-07 12:20:05 -0700403TEXT runtime·epollwait(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400404 MOVL epfd+0(FP), DI
405 MOVQ ev+8(FP), SI
406 MOVL nev+16(FP), DX
407 MOVL timeout+20(FP), R10
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400408 MOVL $232, AX // syscall entry
409 SYSCALL
Russ Cox25f6b022014-08-27 11:32:17 -0400410 MOVL AX, ret+24(FP)
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400411 RET
412
413// void runtime·closeonexec(int32 fd);
Keith Randall0273dc12013-08-07 12:20:05 -0700414TEXT runtime·closeonexec(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400415 MOVL fd+0(FP), DI // fd
Dmitriy Vyukov49e03002013-03-14 19:06:35 +0400416 MOVQ $2, SI // F_SETFD
417 MOVQ $1, DX // FD_CLOEXEC
418 MOVL $72, AX // fcntl
419 SYSCALL
420 RET