blob: f19a8b78f6a21aeb4e822b9ac219c5ed88515d1a [file] [log] [blame]
Maya Rashishd23cba62019-04-20 14:39:33 +00001// 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
Maya Rashishd1f43cc2019-04-22 10:01:22 +000013#define CLOCK_REALTIME 0
14#define CLOCK_MONOTONIC 3
15#define FD_CLOEXEC 1
16#define F_SETFD 2
Ian Lance Taylor3b0aa542019-04-03 16:31:13 -070017#define F_GETFL 3
18#define F_SETFL 4
19#define O_NONBLOCK 4
Maya Rashishd23cba62019-04-20 14:39:33 +000020
Maya Rashishd1f43cc2019-04-22 10:01:22 +000021#define SYS_exit 1
22#define SYS_read 3
23#define SYS_write 4
24#define SYS_open 5
25#define SYS_close 6
26#define SYS_getpid 20
27#define SYS_kill 37
28#define SYS_munmap 73
29#define SYS_madvise 75
30#define SYS_fcntl 92
31#define SYS_mmap 197
32#define SYS___sysctl 202
33#define SYS___sigaltstack14 281
34#define SYS___sigprocmask14 293
35#define SYS_getcontext 307
36#define SYS_setcontext 308
37#define SYS__lwp_create 309
38#define SYS__lwp_exit 310
39#define SYS__lwp_self 311
40#define SYS__lwp_kill 318
41#define SYS__lwp_unpark 321
42#define SYS___sigaction_sigtramp 340
43#define SYS_kqueue 344
44#define SYS_sched_yield 350
45#define SYS___setitimer50 425
46#define SYS___clock_gettime50 427
47#define SYS___nanosleep50 430
48#define SYS___kevent50 435
Ian Lance Taylor3b0aa542019-04-03 16:31:13 -070049#define SYS_pipe2 453
Maya Rashishd1f43cc2019-04-22 10:01:22 +000050#define SYS_openat 468
51#define SYS____lwp_park60 478
Maya Rashishd23cba62019-04-20 14:39:33 +000052
53// int32 lwp_create(void *context, uintptr flags, void *lwpid)
54TEXT runtime·lwp_create(SB),NOSPLIT,$0
55 MOVD ctxt+0(FP), R0
56 MOVD flags+8(FP), R1
57 MOVD lwpid+16(FP), R2
58 SVC $SYS__lwp_create
59 BCC ok
60 NEG R0, R0
61ok:
62 MOVW R0, ret+24(FP)
63 RET
64
65TEXT runtime·lwp_tramp(SB),NOSPLIT,$0
66 CMP $0, R1
67 BEQ nog
68 CMP $0, R2
69 BEQ nog
70
71 MOVD R0, g_m(R1)
72 MOVD R1, g
73nog:
74 CALL (R2)
75
76 MOVD $0, R0 // crash (not reached)
77 MOVD R0, (R8)
78
79TEXT runtime·osyield(SB),NOSPLIT,$0
80 SVC $SYS_sched_yield
81 RET
82
83TEXT runtime·lwp_park(SB),NOSPLIT,$0
84 MOVW clockid+0(FP), R0 // arg 1 - clockid
85 MOVW flags+4(FP), R1 // arg 2 - flags
86 MOVD ts+8(FP), R2 // arg 3 - ts
87 MOVW unpark+16(FP), R3 // arg 4 - unpark
88 MOVD hint+24(FP), R4 // arg 5 - hint
89 MOVD unparkhint+32(FP), R5 // arg 6 - unparkhint
90 SVC $SYS____lwp_park60
91 MOVW R0, ret+40(FP)
92 RET
93
94TEXT runtime·lwp_unpark(SB),NOSPLIT,$0
95 MOVW lwp+0(FP), R0 // arg 1 - lwp
96 MOVD hint+8(FP), R1 // arg 2 - hint
97 SVC $SYS__lwp_unpark
98 MOVW R0, ret+16(FP)
99 RET
100
101TEXT runtime·lwp_self(SB),NOSPLIT,$0
102 SVC $SYS__lwp_self
103 MOVW R0, ret+0(FP)
104 RET
105
106// Exit the entire program (like C exit)
107TEXT runtime·exit(SB),NOSPLIT,$-8
Joel Sing37133b52019-05-15 04:19:26 +1000108 MOVW code+0(FP), R0 // arg 1 - exit status
Maya Rashishd23cba62019-04-20 14:39:33 +0000109 SVC $SYS_exit
110 MOVD $0, R0 // If we're still running,
111 MOVD R0, (R0) // crash
112
Maya Rashishd23cba62019-04-20 14:39:33 +0000113// func exitThread(wait *uint32)
114TEXT runtime·exitThread(SB),NOSPLIT,$0-8
Joel Sing37133b52019-05-15 04:19:26 +1000115 MOVD wait+0(FP), R0
Maya Rashishd23cba62019-04-20 14:39:33 +0000116 // We're done using the stack.
117 MOVW $0, R1
118 STLRW R1, (R0)
119 SVC $SYS__lwp_exit
120 JMP 0(PC)
121
122TEXT runtime·open(SB),NOSPLIT|NOFRAME,$-8
123 MOVD name+0(FP), R0 // arg 1 - pathname
124 MOVW mode+8(FP), R1 // arg 2 - flags
125 MOVW perm+12(FP), R2 // arg 3 - mode
126 SVC $SYS_open
127 BCC ok
128 MOVW $-1, R0
129ok:
130 MOVW R0, ret+16(FP)
131 RET
132
133TEXT runtime·closefd(SB),NOSPLIT,$-8
134 MOVW fd+0(FP), R0 // arg 1 - fd
135 SVC $SYS_close
136 BCC ok
137 MOVW $-1, R0
138ok:
139 MOVW R0, ret+8(FP)
140 RET
141
142TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0
143 MOVW fd+0(FP), R0 // arg 1 - fd
144 MOVD p+8(FP), R1 // arg 2 - buf
145 MOVW n+16(FP), R2 // arg 3 - count
146 SVC $SYS_read
147 BCC ok
Ian Lance Taylorb653c872019-04-05 11:42:37 -0700148 NEG R0, R0
Maya Rashishd23cba62019-04-20 14:39:33 +0000149ok:
150 MOVW R0, ret+24(FP)
151 RET
152
Ian Lance Taylor3b0aa542019-04-03 16:31:13 -0700153// func pipe() (r, w int32, errno int32)
154TEXT runtime·pipe(SB),NOSPLIT|NOFRAME,$0-12
155 MOVW $0, R0
156 SVC $SYS_pipe2
157 BCC pipeok
158 MOVW $-1,R1
159 MOVW R1, r+0(FP)
160 MOVW R1, w+4(FP)
161 NEG R0, R0
162 MOVW R0, errno+8(FP)
163 RET
164pipeok:
165 MOVW R0, r+0(FP)
166 MOVW R1, w+4(FP)
167 MOVW ZR, errno+8(FP)
168 RET
169
170// func pipe2(flags int32) (r, w int32, errno int32)
171TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20
Benny Siegert8ab020a2020-09-26 19:40:17 +0000172 ADD $16, RSP, R0
Ian Lance Taylor3b0aa542019-04-03 16:31:13 -0700173 MOVW flags+0(FP), R1
174 SVC $SYS_pipe2
Benny Siegert8ab020a2020-09-26 19:40:17 +0000175 BCC pipe2ok
Ian Lance Taylor3b0aa542019-04-03 16:31:13 -0700176 NEG R0, R0
Benny Siegert8ab020a2020-09-26 19:40:17 +0000177pipe2ok:
Ian Lance Taylor3b0aa542019-04-03 16:31:13 -0700178 MOVW R0, errno+16(FP)
179 RET
180
Austin Clements4af3c172019-09-01 10:37:44 -0400181TEXT runtime·write1(SB),NOSPLIT,$-8
Maya Rashishd23cba62019-04-20 14:39:33 +0000182 MOVD fd+0(FP), R0 // arg 1 - fd
183 MOVD p+8(FP), R1 // arg 2 - buf
184 MOVW n+16(FP), R2 // arg 3 - nbyte
185 SVC $SYS_write
186 BCC ok
Ian Lance Taylorb653c872019-04-05 11:42:37 -0700187 NEG R0, R0
Maya Rashishd23cba62019-04-20 14:39:33 +0000188ok:
Joel Sing37133b52019-05-15 04:19:26 +1000189 MOVW R0, ret+24(FP)
Maya Rashishd23cba62019-04-20 14:39:33 +0000190 RET
191
192TEXT runtime·usleep(SB),NOSPLIT,$24-4
Joel Sing37133b52019-05-15 04:19:26 +1000193 MOVWU usec+0(FP), R3
Maya Rashishd23cba62019-04-20 14:39:33 +0000194 MOVD R3, R5
195 MOVW $1000000, R4
196 UDIV R4, R3
197 MOVD R3, 8(RSP) // sec
198 MUL R3, R4
199 SUB R4, R5
200 MOVW $1000, R4
201 MUL R4, R5
202 MOVD R5, 16(RSP) // nsec
203
Joel Sing37133b52019-05-15 04:19:26 +1000204 MOVD $8(RSP), R0 // arg 1 - rqtp
Maya Rashishd23cba62019-04-20 14:39:33 +0000205 MOVD $0, R1 // arg 2 - rmtp
206 SVC $SYS___nanosleep50
207 RET
208
Austin Clements8714e392019-10-14 17:05:56 -0400209TEXT runtime·lwp_kill(SB),NOSPLIT,$0-16
210 MOVW tid+0(FP), R0 // arg 1 - target
211 MOVD sig+8(FP), R1 // arg 2 - signo
Maya Rashishd23cba62019-04-20 14:39:33 +0000212 SVC $SYS__lwp_kill
213 RET
214
215TEXT runtime·raiseproc(SB),NOSPLIT,$16
216 SVC $SYS_getpid
217 // arg 1 - pid (from getpid)
218 MOVD sig+0(FP), R1 // arg 2 - signo
219 SVC $SYS_kill
220 RET
221
222TEXT runtime·setitimer(SB),NOSPLIT,$-8
223 MOVW mode+0(FP), R0 // arg 1 - which
224 MOVD new+8(FP), R1 // arg 2 - itv
225 MOVD old+16(FP), R2 // arg 3 - oitv
226 SVC $SYS___setitimer50
227 RET
228
Austin Clements4af3c172019-09-01 10:37:44 -0400229// func walltime1() (sec int64, nsec int32)
230TEXT runtime·walltime1(SB), NOSPLIT, $32
Maya Rashishd23cba62019-04-20 14:39:33 +0000231 MOVW $CLOCK_REALTIME, R0 // arg 1 - clock_id
Joel Sing37133b52019-05-15 04:19:26 +1000232 MOVD $8(RSP), R1 // arg 2 - tp
Maya Rashishd23cba62019-04-20 14:39:33 +0000233 SVC $SYS___clock_gettime50
234
235 MOVD 8(RSP), R0 // sec
Joel Sing37133b52019-05-15 04:19:26 +1000236 MOVD 16(RSP), R1 // nsec
Maya Rashishd23cba62019-04-20 14:39:33 +0000237
238 // sec is in R0, nsec in R1
239 MOVD R0, sec+0(FP)
240 MOVW R1, nsec+8(FP)
241 RET
242
Austin Clements4af3c172019-09-01 10:37:44 -0400243// int64 nanotime1(void) so really
244// void nanotime1(int64 *nsec)
245TEXT runtime·nanotime1(SB), NOSPLIT, $32
Maya Rashishd23cba62019-04-20 14:39:33 +0000246 MOVD $CLOCK_MONOTONIC, R0 // arg 1 - clock_id
247 MOVD $8(RSP), R1 // arg 2 - tp
248 SVC $SYS___clock_gettime50
249 MOVD 8(RSP), R0 // sec
Joel Sing37133b52019-05-15 04:19:26 +1000250 MOVD 16(RSP), R2 // nsec
Maya Rashishd23cba62019-04-20 14:39:33 +0000251
252 // sec is in R0, nsec in R2
253 // return nsec in R2
254 MOVD $1000000000, R3
255 MUL R3, R0
256 ADD R2, R0
257
258 MOVD R0, ret+0(FP)
259 RET
260
261TEXT runtime·getcontext(SB),NOSPLIT,$-8
262 MOVD ctxt+0(FP), R0 // arg 1 - context
263 SVC $SYS_getcontext
264 BCS fail
265 RET
266fail:
267 MOVD $0, R0
268 MOVD R0, (R0) // crash
269
270TEXT runtime·sigprocmask(SB),NOSPLIT,$0
271 MOVW how+0(FP), R0 // arg 1 - how
272 MOVD new+8(FP), R1 // arg 2 - set
273 MOVD old+16(FP), R2 // arg 3 - oset
274 SVC $SYS___sigprocmask14
275 BCS fail
276 RET
277fail:
278 MOVD $0, R0
279 MOVD R0, (R0) // crash
280
Russ Cox924c1612019-05-08 15:30:33 -0400281TEXT sigreturn_tramp<>(SB),NOSPLIT,$-8
Maya Rashishd23cba62019-04-20 14:39:33 +0000282 MOVD g, R0
283 SVC $SYS_setcontext
284 MOVD $0x4242, R0 // Something failed, return magic number
285 SVC $SYS_exit
286
287TEXT runtime·sigaction(SB),NOSPLIT,$-8
288 MOVW sig+0(FP), R0 // arg 1 - signum
289 MOVD new+8(FP), R1 // arg 2 - nsa
290 MOVD old+16(FP), R2 // arg 3 - osa
291 // arg 4 - tramp
Russ Cox924c1612019-05-08 15:30:33 -0400292 MOVD $sigreturn_tramp<>(SB), R3
Maya Rashishd23cba62019-04-20 14:39:33 +0000293 MOVW $2, R4 // arg 5 - vers
294 SVC $SYS___sigaction_sigtramp
295 BCS fail
296 RET
297fail:
298 MOVD $0, R0
299 MOVD R0, (R0) // crash
300
301// XXX ???
302TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
303 MOVW sig+8(FP), R0
304 MOVD info+16(FP), R1
305 MOVD ctx+24(FP), R2
306 MOVD fn+0(FP), R11
307 BL (R11)
308 RET
309
Ben Shicbdf9ad2019-05-15 02:12:10 +0000310TEXT runtime·sigtramp(SB),NOSPLIT,$192
311 // Save callee-save registers in the case of signal forwarding.
312 // Please refer to https://golang.org/issue/31827 .
313 MOVD R19, 8*4(RSP)
314 MOVD R20, 8*5(RSP)
315 MOVD R21, 8*6(RSP)
316 MOVD R22, 8*7(RSP)
317 MOVD R23, 8*8(RSP)
318 MOVD R24, 8*9(RSP)
319 MOVD R25, 8*10(RSP)
320 MOVD R26, 8*11(RSP)
321 MOVD R27, 8*12(RSP)
322 MOVD g, 8*13(RSP)
Benny Siegert8ab020a2020-09-26 19:40:17 +0000323 // Unclobber g for now (kernel uses it as ucontext ptr)
324 // See https://github.com/golang/go/issues/30824#issuecomment-492772426
325 // This is only correct in the non-cgo case.
326 // XXX should use lwp_getprivate as suggested.
327 // 8*36 is ucontext.uc_mcontext.__gregs[_REG_X28]
328 MOVD 8*36(g), g
Ben Shicbdf9ad2019-05-15 02:12:10 +0000329 MOVD R29, 8*14(RSP)
330 FMOVD F8, 8*15(RSP)
331 FMOVD F9, 8*16(RSP)
332 FMOVD F10, 8*17(RSP)
333 FMOVD F11, 8*18(RSP)
334 FMOVD F12, 8*19(RSP)
335 FMOVD F13, 8*20(RSP)
336 FMOVD F14, 8*21(RSP)
337 FMOVD F15, 8*22(RSP)
338
Maya Rashishd23cba62019-04-20 14:39:33 +0000339 // this might be called in external code context,
340 // where g is not set.
341 // first save R0, because runtime·load_g will clobber it
342 MOVD R0, 8(RSP) // signum
343 MOVB runtime·iscgo(SB), R0
344 CMP $0, R0
345 // XXX branch destination
346 BEQ 2(PC)
347 BL runtime·load_g(SB)
348
349 MOVD R1, 16(RSP)
350 MOVD R2, 24(RSP)
351 BL runtime·sigtrampgo(SB)
Ben Shicbdf9ad2019-05-15 02:12:10 +0000352
353 // Restore callee-save registers.
354 MOVD 8*4(RSP), R19
355 MOVD 8*5(RSP), R20
356 MOVD 8*6(RSP), R21
357 MOVD 8*7(RSP), R22
358 MOVD 8*8(RSP), R23
359 MOVD 8*9(RSP), R24
360 MOVD 8*10(RSP), R25
361 MOVD 8*11(RSP), R26
362 MOVD 8*12(RSP), R27
363 MOVD 8*13(RSP), g
364 MOVD 8*14(RSP), R29
365 FMOVD 8*15(RSP), F8
366 FMOVD 8*16(RSP), F9
367 FMOVD 8*17(RSP), F10
368 FMOVD 8*18(RSP), F11
369 FMOVD 8*19(RSP), F12
370 FMOVD 8*20(RSP), F13
371 FMOVD 8*21(RSP), F14
372 FMOVD 8*22(RSP), F15
373
Maya Rashishd23cba62019-04-20 14:39:33 +0000374 RET
375
376TEXT runtime·mmap(SB),NOSPLIT,$0
377 MOVD addr+0(FP), R0 // arg 1 - addr
378 MOVD n+8(FP), R1 // arg 2 - len
379 MOVW prot+16(FP), R2 // arg 3 - prot
380 MOVW flags+20(FP), R3 // arg 4 - flags
381 MOVW fd+24(FP), R4 // arg 5 - fd
382 MOVW $0, R5 // arg 6 - pad
383 MOVD off+28(FP), R6 // arg 7 - offset
384 SVC $SYS_mmap
385 BCS fail
386 MOVD R0, p+32(FP)
387 MOVD $0, err+40(FP)
388 RET
389fail:
390 MOVD $0, p+32(FP)
391 MOVD R0, err+40(FP)
392 RET
393
394TEXT runtime·munmap(SB),NOSPLIT,$0
395 MOVD addr+0(FP), R0 // arg 1 - addr
396 MOVD n+8(FP), R1 // arg 2 - len
397 SVC $SYS_munmap
398 BCS fail
399 RET
400fail:
401 MOVD $0, R0
402 MOVD R0, (R0) // crash
403
404TEXT runtime·madvise(SB),NOSPLIT,$0
405 MOVD addr+0(FP), R0 // arg 1 - addr
406 MOVD n+8(FP), R1 // arg 2 - len
407 MOVW flags+16(FP), R2 // arg 3 - behav
408 SVC $SYS_madvise
409 BCC ok
410 MOVD $-1, R0
411ok:
412 MOVD R0, ret+24(FP)
413 RET
414
Joel Sing37133b52019-05-15 04:19:26 +1000415TEXT runtime·sigaltstack(SB),NOSPLIT,$0
Maya Rashishd23cba62019-04-20 14:39:33 +0000416 MOVD new+0(FP), R0 // arg 1 - nss
417 MOVD old+8(FP), R1 // arg 2 - oss
418 SVC $SYS___sigaltstack14
419 BCS fail
420 RET
421fail:
422 MOVD $0, R0
423 MOVD R0, (R0) // crash
424
425TEXT runtime·sysctl(SB),NOSPLIT,$0
426 MOVD mib+0(FP), R0 // arg 1 - name
427 MOVW miblen+8(FP), R1 // arg 2 - namelen
428 MOVD out+16(FP), R2 // arg 3 - oldp
429 MOVD size+24(FP), R3 // arg 4 - oldlenp
430 MOVD dst+32(FP), R4 // arg 5 - newp
431 MOVD ndst+40(FP), R5 // arg 6 - newlen
432 SVC $SYS___sysctl
433 BCC ok
434 NEG R0, R0
435ok:
436 MOVW R0, ret+48(FP)
437 RET
438
439// int32 runtime·kqueue(void)
440TEXT runtime·kqueue(SB),NOSPLIT,$0
441 MOVD $0, R0
442 SVC $SYS_kqueue
443 BCC ok
444 NEG R0, R0
445ok:
446 MOVW R0, ret+0(FP)
447 RET
448
449// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout)
450TEXT runtime·kevent(SB),NOSPLIT,$0
451 MOVW kq+0(FP), R0 // arg 1 - kq
452 MOVD ch+8(FP), R1 // arg 2 - changelist
453 MOVW nch+16(FP), R2 // arg 3 - nchanges
454 MOVD ev+24(FP), R3 // arg 4 - eventlist
455 MOVW nev+32(FP), R4 // arg 5 - nevents
456 MOVD ts+40(FP), R5 // arg 6 - timeout
457 SVC $SYS___kevent50
458 BCC ok
459 NEG R0, R0
460ok:
461 MOVW R0, ret+48(FP)
462 RET
463
464// void runtime·closeonexec(int32 fd)
465TEXT runtime·closeonexec(SB),NOSPLIT,$0
466 MOVW fd+0(FP), R0 // arg 1 - fd
467 MOVW $F_SETFD, R1
468 MOVW $FD_CLOEXEC, R2
469 SVC $SYS_fcntl
470 RET
Ian Lance Taylor3b0aa542019-04-03 16:31:13 -0700471
472// func runtime·setNonblock(int32 fd)
473TEXT runtime·setNonblock(SB),NOSPLIT|NOFRAME,$0-4
474 MOVW fd+0(FP), R0 // arg 1 - fd
475 MOVD $F_GETFL, R1 // arg 2 - cmd
476 MOVD $0, R2 // arg 3
477 SVC $SYS_fcntl
478 MOVD $O_NONBLOCK, R2
479 EOR R0, R2 // arg 3 - flags
480 MOVW fd+0(FP), R0 // arg 1 - fd
481 MOVD $F_SETFL, R1 // arg 2 - cmd
482 SVC $SYS_fcntl
483 RET