Text file src/runtime/sys_dragonfly_amd64.s
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 // func exitThread(wait *uint32)
68 TEXT runtime·exitThread(SB),NOSPLIT,$0-8
69 MOVQ wait+0(FP), AX
70 // We're done using the stack.
71 MOVL $0, (AX)
72 MOVL $0x10000, DI // arg 1 how - EXTEXIT_LWP
73 MOVL $0, SI // arg 2 status
74 MOVL $0, DX // arg 3 addr
75 MOVL $494, AX // extexit
76 SYSCALL
77 MOVL $0xf1, 0xf1 // crash
78 JMP 0(PC)
79
80 TEXT runtime·open(SB),NOSPLIT,$-8
81 MOVQ name+0(FP), DI // arg 1 pathname
82 MOVL mode+8(FP), SI // arg 2 flags
83 MOVL perm+12(FP), DX // arg 3 mode
84 MOVL $5, AX
85 SYSCALL
86 JCC 2(PC)
87 MOVL $-1, AX
88 MOVL AX, ret+16(FP)
89 RET
90
91 TEXT runtime·closefd(SB),NOSPLIT,$-8
92 MOVL fd+0(FP), DI // arg 1 fd
93 MOVL $6, AX
94 SYSCALL
95 JCC 2(PC)
96 MOVL $-1, AX
97 MOVL AX, ret+8(FP)
98 RET
99
100 TEXT runtime·read(SB),NOSPLIT,$-8
101 MOVL fd+0(FP), DI // arg 1 fd
102 MOVQ p+8(FP), SI // arg 2 buf
103 MOVL n+16(FP), DX // arg 3 count
104 MOVL $3, AX
105 SYSCALL
106 JCC 2(PC)
107 MOVL $-1, AX
108 MOVL AX, ret+24(FP)
109 RET
110
111 TEXT runtime·write(SB),NOSPLIT,$-8
112 MOVQ fd+0(FP), DI // arg 1 fd
113 MOVQ p+8(FP), SI // arg 2 buf
114 MOVL n+16(FP), DX // arg 3 count
115 MOVL $4, AX
116 SYSCALL
117 JCC 2(PC)
118 MOVL $-1, AX
119 MOVL AX, ret+24(FP)
120 RET
121
122 TEXT runtime·raise(SB),NOSPLIT,$16
123 MOVL $496, AX // lwp_gettid
124 SYSCALL
125 MOVQ $-1, DI // arg 1 - pid
126 MOVQ AX, SI // arg 2 - tid
127 MOVL sig+0(FP), DX // arg 3 - signum
128 MOVL $497, AX // lwp_kill
129 SYSCALL
130 RET
131
132 TEXT runtime·raiseproc(SB),NOSPLIT,$0
133 MOVL $20, AX // getpid
134 SYSCALL
135 MOVQ AX, DI // arg 1 - pid
136 MOVL sig+0(FP), SI // arg 2 - signum
137 MOVL $37, AX // kill
138 SYSCALL
139 RET
140
141 TEXT runtime·setitimer(SB), NOSPLIT, $-8
142 MOVL mode+0(FP), DI
143 MOVQ new+8(FP), SI
144 MOVQ old+16(FP), DX
145 MOVL $83, AX
146 SYSCALL
147 RET
148
149 // func walltime() (sec int64, nsec int32)
150 TEXT runtime·walltime(SB), NOSPLIT, $32
151 MOVL $232, AX // clock_gettime
152 MOVQ $0, DI // CLOCK_REALTIME
153 LEAQ 8(SP), SI
154 SYSCALL
155 MOVQ 8(SP), AX // sec
156 MOVQ 16(SP), DX // nsec
157
158 // sec is in AX, nsec in DX
159 MOVQ AX, sec+0(FP)
160 MOVL DX, nsec+8(FP)
161 RET
162
163 TEXT runtime·nanotime(SB), NOSPLIT, $32
164 MOVL $232, AX
165 MOVQ $4, DI // CLOCK_MONOTONIC
166 LEAQ 8(SP), SI
167 SYSCALL
168 MOVQ 8(SP), AX // sec
169 MOVQ 16(SP), DX // nsec
170
171 // sec is in AX, nsec in DX
172 // return nsec in AX
173 IMULQ $1000000000, AX
174 ADDQ DX, AX
175 MOVQ AX, ret+0(FP)
176 RET
177
178 TEXT runtime·sigaction(SB),NOSPLIT,$-8
179 MOVL sig+0(FP), DI // arg 1 sig
180 MOVQ new+8(FP), SI // arg 2 act
181 MOVQ old+16(FP), DX // arg 3 oact
182 MOVL $342, AX
183 SYSCALL
184 JCC 2(PC)
185 MOVL $0xf1, 0xf1 // crash
186 RET
187
188 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
189 MOVQ fn+0(FP), AX
190 MOVL sig+8(FP), DI
191 MOVQ info+16(FP), SI
192 MOVQ ctx+24(FP), DX
193 PUSHQ BP
194 MOVQ SP, BP
195 ANDQ $~15, SP // alignment for x86_64 ABI
196 CALL AX
197 MOVQ BP, SP
198 POPQ BP
199 RET
200
201 TEXT runtime·sigtramp(SB),NOSPLIT,$72
202 // Save callee-saved C registers, since the caller may be a C signal handler.
203 MOVQ BX, bx-8(SP)
204 MOVQ BP, bp-16(SP) // save in case GOEXPERIMENT=noframepointer is set
205 MOVQ R12, r12-24(SP)
206 MOVQ R13, r13-32(SP)
207 MOVQ R14, r14-40(SP)
208 MOVQ R15, r15-48(SP)
209 // We don't save mxcsr or the x87 control word because sigtrampgo doesn't
210 // modify them.
211
212 MOVQ DX, ctx-56(SP)
213 MOVQ SI, info-64(SP)
214 MOVQ DI, signum-72(SP)
215 CALL runtime·sigtrampgo(SB)
216
217 MOVQ r15-48(SP), R15
218 MOVQ r14-40(SP), R14
219 MOVQ r13-32(SP), R13
220 MOVQ r12-24(SP), R12
221 MOVQ bp-16(SP), BP
222 MOVQ bx-8(SP), BX
223 RET
224
225 TEXT runtime·mmap(SB),NOSPLIT,$0
226 MOVQ addr+0(FP), DI // arg 1 - addr
227 MOVQ n+8(FP), SI // arg 2 - len
228 MOVL prot+16(FP), DX // arg 3 - prot
229 MOVL flags+20(FP), R10 // arg 4 - flags
230 MOVL fd+24(FP), R8 // arg 5 - fd
231 MOVL off+28(FP), R9
232 SUBQ $16, SP
233 MOVQ R9, 8(SP) // arg 7 - offset (passed on stack)
234 MOVQ $0, R9 // arg 6 - pad
235 MOVL $197, AX
236 SYSCALL
237 JCC ok
238 ADDQ $16, SP
239 MOVQ $0, p+32(FP)
240 MOVQ AX, err+40(FP)
241 RET
242 ok:
243 ADDQ $16, SP
244 MOVQ AX, p+32(FP)
245 MOVQ $0, err+40(FP)
246 RET
247
248 TEXT runtime·munmap(SB),NOSPLIT,$0
249 MOVQ addr+0(FP), DI // arg 1 addr
250 MOVQ n+8(FP), SI // arg 2 len
251 MOVL $73, AX
252 SYSCALL
253 JCC 2(PC)
254 MOVL $0xf1, 0xf1 // crash
255 RET
256
257 TEXT runtime·madvise(SB),NOSPLIT,$0
258 MOVQ addr+0(FP), DI
259 MOVQ n+8(FP), SI
260 MOVL flags+16(FP), DX
261 MOVQ $75, AX // madvise
262 SYSCALL
263 JCC 2(PC)
264 MOVL $-1, AX
265 MOVL AX, ret+24(FP)
266 RET
267
268 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
269 MOVQ new+0(FP), DI
270 MOVQ old+8(FP), SI
271 MOVQ $53, AX
272 SYSCALL
273 JCC 2(PC)
274 MOVL $0xf1, 0xf1 // crash
275 RET
276
277 TEXT runtime·usleep(SB),NOSPLIT,$16
278 MOVL $0, DX
279 MOVL usec+0(FP), AX
280 MOVL $1000000, CX
281 DIVL CX
282 MOVQ AX, 0(SP) // tv_sec
283 MOVL $1000, AX
284 MULL DX
285 MOVQ AX, 8(SP) // tv_nsec
286
287 MOVQ SP, DI // arg 1 - rqtp
288 MOVQ $0, SI // arg 2 - rmtp
289 MOVL $240, AX // sys_nanosleep
290 SYSCALL
291 RET
292
293 // set tls base to DI
294 TEXT runtime·settls(SB),NOSPLIT,$16
295 ADDQ $8, DI // adjust for ELF: wants to use -8(FS) for g
296 MOVQ DI, 0(SP)
297 MOVQ $16, 8(SP)
298 MOVQ $0, DI // arg 1 - which
299 MOVQ SP, SI // arg 2 - tls_info
300 MOVQ $16, DX // arg 3 - infosize
301 MOVQ $472, AX // set_tls_area
302 SYSCALL
303 JCC 2(PC)
304 MOVL $0xf1, 0xf1 // crash
305 RET
306
307 TEXT runtime·sysctl(SB),NOSPLIT,$0
308 MOVQ mib+0(FP), DI // arg 1 - name
309 MOVL miblen+8(FP), SI // arg 2 - namelen
310 MOVQ out+16(FP), DX // arg 3 - oldp
311 MOVQ size+24(FP), R10 // arg 4 - oldlenp
312 MOVQ dst+32(FP), R8 // arg 5 - newp
313 MOVQ ndst+40(FP), R9 // arg 6 - newlen
314 MOVQ $202, AX // sys___sysctl
315 SYSCALL
316 JCC 4(PC)
317 NEGQ AX
318 MOVL AX, ret+48(FP)
319 RET
320 MOVL $0, AX
321 MOVL AX, ret+48(FP)
322 RET
323
324 TEXT runtime·osyield(SB),NOSPLIT,$-4
325 MOVL $331, AX // sys_sched_yield
326 SYSCALL
327 RET
328
329 TEXT runtime·sigprocmask(SB),NOSPLIT,$0
330 MOVL how+0(FP), DI // arg 1 - how
331 MOVQ new+8(FP), SI // arg 2 - set
332 MOVQ old+16(FP), DX // arg 3 - oset
333 MOVL $340, AX // sys_sigprocmask
334 SYSCALL
335 JAE 2(PC)
336 MOVL $0xf1, 0xf1 // crash
337 RET
338
339 // int32 runtime·kqueue(void);
340 TEXT runtime·kqueue(SB),NOSPLIT,$0
341 MOVQ $0, DI
342 MOVQ $0, SI
343 MOVQ $0, DX
344 MOVL $362, AX
345 SYSCALL
346 JCC 2(PC)
347 NEGQ AX
348 MOVL AX, ret+0(FP)
349 RET
350
351 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout);
352 TEXT runtime·kevent(SB),NOSPLIT,$0
353 MOVL kq+0(FP), DI
354 MOVQ ch+8(FP), SI
355 MOVL nch+16(FP), DX
356 MOVQ ev+24(FP), R10
357 MOVL nev+32(FP), R8
358 MOVQ ts+40(FP), R9
359 MOVL $363, AX
360 SYSCALL
361 JCC 2(PC)
362 NEGQ AX
363 MOVL AX, ret+48(FP)
364 RET
365
366 // void runtime·closeonexec(int32 fd);
367 TEXT runtime·closeonexec(SB),NOSPLIT,$0
368 MOVL fd+0(FP), DI // fd
369 MOVQ $2, SI // F_SETFD
370 MOVQ $1, DX // FD_CLOEXEC
371 MOVL $92, AX // fcntl
372 SYSCALL
373 RET
View as plain text