1 // Copyright 2009 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 calls for arm, Linux 10 // 11 12 // TODO(kaib): handle error returns 13 14 // func Syscall(syscall uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr); 15 16 TEXT Syscall(SB),NOSPLIT,$0-28 17 BL runtimeentersyscall(SB) 18 MOVW trap+0(FP), R7 19 MOVW a1+4(FP), R0 20 MOVW a2+8(FP), R1 21 MOVW a3+12(FP), R2 22 MOVW $0, R3 23 MOVW $0, R4 24 MOVW $0, R5 25 SWI $0 26 MOVW $0xfffff001, R1 27 CMP R1, R0 28 BLS ok 29 MOVW $-1, R1 30 MOVW R1, r1+16(FP) 31 MOVW $0, R2 32 MOVW R2, r2+20(FP) 33 RSB $0, R0, R0 34 MOVW R0, err+24(FP) 35 BL runtimeexitsyscall(SB) 36 RET 37 ok: 38 MOVW R0, r1+16(FP) 39 MOVW $0, R0 40 MOVW R0, r2+20(FP) 41 MOVW R0, err+24(FP) 42 BL runtimeexitsyscall(SB) 43 RET 44 45 // func Syscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); 46 // Actually Syscall5 but the rest of the code expects it to be named Syscall6. 47 TEXT Syscall6(SB),NOSPLIT,$0-40 48 BL runtimeentersyscall(SB) 49 MOVW trap+0(FP), R7 // syscall entry 50 MOVW a1+4(FP), R0 51 MOVW a2+8(FP), R1 52 MOVW a3+12(FP), R2 53 MOVW a4+16(FP), R3 54 MOVW a5+20(FP), R4 55 MOVW a6+24(FP), R5 56 SWI $0 57 MOVW $0xfffff001, R6 58 CMP R6, R0 59 BLS ok6 60 MOVW $-1, R1 61 MOVW R1, r1+28(FP) 62 MOVW $0, R2 63 MOVW R2, r2+32(FP) 64 RSB $0, R0, R0 65 MOVW R0, err+36(FP) 66 BL runtimeexitsyscall(SB) 67 RET 68 ok6: 69 MOVW R0, r1+28(FP) 70 MOVW R1, r2+32(FP) 71 MOVW $0, R0 72 MOVW R0, err+36(FP) 73 BL runtimeexitsyscall(SB) 74 RET 75 76 // func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); 77 // Actually RawSyscall5 but the rest of the code expects it to be named RawSyscall6. 78 TEXT RawSyscall6(SB),NOSPLIT,$0-40 79 MOVW trap+0(FP), R7 // syscall entry 80 MOVW a1+4(FP), R0 81 MOVW a2+8(FP), R1 82 MOVW a3+12(FP), R2 83 MOVW a4+16(FP), R3 84 MOVW a5+20(FP), R4 85 MOVW a6+24(FP), R5 86 SWI $0 87 MOVW $0xfffff001, R6 88 CMP R6, R0 89 BLS ok2 90 MOVW $-1, R1 91 MOVW R1, r1+28(FP) 92 MOVW $0, R2 93 MOVW R2, r2+32(FP) 94 RSB $0, R0, R0 95 MOVW R0, err+36(FP) 96 RET 97 ok2: 98 MOVW R0, r1+28(FP) 99 MOVW R1, r2+32(FP) 100 MOVW $0, R0 101 MOVW R0, err+36(FP) 102 RET 103 104 #define SYS__LLSEEK 140 /* from zsysnum_linux_arm.go */ 105 // func seek(fd int, offset int64, whence int) (newoffset int64, errno int) 106 // Implemented in assembly to avoid allocation when 107 // taking the address of the return value newoffset. 108 // Underlying system call is 109 // llseek(int fd, int offhi, int offlo, int64 *result, int whence) 110 TEXT seek(SB),NOSPLIT,$0-28 111 BL runtimeentersyscall(SB) 112 MOVW $SYS__LLSEEK, R7 // syscall entry 113 MOVW fd+0(FP), R0 114 MOVW offset_hi+8(FP), R1 115 MOVW offset_lo+4(FP), R2 116 MOVW $newoffset_lo+16(FP), R3 117 MOVW whence+12(FP), R4 118 SWI $0 119 MOVW $0xfffff001, R6 120 CMP R6, R0 121 BLS okseek 122 MOVW $0, R1 123 MOVW R1, newoffset_lo+16(FP) 124 MOVW R1, newoffset_hi+20(FP) 125 RSB $0, R0, R0 126 MOVW R0, err+24(FP) 127 BL runtimeexitsyscall(SB) 128 RET 129 okseek: 130 // system call filled in newoffset already 131 MOVW $0, R0 132 MOVW R0, err+24(FP) 133 BL runtimeexitsyscall(SB) 134 RET 135 136 // func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr); 137 TEXT RawSyscall(SB),NOSPLIT,$0-28 138 MOVW trap+0(FP), R7 // syscall entry 139 MOVW a1+4(FP), R0 140 MOVW a2+8(FP), R1 141 MOVW a3+12(FP), R2 142 SWI $0 143 MOVW $0xfffff001, R1 144 CMP R1, R0 145 BLS ok1 146 MOVW $-1, R1 147 MOVW R1, r1+16(FP) 148 MOVW $0, R2 149 MOVW R2, r2+20(FP) 150 RSB $0, R0, R0 151 MOVW R0, err+24(FP) 152 RET 153 ok1: 154 MOVW R0, r1+16(FP) 155 MOVW $0, R0 156 MOVW R0, r2+20(FP) 157 MOVW R0, err+24(FP) 158 RET 159 160