1// Copyright 2013 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 ARM, OpenBSD
10//
11
12// func Syscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32);
13// func Syscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32);
14// func Syscall9(trap int32, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int32)
15// func RawSyscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32);
16// func RawSyscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32);
17
18TEXT	·Syscall(SB),NOSPLIT,$0-28
19	BL runtime·entersyscall(SB)
20	MOVW trap+0(FP), R12		// syscall number
21	MOVW a1+4(FP), R0		// arg 1
22	MOVW a2+8(FP), R1		// arg 2
23	MOVW a3+12(FP), R2		// arg 3
24	SWI $0
25	MOVW $0, R2
26	BCS error
27	MOVW R0, r1+16(FP)		// ret 1
28	MOVW R1, r2+20(FP)		// ret 2
29	MOVW R2, err+24(FP)		// err
30	BL runtime·exitsyscall(SB)
31	RET
32error:
33	MOVW $-1, R3
34	MOVW R3, r1+16(FP)		// ret 1
35	MOVW R2, r2+20(FP)		// ret 2
36	MOVW R0, err+24(FP)		// err
37	BL runtime·exitsyscall(SB)
38	RET
39
40TEXT	·Syscall6(SB),NOSPLIT,$0-40
41	BL runtime·entersyscall(SB)
42	MOVW trap+0(FP), R12		// syscall number
43	MOVW a1+4(FP), R0		// arg 1
44	MOVW a2+8(FP), R1		// arg 2
45	MOVW a3+12(FP), R2		// arg 3
46	MOVW a4+16(FP), R3		// arg 4
47	MOVW R13, R4
48	MOVW $a5+20(FP), R13		// arg 5 to arg 6 are passed on stack
49	SWI $0
50	MOVW R4, R13
51	MOVW $0, R2
52	BCS error6
53	MOVW R0, r1+28(FP)		// ret 1
54	MOVW R1, r2+32(FP)		// ret 2
55	MOVW R2, err+36(FP)		// err
56	BL runtime·exitsyscall(SB)
57	RET
58error6:
59	MOVW $-1, R3
60	MOVW R3, r1+28(FP)		// ret 1
61	MOVW R2, r2+32(FP)		// ret 2
62	MOVW R0, err+36(FP)		// err
63	BL runtime·exitsyscall(SB)
64	RET
65
66TEXT	·Syscall9(SB),NOSPLIT,$0-52
67	BL runtime·entersyscall(SB)
68	MOVW num+0(FP), R12		// syscall number
69	MOVW a1+4(FP), R0		// arg 1
70	MOVW a2+8(FP), R1		// arg 2
71	MOVW a3+12(FP), R2		// arg 3
72	MOVW a4+16(FP), R3		// arg 4
73	MOVW R13, R4
74	MOVW $a5+20(FP), R13		// arg 5 to arg 9 are passed on stack
75	SWI $0
76	MOVW R4, R13
77	MOVW $0, R2
78	BCS error9
79	MOVW R0, r1+40(FP)		// ret 1
80	MOVW R1, r2+44(FP)		// ret 2
81	MOVW R2, err+48(FP)		// err
82	BL runtime·exitsyscall(SB)
83	RET
84error9:
85	MOVW $-1, R3
86	MOVW R3, r1+40(FP)		// ret 1
87	MOVW R2, r2+44(FP)		// ret 2
88	MOVW R0, err+48(FP)		// err
89	BL runtime·exitsyscall(SB)
90	RET
91
92TEXT	·RawSyscall(SB),NOSPLIT,$0-28
93	MOVW trap+0(FP), R12		// syscall number
94	MOVW a1+4(FP), R0		// arg 1
95	MOVW a2+8(FP), R1		// arg 2
96	MOVW a3+12(FP), R2		// arg 3
97	SWI $0
98	MOVW $0, R2
99	BCS errorr
100	MOVW R0, r1+16(FP)		// ret 1
101	MOVW R1, r2+20(FP)		// ret 2
102	MOVW R2, err+24(FP)		// err
103	RET
104errorr:
105	MOVW $-1, R3
106	MOVW R3, r1+16(FP)		// ret 1
107	MOVW R2, r2+20(FP)		// ret 2
108	MOVW R0, err+24(FP)		// err
109	RET
110
111TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
112	MOVW trap+0(FP), R12		// syscall number
113	MOVW a1+4(FP), R0		// arg 1
114	MOVW a2+8(FP), R1		// arg 2
115	MOVW a3+12(FP), R2		// arg 3
116	MOVW a4+16(FP), R3		// arg 4
117	MOVW R13, R4
118	MOVW $a5+20(FP), R13		// arg 5 to arg 6 are passed on stack
119	SWI $0
120	MOVW R4, R13
121	MOVW $0, R2
122	BCS errorr6
123	MOVW R0, r1+28(FP)		// ret 1
124	MOVW R1, r2+32(FP)		// ret 2
125	MOVW R2, err+36(FP)		// err
126	RET
127errorr6:
128	MOVW $-1, R3
129	MOVW R3, r1+28(FP)		// ret 1
130	MOVW R2, r2+32(FP)		// ret 2
131	MOVW R0, err+36(FP)		// err
132	RET
133