blob: eb9766d3f53de2c3d79c5a6c757f27e7092979f9 [file] [log] [blame]
Colin Cross7bb052a2015-02-03 12:59:37 -08001// 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, NetBSD
6// /usr/src/sys/kern/syscalls.master for syscall numbers.
7//
8
9#include "zasm_GOOS_GOARCH.h"
10#include "textflag.h"
11
12// int32 lwp_create(void *context, uintptr flags, void *lwpid)
13TEXT runtime·lwp_create(SB),NOSPLIT,$0
14 MOVQ ctxt+0(FP), DI
15 MOVQ flags+8(FP), SI
16 MOVQ lwpid+16(FP), DX
17 MOVL $309, AX // sys__lwp_create
18 SYSCALL
19 JCC 2(PC)
20 NEGQ AX
21 MOVL AX, ret+24(FP)
22 RET
23
24TEXT runtime·lwp_tramp(SB),NOSPLIT,$0
25
26 // Set FS to point at m->tls.
27 LEAQ m_tls(R8), DI
28 CALL runtime·settls(SB)
29
30 // Set up new stack.
31 get_tls(CX)
32 MOVQ R8, g_m(R9)
33 MOVQ R9, g(CX)
34 CALL runtime·stackcheck(SB)
35
36 // Call fn
37 CALL R12
38
39 // It shouldn't return. If it does, exit.
40 MOVL $310, AX // sys__lwp_exit
41 SYSCALL
42 JMP -3(PC) // keep exiting
43
44TEXT runtime·osyield(SB),NOSPLIT,$0
45 MOVL $350, AX // sys_sched_yield
46 SYSCALL
47 RET
48
49TEXT runtime·lwp_park(SB),NOSPLIT,$0
50 MOVQ abstime+0(FP), DI // arg 1 - abstime
51 MOVL unpark+8(FP), SI // arg 2 - unpark
52 MOVQ hint+16(FP), DX // arg 3 - hint
53 MOVQ unparkhint+24(FP), R10 // arg 4 - unparkhint
54 MOVL $434, AX // sys__lwp_park
55 SYSCALL
56 MOVL AX, ret+32(FP)
57 RET
58
59TEXT runtime·lwp_unpark(SB),NOSPLIT,$0
60 MOVL lwp+0(FP), DI // arg 1 - lwp
61 MOVQ hint+8(FP), SI // arg 2 - hint
62 MOVL $321, AX // sys__lwp_unpark
63 SYSCALL
64 MOVL AX, ret+16(FP)
65 RET
66
67TEXT runtime·lwp_self(SB),NOSPLIT,$0
68 MOVL $311, AX // sys__lwp_self
69 SYSCALL
70 MOVL AX, ret+0(FP)
71 RET
72
73// Exit the entire program (like C exit)
74TEXT runtime·exit(SB),NOSPLIT,$-8
75 MOVL code+0(FP), DI // arg 1 - exit status
76 MOVL $1, AX // sys_exit
77 SYSCALL
78 MOVL $0xf1, 0xf1 // crash
79 RET
80
81TEXT runtime·exit1(SB),NOSPLIT,$-8
82 MOVL $310, AX // sys__lwp_exit
83 SYSCALL
84 MOVL $0xf1, 0xf1 // crash
85 RET
86
87TEXT runtime·open(SB),NOSPLIT,$-8
88 MOVQ name+0(FP), DI // arg 1 pathname
89 MOVL mode+8(FP), SI // arg 2 flags
90 MOVL perm+12(FP), DX // arg 3 mode
91 MOVL $5, AX
92 SYSCALL
93 MOVL AX, ret+16(FP)
94 RET
95
96TEXT runtime·close(SB),NOSPLIT,$-8
97 MOVL fd+0(FP), DI // arg 1 fd
98 MOVL $6, AX
99 SYSCALL
100 MOVL AX, ret+8(FP)
101 RET
102
103TEXT runtime·read(SB),NOSPLIT,$-8
104 MOVL fd+0(FP), DI // arg 1 fd
105 MOVQ p+8(FP), SI // arg 2 buf
106 MOVL n+16(FP), DX // arg 3 count
107 MOVL $3, AX
108 SYSCALL
109 MOVL AX, ret+24(FP)
110 RET
111
112TEXT runtime·write(SB),NOSPLIT,$-8
113 MOVQ fd+0(FP), DI // arg 1 - fd
114 MOVQ p+8(FP), SI // arg 2 - buf
115 MOVL n+16(FP), DX // arg 3 - nbyte
116 MOVL $4, AX // sys_write
117 SYSCALL
118 MOVL AX, ret+24(FP)
119 RET
120
121TEXT runtime·usleep(SB),NOSPLIT,$16
122 MOVL $0, DX
123 MOVL usec+0(FP), AX
124 MOVL $1000000, CX
125 DIVL CX
126 MOVQ AX, 0(SP) // tv_sec
127 MOVL $1000, AX
128 MULL DX
129 MOVQ AX, 8(SP) // tv_nsec
130
131 MOVQ SP, DI // arg 1 - rqtp
132 MOVQ $0, SI // arg 2 - rmtp
133 MOVL $430, AX // sys_nanosleep
134 SYSCALL
135 RET
136
137TEXT runtime·raise(SB),NOSPLIT,$16
138 MOVL $311, AX // sys__lwp_self
139 SYSCALL
140 MOVQ AX, DI // arg 1 - target
141 MOVL sig+0(FP), SI // arg 2 - signo
142 MOVL $318, AX // sys__lwp_kill
143 SYSCALL
144 RET
145
146TEXT runtime·setitimer(SB),NOSPLIT,$-8
147 MOVL mode+0(FP), DI // arg 1 - which
148 MOVQ new+8(FP), SI // arg 2 - itv
149 MOVQ old+16(FP), DX // arg 3 - oitv
150 MOVL $425, AX // sys_setitimer
151 SYSCALL
152 RET
153
154// func now() (sec int64, nsec int32)
155TEXT time·now(SB), NOSPLIT, $32
156 MOVQ $0, DI // arg 1 - clock_id
157 LEAQ 8(SP), SI // arg 2 - tp
158 MOVL $427, AX // sys_clock_gettime
159 SYSCALL
160 MOVQ 8(SP), AX // sec
161 MOVL 16(SP), DX // nsec
162
163 // sec is in AX, nsec in DX
164 MOVQ AX, sec+0(FP)
165 MOVL DX, nsec+8(FP)
166 RET
167
168TEXT runtime·nanotime(SB),NOSPLIT,$32
169 MOVQ $0, DI // arg 1 - clock_id
170 LEAQ 8(SP), SI // arg 2 - tp
171 MOVL $427, AX // sys_clock_gettime
172 SYSCALL
173 MOVQ 8(SP), AX // sec
174 MOVL 16(SP), DX // nsec
175
176 // sec is in AX, nsec in DX
177 // return nsec in AX
178 IMULQ $1000000000, AX
179 ADDQ DX, AX
180 MOVQ AX, ret+0(FP)
181 RET
182
183TEXT runtime·getcontext(SB),NOSPLIT,$-8
184 MOVQ ctxt+0(FP), DI // arg 1 - context
185 MOVL $307, AX // sys_getcontext
186 SYSCALL
187 JCC 2(PC)
188 MOVL $0xf1, 0xf1 // crash
189 RET
190
191TEXT runtime·sigprocmask(SB),NOSPLIT,$0
192 MOVL mode+0(FP), DI // arg 1 - how
193 MOVQ new+8(FP), SI // arg 2 - set
194 MOVQ old+16(FP), DX // arg 3 - oset
195 MOVL $293, AX // sys_sigprocmask
196 SYSCALL
197 JCC 2(PC)
198 MOVL $0xf1, 0xf1 // crash
199 RET
200
201TEXT runtime·sigreturn_tramp(SB),NOSPLIT,$-8
202 MOVQ R15, DI // Load address of ucontext
203 MOVQ $308, AX // sys_setcontext
204 SYSCALL
205 MOVQ $-1, DI // Something failed...
206 MOVL $1, AX // sys_exit
207 SYSCALL
208
209TEXT runtime·sigaction(SB),NOSPLIT,$-8
210 MOVL sig+0(FP), DI // arg 1 - signum
211 MOVQ new+8(FP), SI // arg 2 - nsa
212 MOVQ old+16(FP), DX // arg 3 - osa
213 // arg 4 - tramp
214 LEAQ runtime·sigreturn_tramp(SB), R10
215 MOVQ $2, R8 // arg 5 - vers
216 MOVL $340, AX // sys___sigaction_sigtramp
217 SYSCALL
218 JCC 2(PC)
219 MOVL $0xf1, 0xf1 // crash
220 RET
221
222TEXT runtime·sigtramp(SB),NOSPLIT,$64
223 get_tls(BX)
224
225 // check that g exists
226 MOVQ g(BX), R10
227 CMPQ R10, $0
228 JNE 5(PC)
229 MOVQ DI, 0(SP)
230 MOVQ $runtime·badsignal(SB), AX
231 CALL AX
232 RET
233
234 // save g
235 MOVQ R10, 40(SP)
236
237 // g = m->signal
238 MOVQ g_m(R10), BP
239 MOVQ m_gsignal(BP), BP
240 MOVQ BP, g(BX)
241
242 MOVQ DI, 0(SP)
243 MOVQ SI, 8(SP)
244 MOVQ DX, 16(SP)
245 MOVQ R10, 24(SP)
246
247 CALL runtime·sighandler(SB)
248
249 // restore g
250 get_tls(BX)
251 MOVQ 40(SP), R10
252 MOVQ R10, g(BX)
253 RET
254
255TEXT runtime·mmap(SB),NOSPLIT,$0
256 MOVQ addr+0(FP), DI // arg 1 - addr
257 MOVQ n+8(FP), SI // arg 2 - len
258 MOVL prot+16(FP), DX // arg 3 - prot
259 MOVL flags+20(FP), R10 // arg 4 - flags
260 MOVL fd+24(FP), R8 // arg 5 - fd
261 MOVL off+28(FP), R9
262 SUBQ $16, SP
263 MOVQ R9, 8(SP) // arg 7 - offset (passed on stack)
264 MOVQ $0, R9 // arg 6 - pad
265 MOVL $197, AX // sys_mmap
266 SYSCALL
267 ADDQ $16, SP
268 MOVQ AX, ret+32(FP)
269 RET
270
271TEXT runtime·munmap(SB),NOSPLIT,$0
272 MOVQ addr+0(FP), DI // arg 1 - addr
273 MOVQ n+8(FP), SI // arg 2 - len
274 MOVL $73, AX // sys_munmap
275 SYSCALL
276 JCC 2(PC)
277 MOVL $0xf1, 0xf1 // crash
278 RET
279
280
281TEXT runtime·madvise(SB),NOSPLIT,$0
282 MOVQ addr+0(FP), DI // arg 1 - addr
283 MOVQ n+8(FP), SI // arg 2 - len
284 MOVL flags+16(FP), DX // arg 3 - behav
285 MOVQ $75, AX // sys_madvise
286 SYSCALL
287 // ignore failure - maybe pages are locked
288 RET
289
290TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
291 MOVQ new+8(SP), DI // arg 1 - nss
292 MOVQ old+16(SP), SI // arg 2 - oss
293 MOVQ $281, AX // sys___sigaltstack14
294 SYSCALL
295 JCC 2(PC)
296 MOVL $0xf1, 0xf1 // crash
297 RET
298
299// set tls base to DI
300TEXT runtime·settls(SB),NOSPLIT,$8
301 // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m
302 ADDQ $16, DI // arg 1 - ptr
303 MOVQ $317, AX // sys__lwp_setprivate
304 SYSCALL
305 JCC 2(PC)
306 MOVL $0xf1, 0xf1 // crash
307 RET
308
309TEXT runtime·sysctl(SB),NOSPLIT,$0
310 MOVQ mib+0(FP), DI // arg 1 - name
311 MOVL miblen+8(FP), SI // arg 2 - namelen
312 MOVQ out+16(FP), DX // arg 3 - oldp
313 MOVQ size+24(FP), R10 // arg 4 - oldlenp
314 MOVQ dst+32(FP), R8 // arg 5 - newp
315 MOVQ ndst+40(FP), R9 // arg 6 - newlen
316 MOVQ $202, AX // sys___sysctl
317 SYSCALL
318 JCC 4(PC)
319 NEGQ AX
320 MOVL AX, ret+48(FP)
321 RET
322 MOVL $0, AX
323 MOVL AX, ret+48(FP)
324 RET
325
326// int32 runtime·kqueue(void)
327TEXT runtime·kqueue(SB),NOSPLIT,$0
328 MOVQ $0, DI
329 MOVL $344, AX
330 SYSCALL
331 JCC 2(PC)
332 NEGQ AX
333 MOVL AX, ret+0(FP)
334 RET
335
336// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout)
337TEXT runtime·kevent(SB),NOSPLIT,$0
338 MOVL fd+0(FP), DI
339 MOVQ ev1+8(FP), SI
340 MOVL nev1+16(FP), DX
341 MOVQ ev2+24(FP), R10
342 MOVL nev2+32(FP), R8
343 MOVQ ts+40(FP), R9
344 MOVL $435, AX
345 SYSCALL
346 JCC 2(PC)
347 NEGQ AX
348 MOVL AX, ret+48(FP)
349 RET
350
351// void runtime·closeonexec(int32 fd)
352TEXT runtime·closeonexec(SB),NOSPLIT,$0
353 MOVL fd+0(FP), DI // fd
354 MOVQ $2, SI // F_SETFD
355 MOVQ $1, DX // FD_CLOEXEC
356 MOVL $92, AX // fcntl
357 SYSCALL
358 RET