github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/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 "zasm_GOOS_GOARCH.h" 10 11 // Exit the entire program (like C exit) 12 TEXT runtime·exit(SB),7,$-4 13 MOVW 0(FP), R0 // arg 1 exit status 14 SWI $0xa00001 15 MOVW.CS $0, R9 // crash on syscall failure 16 MOVW.CS R9, (R9) 17 RET 18 19 TEXT runtime·exit1(SB),7,$-4 20 SWI $0xa00136 // sys__lwp_exit 21 MOVW $1, R9 // crash 22 MOVW R9, (R9) 23 RET 24 25 TEXT runtime·open(SB),7,$-8 26 MOVW 0(FP), R0 27 MOVW 4(FP), R1 28 MOVW 8(FP), R2 29 SWI $0xa00005 30 RET 31 32 TEXT runtime·close(SB),7,$-8 33 MOVW 0(FP), R0 34 SWI $0xa00006 35 RET 36 37 TEXT runtime·read(SB),7,$-8 38 MOVW 0(FP), R0 39 MOVW 4(FP), R1 40 MOVW 8(FP), R2 41 SWI $0xa00003 42 RET 43 44 TEXT runtime·write(SB),7,$-4 45 MOVW 0(FP), R0 // arg 1 - fd 46 MOVW 4(FP), R1 // arg 2 - buf 47 MOVW 8(FP), R2 // arg 3 - nbyte 48 SWI $0xa00004 // sys_write 49 RET 50 51 // int32 lwp_create(void *context, uintptr flags, void *lwpid) 52 TEXT runtime·lwp_create(SB),7,$0 53 MOVW context+0(FP), R0 54 MOVW flags+4(FP), R1 55 MOVW lwpid+8(FP), R2 56 SWI $0xa00135 // sys__lwp_create 57 RET 58 59 TEXT runtime·osyield(SB),7,$0 60 SWI $0xa0015e // sys_sched_yield 61 RET 62 63 TEXT runtime·lwp_park(SB),7,$0 64 MOVW 0(FP), R0 // arg 1 - abstime 65 MOVW 4(FP), R1 // arg 2 - unpark 66 MOVW 8(FP), R2 // arg 3 - hint 67 MOVW 12(FP), R3 // arg 4 - unparkhint 68 SWI $0xa001b2 // sys__lwp_park 69 RET 70 71 TEXT runtime·lwp_unpark(SB),7,$0 72 MOVW 0(FP), R0 // arg 1 - lwp 73 MOVW 4(FP), R1 // arg 2 - hint 74 SWI $0xa00141 // sys__lwp_unpark 75 RET 76 77 TEXT runtime·lwp_self(SB),7,$0 78 SWI $0xa00137 // sys__lwp_self 79 RET 80 81 TEXT runtime·lwp_tramp(SB),7,$0 82 MOVW R0, R9 // m 83 MOVW R1, R10 // g 84 85 BL runtime·emptyfunc(SB) // fault if stack check is wrong 86 BL (R2) 87 MOVW $2, R9 // crash (not reached) 88 MOVW R9, (R9) 89 RET 90 91 TEXT runtime·usleep(SB),7,$16 92 MOVW usec+0(FP), R0 93 MOVW R0, R2 94 MOVW $1000000, R1 95 DIV R1, R0 96 // 0(R13) is the saved LR, don't use it 97 MOVW R0, 4(R13) // tv_sec.low 98 MOVW $0, R0 99 MOVW R0, 8(R13) // tv_sec.high 100 MOD R1, R2 101 MOVW $1000, R1 102 MUL R1, R2 103 MOVW R2, 12(R13) // tv_nsec 104 105 MOVW $4(R13), R0 // arg 1 - rqtp 106 MOVW $0, R1 // arg 2 - rmtp 107 SWI $0xa001ae // sys_nanosleep 108 RET 109 110 TEXT runtime·raise(SB),7,$16 111 SWI $0xa00137 // sys__lwp_self, the returned R0 is arg 1 112 MOVW sig+0(FP), R1 // arg 2 - signal 113 SWI $0xa0013e // sys__lwp_kill 114 RET 115 116 TEXT runtime·setitimer(SB),7,$-4 117 MOVW 0(FP), R0 // arg 1 - which 118 MOVW 4(FP), R1 // arg 2 - itv 119 MOVW 8(FP), R2 // arg 3 - oitv 120 SWI $0xa001a9 // sys_setitimer 121 RET 122 123 // func now() (sec int64, nsec int32) 124 TEXT time·now(SB), 7, $32 125 MOVW $0, R0 // CLOCK_REALTIME 126 MOVW $8(R13), R1 127 SWI $0xa001ab // clock_gettime 128 129 MOVW 8(R13), R0 // sec.low 130 MOVW 12(R13), R1 // sec.high 131 MOVW 16(R13), R2 // nsec 132 133 MOVW R0, 0(FP) 134 MOVW R1, 4(FP) 135 MOVW R2, 8(FP) 136 RET 137 138 // int64 nanotime(void) so really 139 // void nanotime(int64 *nsec) 140 TEXT runtime·nanotime(SB), 7, $32 141 MOVW $0, R0 // CLOCK_REALTIME 142 MOVW $8(R13), R1 143 SWI $0xa001ab // clock_gettime 144 145 MOVW 8(R13), R0 // sec.low 146 MOVW 12(R13), R4 // sec.high 147 MOVW 16(R13), R2 // nsec 148 149 MOVW $1000000000, R3 150 MULLU R0, R3, (R1, R0) 151 MUL R3, R4 152 ADD.S R2, R0 153 ADC R4, R1 154 155 MOVW 0(FP), R3 156 MOVW R0, 0(R3) 157 MOVW R1, 4(R3) 158 RET 159 160 TEXT runtime·getcontext(SB),7,$-4 161 MOVW 0(FP), R0 // arg 1 - context 162 SWI $0xa00133 // sys_getcontext 163 MOVW.CS $0, R9 // crash on syscall failure 164 MOVW.CS R9, (R9) 165 RET 166 167 TEXT runtime·sigprocmask(SB),7,$0 168 MOVW 0(FP), R0 // arg 1 - how 169 MOVW 4(FP), R1 // arg 2 - set 170 MOVW 8(FP), R2 // arg 3 - oset 171 SWI $0xa00125 // sys_sigprocmask 172 MOVW.CS $0, R9 // crash on syscall failure 173 MOVW.CS R9, (R9) 174 RET 175 176 TEXT runtime·sigreturn_tramp(SB),7,$-4 177 // in runtime·sigtramp, we saved ucontext into m->tls[0], 178 // here we just load it and call sys_setcontext 179 MOVW m_tls(m), R0 180 SWI $0xa00134 // sys_setcontext 181 // something failed, we have to exit 182 MOVW $0x4242, R0 // magic return number 183 SWI $0xa00001 // sys_exit 184 B -2(PC) // continue exit 185 186 TEXT runtime·sigaction(SB),7,$4 187 MOVW 0(FP), R0 // arg 1 - signum 188 MOVW 4(FP), R1 // arg 2 - nsa 189 MOVW 8(FP), R2 // arg 3 - osa 190 MOVW $runtime·sigreturn_tramp(SB), R3 // arg 4 - tramp 191 MOVW $2, R4 // arg 5 - vers 192 MOVW R4, 4(R13) 193 ADD $4, R13 // pass arg 5 on stack 194 SWI $0xa00154 // sys___sigaction_sigtramp 195 SUB $4, R13 196 MOVW.CS $3, R9 // crash on syscall failure 197 MOVW.CS R9, (R9) 198 RET 199 200 TEXT runtime·sigtramp(SB),7,$24 201 // this might be called in external code context, 202 // where g and m are not set. 203 // first save R0, because _cgo_load_gm will clobber it 204 // TODO(adonovan): call runtime·badsignal if m=0, like other platforms? 205 MOVW R0, 4(R13) // signum 206 MOVW _cgo_load_gm(SB), R0 207 CMP $0, R0 208 BL.NE (R0) 209 210 // save g 211 MOVW R10, R4 212 MOVW R10, 20(R13) 213 214 // g = m->signal 215 MOVW m_gsignal(R9), R10 216 217 // R0 is already saved 218 MOVW R1, 8(R13) // info 219 MOVW R2, 12(R13) // context 220 MOVW R4, 16(R13) // gp 221 // we also save the ucontext into m->tls[0] for easy 222 // signal return 223 MOVW R2, m_tls(m) 224 225 BL runtime·sighandler(SB) 226 227 // restore g 228 MOVW 20(R13), R10 229 RET 230 231 TEXT runtime·mmap(SB),7,$12 232 MOVW 0(FP), R0 // arg 1 - addr 233 MOVW 4(FP), R1 // arg 2 - len 234 MOVW 8(FP), R2 // arg 3 - prot 235 MOVW 12(FP), R3 // arg 4 - flags 236 // arg 5 (fid) and arg6 (offset_lo, offset_hi) are passed on stack 237 // note the C runtime only passes the 32-bit offset_lo to us 238 MOVW 16(FP), R4 // arg 5 239 MOVW R4, 4(R13) 240 MOVW 20(FP), R5 // arg 6 lower 32-bit 241 MOVW R5, 8(R13) 242 MOVW $0, R6 // higher 32-bit for arg 6 243 MOVW R6, 12(R13) 244 ADD $4, R13 // pass arg 5 and arg 6 on stack 245 SWI $0xa000c5 // sys_mmap 246 SUB $4, R13 247 RET 248 249 TEXT runtime·munmap(SB),7,$0 250 MOVW 0(FP), R0 // arg 1 - addr 251 MOVW 4(FP), R1 // arg 2 - len 252 SWI $0xa00049 // sys_munmap 253 MOVW.CS $0, R9 // crash on syscall failure 254 MOVW.CS R9, (R9) 255 RET 256 257 TEXT runtime·madvise(SB),7,$0 258 MOVW 0(FP), R0 // arg 1 - addr 259 MOVW 4(FP), R1 // arg 2 - len 260 MOVW 8(FP), R2 // arg 3 - behav 261 SWI $0xa0004b // sys_madvise 262 // ignore failure - maybe pages are locked 263 RET 264 265 TEXT runtime·sigaltstack(SB),7,$-4 266 MOVW 0(FP), R0 // arg 1 - nss 267 MOVW 4(FP), R1 // arg 2 - oss 268 SWI $0xa00119 // sys___sigaltstack14 269 MOVW.CS $0, R9 // crash on syscall failure 270 MOVW.CS R9, (R9) 271 RET 272 273 TEXT runtime·sysctl(SB),7,$8 274 MOVW 0(FP), R0 // arg 1 - name 275 MOVW 4(FP), R1 // arg 2 - namelen 276 MOVW 8(FP), R2 // arg 3 - oldp 277 MOVW 12(FP), R3 // arg 4 - oldlenp 278 MOVW 16(FP), R4 // arg 5 - newp 279 MOVW R4, 4(R13) 280 MOVW 20(FP), R4 // arg 6 - newlen 281 MOVW R4, 8(R13) 282 ADD $4, R13 // pass arg 5 and 6 on stack 283 SWI $0xa000ca // sys___sysctl 284 SUB $4, R13 285 RET 286 287 TEXT runtime·casp(SB),7,$0 288 B runtime·cas(SB) 289 290 // TODO(minux): this is only valid for ARMv6+ 291 // bool armcas(int32 *val, int32 old, int32 new) 292 // Atomically: 293 // if(*val == old){ 294 // *val = new; 295 // return 1; 296 // }else 297 // return 0; 298 TEXT runtime·cas(SB),7,$0 299 B runtime·armcas(SB)