blob: 29eb8eb077514e005e4947afa21fb44bf6108652 [file] [log] [blame]
Kai Backman79435562009-05-26 11:18:42 -07001// 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//
6// System calls and other sys.stuff for arm, Linux
7//
8
Russ Cox15ced2d2014-11-11 17:06:22 -05009#include "go_asm.h"
10#include "go_tls.h"
Russ Coxcb040d52014-09-04 23:05:18 -040011#include "textflag.h"
Kai Backman770b8722009-10-29 21:21:14 -070012
Shenghou Ma1bddfb52012-02-23 15:43:14 -050013// for EABI, as we don't support OABI
Kai Backman52c549f2009-11-05 22:53:08 -080014#define SYS_BASE 0x0
15
Kai Backmanbe639b92009-06-23 11:54:23 -070016#define SYS_exit (SYS_BASE + 1)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040017#define SYS_read (SYS_BASE + 3)
Kai Backmanbe639b92009-06-23 11:54:23 -070018#define SYS_write (SYS_BASE + 4)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040019#define SYS_open (SYS_BASE + 5)
20#define SYS_close (SYS_BASE + 6)
Russ Cox5bfed7c2015-01-14 11:18:24 -050021#define SYS_getpid (SYS_BASE + 20)
22#define SYS_kill (SYS_BASE + 37)
Russ Cox66cdc692010-02-10 15:01:02 -080023#define SYS_gettimeofday (SYS_BASE + 78)
Kai Backman770b8722009-10-29 21:21:14 -070024#define SYS_clone (SYS_BASE + 120)
Russ Cox6c196012010-04-05 12:51:09 -070025#define SYS_rt_sigreturn (SYS_BASE + 173)
26#define SYS_rt_sigaction (SYS_BASE + 174)
Russ Cox240b1d52012-02-23 14:43:58 -050027#define SYS_rt_sigprocmask (SYS_BASE + 175)
Russ Cox6c196012010-04-05 12:51:09 -070028#define SYS_sigaltstack (SYS_BASE + 186)
Kai Backmanbe639b92009-06-23 11:54:23 -070029#define SYS_mmap2 (SYS_BASE + 192)
Kai Backman770b8722009-10-29 21:21:14 -070030#define SYS_futex (SYS_BASE + 240)
31#define SYS_exit_group (SYS_BASE + 248)
Russ Coxd4cc5572010-09-07 09:57:22 -040032#define SYS_munmap (SYS_BASE + 91)
Sébastien Paolaccie6f5a902011-12-12 16:33:13 -050033#define SYS_madvise (SYS_BASE + 220)
Russ Cox8dee8722011-03-23 11:31:42 -040034#define SYS_setitimer (SYS_BASE + 104)
Jonathan Markddde52a2011-06-07 21:50:10 -070035#define SYS_mincore (SYS_BASE + 219)
Russ Cox8698bb62011-04-25 16:58:00 -040036#define SYS_gettid (SYS_BASE + 224)
37#define SYS_tkill (SYS_BASE + 238)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040038#define SYS_sched_yield (SYS_BASE + 158)
Shenghou Ma1250f942012-01-10 20:48:02 -080039#define SYS_select (SYS_BASE + 142) // newselect
Russ Cox102274a2012-02-24 15:28:51 -050040#define SYS_ugetrlimit (SYS_BASE + 191)
Shenghou Ma4f308ed2012-08-10 10:05:26 +080041#define SYS_sched_getaffinity (SYS_BASE + 242)
Shenghou Ma7777bac2012-12-18 22:57:25 +080042#define SYS_clock_gettime (SYS_BASE + 263)
Shenghou Ma1d64d042013-03-16 04:01:56 +080043#define SYS_epoll_create (SYS_BASE + 250)
44#define SYS_epoll_ctl (SYS_BASE + 251)
45#define SYS_epoll_wait (SYS_BASE + 252)
46#define SYS_epoll_create1 (SYS_BASE + 357)
47#define SYS_fcntl (SYS_BASE + 55)
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -050048#define SYS_access (SYS_BASE + 33)
49#define SYS_connect (SYS_BASE + 283)
50#define SYS_socket (SYS_BASE + 281)
Kai Backmanbe639b92009-06-23 11:54:23 -070051
Kai Backman6dbd1422009-11-11 23:23:11 -080052#define ARM_BASE (SYS_BASE + 0x0f0000)
Kai Backman6dbd1422009-11-11 23:23:11 -080053
Keith Randall0273dc12013-08-07 12:20:05 -070054TEXT runtime·open(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -080055 MOVW name+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -080056 MOVW mode+4(FP), R1
57 MOVW perm+8(FP), R2
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040058 MOVW $SYS_open, R7
59 SWI $0
Keith Randallf584c052015-03-02 20:16:48 -080060 MOVW $0xfffff001, R1
61 CMP R1, R0
62 MOVW.HI $-1, R0
Russ Cox25f6b022014-08-27 11:32:17 -040063 MOVW R0, ret+12(FP)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040064 RET
65
David Crawshawcea272d2015-04-13 19:37:04 -040066TEXT runtime·closefd(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -080067 MOVW fd+0(FP), R0
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040068 MOVW $SYS_close, R7
69 SWI $0
Keith Randallf584c052015-03-02 20:16:48 -080070 MOVW $0xfffff001, R1
71 CMP R1, R0
72 MOVW.HI $-1, R0
Russ Cox25f6b022014-08-27 11:32:17 -040073 MOVW R0, ret+4(FP)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040074 RET
75
Keith Randall0273dc12013-08-07 12:20:05 -070076TEXT runtime·write(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -080077 MOVW fd+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -080078 MOVW p+4(FP), R1
Rob Pike345350b2015-02-17 18:30:27 -080079 MOVW n+8(FP), R2
Kai Backman52c549f2009-11-05 22:53:08 -080080 MOVW $SYS_write, R7
81 SWI $0
Keith Randallf584c052015-03-02 20:16:48 -080082 MOVW $0xfffff001, R1
83 CMP R1, R0
84 MOVW.HI $-1, R0
Russ Cox25f6b022014-08-27 11:32:17 -040085 MOVW R0, ret+12(FP)
Kai Backman79435562009-05-26 11:18:42 -070086 RET
87
Keith Randall0273dc12013-08-07 12:20:05 -070088TEXT runtime·read(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -080089 MOVW fd+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -080090 MOVW p+4(FP), R1
Rob Pike345350b2015-02-17 18:30:27 -080091 MOVW n+8(FP), R2
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040092 MOVW $SYS_read, R7
93 SWI $0
Keith Randallf584c052015-03-02 20:16:48 -080094 MOVW $0xfffff001, R1
95 CMP R1, R0
96 MOVW.HI $-1, R0
Russ Cox25f6b022014-08-27 11:32:17 -040097 MOVW R0, ret+12(FP)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040098 RET
99
Keith Randall0273dc12013-08-07 12:20:05 -0700100TEXT runtime·getrlimit(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800101 MOVW kind+0(FP), R0
102 MOVW limit+4(FP), R1
Russ Cox102274a2012-02-24 15:28:51 -0500103 MOVW $SYS_ugetrlimit, R7
104 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400105 MOVW R0, ret+8(FP)
Russ Cox102274a2012-02-24 15:28:51 -0500106 RET
107
Keith Randall0273dc12013-08-07 12:20:05 -0700108TEXT runtime·exit(SB),NOSPLIT,$-4
Rob Pike345350b2015-02-17 18:30:27 -0800109 MOVW code+0(FP), R0
Kai Backman52c549f2009-11-05 22:53:08 -0800110 MOVW $SYS_exit_group, R7
111 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700112 MOVW $1234, R0
113 MOVW $1002, R1
114 MOVW R0, (R1) // fail hard
115
Keith Randall0273dc12013-08-07 12:20:05 -0700116TEXT runtime·exit1(SB),NOSPLIT,$-4
Rob Pike345350b2015-02-17 18:30:27 -0800117 MOVW code+0(FP), R0
Kai Backman52c549f2009-11-05 22:53:08 -0800118 MOVW $SYS_exit, R7
119 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700120 MOVW $1234, R0
121 MOVW $1003, R1
122 MOVW R0, (R1) // fail hard
Kai Backman52891952009-06-10 11:53:07 -0700123
Russ Coxa9e53642015-06-22 12:32:05 -0400124TEXT runtime·gettid(SB),NOSPLIT,$0-4
125 MOVW $SYS_gettid, R7
126 SWI $0
127 MOVW R0, ret+0(FP)
128 RET
129
Keith Randall0273dc12013-08-07 12:20:05 -0700130TEXT runtime·raise(SB),NOSPLIT,$-4
Russ Cox8698bb62011-04-25 16:58:00 -0400131 MOVW $SYS_gettid, R7
132 SWI $0
133 // arg 1 tid already in R0 from gettid
Russ Cox5146a932013-03-15 01:11:03 -0400134 MOVW sig+0(FP), R1 // arg 2 - signal
Russ Cox8698bb62011-04-25 16:58:00 -0400135 MOVW $SYS_tkill, R7
136 SWI $0
137 RET
138
Russ Cox5bfed7c2015-01-14 11:18:24 -0500139TEXT runtime·raiseproc(SB),NOSPLIT,$-4
140 MOVW $SYS_getpid, R7
141 SWI $0
142 // arg 1 tid already in R0 from getpid
143 MOVW sig+0(FP), R1 // arg 2 - signal
144 MOVW $SYS_kill, R7
145 SWI $0
146 RET
147
Keith Randall0273dc12013-08-07 12:20:05 -0700148TEXT runtime·mmap(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800149 MOVW addr+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800150 MOVW n+4(FP), R1
Rob Pike345350b2015-02-17 18:30:27 -0800151 MOVW prot+8(FP), R2
152 MOVW flags+12(FP), R3
153 MOVW fd+16(FP), R4
154 MOVW off+20(FP), R5
Kai Backman52c549f2009-11-05 22:53:08 -0800155 MOVW $SYS_mmap2, R7
156 SWI $0
Shenghou Ma1bddfb52012-02-23 15:43:14 -0500157 MOVW $0xfffff001, R6
158 CMP R6, R0
159 RSB.HI $0, R0
Russ Cox25f6b022014-08-27 11:32:17 -0400160 MOVW R0, ret+24(FP)
Kai Backman52891952009-06-10 11:53:07 -0700161 RET
162
Keith Randall0273dc12013-08-07 12:20:05 -0700163TEXT runtime·munmap(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800164 MOVW addr+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800165 MOVW n+4(FP), R1
Russ Coxd4cc5572010-09-07 09:57:22 -0400166 MOVW $SYS_munmap, R7
167 SWI $0
Shenghou Ma1bddfb52012-02-23 15:43:14 -0500168 MOVW $0xfffff001, R6
169 CMP R6, R0
Shenghou Mad8fd8d82013-05-28 20:13:02 +0800170 MOVW.HI $0, R8 // crash on syscall failure
171 MOVW.HI R8, (R8)
Russ Coxd4cc5572010-09-07 09:57:22 -0400172 RET
173
Keith Randall0273dc12013-08-07 12:20:05 -0700174TEXT runtime·madvise(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800175 MOVW addr+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800176 MOVW n+4(FP), R1
177 MOVW flags+8(FP), R2
Sébastien Paolaccie6f5a902011-12-12 16:33:13 -0500178 MOVW $SYS_madvise, R7
179 SWI $0
Russ Cox295a4d82012-12-22 15:06:28 -0500180 // ignore failure - maybe pages are locked
Sébastien Paolaccie6f5a902011-12-12 16:33:13 -0500181 RET
182
Keith Randall0273dc12013-08-07 12:20:05 -0700183TEXT runtime·setitimer(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800184 MOVW mode+0(FP), R0
185 MOVW new+4(FP), R1
186 MOVW old+8(FP), R2
Russ Cox8dee8722011-03-23 11:31:42 -0400187 MOVW $SYS_setitimer, R7
188 SWI $0
189 RET
190
Keith Randall0273dc12013-08-07 12:20:05 -0700191TEXT runtime·mincore(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800192 MOVW addr+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800193 MOVW n+4(FP), R1
194 MOVW dst+8(FP), R2
Jonathan Markddde52a2011-06-07 21:50:10 -0700195 MOVW $SYS_mincore, R7
196 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400197 MOVW R0, ret+12(FP)
Jonathan Markddde52a2011-06-07 21:50:10 -0700198 RET
199
Keith Randall0273dc12013-08-07 12:20:05 -0700200TEXT time·now(SB), NOSPLIT, $32
Shenghou Ma7777bac2012-12-18 22:57:25 +0800201 MOVW $0, R0 // CLOCK_REALTIME
202 MOVW $8(R13), R1 // timespec
203 MOVW $SYS_clock_gettime, R7
Russ Coxefe3d352011-11-30 11:59:44 -0500204 SWI $0
205
206 MOVW 8(R13), R0 // sec
Shenghou Ma7777bac2012-12-18 22:57:25 +0800207 MOVW 12(R13), R2 // nsec
Russ Coxefe3d352011-11-30 11:59:44 -0500208
Rob Pike345350b2015-02-17 18:30:27 -0800209 MOVW R0, sec+0(FP)
Russ Coxefe3d352011-11-30 11:59:44 -0500210 MOVW $0, R1
Rob Pike345350b2015-02-17 18:30:27 -0800211 MOVW R1, loc+4(FP)
212 MOVW R2, nsec+8(FP)
Russ Coxefe3d352011-11-30 11:59:44 -0500213 RET
214
Russ Cox25f6b022014-08-27 11:32:17 -0400215// int64 nanotime(void)
Keith Randall0273dc12013-08-07 12:20:05 -0700216TEXT runtime·nanotime(SB),NOSPLIT,$32
Mikio Hara7206f502014-02-25 23:03:01 +0900217 MOVW $1, R0 // CLOCK_MONOTONIC
Shenghou Ma7777bac2012-12-18 22:57:25 +0800218 MOVW $8(R13), R1 // timespec
219 MOVW $SYS_clock_gettime, R7
Russ Cox66cdc692010-02-10 15:01:02 -0800220 SWI $0
Russ Cox7f5ae482011-11-04 08:38:10 -0400221
222 MOVW 8(R13), R0 // sec
Shenghou Ma7777bac2012-12-18 22:57:25 +0800223 MOVW 12(R13), R2 // nsec
Russ Cox7f5ae482011-11-04 08:38:10 -0400224
225 MOVW $1000000000, R3
226 MULLU R0, R3, (R1, R0)
Russ Cox7f5ae482011-11-04 08:38:10 -0400227 MOVW $0, R4
Russ Cox7f5ae482011-11-04 08:38:10 -0400228 ADD.S R2, R0
229 ADC R4, R1
Shenghou Ma7777bac2012-12-18 22:57:25 +0800230
Russ Cox25f6b022014-08-27 11:32:17 -0400231 MOVW R0, ret_lo+0(FP)
232 MOVW R1, ret_hi+4(FP)
Russ Cox66cdc692010-02-10 15:01:02 -0800233 RET
234
Kai Backman770b8722009-10-29 21:21:14 -0700235// int32 futex(int32 *uaddr, int32 op, int32 val,
Kai Backman52891952009-06-10 11:53:07 -0700236// struct timespec *timeout, int32 *uaddr2, int32 val2);
Keith Randall0273dc12013-08-07 12:20:05 -0700237TEXT runtime·futex(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800238 // TODO: Rewrite to use FP references. Vet complains.
Rob Pike345350b2015-02-17 18:30:27 -0800239 MOVW 4(R13), R0
240 MOVW 8(R13), R1
241 MOVW 12(R13), R2
242 MOVW 16(R13), R3
243 MOVW 20(R13), R4
244 MOVW 24(R13), R5
Kai Backman52c549f2009-11-05 22:53:08 -0800245 MOVW $SYS_futex, R7
246 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400247 MOVW R0, ret+24(FP)
Kai Backman52891952009-06-10 11:53:07 -0700248 RET
249
Jingcheng Zhang70e967b2012-12-19 00:30:29 +0800250// int32 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void));
Keith Randall0273dc12013-08-07 12:20:05 -0700251TEXT runtime·clone(SB),NOSPLIT,$0
Kai Backman770b8722009-10-29 21:21:14 -0700252 MOVW flags+0(FP), R0
Russ Cox25f6b022014-08-27 11:32:17 -0400253 MOVW stk+4(FP), R1
Kai Backman770b8722009-10-29 21:21:14 -0700254 MOVW $0, R2 // parent tid ptr
255 MOVW $0, R3 // tls_val
256 MOVW $0, R4 // child tid ptr
257 MOVW $0, R5
258
Jingcheng Zhang70e967b2012-12-19 00:30:29 +0800259 // Copy mp, gp, fn off parent stack for use by child.
Kai Backman770b8722009-10-29 21:21:14 -0700260 // TODO(kaib): figure out which registers are clobbered by clone and avoid stack copying
261 MOVW $-16(R1), R1
262 MOVW mm+8(FP), R6
263 MOVW R6, 0(R1)
264 MOVW gg+12(FP), R6
265 MOVW R6, 4(R1)
266 MOVW fn+16(FP), R6
267 MOVW R6, 8(R1)
268 MOVW $1234, R6
269 MOVW R6, 12(R1)
270
Kai Backman52c549f2009-11-05 22:53:08 -0800271 MOVW $SYS_clone, R7
272 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700273
274 // In parent, return.
275 CMP $0, R0
Russ Cox25f6b022014-08-27 11:32:17 -0400276 BEQ 3(PC)
277 MOVW R0, ret+20(FP)
Kai Backman770b8722009-10-29 21:21:14 -0700278 RET
279
280 // Paranoia: check that SP is as we expect. Use R13 to avoid linker 'fixup'
281 MOVW 12(R13), R0
282 MOVW $1234, R1
283 CMP R0, R1
284 BEQ 2(PC)
Russ Cox68b42552010-11-04 14:00:19 -0400285 BL runtime·abort(SB)
Kai Backman770b8722009-10-29 21:21:14 -0700286
Srdjan Petrovicca9128f2015-04-17 17:27:07 -0700287 MOVW 0(R13), R8 // m
288 MOVW 4(R13), R0 // g
289
290 CMP $0, R8
291 BEQ nog
292 CMP $0, R0
293 BEQ nog
294
295 MOVW R0, g
Russ Cox89f185f2014-06-26 11:54:39 -0400296 MOVW R8, g_m(g)
Kai Backman770b8722009-10-29 21:21:14 -0700297
298 // paranoia; check they are not nil
Russ Cox89f185f2014-06-26 11:54:39 -0400299 MOVW 0(R8), R0
Kai Backman770b8722009-10-29 21:21:14 -0700300 MOVW 0(g), R0
301
Russ Cox68b42552010-11-04 14:00:19 -0400302 BL runtime·emptyfunc(SB) // fault if stack check is wrong
Kai Backman770b8722009-10-29 21:21:14 -0700303
304 // Initialize m->procid to Linux tid
Kai Backman52c549f2009-11-05 22:53:08 -0800305 MOVW $SYS_gettid, R7
306 SWI $0
Russ Cox89f185f2014-06-26 11:54:39 -0400307 MOVW g_m(g), R8
308 MOVW R0, m_procid(R8)
Kai Backman770b8722009-10-29 21:21:14 -0700309
Srdjan Petrovicca9128f2015-04-17 17:27:07 -0700310nog:
Kai Backman770b8722009-10-29 21:21:14 -0700311 // Call fn
312 MOVW 8(R13), R0
313 MOVW $16(R13), R13
314 BL (R0)
315
Shenghou Maedc53e1f2015-04-22 18:03:18 -0400316 // It shouldn't return. If it does, exit that thread.
Shenghou Ma4d1ab2d2015-04-29 02:42:43 -0400317 SUB $16, R13 // restore the stack pointer to avoid memory corruption
Kai Backman770b8722009-10-29 21:21:14 -0700318 MOVW $0, R0
319 MOVW R0, 4(R13)
Russ Cox68b42552010-11-04 14:00:19 -0400320 BL runtime·exit1(SB)
Kai Backman770b8722009-10-29 21:21:14 -0700321
Srdjan Petrovic93644c92015-04-03 09:40:10 -0700322 MOVW $1234, R0
323 MOVW $1005, R1
324 MOVW R0, (R1)
325
Keith Randall0273dc12013-08-07 12:20:05 -0700326TEXT runtime·sigaltstack(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800327 MOVW new+0(FP), R0
328 MOVW old+4(FP), R1
Russ Cox6c196012010-04-05 12:51:09 -0700329 MOVW $SYS_sigaltstack, R7
330 SWI $0
Shenghou Ma1bddfb52012-02-23 15:43:14 -0500331 MOVW $0xfffff001, R6
332 CMP R6, R0
Shenghou Mad8fd8d82013-05-28 20:13:02 +0800333 MOVW.HI $0, R8 // crash on syscall failure
334 MOVW.HI R8, (R8)
Russ Cox6c196012010-04-05 12:51:09 -0700335 RET
336
Srdjan Petrovic5c8fbc62015-04-09 11:12:12 -0700337TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
338 MOVW sig+4(FP), R0
339 MOVW info+8(FP), R1
340 MOVW ctx+12(FP), R2
341 MOVW fn+0(FP), R11
342 BL (R11)
343 RET
344
345TEXT runtime·sigtramp(SB),NOSPLIT,$12
Shenghou Ma5cffce62012-05-04 18:20:09 +0800346 // this might be called in external code context,
Russ Cox89f185f2014-06-26 11:54:39 -0400347 // where g is not set.
348 // first save R0, because runtime·load_g will clobber it
Shenghou Ma5cffce62012-05-04 18:20:09 +0800349 MOVW R0, 4(R13)
Elias Naur45233732013-08-14 15:38:54 +0000350 MOVB runtime·iscgo(SB), R0
Shenghou Ma5cffce62012-05-04 18:20:09 +0800351 CMP $0, R0
Russ Cox89f185f2014-06-26 11:54:39 -0400352 BL.NE runtime·load_g(SB)
Shenghou Ma5cffce62012-05-04 18:20:09 +0800353
Russ Cox6c196012010-04-05 12:51:09 -0700354 MOVW R1, 8(R13)
355 MOVW R2, 12(R13)
Srdjan Petrovic5c8fbc62015-04-09 11:12:12 -0700356 MOVW $runtime·sigtrampgo(SB), R11
357 BL (R11)
Russ Cox6c196012010-04-05 12:51:09 -0700358 RET
359
Keith Randall0273dc12013-08-07 12:20:05 -0700360TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800361 MOVW sig+0(FP), R0
362 MOVW new+4(FP), R1
363 MOVW old+8(FP), R2
364 MOVW size+12(FP), R3
Russ Cox240b1d52012-02-23 14:43:58 -0500365 MOVW $SYS_rt_sigprocmask, R7
366 SWI $0
367 RET
368
Keith Randall0273dc12013-08-07 12:20:05 -0700369TEXT runtime·rt_sigaction(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800370 MOVW sig+0(FP), R0
371 MOVW new+4(FP), R1
372 MOVW old+8(FP), R2
373 MOVW size+12(FP), R3
Russ Cox6c196012010-04-05 12:51:09 -0700374 MOVW $SYS_rt_sigaction, R7
375 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400376 MOVW R0, ret+16(FP)
Russ Cox6c196012010-04-05 12:51:09 -0700377 RET
378
Keith Randall0273dc12013-08-07 12:20:05 -0700379TEXT runtime·usleep(SB),NOSPLIT,$12
Russ Coxd324f212011-09-30 09:40:01 -0400380 MOVW usec+0(FP), R0
Russ Coxc9d2c7f2015-07-30 10:54:53 -0400381 CALL runtime·usplitR0(SB)
Rob Pike345350b2015-02-17 18:30:27 -0800382 MOVW R0, 4(R13)
383 MOVW R1, 8(R13)
Russ Coxd324f212011-09-30 09:40:01 -0400384 MOVW $0, R0
385 MOVW $0, R1
386 MOVW $0, R2
387 MOVW $0, R3
Rob Pike345350b2015-02-17 18:30:27 -0800388 MOVW $4(R13), R4
Russ Coxd324f212011-09-30 09:40:01 -0400389 MOVW $SYS_select, R7
390 SWI $0
391 RET
392
Shenghou Ma1bddfb52012-02-23 15:43:14 -0500393// Use kernel version instead of native armcas in asm_arm.s.
394// See ../sync/atomic/asm_linux_arm.s for details.
Keith Randall0273dc12013-08-07 12:20:05 -0700395TEXT cas<>(SB),NOSPLIT,$0
Rob Pike69ddb7a2015-02-13 14:21:18 -0800396 MOVW $0xffff0fc0, R15 // R15 is hardware PC.
Russ Cox9ad97422011-02-25 14:29:55 -0500397
Keith Randall0273dc12013-08-07 12:20:05 -0700398TEXT runtime·cas(SB),NOSPLIT,$0
Russ Cox25f6b022014-08-27 11:32:17 -0400399 MOVW ptr+0(FP), R2
Russ Cox9ad97422011-02-25 14:29:55 -0500400 MOVW old+4(FP), R0
Russ Coxb55791e2014-10-28 21:50:16 -0400401loop:
Russ Cox9ad97422011-02-25 14:29:55 -0500402 MOVW new+8(FP), R1
403 BL cas<>(SB)
Russ Coxb55791e2014-10-28 21:50:16 -0400404 BCC check
Dmitriy Vyukov92254d42013-08-12 21:36:33 +0400405 MOVW $1, R0
Russ Cox25f6b022014-08-27 11:32:17 -0400406 MOVB R0, ret+12(FP)
Russ Cox9ad97422011-02-25 14:29:55 -0500407 RET
Russ Coxb55791e2014-10-28 21:50:16 -0400408check:
Russ Cox540feaa2011-05-02 10:49:19 -0400409 // Kernel lies; double-check.
Russ Cox25f6b022014-08-27 11:32:17 -0400410 MOVW ptr+0(FP), R2
Russ Cox540feaa2011-05-02 10:49:19 -0400411 MOVW old+4(FP), R0
412 MOVW 0(R2), R3
413 CMP R0, R3
Russ Coxb55791e2014-10-28 21:50:16 -0400414 BEQ loop
Dmitriy Vyukov92254d42013-08-12 21:36:33 +0400415 MOVW $0, R0
Russ Cox25f6b022014-08-27 11:32:17 -0400416 MOVB R0, ret+12(FP)
Russ Cox540feaa2011-05-02 10:49:19 -0400417 RET
418
Russ Cox15ced2d2014-11-11 17:06:22 -0500419TEXT runtime·casp1(SB),NOSPLIT,$0
Russ Cox9ad97422011-02-25 14:29:55 -0500420 B runtime·cas(SB)
421
Austin Clementsf5d494b2015-06-15 12:30:23 -0400422// As for cas, memory barriers are complicated on ARM, but the kernel
423// provides a user helper. ARMv5 does not support SMP and has no
424// memory barrier instruction at all. ARMv6 added SMP support and has
425// a memory barrier, but it requires writing to a coprocessor
426// register. ARMv7 introduced the DMB instruction, but it's expensive
427// even on single-core devices. The kernel helper takes care of all of
428// this for us.
429
430TEXT publicationBarrier<>(SB),NOSPLIT,$0
431 // void __kuser_memory_barrier(void);
432 MOVW $0xffff0fa0, R15 // R15 is hardware PC.
433
434TEXT ·publicationBarrier(SB),NOSPLIT,$0
435 BL publicationBarrier<>(SB)
436 RET
437
Keith Randall0273dc12013-08-07 12:20:05 -0700438TEXT runtime·osyield(SB),NOSPLIT,$0
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -0400439 MOVW $SYS_sched_yield, R7
440 SWI $0
441 RET
Shenghou Ma4f308ed2012-08-10 10:05:26 +0800442
Keith Randall0273dc12013-08-07 12:20:05 -0700443TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800444 MOVW pid+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800445 MOVW len+4(FP), R1
446 MOVW buf+8(FP), R2
Shenghou Ma4f308ed2012-08-10 10:05:26 +0800447 MOVW $SYS_sched_getaffinity, R7
448 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400449 MOVW R0, ret+12(FP)
Shenghou Ma4f308ed2012-08-10 10:05:26 +0800450 RET
Shenghou Ma1d64d042013-03-16 04:01:56 +0800451
452// int32 runtime·epollcreate(int32 size)
Keith Randall0273dc12013-08-07 12:20:05 -0700453TEXT runtime·epollcreate(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800454 MOVW size+0(FP), R0
Shenghou Ma1d64d042013-03-16 04:01:56 +0800455 MOVW $SYS_epoll_create, R7
456 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400457 MOVW R0, ret+4(FP)
Shenghou Ma1d64d042013-03-16 04:01:56 +0800458 RET
459
460// int32 runtime·epollcreate1(int32 flags)
Keith Randall0273dc12013-08-07 12:20:05 -0700461TEXT runtime·epollcreate1(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800462 MOVW flags+0(FP), R0
Shenghou Ma1d64d042013-03-16 04:01:56 +0800463 MOVW $SYS_epoll_create1, R7
464 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400465 MOVW R0, ret+4(FP)
Shenghou Ma1d64d042013-03-16 04:01:56 +0800466 RET
467
Dmitriy Vyukov91a670d2014-09-04 10:04:04 +0400468// func epollctl(epfd, op, fd int32, ev *epollEvent) int
Keith Randall0273dc12013-08-07 12:20:05 -0700469TEXT runtime·epollctl(SB),NOSPLIT,$0
Dmitriy Vyukov91a670d2014-09-04 10:04:04 +0400470 MOVW epfd+0(FP), R0
471 MOVW op+4(FP), R1
472 MOVW fd+8(FP), R2
473 MOVW ev+12(FP), R3
Shenghou Ma1d64d042013-03-16 04:01:56 +0800474 MOVW $SYS_epoll_ctl, R7
475 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400476 MOVW R0, ret+16(FP)
Shenghou Ma1d64d042013-03-16 04:01:56 +0800477 RET
478
479// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout)
Keith Randall0273dc12013-08-07 12:20:05 -0700480TEXT runtime·epollwait(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800481 MOVW epfd+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800482 MOVW ev+4(FP), R1
483 MOVW nev+8(FP), R2
Rob Pike345350b2015-02-17 18:30:27 -0800484 MOVW timeout+12(FP), R3
Shenghou Ma1d64d042013-03-16 04:01:56 +0800485 MOVW $SYS_epoll_wait, R7
486 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400487 MOVW R0, ret+16(FP)
Shenghou Ma1d64d042013-03-16 04:01:56 +0800488 RET
489
490// void runtime·closeonexec(int32 fd)
Keith Randall0273dc12013-08-07 12:20:05 -0700491TEXT runtime·closeonexec(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800492 MOVW fd+0(FP), R0 // fd
Shenghou Ma1d64d042013-03-16 04:01:56 +0800493 MOVW $2, R1 // F_SETFD
494 MOVW $1, R2 // FD_CLOEXEC
495 MOVW $SYS_fcntl, R7
Dmitriy Vyukov92254d42013-08-12 21:36:33 +0400496 SWI $0
Shenghou Ma1d64d042013-03-16 04:01:56 +0800497 RET
Elias Naur45233732013-08-14 15:38:54 +0000498
499// b __kuser_get_tls @ 0xffff0fe0
500TEXT runtime·read_tls_fallback(SB),NOSPLIT,$-4
501 MOVW $0xffff0fe0, R0
502 B (R0)
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -0500503
504TEXT runtime·access(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800505 MOVW name+0(FP), R0
506 MOVW mode+4(FP), R1
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -0500507 MOVW $SYS_access, R7
508 SWI $0
509 MOVW R0, ret+8(FP)
510 RET
511
512TEXT runtime·connect(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800513 MOVW fd+0(FP), R0
514 MOVW addr+4(FP), R1
515 MOVW addrlen+8(FP), R2
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -0500516 MOVW $SYS_connect, R7
517 SWI $0
518 MOVW R0, ret+12(FP)
519 RET
520
521TEXT runtime·socket(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800522 MOVW domain+0(FP), R0
523 MOVW type+4(FP), R1
524 MOVW protocol+8(FP), R2
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -0500525 MOVW $SYS_socket, R7
526 SWI $0
527 MOVW R0, ret+12(FP)
528 RET