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