blob: fed963f0dc311014535e9b6621efe6c29887e581 [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 Cox55889402011-12-19 15:51:13 -05009#include "zasm_GOOS_GOARCH.h"
Kai Backman770b8722009-10-29 21:21:14 -070010
Kai Backman52c549f2009-11-05 22:53:08 -080011// OABI
12//#define SYS_BASE 0x00900000
13
14// EABI
15#define SYS_BASE 0x0
16
Kai Backmanbe639b92009-06-23 11:54:23 -070017#define SYS_exit (SYS_BASE + 1)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040018#define SYS_read (SYS_BASE + 3)
Kai Backmanbe639b92009-06-23 11:54:23 -070019#define SYS_write (SYS_BASE + 4)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040020#define SYS_open (SYS_BASE + 5)
21#define SYS_close (SYS_BASE + 6)
Russ Cox66cdc692010-02-10 15:01:02 -080022#define SYS_gettimeofday (SYS_BASE + 78)
Kai Backman770b8722009-10-29 21:21:14 -070023#define SYS_clone (SYS_BASE + 120)
Russ Cox6c196012010-04-05 12:51:09 -070024#define SYS_rt_sigreturn (SYS_BASE + 173)
25#define SYS_rt_sigaction (SYS_BASE + 174)
Russ Cox240b1d52012-02-23 14:43:58 -050026#define SYS_rt_sigprocmask (SYS_BASE + 175)
Russ Cox6c196012010-04-05 12:51:09 -070027#define SYS_sigaltstack (SYS_BASE + 186)
Kai Backmanbe639b92009-06-23 11:54:23 -070028#define SYS_mmap2 (SYS_BASE + 192)
Kai Backman770b8722009-10-29 21:21:14 -070029#define SYS_futex (SYS_BASE + 240)
30#define SYS_exit_group (SYS_BASE + 248)
Russ Coxd4cc5572010-09-07 09:57:22 -040031#define SYS_munmap (SYS_BASE + 91)
Sébastien Paolaccie6f5a902011-12-12 16:33:13 -050032#define SYS_madvise (SYS_BASE + 220)
Russ Cox8dee8722011-03-23 11:31:42 -040033#define SYS_setitimer (SYS_BASE + 104)
Jonathan Markddde52a2011-06-07 21:50:10 -070034#define SYS_mincore (SYS_BASE + 219)
Russ Cox8698bb62011-04-25 16:58:00 -040035#define SYS_gettid (SYS_BASE + 224)
36#define SYS_tkill (SYS_BASE + 238)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040037#define SYS_sched_yield (SYS_BASE + 158)
Shenghou Ma1250f942012-01-10 20:48:02 -080038#define SYS_select (SYS_BASE + 142) // newselect
Kai Backmanbe639b92009-06-23 11:54:23 -070039
Kai Backman6dbd1422009-11-11 23:23:11 -080040#define ARM_BASE (SYS_BASE + 0x0f0000)
41#define SYS_ARM_cacheflush (ARM_BASE + 2)
42
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040043TEXT runtime·open(SB),7,$0
44 MOVW 0(FP), R0
45 MOVW 4(FP), R1
46 MOVW 8(FP), R2
47 MOVW $SYS_open, R7
48 SWI $0
49 RET
50
51TEXT runtime·close(SB),7,$0
52 MOVW 0(FP), R0
53 MOVW $SYS_close, R7
54 SWI $0
55 RET
56
Russ Cox68b42552010-11-04 14:00:19 -040057TEXT runtime·write(SB),7,$0
Kai Backman46e392e2009-09-18 16:45:41 -070058 MOVW 0(FP), R0
59 MOVW 4(FP), R1
60 MOVW 8(FP), R2
Kai Backman52c549f2009-11-05 22:53:08 -080061 MOVW $SYS_write, R7
62 SWI $0
Kai Backman79435562009-05-26 11:18:42 -070063 RET
64
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040065TEXT runtime·read(SB),7,$0
66 MOVW 0(FP), R0
67 MOVW 4(FP), R1
68 MOVW 8(FP), R2
69 MOVW $SYS_read, R7
70 SWI $0
71 RET
72
Russ Cox68b42552010-11-04 14:00:19 -040073TEXT runtime·exit(SB),7,$-4
Kai Backman6f91ba12009-10-25 11:51:16 -070074 MOVW 0(FP), R0
Kai Backman52c549f2009-11-05 22:53:08 -080075 MOVW $SYS_exit_group, R7
76 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -070077 MOVW $1234, R0
78 MOVW $1002, R1
79 MOVW R0, (R1) // fail hard
80
Russ Cox68b42552010-11-04 14:00:19 -040081TEXT runtime·exit1(SB),7,$-4
Kai Backman770b8722009-10-29 21:21:14 -070082 MOVW 0(FP), R0
Kai Backman52c549f2009-11-05 22:53:08 -080083 MOVW $SYS_exit, R7
84 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -070085 MOVW $1234, R0
86 MOVW $1003, R1
87 MOVW R0, (R1) // fail hard
Kai Backman52891952009-06-10 11:53:07 -070088
Russ Cox8698bb62011-04-25 16:58:00 -040089TEXT runtime·raisesigpipe(SB),7,$-4
90 MOVW $SYS_gettid, R7
91 SWI $0
92 // arg 1 tid already in R0 from gettid
93 MOVW $13, R1 // arg 2 SIGPIPE
94 MOVW $SYS_tkill, R7
95 SWI $0
96 RET
97
Russ Cox68b42552010-11-04 14:00:19 -040098TEXT runtime·mmap(SB),7,$0
Kai Backman46e392e2009-09-18 16:45:41 -070099 MOVW 0(FP), R0
Kai Backmanbe639b92009-06-23 11:54:23 -0700100 MOVW 4(FP), R1
101 MOVW 8(FP), R2
102 MOVW 12(FP), R3
103 MOVW 16(FP), R4
104 MOVW 20(FP), R5
Kai Backman52c549f2009-11-05 22:53:08 -0800105 MOVW $SYS_mmap2, R7
106 SWI $0
Kai Backman52891952009-06-10 11:53:07 -0700107 RET
108
Russ Cox68b42552010-11-04 14:00:19 -0400109TEXT runtime·munmap(SB),7,$0
Russ Coxd4cc5572010-09-07 09:57:22 -0400110 MOVW 0(FP), R0
111 MOVW 4(FP), R1
112 MOVW $SYS_munmap, R7
113 SWI $0
114 RET
115
Sébastien Paolaccie6f5a902011-12-12 16:33:13 -0500116TEXT runtime·madvise(SB),7,$0
117 MOVW 0(FP), R0
118 MOVW 4(FP), R1
119 MOVW 8(FP), R2
120 MOVW $SYS_madvise, R7
121 SWI $0
122 RET
123
Russ Cox1f223462011-03-25 12:30:49 -0400124TEXT runtime·setitimer(SB),7,$0
Russ Cox8dee8722011-03-23 11:31:42 -0400125 MOVW 0(FP), R0
126 MOVW 4(FP), R1
Russ Cox1f223462011-03-25 12:30:49 -0400127 MOVW 8(FP), R2
Russ Cox8dee8722011-03-23 11:31:42 -0400128 MOVW $SYS_setitimer, R7
129 SWI $0
130 RET
131
Jonathan Markddde52a2011-06-07 21:50:10 -0700132TEXT runtime·mincore(SB),7,$0
133 MOVW 0(FP), R0
134 MOVW 4(FP), R1
135 MOVW 8(FP), R2
136 MOVW $SYS_mincore, R7
137 SWI $0
138 RET
139
Russ Coxefe3d352011-11-30 11:59:44 -0500140TEXT time·now(SB), 7, $32
141 MOVW $8(R13), R0 // timeval
142 MOVW $0, R1 // zone
143 MOVW $SYS_gettimeofday, R7
144 SWI $0
145
146 MOVW 8(R13), R0 // sec
147 MOVW 12(R13), R2 // usec
148
149 MOVW R0, 0(FP)
150 MOVW $0, R1
151 MOVW R1, 4(FP)
152 MOVW $1000, R3
153 MUL R3, R2
154 MOVW R2, 8(FP)
155 RET
156
Russ Coxf4373312011-11-03 17:35:28 -0400157// int64 nanotime(void) so really
158// void nanotime(int64 *nsec)
159TEXT runtime·nanotime(SB),7,$32
Russ Cox7f5ae482011-11-04 08:38:10 -0400160 MOVW $8(R13), R0 // timeval
161 MOVW $0, R1 // zone
Russ Cox66cdc692010-02-10 15:01:02 -0800162 MOVW $SYS_gettimeofday, R7
163 SWI $0
Russ Cox7f5ae482011-11-04 08:38:10 -0400164
165 MOVW 8(R13), R0 // sec
166 MOVW 12(R13), R2 // usec
167
168 MOVW $1000000000, R3
169 MULLU R0, R3, (R1, R0)
170 MOVW $1000, R3
171 MOVW $0, R4
172 MUL R3, R2
173 ADD.S R2, R0
174 ADC R4, R1
175
176 MOVW 0(FP), R3
177 MOVW R0, 0(R3)
178 MOVW R1, 4(R3)
Russ Cox66cdc692010-02-10 15:01:02 -0800179 RET
180
Kai Backman770b8722009-10-29 21:21:14 -0700181// int32 futex(int32 *uaddr, int32 op, int32 val,
Kai Backman52891952009-06-10 11:53:07 -0700182// struct timespec *timeout, int32 *uaddr2, int32 val2);
Russ Cox68b42552010-11-04 14:00:19 -0400183TEXT runtime·futex(SB),7,$0
Kai Backman770b8722009-10-29 21:21:14 -0700184 MOVW 4(SP), R0
185 MOVW 8(SP), R1
186 MOVW 12(SP), R2
187 MOVW 16(SP), R3
188 MOVW 20(SP), R4
189 MOVW 24(SP), R5
Kai Backman52c549f2009-11-05 22:53:08 -0800190 MOVW $SYS_futex, R7
191 SWI $0
Kai Backman52891952009-06-10 11:53:07 -0700192 RET
193
Kai Backman770b8722009-10-29 21:21:14 -0700194
195// int32 clone(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
Russ Cox68b42552010-11-04 14:00:19 -0400196TEXT runtime·clone(SB),7,$0
Kai Backman770b8722009-10-29 21:21:14 -0700197 MOVW flags+0(FP), R0
198 MOVW stack+4(FP), R1
199 MOVW $0, R2 // parent tid ptr
200 MOVW $0, R3 // tls_val
201 MOVW $0, R4 // child tid ptr
202 MOVW $0, R5
203
204 // Copy m, g, fn off parent stack for use by child.
205 // TODO(kaib): figure out which registers are clobbered by clone and avoid stack copying
206 MOVW $-16(R1), R1
207 MOVW mm+8(FP), R6
208 MOVW R6, 0(R1)
209 MOVW gg+12(FP), R6
210 MOVW R6, 4(R1)
211 MOVW fn+16(FP), R6
212 MOVW R6, 8(R1)
213 MOVW $1234, R6
214 MOVW R6, 12(R1)
215
Kai Backman52c549f2009-11-05 22:53:08 -0800216 MOVW $SYS_clone, R7
217 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700218
219 // In parent, return.
220 CMP $0, R0
221 BEQ 2(PC)
222 RET
223
224 // Paranoia: check that SP is as we expect. Use R13 to avoid linker 'fixup'
225 MOVW 12(R13), R0
226 MOVW $1234, R1
227 CMP R0, R1
228 BEQ 2(PC)
Russ Cox68b42552010-11-04 14:00:19 -0400229 BL runtime·abort(SB)
Kai Backman770b8722009-10-29 21:21:14 -0700230
231 MOVW 0(R13), m
232 MOVW 4(R13), g
233
234 // paranoia; check they are not nil
235 MOVW 0(m), R0
236 MOVW 0(g), R0
237
Russ Cox68b42552010-11-04 14:00:19 -0400238 BL runtime·emptyfunc(SB) // fault if stack check is wrong
Kai Backman770b8722009-10-29 21:21:14 -0700239
240 // Initialize m->procid to Linux tid
Kai Backman52c549f2009-11-05 22:53:08 -0800241 MOVW $SYS_gettid, R7
242 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700243 MOVW R0, m_procid(m)
244
245 // Call fn
246 MOVW 8(R13), R0
247 MOVW $16(R13), R13
248 BL (R0)
249
250 MOVW $0, R0
251 MOVW R0, 4(R13)
Russ Cox68b42552010-11-04 14:00:19 -0400252 BL runtime·exit1(SB)
Kai Backman770b8722009-10-29 21:21:14 -0700253
254 // It shouldn't return
255 MOVW $1234, R0
256 MOVW $1005, R1
257 MOVW R0, (R1)
258
259
Russ Cox68b42552010-11-04 14:00:19 -0400260TEXT runtime·cacheflush(SB),7,$0
Kai Backman6dbd1422009-11-11 23:23:11 -0800261 MOVW 0(FP), R0
262 MOVW 4(FP), R1
263 MOVW $0, R2
264 MOVW $SYS_ARM_cacheflush, R7
265 SWI $0
266 RET
267
Russ Cox68b42552010-11-04 14:00:19 -0400268TEXT runtime·sigaltstack(SB),7,$0
Russ Cox6c196012010-04-05 12:51:09 -0700269 MOVW 0(FP), R0
270 MOVW 4(FP), R1
271 MOVW $SYS_sigaltstack, R7
272 SWI $0
273 RET
274
Russ Cox68b42552010-11-04 14:00:19 -0400275TEXT runtime·sigtramp(SB),7,$24
Russ Cox690291a2011-02-23 14:47:42 -0500276 // save g
277 MOVW g, R3
278 MOVW g, 20(R13)
Russ Coxd324f212011-09-30 09:40:01 -0400279
Russ Cox690291a2011-02-23 14:47:42 -0500280 // g = m->gsignal
Russ Cox6c196012010-04-05 12:51:09 -0700281 MOVW m_gsignal(m), g
Russ Cox690291a2011-02-23 14:47:42 -0500282
283 // copy arguments for call to sighandler
Russ Cox6c196012010-04-05 12:51:09 -0700284 MOVW R0, 4(R13)
285 MOVW R1, 8(R13)
286 MOVW R2, 12(R13)
Russ Cox690291a2011-02-23 14:47:42 -0500287 MOVW R3, 16(R13)
288
Russ Cox68b42552010-11-04 14:00:19 -0400289 BL runtime·sighandler(SB)
Russ Coxd324f212011-09-30 09:40:01 -0400290
Russ Cox690291a2011-02-23 14:47:42 -0500291 // restore g
292 MOVW 20(R13), g
293
Russ Cox6c196012010-04-05 12:51:09 -0700294 RET
295
Russ Cox240b1d52012-02-23 14:43:58 -0500296TEXT runtime·rtsigprocmask(SB),7,$0
297 MOVW 0(FP), R0
298 MOVW 4(FP), R1
299 MOVW 8(FP), R2
300 MOVW 12(FP), R3
301 MOVW $SYS_rt_sigprocmask, R7
302 SWI $0
303 RET
304
Russ Cox68b42552010-11-04 14:00:19 -0400305TEXT runtime·rt_sigaction(SB),7,$0
Russ Cox6c196012010-04-05 12:51:09 -0700306 MOVW 0(FP), R0
307 MOVW 4(FP), R1
308 MOVW 8(FP), R2
309 MOVW 12(FP), R3
310 MOVW $SYS_rt_sigaction, R7
311 SWI $0
312 RET
313
Russ Cox68b42552010-11-04 14:00:19 -0400314TEXT runtime·sigreturn(SB),7,$0
Russ Cox6c196012010-04-05 12:51:09 -0700315 MOVW $SYS_rt_sigreturn, R7
316 SWI $0
317 RET
Russ Cox9ad97422011-02-25 14:29:55 -0500318
Russ Coxd324f212011-09-30 09:40:01 -0400319TEXT runtime·usleep(SB),7,$12
320 MOVW usec+0(FP), R0
321 MOVW R0, R1
322 MOVW $1000000, R2
Shenghou Ma1250f942012-01-10 20:48:02 -0800323 DIV R2, R0
324 MOD R2, R1
325 MOVW R0, 4(SP)
326 MOVW R1, 8(SP)
Russ Coxd324f212011-09-30 09:40:01 -0400327 MOVW $0, R0
328 MOVW $0, R1
329 MOVW $0, R2
330 MOVW $0, R3
331 MOVW $4(SP), R4
332 MOVW $SYS_select, R7
333 SWI $0
334 RET
335
Russ Cox9ad97422011-02-25 14:29:55 -0500336// Use kernel version instead of native armcas in ../../arm.s.
337// See ../../../sync/atomic/asm_linux_arm.s for details.
338TEXT cas<>(SB),7,$0
339 MOVW $0xffff0fc0, PC
340
341TEXT runtime·cas(SB),7,$0
342 MOVW valptr+0(FP), R2
343 MOVW old+4(FP), R0
Russ Cox540feaa2011-05-02 10:49:19 -0400344casagain:
Russ Cox9ad97422011-02-25 14:29:55 -0500345 MOVW new+8(FP), R1
346 BL cas<>(SB)
Russ Cox540feaa2011-05-02 10:49:19 -0400347 BCC cascheck
348 MOVW $1, R0
Russ Cox9ad97422011-02-25 14:29:55 -0500349 RET
Russ Cox540feaa2011-05-02 10:49:19 -0400350cascheck:
351 // Kernel lies; double-check.
352 MOVW valptr+0(FP), R2
353 MOVW old+4(FP), R0
354 MOVW 0(R2), R3
355 CMP R0, R3
356 BEQ casagain
357 MOVW $0, R0
358 RET
359
Russ Cox9ad97422011-02-25 14:29:55 -0500360
361TEXT runtime·casp(SB),7,$0
362 B runtime·cas(SB)
363
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -0400364TEXT runtime·osyield(SB),7,$0
365 MOVW $SYS_sched_yield, R7
366 SWI $0
367 RET