github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/sys_freebsd_arm.s (about) 1 // Copyright 2012 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, FreeBSD 6 // /usr/src/sys/kern/syscalls.master for syscall numbers. 7 // 8 9 #include "zasm_GOOS_GOARCH.h" 10 11 TEXT runtime·sys_umtx_op(SB),7,$0 12 MOVW 0(FP), R0 13 MOVW 4(FP), R1 14 MOVW 8(FP), R2 15 MOVW 12(FP), R3 16 ADD $20, R13 // arg 5 is passed on stack 17 SWI $454 18 SUB $20, R13 19 // BCS error 20 RET 21 22 TEXT runtime·thr_new(SB),7,$0 23 MOVW 0(FP), R0 24 MOVW 4(FP), R1 25 SWI $455 26 RET 27 28 TEXT runtime·thr_start(SB),7,$0 29 MOVW R0, R9 // m 30 31 // TODO(minux): set up TLS? 32 33 // set up g 34 MOVW m_g0(R9), R10 35 BL runtime·emptyfunc(SB) // fault if stack check is wrong 36 BL runtime·mstart(SB) 37 38 MOVW $2, R9 // crash (not reached) 39 MOVW R9, (R9) 40 RET 41 42 // Exit the entire program (like C exit) 43 TEXT runtime·exit(SB),7,$-8 44 MOVW 0(FP), R0 // arg 1 exit status 45 SWI $1 46 MOVW.CS $0, R9 // crash on syscall failure 47 MOVW.CS R9, (R9) 48 RET 49 50 TEXT runtime·exit1(SB),7,$-8 51 MOVW 0(FP), R0 // arg 1 exit status 52 SWI $431 53 MOVW.CS $0, R9 // crash on syscall failure 54 MOVW.CS R9, (R9) 55 RET 56 57 TEXT runtime·open(SB),7,$-8 58 MOVW 0(FP), R0 // arg 1 name 59 MOVW 4(FP), R1 // arg 2 mode 60 MOVW 8(FP), R2 // arg 3 perm 61 SWI $5 62 RET 63 64 TEXT runtime·read(SB),7,$-8 65 MOVW 0(FP), R0 // arg 1 fd 66 MOVW 4(FP), R1 // arg 2 buf 67 MOVW 8(FP), R2 // arg 3 count 68 SWI $3 69 RET 70 71 TEXT runtime·write(SB),7,$-8 72 MOVW 0(FP), R0 // arg 1 fd 73 MOVW 4(FP), R1 // arg 2 buf 74 MOVW 8(FP), R2 // arg 3 count 75 SWI $4 76 RET 77 78 TEXT runtime·close(SB),7,$-8 79 MOVW 0(FP), R0 // arg 1 fd 80 SWI $6 81 RET 82 83 TEXT runtime·getrlimit(SB),7,$-8 84 MOVW 0(FP), R0 85 MOVW 4(FP), R1 86 MOVW 8(FP), R2 87 SWI $194 88 RET 89 90 TEXT runtime·raise(SB),7,$8 91 // thr_self(&4(R13)) 92 MOVW $4(R13), R0 // arg 1 &4(R13) 93 SWI $432 94 // thr_kill(self, SIGPIPE) 95 MOVW 4(R13), R0 // arg 1 id 96 MOVW sig+0(FP), R1 // arg 2 - signal 97 SWI $433 98 RET 99 100 TEXT runtime·setitimer(SB), 7, $-8 101 MOVW 0(FP), R0 102 MOVW 4(FP), R1 103 MOVW 8(FP), R2 104 SWI $83 105 RET 106 107 // func now() (sec int64, nsec int32) 108 TEXT time·now(SB), 7, $32 109 MOVW $0, R0 // CLOCK_REALTIME 110 MOVW $8(R13), R1 111 SWI $232 // clock_gettime 112 113 MOVW 8(R13), R0 // sec.low 114 MOVW 12(R13), R1 // sec.high 115 MOVW 16(R13), R2 // nsec 116 117 MOVW R0, 0(FP) 118 MOVW R1, 4(FP) 119 MOVW R2, 8(FP) 120 RET 121 122 // int64 nanotime(void) so really 123 // void nanotime(int64 *nsec) 124 TEXT runtime·nanotime(SB), 7, $32 125 MOVW $0, R0 // CLOCK_REALTIME 126 MOVW $8(R13), R1 127 SWI $232 // clock_gettime 128 129 MOVW 8(R13), R0 // sec.low 130 MOVW 12(R13), R4 // sec.high 131 MOVW 16(R13), R2 // nsec 132 133 MOVW $1000000000, R3 134 MULLU R0, R3, (R1, R0) 135 MUL R3, R4 136 ADD.S R2, R0 137 ADC R4, R1 138 139 MOVW 0(FP), R3 140 MOVW R0, 0(R3) 141 MOVW R1, 4(R3) 142 RET 143 144 TEXT runtime·sigaction(SB),7,$-8 145 MOVW 0(FP), R0 // arg 1 sig 146 MOVW 4(FP), R1 // arg 2 act 147 MOVW 8(FP), R2 // arg 3 oact 148 SWI $416 149 MOVW.CS $0, R9 // crash on syscall failure 150 MOVW.CS R9, (R9) 151 RET 152 153 TEXT runtime·sigtramp(SB),7,$24 154 // this might be called in external code context, 155 // where g and m are not set. 156 // first save R0, because _cgo_load_gm will clobber it 157 // TODO(adonovan): call runtime·badsignal if m=0, like other platforms? 158 MOVW R0, 4(R13) // signum 159 MOVW _cgo_load_gm(SB), R0 160 CMP $0, R0 161 BL.NE (R0) 162 163 // save g 164 MOVW R10, R4 165 MOVW R10, 20(R13) 166 167 // g = m->signal 168 MOVW m_gsignal(R9), R10 169 170 // R0 is already saved 171 MOVW R1, 8(R13) // info 172 MOVW R2, 12(R13) // context 173 MOVW R4, 16(R13) // oldg 174 175 BL runtime·sighandler(SB) 176 177 // restore g 178 MOVW 20(R13), R10 179 RET 180 181 TEXT runtime·mmap(SB),7,$12 182 MOVW 0(FP), R0 // arg 1 addr 183 MOVW 4(FP), R1 // arg 2 len 184 MOVW 8(FP), R2 // arg 3 prot 185 MOVW 12(FP), R3 // arg 4 flags 186 // arg 5 (fid) and arg6 (offset_lo, offset_hi) are passed on stack 187 // note the C runtime only passes the 32-bit offset_lo to us 188 MOVW 16(FP), R4 // arg 5 189 MOVW R4, 4(R13) 190 MOVW 20(FP), R5 // arg 6 lower 32-bit 191 MOVW R5, 8(R13) 192 MOVW $0, R6 // higher 32-bit for arg 6 193 MOVW R6, 12(R13) 194 ADD $4, R13 // pass arg 5 and arg 6 on stack 195 SWI $477 196 SUB $4, R13 197 RET 198 199 TEXT runtime·munmap(SB),7,$0 200 MOVW 0(FP), R0 // arg 1 addr 201 MOVW 4(FP), R1 // arg 2 len 202 SWI $73 203 MOVW.CS $0, R9 // crash on syscall failure 204 MOVW.CS R9, (R9) 205 RET 206 207 TEXT runtime·madvise(SB),7,$0 208 MOVW 0(FP), R0 // arg 1 addr 209 MOVW 4(FP), R1 // arg 2 len 210 MOVW 8(FP), R2 // arg 3 flags 211 SWI $75 212 // ignore failure - maybe pages are locked 213 RET 214 215 TEXT runtime·sigaltstack(SB),7,$-8 216 MOVW new+0(FP), R0 217 MOVW old+4(FP), R1 218 SWI $53 219 MOVW.CS $0, R9 // crash on syscall failure 220 MOVW.CS R9, (R9) 221 RET 222 223 TEXT runtime·usleep(SB),7,$16 224 MOVW usec+0(FP), R0 225 MOVW R0, R2 226 MOVW $1000000, R1 227 DIV R1, R0 228 // 0(R13) is the saved LR, don't use it 229 MOVW R0, 4(R13) // tv_sec.low 230 MOVW $0, R0 231 MOVW R0, 8(R13) // tv_sec.high 232 MOD R1, R2 233 MOVW $1000, R1 234 MUL R1, R2 235 MOVW R2, 12(R13) // tv_nsec 236 237 MOVW $4(R13), R0 // arg 1 - rqtp 238 MOVW $0, R1 // arg 2 - rmtp 239 SWI $240 // sys_nanosleep 240 RET 241 242 TEXT runtime·sysctl(SB),7,$0 243 MOVW 0(FP), R0 // arg 1 - name 244 MOVW 4(FP), R1 // arg 2 - namelen 245 MOVW 8(FP), R2 // arg 3 - oldp 246 MOVW 12(FP), R3 // arg 4 - oldlenp 247 // arg 5 (newp) and arg 6 (newlen) are passed on stack 248 ADD $20, R13 249 SWI $202 // sys___sysctl 250 SUB.CS $0, R0, R0 251 SUB $20, R13 252 RET 253 254 TEXT runtime·osyield(SB),7,$-4 255 SWI $331 // sys_sched_yield 256 RET 257 258 TEXT runtime·sigprocmask(SB),7,$0 259 MOVW $3, R0 // arg 1 - how (SIG_SETMASK) 260 MOVW 0(FP), R1 // arg 2 - set 261 MOVW 4(FP), R2 // arg 3 - oset 262 SWI $340 // sys_sigprocmask 263 MOVW.CS $0, R9 // crash on syscall failure 264 MOVW.CS R9, (R9) 265 RET 266 267 TEXT runtime·casp(SB),7,$0 268 B runtime·cas(SB) 269 270 // TODO(minux): this is only valid for ARMv6+ 271 // bool armcas(int32 *val, int32 old, int32 new) 272 // Atomically: 273 // if(*val == old){ 274 // *val = new; 275 // return 1; 276 // }else 277 // return 0; 278 TEXT runtime·cas(SB),7,$0 279 B runtime·armcas(SB)