Text file src/runtime/sys_netbsd_arm64.s
1 // Copyright 2019 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 arm64, NetBSD
7 //
8
9 #include "go_asm.h"
10 #include "go_tls.h"
11 #include "textflag.h"
12
13 #define CLOCK_REALTIME 0
14 #define CLOCK_MONOTONIC 3
15 #define FD_CLOEXEC 1
16 #define F_SETFD 2
17
18 #define SYS_exit 1
19 #define SYS_read 3
20 #define SYS_write 4
21 #define SYS_open 5
22 #define SYS_close 6
23 #define SYS_getpid 20
24 #define SYS_kill 37
25 #define SYS_munmap 73
26 #define SYS_madvise 75
27 #define SYS_fcntl 92
28 #define SYS_mmap 197
29 #define SYS___sysctl 202
30 #define SYS___sigaltstack14 281
31 #define SYS___sigprocmask14 293
32 #define SYS_getcontext 307
33 #define SYS_setcontext 308
34 #define SYS__lwp_create 309
35 #define SYS__lwp_exit 310
36 #define SYS__lwp_self 311
37 #define SYS__lwp_kill 318
38 #define SYS__lwp_unpark 321
39 #define SYS___sigaction_sigtramp 340
40 #define SYS_kqueue 344
41 #define SYS_sched_yield 350
42 #define SYS___setitimer50 425
43 #define SYS___clock_gettime50 427
44 #define SYS___nanosleep50 430
45 #define SYS___kevent50 435
46 #define SYS_openat 468
47 #define SYS____lwp_park60 478
48
49 // int32 lwp_create(void *context, uintptr flags, void *lwpid)
50 TEXT runtime·lwp_create(SB),NOSPLIT,$0
51 MOVD ctxt+0(FP), R0
52 MOVD flags+8(FP), R1
53 MOVD lwpid+16(FP), R2
54 SVC $SYS__lwp_create
55 BCC ok
56 NEG R0, R0
57 ok:
58 MOVW R0, ret+24(FP)
59 RET
60
61 TEXT runtime·lwp_tramp(SB),NOSPLIT,$0
62 CMP $0, R1
63 BEQ nog
64 CMP $0, R2
65 BEQ nog
66
67 MOVD R0, g_m(R1)
68 MOVD R1, g
69 nog:
70 CALL (R2)
71
72 MOVD $0, R0 // crash (not reached)
73 MOVD R0, (R8)
74
75 TEXT runtime·osyield(SB),NOSPLIT,$0
76 SVC $SYS_sched_yield
77 RET
78
79 TEXT runtime·lwp_park(SB),NOSPLIT,$0
80 MOVW clockid+0(FP), R0 // arg 1 - clockid
81 MOVW flags+4(FP), R1 // arg 2 - flags
82 MOVD ts+8(FP), R2 // arg 3 - ts
83 MOVW unpark+16(FP), R3 // arg 4 - unpark
84 MOVD hint+24(FP), R4 // arg 5 - hint
85 MOVD unparkhint+32(FP), R5 // arg 6 - unparkhint
86 SVC $SYS____lwp_park60
87 MOVW R0, ret+40(FP)
88 RET
89
90 TEXT runtime·lwp_unpark(SB),NOSPLIT,$0
91 MOVW lwp+0(FP), R0 // arg 1 - lwp
92 MOVD hint+8(FP), R1 // arg 2 - hint
93 SVC $SYS__lwp_unpark
94 MOVW R0, ret+16(FP)
95 RET
96
97 TEXT runtime·lwp_self(SB),NOSPLIT,$0
98 SVC $SYS__lwp_self
99 MOVW R0, ret+0(FP)
100 RET
101
102 // Exit the entire program (like C exit)
103 TEXT runtime·exit(SB),NOSPLIT,$-8
104 MOVW code+0(FP), R0 // arg 1 - exit status
105 SVC $SYS_exit
106 MOVD $0, R0 // If we're still running,
107 MOVD R0, (R0) // crash
108
109 // func exitThread(wait *uint32)
110 TEXT runtime·exitThread(SB),NOSPLIT,$0-8
111 MOVD wait+0(FP), R0
112 // We're done using the stack.
113 MOVW $0, R1
114 STLRW R1, (R0)
115 SVC $SYS__lwp_exit
116 JMP 0(PC)
117
118 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$-8
119 MOVD name+0(FP), R0 // arg 1 - pathname
120 MOVW mode+8(FP), R1 // arg 2 - flags
121 MOVW perm+12(FP), R2 // arg 3 - mode
122 SVC $SYS_open
123 BCC ok
124 MOVW $-1, R0
125 ok:
126 MOVW R0, ret+16(FP)
127 RET
128
129 TEXT runtime·closefd(SB),NOSPLIT,$-8
130 MOVW fd+0(FP), R0 // arg 1 - fd
131 SVC $SYS_close
132 BCC ok
133 MOVW $-1, R0
134 ok:
135 MOVW R0, ret+8(FP)
136 RET
137
138 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0
139 MOVW fd+0(FP), R0 // arg 1 - fd
140 MOVD p+8(FP), R1 // arg 2 - buf
141 MOVW n+16(FP), R2 // arg 3 - count
142 SVC $SYS_read
143 BCC ok
144 MOVW $-1, R0
145 ok:
146 MOVW R0, ret+24(FP)
147 RET
148
149 TEXT runtime·write(SB),NOSPLIT,$-8
150 MOVD fd+0(FP), R0 // arg 1 - fd
151 MOVD p+8(FP), R1 // arg 2 - buf
152 MOVW n+16(FP), R2 // arg 3 - nbyte
153 SVC $SYS_write
154 BCC ok
155 MOVW $-1, R0
156 ok:
157 MOVW R0, ret+24(FP)
158 RET
159
160 TEXT runtime·usleep(SB),NOSPLIT,$24-4
161 MOVWU usec+0(FP), R3
162 MOVD R3, R5
163 MOVW $1000000, R4
164 UDIV R4, R3
165 MOVD R3, 8(RSP) // sec
166 MUL R3, R4
167 SUB R4, R5
168 MOVW $1000, R4
169 MUL R4, R5
170 MOVD R5, 16(RSP) // nsec
171
172 MOVD $8(RSP), R0 // arg 1 - rqtp
173 MOVD $0, R1 // arg 2 - rmtp
174 SVC $SYS___nanosleep50
175 RET
176
177 TEXT runtime·raise(SB),NOSPLIT,$16
178 SVC $SYS__lwp_self
179 // arg 1 - target (lwp_self)
180 MOVW sig+0(FP), R1 // arg 2 - signo
181 SVC $SYS__lwp_kill
182 RET
183
184 TEXT runtime·raiseproc(SB),NOSPLIT,$16
185 SVC $SYS_getpid
186 // arg 1 - pid (from getpid)
187 MOVD sig+0(FP), R1 // arg 2 - signo
188 SVC $SYS_kill
189 RET
190
191 TEXT runtime·setitimer(SB),NOSPLIT,$-8
192 MOVW mode+0(FP), R0 // arg 1 - which
193 MOVD new+8(FP), R1 // arg 2 - itv
194 MOVD old+16(FP), R2 // arg 3 - oitv
195 SVC $SYS___setitimer50
196 RET
197
198 // func walltime() (sec int64, nsec int32)
199 TEXT runtime·walltime(SB), NOSPLIT, $32
200 MOVW $CLOCK_REALTIME, R0 // arg 1 - clock_id
201 MOVD $8(RSP), R1 // arg 2 - tp
202 SVC $SYS___clock_gettime50
203
204 MOVD 8(RSP), R0 // sec
205 MOVD 16(RSP), R1 // nsec
206
207 // sec is in R0, nsec in R1
208 MOVD R0, sec+0(FP)
209 MOVW R1, nsec+8(FP)
210 RET
211
212 // int64 nanotime(void) so really
213 // void nanotime(int64 *nsec)
214 TEXT runtime·nanotime(SB), NOSPLIT, $32
215 MOVD $CLOCK_MONOTONIC, R0 // arg 1 - clock_id
216 MOVD $8(RSP), R1 // arg 2 - tp
217 SVC $SYS___clock_gettime50
218 MOVD 8(RSP), R0 // sec
219 MOVD 16(RSP), R2 // nsec
220
221 // sec is in R0, nsec in R2
222 // return nsec in R2
223 MOVD $1000000000, R3
224 MUL R3, R0
225 ADD R2, R0
226
227 MOVD R0, ret+0(FP)
228 RET
229
230 TEXT runtime·getcontext(SB),NOSPLIT,$-8
231 MOVD ctxt+0(FP), R0 // arg 1 - context
232 SVC $SYS_getcontext
233 BCS fail
234 RET
235 fail:
236 MOVD $0, R0
237 MOVD R0, (R0) // crash
238
239 TEXT runtime·sigprocmask(SB),NOSPLIT,$0
240 MOVW how+0(FP), R0 // arg 1 - how
241 MOVD new+8(FP), R1 // arg 2 - set
242 MOVD old+16(FP), R2 // arg 3 - oset
243 SVC $SYS___sigprocmask14
244 BCS fail
245 RET
246 fail:
247 MOVD $0, R0
248 MOVD R0, (R0) // crash
249
250 TEXT sigreturn_tramp<>(SB),NOSPLIT,$-8
251 MOVD g, R0
252 SVC $SYS_setcontext
253 MOVD $0x4242, R0 // Something failed, return magic number
254 SVC $SYS_exit
255
256 TEXT runtime·sigaction(SB),NOSPLIT,$-8
257 MOVW sig+0(FP), R0 // arg 1 - signum
258 MOVD new+8(FP), R1 // arg 2 - nsa
259 MOVD old+16(FP), R2 // arg 3 - osa
260 // arg 4 - tramp
261 MOVD $sigreturn_tramp<>(SB), R3
262 MOVW $2, R4 // arg 5 - vers
263 SVC $SYS___sigaction_sigtramp
264 BCS fail
265 RET
266 fail:
267 MOVD $0, R0
268 MOVD R0, (R0) // crash
269
270 // XXX ???
271 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
272 MOVW sig+8(FP), R0
273 MOVD info+16(FP), R1
274 MOVD ctx+24(FP), R2
275 MOVD fn+0(FP), R11
276 BL (R11)
277 RET
278
279 TEXT runtime·sigtramp(SB),NOSPLIT,$192
280 // Save callee-save registers in the case of signal forwarding.
281 // Please refer to https://golang.org/issue/31827 .
282 MOVD R19, 8*4(RSP)
283 MOVD R20, 8*5(RSP)
284 MOVD R21, 8*6(RSP)
285 MOVD R22, 8*7(RSP)
286 MOVD R23, 8*8(RSP)
287 MOVD R24, 8*9(RSP)
288 MOVD R25, 8*10(RSP)
289 MOVD R26, 8*11(RSP)
290 MOVD R27, 8*12(RSP)
291 MOVD g, 8*13(RSP)
292 MOVD R29, 8*14(RSP)
293 FMOVD F8, 8*15(RSP)
294 FMOVD F9, 8*16(RSP)
295 FMOVD F10, 8*17(RSP)
296 FMOVD F11, 8*18(RSP)
297 FMOVD F12, 8*19(RSP)
298 FMOVD F13, 8*20(RSP)
299 FMOVD F14, 8*21(RSP)
300 FMOVD F15, 8*22(RSP)
301
302 // this might be called in external code context,
303 // where g is not set.
304 // first save R0, because runtime·load_g will clobber it
305 MOVD R0, 8(RSP) // signum
306 MOVB runtime·iscgo(SB), R0
307 CMP $0, R0
308 // XXX branch destination
309 BEQ 2(PC)
310 BL runtime·load_g(SB)
311
312 MOVD R1, 16(RSP)
313 MOVD R2, 24(RSP)
314 BL runtime·sigtrampgo(SB)
315
316 // Restore callee-save registers.
317 MOVD 8*4(RSP), R19
318 MOVD 8*5(RSP), R20
319 MOVD 8*6(RSP), R21
320 MOVD 8*7(RSP), R22
321 MOVD 8*8(RSP), R23
322 MOVD 8*9(RSP), R24
323 MOVD 8*10(RSP), R25
324 MOVD 8*11(RSP), R26
325 MOVD 8*12(RSP), R27
326 MOVD 8*13(RSP), g
327 MOVD 8*14(RSP), R29
328 FMOVD 8*15(RSP), F8
329 FMOVD 8*16(RSP), F9
330 FMOVD 8*17(RSP), F10
331 FMOVD 8*18(RSP), F11
332 FMOVD 8*19(RSP), F12
333 FMOVD 8*20(RSP), F13
334 FMOVD 8*21(RSP), F14
335 FMOVD 8*22(RSP), F15
336
337 RET
338
339 TEXT runtime·mmap(SB),NOSPLIT,$0
340 MOVD addr+0(FP), R0 // arg 1 - addr
341 MOVD n+8(FP), R1 // arg 2 - len
342 MOVW prot+16(FP), R2 // arg 3 - prot
343 MOVW flags+20(FP), R3 // arg 4 - flags
344 MOVW fd+24(FP), R4 // arg 5 - fd
345 MOVW $0, R5 // arg 6 - pad
346 MOVD off+28(FP), R6 // arg 7 - offset
347 SVC $SYS_mmap
348 BCS fail
349 MOVD R0, p+32(FP)
350 MOVD $0, err+40(FP)
351 RET
352 fail:
353 MOVD $0, p+32(FP)
354 MOVD R0, err+40(FP)
355 RET
356
357 TEXT runtime·munmap(SB),NOSPLIT,$0
358 MOVD addr+0(FP), R0 // arg 1 - addr
359 MOVD n+8(FP), R1 // arg 2 - len
360 SVC $SYS_munmap
361 BCS fail
362 RET
363 fail:
364 MOVD $0, R0
365 MOVD R0, (R0) // crash
366
367 TEXT runtime·madvise(SB),NOSPLIT,$0
368 MOVD addr+0(FP), R0 // arg 1 - addr
369 MOVD n+8(FP), R1 // arg 2 - len
370 MOVW flags+16(FP), R2 // arg 3 - behav
371 SVC $SYS_madvise
372 BCC ok
373 MOVD $-1, R0
374 ok:
375 MOVD R0, ret+24(FP)
376 RET
377
378 TEXT runtime·sigaltstack(SB),NOSPLIT,$0
379 MOVD new+0(FP), R0 // arg 1 - nss
380 MOVD old+8(FP), R1 // arg 2 - oss
381 SVC $SYS___sigaltstack14
382 BCS fail
383 RET
384 fail:
385 MOVD $0, R0
386 MOVD R0, (R0) // crash
387
388 TEXT runtime·sysctl(SB),NOSPLIT,$0
389 MOVD mib+0(FP), R0 // arg 1 - name
390 MOVW miblen+8(FP), R1 // arg 2 - namelen
391 MOVD out+16(FP), R2 // arg 3 - oldp
392 MOVD size+24(FP), R3 // arg 4 - oldlenp
393 MOVD dst+32(FP), R4 // arg 5 - newp
394 MOVD ndst+40(FP), R5 // arg 6 - newlen
395 SVC $SYS___sysctl
396 BCC ok
397 NEG R0, R0
398 ok:
399 MOVW R0, ret+48(FP)
400 RET
401
402 // int32 runtime·kqueue(void)
403 TEXT runtime·kqueue(SB),NOSPLIT,$0
404 MOVD $0, R0
405 SVC $SYS_kqueue
406 BCC ok
407 NEG R0, R0
408 ok:
409 MOVW R0, ret+0(FP)
410 RET
411
412 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout)
413 TEXT runtime·kevent(SB),NOSPLIT,$0
414 MOVW kq+0(FP), R0 // arg 1 - kq
415 MOVD ch+8(FP), R1 // arg 2 - changelist
416 MOVW nch+16(FP), R2 // arg 3 - nchanges
417 MOVD ev+24(FP), R3 // arg 4 - eventlist
418 MOVW nev+32(FP), R4 // arg 5 - nevents
419 MOVD ts+40(FP), R5 // arg 6 - timeout
420 SVC $SYS___kevent50
421 BCC ok
422 NEG R0, R0
423 ok:
424 MOVW R0, ret+48(FP)
425 RET
426
427 // void runtime·closeonexec(int32 fd)
428 TEXT runtime·closeonexec(SB),NOSPLIT,$0
429 MOVW fd+0(FP), R0 // arg 1 - fd
430 MOVW $F_SETFD, R1
431 MOVW $FD_CLOEXEC, R2
432 SVC $SYS_fcntl
433 RET
View as plain text