usb-ks

USB Killswitch
git clone git://git.laack.co/usb-ks.git
Log | Files | Refs | README | LICENSE

asm_zos_s390x.s (8646B)


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