1// Copyright 2019 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 riscv64, Linux 9// 10 11// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64) 12TEXT ·Syscall(SB),NOSPLIT,$0-56 13 CALL runtime·entersyscall(SB) 14 MOV a1+8(FP), A0 15 MOV a2+16(FP), A1 16 MOV a3+24(FP), A2 17 MOV trap+0(FP), A7 // syscall entry 18 ECALL 19 MOV $-4096, T0 20 BLTU T0, A0, err 21 MOV A0, r1+32(FP) // r1 22 MOV A1, r2+40(FP) // r2 23 MOV ZERO, err+48(FP) // errno 24 CALL runtime·exitsyscall(SB) 25 RET 26err: 27 MOV $-1, T0 28 MOV T0, r1+32(FP) // r1 29 MOV ZERO, r2+40(FP) // r2 30 SUB A0, ZERO, A0 31 MOV A0, err+48(FP) // errno 32 CALL runtime·exitsyscall(SB) 33 RET 34 35// func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) 36TEXT ·Syscall6(SB),NOSPLIT,$0-80 37 CALL runtime·entersyscall(SB) 38 MOV a1+8(FP), A0 39 MOV a2+16(FP), A1 40 MOV a3+24(FP), A2 41 MOV a4+32(FP), A3 42 MOV a5+40(FP), A4 43 MOV a6+48(FP), A5 44 MOV trap+0(FP), A7 // syscall entry 45 ECALL 46 MOV $-4096, T0 47 BLTU T0, A0, err 48 MOV A0, r1+56(FP) // r1 49 MOV A1, r2+64(FP) // r2 50 MOV ZERO, err+72(FP) // errno 51 CALL runtime·exitsyscall(SB) 52 RET 53err: 54 MOV $-1, T0 55 MOV T0, r1+56(FP) // r1 56 MOV ZERO, r2+64(FP) // r2 57 SUB A0, ZERO, A0 58 MOV A0, err+72(FP) // errno 59 CALL runtime·exitsyscall(SB) 60 RET 61 62// func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) 63TEXT ·RawSyscall(SB),NOSPLIT,$0-56 64 MOV a1+8(FP), A0 65 MOV a2+16(FP), A1 66 MOV a3+24(FP), A2 67 MOV trap+0(FP), A7 // syscall entry 68 ECALL 69 MOV $-4096, T0 70 BLTU T0, A0, err 71 MOV A0, r1+32(FP) // r1 72 MOV A1, r2+40(FP) // r2 73 MOV ZERO, err+48(FP) // errno 74 RET 75err: 76 MOV $-1, T0 77 MOV T0, r1+32(FP) // r1 78 MOV ZERO, r2+40(FP) // r2 79 SUB A0, ZERO, A0 80 MOV A0, err+48(FP) // errno 81 RET 82 83// func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) 84TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 85 MOV a1+8(FP), A0 86 MOV a2+16(FP), A1 87 MOV a3+24(FP), A2 88 MOV a4+32(FP), A3 89 MOV a5+40(FP), A4 90 MOV a6+48(FP), A5 91 MOV trap+0(FP), A7 // syscall entry 92 ECALL 93 MOV $-4096, T0 94 BLTU T0, A0, err 95 MOV A0, r1+56(FP) // r1 96 MOV A1, r2+64(FP) // r2 97 MOV ZERO, err+72(FP) // errno 98 RET 99err: 100 MOV $-1, T0 101 MOV T0, r1+56(FP) // r1 102 MOV ZERO, r2+64(FP) // r2 103 SUB A0, ZERO, A0 104 MOV A0, err+72(FP) // errno 105 RET 106 107TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48 108 MOV a1+8(FP), A0 109 MOV a2+16(FP), A1 110 MOV a3+24(FP), A2 111 MOV trap+0(FP), A7 // syscall entry 112 ECALL 113 MOV A0, r1+32(FP) 114 MOV A1, r2+40(FP) 115 RET 116