github.com/hbdrawn/golang@v0.0.0-20141214014649-6b835209aba2/src/syscall/asm_linux_arm.s (about) 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 runtime·entersyscall(SB) 18 MOVW 4(SP), R7 19 MOVW 8(SP), R0 20 MOVW 12(SP), R1 21 MOVW 16(SP), 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, 20(SP) // r1 31 MOVW $0, R2 32 MOVW R2, 24(SP) // r2 33 RSB $0, R0, R0 34 MOVW R0, 28(SP) // errno 35 BL runtime·exitsyscall(SB) 36 RET 37 ok: 38 MOVW R0, 20(SP) // r1 39 MOVW $0, R0 40 MOVW R0, 24(SP) // r2 41 MOVW R0, 28(SP) // errno 42 BL runtime·exitsyscall(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 runtime·entersyscall(SB) 49 MOVW 4(SP), R7 // syscall entry 50 MOVW 8(SP), R0 51 MOVW 12(SP), R1 52 MOVW 16(SP), R2 53 MOVW 20(SP), R3 54 MOVW 24(SP), R4 55 MOVW 28(SP), R5 56 SWI $0 57 MOVW $0xfffff001, R6 58 CMP R6, R0 59 BLS ok6 60 MOVW $-1, R1 61 MOVW R1, 32(SP) // r1 62 MOVW $0, R2 63 MOVW R2, 36(SP) // r2 64 RSB $0, R0, R0 65 MOVW R0, 40(SP) // errno 66 BL runtime·exitsyscall(SB) 67 RET 68 ok6: 69 MOVW R0, 32(SP) // r1 70 MOVW R1, 36(SP) // r2 71 MOVW $0, R0 72 MOVW R0, 40(SP) // errno 73 BL runtime·exitsyscall(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 4(SP), R7 // syscall entry 80 MOVW 8(SP), R0 81 MOVW 12(SP), R1 82 MOVW 16(SP), R2 83 MOVW 20(SP), R3 84 MOVW 24(SP), R4 85 MOVW 28(SP), R5 86 SWI $0 87 MOVW $0xfffff001, R6 88 CMP R6, R0 89 BLS ok2 90 MOVW $-1, R1 91 MOVW R1, 32(SP) // r1 92 MOVW $0, R2 93 MOVW R2, 36(SP) // r2 94 RSB $0, R0, R0 95 MOVW R0, 40(SP) // errno 96 RET 97 ok2: 98 MOVW R0, 32(SP) // r1 99 MOVW R1, 36(SP) // r2 100 MOVW $0, R0 101 MOVW R0, 40(SP) // errno 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-32 111 BL runtime·entersyscall(SB) 112 MOVW $SYS__LLSEEK, R7 // syscall entry 113 MOVW 4(SP), R0 // fd 114 MOVW 12(SP), R1 // offset-high 115 MOVW 8(SP), R2 // offset-low 116 MOVW $20(SP), R3 117 MOVW 16(SP), R4 // whence 118 SWI $0 119 MOVW $0xfffff001, R6 120 CMP R6, R0 121 BLS okseek 122 MOVW $0, R1 123 MOVW R1, 20(SP) 124 MOVW R1, 24(SP) 125 RSB $0, R0, R0 126 MOVW R0, 28(SP) // errno 127 BL runtime·exitsyscall(SB) 128 RET 129 okseek: 130 // system call filled in newoffset already 131 MOVW $0, R0 132 MOVW R0, 28(SP) // errno 133 BL runtime·exitsyscall(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 4(SP), R7 // syscall entry 139 MOVW 8(SP), R0 140 MOVW 12(SP), R1 141 MOVW 16(SP), R2 142 SWI $0 143 MOVW $0xfffff001, R1 144 CMP R1, R0 145 BLS ok1 146 MOVW $-1, R1 147 MOVW R1, 20(SP) // r1 148 MOVW $0, R2 149 MOVW R2, 24(SP) // r2 150 RSB $0, R0, R0 151 MOVW R0, 28(SP) // errno 152 RET 153 ok1: 154 MOVW R0, 20(SP) // r1 155 MOVW $0, R0 156 MOVW R0, 24(SP) // r2 157 MOVW R0, 28(SP) // errno 158 RET 159