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