1// Copyright 2020 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
7// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
8TEXT ·Syscall(SB),NOSPLIT,$0-56
9	JAL	runtime·entersyscall(SB)
10	MOVV	a1+8(FP), R4
11	MOVV	a2+16(FP), R5
12	MOVV	a3+24(FP), R6
13	MOVV	R0, R7
14	MOVV	R0, R8
15	MOVV	R0, R9
16	MOVV	trap+0(FP), R2	// syscall entry
17	SYSCALL
18	BEQ	R7, ok
19	MOVV	$-1, R1
20	MOVV	R1, r1+32(FP)	// r1
21	MOVV	R0, r2+40(FP)	// r2
22	MOVV	R2, err+48(FP)	// errno
23	JAL	runtime·exitsyscall(SB)
24	RET
25ok:
26	MOVV	R2, r1+32(FP)	// r1
27	MOVV	R3, r2+40(FP)	// r2
28	MOVV	R0, err+48(FP)	// errno
29	JAL	runtime·exitsyscall(SB)
30	RET
31
32TEXT ·Syscall6(SB),NOSPLIT,$0-80
33	JAL	runtime·entersyscall(SB)
34	MOVV	a1+8(FP), R4
35	MOVV	a2+16(FP), R5
36	MOVV	a3+24(FP), R6
37	MOVV	a4+32(FP), R7
38	MOVV	a5+40(FP), R8
39	MOVV	a6+48(FP), R9
40	MOVV	trap+0(FP), R2	// syscall entry
41	SYSCALL
42	BEQ	R7, ok6
43	MOVV	$-1, R1
44	MOVV	R1, r1+56(FP)	// r1
45	MOVV	R0, r2+64(FP)	// r2
46	MOVV	R2, err+72(FP)	// errno
47	JAL	runtime·exitsyscall(SB)
48	RET
49ok6:
50	MOVV	R2, r1+56(FP)	// r1
51	MOVV	R3, r2+64(FP)	// r2
52	MOVV	R0, err+72(FP)	// errno
53	JAL	runtime·exitsyscall(SB)
54	RET
55
56// func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64);
57// The openbsd/mips64 kernel only accepts eight syscall arguments, except
58// for SYS_syscall, where an additional argument can be passed on the stack.
59TEXT	·Syscall9(SB),NOSPLIT,$0-104
60	JAL	runtime·entersyscall(SB)
61	MOVV	num+0(FP), R2	// syscall entry
62	MOVV	a1+8(FP), R4
63	MOVV	a2+16(FP), R5
64	MOVV	a3+24(FP), R6
65	MOVV	a4+32(FP), R7
66	MOVV	a5+40(FP), R8
67	MOVV	a6+48(FP), R9
68	MOVV	a7+56(FP), R10
69	MOVV	a8+64(FP), R11
70	MOVV	a9+72(FP), R12
71	SUBVU	$16, R29
72	MOVV	R12, 0(R29)	// arg 9 - only used for SYS_syscall.
73	SYSCALL
74	ADDV    $16, R29
75	BEQ	R7, ok9
76	MOVV	$-1, R1
77	MOVV	R1, r1+80(FP)	// r1
78	MOVV	R0, r2+88(FP)	// r2
79	MOVV	R2, err+96(FP)	// errno
80	JAL	runtime·exitsyscall(SB)
81	RET
82ok9:
83	MOVV	R2, r1+80(FP)	// r1
84	MOVV	R3, r2+88(FP)	// r2
85	MOVV	R0, err+96(FP)	// errno
86	CALL	runtime·exitsyscall(SB)
87	RET
88
89TEXT ·RawSyscall(SB),NOSPLIT,$0-56
90	MOVV	a1+8(FP), R4
91	MOVV	a2+16(FP), R5
92	MOVV	a3+24(FP), R6
93	MOVV	R0, R7
94	MOVV	R0, R8
95	MOVV	R0, R9
96	MOVV	trap+0(FP), R2	// syscall entry
97	SYSCALL
98	BEQ	R7, ok1
99	MOVV	$-1, R1
100	MOVV	R1, r1+32(FP)	// r1
101	MOVV	R0, r2+40(FP)	// r2
102	MOVV	R2, err+48(FP)	// errno
103	RET
104ok1:
105	MOVV	R2, r1+32(FP)	// r1
106	MOVV	R3, r2+40(FP)	// r2
107	MOVV	R0, err+48(FP)	// errno
108	RET
109
110TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
111	MOVV	a1+8(FP), R4
112	MOVV	a2+16(FP), R5
113	MOVV	a3+24(FP), R6
114	MOVV	a4+32(FP), R7
115	MOVV	a5+40(FP), R8
116	MOVV	a6+48(FP), R9
117	MOVV	trap+0(FP), R2	// syscall entry
118	SYSCALL
119	BEQ	R7, ok2
120	MOVV	$-1, R1
121	MOVV	R1, r1+56(FP)	// r1
122	MOVV	R0, r2+64(FP)	// r2
123	MOVV	R2, err+72(FP)	// errno
124	RET
125ok2:
126	MOVV	R2, r1+56(FP)	// r1
127	MOVV	R3, r2+64(FP)	// r2
128	MOVV	R0, err+72(FP)	// errno
129	RET
130