Text file src/pkg/runtime/sys_netbsd_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, NetBSD
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 #define CLOCK_REALTIME 0
14 #define CLOCK_MONOTONIC 3
15 #define FD_CLOEXEC 1
16 #define F_SETFD 2
17
18 #define SYS_exit 1
19 #define SYS_read 3
20 #define SYS_write 4
21 #define SYS_open 5
22 #define SYS_close 6
23 #define SYS_getpid 20
24 #define SYS_kill 37
25 #define SYS_munmap 73
26 #define SYS_madvise 75
27 #define SYS_fcntl 92
28 #define SYS_mmap 197
29 #define SYS___sysctl 202
30 #define SYS___sigaltstack14 281
31 #define SYS___sigprocmask14 293
32 #define SYS_getcontext 307
33 #define SYS_setcontext 308
34 #define SYS__lwp_create 309
35 #define SYS__lwp_exit 310
36 #define SYS__lwp_self 311
37 #define SYS__lwp_setprivate 317
38 #define SYS__lwp_kill 318
39 #define SYS__lwp_unpark 321
40 #define SYS___sigaction_sigtramp 340
41 #define SYS_kqueue 344
42 #define SYS_sched_yield 350
43 #define SYS___setitimer50 425
44 #define SYS___clock_gettime50 427
45 #define SYS___nanosleep50 430
46 #define SYS___kevent50 435
47 #define SYS____lwp_park60 478
48
49 // int32 lwp_create(void *context, uintptr flags, void *lwpid)
50 TEXT runtime·lwp_create(SB),NOSPLIT,$0
51 MOVQ ctxt+0(FP), DI
52 MOVQ flags+8(FP), SI
53 MOVQ lwpid+16(FP), DX
54 MOVL $SYS__lwp_create, AX
55 SYSCALL
56 JCC 2(PC)
57 NEGQ AX
58 MOVL AX, ret+24(FP)
59 RET
60
61 TEXT runtime·lwp_tramp(SB),NOSPLIT,$0
62
63 // Set FS to point at m->tls.
64 LEAQ m_tls(R8), DI
65 CALL runtime·settls(SB)
66
67 // Set up new stack.
68 get_tls(CX)
69 MOVQ R8, g_m(R9)
70 MOVQ R9, g(CX)
71 CALL runtime·stackcheck(SB)
72
73 // Call fn
74 CALL R12
75
76 // It shouldn't return. If it does, exit.
77 MOVL $SYS__lwp_exit, AX
78 SYSCALL
79 JMP -3(PC) // keep exiting
80
81 TEXT runtime·osyield(SB),NOSPLIT,$0
82 MOVL $SYS_sched_yield, AX
83 SYSCALL
84 RET
85
86 TEXT runtime·lwp_park(SB),NOSPLIT,$0
87 MOVL clockid+0(FP), DI // arg 1 - clockid
88 MOVL flags+4(FP), SI // arg 2 - flags
89 MOVQ ts+8(FP), DX // arg 3 - ts
90 MOVL unpark+16(FP), R10 // arg 4 - unpark
91 MOVQ hint+24(FP), R8 // arg 5 - hint
92 MOVQ unparkhint+32(FP), R9 // arg 6 - unparkhint
93 MOVL $SYS____lwp_park60, AX
94 SYSCALL
95 MOVL AX, ret+40(FP)
96 RET
97
98 TEXT runtime·lwp_unpark(SB),NOSPLIT,$0
99 MOVL lwp+0(FP), DI // arg 1 - lwp
100 MOVQ hint+8(FP), SI // arg 2 - hint
101 MOVL $SYS__lwp_unpark, AX
102 SYSCALL
103 MOVL AX, ret+16(FP)
104 RET
105
106 TEXT runtime·lwp_self(SB),NOSPLIT,$0
107 MOVL $SYS__lwp_self, AX
108 SYSCALL
109 MOVL AX, ret+0(FP)
110 RET
111
112 // Exit the entire program (like C exit)
113 TEXT runtime·exit(SB),NOSPLIT,$-8
114 MOVL code+0(FP), DI // arg 1 - exit status
115 MOVL $SYS_exit, AX
116 SYSCALL
117 MOVL $0xf1, 0xf1 // crash
118 RET
119
120 // func exitThread(wait *uint32)
121 TEXT runtime·exitThread(SB),NOSPLIT,$0-8
122 MOVQ wait+0(FP), AX
123 // We're done using the stack.
124 MOVL $0, (AX)
125 MOVL $SYS__lwp_exit, AX
126 SYSCALL
127 MOVL $0xf1, 0xf1 // crash
128 JMP 0(PC)
129
130 TEXT runtime·open(SB),NOSPLIT,$-8
131 MOVQ name+0(FP), DI // arg 1 pathname
132 MOVL mode+8(FP), SI // arg 2 flags
133 MOVL perm+12(FP), DX // arg 3 mode
134 MOVL $SYS_open, AX
135 SYSCALL
136 JCC 2(PC)
137 MOVL $-1, AX
138 MOVL AX, ret+16(FP)
139 RET
140
141 TEXT runtime·closefd(SB),NOSPLIT,$-8
142 MOVL fd+0(FP), DI // arg 1 fd
143 MOVL $SYS_close, AX
144 SYSCALL
145 JCC 2(PC)
146 MOVL $-1, AX
147 MOVL AX, ret+8(FP)
148 RET
149
150 TEXT runtime·read(SB),NOSPLIT,$-8
151 MOVL fd+0(FP), DI // arg 1 fd
152 MOVQ p+8(FP), SI // arg 2 buf
153 MOVL n+16(FP), DX // arg 3 count
154 MOVL $SYS_read, AX
155 SYSCALL
156 JCC 2(PC)
157 MOVL $-1, AX
158 MOVL AX, ret+24(FP)
159 RET
160
161 TEXT runtime·write(SB),NOSPLIT,$-8
162 MOVQ fd+0(FP), DI // arg 1 - fd
163 MOVQ p+8(FP), SI // arg 2 - buf
164 MOVL n+16(FP), DX // arg 3 - nbyte
165 MOVL $SYS_write, AX
166 SYSCALL
167 JCC 2(PC)
168 MOVL $-1, AX
169 MOVL AX, ret+24(FP)
170 RET
171
172 TEXT runtime·usleep(SB),NOSPLIT,$16
173 MOVL $0, DX
174 MOVL usec+0(FP), AX
175 MOVL $1000000, CX
176 DIVL CX
177 MOVQ AX, 0(SP) // tv_sec
178 MOVL $1000, AX
179 MULL DX
180 MOVQ AX, 8(SP) // tv_nsec
181
182 MOVQ SP, DI // arg 1 - rqtp
183 MOVQ $0, SI // arg 2 - rmtp
184 MOVL $SYS___nanosleep50, AX
185 SYSCALL
186 RET
187
188 TEXT runtime·raise(SB),NOSPLIT,$16
189 MOVL $SYS__lwp_self, AX
190 SYSCALL
191 MOVQ AX, DI // arg 1 - target
192 MOVL sig+0(FP), SI // arg 2 - signo
193 MOVL $SYS__lwp_kill, AX
194 SYSCALL
195 RET
196
197 TEXT runtime·raiseproc(SB),NOSPLIT,$16
198 MOVL $SYS_getpid, AX
199 SYSCALL
200 MOVQ AX, DI // arg 1 - pid
201 MOVL sig+0(FP), SI // arg 2 - signo
202 MOVL $SYS_kill, AX
203 SYSCALL
204 RET
205
206 TEXT runtime·setitimer(SB),NOSPLIT,$-8
207 MOVL mode+0(FP), DI // arg 1 - which
208 MOVQ new+8(FP), SI // arg 2 - itv
209 MOVQ old+16(FP), DX // arg 3 - oitv
210 MOVL $SYS___setitimer50, AX
211 SYSCALL
212 RET
213
214 // func walltime() (sec int64, nsec int32)
215 TEXT runtime·walltime(SB), NOSPLIT, $32
216 MOVQ $CLOCK_REALTIME, DI // arg 1 - clock_id
217 LEAQ 8(SP), SI // arg 2 - tp
218 MOVL $SYS___clock_gettime50, AX
219 SYSCALL
220 MOVQ 8(SP), AX // sec
221 MOVQ 16(SP), DX // nsec
222
223 // sec is in AX, nsec in DX
224 MOVQ AX, sec+0(FP)
225 MOVL DX, nsec+8(FP)
226 RET
227
228 TEXT runtime·nanotime(SB),NOSPLIT,$32
229 MOVQ $CLOCK_MONOTONIC, DI // arg 1 - clock_id
230 LEAQ 8(SP), SI // arg 2 - tp
231 MOVL $SYS___clock_gettime50, AX
232 SYSCALL
233 MOVQ 8(SP), AX // sec
234 MOVQ 16(SP), DX // nsec
235
236 // sec is in AX, nsec in DX
237 // return nsec in AX
238 IMULQ $1000000000, AX
239 ADDQ DX, AX
240 MOVQ AX, ret+0(FP)
241 RET
242
243 TEXT runtime·getcontext(SB),NOSPLIT,$-8
244 MOVQ ctxt+0(FP), DI // arg 1 - context
245 MOVL $SYS_getcontext, AX
246 SYSCALL
247 JCC 2(PC)
248 MOVL $0xf1, 0xf1 // crash
249 RET
250
251 TEXT runtime·sigprocmask(SB),NOSPLIT,$0
252 MOVL how+0(FP), DI // arg 1 - how
253 MOVQ new+8(FP), SI // arg 2 - set
254 MOVQ old+16(FP), DX // arg 3 - oset
255 MOVL $SYS___sigprocmask14, AX
256 SYSCALL
257 JCC 2(PC)
258 MOVL $0xf1, 0xf1 // crash
259 RET
260
261 TEXT sigreturn_tramp<>(SB),NOSPLIT,$-8
262 MOVQ R15, DI // Load address of ucontext
263 MOVQ $SYS_setcontext, AX
264 SYSCALL
265 MOVQ $-1, DI // Something failed...
266 MOVL $SYS_exit, AX
267 SYSCALL
268
269 TEXT runtime·sigaction(SB),NOSPLIT,$-8
270 MOVL sig+0(FP), DI // arg 1 - signum
271 MOVQ new+8(FP), SI // arg 2 - nsa
272 MOVQ old+16(FP), DX // arg 3 - osa
273 // arg 4 - tramp
274 LEAQ sigreturn_tramp<>(SB), R10
275 MOVQ $2, R8 // arg 5 - vers
276 MOVL $SYS___sigaction_sigtramp, AX
277 SYSCALL
278 JCC 2(PC)
279 MOVL $0xf1, 0xf1 // crash
280 RET
281
282 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
283 MOVQ fn+0(FP), AX
284 MOVL sig+8(FP), DI
285 MOVQ info+16(FP), SI
286 MOVQ ctx+24(FP), DX
287 PUSHQ BP
288 MOVQ SP, BP
289 ANDQ $~15, SP // alignment for x86_64 ABI
290 CALL AX
291 MOVQ BP, SP
292 POPQ BP
293 RET
294
295 TEXT runtime·sigtramp(SB),NOSPLIT,$72
296 // Save callee-saved C registers, since the caller may be a C signal handler.
297 MOVQ BX, bx-8(SP)
298 MOVQ BP, bp-16(SP) // save in case GOEXPERIMENT=noframepointer is set
299 MOVQ R12, r12-24(SP)
300 MOVQ R13, r13-32(SP)
301 MOVQ R14, r14-40(SP)
302 MOVQ R15, r15-48(SP)
303 // We don't save mxcsr or the x87 control word because sigtrampgo doesn't
304 // modify them.
305
306 MOVQ DX, ctx-56(SP)
307 MOVQ SI, info-64(SP)
308 MOVQ DI, signum-72(SP)
309 CALL runtime·sigtrampgo(SB)
310
311 MOVQ r15-48(SP), R15
312 MOVQ r14-40(SP), R14
313 MOVQ r13-32(SP), R13
314 MOVQ r12-24(SP), R12
315 MOVQ bp-16(SP), BP
316 MOVQ bx-8(SP), BX
317 RET
318
319 TEXT runtime·mmap(SB),NOSPLIT,$0
320 MOVQ addr+0(FP), DI // arg 1 - addr
321 MOVQ n+8(FP), SI // arg 2 - len
322 MOVL prot+16(FP), DX // arg 3 - prot
323 MOVL flags+20(FP), R10 // arg 4 - flags
324 MOVL fd+24(FP), R8 // arg 5 - fd
325 MOVL off+28(FP), R9
326 SUBQ $16, SP
327 MOVQ R9, 8(SP) // arg 7 - offset (passed on stack)
328 MOVQ $0, R9 // arg 6 - pad
329 MOVL $SYS_mmap, AX
330 SYSCALL
331 JCC ok
332 ADDQ $16, SP
333 MOVQ $0, p+32(FP)
334 MOVQ AX, err+40(FP)
335 RET
336 ok:
337 ADDQ $16, SP
338 MOVQ AX, p+32(FP)
339 MOVQ $0, err+40(FP)
340 RET
341
342 TEXT runtime·munmap(SB),NOSPLIT,$0
343 MOVQ addr+0(FP), DI // arg 1 - addr
344 MOVQ n+8(FP), SI // arg 2 - len
345 MOVL $SYS_munmap, AX
346 SYSCALL
347 JCC 2(PC)
348 MOVL $0xf1, 0xf1 // crash
349 RET
350
351
352 TEXT runtime·madvise(SB),NOSPLIT,$0
353 MOVQ addr+0(FP), DI // arg 1 - addr
354 MOVQ n+8(FP), SI // arg 2 - len
355 MOVL flags+16(FP), DX // arg 3 - behav
356 MOVQ $SYS_madvise, AX
357 SYSCALL
358 JCC 2(PC)
359 MOVL $-1, AX
360 MOVL AX, ret+24(FP)
361 RET
362
363 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
364 MOVQ new+0(FP), DI // arg 1 - nss
365 MOVQ old+8(FP), SI // arg 2 - oss
366 MOVQ $SYS___sigaltstack14, AX
367 SYSCALL
368 JCC 2(PC)
369 MOVL $0xf1, 0xf1 // crash
370 RET
371
372 // set tls base to DI
373 TEXT runtime·settls(SB),NOSPLIT,$8
374 // adjust for ELF: wants to use -8(FS) for g
375 ADDQ $8, DI // arg 1 - ptr
376 MOVQ $SYS__lwp_setprivate, AX
377 SYSCALL
378 JCC 2(PC)
379 MOVL $0xf1, 0xf1 // crash
380 RET
381
382 TEXT runtime·sysctl(SB),NOSPLIT,$0
383 MOVQ mib+0(FP), DI // arg 1 - name
384 MOVL miblen+8(FP), SI // arg 2 - namelen
385 MOVQ out+16(FP), DX // arg 3 - oldp
386 MOVQ size+24(FP), R10 // arg 4 - oldlenp
387 MOVQ dst+32(FP), R8 // arg 5 - newp
388 MOVQ ndst+40(FP), R9 // arg 6 - newlen
389 MOVQ $SYS___sysctl, AX
390 SYSCALL
391 JCC 4(PC)
392 NEGQ AX
393 MOVL AX, ret+48(FP)
394 RET
395 MOVL $0, AX
396 MOVL AX, ret+48(FP)
397 RET
398
399 // int32 runtime·kqueue(void)
400 TEXT runtime·kqueue(SB),NOSPLIT,$0
401 MOVQ $0, DI
402 MOVL $SYS_kqueue, AX
403 SYSCALL
404 JCC 2(PC)
405 NEGQ AX
406 MOVL AX, ret+0(FP)
407 RET
408
409 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout)
410 TEXT runtime·kevent(SB),NOSPLIT,$0
411 MOVL kq+0(FP), DI
412 MOVQ ch+8(FP), SI
413 MOVL nch+16(FP), DX
414 MOVQ ev+24(FP), R10
415 MOVL nev+32(FP), R8
416 MOVQ ts+40(FP), R9
417 MOVL $SYS___kevent50, AX
418 SYSCALL
419 JCC 2(PC)
420 NEGQ AX
421 MOVL AX, ret+48(FP)
422 RET
423
424 // void runtime·closeonexec(int32 fd)
425 TEXT runtime·closeonexec(SB),NOSPLIT,$0
426 MOVL fd+0(FP), DI // fd
427 MOVQ $F_SETFD, SI
428 MOVQ $FD_CLOEXEC, DX
429 MOVL $SYS_fcntl, AX
430 SYSCALL
431 RET
View as plain text