cubefs
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//go:build zos && s390x && gc
6// +build zos
7// +build s390x
8// +build gc
9
10#include "textflag.h"
11
12#define PSALAA 1208(R0)
13#define GTAB64(x) 80(x)
14#define LCA64(x) 88(x)
15#define CAA(x) 8(x)
16#define EDCHPXV(x) 1016(x) // in the CAA
17#define SAVSTACK_ASYNC(x) 336(x) // in the LCA
18
19// SS_*, where x=SAVSTACK_ASYNC
20#define SS_LE(x) 0(x)
21#define SS_GO(x) 8(x)
22#define SS_ERRNO(x) 16(x)
23#define SS_ERRNOJR(x) 20(x)
24
25#define LE_CALL BYTE $0x0D; BYTE $0x76; // BL R7, R6
26
27TEXT ·clearErrno(SB),NOSPLIT,$0-0
28BL addrerrno<>(SB)
29MOVD $0, 0(R3)
30RET
31
32// Returns the address of errno in R3.
33TEXT addrerrno<>(SB),NOSPLIT|NOFRAME,$0-0
34// Get library control area (LCA).
35MOVW PSALAA, R8
36MOVD LCA64(R8), R8
37
38// Get __errno FuncDesc.
39MOVD CAA(R8), R9
40MOVD EDCHPXV(R9), R9
41ADD $(0x156*16), R9
42LMG 0(R9), R5, R6
43
44// Switch to saved LE stack.
45MOVD SAVSTACK_ASYNC(R8), R9
46MOVD 0(R9), R4
47MOVD $0, 0(R9)
48
49// Call __errno function.
50LE_CALL
51NOPH
52
53// Switch back to Go stack.
54XOR R0, R0 // Restore R0 to $0.
55MOVD R4, 0(R9) // Save stack pointer.
56RET
57
58TEXT ·syscall_syscall(SB),NOSPLIT,$0-56
59BL runtime·entersyscall(SB)
60MOVD a1+8(FP), R1
61MOVD a2+16(FP), R2
62MOVD a3+24(FP), R3
63
64// Get library control area (LCA).
65MOVW PSALAA, R8
66MOVD LCA64(R8), R8
67
68// Get function.
69MOVD CAA(R8), R9
70MOVD EDCHPXV(R9), R9
71MOVD trap+0(FP), R5
72SLD $4, R5
73ADD R5, R9
74LMG 0(R9), R5, R6
75
76// Restore LE stack.
77MOVD SAVSTACK_ASYNC(R8), R9
78MOVD 0(R9), R4
79MOVD $0, 0(R9)
80
81// Call function.
82LE_CALL
83NOPH
84XOR R0, R0 // Restore R0 to $0.
85MOVD R4, 0(R9) // Save stack pointer.
86
87MOVD R3, r1+32(FP)
88MOVD R0, r2+40(FP)
89MOVD R0, err+48(FP)
90MOVW R3, R4
91CMP R4, $-1
92BNE done
93BL addrerrno<>(SB)
94MOVWZ 0(R3), R3
95MOVD R3, err+48(FP)
96done:
97BL runtime·exitsyscall(SB)
98RET
99
100TEXT ·syscall_rawsyscall(SB),NOSPLIT,$0-56
101MOVD a1+8(FP), R1
102MOVD a2+16(FP), R2
103MOVD a3+24(FP), R3
104
105// Get library control area (LCA).
106MOVW PSALAA, R8
107MOVD LCA64(R8), R8
108
109// Get function.
110MOVD CAA(R8), R9
111MOVD EDCHPXV(R9), R9
112MOVD trap+0(FP), R5
113SLD $4, R5
114ADD R5, R9
115LMG 0(R9), R5, R6
116
117// Restore LE stack.
118MOVD SAVSTACK_ASYNC(R8), R9
119MOVD 0(R9), R4
120MOVD $0, 0(R9)
121
122// Call function.
123LE_CALL
124NOPH
125XOR R0, R0 // Restore R0 to $0.
126MOVD R4, 0(R9) // Save stack pointer.
127
128MOVD R3, r1+32(FP)
129MOVD R0, r2+40(FP)
130MOVD R0, err+48(FP)
131MOVW R3, R4
132CMP R4, $-1
133BNE done
134BL addrerrno<>(SB)
135MOVWZ 0(R3), R3
136MOVD R3, err+48(FP)
137done:
138RET
139
140TEXT ·syscall_syscall6(SB),NOSPLIT,$0-80
141BL runtime·entersyscall(SB)
142MOVD a1+8(FP), R1
143MOVD a2+16(FP), R2
144MOVD a3+24(FP), R3
145
146// Get library control area (LCA).
147MOVW PSALAA, R8
148MOVD LCA64(R8), R8
149
150// Get function.
151MOVD CAA(R8), R9
152MOVD EDCHPXV(R9), R9
153MOVD trap+0(FP), R5
154SLD $4, R5
155ADD R5, R9
156LMG 0(R9), R5, R6
157
158// Restore LE stack.
159MOVD SAVSTACK_ASYNC(R8), R9
160MOVD 0(R9), R4
161MOVD $0, 0(R9)
162
163// Fill in parameter list.
164MOVD a4+32(FP), R12
165MOVD R12, (2176+24)(R4)
166MOVD a5+40(FP), R12
167MOVD R12, (2176+32)(R4)
168MOVD a6+48(FP), R12
169MOVD R12, (2176+40)(R4)
170
171// Call function.
172LE_CALL
173NOPH
174XOR R0, R0 // Restore R0 to $0.
175MOVD R4, 0(R9) // Save stack pointer.
176
177MOVD R3, r1+56(FP)
178MOVD R0, r2+64(FP)
179MOVD R0, err+72(FP)
180MOVW R3, R4
181CMP R4, $-1
182BNE done
183BL addrerrno<>(SB)
184MOVWZ 0(R3), R3
185MOVD R3, err+72(FP)
186done:
187BL runtime·exitsyscall(SB)
188RET
189
190TEXT ·syscall_rawsyscall6(SB),NOSPLIT,$0-80
191MOVD a1+8(FP), R1
192MOVD a2+16(FP), R2
193MOVD a3+24(FP), R3
194
195// Get library control area (LCA).
196MOVW PSALAA, R8
197MOVD LCA64(R8), R8
198
199// Get function.
200MOVD CAA(R8), R9
201MOVD EDCHPXV(R9), R9
202MOVD trap+0(FP), R5
203SLD $4, R5
204ADD R5, R9
205LMG 0(R9), R5, R6
206
207// Restore LE stack.
208MOVD SAVSTACK_ASYNC(R8), R9
209MOVD 0(R9), R4
210MOVD $0, 0(R9)
211
212// Fill in parameter list.
213MOVD a4+32(FP), R12
214MOVD R12, (2176+24)(R4)
215MOVD a5+40(FP), R12
216MOVD R12, (2176+32)(R4)
217MOVD a6+48(FP), R12
218MOVD R12, (2176+40)(R4)
219
220// Call function.
221LE_CALL
222NOPH
223XOR R0, R0 // Restore R0 to $0.
224MOVD R4, 0(R9) // Save stack pointer.
225
226MOVD R3, r1+56(FP)
227MOVD R0, r2+64(FP)
228MOVD R0, err+72(FP)
229MOVW R3, R4
230CMP R4, $-1
231BNE done
232BL ·rrno<>(SB)
233MOVWZ 0(R3), R3
234MOVD R3, err+72(FP)
235done:
236RET
237
238TEXT ·syscall_syscall9(SB),NOSPLIT,$0
239BL runtime·entersyscall(SB)
240MOVD a1+8(FP), R1
241MOVD a2+16(FP), R2
242MOVD a3+24(FP), R3
243
244// Get library control area (LCA).
245MOVW PSALAA, R8
246MOVD LCA64(R8), R8
247
248// Get function.
249MOVD CAA(R8), R9
250MOVD EDCHPXV(R9), R9
251MOVD trap+0(FP), R5
252SLD $4, R5
253ADD R5, R9
254LMG 0(R9), R5, R6
255
256// Restore LE stack.
257MOVD SAVSTACK_ASYNC(R8), R9
258MOVD 0(R9), R4
259MOVD $0, 0(R9)
260
261// Fill in parameter list.
262MOVD a4+32(FP), R12
263MOVD R12, (2176+24)(R4)
264MOVD a5+40(FP), R12
265MOVD R12, (2176+32)(R4)
266MOVD a6+48(FP), R12
267MOVD R12, (2176+40)(R4)
268MOVD a7+56(FP), R12
269MOVD R12, (2176+48)(R4)
270MOVD a8+64(FP), R12
271MOVD R12, (2176+56)(R4)
272MOVD a9+72(FP), R12
273MOVD R12, (2176+64)(R4)
274
275// Call function.
276LE_CALL
277NOPH
278XOR R0, R0 // Restore R0 to $0.
279MOVD R4, 0(R9) // Save stack pointer.
280
281MOVD R3, r1+80(FP)
282MOVD R0, r2+88(FP)
283MOVD R0, err+96(FP)
284MOVW R3, R4
285CMP R4, $-1
286BNE done
287BL addrerrno<>(SB)
288MOVWZ 0(R3), R3
289MOVD R3, err+96(FP)
290done:
291BL runtime·exitsyscall(SB)
292RET
293
294TEXT ·syscall_rawsyscall9(SB),NOSPLIT,$0
295MOVD a1+8(FP), R1
296MOVD a2+16(FP), R2
297MOVD a3+24(FP), R3
298
299// Get library control area (LCA).
300MOVW PSALAA, R8
301MOVD LCA64(R8), R8
302
303// Get function.
304MOVD CAA(R8), R9
305MOVD EDCHPXV(R9), R9
306MOVD trap+0(FP), R5
307SLD $4, R5
308ADD R5, R9
309LMG 0(R9), R5, R6
310
311// Restore LE stack.
312MOVD SAVSTACK_ASYNC(R8), R9
313MOVD 0(R9), R4
314MOVD $0, 0(R9)
315
316// Fill in parameter list.
317MOVD a4+32(FP), R12
318MOVD R12, (2176+24)(R4)
319MOVD a5+40(FP), R12
320MOVD R12, (2176+32)(R4)
321MOVD a6+48(FP), R12
322MOVD R12, (2176+40)(R4)
323MOVD a7+56(FP), R12
324MOVD R12, (2176+48)(R4)
325MOVD a8+64(FP), R12
326MOVD R12, (2176+56)(R4)
327MOVD a9+72(FP), R12
328MOVD R12, (2176+64)(R4)
329
330// Call function.
331LE_CALL
332NOPH
333XOR R0, R0 // Restore R0 to $0.
334MOVD R4, 0(R9) // Save stack pointer.
335
336MOVD R3, r1+80(FP)
337MOVD R0, r2+88(FP)
338MOVD R0, err+96(FP)
339MOVW R3, R4
340CMP R4, $-1
341BNE done
342BL addrerrno<>(SB)
343MOVWZ 0(R3), R3
344MOVD R3, err+96(FP)
345done:
346RET
347
348// func svcCall(fnptr unsafe.Pointer, argv *unsafe.Pointer, dsa *uint64)
349TEXT ·svcCall(SB),NOSPLIT,$0
350BL runtime·save_g(SB) // Save g and stack pointer
351MOVW PSALAA, R8
352MOVD LCA64(R8), R8
353MOVD SAVSTACK_ASYNC(R8), R9
354MOVD R15, 0(R9)
355
356MOVD argv+8(FP), R1 // Move function arguments into registers
357MOVD dsa+16(FP), g
358MOVD fnptr+0(FP), R15
359
360BYTE $0x0D // Branch to function
361BYTE $0xEF
362
363BL runtime·load_g(SB) // Restore g and stack pointer
364MOVW PSALAA, R8
365MOVD LCA64(R8), R8
366MOVD SAVSTACK_ASYNC(R8), R9
367MOVD 0(R9), R15
368
369RET
370
371// func svcLoad(name *byte) unsafe.Pointer
372TEXT ·svcLoad(SB),NOSPLIT,$0
373MOVD R15, R2 // Save go stack pointer
374MOVD name+0(FP), R0 // Move SVC args into registers
375MOVD $0x80000000, R1
376MOVD $0, R15
377BYTE $0x0A // SVC 08 LOAD
378BYTE $0x08
379MOVW R15, R3 // Save return code from SVC
380MOVD R2, R15 // Restore go stack pointer
381CMP R3, $0 // Check SVC return code
382BNE error
383
384MOVD $-2, R3 // Reset last bit of entry point to zero
385AND R0, R3
386MOVD R3, addr+8(FP) // Return entry point returned by SVC
387CMP R0, R3 // Check if last bit of entry point was set
388BNE done
389
390MOVD R15, R2 // Save go stack pointer
391MOVD $0, R15 // Move SVC args into registers (entry point still in r0 from SVC 08)
392BYTE $0x0A // SVC 09 DELETE
393BYTE $0x09
394MOVD R2, R15 // Restore go stack pointer
395
396error:
397MOVD $0, addr+8(FP) // Return 0 on failure
398done:
399XOR R0, R0 // Reset r0 to 0
400RET
401
402// func svcUnload(name *byte, fnptr unsafe.Pointer) int64
403TEXT ·svcUnload(SB),NOSPLIT,$0
404MOVD R15, R2 // Save go stack pointer
405MOVD name+0(FP), R0 // Move SVC args into registers
406MOVD addr+8(FP), R15
407BYTE $0x0A // SVC 09
408BYTE $0x09
409XOR R0, R0 // Reset r0 to 0
410MOVD R15, R1 // Save SVC return code
411MOVD R2, R15 // Restore go stack pointer
412MOVD R1, rc+0(FP) // Return SVC return code
413RET
414
415// func gettid() uint64
416TEXT ·gettid(SB), NOSPLIT, $0
417// Get library control area (LCA).
418MOVW PSALAA, R8
419MOVD LCA64(R8), R8
420
421// Get CEECAATHDID
422MOVD CAA(R8), R9
423MOVD 0x3D0(R9), R9
424MOVD R9, ret+0(FP)
425
426RET
427