blob: bbfb3e37a2f333c1a6bf3f8005d7afacc2572363 [file] [log] [blame]
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -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 386, FreeBSD
6// /usr/src/sys/kern/syscalls.master for syscall numbers.
7//
8
Russ Cox55889402011-12-19 15:51:13 -05009#include "zasm_GOOS_GOARCH.h"
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080010
Russ Cox68b42552010-11-04 14:00:19 -040011TEXT runtime·sys_umtx_op(SB),7,$-4
Devon H. O'Dell5a4a08f2009-12-08 18:19:30 -080012 MOVL $454, AX
13 INT $0x80
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080014 RET
15
Russ Cox68b42552010-11-04 14:00:19 -040016TEXT runtime·thr_new(SB),7,$-4
Devon H. O'Dell5a4a08f2009-12-08 18:19:30 -080017 MOVL $455, AX
18 INT $0x80
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080019 RET
20
Russ Cox68b42552010-11-04 14:00:19 -040021TEXT runtime·thr_start(SB),7,$0
Devon H. O'Dell60b1a172009-11-18 16:51:59 -080022 MOVL mm+0(FP), AX
23 MOVL m_g0(AX), BX
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080024 LEAL m_tls(AX), BP
25 MOVL 0(BP), DI
26 ADDL $7, DI
27 PUSHAL
28 PUSHL $32
29 PUSHL BP
30 PUSHL DI
Russ Cox68b42552010-11-04 14:00:19 -040031 CALL runtime·setldt(SB)
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080032 POPL AX
33 POPL AX
34 POPL AX
35 POPAL
Hector Chu6bfe5f52010-01-06 17:58:55 -080036 get_tls(CX)
37 MOVL BX, g(CX)
38
39 MOVL AX, m(CX)
Russ Cox68b42552010-11-04 14:00:19 -040040 CALL runtime·stackcheck(SB) // smashes AX
Russ Coxe6a3e222013-03-01 11:44:43 -050041 CALL runtime·mstart(SB)
Russ Coxc5f694a2013-03-01 08:30:11 -050042
Devon H. O'Dell5a4a08f2009-12-08 18:19:30 -080043 MOVL 0, AX // crash (not reached)
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080044
45// Exit the entire program (like C exit)
Russ Cox68b42552010-11-04 14:00:19 -040046TEXT runtime·exit(SB),7,$-4
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080047 MOVL $1, AX
48 INT $0x80
Russ Cox36aa7d42012-03-08 14:03:56 -050049 MOVL $0xf1, 0xf1 // crash
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080050 RET
51
Russ Cox68b42552010-11-04 14:00:19 -040052TEXT runtime·exit1(SB),7,$-4
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080053 MOVL $431, AX
54 INT $0x80
55 JAE 2(PC)
Russ Cox36aa7d42012-03-08 14:03:56 -050056 MOVL $0xf1, 0xf1 // crash
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080057 RET
58
Keith Randalla5d40242013-03-12 10:47:44 -070059TEXT runtime·open(SB),7,$-4
60 MOVL $5, AX
61 INT $0x80
62 RET
63
64TEXT runtime·close(SB),7,$-4
65 MOVL $6, AX
66 INT $0x80
67 RET
68
69TEXT runtime·read(SB),7,$-4
70 MOVL $3, AX
71 INT $0x80
72 RET
73
Russ Cox68b42552010-11-04 14:00:19 -040074TEXT runtime·write(SB),7,$-4
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080075 MOVL $4, AX
76 INT $0x80
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -080077 RET
78
Russ Cox102274a2012-02-24 15:28:51 -050079TEXT runtime·getrlimit(SB),7,$-4
80 MOVL $194, AX
81 INT $0x80
82 RET
83
Russ Cox5146a932013-03-15 01:11:03 -040084TEXT runtime·raise(SB),7,$16
Russ Cox8698bb62011-04-25 16:58:00 -040085 // thr_self(&8(SP))
86 LEAL 8(SP), AX
Russ Cox5146a932013-03-15 01:11:03 -040087 MOVL AX, 4(SP)
Russ Cox8698bb62011-04-25 16:58:00 -040088 MOVL $432, AX
89 INT $0x80
90 // thr_kill(self, SIGPIPE)
91 MOVL 8(SP), AX
Russ Cox5146a932013-03-15 01:11:03 -040092 MOVL AX, 4(SP)
93 MOVL sig+0(FP), AX
94 MOVL AX, 8(SP)
Russ Cox8698bb62011-04-25 16:58:00 -040095 MOVL $433, AX
96 INT $0x80
97 RET
98
Russ Cox68b42552010-11-04 14:00:19 -040099TEXT runtime·mmap(SB),7,$32
Russ Coxe1e829b2010-08-24 13:04:02 -0400100 LEAL arg0+0(FP), SI
101 LEAL 4(SP), DI
102 CLD
103 MOVSL
104 MOVSL
105 MOVSL
106 MOVSL
107 MOVSL
108 MOVSL
Shenghou Mab151af12012-09-21 13:50:02 +0800109 MOVL $0, AX // top 32 bits of file offset
Russ Coxe1e829b2010-08-24 13:04:02 -0400110 STOSL
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800111 MOVL $477, AX
112 INT $0x80
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800113 RET
114
Russ Cox68b42552010-11-04 14:00:19 -0400115TEXT runtime·munmap(SB),7,$-4
Russ Coxd4cc5572010-09-07 09:57:22 -0400116 MOVL $73, AX
117 INT $0x80
118 JAE 2(PC)
Russ Cox36aa7d42012-03-08 14:03:56 -0500119 MOVL $0xf1, 0xf1 // crash
Russ Coxd4cc5572010-09-07 09:57:22 -0400120 RET
121
John Graham-Cumming314fd622012-11-24 15:55:19 +1100122TEXT runtime·madvise(SB),7,$-4
123 MOVL $75, AX // madvise
124 INT $0x80
Russ Cox295a4d82012-12-22 15:06:28 -0500125 // ignore failure - maybe pages are locked
John Graham-Cumming314fd622012-11-24 15:55:19 +1100126 RET
127
Russ Cox8dee8722011-03-23 11:31:42 -0400128TEXT runtime·setitimer(SB), 7, $-4
129 MOVL $83, AX
130 INT $0x80
131 RET
132
Russ Coxefe3d352011-11-30 11:59:44 -0500133// func now() (sec int64, nsec int32)
134TEXT time·now(SB), 7, $32
Shenghou Ma7777bac2012-12-18 22:57:25 +0800135 MOVL $232, AX
Russ Coxefe3d352011-11-30 11:59:44 -0500136 LEAL 12(SP), BX
Shenghou Ma7777bac2012-12-18 22:57:25 +0800137 MOVL $0, 4(SP)
138 MOVL BX, 8(SP)
Russ Coxefe3d352011-11-30 11:59:44 -0500139 INT $0x80
140 MOVL 12(SP), AX // sec
Shenghou Ma7777bac2012-12-18 22:57:25 +0800141 MOVL 16(SP), BX // nsec
Russ Coxefe3d352011-11-30 11:59:44 -0500142
Shenghou Ma7777bac2012-12-18 22:57:25 +0800143 // sec is in AX, nsec in BX
Russ Coxefe3d352011-11-30 11:59:44 -0500144 MOVL AX, sec+0(FP)
145 MOVL $0, sec+4(FP)
Russ Coxefe3d352011-11-30 11:59:44 -0500146 MOVL BX, nsec+8(FP)
147 RET
148
Russ Coxf4373312011-11-03 17:35:28 -0400149// int64 nanotime(void) so really
150// void nanotime(int64 *nsec)
151TEXT runtime·nanotime(SB), 7, $32
Shenghou Ma7777bac2012-12-18 22:57:25 +0800152 MOVL $232, AX
Russ Coxe4f06812010-02-08 14:32:22 -0800153 LEAL 12(SP), BX
Shenghou Ma7777bac2012-12-18 22:57:25 +0800154 MOVL $0, 4(SP)
155 MOVL BX, 8(SP)
Russ Coxe4f06812010-02-08 14:32:22 -0800156 INT $0x80
Russ Coxf4373312011-11-03 17:35:28 -0400157 MOVL 12(SP), AX // sec
Shenghou Ma7777bac2012-12-18 22:57:25 +0800158 MOVL 16(SP), BX // nsec
Russ Coxf4373312011-11-03 17:35:28 -0400159
Shenghou Ma7777bac2012-12-18 22:57:25 +0800160 // sec is in AX, nsec in BX
Russ Coxf4373312011-11-03 17:35:28 -0400161 // convert to DX:AX nsec
162 MOVL $1000000000, CX
163 MULL CX
Russ Coxf4373312011-11-03 17:35:28 -0400164 ADDL BX, AX
165 ADCL $0, DX
Shenghou Ma7777bac2012-12-18 22:57:25 +0800166
Russ Coxf4373312011-11-03 17:35:28 -0400167 MOVL ret+0(FP), DI
168 MOVL AX, 0(DI)
169 MOVL DX, 4(DI)
Russ Coxe4f06812010-02-08 14:32:22 -0800170 RET
171
Russ Coxf4373312011-11-03 17:35:28 -0400172
Russ Cox68b42552010-11-04 14:00:19 -0400173TEXT runtime·sigaction(SB),7,$-4
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800174 MOVL $416, AX
175 INT $0x80
176 JAE 2(PC)
Russ Cox36aa7d42012-03-08 14:03:56 -0500177 MOVL $0xf1, 0xf1 // crash
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800178 RET
179
Russ Cox690291a2011-02-23 14:47:42 -0500180TEXT runtime·sigtramp(SB),7,$44
181 get_tls(CX)
182
Russ Coxb2369112012-03-12 15:55:18 -0400183 // check that m exists
184 MOVL m(CX), BX
185 CMPL BX, $0
Alan Donovan532dee32012-09-04 14:40:49 -0400186 JNE 5(PC)
187 MOVL signo+0(FP), BX
188 MOVL BX, 0(SP)
Russ Coxb2369112012-03-12 15:55:18 -0400189 CALL runtime·badsignal(SB)
Alan Donovan532dee32012-09-04 14:40:49 -0400190 RET
Russ Coxb2369112012-03-12 15:55:18 -0400191
Russ Cox690291a2011-02-23 14:47:42 -0500192 // save g
193 MOVL g(CX), DI
194 MOVL DI, 20(SP)
195
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800196 // g = m->gsignal
Russ Cox690291a2011-02-23 14:47:42 -0500197 MOVL m_gsignal(BX), BX
198 MOVL BX, g(CX)
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800199
Russ Cox690291a2011-02-23 14:47:42 -0500200 // copy arguments for call to sighandler
201 MOVL signo+0(FP), BX
202 MOVL BX, 0(SP)
203 MOVL info+4(FP), BX
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800204 MOVL BX, 4(SP)
Russ Cox690291a2011-02-23 14:47:42 -0500205 MOVL context+8(FP), BX
206 MOVL BX, 8(SP)
207 MOVL DI, 12(SP)
208
Russ Cox68b42552010-11-04 14:00:19 -0400209 CALL runtime·sighandler(SB)
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800210
Russ Cox690291a2011-02-23 14:47:42 -0500211 // restore g
212 get_tls(CX)
213 MOVL 20(SP), BX
214 MOVL BX, g(CX)
215
216 // call sigreturn
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800217 MOVL context+8(FP), AX
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800218 MOVL $0, 0(SP) // syscall gap
219 MOVL AX, 4(SP)
220 MOVL $417, AX // sigreturn(ucontext)
221 INT $0x80
Russ Cox36aa7d42012-03-08 14:03:56 -0500222 MOVL $0xf1, 0xf1 // crash
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800223 RET
224
Russ Cox68b42552010-11-04 14:00:19 -0400225TEXT runtime·sigaltstack(SB),7,$0
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800226 MOVL $53, AX
227 INT $0x80
228 JAE 2(PC)
Russ Cox36aa7d42012-03-08 14:03:56 -0500229 MOVL $0xf1, 0xf1 // crash
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800230 RET
231
Shenghou Mac30ba7e2012-01-17 03:22:34 +1100232TEXT runtime·usleep(SB),7,$20
233 MOVL $0, DX
234 MOVL usec+0(FP), AX
235 MOVL $1000000, CX
236 DIVL CX
237 MOVL AX, 12(SP) // tv_sec
238 MOVL $1000, AX
239 MULL DX
240 MOVL AX, 16(SP) // tv_nsec
241
242 MOVL $0, 0(SP)
243 LEAL 12(SP), AX
244 MOVL AX, 4(SP) // arg 1 - rqtp
245 MOVL $0, 8(SP) // arg 2 - rmtp
246 MOVL $240, AX // sys_nanosleep
247 INT $0x80
David Symonds723f73c2011-09-30 16:39:10 -0700248 RET
249
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800250/*
251descriptor entry format for system call
252is the native machine format, ugly as it is:
253
254 2-byte limit
255 3-byte base
256 1-byte: 0x80=present, 0x60=dpl<<5, 0x1F=type
257 1-byte: 0x80=limit is *4k, 0x40=32-bit operand size,
258 0x0F=4 more bits of limit
259 1 byte: 8 more bits of base
260
261int i386_get_ldt(int, union ldt_entry *, int);
262int i386_set_ldt(int, const union ldt_entry *, int);
263
264*/
265
266// setldt(int entry, int address, int limit)
Russ Cox68b42552010-11-04 14:00:19 -0400267TEXT runtime·setldt(SB),7,$32
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800268 MOVL address+4(FP), BX // aka base
Shenghou Mae0213572012-01-22 10:34:17 -0800269 // see comment in sys_linux_386.s; freebsd is similar
Devon H. O'Dell60b1a172009-11-18 16:51:59 -0800270 ADDL $0x8, BX
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800271
272 // set up data_desc
273 LEAL 16(SP), AX // struct data_desc
274 MOVL $0, 0(AX)
275 MOVL $0, 4(AX)
276
277 MOVW BX, 2(AX)
278 SHRL $16, BX
279 MOVB BX, 4(AX)
280 SHRL $8, BX
281 MOVB BX, 7(AX)
282
Devon H. O'Dell60b1a172009-11-18 16:51:59 -0800283 MOVW $0xffff, 0(AX)
284 MOVB $0xCF, 6(AX) // 32-bit operand, 4k limit unit, 4 more bits of limit
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800285
286 MOVB $0xF2, 5(AX) // r/w data descriptor, dpl=3, present
287
288 // call i386_set_ldt(entry, desc, 1)
289 MOVL $0xffffffff, 0(SP) // auto-allocate entry and return in AX
290 MOVL AX, 4(SP)
291 MOVL $1, 8(SP)
Russ Cox68b42552010-11-04 14:00:19 -0400292 CALL runtime·i386_set_ldt(SB)
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800293
294 // compute segment selector - (entry*8+7)
295 SHLL $3, AX
296 ADDL $7, AX
297 MOVW AX, GS
298 RET
299
Russ Cox68b42552010-11-04 14:00:19 -0400300TEXT runtime·i386_set_ldt(SB),7,$16
Devon H. O'Dellb3f538a2009-11-17 23:58:51 -0800301 LEAL args+0(FP), AX // 0(FP) == 4(SP) before SP got moved
302 MOVL $0, 0(SP) // syscall gap
303 MOVL $1, 4(SP)
304 MOVL AX, 8(SP)
305 MOVL $165, AX
306 INT $0x80
307 CMPL AX, $0xfffff001
308 JLS 2(PC)
309 INT $3
310 RET
311
Devon H. O'Dell12bf0002012-01-10 17:39:17 +1100312TEXT runtime·sysctl(SB),7,$28
313 LEAL arg0+0(FP), SI
314 LEAL 4(SP), DI
315 CLD
316 MOVSL // arg 1 - name
317 MOVSL // arg 2 - namelen
318 MOVSL // arg 3 - oldp
319 MOVSL // arg 4 - oldlenp
320 MOVSL // arg 5 - newp
321 MOVSL // arg 6 - newlen
322 MOVL $202, AX // sys___sysctl
323 INT $0x80
324 JCC 3(PC)
325 NEGL AX
326 RET
327 MOVL $0, AX
328 RET
329
Devon H. O'Delldff55352012-02-21 07:32:20 +0900330TEXT runtime·osyield(SB),7,$-4
331 MOVL $331, AX // sys_sched_yield
332 INT $0x80
333 RET
Devon H. O'Dell12bf0002012-01-10 17:39:17 +1100334
Devon H. O'Dellb0891062012-02-22 15:44:09 +1100335TEXT runtime·sigprocmask(SB),7,$16
336 MOVL $0, 0(SP) // syscall gap
337 MOVL $3, 4(SP) // arg 1 - how (SIG_SETMASK)
338 MOVL args+0(FP), AX
339 MOVL AX, 8(SP) // arg 2 - set
340 MOVL args+4(FP), AX
341 MOVL AX, 12(SP) // arg 3 - oset
342 MOVL $340, AX // sys_sigprocmask
343 INT $0x80
344 JAE 2(PC)
Russ Cox36aa7d42012-03-08 14:03:56 -0500345 MOVL $0xf1, 0xf1 // crash
Devon H. O'Dellb0891062012-02-22 15:44:09 +1100346 RET
347
Mikio Harac5732c82013-05-20 19:25:32 +0900348// int32 runtime·kqueue(void);
349TEXT runtime·kqueue(SB),7,$0
350 MOVL $269, AX
351 INT $0x80
352 JAE 2(PC)
353 NEGL AX
354 RET
355
356// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout);
357TEXT runtime·kevent(SB),7,$0
358 MOVL $270, AX
359 INT $0x80
360 JAE 2(PC)
361 NEGL AX
362 RET
363
364// int32 runtime·closeonexec(int32 fd);
365TEXT runtime·closeonexec(SB),7,$32
366 MOVL $92, AX // fcntl
367 // 0(SP) is where the caller PC would be; kernel skips it
368 MOVL fd+0(FP), BX
369 MOVL BX, 4(SP) // fd
370 MOVL $2, 8(SP) // F_SETFD
371 MOVL $1, 12(SP) // FD_CLOEXEC
372 INT $0x80
373 JAE 2(PC)
374 NEGL AX
375 RET
376
Russ Cox68b42552010-11-04 14:00:19 -0400377GLOBL runtime·tlsoffset(SB),$4