blob: 3d26ff0a41e674cbaf555ae1a66beb9d15ffd111 [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
Kai Backman770b8722009-10-29 21:21:14 -07009#include "arm/asm.h"
10
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)
26#define SYS_sigaltstack (SYS_BASE + 186)
Kai Backmanbe639b92009-06-23 11:54:23 -070027#define SYS_mmap2 (SYS_BASE + 192)
Kai Backman770b8722009-10-29 21:21:14 -070028#define SYS_futex (SYS_BASE + 240)
29#define SYS_exit_group (SYS_BASE + 248)
Russ Coxd4cc5572010-09-07 09:57:22 -040030#define SYS_munmap (SYS_BASE + 91)
Russ Cox8dee8722011-03-23 11:31:42 -040031#define SYS_setitimer (SYS_BASE + 104)
Jonathan Markddde52a2011-06-07 21:50:10 -070032#define SYS_mincore (SYS_BASE + 219)
Russ Cox8698bb62011-04-25 16:58:00 -040033#define SYS_gettid (SYS_BASE + 224)
34#define SYS_tkill (SYS_BASE + 238)
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040035#define SYS_sched_yield (SYS_BASE + 158)
Russ Coxd324f212011-09-30 09:40:01 -040036#define SYS_select (SYS_BASE + 82)
Kai Backmanbe639b92009-06-23 11:54:23 -070037
Kai Backman6dbd1422009-11-11 23:23:11 -080038#define ARM_BASE (SYS_BASE + 0x0f0000)
39#define SYS_ARM_cacheflush (ARM_BASE + 2)
40
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040041TEXT runtime·open(SB),7,$0
42 MOVW 0(FP), R0
43 MOVW 4(FP), R1
44 MOVW 8(FP), R2
45 MOVW $SYS_open, R7
46 SWI $0
47 RET
48
49TEXT runtime·close(SB),7,$0
50 MOVW 0(FP), R0
51 MOVW $SYS_close, R7
52 SWI $0
53 RET
54
Russ Cox68b42552010-11-04 14:00:19 -040055TEXT runtime·write(SB),7,$0
Kai Backman46e392e2009-09-18 16:45:41 -070056 MOVW 0(FP), R0
57 MOVW 4(FP), R1
58 MOVW 8(FP), R2
Kai Backman52c549f2009-11-05 22:53:08 -080059 MOVW $SYS_write, R7
60 SWI $0
Kai Backman79435562009-05-26 11:18:42 -070061 RET
62
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -040063TEXT runtime·read(SB),7,$0
64 MOVW 0(FP), R0
65 MOVW 4(FP), R1
66 MOVW 8(FP), R2
67 MOVW $SYS_read, R7
68 SWI $0
69 RET
70
Russ Cox68b42552010-11-04 14:00:19 -040071TEXT runtime·exit(SB),7,$-4
Kai Backman6f91ba12009-10-25 11:51:16 -070072 MOVW 0(FP), R0
Kai Backman52c549f2009-11-05 22:53:08 -080073 MOVW $SYS_exit_group, R7
74 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -070075 MOVW $1234, R0
76 MOVW $1002, R1
77 MOVW R0, (R1) // fail hard
78
Russ Cox68b42552010-11-04 14:00:19 -040079TEXT runtime·exit1(SB),7,$-4
Kai Backman770b8722009-10-29 21:21:14 -070080 MOVW 0(FP), R0
Kai Backman52c549f2009-11-05 22:53:08 -080081 MOVW $SYS_exit, R7
82 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -070083 MOVW $1234, R0
84 MOVW $1003, R1
85 MOVW R0, (R1) // fail hard
Kai Backman52891952009-06-10 11:53:07 -070086
Russ Cox8698bb62011-04-25 16:58:00 -040087TEXT runtime·raisesigpipe(SB),7,$-4
88 MOVW $SYS_gettid, R7
89 SWI $0
90 // arg 1 tid already in R0 from gettid
91 MOVW $13, R1 // arg 2 SIGPIPE
92 MOVW $SYS_tkill, R7
93 SWI $0
94 RET
95
Russ Cox68b42552010-11-04 14:00:19 -040096TEXT runtime·mmap(SB),7,$0
Kai Backman46e392e2009-09-18 16:45:41 -070097 MOVW 0(FP), R0
Kai Backmanbe639b92009-06-23 11:54:23 -070098 MOVW 4(FP), R1
99 MOVW 8(FP), R2
100 MOVW 12(FP), R3
101 MOVW 16(FP), R4
102 MOVW 20(FP), R5
Kai Backman52c549f2009-11-05 22:53:08 -0800103 MOVW $SYS_mmap2, R7
104 SWI $0
Kai Backman52891952009-06-10 11:53:07 -0700105 RET
106
Russ Cox68b42552010-11-04 14:00:19 -0400107TEXT runtime·munmap(SB),7,$0
Russ Coxd4cc5572010-09-07 09:57:22 -0400108 MOVW 0(FP), R0
109 MOVW 4(FP), R1
110 MOVW $SYS_munmap, R7
111 SWI $0
112 RET
113
Russ Cox1f223462011-03-25 12:30:49 -0400114TEXT runtime·setitimer(SB),7,$0
Russ Cox8dee8722011-03-23 11:31:42 -0400115 MOVW 0(FP), R0
116 MOVW 4(FP), R1
Russ Cox1f223462011-03-25 12:30:49 -0400117 MOVW 8(FP), R2
Russ Cox8dee8722011-03-23 11:31:42 -0400118 MOVW $SYS_setitimer, R7
119 SWI $0
120 RET
121
Jonathan Markddde52a2011-06-07 21:50:10 -0700122TEXT runtime·mincore(SB),7,$0
123 MOVW 0(FP), R0
124 MOVW 4(FP), R1
125 MOVW 8(FP), R2
126 MOVW $SYS_mincore, R7
127 SWI $0
128 RET
129
Russ Coxf4373312011-11-03 17:35:28 -0400130// int64 nanotime(void) so really
131// void nanotime(int64 *nsec)
132TEXT runtime·nanotime(SB),7,$32
Russ Cox7f5ae482011-11-04 08:38:10 -0400133 MOVW $8(R13), R0 // timeval
134 MOVW $0, R1 // zone
Russ Cox66cdc692010-02-10 15:01:02 -0800135 MOVW $SYS_gettimeofday, R7
136 SWI $0
Russ Cox7f5ae482011-11-04 08:38:10 -0400137
138 MOVW 8(R13), R0 // sec
139 MOVW 12(R13), R2 // usec
140
141 MOVW $1000000000, R3
142 MULLU R0, R3, (R1, R0)
143 MOVW $1000, R3
144 MOVW $0, R4
145 MUL R3, R2
146 ADD.S R2, R0
147 ADC R4, R1
148
149 MOVW 0(FP), R3
150 MOVW R0, 0(R3)
151 MOVW R1, 4(R3)
Russ Cox66cdc692010-02-10 15:01:02 -0800152 RET
153
Kai Backman770b8722009-10-29 21:21:14 -0700154// int32 futex(int32 *uaddr, int32 op, int32 val,
Kai Backman52891952009-06-10 11:53:07 -0700155// struct timespec *timeout, int32 *uaddr2, int32 val2);
Russ Cox68b42552010-11-04 14:00:19 -0400156TEXT runtime·futex(SB),7,$0
Kai Backman770b8722009-10-29 21:21:14 -0700157 MOVW 4(SP), R0
158 MOVW 8(SP), R1
159 MOVW 12(SP), R2
160 MOVW 16(SP), R3
161 MOVW 20(SP), R4
162 MOVW 24(SP), R5
Kai Backman52c549f2009-11-05 22:53:08 -0800163 MOVW $SYS_futex, R7
164 SWI $0
Kai Backman52891952009-06-10 11:53:07 -0700165 RET
166
Kai Backman770b8722009-10-29 21:21:14 -0700167
168// int32 clone(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
Russ Cox68b42552010-11-04 14:00:19 -0400169TEXT runtime·clone(SB),7,$0
Kai Backman770b8722009-10-29 21:21:14 -0700170 MOVW flags+0(FP), R0
171 MOVW stack+4(FP), R1
172 MOVW $0, R2 // parent tid ptr
173 MOVW $0, R3 // tls_val
174 MOVW $0, R4 // child tid ptr
175 MOVW $0, R5
176
177 // Copy m, g, fn off parent stack for use by child.
178 // TODO(kaib): figure out which registers are clobbered by clone and avoid stack copying
179 MOVW $-16(R1), R1
180 MOVW mm+8(FP), R6
181 MOVW R6, 0(R1)
182 MOVW gg+12(FP), R6
183 MOVW R6, 4(R1)
184 MOVW fn+16(FP), R6
185 MOVW R6, 8(R1)
186 MOVW $1234, R6
187 MOVW R6, 12(R1)
188
Kai Backman52c549f2009-11-05 22:53:08 -0800189 MOVW $SYS_clone, R7
190 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700191
192 // In parent, return.
193 CMP $0, R0
194 BEQ 2(PC)
195 RET
196
197 // Paranoia: check that SP is as we expect. Use R13 to avoid linker 'fixup'
198 MOVW 12(R13), R0
199 MOVW $1234, R1
200 CMP R0, R1
201 BEQ 2(PC)
Russ Cox68b42552010-11-04 14:00:19 -0400202 BL runtime·abort(SB)
Kai Backman770b8722009-10-29 21:21:14 -0700203
204 MOVW 0(R13), m
205 MOVW 4(R13), g
206
207 // paranoia; check they are not nil
208 MOVW 0(m), R0
209 MOVW 0(g), R0
210
Russ Cox68b42552010-11-04 14:00:19 -0400211 BL runtime·emptyfunc(SB) // fault if stack check is wrong
Kai Backman770b8722009-10-29 21:21:14 -0700212
213 // Initialize m->procid to Linux tid
Kai Backman52c549f2009-11-05 22:53:08 -0800214 MOVW $SYS_gettid, R7
215 SWI $0
Kai Backman770b8722009-10-29 21:21:14 -0700216 MOVW R0, m_procid(m)
217
218 // Call fn
219 MOVW 8(R13), R0
220 MOVW $16(R13), R13
221 BL (R0)
222
223 MOVW $0, R0
224 MOVW R0, 4(R13)
Russ Cox68b42552010-11-04 14:00:19 -0400225 BL runtime·exit1(SB)
Kai Backman770b8722009-10-29 21:21:14 -0700226
227 // It shouldn't return
228 MOVW $1234, R0
229 MOVW $1005, R1
230 MOVW R0, (R1)
231
232
Russ Cox68b42552010-11-04 14:00:19 -0400233TEXT runtime·cacheflush(SB),7,$0
Kai Backman6dbd1422009-11-11 23:23:11 -0800234 MOVW 0(FP), R0
235 MOVW 4(FP), R1
236 MOVW $0, R2
237 MOVW $SYS_ARM_cacheflush, R7
238 SWI $0
239 RET
240
Russ Cox68b42552010-11-04 14:00:19 -0400241TEXT runtime·sigaltstack(SB),7,$0
Russ Cox6c196012010-04-05 12:51:09 -0700242 MOVW 0(FP), R0
243 MOVW 4(FP), R1
244 MOVW $SYS_sigaltstack, R7
245 SWI $0
246 RET
247
Russ Cox68b42552010-11-04 14:00:19 -0400248TEXT runtime·sigignore(SB),7,$0
Russ Cox6c196012010-04-05 12:51:09 -0700249 RET
250
Russ Cox68b42552010-11-04 14:00:19 -0400251TEXT runtime·sigtramp(SB),7,$24
Russ Cox690291a2011-02-23 14:47:42 -0500252 // save g
253 MOVW g, R3
254 MOVW g, 20(R13)
Russ Coxd324f212011-09-30 09:40:01 -0400255
Russ Cox690291a2011-02-23 14:47:42 -0500256 // g = m->gsignal
Russ Cox6c196012010-04-05 12:51:09 -0700257 MOVW m_gsignal(m), g
Russ Cox690291a2011-02-23 14:47:42 -0500258
259 // copy arguments for call to sighandler
Russ Cox6c196012010-04-05 12:51:09 -0700260 MOVW R0, 4(R13)
261 MOVW R1, 8(R13)
262 MOVW R2, 12(R13)
Russ Cox690291a2011-02-23 14:47:42 -0500263 MOVW R3, 16(R13)
264
Russ Cox68b42552010-11-04 14:00:19 -0400265 BL runtime·sighandler(SB)
Russ Coxd324f212011-09-30 09:40:01 -0400266
Russ Cox690291a2011-02-23 14:47:42 -0500267 // restore g
268 MOVW 20(R13), g
269
Russ Cox6c196012010-04-05 12:51:09 -0700270 RET
271
Russ Cox68b42552010-11-04 14:00:19 -0400272TEXT runtime·rt_sigaction(SB),7,$0
Russ Cox6c196012010-04-05 12:51:09 -0700273 MOVW 0(FP), R0
274 MOVW 4(FP), R1
275 MOVW 8(FP), R2
276 MOVW 12(FP), R3
277 MOVW $SYS_rt_sigaction, R7
278 SWI $0
279 RET
280
Russ Cox68b42552010-11-04 14:00:19 -0400281TEXT runtime·sigreturn(SB),7,$0
Russ Cox6c196012010-04-05 12:51:09 -0700282 MOVW $SYS_rt_sigreturn, R7
283 SWI $0
284 RET
Russ Cox9ad97422011-02-25 14:29:55 -0500285
Russ Coxd324f212011-09-30 09:40:01 -0400286TEXT runtime·usleep(SB),7,$12
287 MOVW usec+0(FP), R0
288 MOVW R0, R1
289 MOVW $1000000, R2
290 DIV R1, R0
291 MOD R2, R0
292 MOVW R1, 4(SP)
293 MOVW R2, 8(SP)
294 MOVW $0, R0
295 MOVW $0, R1
296 MOVW $0, R2
297 MOVW $0, R3
298 MOVW $4(SP), R4
299 MOVW $SYS_select, R7
300 SWI $0
301 RET
302
Russ Cox9ad97422011-02-25 14:29:55 -0500303// Use kernel version instead of native armcas in ../../arm.s.
304// See ../../../sync/atomic/asm_linux_arm.s for details.
305TEXT cas<>(SB),7,$0
306 MOVW $0xffff0fc0, PC
307
308TEXT runtime·cas(SB),7,$0
309 MOVW valptr+0(FP), R2
310 MOVW old+4(FP), R0
Russ Cox540feaa2011-05-02 10:49:19 -0400311casagain:
Russ Cox9ad97422011-02-25 14:29:55 -0500312 MOVW new+8(FP), R1
313 BL cas<>(SB)
Russ Cox540feaa2011-05-02 10:49:19 -0400314 BCC cascheck
315 MOVW $1, R0
Russ Cox9ad97422011-02-25 14:29:55 -0500316 RET
Russ Cox540feaa2011-05-02 10:49:19 -0400317cascheck:
318 // Kernel lies; double-check.
319 MOVW valptr+0(FP), R2
320 MOVW old+4(FP), R0
321 MOVW 0(R2), R3
322 CMP R0, R3
323 BEQ casagain
324 MOVW $0, R0
325 RET
326
Russ Cox9ad97422011-02-25 14:29:55 -0500327
328TEXT runtime·casp(SB),7,$0
329 B runtime·cas(SB)
330
Dmitriy Vyukov4e5086b2011-07-29 12:44:06 -0400331TEXT runtime·osyield(SB),7,$0
332 MOVW $SYS_sched_yield, R7
333 SWI $0
334 RET