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