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