1 // Copyright 2013 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 #include "funcdata.h" 7 8 // 9 // System call support for ARM, OpenBSD 10 // 11 12 // func Syscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32); 13 // func Syscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32); 14 // func Syscall9(trap int32, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int32) 15 // func RawSyscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32); 16 // func RawSyscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32); 17 18 TEXT Syscall(SB),NOSPLIT,$0-28 19 BL runtimeentersyscall(SB) 20 MOVW syscall+0(FP), R12 // syscall number 21 MOVW a1+4(FP), R0 // arg 1 22 MOVW a2+8(FP), R1 // arg 2 23 MOVW a3+12(FP), R2 // arg 3 24 SWI $0 25 MOVW $0, R2 26 BCS error 27 MOVW R0, r1+16(FP) // ret 1 28 MOVW R1, r2+20(FP) // ret 2 29 MOVW R2, err+24(FP) // err 30 BL runtimeexitsyscall(SB) 31 RET 32 error: 33 MOVW $-1, R3 34 MOVW R3, r1+16(FP) // ret 1 35 MOVW R2, r2+20(FP) // ret 2 36 MOVW R0, err+24(FP) // err 37 BL runtimeexitsyscall(SB) 38 RET 39 40 TEXT Syscall6(SB),NOSPLIT,$0-40 41 BL runtimeentersyscall(SB) 42 MOVW syscall+0(FP), R12 // syscall number 43 MOVW a1+4(FP), R0 // arg 1 44 MOVW a2+8(FP), R1 // arg 2 45 MOVW a3+12(FP), R2 // arg 3 46 MOVW a4+16(FP), R3 // arg 4 47 MOVW R13, R4 48 MOVW $a5+20(FP), R13 // arg 5 to arg 6 are passed on stack 49 SWI $0 50 MOVW R4, R13 51 MOVW $0, R2 52 BCS error6 53 MOVW R0, r1+28(FP) // ret 1 54 MOVW R1, r2+32(FP) // ret 2 55 MOVW R2, err+36(FP) // err 56 BL runtimeexitsyscall(SB) 57 RET 58 error6: 59 MOVW $-1, R3 60 MOVW R3, r1+28(FP) // ret 1 61 MOVW R2, r2+32(FP) // ret 2 62 MOVW R0, err+36(FP) // err 63 BL runtimeexitsyscall(SB) 64 RET 65 66 TEXT Syscall9(SB),NOSPLIT,$0-52 67 BL runtimeentersyscall(SB) 68 MOVW syscall+0(FP), R12 // syscall number 69 MOVW a1+4(FP), R0 // arg 1 70 MOVW a2+8(FP), R1 // arg 2 71 MOVW a3+12(FP), R2 // arg 3 72 MOVW a4+16(FP), R3 // arg 4 73 MOVW R13, R4 74 MOVW $a5+20(FP), R13 // arg 5 to arg 9 are passed on stack 75 SWI $0 76 MOVW R4, R13 77 MOVW $0, R2 78 BCS error9 79 MOVW R0, r1+40(FP) // ret 1 80 MOVW R1, r2+44(FP) // ret 2 81 MOVW R2, err+48(FP) // err 82 BL runtimeexitsyscall(SB) 83 RET 84 error9: 85 MOVW $-1, R3 86 MOVW R3, r1+40(FP) // ret 1 87 MOVW R2, r2+44(FP) // ret 2 88 MOVW R0, err+48(FP) // err 89 BL runtimeexitsyscall(SB) 90 RET 91 92 TEXT RawSyscall(SB),NOSPLIT,$0-28 93 MOVW syscall+0(FP), R12 // syscall number 94 MOVW a1+4(FP), R0 // arg 1 95 MOVW a2+8(FP), R1 // arg 2 96 MOVW a3+12(FP), R2 // arg 3 97 SWI $0 98 MOVW $0, R2 99 BCS errorr 100 MOVW R0, r1+16(FP) // ret 1 101 MOVW R1, r2+20(FP) // ret 2 102 MOVW R2, err+24(FP) // err 103 RET 104 errorr: 105 MOVW $-1, R3 106 MOVW R3, r1+16(FP) // ret 1 107 MOVW R2, r2+20(FP) // ret 2 108 MOVW R0, err+24(FP) // err 109 RET 110 111 TEXT RawSyscall6(SB),NOSPLIT,$0-40 112 MOVW syscall+0(FP), R12 // syscall number 113 MOVW a1+4(FP), R0 // arg 1 114 MOVW a2+8(FP), R1 // arg 2 115 MOVW a3+12(FP), R2 // arg 3 116 MOVW a4+16(FP), R3 // arg 4 117 MOVW R13, R4 118 MOVW $a5+20(FP), R13 // arg 5 to arg 6 are passed on stack 119 SWI $0 120 MOVW R4, R13 121 MOVW $0, R2 122 BCS errorr6 123 MOVW R0, r1+28(FP) // ret 1 124 MOVW R1, r2+32(FP) // ret 2 125 MOVW R2, err+36(FP) // err 126 RET 127 errorr6: 128 MOVW $-1, R3 129 MOVW R3, r1+28(FP) // ret 1 130 MOVW R2, r2+32(FP) // ret 2 131 MOVW R0, err+36(FP) // err 132 RET 133