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