github.com/panjjo/go@v0.0.0-20161104043856-d62b31386338/src/runtime/sys_openbsd_arm.s (about) 1 // Copyright 2009 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, OpenBSD 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 #define CLOCK_REALTIME $0 14 #define CLOCK_MONOTONIC $3 15 16 // Exit the entire program (like C exit) 17 TEXT runtime·exit(SB),NOSPLIT,$-4 18 MOVW code+0(FP), R0 // arg 1 - status 19 MOVW $1, R12 // sys_exit 20 SWI $0 21 MOVW.CS $0, R8 // crash on syscall failure 22 MOVW.CS R8, (R8) 23 RET 24 25 TEXT runtime·exit1(SB),NOSPLIT,$-4 26 MOVW $0, R0 // arg 1 - notdead 27 MOVW $302, R12 // sys___threxit 28 SWI $0 29 MOVW.CS $1, R8 // crash on syscall failure 30 MOVW.CS R8, (R8) 31 RET 32 33 TEXT runtime·open(SB),NOSPLIT,$-4 34 MOVW name+0(FP), R0 // arg 1 - path 35 MOVW mode+4(FP), R1 // arg 2 - mode 36 MOVW perm+8(FP), R2 // arg 3 - perm 37 MOVW $5, R12 // sys_open 38 SWI $0 39 MOVW.CS $-1, R0 40 MOVW R0, ret+12(FP) 41 RET 42 43 TEXT runtime·closefd(SB),NOSPLIT,$-4 44 MOVW fd+0(FP), R0 // arg 1 - fd 45 MOVW $6, R12 // sys_close 46 SWI $0 47 MOVW.CS $-1, R0 48 MOVW R0, ret+4(FP) 49 RET 50 51 TEXT runtime·read(SB),NOSPLIT,$-4 52 MOVW fd+0(FP), R0 // arg 1 - fd 53 MOVW p+4(FP), R1 // arg 2 - buf 54 MOVW n+8(FP), R2 // arg 3 - nbyte 55 MOVW $3, R12 // sys_read 56 SWI $0 57 MOVW.CS $-1, R0 58 MOVW R0, ret+12(FP) 59 RET 60 61 TEXT runtime·write(SB),NOSPLIT,$-4 62 MOVW fd+0(FP), R0 // arg 1 - fd 63 MOVW p+4(FP), R1 // arg 2 - buf 64 MOVW n+8(FP), R2 // arg 3 - nbyte 65 MOVW $4, R12 // sys_write 66 SWI $0 67 MOVW.CS $-1, R0 68 MOVW R0, ret+12(FP) 69 RET 70 71 TEXT runtime·usleep(SB),NOSPLIT,$16 72 MOVW usec+0(FP), R0 73 CALL runtime·usplitR0(SB) 74 MOVW R0, 4(R13) // tv_sec - l32 75 MOVW $0, R0 76 MOVW R0, 8(R13) // tv_sec - h32 77 MOVW $1000, R2 78 MUL R1, R2 79 MOVW R2, 12(R13) // tv_nsec 80 81 MOVW $4(R13), R0 // arg 1 - rqtp 82 MOVW $0, R1 // arg 2 - rmtp 83 MOVW $91, R12 // sys_nanosleep 84 SWI $0 85 RET 86 87 TEXT runtime·raise(SB),NOSPLIT,$12 88 MOVW $0x12B, R12 89 SWI $0 // sys_getthrid 90 // arg 1 - pid, already in R0 91 MOVW sig+0(FP), R1 // arg 2 - signum 92 MOVW $37, R12 // sys_kill 93 SWI $0 94 RET 95 96 TEXT runtime·raiseproc(SB),NOSPLIT,$12 97 MOVW $20, R12 98 SWI $0 // sys_getpid 99 // arg 1 - pid, already in R0 100 MOVW sig+0(FP), R1 // arg 2 - signum 101 MOVW $37, R12 // sys_kill 102 SWI $0 103 RET 104 105 TEXT runtime·mmap(SB),NOSPLIT,$16 106 MOVW addr+0(FP), R0 // arg 1 - addr 107 MOVW n+4(FP), R1 // arg 2 - len 108 MOVW prot+8(FP), R2 // arg 3 - prot 109 MOVW flags+12(FP), R3 // arg 4 - flags 110 MOVW fd+16(FP), R4 // arg 5 - fd (on stack) 111 MOVW R4, 4(R13) 112 MOVW $0, R5 // arg 6 - pad (on stack) 113 MOVW R5, 8(R13) 114 MOVW off+20(FP), R6 // arg 7 - offset (on stack) 115 MOVW R6, 12(R13) // lower 32 bits (from Go runtime) 116 MOVW $0, R7 117 MOVW R7, 16(R13) // high 32 bits 118 ADD $4, R13 119 MOVW $197, R12 // sys_mmap 120 SWI $0 121 SUB $4, R13 122 MOVW R0, ret+24(FP) 123 RET 124 125 TEXT runtime·munmap(SB),NOSPLIT,$0 126 MOVW addr+0(FP), R0 // arg 1 - addr 127 MOVW n+4(FP), R1 // arg 2 - len 128 MOVW $73, R12 // sys_munmap 129 SWI $0 130 MOVW.CS $0, R8 // crash on syscall failure 131 MOVW.CS R8, (R8) 132 RET 133 134 TEXT runtime·madvise(SB),NOSPLIT,$0 135 MOVW addr+0(FP), R0 // arg 1 - addr 136 MOVW n+4(FP), R1 // arg 2 - len 137 MOVW flags+8(FP), R2 // arg 2 - flags 138 MOVW $75, R12 // sys_madvise 139 SWI $0 140 MOVW.CS $0, R8 // crash on syscall failure 141 MOVW.CS R8, (R8) 142 RET 143 144 TEXT runtime·setitimer(SB),NOSPLIT,$0 145 MOVW mode+0(FP), R0 // arg 1 - mode 146 MOVW new+4(FP), R1 // arg 2 - new value 147 MOVW old+8(FP), R2 // arg 3 - old value 148 MOVW $69, R12 // sys_setitimer 149 SWI $0 150 RET 151 152 // func now() (sec int64, nsec int32) 153 TEXT time·now(SB), NOSPLIT, $32 154 MOVW CLOCK_REALTIME, R0 // arg 1 - clock_id 155 MOVW $8(R13), R1 // arg 2 - tp 156 MOVW $87, R12 // sys_clock_gettime 157 SWI $0 158 159 MOVW 8(R13), R0 // sec - l32 160 MOVW 12(R13), R1 // sec - h32 161 MOVW 16(R13), R2 // nsec 162 163 MOVW R0, sec_lo+0(FP) 164 MOVW R1, sec_hi+4(FP) 165 MOVW R2, nsec+8(FP) 166 167 RET 168 169 // int64 nanotime(void) so really 170 // void nanotime(int64 *nsec) 171 TEXT runtime·nanotime(SB),NOSPLIT,$32 172 MOVW CLOCK_MONOTONIC, R0 // arg 1 - clock_id 173 MOVW $8(R13), R1 // arg 2 - tp 174 MOVW $87, R12 // sys_clock_gettime 175 SWI $0 176 177 MOVW 8(R13), R0 // sec - l32 178 MOVW 12(R13), R4 // sec - h32 179 MOVW 16(R13), R2 // nsec 180 181 MOVW $1000000000, R3 182 MULLU R0, R3, (R1, R0) 183 MUL R3, R4 184 ADD.S R2, R0 185 ADC R4, R1 186 187 MOVW R0, ret_lo+0(FP) 188 MOVW R1, ret_hi+4(FP) 189 RET 190 191 TEXT runtime·sigaction(SB),NOSPLIT,$0 192 MOVW sig+0(FP), R0 // arg 1 - signum 193 MOVW new+4(FP), R1 // arg 2 - new sigaction 194 MOVW old+8(FP), R2 // arg 3 - old sigaction 195 MOVW $46, R12 // sys_sigaction 196 SWI $0 197 MOVW.CS $3, R8 // crash on syscall failure 198 MOVW.CS R8, (R8) 199 RET 200 201 TEXT runtime·obsdsigprocmask(SB),NOSPLIT,$0 202 MOVW how+0(FP), R0 // arg 1 - mode 203 MOVW new+4(FP), R1 // arg 2 - new 204 MOVW $48, R12 // sys_sigprocmask 205 SWI $0 206 MOVW.CS $3, R8 // crash on syscall failure 207 MOVW.CS R8, (R8) 208 MOVW R0, ret+8(FP) 209 RET 210 211 TEXT runtime·sigfwd(SB),NOSPLIT,$0-16 212 MOVW sig+4(FP), R0 213 MOVW info+8(FP), R1 214 MOVW ctx+12(FP), R2 215 MOVW fn+0(FP), R11 216 MOVW R13, R4 217 SUB $24, R13 218 BIC $0x7, R13 // alignment for ELF ABI 219 BL (R11) 220 MOVW R4, R13 221 RET 222 223 TEXT runtime·sigtramp(SB),NOSPLIT,$12 224 // If called from an external code context, g will not be set. 225 // Save R0, since runtime·load_g will clobber it. 226 MOVW R0, 4(R13) // signum 227 MOVB runtime·iscgo(SB), R0 228 CMP $0, R0 229 BL.NE runtime·load_g(SB) 230 231 MOVW R1, 8(R13) 232 MOVW R2, 12(R13) 233 BL runtime·sigtrampgo(SB) 234 RET 235 236 // int32 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void)); 237 TEXT runtime·tfork(SB),NOSPLIT,$0 238 239 // Copy mp, gp and fn off parent stack for use by child. 240 MOVW mm+8(FP), R4 241 MOVW gg+12(FP), R5 242 MOVW fn+16(FP), R6 243 244 MOVW param+0(FP), R0 // arg 1 - param 245 MOVW psize+4(FP), R1 // arg 2 - psize 246 MOVW $8, R12 // sys___tfork 247 SWI $0 248 249 // Return if syscall failed. 250 B.CC 4(PC) 251 RSB $0, R0 252 MOVW R0, ret+20(FP) 253 RET 254 255 // In parent, return. 256 CMP $0, R0 257 BEQ 3(PC) 258 MOVW R0, ret+20(FP) 259 RET 260 261 // Initialise m, g. 262 MOVW R5, g 263 MOVW R4, g_m(g) 264 265 // Paranoia; check that stack splitting code works. 266 BL runtime·emptyfunc(SB) 267 268 // Call fn. 269 BL (R6) 270 271 BL runtime·exit1(SB) 272 MOVW $2, R8 // crash if reached 273 MOVW R8, (R8) 274 RET 275 276 TEXT runtime·sigaltstack(SB),NOSPLIT,$0 277 MOVW new+0(FP), R0 // arg 1 - new sigaltstack 278 MOVW old+4(FP), R1 // arg 2 - old sigaltstack 279 MOVW $288, R12 // sys_sigaltstack 280 SWI $0 281 MOVW.CS $0, R8 // crash on syscall failure 282 MOVW.CS R8, (R8) 283 RET 284 285 TEXT runtime·osyield(SB),NOSPLIT,$0 286 MOVW $298, R12 // sys_sched_yield 287 SWI $0 288 RET 289 290 TEXT runtime·thrsleep(SB),NOSPLIT,$4 291 MOVW ident+0(FP), R0 // arg 1 - ident 292 MOVW clock_id+4(FP), R1 // arg 2 - clock_id 293 MOVW tsp+8(FP), R2 // arg 3 - tsp 294 MOVW lock+12(FP), R3 // arg 4 - lock 295 MOVW abort+16(FP), R4 // arg 5 - abort (on stack) 296 MOVW R4, 4(R13) 297 ADD $4, R13 298 MOVW $94, R12 // sys___thrsleep 299 SWI $0 300 SUB $4, R13 301 MOVW R0, ret+20(FP) 302 RET 303 304 TEXT runtime·thrwakeup(SB),NOSPLIT,$0 305 MOVW ident+0(FP), R0 // arg 1 - ident 306 MOVW n+4(FP), R1 // arg 2 - n 307 MOVW $301, R12 // sys___thrwakeup 308 SWI $0 309 MOVW R0, ret+8(FP) 310 RET 311 312 TEXT runtime·sysctl(SB),NOSPLIT,$8 313 MOVW mib+0(FP), R0 // arg 1 - mib 314 MOVW miblen+4(FP), R1 // arg 2 - miblen 315 MOVW out+8(FP), R2 // arg 3 - out 316 MOVW size+12(FP), R3 // arg 4 - size 317 MOVW dst+16(FP), R4 // arg 5 - dest (on stack) 318 MOVW R4, 4(R13) 319 MOVW ndst+20(FP), R5 // arg 6 - newlen (on stack) 320 MOVW R5, 8(R13) 321 ADD $4, R13 322 MOVW $202, R12 // sys___sysctl 323 SWI $0 324 SUB $4, R13 325 MOVW.CC $0, R0 326 RSB.CS $0, R0 327 MOVW R0, ret+24(FP) 328 RET 329 330 // int32 runtime·kqueue(void); 331 TEXT runtime·kqueue(SB),NOSPLIT,$0 332 MOVW $269, R12 // sys_kqueue 333 SWI $0 334 RSB.CS $0, R0 335 MOVW R0, ret+0(FP) 336 RET 337 338 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout); 339 TEXT runtime·kevent(SB),NOSPLIT,$8 340 MOVW kq+0(FP), R0 // arg 1 - kq 341 MOVW ch+4(FP), R1 // arg 2 - changelist 342 MOVW nch+8(FP), R2 // arg 3 - nchanges 343 MOVW ev+12(FP), R3 // arg 4 - eventlist 344 MOVW nev+16(FP), R4 // arg 5 - nevents (on stack) 345 MOVW R4, 4(R13) 346 MOVW ts+20(FP), R5 // arg 6 - timeout (on stack) 347 MOVW R5, 8(R13) 348 ADD $4, R13 349 MOVW $72, R12 // sys_kevent 350 SWI $0 351 RSB.CS $0, R0 352 SUB $4, R13 353 MOVW R0, ret+24(FP) 354 RET 355 356 // func closeonexec(fd int32) 357 TEXT runtime·closeonexec(SB),NOSPLIT,$0 358 MOVW fd+0(FP), R0 // arg 1 - fd 359 MOVW $2, R1 // arg 2 - cmd (F_SETFD) 360 MOVW $1, R2 // arg 3 - arg (FD_CLOEXEC) 361 MOVW $92, R12 // sys_fcntl 362 SWI $0 363 RET 364 365 TEXT ·publicationBarrier(SB),NOSPLIT,$-4-0 366 B runtime·armPublicationBarrier(SB) 367 368 // TODO(jsing): Implement. 369 TEXT runtime·read_tls_fallback(SB),NOSPLIT,$-4 370 MOVW $5, R0 371 MOVW R0, (R0) 372 RET