rsc.io/go@v0.0.0-20150416155037-e040fd465409/src/runtime/sys_netbsd_arm.s (about) 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. 4 // 5 // System calls and other sys.stuff for ARM, NetBSD 6 // /usr/src/sys/kern/syscalls.master for syscall numbers. 7 // 8 9 #include "go_asm.h" 10 #include "go_tls.h" 11 #include "textflag.h" 12 13 // Exit the entire program (like C exit) 14 TEXT runtime·exit(SB),NOSPLIT,$-4 15 MOVW code+0(FP), R0 // arg 1 exit status 16 SWI $0xa00001 17 MOVW.CS $0, R8 // crash on syscall failure 18 MOVW.CS R8, (R8) 19 RET 20 21 TEXT runtime·exit1(SB),NOSPLIT,$-4 22 SWI $0xa00136 // sys__lwp_exit 23 MOVW $1, R8 // crash 24 MOVW R8, (R8) 25 RET 26 27 TEXT runtime·open(SB),NOSPLIT,$-8 28 MOVW name+0(FP), R0 29 MOVW mode+4(FP), R1 30 MOVW perm+8(FP), R2 31 SWI $0xa00005 32 MOVW.CS $-1, R0 33 MOVW R0, ret+12(FP) 34 RET 35 36 TEXT runtime·closefd(SB),NOSPLIT,$-8 37 MOVW fd+0(FP), R0 38 SWI $0xa00006 39 MOVW.CS $-1, R0 40 MOVW R0, ret+4(FP) 41 RET 42 43 TEXT runtime·read(SB),NOSPLIT,$-8 44 MOVW fd+0(FP), R0 45 MOVW p+4(FP), R1 46 MOVW n+8(FP), R2 47 SWI $0xa00003 48 MOVW.CS $-1, R0 49 MOVW R0, ret+12(FP) 50 RET 51 52 TEXT runtime·write(SB),NOSPLIT,$-4 53 MOVW fd+0(FP), R0 // arg 1 - fd 54 MOVW p+4(FP), R1 // arg 2 - buf 55 MOVW n+8(FP), R2 // arg 3 - nbyte 56 SWI $0xa00004 // sys_write 57 MOVW.CS $-1, R0 58 MOVW R0, ret+12(FP) 59 RET 60 61 // int32 lwp_create(void *context, uintptr flags, void *lwpid) 62 TEXT runtime·lwp_create(SB),NOSPLIT,$0 63 MOVW ctxt+0(FP), R0 64 MOVW flags+4(FP), R1 65 MOVW lwpid+8(FP), R2 66 SWI $0xa00135 // sys__lwp_create 67 MOVW R0, ret+12(FP) 68 RET 69 70 TEXT runtime·osyield(SB),NOSPLIT,$0 71 SWI $0xa0015e // sys_sched_yield 72 RET 73 74 TEXT runtime·lwp_park(SB),NOSPLIT,$0 75 MOVW abstime+0(FP), R0 // arg 1 - abstime 76 MOVW unpark+4(FP), R1 // arg 2 - unpark 77 MOVW hint+8(FP), R2 // arg 3 - hint 78 MOVW unparkhint+12(FP), R3 // arg 4 - unparkhint 79 SWI $0xa001b2 // sys__lwp_park 80 MOVW R0, ret+16(FP) 81 RET 82 83 TEXT runtime·lwp_unpark(SB),NOSPLIT,$0 84 MOVW lwp+0(FP), R0 // arg 1 - lwp 85 MOVW hint+4(FP), R1 // arg 2 - hint 86 SWI $0xa00141 // sys__lwp_unpark 87 MOVW R0, ret+8(FP) 88 RET 89 90 TEXT runtime·lwp_self(SB),NOSPLIT,$0 91 SWI $0xa00137 // sys__lwp_self 92 MOVW R0, ret+0(FP) 93 RET 94 95 TEXT runtime·lwp_tramp(SB),NOSPLIT,$0 96 MOVW R0, g_m(R1) 97 MOVW R1, g 98 99 BL runtime·emptyfunc(SB) // fault if stack check is wrong 100 BL (R2) 101 MOVW $2, R8 // crash (not reached) 102 MOVW R8, (R8) 103 RET 104 105 TEXT runtime·usleep(SB),NOSPLIT,$16 106 MOVW usec+0(FP), R0 107 MOVW R0, R2 108 MOVW $1000000, R1 109 DIV R1, R0 110 // 0(R13) is the saved LR, don't use it 111 MOVW R0, 4(R13) // tv_sec.low 112 MOVW $0, R0 113 MOVW R0, 8(R13) // tv_sec.high 114 MOD R1, R2 115 MOVW $1000, R1 116 MUL R1, R2 117 MOVW R2, 12(R13) // tv_nsec 118 119 MOVW $4(R13), R0 // arg 1 - rqtp 120 MOVW $0, R1 // arg 2 - rmtp 121 SWI $0xa001ae // sys_nanosleep 122 RET 123 124 TEXT runtime·raise(SB),NOSPLIT,$16 125 SWI $0xa00137 // sys__lwp_self, the returned R0 is arg 1 126 MOVW sig+0(FP), R1 // arg 2 - signal 127 SWI $0xa0013e // sys__lwp_kill 128 RET 129 130 TEXT runtime·setitimer(SB),NOSPLIT,$-4 131 MOVW mode+0(FP), R0 // arg 1 - which 132 MOVW new+4(FP), R1 // arg 2 - itv 133 MOVW old+8(FP), R2 // arg 3 - oitv 134 SWI $0xa001a9 // sys_setitimer 135 RET 136 137 // func now() (sec int64, nsec int32) 138 TEXT time·now(SB), NOSPLIT, $32 139 MOVW $0, R0 // CLOCK_REALTIME 140 MOVW $8(R13), R1 141 SWI $0xa001ab // clock_gettime 142 143 MOVW 8(R13), R0 // sec.low 144 MOVW 12(R13), R1 // sec.high 145 MOVW 16(R13), R2 // nsec 146 147 MOVW R0, sec_lo+0(FP) 148 MOVW R1, sec_hi+4(FP) 149 MOVW R2, nsec+8(FP) 150 RET 151 152 // int64 nanotime(void) so really 153 // void nanotime(int64 *nsec) 154 TEXT runtime·nanotime(SB), NOSPLIT, $32 155 MOVW $0, R0 // CLOCK_REALTIME 156 MOVW $8(R13), R1 157 SWI $0xa001ab // clock_gettime 158 159 MOVW 8(R13), R0 // sec.low 160 MOVW 12(R13), R4 // sec.high 161 MOVW 16(R13), R2 // nsec 162 163 MOVW $1000000000, R3 164 MULLU R0, R3, (R1, R0) 165 MUL R3, R4 166 ADD.S R2, R0 167 ADC R4, R1 168 169 MOVW R0, ret_lo+0(FP) 170 MOVW R1, ret_hi+4(FP) 171 RET 172 173 TEXT runtime·getcontext(SB),NOSPLIT,$-4 174 MOVW ctxt+0(FP), R0 // arg 1 - context 175 SWI $0xa00133 // sys_getcontext 176 MOVW.CS $0, R8 // crash on syscall failure 177 MOVW.CS R8, (R8) 178 RET 179 180 TEXT runtime·sigprocmask(SB),NOSPLIT,$0 181 MOVW mode+0(FP), R0 // arg 1 - how 182 MOVW new+4(FP), R1 // arg 2 - set 183 MOVW old+8(FP), R2 // arg 3 - oset 184 SWI $0xa00125 // sys_sigprocmask 185 MOVW.CS $0, R8 // crash on syscall failure 186 MOVW.CS R8, (R8) 187 RET 188 189 TEXT runtime·sigreturn_tramp(SB),NOSPLIT,$-4 190 // on entry, SP points to siginfo, we add sizeof(ucontext) 191 // to SP to get a pointer to ucontext. 192 ADD $0x80, R13, R0 // 0x80 == sizeof(UcontextT) 193 SWI $0xa00134 // sys_setcontext 194 // something failed, we have to exit 195 MOVW $0x4242, R0 // magic return number 196 SWI $0xa00001 // sys_exit 197 B -2(PC) // continue exit 198 199 TEXT runtime·sigaction(SB),NOSPLIT,$4 200 MOVW sig+0(FP), R0 // arg 1 - signum 201 MOVW new+4(FP), R1 // arg 2 - nsa 202 MOVW old+8(FP), R2 // arg 3 - osa 203 MOVW $runtime·sigreturn_tramp(SB), R3 // arg 4 - tramp 204 MOVW $2, R4 // arg 5 - vers 205 MOVW R4, 4(R13) 206 ADD $4, R13 // pass arg 5 on stack 207 SWI $0xa00154 // sys___sigaction_sigtramp 208 SUB $4, R13 209 MOVW.CS $3, R8 // crash on syscall failure 210 MOVW.CS R8, (R8) 211 RET 212 213 TEXT runtime·sigtramp(SB),NOSPLIT,$24 214 // this might be called in external code context, 215 // where g is not set. 216 // first save R0, because runtime·load_g will clobber it 217 MOVW R0, 4(R13) // signum 218 MOVB runtime·iscgo(SB), R0 219 CMP $0, R0 220 BL.NE runtime·load_g(SB) 221 222 CMP $0, g 223 BNE 4(PC) 224 // signal number is already prepared in 4(R13) 225 MOVW $runtime·badsignal(SB), R11 226 BL (R11) 227 RET 228 229 // save g 230 MOVW g, R4 231 MOVW g, 20(R13) 232 233 // g = m->signal 234 MOVW g_m(g), R8 235 MOVW m_gsignal(R8), g 236 237 // R0 is already saved 238 MOVW R1, 8(R13) // info 239 MOVW R2, 12(R13) // context 240 MOVW R4, 16(R13) // gp 241 242 BL runtime·sighandler(SB) 243 244 // restore g 245 MOVW 20(R13), g 246 RET 247 248 TEXT runtime·mmap(SB),NOSPLIT,$12 249 MOVW addr+0(FP), R0 // arg 1 - addr 250 MOVW n+4(FP), R1 // arg 2 - len 251 MOVW prot+8(FP), R2 // arg 3 - prot 252 MOVW flags+12(FP), R3 // arg 4 - flags 253 // arg 5 (fid) and arg6 (offset_lo, offset_hi) are passed on stack 254 // note the C runtime only passes the 32-bit offset_lo to us 255 MOVW fd+16(FP), R4 // arg 5 256 MOVW R4, 4(R13) 257 MOVW off+20(FP), R5 // arg 6 lower 32-bit 258 MOVW R5, 8(R13) 259 MOVW $0, R6 // higher 32-bit for arg 6 260 MOVW R6, 12(R13) 261 ADD $4, R13 // pass arg 5 and arg 6 on stack 262 SWI $0xa000c5 // sys_mmap 263 SUB $4, R13 264 MOVW R0, ret+24(FP) 265 RET 266 267 TEXT runtime·munmap(SB),NOSPLIT,$0 268 MOVW addr+0(FP), R0 // arg 1 - addr 269 MOVW n+4(FP), R1 // arg 2 - len 270 SWI $0xa00049 // sys_munmap 271 MOVW.CS $0, R8 // crash on syscall failure 272 MOVW.CS R8, (R8) 273 RET 274 275 TEXT runtime·madvise(SB),NOSPLIT,$0 276 MOVW addr+0(FP), R0 // arg 1 - addr 277 MOVW n+4(FP), R1 // arg 2 - len 278 MOVW flags+8(FP), R2 // arg 3 - behav 279 SWI $0xa0004b // sys_madvise 280 // ignore failure - maybe pages are locked 281 RET 282 283 TEXT runtime·sigaltstack(SB),NOSPLIT,$-4 284 MOVW new+0(FP), R0 // arg 1 - nss 285 MOVW old+4(FP), R1 // arg 2 - oss 286 SWI $0xa00119 // sys___sigaltstack14 287 MOVW.CS $0, R8 // crash on syscall failure 288 MOVW.CS R8, (R8) 289 RET 290 291 TEXT runtime·sysctl(SB),NOSPLIT,$8 292 MOVW mib+0(FP), R0 // arg 1 - name 293 MOVW miblen+4(FP), R1 // arg 2 - namelen 294 MOVW out+8(FP), R2 // arg 3 - oldp 295 MOVW size+12(FP), R3 // arg 4 - oldlenp 296 MOVW dst+16(FP), R4 // arg 5 - newp 297 MOVW R4, 4(R13) 298 MOVW ndst+20(FP), R4 // arg 6 - newlen 299 MOVW R4, 8(R13) 300 ADD $4, R13 // pass arg 5 and 6 on stack 301 SWI $0xa000ca // sys___sysctl 302 SUB $4, R13 303 MOVW R0, ret+24(FP) 304 RET 305 306 // int32 runtime·kqueue(void) 307 TEXT runtime·kqueue(SB),NOSPLIT,$0 308 SWI $0xa00158 // sys_kqueue 309 RSB.CS $0, R0 310 MOVW R0, ret+0(FP) 311 RET 312 313 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout) 314 TEXT runtime·kevent(SB),NOSPLIT,$8 315 MOVW kq+0(FP), R0 // kq 316 MOVW ch+4(FP), R1 // changelist 317 MOVW nch+8(FP), R2 // nchanges 318 MOVW ev+12(FP), R3 // eventlist 319 MOVW nev+16(FP), R4 // nevents 320 MOVW R4, 4(R13) 321 MOVW ts+20(FP), R4 // timeout 322 MOVW R4, 8(R13) 323 ADD $4, R13 // pass arg 5 and 6 on stack 324 SWI $0xa001b3 // sys___kevent50 325 RSB.CS $0, R0 326 SUB $4, R13 327 MOVW R0, ret+24(FP) 328 RET 329 330 // void runtime·closeonexec(int32 fd) 331 TEXT runtime·closeonexec(SB),NOSPLIT,$0 332 MOVW fd+0(FP), R0 // fd 333 MOVW $2, R1 // F_SETFD 334 MOVW $1, R2 // FD_CLOEXEC 335 SWI $0xa0005c // sys_fcntl 336 RET 337 338 TEXT runtime·casp1(SB),NOSPLIT,$0 339 B runtime·cas(SB) 340 341 // TODO(minux): this is only valid for ARMv6+ 342 // bool armcas(int32 *val, int32 old, int32 new) 343 // Atomically: 344 // if(*val == old){ 345 // *val = new; 346 // return 1; 347 // }else 348 // return 0; 349 TEXT runtime·cas(SB),NOSPLIT,$0 350 B runtime·armcas(SB) 351 352 TEXT runtime·read_tls_fallback(SB),NOSPLIT,$-4 353 MOVM.WP [R1, R2, R3, R12], (R13) 354 SWI $0x00a0013c // _lwp_getprivate 355 MOVM.IAW (R13), [R1, R2, R3, R12] 356 RET