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