blob: ef72ae0308431285d957c4f9d38fdc0e358aa99e [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)
Austin Clements4dcba022017-05-18 16:56:48 -040039#define SYS_pselect6 (SYS_BASE + 335)
Shenghou Ma4f308ed2012-08-10 10:05:26 +080040#define SYS_sched_getaffinity (SYS_BASE + 242)
Shenghou Ma7777bac2012-12-18 22:57:25 +080041#define SYS_clock_gettime (SYS_BASE + 263)
Shenghou Ma1d64d042013-03-16 04:01:56 +080042#define SYS_epoll_create (SYS_BASE + 250)
43#define SYS_epoll_ctl (SYS_BASE + 251)
44#define SYS_epoll_wait (SYS_BASE + 252)
45#define SYS_epoll_create1 (SYS_BASE + 357)
46#define SYS_fcntl (SYS_BASE + 55)
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -050047#define SYS_access (SYS_BASE + 33)
48#define SYS_connect (SYS_BASE + 283)
49#define SYS_socket (SYS_BASE + 281)
Austin Clementsbb6309c2017-04-06 14:32:37 -040050#define SYS_brk (SYS_BASE + 45)
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
Austin Clementsa046caa2018-01-25 12:15:23 -0500100TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0
Rob Pike345350b2015-02-17 18:30:27 -0800101 MOVW code+0(FP), R0
Kai Backman52c549f2009-11-05 22:53:08 -0800102 MOVW $SYS_exit_group, R7
103 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700104 MOVW $1234, R0
105 MOVW $1002, R1
106 MOVW R0, (R1) // fail hard
107
Austin Clementsa046caa2018-01-25 12:15:23 -0500108TEXT exit1<>(SB),NOSPLIT|NOFRAME,$0
Rob Pike345350b2015-02-17 18:30:27 -0800109 MOVW code+0(FP), R0
Kai Backman52c549f2009-11-05 22:53:08 -0800110 MOVW $SYS_exit, R7
111 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700112 MOVW $1234, R0
113 MOVW $1003, R1
114 MOVW R0, (R1) // fail hard
Kai Backman52891952009-06-10 11:53:07 -0700115
Austin Clementseff2b262017-06-16 15:54:21 -0400116// func exitThread(wait *uint32)
Austin Clementsa046caa2018-01-25 12:15:23 -0500117TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-4
Austin Clementseff2b262017-06-16 15:54:21 -0400118 MOVW wait+0(FP), R0
119 // We're done using the stack.
120 // Alas, there's no reliable way to make this write atomic
121 // without potentially using the stack. So it goes.
122 MOVW $0, R1
123 MOVW R1, (R0)
124 MOVW $0, R0 // exit code
125 MOVW $SYS_exit, R7
126 SWI $0
127 MOVW $1234, R0
128 MOVW $1004, R1
129 MOVW R0, (R1) // fail hard
130 JMP 0(PC)
131
Russ Coxa9e53642015-06-22 12:32:05 -0400132TEXT runtime·gettid(SB),NOSPLIT,$0-4
133 MOVW $SYS_gettid, R7
134 SWI $0
135 MOVW R0, ret+0(FP)
136 RET
137
Austin Clementsa046caa2018-01-25 12:15:23 -0500138TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0
Russ Cox8698bb62011-04-25 16:58:00 -0400139 MOVW $SYS_gettid, R7
140 SWI $0
141 // arg 1 tid already in R0 from gettid
Russ Cox5146a932013-03-15 01:11:03 -0400142 MOVW sig+0(FP), R1 // arg 2 - signal
Russ Cox8698bb62011-04-25 16:58:00 -0400143 MOVW $SYS_tkill, R7
144 SWI $0
145 RET
146
Austin Clementsa046caa2018-01-25 12:15:23 -0500147TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
Russ Cox5bfed7c2015-01-14 11:18:24 -0500148 MOVW $SYS_getpid, R7
149 SWI $0
150 // arg 1 tid already in R0 from getpid
151 MOVW sig+0(FP), R1 // arg 2 - signal
152 MOVW $SYS_kill, R7
153 SWI $0
154 RET
155
Keith Randall0273dc12013-08-07 12:20:05 -0700156TEXT runtime·mmap(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800157 MOVW addr+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800158 MOVW n+4(FP), R1
Rob Pike345350b2015-02-17 18:30:27 -0800159 MOVW prot+8(FP), R2
160 MOVW flags+12(FP), R3
161 MOVW fd+16(FP), R4
162 MOVW off+20(FP), R5
Kai Backman52c549f2009-11-05 22:53:08 -0800163 MOVW $SYS_mmap2, R7
164 SWI $0
Shenghou Ma1bddfb52012-02-23 15:43:14 -0500165 MOVW $0xfffff001, R6
166 CMP R6, R0
Austin Clements193088b2017-10-16 20:28:29 -0400167 MOVW $0, R1
Shenghou Ma1bddfb52012-02-23 15:43:14 -0500168 RSB.HI $0, R0
Austin Clements193088b2017-10-16 20:28:29 -0400169 MOVW.HI R0, R1 // if error, put in R1
170 MOVW.HI $0, R0
171 MOVW R0, p+24(FP)
172 MOVW R1, err+28(FP)
Kai Backman52891952009-06-10 11:53:07 -0700173 RET
174
Keith Randall0273dc12013-08-07 12:20:05 -0700175TEXT runtime·munmap(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800176 MOVW addr+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800177 MOVW n+4(FP), R1
Russ Coxd4cc5572010-09-07 09:57:22 -0400178 MOVW $SYS_munmap, R7
179 SWI $0
Shenghou Ma1bddfb52012-02-23 15:43:14 -0500180 MOVW $0xfffff001, R6
181 CMP R6, R0
Shenghou Mad8fd8d82013-05-28 20:13:02 +0800182 MOVW.HI $0, R8 // crash on syscall failure
183 MOVW.HI R8, (R8)
Russ Coxd4cc5572010-09-07 09:57:22 -0400184 RET
185
Keith Randall0273dc12013-08-07 12:20:05 -0700186TEXT runtime·madvise(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800187 MOVW addr+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800188 MOVW n+4(FP), R1
189 MOVW flags+8(FP), R2
Sébastien Paolaccie6f5a902011-12-12 16:33:13 -0500190 MOVW $SYS_madvise, R7
191 SWI $0
Russ Cox295a4d82012-12-22 15:06:28 -0500192 // ignore failure - maybe pages are locked
Sébastien Paolaccie6f5a902011-12-12 16:33:13 -0500193 RET
194
Keith Randall0273dc12013-08-07 12:20:05 -0700195TEXT runtime·setitimer(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800196 MOVW mode+0(FP), R0
197 MOVW new+4(FP), R1
198 MOVW old+8(FP), R2
Russ Cox8dee8722011-03-23 11:31:42 -0400199 MOVW $SYS_setitimer, R7
200 SWI $0
201 RET
202
Keith Randall0273dc12013-08-07 12:20:05 -0700203TEXT runtime·mincore(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800204 MOVW addr+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800205 MOVW n+4(FP), R1
206 MOVW dst+8(FP), R2
Jonathan Markddde52a2011-06-07 21:50:10 -0700207 MOVW $SYS_mincore, R7
208 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400209 MOVW R0, ret+12(FP)
Jonathan Markddde52a2011-06-07 21:50:10 -0700210 RET
211
Russ Cox0e335592017-02-02 16:20:58 -0500212TEXT runtime·walltime(SB), NOSPLIT, $32
Shenghou Ma7777bac2012-12-18 22:57:25 +0800213 MOVW $0, R0 // CLOCK_REALTIME
214 MOVW $8(R13), R1 // timespec
215 MOVW $SYS_clock_gettime, R7
Russ Coxefe3d352011-11-30 11:59:44 -0500216 SWI $0
217
218 MOVW 8(R13), R0 // sec
Shenghou Ma7777bac2012-12-18 22:57:25 +0800219 MOVW 12(R13), R2 // nsec
Russ Coxefe3d352011-11-30 11:59:44 -0500220
Josh Bleecher Snyderef30a1c2017-02-13 09:06:08 -0800221 MOVW R0, sec_lo+0(FP)
Russ Coxefe3d352011-11-30 11:59:44 -0500222 MOVW $0, R1
Josh Bleecher Snyderef30a1c2017-02-13 09:06:08 -0800223 MOVW R1, sec_hi+4(FP)
Rob Pike345350b2015-02-17 18:30:27 -0800224 MOVW R2, nsec+8(FP)
Russ Coxefe3d352011-11-30 11:59:44 -0500225 RET
226
Russ Cox25f6b022014-08-27 11:32:17 -0400227// int64 nanotime(void)
Keith Randall0273dc12013-08-07 12:20:05 -0700228TEXT runtime·nanotime(SB),NOSPLIT,$32
Mikio Hara7206f502014-02-25 23:03:01 +0900229 MOVW $1, R0 // CLOCK_MONOTONIC
Shenghou Ma7777bac2012-12-18 22:57:25 +0800230 MOVW $8(R13), R1 // timespec
231 MOVW $SYS_clock_gettime, R7
Russ Cox66cdc692010-02-10 15:01:02 -0800232 SWI $0
Russ Cox7f5ae482011-11-04 08:38:10 -0400233
234 MOVW 8(R13), R0 // sec
Shenghou Ma7777bac2012-12-18 22:57:25 +0800235 MOVW 12(R13), R2 // nsec
Russ Cox7f5ae482011-11-04 08:38:10 -0400236
237 MOVW $1000000000, R3
238 MULLU R0, R3, (R1, R0)
Russ Cox7f5ae482011-11-04 08:38:10 -0400239 MOVW $0, R4
Russ Cox7f5ae482011-11-04 08:38:10 -0400240 ADD.S R2, R0
241 ADC R4, R1
Shenghou Ma7777bac2012-12-18 22:57:25 +0800242
Russ Cox25f6b022014-08-27 11:32:17 -0400243 MOVW R0, ret_lo+0(FP)
244 MOVW R1, ret_hi+4(FP)
Russ Cox66cdc692010-02-10 15:01:02 -0800245 RET
246
Kai Backman770b8722009-10-29 21:21:14 -0700247// int32 futex(int32 *uaddr, int32 op, int32 val,
Kai Backman52891952009-06-10 11:53:07 -0700248// struct timespec *timeout, int32 *uaddr2, int32 val2);
Keith Randall0273dc12013-08-07 12:20:05 -0700249TEXT runtime·futex(SB),NOSPLIT,$0
Josh Bleecher Snyder71ab9fa2016-07-11 16:05:57 -0700250 MOVW addr+0(FP), R0
251 MOVW op+4(FP), R1
252 MOVW val+8(FP), R2
253 MOVW ts+12(FP), R3
254 MOVW addr2+16(FP), R4
255 MOVW val3+20(FP), R5
Kai Backman52c549f2009-11-05 22:53:08 -0800256 MOVW $SYS_futex, R7
257 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400258 MOVW R0, ret+24(FP)
Kai Backman52891952009-06-10 11:53:07 -0700259 RET
260
Jingcheng Zhang70e967b2012-12-19 00:30:29 +0800261// int32 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void));
Keith Randall0273dc12013-08-07 12:20:05 -0700262TEXT runtime·clone(SB),NOSPLIT,$0
Kai Backman770b8722009-10-29 21:21:14 -0700263 MOVW flags+0(FP), R0
Russ Cox25f6b022014-08-27 11:32:17 -0400264 MOVW stk+4(FP), R1
Kai Backman770b8722009-10-29 21:21:14 -0700265 MOVW $0, R2 // parent tid ptr
266 MOVW $0, R3 // tls_val
267 MOVW $0, R4 // child tid ptr
268 MOVW $0, R5
269
Jingcheng Zhang70e967b2012-12-19 00:30:29 +0800270 // Copy mp, gp, fn off parent stack for use by child.
Kai Backman770b8722009-10-29 21:21:14 -0700271 // TODO(kaib): figure out which registers are clobbered by clone and avoid stack copying
272 MOVW $-16(R1), R1
Josh Bleecher Snyder71ab9fa2016-07-11 16:05:57 -0700273 MOVW mp+8(FP), R6
Kai Backman770b8722009-10-29 21:21:14 -0700274 MOVW R6, 0(R1)
Josh Bleecher Snyder71ab9fa2016-07-11 16:05:57 -0700275 MOVW gp+12(FP), R6
Kai Backman770b8722009-10-29 21:21:14 -0700276 MOVW R6, 4(R1)
277 MOVW fn+16(FP), R6
278 MOVW R6, 8(R1)
279 MOVW $1234, R6
280 MOVW R6, 12(R1)
281
Kai Backman52c549f2009-11-05 22:53:08 -0800282 MOVW $SYS_clone, R7
283 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700284
285 // In parent, return.
286 CMP $0, R0
Russ Cox25f6b022014-08-27 11:32:17 -0400287 BEQ 3(PC)
288 MOVW R0, ret+20(FP)
Kai Backman770b8722009-10-29 21:21:14 -0700289 RET
290
291 // Paranoia: check that SP is as we expect. Use R13 to avoid linker 'fixup'
292 MOVW 12(R13), R0
293 MOVW $1234, R1
294 CMP R0, R1
295 BEQ 2(PC)
Russ Cox68b42552010-11-04 14:00:19 -0400296 BL runtime·abort(SB)
Kai Backman770b8722009-10-29 21:21:14 -0700297
Srdjan Petrovicca9128f2015-04-17 17:27:07 -0700298 MOVW 0(R13), R8 // m
299 MOVW 4(R13), R0 // g
300
301 CMP $0, R8
302 BEQ nog
303 CMP $0, R0
304 BEQ nog
305
306 MOVW R0, g
Russ Cox89f185f2014-06-26 11:54:39 -0400307 MOVW R8, g_m(g)
Kai Backman770b8722009-10-29 21:21:14 -0700308
309 // paranoia; check they are not nil
Russ Cox89f185f2014-06-26 11:54:39 -0400310 MOVW 0(R8), R0
Kai Backman770b8722009-10-29 21:21:14 -0700311 MOVW 0(g), R0
312
Russ Cox68b42552010-11-04 14:00:19 -0400313 BL runtime·emptyfunc(SB) // fault if stack check is wrong
Kai Backman770b8722009-10-29 21:21:14 -0700314
315 // Initialize m->procid to Linux tid
Kai Backman52c549f2009-11-05 22:53:08 -0800316 MOVW $SYS_gettid, R7
317 SWI $0
Russ Cox89f185f2014-06-26 11:54:39 -0400318 MOVW g_m(g), R8
319 MOVW R0, m_procid(R8)
Kai Backman770b8722009-10-29 21:21:14 -0700320
Srdjan Petrovicca9128f2015-04-17 17:27:07 -0700321nog:
Kai Backman770b8722009-10-29 21:21:14 -0700322 // Call fn
323 MOVW 8(R13), R0
324 MOVW $16(R13), R13
325 BL (R0)
326
Brad Fitzpatrick5fea2cc2016-03-01 23:21:55 +0000327 // It shouldn't return. If it does, exit that thread.
Shenghou Ma4d1ab2d2015-04-29 02:42:43 -0400328 SUB $16, R13 // restore the stack pointer to avoid memory corruption
Kai Backman770b8722009-10-29 21:21:14 -0700329 MOVW $0, R0
330 MOVW R0, 4(R13)
Austin Clementseff2b262017-06-16 15:54:21 -0400331 BL exit1<>(SB)
Kai Backman770b8722009-10-29 21:21:14 -0700332
Srdjan Petrovic93644c92015-04-03 09:40:10 -0700333 MOVW $1234, R0
334 MOVW $1005, R1
335 MOVW R0, (R1)
336
Keith Randall0273dc12013-08-07 12:20:05 -0700337TEXT runtime·sigaltstack(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800338 MOVW new+0(FP), R0
339 MOVW old+4(FP), R1
Russ Cox6c196012010-04-05 12:51:09 -0700340 MOVW $SYS_sigaltstack, R7
341 SWI $0
Shenghou Ma1bddfb52012-02-23 15:43:14 -0500342 MOVW $0xfffff001, R6
343 CMP R6, R0
Shenghou Mad8fd8d82013-05-28 20:13:02 +0800344 MOVW.HI $0, R8 // crash on syscall failure
345 MOVW.HI R8, (R8)
Russ Cox6c196012010-04-05 12:51:09 -0700346 RET
347
Srdjan Petrovic5c8fbc62015-04-09 11:12:12 -0700348TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
349 MOVW sig+4(FP), R0
350 MOVW info+8(FP), R1
351 MOVW ctx+12(FP), R2
352 MOVW fn+0(FP), R11
Ian Lance Taylorfbdfa992015-12-16 12:16:17 -0800353 MOVW R13, R4
354 SUB $24, R13
355 BIC $0x7, R13 // alignment for ELF ABI
Srdjan Petrovic5c8fbc62015-04-09 11:12:12 -0700356 BL (R11)
Ian Lance Taylorfbdfa992015-12-16 12:16:17 -0800357 MOVW R4, R13
Srdjan Petrovic5c8fbc62015-04-09 11:12:12 -0700358 RET
359
360TEXT runtime·sigtramp(SB),NOSPLIT,$12
Shenghou Ma5cffce62012-05-04 18:20:09 +0800361 // this might be called in external code context,
Russ Cox89f185f2014-06-26 11:54:39 -0400362 // where g is not set.
363 // first save R0, because runtime·load_g will clobber it
Shenghou Ma5cffce62012-05-04 18:20:09 +0800364 MOVW R0, 4(R13)
Elias Naur45233732013-08-14 15:38:54 +0000365 MOVB runtime·iscgo(SB), R0
Shenghou Ma5cffce62012-05-04 18:20:09 +0800366 CMP $0, R0
Russ Cox89f185f2014-06-26 11:54:39 -0400367 BL.NE runtime·load_g(SB)
Shenghou Ma5cffce62012-05-04 18:20:09 +0800368
Russ Cox6c196012010-04-05 12:51:09 -0700369 MOVW R1, 8(R13)
370 MOVW R2, 12(R13)
Srdjan Petrovic5c8fbc62015-04-09 11:12:12 -0700371 MOVW $runtime·sigtrampgo(SB), R11
372 BL (R11)
Russ Cox6c196012010-04-05 12:51:09 -0700373 RET
374
Ian Lance Taylorea306ae2015-12-11 17:16:48 -0800375TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
376 MOVW $runtime·sigtramp(SB), R11
377 B (R11)
378
Keith Randall0273dc12013-08-07 12:20:05 -0700379TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0
Ian Lance Taylorab552aa2016-09-23 17:54:51 -0700380 MOVW how+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800381 MOVW new+4(FP), R1
382 MOVW old+8(FP), R2
383 MOVW size+12(FP), R3
Russ Cox240b1d52012-02-23 14:43:58 -0500384 MOVW $SYS_rt_sigprocmask, R7
385 SWI $0
386 RET
387
Keith Randall0273dc12013-08-07 12:20:05 -0700388TEXT runtime·rt_sigaction(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800389 MOVW sig+0(FP), R0
390 MOVW new+4(FP), R1
391 MOVW old+8(FP), R2
392 MOVW size+12(FP), R3
Russ Cox6c196012010-04-05 12:51:09 -0700393 MOVW $SYS_rt_sigaction, R7
394 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400395 MOVW R0, ret+16(FP)
Russ Cox6c196012010-04-05 12:51:09 -0700396 RET
397
Keith Randall0273dc12013-08-07 12:20:05 -0700398TEXT runtime·usleep(SB),NOSPLIT,$12
Russ Coxd324f212011-09-30 09:40:01 -0400399 MOVW usec+0(FP), R0
Russ Coxc9d2c7f2015-07-30 10:54:53 -0400400 CALL runtime·usplitR0(SB)
Rob Pike345350b2015-02-17 18:30:27 -0800401 MOVW R0, 4(R13)
Austin Clements4dcba022017-05-18 16:56:48 -0400402 MOVW $1000, R0 // usec to nsec
403 MUL R0, R1
Rob Pike345350b2015-02-17 18:30:27 -0800404 MOVW R1, 8(R13)
Russ Coxd324f212011-09-30 09:40:01 -0400405 MOVW $0, R0
406 MOVW $0, R1
407 MOVW $0, R2
408 MOVW $0, R3
Rob Pike345350b2015-02-17 18:30:27 -0800409 MOVW $4(R13), R4
Austin Clements4dcba022017-05-18 16:56:48 -0400410 MOVW $0, R5
411 MOVW $SYS_pselect6, R7
Russ Coxd324f212011-09-30 09:40:01 -0400412 SWI $0
413 RET
414
Austin Clementsf5d494b2015-06-15 12:30:23 -0400415// As for cas, memory barriers are complicated on ARM, but the kernel
416// provides a user helper. ARMv5 does not support SMP and has no
417// memory barrier instruction at all. ARMv6 added SMP support and has
418// a memory barrier, but it requires writing to a coprocessor
419// register. ARMv7 introduced the DMB instruction, but it's expensive
420// even on single-core devices. The kernel helper takes care of all of
421// this for us.
422
423TEXT publicationBarrier<>(SB),NOSPLIT,$0
424 // void __kuser_memory_barrier(void);
425 MOVW $0xffff0fa0, R15 // R15 is hardware PC.
426
427TEXT ·publicationBarrier(SB),NOSPLIT,$0
428 BL publicationBarrier<>(SB)
429 RET
430
Keith Randall0273dc12013-08-07 12:20:05 -0700431TEXT runtime·osyield(SB),NOSPLIT,$0
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -0400432 MOVW $SYS_sched_yield, R7
433 SWI $0
434 RET
Shenghou Ma4f308ed2012-08-10 10:05:26 +0800435
Keith Randall0273dc12013-08-07 12:20:05 -0700436TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800437 MOVW pid+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800438 MOVW len+4(FP), R1
439 MOVW buf+8(FP), R2
Shenghou Ma4f308ed2012-08-10 10:05:26 +0800440 MOVW $SYS_sched_getaffinity, R7
441 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400442 MOVW R0, ret+12(FP)
Shenghou Ma4f308ed2012-08-10 10:05:26 +0800443 RET
Shenghou Ma1d64d042013-03-16 04:01:56 +0800444
445// int32 runtime·epollcreate(int32 size)
Keith Randall0273dc12013-08-07 12:20:05 -0700446TEXT runtime·epollcreate(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800447 MOVW size+0(FP), R0
Shenghou Ma1d64d042013-03-16 04:01:56 +0800448 MOVW $SYS_epoll_create, R7
449 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400450 MOVW R0, ret+4(FP)
Shenghou Ma1d64d042013-03-16 04:01:56 +0800451 RET
452
453// int32 runtime·epollcreate1(int32 flags)
Keith Randall0273dc12013-08-07 12:20:05 -0700454TEXT runtime·epollcreate1(SB),NOSPLIT,$0
Rob Pikec21f1d52015-02-19 13:44:06 -0800455 MOVW flags+0(FP), R0
Shenghou Ma1d64d042013-03-16 04:01:56 +0800456 MOVW $SYS_epoll_create1, R7
457 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400458 MOVW R0, ret+4(FP)
Shenghou Ma1d64d042013-03-16 04:01:56 +0800459 RET
460
Dmitriy Vyukov91a670d2014-09-04 10:04:04 +0400461// func epollctl(epfd, op, fd int32, ev *epollEvent) int
Keith Randall0273dc12013-08-07 12:20:05 -0700462TEXT runtime·epollctl(SB),NOSPLIT,$0
Dmitriy Vyukov91a670d2014-09-04 10:04:04 +0400463 MOVW epfd+0(FP), R0
464 MOVW op+4(FP), R1
465 MOVW fd+8(FP), R2
466 MOVW ev+12(FP), R3
Shenghou Ma1d64d042013-03-16 04:01:56 +0800467 MOVW $SYS_epoll_ctl, R7
468 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400469 MOVW R0, ret+16(FP)
Shenghou Ma1d64d042013-03-16 04:01:56 +0800470 RET
471
472// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout)
Keith Randall0273dc12013-08-07 12:20:05 -0700473TEXT runtime·epollwait(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800474 MOVW epfd+0(FP), R0
Rob Pikec21f1d52015-02-19 13:44:06 -0800475 MOVW ev+4(FP), R1
476 MOVW nev+8(FP), R2
Rob Pike345350b2015-02-17 18:30:27 -0800477 MOVW timeout+12(FP), R3
Shenghou Ma1d64d042013-03-16 04:01:56 +0800478 MOVW $SYS_epoll_wait, R7
479 SWI $0
Russ Cox25f6b022014-08-27 11:32:17 -0400480 MOVW R0, ret+16(FP)
Shenghou Ma1d64d042013-03-16 04:01:56 +0800481 RET
482
483// void runtime·closeonexec(int32 fd)
Keith Randall0273dc12013-08-07 12:20:05 -0700484TEXT runtime·closeonexec(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800485 MOVW fd+0(FP), R0 // fd
Shenghou Ma1d64d042013-03-16 04:01:56 +0800486 MOVW $2, R1 // F_SETFD
487 MOVW $1, R2 // FD_CLOEXEC
488 MOVW $SYS_fcntl, R7
Dmitriy Vyukov92254d42013-08-12 21:36:33 +0400489 SWI $0
Shenghou Ma1d64d042013-03-16 04:01:56 +0800490 RET
Elias Naur45233732013-08-14 15:38:54 +0000491
492// b __kuser_get_tls @ 0xffff0fe0
Austin Clementsa046caa2018-01-25 12:15:23 -0500493TEXT runtime·read_tls_fallback(SB),NOSPLIT|NOFRAME,$0
Elias Naur45233732013-08-14 15:38:54 +0000494 MOVW $0xffff0fe0, R0
495 B (R0)
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -0500496
497TEXT runtime·access(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800498 MOVW name+0(FP), R0
499 MOVW mode+4(FP), R1
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -0500500 MOVW $SYS_access, R7
501 SWI $0
502 MOVW R0, ret+8(FP)
503 RET
504
505TEXT runtime·connect(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800506 MOVW fd+0(FP), R0
507 MOVW addr+4(FP), R1
Josh Bleecher Snyder71ab9fa2016-07-11 16:05:57 -0700508 MOVW len+8(FP), R2
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -0500509 MOVW $SYS_connect, R7
510 SWI $0
511 MOVW R0, ret+12(FP)
512 RET
513
514TEXT runtime·socket(SB),NOSPLIT,$0
Rob Pike345350b2015-02-17 18:30:27 -0800515 MOVW domain+0(FP), R0
Josh Bleecher Snyder71ab9fa2016-07-11 16:05:57 -0700516 MOVW typ+4(FP), R1
517 MOVW prot+8(FP), R2
Hyang-Ah Hana Kim3a871352015-01-24 17:51:42 -0500518 MOVW $SYS_socket, R7
519 SWI $0
520 MOVW R0, ret+12(FP)
521 RET
Austin Clementsbb6309c2017-04-06 14:32:37 -0400522
523// func sbrk0() uintptr
524TEXT runtime·sbrk0(SB),NOSPLIT,$0-4
525 // Implemented as brk(NULL).
526 MOVW $0, R0
527 MOVW $SYS_brk, R7
528 SWI $0
529 MOVW R0, ret+0(FP)
530 RET