1
// Copyright 2013 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.
5
// System calls and other sys.stuff for ARM, NetBSD
6
// /usr/src/sys/kern/syscalls.master for syscall numbers.
9
#include "zasm_GOOS_GOARCH.h"
11
// Exit the entire program (like C exit)
12
TEXT runtime·exit(SB),7,$-4
13
MOVW 0(FP), R0 // arg 1 exit status
15
MOVW.CS $0, R9 // crash on syscall failure
19
TEXT runtime·exit1(SB),7,$-4
20
SWI $0xa00136 // sys__lwp_exit
25
TEXT runtime·open(SB),7,$-8
32
TEXT runtime·close(SB),7,$-8
37
TEXT runtime·read(SB),7,$-8
44
TEXT runtime·write(SB),7,$-4
45
MOVW 0(FP), R0 // arg 1 - fd
46
MOVW 4(FP), R1 // arg 2 - buf
47
MOVW 8(FP), R2 // arg 3 - nbyte
48
SWI $0xa00004 // sys_write
51
// int32 lwp_create(void *context, uintptr flags, void *lwpid)
52
TEXT runtime·lwp_create(SB),7,$0
53
MOVW context+0(FP), R0
56
SWI $0xa00135 // sys__lwp_create
59
TEXT runtime·osyield(SB),7,$0
60
SWI $0xa0015e // sys_sched_yield
63
TEXT runtime·lwp_park(SB),7,$0
64
MOVW 0(FP), R0 // arg 1 - abstime
65
MOVW 4(FP), R1 // arg 2 - unpark
66
MOVW 8(FP), R2 // arg 3 - hint
67
MOVW 12(FP), R3 // arg 4 - unparkhint
68
SWI $0xa001b2 // sys__lwp_park
71
TEXT runtime·lwp_unpark(SB),7,$0
72
MOVW 0(FP), R0 // arg 1 - lwp
73
MOVW 4(FP), R1 // arg 2 - hint
74
SWI $0xa00141 // sys__lwp_unpark
77
TEXT runtime·lwp_self(SB),7,$0
78
SWI $0xa00137 // sys__lwp_self
81
TEXT runtime·lwp_tramp(SB),7,$0
85
BL runtime·emptyfunc(SB) // fault if stack check is wrong
87
MOVW $2, R9 // crash (not reached)
91
TEXT runtime·usleep(SB),7,$16
96
// 0(R13) is the saved LR, don't use it
97
MOVW R0, 4(R13) // tv_sec.low
99
MOVW R0, 8(R13) // tv_sec.high
103
MOVW R2, 12(R13) // tv_nsec
105
MOVW $4(R13), R0 // arg 1 - rqtp
106
MOVW $0, R1 // arg 2 - rmtp
107
SWI $0xa001ae // sys_nanosleep
110
TEXT runtime·raise(SB),7,$16
111
SWI $0xa00137 // sys__lwp_self, the returned R0 is arg 1
112
MOVW sig+0(FP), R1 // arg 2 - signal
113
SWI $0xa0013e // sys__lwp_kill
116
TEXT runtime·setitimer(SB),7,$-4
117
MOVW 0(FP), R0 // arg 1 - which
118
MOVW 4(FP), R1 // arg 2 - itv
119
MOVW 8(FP), R2 // arg 3 - oitv
120
SWI $0xa001a9 // sys_setitimer
123
// func now() (sec int64, nsec int32)
124
TEXT time·now(SB), 7, $32
125
MOVW $0, R0 // CLOCK_REALTIME
127
SWI $0xa001ab // clock_gettime
129
MOVW 8(R13), R0 // sec.low
130
MOVW 12(R13), R1 // sec.high
131
MOVW 16(R13), R2 // nsec
138
// int64 nanotime(void) so really
139
// void nanotime(int64 *nsec)
140
TEXT runtime·nanotime(SB), 7, $32
141
MOVW $0, R0 // CLOCK_REALTIME
143
SWI $0xa001ab // clock_gettime
145
MOVW 8(R13), R0 // sec.low
146
MOVW 12(R13), R4 // sec.high
147
MOVW 16(R13), R2 // nsec
150
MULLU R0, R3, (R1, R0)
160
TEXT runtime·getcontext(SB),7,$-4
161
MOVW 0(FP), R0 // arg 1 - context
162
SWI $0xa00133 // sys_getcontext
163
MOVW.CS $0, R9 // crash on syscall failure
167
TEXT runtime·sigprocmask(SB),7,$0
168
MOVW 0(FP), R0 // arg 1 - how
169
MOVW 4(FP), R1 // arg 2 - set
170
MOVW 8(FP), R2 // arg 3 - oset
171
SWI $0xa00125 // sys_sigprocmask
172
MOVW.CS $0, R9 // crash on syscall failure
176
TEXT runtime·sigreturn_tramp(SB),7,$-4
177
// in runtime·sigtramp, we saved ucontext into m->tls[0],
178
// here we just load it and call sys_setcontext
180
SWI $0xa00134 // sys_setcontext
181
// something failed, we have to exit
182
MOVW $0x4242, R0 // magic return number
183
SWI $0xa00001 // sys_exit
184
B -2(PC) // continue exit
186
TEXT runtime·sigaction(SB),7,$4
187
MOVW 0(FP), R0 // arg 1 - signum
188
MOVW 4(FP), R1 // arg 2 - nsa
189
MOVW 8(FP), R2 // arg 3 - osa
190
MOVW $runtime·sigreturn_tramp(SB), R3 // arg 4 - tramp
191
MOVW $2, R4 // arg 5 - vers
193
ADD $4, R13 // pass arg 5 on stack
194
SWI $0xa00154 // sys___sigaction_sigtramp
196
MOVW.CS $3, R9 // crash on syscall failure
200
TEXT runtime·sigtramp(SB),7,$24
201
// this might be called in external code context,
202
// where g and m are not set.
203
// first save R0, because _cgo_load_gm will clobber it
204
// TODO(adonovan): call runtime·badsignal if m=0, like other platforms?
205
MOVW R0, 4(R13) // signum
206
MOVW _cgo_load_gm(SB), R0
215
MOVW m_gsignal(R9), R10
217
// R0 is already saved
218
MOVW R1, 8(R13) // info
219
MOVW R2, 12(R13) // context
220
MOVW R4, 16(R13) // gp
221
// we also save the ucontext into m->tls[0] for easy
225
BL runtime·sighandler(SB)
231
TEXT runtime·mmap(SB),7,$12
232
MOVW 0(FP), R0 // arg 1 - addr
233
MOVW 4(FP), R1 // arg 2 - len
234
MOVW 8(FP), R2 // arg 3 - prot
235
MOVW 12(FP), R3 // arg 4 - flags
236
// arg 5 (fid) and arg6 (offset_lo, offset_hi) are passed on stack
237
// note the C runtime only passes the 32-bit offset_lo to us
238
MOVW 16(FP), R4 // arg 5
240
MOVW 20(FP), R5 // arg 6 lower 32-bit
242
MOVW $0, R6 // higher 32-bit for arg 6
244
ADD $4, R13 // pass arg 5 and arg 6 on stack
245
SWI $0xa000c5 // sys_mmap
249
TEXT runtime·munmap(SB),7,$0
250
MOVW 0(FP), R0 // arg 1 - addr
251
MOVW 4(FP), R1 // arg 2 - len
252
SWI $0xa00049 // sys_munmap
253
MOVW.CS $0, R9 // crash on syscall failure
257
TEXT runtime·madvise(SB),7,$0
258
MOVW 0(FP), R0 // arg 1 - addr
259
MOVW 4(FP), R1 // arg 2 - len
260
MOVW 8(FP), R2 // arg 3 - behav
261
SWI $0xa0004b // sys_madvise
262
// ignore failure - maybe pages are locked
265
TEXT runtime·sigaltstack(SB),7,$-4
266
MOVW 0(FP), R0 // arg 1 - nss
267
MOVW 4(FP), R1 // arg 2 - oss
268
SWI $0xa00119 // sys___sigaltstack14
269
MOVW.CS $0, R9 // crash on syscall failure
273
TEXT runtime·sysctl(SB),7,$8
274
MOVW 0(FP), R0 // arg 1 - name
275
MOVW 4(FP), R1 // arg 2 - namelen
276
MOVW 8(FP), R2 // arg 3 - oldp
277
MOVW 12(FP), R3 // arg 4 - oldlenp
278
MOVW 16(FP), R4 // arg 5 - newp
280
MOVW 20(FP), R4 // arg 6 - newlen
282
ADD $4, R13 // pass arg 5 and 6 on stack
283
SWI $0xa000ca // sys___sysctl
287
TEXT runtime·casp(SB),7,$0
290
// TODO(minux): this is only valid for ARMv6+
291
// bool armcas(int32 *val, int32 old, int32 new)
298
TEXT runtime·cas(SB),7,$0