1// Copyright 2013 The Go Authors. All rights reserved.2// Use of this source code is governed by a BSD-style3// license that can be found in the LICENSE file.4//5// System calls and other sys.stuff for ARM, NetBSD6// /usr/src/sys/kern/syscalls.master for syscall numbers.7//89#include "go_asm.h"10#include "go_tls.h"11#include "textflag.h"1213#define CLOCK_REALTIME 014#define CLOCK_MONOTONIC 31516#define SWI_OS_NETBSD 0xa0000017#define SYS_exit SWI_OS_NETBSD | 118#define SYS_read SWI_OS_NETBSD | 319#define SYS_write SWI_OS_NETBSD | 420#define SYS_open SWI_OS_NETBSD | 521#define SYS_close SWI_OS_NETBSD | 622#define SYS_getpid SWI_OS_NETBSD | 2023#define SYS_kill SWI_OS_NETBSD | 3724#define SYS_munmap SWI_OS_NETBSD | 7325#define SYS_madvise SWI_OS_NETBSD | 7526#define SYS_fcntl SWI_OS_NETBSD | 9227#define SYS_mmap SWI_OS_NETBSD | 19728#define SYS___sysctl SWI_OS_NETBSD | 20229#define SYS___sigaltstack14 SWI_OS_NETBSD | 28130#define SYS___sigprocmask14 SWI_OS_NETBSD | 29331#define SYS_issetugid SWI_OS_NETBSD | 30532#define SYS_getcontext SWI_OS_NETBSD | 30733#define SYS_setcontext SWI_OS_NETBSD | 30834#define SYS__lwp_create SWI_OS_NETBSD | 30935#define SYS__lwp_exit SWI_OS_NETBSD | 31036#define SYS__lwp_self SWI_OS_NETBSD | 31137#define SYS__lwp_getprivate SWI_OS_NETBSD | 31638#define SYS__lwp_setprivate SWI_OS_NETBSD | 31739#define SYS__lwp_kill SWI_OS_NETBSD | 31840#define SYS__lwp_unpark SWI_OS_NETBSD | 32141#define SYS___sigaction_sigtramp SWI_OS_NETBSD | 34042#define SYS_kqueue SWI_OS_NETBSD | 34443#define SYS_sched_yield SWI_OS_NETBSD | 35044#define SYS___setitimer50 SWI_OS_NETBSD | 42545#define SYS___clock_gettime50 SWI_OS_NETBSD | 42746#define SYS___nanosleep50 SWI_OS_NETBSD | 43047#define SYS___kevent50 SWI_OS_NETBSD | 43548#define SYS____lwp_park60 SWI_OS_NETBSD | 4784950// Exit the entire program (like C exit)51TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$052 MOVW code+0(FP), R0 // arg 1 exit status53 SWI $SYS_exit54 MOVW.CS $0, R8 // crash on syscall failure55 MOVW.CS R8, (R8)56 RET5758// func exitThread(wait *atomic.Uint32)59TEXT runtime·exitThread(SB),NOSPLIT,$0-460 MOVW wait+0(FP), R061 // We're done using the stack.62 MOVW $0, R263storeloop:64 LDREX (R0), R4 // loads R465 STREX R2, (R0), R1 // stores R266 CMP $0, R167 BNE storeloop68 SWI $SYS__lwp_exit69 MOVW $1, R8 // crash70 MOVW R8, (R8)71 JMP 0(PC)7273TEXT runtime·open(SB),NOSPLIT|NOFRAME,$074 MOVW name+0(FP), R075 MOVW mode+4(FP), R176 MOVW perm+8(FP), R277 SWI $SYS_open78 MOVW.CS $-1, R079 MOVW R0, ret+12(FP)80 RET8182TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$083 MOVW fd+0(FP), R084 SWI $SYS_close85 MOVW.CS $-1, R086 MOVW R0, ret+4(FP)87 RET8889TEXT runtime·read(SB),NOSPLIT|NOFRAME,$090 MOVW fd+0(FP), R091 MOVW p+4(FP), R192 MOVW n+8(FP), R293 SWI $SYS_read94 RSB.CS $0, R0 // caller expects negative errno95 MOVW R0, ret+12(FP)96 RET9798// func pipe2(flags int32) (r, w int32, errno int32)99TEXT runtime·pipe2(SB),NOSPLIT,$0-16100 MOVW $r+4(FP), R0101 MOVW flags+0(FP), R1102 SWI $0xa001c5103 MOVW R0, errno+12(FP)104 RET105106TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0107 MOVW fd+0(FP), R0 // arg 1 - fd108 MOVW p+4(FP), R1 // arg 2 - buf109 MOVW n+8(FP), R2 // arg 3 - nbyte110 SWI $SYS_write111 RSB.CS $0, R0 // caller expects negative errno112 MOVW R0, ret+12(FP)113 RET114115// int32 lwp_create(void *context, uintptr flags, void *lwpid)116TEXT runtime·lwp_create(SB),NOSPLIT,$0117 MOVW ctxt+0(FP), R0118 MOVW flags+4(FP), R1119 MOVW lwpid+8(FP), R2120 SWI $SYS__lwp_create121 MOVW R0, ret+12(FP)122 RET123124TEXT runtime·osyield(SB),NOSPLIT,$0125 SWI $SYS_sched_yield126 RET127128TEXT runtime·lwp_park(SB),NOSPLIT,$8129 MOVW clockid+0(FP), R0 // arg 1 - clock_id130 MOVW flags+4(FP), R1 // arg 2 - flags131 MOVW ts+8(FP), R2 // arg 3 - ts132 MOVW unpark+12(FP), R3 // arg 4 - unpark133 MOVW hint+16(FP), R4 // arg 5 - hint134 MOVW R4, 4(R13)135 MOVW unparkhint+20(FP), R5 // arg 6 - unparkhint136 MOVW R5, 8(R13)137 SWI $SYS____lwp_park60138 MOVW R0, ret+24(FP)139 RET140141TEXT runtime·lwp_unpark(SB),NOSPLIT,$0142 MOVW lwp+0(FP), R0 // arg 1 - lwp143 MOVW hint+4(FP), R1 // arg 2 - hint144 SWI $SYS__lwp_unpark145 MOVW R0, ret+8(FP)146 RET147148TEXT runtime·lwp_self(SB),NOSPLIT,$0149 SWI $SYS__lwp_self150 MOVW R0, ret+0(FP)151 RET152153TEXT runtime·lwp_tramp(SB),NOSPLIT,$0154 MOVW R0, g_m(R1)155 MOVW R1, g156157 BL runtime·emptyfunc(SB) // fault if stack check is wrong158 BL (R2)159 MOVW $2, R8 // crash (not reached)160 MOVW R8, (R8)161 RET162163TEXT ·netbsdMstart(SB),NOSPLIT|TOPFRAME,$0164 BL ·netbsdMstart0(SB)165 RET // not reached166167TEXT runtime·usleep(SB),NOSPLIT,$16168 MOVW usec+0(FP), R0169 CALL runtime·usplitR0(SB)170 // 0(R13) is the saved LR, don't use it171 MOVW R0, 4(R13) // tv_sec.low172 MOVW $0, R0173 MOVW R0, 8(R13) // tv_sec.high174 MOVW $1000, R2175 MUL R1, R2176 MOVW R2, 12(R13) // tv_nsec177178 MOVW $4(R13), R0 // arg 1 - rqtp179 MOVW $0, R1 // arg 2 - rmtp180 SWI $SYS___nanosleep50181 RET182183TEXT runtime·lwp_kill(SB),NOSPLIT,$0-8184 MOVW tid+0(FP), R0 // arg 1 - tid185 MOVW sig+4(FP), R1 // arg 2 - signal186 SWI $SYS__lwp_kill187 RET188189TEXT runtime·raiseproc(SB),NOSPLIT,$16190 SWI $SYS_getpid // the returned R0 is arg 1191 MOVW sig+0(FP), R1 // arg 2 - signal192 SWI $SYS_kill193 RET194195TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0196 MOVW mode+0(FP), R0 // arg 1 - which197 MOVW new+4(FP), R1 // arg 2 - itv198 MOVW old+8(FP), R2 // arg 3 - oitv199 SWI $SYS___setitimer50200 RET201202// func walltime() (sec int64, nsec int32)203TEXT runtime·walltime(SB), NOSPLIT, $32204 MOVW $0, R0 // CLOCK_REALTIME205 MOVW $8(R13), R1206 SWI $SYS___clock_gettime50207208 MOVW 8(R13), R0 // sec.low209 MOVW 12(R13), R1 // sec.high210 MOVW 16(R13), R2 // nsec211212 MOVW R0, sec_lo+0(FP)213 MOVW R1, sec_hi+4(FP)214 MOVW R2, nsec+8(FP)215 RET216217// int64 nanotime1(void) so really218// void nanotime1(int64 *nsec)219TEXT runtime·nanotime1(SB), NOSPLIT, $32220 MOVW $3, R0 // CLOCK_MONOTONIC221 MOVW $8(R13), R1222 SWI $SYS___clock_gettime50223224 MOVW 8(R13), R0 // sec.low225 MOVW 12(R13), R4 // sec.high226 MOVW 16(R13), R2 // nsec227228 MOVW $1000000000, R3229 MULLU R0, R3, (R1, R0)230 MUL R3, R4231 ADD.S R2, R0232 ADC R4, R1233234 MOVW R0, ret_lo+0(FP)235 MOVW R1, ret_hi+4(FP)236 RET237238TEXT runtime·getcontext(SB),NOSPLIT|NOFRAME,$0239 MOVW ctxt+0(FP), R0 // arg 1 - context240 SWI $SYS_getcontext241 MOVW.CS $0, R8 // crash on syscall failure242 MOVW.CS R8, (R8)243 RET244245TEXT runtime·sigprocmask(SB),NOSPLIT,$0246 MOVW how+0(FP), R0 // arg 1 - how247 MOVW new+4(FP), R1 // arg 2 - set248 MOVW old+8(FP), R2 // arg 3 - oset249 SWI $SYS___sigprocmask14250 MOVW.CS $0, R8 // crash on syscall failure251 MOVW.CS R8, (R8)252 RET253254TEXT sigreturn_tramp<>(SB),NOSPLIT|NOFRAME,$0255 // on entry, SP points to siginfo, we add sizeof(ucontext)256 // to SP to get a pointer to ucontext.257 ADD $0x80, R13, R0 // 0x80 == sizeof(UcontextT)258 SWI $SYS_setcontext259 // something failed, we have to exit260 MOVW $0x4242, R0 // magic return number261 SWI $SYS_exit262 B -2(PC) // continue exit263264TEXT runtime·sigaction(SB),NOSPLIT,$4265 MOVW sig+0(FP), R0 // arg 1 - signum266 MOVW new+4(FP), R1 // arg 2 - nsa267 MOVW old+8(FP), R2 // arg 3 - osa268 MOVW $sigreturn_tramp<>(SB), R3 // arg 4 - tramp269 MOVW $2, R4 // arg 5 - vers270 MOVW R4, 4(R13)271 ADD $4, R13 // pass arg 5 on stack272 SWI $SYS___sigaction_sigtramp273 SUB $4, R13274 MOVW.CS $3, R8 // crash on syscall failure275 MOVW.CS R8, (R8)276 RET277278TEXT runtime·sigfwd(SB),NOSPLIT,$0-16279 MOVW sig+4(FP), R0280 MOVW info+8(FP), R1281 MOVW ctx+12(FP), R2282 MOVW fn+0(FP), R11283 MOVW R13, R4284 SUB $24, R13285 BIC $0x7, R13 // alignment for ELF ABI286 BL (R11)287 MOVW R4, R13288 RET289290TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0291 // Reserve space for callee-save registers and arguments.292 MOVM.DB.W [R4-R11], (R13)293 SUB $16, R13294295 // this might be called in external code context,296 // where g is not set.297 // first save R0, because runtime·load_g will clobber it298 MOVW R0, 4(R13) // signum299 MOVB runtime·iscgo(SB), R0300 CMP $0, R0301 BL.NE runtime·load_g(SB)302303 MOVW R1, 8(R13)304 MOVW R2, 12(R13)305 BL runtime·sigtrampgo(SB)306307 // Restore callee-save registers.308 ADD $16, R13309 MOVM.IA.W (R13), [R4-R11]310311 RET312313TEXT runtime·mmap(SB),NOSPLIT,$12314 MOVW addr+0(FP), R0 // arg 1 - addr315 MOVW n+4(FP), R1 // arg 2 - len316 MOVW prot+8(FP), R2 // arg 3 - prot317 MOVW flags+12(FP), R3 // arg 4 - flags318 // arg 5 (fid) and arg6 (offset_lo, offset_hi) are passed on stack319 // note the C runtime only passes the 32-bit offset_lo to us320 MOVW fd+16(FP), R4 // arg 5321 MOVW R4, 4(R13)322 MOVW off+20(FP), R5 // arg 6 lower 32-bit323 MOVW R5, 8(R13)324 MOVW $0, R6 // higher 32-bit for arg 6325 MOVW R6, 12(R13)326 ADD $4, R13 // pass arg 5 and arg 6 on stack327 SWI $SYS_mmap328 SUB $4, R13329 MOVW $0, R1330 MOVW.CS R0, R1 // if error, move to R1331 MOVW.CS $0, R0332 MOVW R0, p+24(FP)333 MOVW R1, err+28(FP)334 RET335336TEXT runtime·munmap(SB),NOSPLIT,$0337 MOVW addr+0(FP), R0 // arg 1 - addr338 MOVW n+4(FP), R1 // arg 2 - len339 SWI $SYS_munmap340 MOVW.CS $0, R8 // crash on syscall failure341 MOVW.CS R8, (R8)342 RET343344TEXT runtime·madvise(SB),NOSPLIT,$0345 MOVW addr+0(FP), R0 // arg 1 - addr346 MOVW n+4(FP), R1 // arg 2 - len347 MOVW flags+8(FP), R2 // arg 3 - behav348 SWI $SYS_madvise349 MOVW.CS $-1, R0350 MOVW R0, ret+12(FP)351 RET352353TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0354 MOVW new+0(FP), R0 // arg 1 - nss355 MOVW old+4(FP), R1 // arg 2 - oss356 SWI $SYS___sigaltstack14357 MOVW.CS $0, R8 // crash on syscall failure358 MOVW.CS R8, (R8)359 RET360361TEXT runtime·sysctl(SB),NOSPLIT,$8362 MOVW mib+0(FP), R0 // arg 1 - name363 MOVW miblen+4(FP), R1 // arg 2 - namelen364 MOVW out+8(FP), R2 // arg 3 - oldp365 MOVW size+12(FP), R3 // arg 4 - oldlenp366 MOVW dst+16(FP), R4 // arg 5 - newp367 MOVW R4, 4(R13)368 MOVW ndst+20(FP), R4 // arg 6 - newlen369 MOVW R4, 8(R13)370 ADD $4, R13 // pass arg 5 and 6 on stack371 SWI $SYS___sysctl372 SUB $4, R13373 MOVW R0, ret+24(FP)374 RET375376// int32 runtime·kqueue(void)377TEXT runtime·kqueue(SB),NOSPLIT,$0378 SWI $SYS_kqueue379 RSB.CS $0, R0380 MOVW R0, ret+0(FP)381 RET382383// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout)384TEXT runtime·kevent(SB),NOSPLIT,$8385 MOVW kq+0(FP), R0 // kq386 MOVW ch+4(FP), R1 // changelist387 MOVW nch+8(FP), R2 // nchanges388 MOVW ev+12(FP), R3 // eventlist389 MOVW nev+16(FP), R4 // nevents390 MOVW R4, 4(R13)391 MOVW ts+20(FP), R4 // timeout392 MOVW R4, 8(R13)393 ADD $4, R13 // pass arg 5 and 6 on stack394 SWI $SYS___kevent50395 RSB.CS $0, R0396 SUB $4, R13397 MOVW R0, ret+24(FP)398 RET399400// func fcntl(fd, cmd, args int32) int32401TEXT runtime·fcntl(SB),NOSPLIT,$0402 MOVW fd+0(FP), R0403 MOVW cmd+4(FP), R1404 MOVW arg+8(FP), R2405 SWI $SYS_fcntl406 MOVW $0, R1407 MOVW.CS R0, R1408 MOVW.CS $-1, R0409 MOVW R0, ret+12(FP)410 MOVW R1, errno+16(FP)411 RET412413// TODO: this is only valid for ARMv7+414TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0415 B runtime·armPublicationBarrier(SB)416417TEXT runtime·read_tls_fallback(SB),NOSPLIT|NOFRAME,$0418 MOVM.WP [R1, R2, R3, R12], (R13)419 SWI $SYS__lwp_getprivate420 MOVM.IAW (R13), [R1, R2, R3, R12]421 RET422423// func issetugid() int32424TEXT runtime·issetugid(SB),NOSPLIT,$0425 SWI $SYS_issetugid426 MOVW R0, ret+0(FP)427 RET
Findings
✓ No findings reported for this file.