OLD | NEW |
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 // | 5 // |
6 // System calls and other sys.stuff for arm, Linux | 6 // System calls and other sys.stuff for arm, Linux |
7 // | 7 // |
8 | 8 |
9 #include "zasm_GOOS_GOARCH.h" | 9 #include "zasm_GOOS_GOARCH.h" |
10 #include "../../cmd/ld/textflag.h" | 10 #include "../../cmd/ld/textflag.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 #define SYS_fcntl (SYS_BASE + 55) | 44 #define SYS_fcntl (SYS_BASE + 55) |
45 | 45 |
46 #define ARM_BASE (SYS_BASE + 0x0f0000) | 46 #define ARM_BASE (SYS_BASE + 0x0f0000) |
47 | 47 |
48 TEXT runtime·open(SB),NOSPLIT,$0 | 48 TEXT runtime·open(SB),NOSPLIT,$0 |
49 MOVW 0(FP), R0 | 49 MOVW 0(FP), R0 |
50 MOVW 4(FP), R1 | 50 MOVW 4(FP), R1 |
51 MOVW 8(FP), R2 | 51 MOVW 8(FP), R2 |
52 MOVW $SYS_open, R7 | 52 MOVW $SYS_open, R7 |
53 SWI $0 | 53 SWI $0 |
| 54 MOVW R0, ret+12(FP) |
54 RET | 55 RET |
55 | 56 |
56 TEXT runtime·close(SB),NOSPLIT,$0 | 57 TEXT runtime·close(SB),NOSPLIT,$0 |
57 MOVW 0(FP), R0 | 58 MOVW 0(FP), R0 |
58 MOVW $SYS_close, R7 | 59 MOVW $SYS_close, R7 |
59 SWI $0 | 60 SWI $0 |
| 61 MOVW R0, ret+4(FP) |
60 RET | 62 RET |
61 | 63 |
62 TEXT runtime·write(SB),NOSPLIT,$0 | 64 TEXT runtime·write(SB),NOSPLIT,$0 |
63 MOVW 0(FP), R0 | 65 MOVW 0(FP), R0 |
64 MOVW 4(FP), R1 | 66 MOVW 4(FP), R1 |
65 MOVW 8(FP), R2 | 67 MOVW 8(FP), R2 |
66 MOVW $SYS_write, R7 | 68 MOVW $SYS_write, R7 |
67 SWI $0 | 69 SWI $0 |
| 70 MOVW R0, ret+12(FP) |
68 RET | 71 RET |
69 | 72 |
70 TEXT runtime·read(SB),NOSPLIT,$0 | 73 TEXT runtime·read(SB),NOSPLIT,$0 |
71 MOVW 0(FP), R0 | 74 MOVW 0(FP), R0 |
72 MOVW 4(FP), R1 | 75 MOVW 4(FP), R1 |
73 MOVW 8(FP), R2 | 76 MOVW 8(FP), R2 |
74 MOVW $SYS_read, R7 | 77 MOVW $SYS_read, R7 |
75 SWI $0 | 78 SWI $0 |
| 79 MOVW R0, ret+12(FP) |
76 RET | 80 RET |
77 | 81 |
78 TEXT runtime·getrlimit(SB),NOSPLIT,$0 | 82 TEXT runtime·getrlimit(SB),NOSPLIT,$0 |
79 MOVW 0(FP), R0 | 83 MOVW 0(FP), R0 |
80 MOVW 4(FP), R1 | 84 MOVW 4(FP), R1 |
81 MOVW $SYS_ugetrlimit, R7 | 85 MOVW $SYS_ugetrlimit, R7 |
82 SWI $0 | 86 SWI $0 |
| 87 MOVW R0, ret+8(FP) |
83 RET | 88 RET |
84 | 89 |
85 TEXT runtime·exit(SB),NOSPLIT,$-4 | 90 TEXT runtime·exit(SB),NOSPLIT,$-4 |
86 MOVW 0(FP), R0 | 91 MOVW 0(FP), R0 |
87 MOVW $SYS_exit_group, R7 | 92 MOVW $SYS_exit_group, R7 |
88 SWI $0 | 93 SWI $0 |
89 MOVW $1234, R0 | 94 MOVW $1234, R0 |
90 MOVW $1002, R1 | 95 MOVW $1002, R1 |
91 MOVW R0, (R1) // fail hard | 96 MOVW R0, (R1) // fail hard |
92 | 97 |
(...skipping 19 matching lines...) Expand all Loading... |
112 MOVW 4(FP), R1 | 117 MOVW 4(FP), R1 |
113 MOVW 8(FP), R2 | 118 MOVW 8(FP), R2 |
114 MOVW 12(FP), R3 | 119 MOVW 12(FP), R3 |
115 MOVW 16(FP), R4 | 120 MOVW 16(FP), R4 |
116 MOVW 20(FP), R5 | 121 MOVW 20(FP), R5 |
117 MOVW $SYS_mmap2, R7 | 122 MOVW $SYS_mmap2, R7 |
118 SWI $0 | 123 SWI $0 |
119 MOVW $0xfffff001, R6 | 124 MOVW $0xfffff001, R6 |
120 CMP R6, R0 | 125 CMP R6, R0 |
121 RSB.HI $0, R0 | 126 RSB.HI $0, R0 |
| 127 MOVW R0, ret+24(FP) |
122 RET | 128 RET |
123 | 129 |
124 TEXT runtime·munmap(SB),NOSPLIT,$0 | 130 TEXT runtime·munmap(SB),NOSPLIT,$0 |
125 MOVW 0(FP), R0 | 131 MOVW 0(FP), R0 |
126 MOVW 4(FP), R1 | 132 MOVW 4(FP), R1 |
127 MOVW $SYS_munmap, R7 | 133 MOVW $SYS_munmap, R7 |
128 SWI $0 | 134 SWI $0 |
129 MOVW $0xfffff001, R6 | 135 MOVW $0xfffff001, R6 |
130 CMP R6, R0 | 136 CMP R6, R0 |
131 MOVW.HI $0, R8 // crash on syscall failure | 137 MOVW.HI $0, R8 // crash on syscall failure |
(...skipping 16 matching lines...) Expand all Loading... |
148 MOVW $SYS_setitimer, R7 | 154 MOVW $SYS_setitimer, R7 |
149 SWI $0 | 155 SWI $0 |
150 RET | 156 RET |
151 | 157 |
152 TEXT runtime·mincore(SB),NOSPLIT,$0 | 158 TEXT runtime·mincore(SB),NOSPLIT,$0 |
153 MOVW 0(FP), R0 | 159 MOVW 0(FP), R0 |
154 MOVW 4(FP), R1 | 160 MOVW 4(FP), R1 |
155 MOVW 8(FP), R2 | 161 MOVW 8(FP), R2 |
156 MOVW $SYS_mincore, R7 | 162 MOVW $SYS_mincore, R7 |
157 SWI $0 | 163 SWI $0 |
| 164 MOVW R0, ret+12(FP) |
158 RET | 165 RET |
159 | 166 |
160 TEXT time·now(SB), NOSPLIT, $32 | 167 TEXT time·now(SB), NOSPLIT, $32 |
161 MOVW $0, R0 // CLOCK_REALTIME | 168 MOVW $0, R0 // CLOCK_REALTIME |
162 MOVW $8(R13), R1 // timespec | 169 MOVW $8(R13), R1 // timespec |
163 MOVW $SYS_clock_gettime, R7 | 170 MOVW $SYS_clock_gettime, R7 |
164 SWI $0 | 171 SWI $0 |
165 ········ | 172 ········ |
166 MOVW 8(R13), R0 // sec | 173 MOVW 8(R13), R0 // sec |
167 MOVW 12(R13), R2 // nsec | 174 MOVW 12(R13), R2 // nsec |
168 ········ | 175 ········ |
169 MOVW R0, 0(FP) | 176 MOVW R0, 0(FP) |
170 MOVW $0, R1 | 177 MOVW $0, R1 |
171 MOVW R1, 4(FP) | 178 MOVW R1, 4(FP) |
172 MOVW R2, 8(FP) | 179 MOVW R2, 8(FP) |
173 RET····· | 180 RET····· |
174 | 181 |
175 // int64 nanotime(void) so really | 182 // int64 nanotime(void) |
176 // void nanotime(int64 *nsec) | |
177 TEXT runtime·nanotime(SB),NOSPLIT,$32 | 183 TEXT runtime·nanotime(SB),NOSPLIT,$32 |
178 MOVW $1, R0 // CLOCK_MONOTONIC | 184 MOVW $1, R0 // CLOCK_MONOTONIC |
179 MOVW $8(R13), R1 // timespec | 185 MOVW $8(R13), R1 // timespec |
180 MOVW $SYS_clock_gettime, R7 | 186 MOVW $SYS_clock_gettime, R7 |
181 SWI $0 | 187 SWI $0 |
182 ········ | 188 ········ |
183 MOVW 8(R13), R0 // sec | 189 MOVW 8(R13), R0 // sec |
184 MOVW 12(R13), R2 // nsec | 190 MOVW 12(R13), R2 // nsec |
185 ········ | 191 ········ |
186 MOVW $1000000000, R3 | 192 MOVW $1000000000, R3 |
187 MULLU R0, R3, (R1, R0) | 193 MULLU R0, R3, (R1, R0) |
188 MOVW $0, R4 | 194 MOVW $0, R4 |
189 ADD.S R2, R0 | 195 ADD.S R2, R0 |
190 ADC R4, R1 | 196 ADC R4, R1 |
191 | 197 |
192 » MOVW» 0(FP), R3 | 198 » MOVW» R0, ret_lo+0(FP) |
193 » MOVW» R0, 0(R3) | 199 » MOVW» R1, ret_hi+4(FP) |
194 » MOVW» R1, 4(R3) | |
195 RET | 200 RET |
196 | 201 |
197 // int32 futex(int32 *uaddr, int32 op, int32 val, | 202 // int32 futex(int32 *uaddr, int32 op, int32 val, |
198 // struct timespec *timeout, int32 *uaddr2, int32 val2); | 203 // struct timespec *timeout, int32 *uaddr2, int32 val2); |
199 TEXT runtime·futex(SB),NOSPLIT,$0 | 204 TEXT runtime·futex(SB),NOSPLIT,$0 |
200 MOVW 4(SP), R0 | 205 MOVW 4(SP), R0 |
201 MOVW 8(SP), R1 | 206 MOVW 8(SP), R1 |
202 MOVW 12(SP), R2 | 207 MOVW 12(SP), R2 |
203 MOVW 16(SP), R3 | 208 MOVW 16(SP), R3 |
204 MOVW 20(SP), R4 | 209 MOVW 20(SP), R4 |
205 MOVW 24(SP), R5 | 210 MOVW 24(SP), R5 |
206 MOVW $SYS_futex, R7 | 211 MOVW $SYS_futex, R7 |
207 SWI $0 | 212 SWI $0 |
| 213 MOVW R0, ret+24(FP) |
208 RET | 214 RET |
209 | 215 |
210 | 216 |
211 // int32 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void)); | 217 // int32 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void)); |
212 TEXT runtime·clone(SB),NOSPLIT,$0 | 218 TEXT runtime·clone(SB),NOSPLIT,$0 |
213 MOVW flags+0(FP), R0 | 219 MOVW flags+0(FP), R0 |
214 » MOVW» stack+4(FP), R1 | 220 » MOVW» stk+4(FP), R1 |
215 MOVW $0, R2 // parent tid ptr | 221 MOVW $0, R2 // parent tid ptr |
216 MOVW $0, R3 // tls_val | 222 MOVW $0, R3 // tls_val |
217 MOVW $0, R4 // child tid ptr | 223 MOVW $0, R4 // child tid ptr |
218 MOVW $0, R5 | 224 MOVW $0, R5 |
219 | 225 |
220 // Copy mp, gp, fn off parent stack for use by child. | 226 // Copy mp, gp, fn off parent stack for use by child. |
221 // TODO(kaib): figure out which registers are clobbered by clone and avo
id stack copying | 227 // TODO(kaib): figure out which registers are clobbered by clone and avo
id stack copying |
222 MOVW $-16(R1), R1 | 228 MOVW $-16(R1), R1 |
223 MOVW mm+8(FP), R6 | 229 MOVW mm+8(FP), R6 |
224 MOVW R6, 0(R1) | 230 MOVW R6, 0(R1) |
225 MOVW gg+12(FP), R6 | 231 MOVW gg+12(FP), R6 |
226 MOVW R6, 4(R1) | 232 MOVW R6, 4(R1) |
227 MOVW fn+16(FP), R6 | 233 MOVW fn+16(FP), R6 |
228 MOVW R6, 8(R1) | 234 MOVW R6, 8(R1) |
229 MOVW $1234, R6 | 235 MOVW $1234, R6 |
230 MOVW R6, 12(R1) | 236 MOVW R6, 12(R1) |
231 | 237 |
232 MOVW $SYS_clone, R7 | 238 MOVW $SYS_clone, R7 |
233 SWI $0 | 239 SWI $0 |
234 | 240 |
235 // In parent, return. | 241 // In parent, return. |
236 CMP $0, R0 | 242 CMP $0, R0 |
237 » BEQ» 2(PC) | 243 » BEQ» 3(PC) |
| 244 » MOVW» R0, ret+20(FP) |
238 RET | 245 RET |
239 | 246 |
240 // Paranoia: check that SP is as we expect. Use R13 to avoid linker 'fix
up' | 247 // Paranoia: check that SP is as we expect. Use R13 to avoid linker 'fix
up' |
241 MOVW 12(R13), R0 | 248 MOVW 12(R13), R0 |
242 MOVW $1234, R1 | 249 MOVW $1234, R1 |
243 CMP R0, R1 | 250 CMP R0, R1 |
244 BEQ 2(PC) | 251 BEQ 2(PC) |
245 BL runtime·abort(SB) | 252 BL runtime·abort(SB) |
246 | 253 |
247 MOVW 4(R13), g | 254 MOVW 4(R13), g |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 SWI $0 | 338 SWI $0 |
332 RET | 339 RET |
333 | 340 |
334 TEXT runtime·rt_sigaction(SB),NOSPLIT,$0 | 341 TEXT runtime·rt_sigaction(SB),NOSPLIT,$0 |
335 MOVW 0(FP), R0 | 342 MOVW 0(FP), R0 |
336 MOVW 4(FP), R1 | 343 MOVW 4(FP), R1 |
337 MOVW 8(FP), R2 | 344 MOVW 8(FP), R2 |
338 MOVW 12(FP), R3 | 345 MOVW 12(FP), R3 |
339 MOVW $SYS_rt_sigaction, R7 | 346 MOVW $SYS_rt_sigaction, R7 |
340 SWI $0 | 347 SWI $0 |
| 348 MOVW R0, ret+16(FP) |
341 RET | 349 RET |
342 | 350 |
343 TEXT runtime·usleep(SB),NOSPLIT,$12 | 351 TEXT runtime·usleep(SB),NOSPLIT,$12 |
344 MOVW usec+0(FP), R0 | 352 MOVW usec+0(FP), R0 |
345 MOVW R0, R1 | 353 MOVW R0, R1 |
346 MOVW $1000000, R2 | 354 MOVW $1000000, R2 |
347 DIV R2, R0 | 355 DIV R2, R0 |
348 MOD R2, R1 | 356 MOD R2, R1 |
349 MOVW R0, 4(SP) | 357 MOVW R0, 4(SP) |
350 MOVW R1, 8(SP) | 358 MOVW R1, 8(SP) |
351 MOVW $0, R0 | 359 MOVW $0, R0 |
352 MOVW $0, R1 | 360 MOVW $0, R1 |
353 MOVW $0, R2 | 361 MOVW $0, R2 |
354 MOVW $0, R3 | 362 MOVW $0, R3 |
355 MOVW $4(SP), R4 | 363 MOVW $4(SP), R4 |
356 MOVW $SYS_select, R7 | 364 MOVW $SYS_select, R7 |
357 SWI $0 | 365 SWI $0 |
358 RET | 366 RET |
359 | 367 |
360 // Use kernel version instead of native armcas in asm_arm.s. | 368 // Use kernel version instead of native armcas in asm_arm.s. |
361 // See ../sync/atomic/asm_linux_arm.s for details. | 369 // See ../sync/atomic/asm_linux_arm.s for details. |
362 TEXT cas<>(SB),NOSPLIT,$0 | 370 TEXT cas<>(SB),NOSPLIT,$0 |
363 MOVW $0xffff0fc0, PC | 371 MOVW $0xffff0fc0, PC |
364 | 372 |
365 TEXT runtime·cas(SB),NOSPLIT,$0 | 373 TEXT runtime·cas(SB),NOSPLIT,$0 |
366 » MOVW» valptr+0(FP), R2 | 374 » MOVW» ptr+0(FP), R2 |
367 MOVW old+4(FP), R0 | 375 MOVW old+4(FP), R0 |
368 casagain: | 376 casagain: |
369 MOVW new+8(FP), R1 | 377 MOVW new+8(FP), R1 |
370 BL cas<>(SB) | 378 BL cas<>(SB) |
371 BCC cascheck | 379 BCC cascheck |
372 MOVW $1, R0 | 380 MOVW $1, R0 |
| 381 MOVB R0, ret+12(FP) |
373 RET | 382 RET |
374 cascheck: | 383 cascheck: |
375 // Kernel lies; double-check. | 384 // Kernel lies; double-check. |
376 » MOVW» valptr+0(FP), R2 | 385 » MOVW» ptr+0(FP), R2 |
377 MOVW old+4(FP), R0 | 386 MOVW old+4(FP), R0 |
378 MOVW 0(R2), R3 | 387 MOVW 0(R2), R3 |
379 CMP R0, R3 | 388 CMP R0, R3 |
380 BEQ casagain | 389 BEQ casagain |
381 MOVW $0, R0 | 390 MOVW $0, R0 |
| 391 MOVB R0, ret+12(FP) |
382 RET | 392 RET |
383 | 393 |
384 TEXT runtime·casp(SB),NOSPLIT,$0 | 394 TEXT runtime·casp(SB),NOSPLIT,$0 |
385 B runtime·cas(SB) | 395 B runtime·cas(SB) |
386 | 396 |
387 TEXT runtime·osyield(SB),NOSPLIT,$0 | 397 TEXT runtime·osyield(SB),NOSPLIT,$0 |
388 MOVW $SYS_sched_yield, R7 | 398 MOVW $SYS_sched_yield, R7 |
389 SWI $0 | 399 SWI $0 |
390 RET | 400 RET |
391 | 401 |
392 TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 | 402 TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 |
393 MOVW 0(FP), R0 | 403 MOVW 0(FP), R0 |
394 MOVW 4(FP), R1 | 404 MOVW 4(FP), R1 |
395 MOVW 8(FP), R2 | 405 MOVW 8(FP), R2 |
396 MOVW $SYS_sched_getaffinity, R7 | 406 MOVW $SYS_sched_getaffinity, R7 |
397 SWI $0 | 407 SWI $0 |
| 408 MOVW R0, ret+12(FP) |
398 RET | 409 RET |
399 | 410 |
400 // int32 runtime·epollcreate(int32 size) | 411 // int32 runtime·epollcreate(int32 size) |
401 TEXT runtime·epollcreate(SB),NOSPLIT,$0 | 412 TEXT runtime·epollcreate(SB),NOSPLIT,$0 |
402 MOVW 0(FP), R0 | 413 MOVW 0(FP), R0 |
403 MOVW $SYS_epoll_create, R7 | 414 MOVW $SYS_epoll_create, R7 |
404 SWI $0 | 415 SWI $0 |
| 416 MOVW R0, ret+4(FP) |
405 RET | 417 RET |
406 | 418 |
407 // int32 runtime·epollcreate1(int32 flags) | 419 // int32 runtime·epollcreate1(int32 flags) |
408 TEXT runtime·epollcreate1(SB),NOSPLIT,$0 | 420 TEXT runtime·epollcreate1(SB),NOSPLIT,$0 |
409 MOVW 0(FP), R0 | 421 MOVW 0(FP), R0 |
410 MOVW $SYS_epoll_create1, R7 | 422 MOVW $SYS_epoll_create1, R7 |
411 SWI $0 | 423 SWI $0 |
| 424 MOVW R0, ret+4(FP) |
412 RET | 425 RET |
413 | 426 |
414 // int32 runtime·epollctl(int32 epfd, int32 op, int32 fd, EpollEvent *ev) | 427 // int32 runtime·epollctl(int32 epfd, int32 op, int32 fd, EpollEvent *ev) |
415 TEXT runtime·epollctl(SB),NOSPLIT,$0 | 428 TEXT runtime·epollctl(SB),NOSPLIT,$0 |
416 MOVW 0(FP), R0 | 429 MOVW 0(FP), R0 |
417 MOVW 4(FP), R1 | 430 MOVW 4(FP), R1 |
418 MOVW 8(FP), R2 | 431 MOVW 8(FP), R2 |
419 MOVW 12(FP), R3 | 432 MOVW 12(FP), R3 |
420 MOVW $SYS_epoll_ctl, R7 | 433 MOVW $SYS_epoll_ctl, R7 |
421 SWI $0 | 434 SWI $0 |
| 435 MOVW R0, ret+16(FP) |
422 RET | 436 RET |
423 | 437 |
424 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout) | 438 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout) |
425 TEXT runtime·epollwait(SB),NOSPLIT,$0 | 439 TEXT runtime·epollwait(SB),NOSPLIT,$0 |
426 MOVW 0(FP), R0 | 440 MOVW 0(FP), R0 |
427 MOVW 4(FP), R1 | 441 MOVW 4(FP), R1 |
428 MOVW 8(FP), R2 | 442 MOVW 8(FP), R2 |
429 MOVW 12(FP), R3 | 443 MOVW 12(FP), R3 |
430 MOVW $SYS_epoll_wait, R7 | 444 MOVW $SYS_epoll_wait, R7 |
431 SWI $0 | 445 SWI $0 |
| 446 MOVW R0, ret+16(FP) |
432 RET | 447 RET |
433 | 448 |
434 // void runtime·closeonexec(int32 fd) | 449 // void runtime·closeonexec(int32 fd) |
435 TEXT runtime·closeonexec(SB),NOSPLIT,$0 | 450 TEXT runtime·closeonexec(SB),NOSPLIT,$0 |
436 MOVW 0(FP), R0 // fd | 451 MOVW 0(FP), R0 // fd |
437 MOVW $2, R1 // F_SETFD | 452 MOVW $2, R1 // F_SETFD |
438 MOVW $1, R2 // FD_CLOEXEC | 453 MOVW $1, R2 // FD_CLOEXEC |
439 MOVW $SYS_fcntl, R7 | 454 MOVW $SYS_fcntl, R7 |
440 SWI $0 | 455 SWI $0 |
441 RET | 456 RET |
442 | 457 |
443 // b __kuser_get_tls @ 0xffff0fe0 | 458 // b __kuser_get_tls @ 0xffff0fe0 |
444 TEXT runtime·read_tls_fallback(SB),NOSPLIT,$-4 | 459 TEXT runtime·read_tls_fallback(SB),NOSPLIT,$-4 |
445 MOVW $0xffff0fe0, R0 | 460 MOVW $0xffff0fe0, R0 |
446 B (R0) | 461 B (R0) |
OLD | NEW |