github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/sys_linux_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 // 6 // System calls and other sys.stuff for arm, Linux 7 // 8 9 #include "zasm_GOOS_GOARCH.h" 10 11 // for EABI, as we don't support OABI 12 #define SYS_BASE 0x0 13 14 #define SYS_exit (SYS_BASE + 1) 15 #define SYS_read (SYS_BASE + 3) 16 #define SYS_write (SYS_BASE + 4) 17 #define SYS_open (SYS_BASE + 5) 18 #define SYS_close (SYS_BASE + 6) 19 #define SYS_gettimeofday (SYS_BASE + 78) 20 #define SYS_clone (SYS_BASE + 120) 21 #define SYS_rt_sigreturn (SYS_BASE + 173) 22 #define SYS_rt_sigaction (SYS_BASE + 174) 23 #define SYS_rt_sigprocmask (SYS_BASE + 175) 24 #define SYS_sigaltstack (SYS_BASE + 186) 25 #define SYS_mmap2 (SYS_BASE + 192) 26 #define SYS_futex (SYS_BASE + 240) 27 #define SYS_exit_group (SYS_BASE + 248) 28 #define SYS_munmap (SYS_BASE + 91) 29 #define SYS_madvise (SYS_BASE + 220) 30 #define SYS_setitimer (SYS_BASE + 104) 31 #define SYS_mincore (SYS_BASE + 219) 32 #define SYS_gettid (SYS_BASE + 224) 33 #define SYS_tkill (SYS_BASE + 238) 34 #define SYS_sched_yield (SYS_BASE + 158) 35 #define SYS_select (SYS_BASE + 142) // newselect 36 #define SYS_ugetrlimit (SYS_BASE + 191) 37 #define SYS_sched_getaffinity (SYS_BASE + 242) 38 #define SYS_clock_gettime (SYS_BASE + 263) 39 #define SYS_epoll_create (SYS_BASE + 250) 40 #define SYS_epoll_ctl (SYS_BASE + 251) 41 #define SYS_epoll_wait (SYS_BASE + 252) 42 #define SYS_epoll_create1 (SYS_BASE + 357) 43 #define SYS_fcntl (SYS_BASE + 55) 44 45 #define ARM_BASE (SYS_BASE + 0x0f0000) 46 47 TEXT runtime·open(SB),7,$0 48 MOVW 0(FP), R0 49 MOVW 4(FP), R1 50 MOVW 8(FP), R2 51 MOVW $SYS_open, R7 52 SWI $0 53 RET 54 55 TEXT runtime·close(SB),7,$0 56 MOVW 0(FP), R0 57 MOVW $SYS_close, R7 58 SWI $0 59 RET 60 61 TEXT runtime·write(SB),7,$0 62 MOVW 0(FP), R0 63 MOVW 4(FP), R1 64 MOVW 8(FP), R2 65 MOVW $SYS_write, R7 66 SWI $0 67 RET 68 69 TEXT runtime·read(SB),7,$0 70 MOVW 0(FP), R0 71 MOVW 4(FP), R1 72 MOVW 8(FP), R2 73 MOVW $SYS_read, R7 74 SWI $0 75 RET 76 77 TEXT runtime·getrlimit(SB),7,$0 78 MOVW 0(FP), R0 79 MOVW 4(FP), R1 80 MOVW $SYS_ugetrlimit, R7 81 SWI $0 82 RET 83 84 TEXT runtime·exit(SB),7,$-4 85 MOVW 0(FP), R0 86 MOVW $SYS_exit_group, R7 87 SWI $0 88 MOVW $1234, R0 89 MOVW $1002, R1 90 MOVW R0, (R1) // fail hard 91 92 TEXT runtime·exit1(SB),7,$-4 93 MOVW 0(FP), R0 94 MOVW $SYS_exit, R7 95 SWI $0 96 MOVW $1234, R0 97 MOVW $1003, R1 98 MOVW R0, (R1) // fail hard 99 100 TEXT runtime·raise(SB),7,$-4 101 MOVW $SYS_gettid, R7 102 SWI $0 103 // arg 1 tid already in R0 from gettid 104 MOVW sig+0(FP), R1 // arg 2 - signal 105 MOVW $SYS_tkill, R7 106 SWI $0 107 RET 108 109 TEXT runtime·mmap(SB),7,$0 110 MOVW 0(FP), R0 111 MOVW 4(FP), R1 112 MOVW 8(FP), R2 113 MOVW 12(FP), R3 114 MOVW 16(FP), R4 115 MOVW 20(FP), R5 116 MOVW $SYS_mmap2, R7 117 SWI $0 118 MOVW $0xfffff001, R6 119 CMP R6, R0 120 RSB.HI $0, R0 121 RET 122 123 TEXT runtime·munmap(SB),7,$0 124 MOVW 0(FP), R0 125 MOVW 4(FP), R1 126 MOVW $SYS_munmap, R7 127 SWI $0 128 MOVW $0xfffff001, R6 129 CMP R6, R0 130 MOVW.HI $0, R9 // crash on syscall failure 131 MOVW.HI R9, (R9) 132 RET 133 134 TEXT runtime·madvise(SB),7,$0 135 MOVW 0(FP), R0 136 MOVW 4(FP), R1 137 MOVW 8(FP), R2 138 MOVW $SYS_madvise, R7 139 SWI $0 140 // ignore failure - maybe pages are locked 141 RET 142 143 TEXT runtime·setitimer(SB),7,$0 144 MOVW 0(FP), R0 145 MOVW 4(FP), R1 146 MOVW 8(FP), R2 147 MOVW $SYS_setitimer, R7 148 SWI $0 149 RET 150 151 TEXT runtime·mincore(SB),7,$0 152 MOVW 0(FP), R0 153 MOVW 4(FP), R1 154 MOVW 8(FP), R2 155 MOVW $SYS_mincore, R7 156 SWI $0 157 RET 158 159 TEXT time·now(SB), 7, $32 160 MOVW $0, R0 // CLOCK_REALTIME 161 MOVW $8(R13), R1 // timespec 162 MOVW $SYS_clock_gettime, R7 163 SWI $0 164 165 MOVW 8(R13), R0 // sec 166 MOVW 12(R13), R2 // nsec 167 168 MOVW R0, 0(FP) 169 MOVW $0, R1 170 MOVW R1, 4(FP) 171 MOVW R2, 8(FP) 172 RET 173 174 // int64 nanotime(void) so really 175 // void nanotime(int64 *nsec) 176 TEXT runtime·nanotime(SB),7,$32 177 MOVW $0, R0 // CLOCK_REALTIME 178 MOVW $8(R13), R1 // timespec 179 MOVW $SYS_clock_gettime, R7 180 SWI $0 181 182 MOVW 8(R13), R0 // sec 183 MOVW 12(R13), R2 // nsec 184 185 MOVW $1000000000, R3 186 MULLU R0, R3, (R1, R0) 187 MOVW $0, R4 188 ADD.S R2, R0 189 ADC R4, R1 190 191 MOVW 0(FP), R3 192 MOVW R0, 0(R3) 193 MOVW R1, 4(R3) 194 RET 195 196 // int32 futex(int32 *uaddr, int32 op, int32 val, 197 // struct timespec *timeout, int32 *uaddr2, int32 val2); 198 TEXT runtime·futex(SB),7,$0 199 MOVW 4(SP), R0 200 MOVW 8(SP), R1 201 MOVW 12(SP), R2 202 MOVW 16(SP), R3 203 MOVW 20(SP), R4 204 MOVW 24(SP), R5 205 MOVW $SYS_futex, R7 206 SWI $0 207 RET 208 209 210 // int32 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void)); 211 TEXT runtime·clone(SB),7,$0 212 MOVW flags+0(FP), R0 213 MOVW stack+4(FP), R1 214 MOVW $0, R2 // parent tid ptr 215 MOVW $0, R3 // tls_val 216 MOVW $0, R4 // child tid ptr 217 MOVW $0, R5 218 219 // Copy mp, gp, fn off parent stack for use by child. 220 // TODO(kaib): figure out which registers are clobbered by clone and avoid stack copying 221 MOVW $-16(R1), R1 222 MOVW mm+8(FP), R6 223 MOVW R6, 0(R1) 224 MOVW gg+12(FP), R6 225 MOVW R6, 4(R1) 226 MOVW fn+16(FP), R6 227 MOVW R6, 8(R1) 228 MOVW $1234, R6 229 MOVW R6, 12(R1) 230 231 MOVW $SYS_clone, R7 232 SWI $0 233 234 // In parent, return. 235 CMP $0, R0 236 BEQ 2(PC) 237 RET 238 239 // Paranoia: check that SP is as we expect. Use R13 to avoid linker 'fixup' 240 MOVW 12(R13), R0 241 MOVW $1234, R1 242 CMP R0, R1 243 BEQ 2(PC) 244 BL runtime·abort(SB) 245 246 MOVW 0(R13), m 247 MOVW 4(R13), g 248 249 // paranoia; check they are not nil 250 MOVW 0(m), R0 251 MOVW 0(g), R0 252 253 BL runtime·emptyfunc(SB) // fault if stack check is wrong 254 255 // Initialize m->procid to Linux tid 256 MOVW $SYS_gettid, R7 257 SWI $0 258 MOVW R0, m_procid(m) 259 260 // Call fn 261 MOVW 8(R13), R0 262 MOVW $16(R13), R13 263 BL (R0) 264 265 MOVW $0, R0 266 MOVW R0, 4(R13) 267 BL runtime·exit1(SB) 268 269 // It shouldn't return 270 MOVW $1234, R0 271 MOVW $1005, R1 272 MOVW R0, (R1) 273 274 TEXT runtime·sigaltstack(SB),7,$0 275 MOVW 0(FP), R0 276 MOVW 4(FP), R1 277 MOVW $SYS_sigaltstack, R7 278 SWI $0 279 MOVW $0xfffff001, R6 280 CMP R6, R0 281 MOVW.HI $0, R9 // crash on syscall failure 282 MOVW.HI R9, (R9) 283 RET 284 285 TEXT runtime·sigtramp(SB),7,$24 286 // this might be called in external code context, 287 // where g and m are not set. 288 // first save R0, because _cgo_load_gm will clobber it 289 // TODO(adonovan): call runtime·badsignal if m=0, like other platforms? 290 MOVW R0, 4(R13) 291 MOVW _cgo_load_gm(SB), R0 292 CMP $0, R0 293 BL.NE (R0) 294 295 // save g 296 MOVW g, R3 297 MOVW g, 20(R13) 298 299 // g = m->gsignal 300 MOVW m_gsignal(m), g 301 302 // copy arguments for call to sighandler 303 // R0 is already saved above 304 MOVW R1, 8(R13) 305 MOVW R2, 12(R13) 306 MOVW R3, 16(R13) 307 308 BL runtime·sighandler(SB) 309 310 // restore g 311 MOVW 20(R13), g 312 313 RET 314 315 TEXT runtime·rtsigprocmask(SB),7,$0 316 MOVW 0(FP), R0 317 MOVW 4(FP), R1 318 MOVW 8(FP), R2 319 MOVW 12(FP), R3 320 MOVW $SYS_rt_sigprocmask, R7 321 SWI $0 322 RET 323 324 TEXT runtime·rt_sigaction(SB),7,$0 325 MOVW 0(FP), R0 326 MOVW 4(FP), R1 327 MOVW 8(FP), R2 328 MOVW 12(FP), R3 329 MOVW $SYS_rt_sigaction, R7 330 SWI $0 331 RET 332 333 TEXT runtime·sigreturn(SB),7,$0 334 MOVW $SYS_rt_sigreturn, R7 335 SWI $0 336 RET 337 338 TEXT runtime·usleep(SB),7,$12 339 MOVW usec+0(FP), R0 340 MOVW R0, R1 341 MOVW $1000000, R2 342 DIV R2, R0 343 MOD R2, R1 344 MOVW R0, 4(SP) 345 MOVW R1, 8(SP) 346 MOVW $0, R0 347 MOVW $0, R1 348 MOVW $0, R2 349 MOVW $0, R3 350 MOVW $4(SP), R4 351 MOVW $SYS_select, R7 352 SWI $0 353 RET 354 355 // Use kernel version instead of native armcas in asm_arm.s. 356 // See ../sync/atomic/asm_linux_arm.s for details. 357 TEXT cas<>(SB),7,$0 358 MOVW $0xffff0fc0, PC 359 360 TEXT runtime·cas(SB),7,$0 361 MOVW valptr+0(FP), R2 362 MOVW old+4(FP), R0 363 casagain: 364 MOVW new+8(FP), R1 365 BL cas<>(SB) 366 BCC cascheck 367 MOVW $1, R0 368 RET 369 cascheck: 370 // Kernel lies; double-check. 371 MOVW valptr+0(FP), R2 372 MOVW old+4(FP), R0 373 MOVW 0(R2), R3 374 CMP R0, R3 375 BEQ casagain 376 MOVW $0, R0 377 RET 378 379 TEXT runtime·casp(SB),7,$0 380 B runtime·cas(SB) 381 382 TEXT runtime·osyield(SB),7,$0 383 MOVW $SYS_sched_yield, R7 384 SWI $0 385 RET 386 387 TEXT runtime·sched_getaffinity(SB),7,$0 388 MOVW 0(FP), R0 389 MOVW 4(FP), R1 390 MOVW 8(FP), R2 391 MOVW $SYS_sched_getaffinity, R7 392 SWI $0 393 RET 394 395 // int32 runtime·epollcreate(int32 size) 396 TEXT runtime·epollcreate(SB),7,$0 397 MOVW 0(FP), R0 398 MOVW $SYS_epoll_create, R7 399 SWI $0 400 RET 401 402 // int32 runtime·epollcreate1(int32 flags) 403 TEXT runtime·epollcreate1(SB),7,$0 404 MOVW 0(FP), R0 405 MOVW $SYS_epoll_create1, R7 406 SWI $0 407 RET 408 409 // int32 runtime·epollctl(int32 epfd, int32 op, int32 fd, EpollEvent *ev) 410 TEXT runtime·epollctl(SB),7,$0 411 MOVW 0(FP), R0 412 MOVW 4(FP), R1 413 MOVW 8(FP), R2 414 MOVW 12(FP), R3 415 MOVW $SYS_epoll_ctl, R7 416 SWI $0 417 RET 418 419 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout) 420 TEXT runtime·epollwait(SB),7,$0 421 MOVW 0(FP), R0 422 MOVW 4(FP), R1 423 MOVW 8(FP), R2 424 MOVW 12(FP), R3 425 MOVW $SYS_epoll_wait, R7 426 SWI $0 427 RET 428 429 // void runtime·closeonexec(int32 fd) 430 TEXT runtime·closeonexec(SB),7,$0 431 MOVW 0(FP), R0 // fd 432 MOVW $2, R1 // F_SETFD 433 MOVW $1, R2 // FD_CLOEXEC 434 MOVW $SYS_fcntl, R7 435 SWI $0 436 RET