1// +build netbsd freebsd openbsd
2
3// Copyright 2009 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7#include "textflag.h"
8#include "funcdata.h"
9
10//
11// System call support for some 386 unixes
12//
13
14// func Syscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32);
15// func Syscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32);
16// Trap # in AX, args on stack above caller pc.
17
18TEXT	·Syscall(SB),NOSPLIT,$0-28
19	CALL	runtime·entersyscall(SB)
20	MOVL	trap+0(FP), AX	// syscall entry
21	// slide args down on top of system call number
22	LEAL		a1+4(FP), SI
23	LEAL		trap+0(FP), DI
24	CLD
25	MOVSL
26	MOVSL
27	MOVSL
28	INT	$0x80
29	JAE	ok
30	MOVL	$-1, r1+16(FP)	// r1
31	MOVL	$-1, r2+20(FP)	// r2
32	MOVL	AX, err+24(FP)	// errno
33	CALL	runtime·exitsyscall(SB)
34	RET
35ok:
36	MOVL	AX, r1+16(FP)	// r1
37	MOVL	DX, r2+20(FP)	// r2
38	MOVL	$0, err+24(FP)	// errno
39	CALL	runtime·exitsyscall(SB)
40	RET
41
42TEXT	·Syscall6(SB),NOSPLIT,$0-40
43	CALL	runtime·entersyscall(SB)
44	MOVL	trap+0(FP), AX	// syscall entry
45	// slide args down on top of system call number
46	LEAL		a1+4(FP), SI
47	LEAL		trap+0(FP), DI
48	CLD
49	MOVSL
50	MOVSL
51	MOVSL
52	MOVSL
53	MOVSL
54	MOVSL
55	INT	$0x80
56	JAE	ok6
57	MOVL	$-1, r1+28(FP)	// r1
58	MOVL	$-1, r2+32(FP)	// r2
59	MOVL	AX, err+36(FP)	// errno
60	CALL	runtime·exitsyscall(SB)
61	RET
62ok6:
63	MOVL	AX, r1+28(FP)	// r1
64	MOVL	DX, r2+32(FP)	// r2
65	MOVL	$0, err+36(FP)	// errno
66	CALL	runtime·exitsyscall(SB)
67	RET
68
69TEXT	·Syscall9(SB),NOSPLIT,$0-52
70	CALL	runtime·entersyscall(SB)
71	MOVL	num+0(FP), AX	// syscall entry
72	// slide args down on top of system call number
73	LEAL		a1+4(FP), SI
74	LEAL		num+0(FP), DI
75	CLD
76	MOVSL
77	MOVSL
78	MOVSL
79	MOVSL
80	MOVSL
81	MOVSL
82	MOVSL
83	MOVSL
84	MOVSL
85	INT	$0x80
86	JAE	ok9
87	MOVL	$-1, r1+40(FP)	// r1
88	MOVL	$-1, r2+44(FP)	// r2
89	MOVL	AX, err+48(FP)	// errno
90	CALL	runtime·exitsyscall(SB)
91	RET
92ok9:
93	MOVL	AX, r1+40(FP)	// r1
94	MOVL	DX, r2+44(FP)	// r2
95	MOVL	$0, err+48(FP)	// errno
96	CALL	runtime·exitsyscall(SB)
97	RET
98
99TEXT ·RawSyscall(SB),NOSPLIT,$0-28
100	MOVL	trap+0(FP), AX	// syscall entry
101	// slide args down on top of system call number
102	LEAL		a1+4(FP), SI
103	LEAL		trap+0(FP), DI
104	CLD
105	MOVSL
106	MOVSL
107	MOVSL
108	INT	$0x80
109	JAE	ok1
110	MOVL	$-1, r1+16(FP)	// r1
111	MOVL	$-1, r2+20(FP)	// r2
112	MOVL	AX, err+24(FP)	// errno
113	RET
114ok1:
115	MOVL	AX, r1+16(FP)	// r1
116	MOVL	DX, r2+20(FP)	// r2
117	MOVL	$0, err+24(FP)	// errno
118	RET
119
120TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
121	MOVL	trap+0(FP), AX	// syscall entry
122	// slide args down on top of system call number
123	LEAL		a1+4(FP), SI
124	LEAL		trap+0(FP), DI
125	CLD
126	MOVSL
127	MOVSL
128	MOVSL
129	MOVSL
130	MOVSL
131	MOVSL
132	INT	$0x80
133	JAE	ok2
134	MOVL	$-1, r1+28(FP)	// r1
135	MOVL	$-1, r2+32(FP)	// r2
136	MOVL	AX, err+36(FP)	// errno
137	RET
138ok2:
139	MOVL	AX, r1+28(FP)	// r1
140	MOVL	DX, r2+32(FP)	// r2
141	MOVL	$0, err+36(FP)	// errno
142	RET
143