1// Copyright 2016 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 s390x, Linux
9//
10
11// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64)
12TEXT ·Syscall(SB),NOSPLIT,$0-56
13	BL	runtime·entersyscall(SB)
14	MOVD	a1+8(FP), R2
15	MOVD	a2+16(FP), R3
16	MOVD	a3+24(FP), R4
17	MOVD	$0, R5
18	MOVD	$0, R6
19	MOVD	$0, R7
20	MOVD	trap+0(FP), R1	// syscall entry
21	SYSCALL
22	MOVD	$0xfffffffffffff001, R8
23	CMPUBLT	R2, R8, ok
24	MOVD	$-1, r1+32(FP)
25	MOVD	$0, r2+40(FP)
26	NEG	R2, R2
27	MOVD	R2, err+48(FP)	// errno
28	BL	runtime·exitsyscall(SB)
29	RET
30ok:
31	MOVD	R2, r1+32(FP)
32	MOVD	R3, r2+40(FP)
33	MOVD	$0, err+48(FP)	// errno
34	BL	runtime·exitsyscall(SB)
35	RET
36
37// func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
38TEXT ·Syscall6(SB),NOSPLIT,$0-80
39	BL	runtime·entersyscall(SB)
40	MOVD	a1+8(FP), R2
41	MOVD	a2+16(FP), R3
42	MOVD	a3+24(FP), R4
43	MOVD	a4+32(FP), R5
44	MOVD	a5+40(FP), R6
45	MOVD	a6+48(FP), R7
46	MOVD	trap+0(FP), R1	// syscall entry
47	SYSCALL
48	MOVD	$0xfffffffffffff001, R8
49	CMPUBLT	R2, R8, ok6
50	MOVD	$-1, r1+56(FP)
51	MOVD	$0, r2+64(FP)
52	NEG	R2, R2
53	MOVD	R2, err+72(FP)	// errno
54	BL	runtime·exitsyscall(SB)
55	RET
56ok6:
57	MOVD	R2, r1+56(FP)
58	MOVD	R3, r2+64(FP)
59	MOVD	$0, err+72(FP)	// errno
60	BL	runtime·exitsyscall(SB)
61	RET
62
63// func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
64TEXT ·RawSyscall(SB),NOSPLIT,$0-56
65	MOVD	a1+8(FP), R2
66	MOVD	a2+16(FP), R3
67	MOVD	a3+24(FP), R4
68	MOVD	$0, R5
69	MOVD	$0, R6
70	MOVD	$0, R7
71	MOVD	trap+0(FP), R1	// syscall entry
72	SYSCALL
73	MOVD	$0xfffffffffffff001, R8
74	CMPUBLT	R2, R8, ok1
75	MOVD	$-1, r1+32(FP)
76	MOVD	$0, r2+40(FP)
77	NEG	R2, R2
78	MOVD	R2, err+48(FP)	// errno
79	RET
80ok1:
81	MOVD	R2, r1+32(FP)
82	MOVD	R3, r2+40(FP)
83	MOVD	$0, err+48(FP)	// errno
84	RET
85
86// func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
87TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
88	MOVD	a1+8(FP), R2
89	MOVD	a2+16(FP), R3
90	MOVD	a3+24(FP), R4
91	MOVD	a4+32(FP), R5
92	MOVD	a5+40(FP), R6
93	MOVD	a6+48(FP), R7
94	MOVD	trap+0(FP), R1	// syscall entry
95	SYSCALL
96	MOVD	$0xfffffffffffff001, R8
97	CMPUBLT	R2, R8, ok2
98	MOVD	$-1, r1+56(FP)
99	MOVD	$0, r2+64(FP)
100	NEG	R2, R2
101	MOVD	R2, err+72(FP)	// errno
102	RET
103ok2:
104	MOVD	R2, r1+56(FP)
105	MOVD	R3, r2+64(FP)
106	MOVD	$0, err+72(FP)	// errno
107	RET
108
109// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
110TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
111	MOVD	$0, R2
112	MOVD	a1+8(FP), R3
113	MOVD	$0, R4
114	MOVD	$0, R5
115	MOVD	$0, R6
116	MOVD	$0, R7
117	MOVD	trap+0(FP), R1	// syscall entry
118	SYSCALL
119	MOVD	$0xfffffffffffff001, R8
120	CMPUBLT	R2, R8, ok2
121	MOVD	$-1, r1+16(FP)
122	NEG	R2, R2
123	MOVD	R2, err+24(FP)	// errno
124	RET
125ok2:
126	MOVD	R2, r1+16(FP)
127	MOVD	$0, err+24(FP)	// errno
128	RET
129
130// func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr)
131TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48
132	MOVD	a1+8(FP), R2
133	MOVD	a2+16(FP), R3
134	MOVD	a3+24(FP), R4
135	MOVD	$0, R5
136	MOVD	$0, R6
137	MOVD	$0, R7
138	MOVD	trap+0(FP), R1	// syscall entry
139	SYSCALL
140	MOVD	R2, r1+32(FP)
141	MOVD	R3, r2+40(FP)
142	RET
143
144#define SYS_SOCKETCALL 102	/* from zsysnum_linux_s390x.go */
145
146// func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err int)
147// Kernel interface gets call sub-number and pointer to a0.
148TEXT ·socketcall(SB),NOSPLIT,$0-72
149	BL	runtime·entersyscall(SB)
150	MOVD	$SYS_SOCKETCALL, R1	// syscall entry
151	MOVD	call+0(FP), R2		// socket call number
152	MOVD	$a0+8(FP), R3		// pointer to call arguments
153	MOVD	$0, R4
154	MOVD	$0, R5
155	MOVD	$0, R6
156	MOVD	$0, R7
157	SYSCALL
158	MOVD	$0xfffffffffffff001, R8
159	CMPUBLT	R2, R8, oksock
160	MOVD	$-1, n+56(FP)
161	NEG	R2, R2
162	MOVD	R2, err+64(FP)
163	BL	runtime·exitsyscall(SB)
164	RET
165oksock:
166	MOVD	R2, n+56(FP)
167	MOVD	$0, err+64(FP)
168	CALL	runtime·exitsyscall(SB)
169	RET
170
171// func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err int)
172// Kernel interface gets call sub-number and pointer to a0.
173TEXT ·rawsocketcall(SB),NOSPLIT,$0-72
174	MOVD	$SYS_SOCKETCALL, R1	// syscall entry
175	MOVD	call+0(FP), R2		// socket call number
176	MOVD	$a0+8(FP), R3		// pointer to call arguments
177	MOVD	$0, R4
178	MOVD	$0, R5
179	MOVD	$0, R6
180	MOVD	$0, R7
181	SYSCALL
182	MOVD	$0xfffffffffffff001, R8
183	CMPUBLT	R2, R8, oksock1
184	MOVD	$-1, n+56(FP)
185	NEG	R2, R2
186	MOVD	R2, err+64(FP)
187	RET
188oksock1:
189	MOVD	R2, n+56(FP)
190	MOVD	$0, err+64(FP)
191	RET
192