github.com/tristanisham/sys@v0.0.0-20240326010300-a16cbabb7555/unix/asm_zos_s390x.s (about) 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 24 TEXT ·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. 30 TEXT 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 55 TEXT ·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) 93 done: 94 BL runtime·exitsyscall(SB) 95 RET 96 97 TEXT ·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) 134 done: 135 RET 136 137 TEXT ·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) 183 done: 184 BL runtime·exitsyscall(SB) 185 RET 186 187 TEXT ·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) 232 done: 233 RET 234 235 TEXT ·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) 287 done: 288 BL runtime·exitsyscall(SB) 289 RET 290 291 TEXT ·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) 342 done: 343 RET 344 345 // func svcCall(fnptr unsafe.Pointer, argv *unsafe.Pointer, dsa *uint64) 346 TEXT ·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 369 TEXT ·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 393 error: 394 MOVD $0, addr+8(FP) // Return 0 on failure 395 done: 396 XOR R0, R0 // Reset r0 to 0 397 RET 398 399 // func svcUnload(name *byte, fnptr unsafe.Pointer) int64 400 TEXT ·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 413 TEXT ·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