1// Copyright 2010 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 "go_asm.h"
6#include "go_tls.h"
7#include "textflag.h"
8
9TEXT runtime·open(SB),NOSPLIT,$0
10	MOVQ	$14, BP
11	SYSCALL
12	MOVL	AX, ret+16(FP)
13	RET
14
15TEXT runtime·pread(SB),NOSPLIT,$0
16	MOVQ	$50, BP
17	SYSCALL
18	MOVL	AX, ret+32(FP)
19	RET
20
21TEXT runtime·pwrite(SB),NOSPLIT,$0
22	MOVQ	$51, BP
23	SYSCALL
24	MOVL	AX, ret+32(FP)
25	RET
26
27// int32 _seek(int64*, int32, int64, int32)
28TEXT _seek<>(SB),NOSPLIT,$0
29	MOVQ	$39, BP
30	SYSCALL
31	RET
32
33// int64 seek(int32, int64, int32)
34// Convenience wrapper around _seek, the actual system call.
35TEXT runtime·seek(SB),NOSPLIT,$32
36	LEAQ	ret+24(FP), AX
37	MOVL	fd+0(FP), BX
38	MOVQ	offset+8(FP), CX
39	MOVL	whence+16(FP), DX
40	MOVQ	AX, 0(SP)
41	MOVL	BX, 8(SP)
42	MOVQ	CX, 16(SP)
43	MOVL	DX, 24(SP)
44	CALL	_seek<>(SB)
45	CMPL	AX, $0
46	JGE	2(PC)
47	MOVQ	$-1, ret+24(FP)
48	RET
49
50TEXT runtime·closefd(SB),NOSPLIT,$0
51	MOVQ	$4, BP
52	SYSCALL
53	MOVL	AX, ret+8(FP)
54	RET
55
56TEXT runtime·exits(SB),NOSPLIT,$0
57	MOVQ	$8, BP
58	SYSCALL
59	RET
60
61TEXT runtime·brk_(SB),NOSPLIT,$0
62	MOVQ	$24, BP
63	SYSCALL
64	MOVL	AX, ret+8(FP)
65	RET
66
67TEXT runtime·sleep(SB),NOSPLIT,$0
68	MOVQ	$17, BP
69	SYSCALL
70	MOVL	AX, ret+8(FP)
71	RET
72
73TEXT runtime·plan9_semacquire(SB),NOSPLIT,$0
74	MOVQ	$37, BP
75	SYSCALL
76	MOVL	AX, ret+16(FP)
77	RET
78
79TEXT runtime·plan9_tsemacquire(SB),NOSPLIT,$0
80	MOVQ	$52, BP
81	SYSCALL
82	MOVL	AX, ret+16(FP)
83	RET
84
85TEXT runtime·nsec(SB),NOSPLIT,$0
86	MOVQ	$53, BP
87	SYSCALL
88	MOVQ	AX, ret+8(FP)
89	RET
90
91// func walltime() (sec int64, nsec int32)
92TEXT runtime·walltime(SB),NOSPLIT,$8-12
93	CALL	runtime·nanotime1(SB)
94	MOVQ	0(SP), AX
95
96	// generated code for
97	//	func f(x uint64) (uint64, uint64) { return x/1000000000, x%1000000000 }
98	// adapted to reduce duplication
99	MOVQ	AX, CX
100	MOVQ	$1360296554856532783, AX
101	MULQ	CX
102	ADDQ	CX, DX
103	RCRQ	$1, DX
104	SHRQ	$29, DX
105	MOVQ	DX, sec+0(FP)
106	IMULQ	$1000000000, DX
107	SUBQ	DX, CX
108	MOVL	CX, nsec+8(FP)
109	RET
110
111TEXT runtime·notify(SB),NOSPLIT,$0
112	MOVQ	$28, BP
113	SYSCALL
114	MOVL	AX, ret+8(FP)
115	RET
116
117TEXT runtime·noted(SB),NOSPLIT,$0
118	MOVQ	$29, BP
119	SYSCALL
120	MOVL	AX, ret+8(FP)
121	RET
122
123TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0
124	MOVQ	$38, BP
125	SYSCALL
126	MOVL	AX, ret+16(FP)
127	RET
128
129TEXT runtime·rfork(SB),NOSPLIT,$0
130	MOVQ	$19, BP
131	SYSCALL
132	MOVL	AX, ret+8(FP)
133	RET
134
135TEXT runtime·tstart_plan9(SB),NOSPLIT,$8
136	MOVQ	newm+0(FP), CX
137	MOVQ	m_g0(CX), DX
138
139	// Layout new m scheduler stack on os stack.
140	MOVQ	SP, AX
141	MOVQ	AX, (g_stack+stack_hi)(DX)
142	SUBQ	$(64*1024), AX		// stack size
143	MOVQ	AX, (g_stack+stack_lo)(DX)
144	MOVQ	AX, g_stackguard0(DX)
145	MOVQ	AX, g_stackguard1(DX)
146
147	// Initialize procid from TOS struct.
148	MOVQ	_tos(SB), AX
149	MOVL	64(AX), AX
150	MOVQ	AX, m_procid(CX)	// save pid as m->procid
151
152	// Finally, initialize g.
153	get_tls(BX)
154	MOVQ	DX, g(BX)
155
156	CALL	runtime·stackcheck(SB)	// smashes AX, CX
157	CALL	runtime·mstart(SB)
158
159	// Exit the thread.
160	MOVQ	$0, 0(SP)
161	CALL	runtime·exits(SB)
162	JMP	0(PC)
163
164// This is needed by asm_amd64.s
165TEXT runtime·settls(SB),NOSPLIT,$0
166	RET
167
168// void sigtramp(void *ureg, int8 *note)
169TEXT runtime·sigtramp(SB),NOSPLIT|NOFRAME,$0
170	get_tls(AX)
171
172	// check that g exists
173	MOVQ	g(AX), BX
174	CMPQ	BX, $0
175	JNE	3(PC)
176	CALL	runtime·badsignal2(SB) // will exit
177	RET
178
179	// save args
180	MOVQ	ureg+0(FP), CX
181	MOVQ	note+8(FP), DX
182
183	// change stack
184	MOVQ	g_m(BX), BX
185	MOVQ	m_gsignal(BX), R10
186	MOVQ	(g_stack+stack_hi)(R10), BP
187	MOVQ	BP, SP
188
189	// make room for args and g
190	SUBQ	$128, SP
191
192	// save g
193	MOVQ	g(AX), BP
194	MOVQ	BP, 32(SP)
195
196	// g = m->gsignal
197	MOVQ	R10, g(AX)
198
199	// load args and call sighandler
200	MOVQ	CX, 0(SP)
201	MOVQ	DX, 8(SP)
202	MOVQ	BP, 16(SP)
203
204	CALL	runtime·sighandler(SB)
205	MOVL	24(SP), AX
206
207	// restore g
208	get_tls(BX)
209	MOVQ	32(SP), R10
210	MOVQ	R10, g(BX)
211
212	// call noted(AX)
213	MOVQ	AX, 0(SP)
214	CALL	runtime·noted(SB)
215	RET
216
217TEXT runtime·setfpmasks(SB),NOSPLIT,$8
218	STMXCSR	0(SP)
219	MOVL	0(SP), AX
220	ANDL	$~0x3F, AX
221	ORL	$(0x3F<<7), AX
222	MOVL	AX, 0(SP)
223	LDMXCSR	0(SP)
224	RET
225
226#define ERRMAX 128	/* from os_plan9.h */
227
228// void errstr(int8 *buf, int32 len)
229TEXT errstr<>(SB),NOSPLIT,$0
230	MOVQ    $41, BP
231	SYSCALL
232	RET
233
234// func errstr() string
235// Only used by package syscall.
236// Grab error string due to a syscall made
237// in entersyscall mode, without going
238// through the allocator (issue 4994).
239// See ../syscall/asm_plan9_amd64.s:/·Syscall/
240TEXT runtime·errstr(SB),NOSPLIT,$16-16
241	get_tls(AX)
242	MOVQ	g(AX), BX
243	MOVQ	g_m(BX), BX
244	MOVQ	(m_mOS+mOS_errstr)(BX), CX
245	MOVQ	CX, 0(SP)
246	MOVQ	$ERRMAX, 8(SP)
247	CALL	errstr<>(SB)
248	CALL	runtime·findnull(SB)
249	MOVQ	8(SP), AX
250	MOVQ	AX, ret_len+8(FP)
251	MOVQ	0(SP), AX
252	MOVQ	AX, ret_base+0(FP)
253	RET
254
255// never called on this platform
256TEXT ·sigpanictramp(SB),NOSPLIT,$0-0
257	UNDEF
258