Text file
src/runtime/sys_dragonfly_amd64.s
Documentation: runtime
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 #include "cgo/abi_amd64.h"
13
14 TEXT runtime·sys_umtx_sleep(SB),NOSPLIT,$0
15 MOVQ addr+0(FP), DI // arg 1 - ptr
16 MOVL val+8(FP), SI // arg 2 - value
17 MOVL timeout+12(FP), DX // arg 3 - timeout
18 MOVL $469, AX // umtx_sleep
19 SYSCALL
20 JCC 2(PC)
21 NEGQ AX
22 MOVL AX, ret+16(FP)
23 RET
24
25 TEXT runtime·sys_umtx_wakeup(SB),NOSPLIT,$0
26 MOVQ addr+0(FP), DI // arg 1 - ptr
27 MOVL val+8(FP), SI // arg 2 - count
28 MOVL $470, AX // umtx_wakeup
29 SYSCALL
30 JCC 2(PC)
31 NEGQ AX
32 MOVL AX, ret+16(FP)
33 RET
34
35 TEXT runtime·lwp_create(SB),NOSPLIT,$0
36 MOVQ param+0(FP), DI // arg 1 - params
37 MOVL $495, AX // lwp_create
38 SYSCALL
39 MOVL AX, ret+8(FP)
40 RET
41
42 TEXT runtime·lwp_start(SB),NOSPLIT,$0
43 MOVQ DI, R13 // m
44
45 // set up FS to point at m->tls
46 LEAQ m_tls(R13), DI
47 CALL runtime·settls(SB) // smashes DI
48
49 // set up m, g
50 get_tls(CX)
51 MOVQ m_g0(R13), DI
52 MOVQ R13, g_m(DI)
53 MOVQ DI, g(CX)
54
55 CALL runtime·stackcheck(SB)
56 CALL runtime·mstart(SB)
57
58 MOVQ 0, AX // crash (not reached)
59
60 // Exit the entire program (like C exit)
61 TEXT runtime·exit(SB),NOSPLIT,$-8
62 MOVL code+0(FP), DI // arg 1 exit status
63 MOVL $1, AX
64 SYSCALL
65 MOVL $0xf1, 0xf1 // crash
66 RET
67
68 // func exitThread(wait *uint32)
69 TEXT runtime·exitThread(SB),NOSPLIT,$0-8
70 MOVQ wait+0(FP), AX
71 // We're done using the stack.
72 MOVL $0, (AX)
73 MOVL $0x10000, DI // arg 1 how - EXTEXIT_LWP
74 MOVL $0, SI // arg 2 status
75 MOVL $0, DX // arg 3 addr
76 MOVL $494, AX // extexit
77 SYSCALL
78 MOVL $0xf1, 0xf1 // crash
79 JMP 0(PC)
80
81 TEXT runtime·open(SB),NOSPLIT,$-8
82 MOVQ name+0(FP), DI // arg 1 pathname
83 MOVL mode+8(FP), SI // arg 2 flags
84 MOVL perm+12(FP), DX // arg 3 mode
85 MOVL $5, AX
86 SYSCALL
87 JCC 2(PC)
88 MOVL $-1, AX
89 MOVL AX, ret+16(FP)
90 RET
91
92 TEXT runtime·closefd(SB),NOSPLIT,$-8
93 MOVL fd+0(FP), DI // arg 1 fd
94 MOVL $6, AX
95 SYSCALL
96 JCC 2(PC)
97 MOVL $-1, AX
98 MOVL AX, ret+8(FP)
99 RET
100
101 TEXT runtime·read(SB),NOSPLIT,$-8
102 MOVL fd+0(FP), DI // arg 1 fd
103 MOVQ p+8(FP), SI // arg 2 buf
104 MOVL n+16(FP), DX // arg 3 count
105 MOVL $3, AX
106 SYSCALL
107 JCC 2(PC)
108 NEGL AX // caller expects negative errno
109 MOVL AX, ret+24(FP)
110 RET
111
112 // func pipe() (r, w int32, errno int32)
113 TEXT runtime·pipe(SB),NOSPLIT,$0-12
114 MOVL $42, AX
115 SYSCALL
116 JCC pipeok
117 MOVL $-1,r+0(FP)
118 MOVL $-1,w+4(FP)
119 MOVL AX, errno+8(FP)
120 RET
121 pipeok:
122 MOVL AX, r+0(FP)
123 MOVL DX, w+4(FP)
124 MOVL $0, errno+8(FP)
125 RET
126
127 // func pipe2(flags int32) (r, w int32, errno int32)
128 TEXT runtime·pipe2(SB),NOSPLIT,$0-20
129 MOVL $0, DI
130 // dragonfly expects flags as the 2nd argument
131 MOVL flags+0(FP), SI
132 MOVL $538, AX
133 SYSCALL
134 JCC pipe2ok
135 MOVL $-1,r+8(FP)
136 MOVL $-1,w+12(FP)
137 MOVL AX, errno+16(FP)
138 RET
139 pipe2ok:
140 MOVL AX, r+8(FP)
141 MOVL DX, w+12(FP)
142 MOVL $0, errno+16(FP)
143 RET
144
145 TEXT runtime·write1(SB),NOSPLIT,$-8
146 MOVQ fd+0(FP), DI // arg 1 fd
147 MOVQ p+8(FP), SI // arg 2 buf
148 MOVL n+16(FP), DX // arg 3 count
149 MOVL $4, AX
150 SYSCALL
151 JCC 2(PC)
152 NEGL AX // caller expects negative errno
153 MOVL AX, ret+24(FP)
154 RET
155
156 TEXT runtime·lwp_gettid(SB),NOSPLIT,$0-4
157 MOVL $496, AX // lwp_gettid
158 SYSCALL
159 MOVL AX, ret+0(FP)
160 RET
161
162 TEXT runtime·lwp_kill(SB),NOSPLIT,$0-16
163 MOVL pid+0(FP), DI // arg 1 - pid
164 MOVL tid+4(FP), SI // arg 2 - tid
165 MOVQ sig+8(FP), DX // arg 3 - signum
166 MOVL $497, AX // lwp_kill
167 SYSCALL
168 RET
169
170 TEXT runtime·raiseproc(SB),NOSPLIT,$0
171 MOVL $20, AX // getpid
172 SYSCALL
173 MOVQ AX, DI // arg 1 - pid
174 MOVL sig+0(FP), SI // arg 2 - signum
175 MOVL $37, AX // kill
176 SYSCALL
177 RET
178
179 TEXT runtime·setitimer(SB), NOSPLIT, $-8
180 MOVL mode+0(FP), DI
181 MOVQ new+8(FP), SI
182 MOVQ old+16(FP), DX
183 MOVL $83, AX
184 SYSCALL
185 RET
186
187 // func walltime() (sec int64, nsec int32)
188 TEXT runtime·walltime(SB), NOSPLIT, $32
189 MOVL $232, AX // clock_gettime
190 MOVQ $0, DI // CLOCK_REALTIME
191 LEAQ 8(SP), SI
192 SYSCALL
193 MOVQ 8(SP), AX // sec
194 MOVQ 16(SP), DX // nsec
195
196 // sec is in AX, nsec in DX
197 MOVQ AX, sec+0(FP)
198 MOVL DX, nsec+8(FP)
199 RET
200
201 TEXT runtime·nanotime1(SB), NOSPLIT, $32
202 MOVL $232, AX
203 MOVQ $4, DI // CLOCK_MONOTONIC
204 LEAQ 8(SP), SI
205 SYSCALL
206 MOVQ 8(SP), AX // sec
207 MOVQ 16(SP), DX // nsec
208
209 // sec is in AX, nsec in DX
210 // return nsec in AX
211 IMULQ $1000000000, AX
212 ADDQ DX, AX
213 MOVQ AX, ret+0(FP)
214 RET
215
216 TEXT runtime·sigaction(SB),NOSPLIT,$-8
217 MOVL sig+0(FP), DI // arg 1 sig
218 MOVQ new+8(FP), SI // arg 2 act
219 MOVQ old+16(FP), DX // arg 3 oact
220 MOVL $342, AX
221 SYSCALL
222 JCC 2(PC)
223 MOVL $0xf1, 0xf1 // crash
224 RET
225
226 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
227 MOVQ fn+0(FP), AX
228 MOVL sig+8(FP), DI
229 MOVQ info+16(FP), SI
230 MOVQ ctx+24(FP), DX
231 PUSHQ BP
232 MOVQ SP, BP
233 ANDQ $~15, SP // alignment for x86_64 ABI
234 CALL AX
235 MOVQ BP, SP
236 POPQ BP
237 RET
238
239 // Called using C ABI.
240 TEXT runtime·sigtramp(SB),NOSPLIT,$0
241 // Transition from C ABI to Go ABI.
242 PUSH_REGS_HOST_TO_ABI0()
243
244 // Call into the Go signal handler
245 NOP SP // disable vet stack checking
246 ADJSP $24
247 MOVQ DI, 0(SP) // sig
248 MOVQ SI, 8(SP) // info
249 MOVQ DX, 16(SP) // ctx
250 CALL ·sigtrampgo(SB)
251 ADJSP $-24
252
253 POP_REGS_HOST_TO_ABI0()
254 RET
255
256 TEXT runtime·mmap(SB),NOSPLIT,$0
257 MOVQ addr+0(FP), DI // arg 1 - addr
258 MOVQ n+8(FP), SI // arg 2 - len
259 MOVL prot+16(FP), DX // arg 3 - prot
260 MOVL flags+20(FP), R10 // arg 4 - flags
261 MOVL fd+24(FP), R8 // arg 5 - fd
262 MOVL off+28(FP), R9
263 SUBQ $16, SP
264 MOVQ R9, 8(SP) // arg 7 - offset (passed on stack)
265 MOVQ $0, R9 // arg 6 - pad
266 MOVL $197, AX
267 SYSCALL
268 JCC ok
269 ADDQ $16, SP
270 MOVQ $0, p+32(FP)
271 MOVQ AX, err+40(FP)
272 RET
273 ok:
274 ADDQ $16, SP
275 MOVQ AX, p+32(FP)
276 MOVQ $0, err+40(FP)
277 RET
278
279 TEXT runtime·munmap(SB),NOSPLIT,$0
280 MOVQ addr+0(FP), DI // arg 1 addr
281 MOVQ n+8(FP), SI // arg 2 len
282 MOVL $73, AX
283 SYSCALL
284 JCC 2(PC)
285 MOVL $0xf1, 0xf1 // crash
286 RET
287
288 TEXT runtime·madvise(SB),NOSPLIT,$0
289 MOVQ addr+0(FP), DI
290 MOVQ n+8(FP), SI
291 MOVL flags+16(FP), DX
292 MOVQ $75, AX // madvise
293 SYSCALL
294 JCC 2(PC)
295 MOVL $-1, AX
296 MOVL AX, ret+24(FP)
297 RET
298
299 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
300 MOVQ new+0(FP), DI
301 MOVQ old+8(FP), SI
302 MOVQ $53, AX
303 SYSCALL
304 JCC 2(PC)
305 MOVL $0xf1, 0xf1 // crash
306 RET
307
308 TEXT runtime·usleep(SB),NOSPLIT,$16
309 MOVL $0, DX
310 MOVL usec+0(FP), AX
311 MOVL $1000000, CX
312 DIVL CX
313 MOVQ AX, 0(SP) // tv_sec
314 MOVL $1000, AX
315 MULL DX
316 MOVQ AX, 8(SP) // tv_nsec
317
318 MOVQ SP, DI // arg 1 - rqtp
319 MOVQ $0, SI // arg 2 - rmtp
320 MOVL $240, AX // sys_nanosleep
321 SYSCALL
322 RET
323
324 // set tls base to DI
325 TEXT runtime·settls(SB),NOSPLIT,$16
326 ADDQ $8, DI // adjust for ELF: wants to use -8(FS) for g
327 MOVQ DI, 0(SP)
328 MOVQ $16, 8(SP)
329 MOVQ $0, DI // arg 1 - which
330 MOVQ SP, SI // arg 2 - tls_info
331 MOVQ $16, DX // arg 3 - infosize
332 MOVQ $472, AX // set_tls_area
333 SYSCALL
334 JCC 2(PC)
335 MOVL $0xf1, 0xf1 // crash
336 RET
337
338 TEXT runtime·sysctl(SB),NOSPLIT,$0
339 MOVQ mib+0(FP), DI // arg 1 - name
340 MOVL miblen+8(FP), SI // arg 2 - namelen
341 MOVQ out+16(FP), DX // arg 3 - oldp
342 MOVQ size+24(FP), R10 // arg 4 - oldlenp
343 MOVQ dst+32(FP), R8 // arg 5 - newp
344 MOVQ ndst+40(FP), R9 // arg 6 - newlen
345 MOVQ $202, AX // sys___sysctl
346 SYSCALL
347 JCC 4(PC)
348 NEGQ AX
349 MOVL AX, ret+48(FP)
350 RET
351 MOVL $0, AX
352 MOVL AX, ret+48(FP)
353 RET
354
355 TEXT runtime·osyield(SB),NOSPLIT,$-4
356 MOVL $331, AX // sys_sched_yield
357 SYSCALL
358 RET
359
360 TEXT runtime·sigprocmask(SB),NOSPLIT,$0
361 MOVL how+0(FP), DI // arg 1 - how
362 MOVQ new+8(FP), SI // arg 2 - set
363 MOVQ old+16(FP), DX // arg 3 - oset
364 MOVL $340, AX // sys_sigprocmask
365 SYSCALL
366 JAE 2(PC)
367 MOVL $0xf1, 0xf1 // crash
368 RET
369
370 // int32 runtime·kqueue(void);
371 TEXT runtime·kqueue(SB),NOSPLIT,$0
372 MOVQ $0, DI
373 MOVQ $0, SI
374 MOVQ $0, DX
375 MOVL $362, AX
376 SYSCALL
377 JCC 2(PC)
378 NEGQ AX
379 MOVL AX, ret+0(FP)
380 RET
381
382 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout);
383 TEXT runtime·kevent(SB),NOSPLIT,$0
384 MOVL kq+0(FP), DI
385 MOVQ ch+8(FP), SI
386 MOVL nch+16(FP), DX
387 MOVQ ev+24(FP), R10
388 MOVL nev+32(FP), R8
389 MOVQ ts+40(FP), R9
390 MOVL $363, AX
391 SYSCALL
392 JCC 2(PC)
393 NEGQ AX
394 MOVL AX, ret+48(FP)
395 RET
396
397 // void runtime·closeonexec(int32 fd);
398 TEXT runtime·closeonexec(SB),NOSPLIT,$0
399 MOVL fd+0(FP), DI // fd
400 MOVQ $2, SI // F_SETFD
401 MOVQ $1, DX // FD_CLOEXEC
402 MOVL $92, AX // fcntl
403 SYSCALL
404 RET
405
406 // func runtime·setNonblock(int32 fd)
407 TEXT runtime·setNonblock(SB),NOSPLIT,$0-4
408 MOVL fd+0(FP), DI // fd
409 MOVQ $3, SI // F_GETFL
410 MOVQ $0, DX
411 MOVL $92, AX // fcntl
412 SYSCALL
413 MOVL fd+0(FP), DI // fd
414 MOVQ $4, SI // F_SETFL
415 MOVQ $4, DX // O_NONBLOCK
416 ORL AX, DX
417 MOVL $92, AX // fcntl
418 SYSCALL
419 RET
420
View as plain text