1// Copyright 2022 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//
8// System calls for riscv64, FreeBSD
9//
10
11// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64)
12TEXT ·Syscall(SB),NOSPLIT,$0-56
13	CALL	runtime·entersyscall(SB)
14	MOV	a1+8(FP), A0
15	MOV	a2+16(FP), A1
16	MOV	a3+24(FP), A2
17	MOV	trap+0(FP), T0	// syscall entry
18	ECALL
19	BNE	T0, ZERO, err
20	MOV	A0, r1+32(FP)	// r1
21	MOV	A1, r2+40(FP)	// r2
22	MOV	ZERO, err+48(FP)	// errno
23	CALL	runtime·exitsyscall(SB)
24	RET
25err:
26	MOV	$-1, T0
27	MOV	T0, r1+32(FP)	// r1
28	MOV	ZERO, r2+40(FP)	// r2
29	MOV	A0, err+48(FP)	// errno
30	CALL	runtime·exitsyscall(SB)
31	RET
32
33
34// func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
35TEXT ·Syscall6(SB),NOSPLIT,$0-80
36	CALL	runtime·entersyscall(SB)
37	MOV	a1+8(FP), A0
38	MOV	a2+16(FP), A1
39	MOV	a3+24(FP), A2
40	MOV	a4+32(FP), A3
41	MOV	a5+40(FP), A4
42	MOV	a6+48(FP), A5
43	MOV	trap+0(FP), T0	// syscall entry
44	ECALL
45	BNE	T0, ZERO, err
46	MOV	A0, r1+56(FP)	// r1
47	MOV	A1, r2+64(FP)	// r2
48	MOV	ZERO, err+72(FP)	// errno
49	CALL	runtime·exitsyscall(SB)
50	RET
51err:
52	MOV	$-1, T0
53	MOV	T0, r1+56(FP)	// r1
54	MOV	ZERO, r2+64(FP)	// r2
55	MOV	A0, err+72(FP)	// errno
56	CALL	runtime·exitsyscall(SB)
57	RET
58
59// func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
60TEXT ·RawSyscall(SB),NOSPLIT,$0-56
61	MOV	a1+8(FP), A0
62	MOV	a2+16(FP), A1
63	MOV	a3+24(FP), A2
64	MOV	trap+0(FP), T0	// syscall entry
65	ECALL
66	BNE	T0, ZERO, err
67	MOV	A0, r1+32(FP)	// r1
68	MOV	A1, r2+40(FP)	// r2
69	MOV	ZERO, err+48(FP)	// errno
70	RET
71err:
72	MOV	$-1, T0
73	MOV	T0, r1+32(FP)	// r1
74	MOV	ZERO, r2+40(FP)	// r2
75	MOV	A0, err+48(FP)	// errno
76	RET
77
78// func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
79TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
80	MOV	a1+8(FP), A0
81	MOV	a2+16(FP), A1
82	MOV	a3+24(FP), A2
83	MOV	a4+32(FP), A3
84	MOV	a5+40(FP), A4
85	MOV	a6+48(FP), A5
86	MOV	trap+0(FP), T0	// syscall entry
87	ECALL
88	BNE	T0, ZERO, err
89	MOV	A0, r1+56(FP)	// r1
90	MOV	A1, r2+64(FP)	// r2
91	MOV	ZERO, err+72(FP)	// errno
92	RET
93err:
94	MOV	$-1, T0
95	MOV	T0, r1+56(FP)	// r1
96	MOV	ZERO, r2+64(FP)	// r2
97	MOV	A0, err+72(FP)	// errno
98	RET
99
100// Actually Syscall7
101// func Syscall9(num uintptr, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr)
102TEXT ·Syscall9(SB),NOSPLIT,$0-104
103	CALL	runtime·entersyscall(SB)
104	MOV	a1+8(FP), A0
105	MOV	a2+16(FP), A1
106	MOV	a3+24(FP), A2
107	MOV	a4+32(FP), A3
108	MOV	a5+40(FP), A4
109	MOV	a6+48(FP), A5
110	MOV	a7+56(FP), A6
111	MOV	num+0(FP), T0	// syscall entry
112	ECALL
113	BNE	T0, ZERO, err
114	MOV	A0, r1+80(FP)	// r1
115	MOV	A1, r2+88(FP)	// r2
116	MOV	ZERO, err+96(FP)	// errno
117	CALL	runtime·exitsyscall(SB)
118	RET
119err:
120	MOV	$-1, T0
121	MOV	T0, r1+80(FP)	// r1
122	MOV	ZERO, r2+88(FP)	// r2
123	MOV	A0, err+96(FP)	// errno
124	CALL	runtime·exitsyscall(SB)
125	RET
126