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.
5 // System calls and other sys.stuff for 386, OpenBSD
6 // /usr/src/sys/kern/syscalls.master for syscall numbers.
13 #define CLOCK_MONOTONIC $3
15 // Exit the entire program (like C exit)
16 TEXT runtime·exit(SB),NOSPLIT,$-4
19 MOVL $0xf1, 0xf1 // crash
22 TEXT runtime·exit1(SB),NOSPLIT,$8
24 MOVL $0, 4(SP) // arg 1 - notdead
25 MOVL $302, AX // sys___threxit
28 MOVL $0xf1, 0xf1 // crash
31 TEXT runtime·open(SB),NOSPLIT,$-4
37 TEXT runtime·close(SB),NOSPLIT,$-4
43 TEXT runtime·read(SB),NOSPLIT,$-4
49 TEXT runtime·write(SB),NOSPLIT,$-4
50 MOVL $4, AX // sys_write
55 TEXT runtime·usleep(SB),NOSPLIT,$24
60 MOVL AX, 12(SP) // tv_sec - l32
61 MOVL $0, 16(SP) // tv_sec - h32
64 MOVL AX, 20(SP) // tv_nsec
68 MOVL AX, 4(SP) // arg 1 - rqtp
69 MOVL $0, 8(SP) // arg 2 - rmtp
70 MOVL $91, AX // sys_nanosleep
74 TEXT runtime·raise(SB),NOSPLIT,$12
75 MOVL $299, AX // sys_getthrid
78 MOVL AX, 4(SP) // arg 1 - pid
80 MOVL AX, 8(SP) // arg 2 - signum
81 MOVL $37, AX // sys_kill
85 TEXT runtime·mmap(SB),NOSPLIT,$36
92 MOVSL // arg 4 - flags
96 MOVSL // arg 7 - offset
97 MOVL $0, AX // top 32 bits of file offset
99 MOVL $197, AX // sys_mmap
104 TEXT runtime·munmap(SB),NOSPLIT,$-4
105 MOVL $73, AX // sys_munmap
108 MOVL $0xf1, 0xf1 // crash
111 TEXT runtime·madvise(SB),NOSPLIT,$-4
112 MOVL $75, AX // sys_madvise
115 MOVL $0xf1, 0xf1 // crash
118 TEXT runtime·setitimer(SB),NOSPLIT,$-4
123 // func now() (sec int64, nsec int32)
124 TEXT time·now(SB), NOSPLIT, $32
126 MOVL $0, 4(SP) // arg 1 - clock_id
127 MOVL BX, 8(SP) // arg 2 - tp
128 MOVL $87, AX // sys_clock_gettime
131 MOVL 12(SP), AX // sec - l32
133 MOVL 16(SP), AX // sec - h32
136 MOVL 20(SP), BX // nsec
140 // int64 nanotime(void) so really
141 // void nanotime(int64 *nsec)
142 TEXT runtime·nanotime(SB),NOSPLIT,$32
144 MOVL CLOCK_MONOTONIC, 4(SP) // arg 1 - clock_id
145 MOVL BX, 8(SP) // arg 2 - tp
146 MOVL $87, AX // sys_clock_gettime
149 MOVL 16(SP), CX // sec - h32
150 IMULL $1000000000, CX
152 MOVL 12(SP), AX // sec - l32
154 MULL BX // result in dx:ax
156 MOVL 20(SP), BX // nsec
158 ADCL CX, DX // add high bits with carry
160 MOVL AX, ret_lo+0(FP)
161 MOVL DX, ret_hi+4(FP)
164 TEXT runtime·sigaction(SB),NOSPLIT,$-4
165 MOVL $46, AX // sys_sigaction
168 MOVL $0xf1, 0xf1 // crash
171 TEXT runtime·sigprocmask(SB),NOSPLIT,$-4
172 MOVL $48, AX // sys_sigprocmask
175 MOVL $0xf1, 0xf1 // crash
179 TEXT runtime·sigtramp(SB),NOSPLIT,$44
182 // check that g exists
188 MOVL $runtime·badsignal(SB), AX
197 MOVL m_gsignal(BX), BX
200 // copy arguments for call to sighandler
205 MOVL context+8(FP), BX
209 CALL runtime·sighandler(SB)
218 MOVL context+8(FP), AX
219 MOVL $0, 0(SP) // syscall gap
220 MOVL AX, 4(SP) // arg 1 - sigcontext
221 MOVL $103, AX // sys_sigreturn
223 MOVL $0xf1, 0xf1 // crash
226 // int32 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void));
227 TEXT runtime·tfork(SB),NOSPLIT,$12
229 // Copy mp, gp and fn from the parent stack onto the child stack.
231 MOVL 8(AX), CX // tf_stack
242 MOVL $0, 0(SP) // syscall gap
244 MOVL AX, 4(SP) // arg 1 - param
246 MOVL AX, 8(SP) // arg 2 - psize
247 MOVL $8, AX // sys___tfork
250 // Return if tfork syscall failed.
256 // In parent, return.
262 // Paranoia: check that SP is as we expect.
273 // Set FS to point at m->tls.
275 PUSHAL // save registers
277 CALL runtime·settls(SB)
281 // Now segment is established. Initialize m, g.
286 CALL runtime·stackcheck(SB) // smashes AX, CX
287 MOVL 0(DX), DX // paranoia; check they are not nil
290 // More paranoia; check that stack splitting code works.
292 CALL runtime·emptyfunc(SB)
298 CALL runtime·exit1(SB)
302 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
303 MOVL $288, AX // sys_sigaltstack
312 TEXT runtime·setldt(SB),NOSPLIT,$4
313 // Under OpenBSD we set the GS base instead of messing with the LDT.
316 CALL runtime·settls(SB)
319 TEXT runtime·settls(SB),NOSPLIT,$8
320 // adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
321 MOVL tlsbase+0(FP), CX
323 MOVL $0, 0(SP) // syscall gap
324 MOVL CX, 4(SP) // arg 1 - tcb
325 MOVL $329, AX // sys___set_tcb
328 MOVL $0xf1, 0xf1 // crash
331 TEXT runtime·osyield(SB),NOSPLIT,$-4
332 MOVL $298, AX // sys_sched_yield
336 TEXT runtime·thrsleep(SB),NOSPLIT,$-4
337 MOVL $94, AX // sys___thrsleep
342 TEXT runtime·thrwakeup(SB),NOSPLIT,$-4
343 MOVL $301, AX // sys___thrwakeup
348 TEXT runtime·sysctl(SB),NOSPLIT,$28
352 MOVSL // arg 1 - name
353 MOVSL // arg 2 - namelen
354 MOVSL // arg 3 - oldp
355 MOVSL // arg 4 - oldlenp
356 MOVSL // arg 5 - newp
357 MOVSL // arg 6 - newlen
358 MOVL $202, AX // sys___sysctl
368 // int32 runtime·kqueue(void);
369 TEXT runtime·kqueue(SB),NOSPLIT,$0
377 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout);
378 TEXT runtime·kevent(SB),NOSPLIT,$0
379 MOVL $72, AX // sys_kevent
386 // int32 runtime·closeonexec(int32 fd);
387 TEXT runtime·closeonexec(SB),NOSPLIT,$32
388 MOVL $92, AX // sys_fcntl
389 // 0(SP) is where the caller PC would be; kernel skips it
392 MOVL $2, 8(SP) // F_SETFD
393 MOVL $1, 12(SP) // FD_CLOEXEC
399 GLOBL runtime·tlsoffset(SB),NOPTR,$4