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#include "textflag.h"
6#include "funcdata.h"
7
8//
9// System call support for 386, Plan 9
10//
11
12//func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err string)
13//func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err string)
14//func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
15//func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
16
17#define SYS_ERRSTR 41	/* from zsysnum_plan9.go */
18
19// Trap # in AX, args on stack above caller pc.
20TEXT	·Syscall(SB),NOSPLIT,$148-32
21	NO_LOCAL_POINTERS
22	CALL	runtime·entersyscall(SB)
23	MOVL	trap+0(FP), AX	// syscall entry
24	// copy args down
25	LEAL	a1+4(FP), SI
26	LEAL	sysargs-144(SP), DI
27	CLD
28	MOVSL
29	MOVSL
30	MOVSL
31	INT	$64
32	MOVL	AX, r1+16(FP)
33	MOVL	$0, r2+20(FP)
34	CMPL	AX, $-1
35	JNE	ok3
36
37	LEAL	errbuf-128(SP), AX
38	MOVL	AX, sysargs-144(SP)
39	MOVL	$128, sysargs1-140(SP)
40	MOVL	$SYS_ERRSTR, AX
41	INT	$64
42	CALL	runtime·exitsyscall(SB)
43	MOVL	sysargs-144(SP), AX
44	MOVL	AX, errbuf-148(SP)
45	CALL	runtime·gostring(SB)
46	LEAL	str-144(SP), SI
47	JMP	copyresult3
48
49ok3:
50	CALL	runtime·exitsyscall(SB)
51	LEAL	·emptystring(SB), SI
52
53copyresult3:
54	LEAL	err+24(FP), DI
55
56	CLD
57	MOVSL
58	MOVSL
59
60	RET
61
62TEXT	·Syscall6(SB),NOSPLIT,$148-44
63	NO_LOCAL_POINTERS
64	CALL	runtime·entersyscall(SB)
65	MOVL	trap+0(FP), AX	// syscall entry
66	// copy args down
67	LEAL	a1+4(FP), SI
68	LEAL	sysargs-144(SP), DI
69	CLD
70	MOVSL
71	MOVSL
72	MOVSL
73	MOVSL
74	MOVSL
75	MOVSL
76	INT	$64
77	MOVL	AX, r1+28(FP)
78	MOVL	$0, r2+32(FP)
79	CMPL	AX, $-1
80	JNE	ok4
81
82	LEAL	errbuf-128(SP), AX
83	MOVL	AX, sysargs-144(SP)
84	MOVL	$128, sysargs1-140(SP)
85	MOVL	$SYS_ERRSTR, AX
86	INT	$64
87	CALL	runtime·exitsyscall(SB)
88	MOVL	sysargs-144(SP), AX
89	MOVL	AX, errbuf-148(SP)
90	CALL	runtime·gostring(SB)
91	LEAL	str-144(SP), SI
92	JMP	copyresult4
93
94ok4:
95	CALL	runtime·exitsyscall(SB)
96	LEAL	·emptystring(SB), SI
97
98copyresult4:
99	LEAL	err+36(FP), DI
100
101	CLD
102	MOVSL
103	MOVSL
104
105	RET
106
107TEXT ·RawSyscall(SB),NOSPLIT,$0-28
108	MOVL	trap+0(FP), AX	// syscall entry
109	// slide args down on top of system call number
110	LEAL	a1+4(FP), SI
111	LEAL	trap+0(FP), DI
112	CLD
113	MOVSL
114	MOVSL
115	MOVSL
116	INT	$64
117	MOVL	AX, r1+16(FP)
118	MOVL	AX, r2+20(FP)
119	MOVL	AX, err+24(FP)
120	RET
121
122TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
123	MOVL	trap+0(FP), AX	// syscall entry
124	// slide args down on top of system call number
125	LEAL	a1+4(FP), SI
126	LEAL	trap+0(FP), DI
127	CLD
128	MOVSL
129	MOVSL
130	MOVSL
131	MOVSL
132	MOVSL
133	MOVSL
134	INT	$64
135	MOVL	AX, r1+28(FP)
136	MOVL	AX, r2+32(FP)
137	MOVL	AX, err+36(FP)
138	RET
139
140#define SYS_SEEK 39	/* from zsysnum_plan9.go */
141
142//func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string)
143TEXT ·seek(SB),NOSPLIT,$24-36
144	NO_LOCAL_POINTERS
145	LEAL	newoffset+20(FP), AX
146	MOVL	AX, placeholder+0(FP)
147
148	// copy args down
149	LEAL	placeholder+0(FP), SI
150	LEAL	sysargs-20(SP), DI
151	CLD
152	MOVSL
153	MOVSL
154	MOVSL
155	MOVSL
156	MOVSL
157	MOVL	$SYS_SEEK, AX	// syscall entry
158	INT	$64
159
160	CMPL	AX, $-1
161	JNE	ok6
162	MOVL	AX, newoffset_lo+20(FP)
163	MOVL	AX, newoffset_hi+24(FP)
164
165	CALL	syscall·errstr(SB)
166	MOVL	SP, SI
167	JMP	copyresult6
168
169ok6:
170	LEAL	·emptystring(SB), SI
171
172copyresult6:
173	LEAL	err+28(FP), DI
174
175	CLD
176	MOVSL
177	MOVSL
178	RET
179