github.com/4ad/go@v0.0.0-20161219182952-69a12818b605/src/runtime/sys_linux_arm64.s (about) 1 // Copyright 2014 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 arm64, Linux 7 // 8 9 #include "go_asm.h" 10 #include "go_tls.h" 11 #include "textflag.h" 12 13 #define AT_FDCWD -100 14 15 #define SYS_exit 93 16 #define SYS_read 63 17 #define SYS_write 64 18 #define SYS_openat 56 19 #define SYS_close 57 20 #define SYS_fcntl 25 21 #define SYS_gettimeofday 169 22 #define SYS_pselect6 72 23 #define SYS_mmap 222 24 #define SYS_munmap 215 25 #define SYS_setitimer 103 26 #define SYS_clone 220 27 #define SYS_sched_yield 124 28 #define SYS_rt_sigreturn 139 29 #define SYS_rt_sigaction 134 30 #define SYS_rt_sigprocmask 135 31 #define SYS_sigaltstack 132 32 #define SYS_getrlimit 163 33 #define SYS_madvise 233 34 #define SYS_mincore 232 35 #define SYS_getpid 172 36 #define SYS_gettid 178 37 #define SYS_kill 129 38 #define SYS_tkill 130 39 #define SYS_futex 98 40 #define SYS_sched_getaffinity 123 41 #define SYS_exit_group 94 42 #define SYS_epoll_create1 20 43 #define SYS_epoll_ctl 21 44 #define SYS_epoll_pwait 22 45 #define SYS_clock_gettime 113 46 #define SYS_faccessat 48 47 #define SYS_socket 198 48 #define SYS_connect 203 49 50 TEXT runtime·exit(SB),NOSPLIT,$-8-4 51 MOVW code+0(FP), R0 52 MOVD $SYS_exit_group, R8 53 SVC 54 RET 55 56 TEXT runtime·exit1(SB),NOSPLIT,$-8-4 57 MOVW code+0(FP), R0 58 MOVD $SYS_exit, R8 59 SVC 60 RET 61 62 TEXT runtime·open(SB),NOSPLIT,$-8-20 63 MOVD $AT_FDCWD, R0 64 MOVD name+0(FP), R1 65 MOVW mode+8(FP), R2 66 MOVW perm+12(FP), R3 67 MOVD $SYS_openat, R8 68 SVC 69 CMN $4095, R0 70 BCC done 71 MOVW $-1, R0 72 done: 73 MOVW R0, ret+16(FP) 74 RET 75 76 TEXT runtime·closefd(SB),NOSPLIT,$-8-12 77 MOVW fd+0(FP), R0 78 MOVD $SYS_close, R8 79 SVC 80 CMN $4095, R0 81 BCC done 82 MOVW $-1, R0 83 done: 84 MOVW R0, ret+8(FP) 85 RET 86 87 TEXT runtime·write(SB),NOSPLIT,$-8-28 88 MOVD fd+0(FP), R0 89 MOVD p+8(FP), R1 90 MOVW n+16(FP), R2 91 MOVD $SYS_write, R8 92 SVC 93 CMN $4095, R0 94 BCC done 95 MOVW $-1, R0 96 done: 97 MOVW R0, ret+24(FP) 98 RET 99 100 TEXT runtime·read(SB),NOSPLIT,$-8-28 101 MOVW fd+0(FP), R0 102 MOVD p+8(FP), R1 103 MOVW n+16(FP), R2 104 MOVD $SYS_read, R8 105 SVC 106 CMN $4095, R0 107 BCC done 108 MOVW $-1, R0 109 done: 110 MOVW R0, ret+24(FP) 111 RET 112 113 TEXT runtime·getrlimit(SB),NOSPLIT,$-8-20 114 MOVW kind+0(FP), R0 115 MOVD limit+8(FP), R1 116 MOVD $SYS_getrlimit, R8 117 SVC 118 MOVW R0, ret+16(FP) 119 RET 120 121 TEXT runtime·usleep(SB),NOSPLIT,$24-4 122 MOVWU usec+0(FP), R3 123 MOVD R3, R5 124 MOVW $1000000, R4 125 UDIV R4, R3 126 MOVD R3, 8(RSP) 127 MUL R3, R4 128 SUB R4, R5 129 MOVW $1000, R4 130 MUL R4, R5 131 MOVD R5, 16(RSP) 132 133 // pselect6(0, 0, 0, 0, &ts, 0) 134 MOVD $0, R0 135 MOVD R0, R1 136 MOVD R0, R2 137 MOVD R0, R3 138 ADD $8, RSP, R4 139 MOVD R0, R5 140 MOVD $SYS_pselect6, R8 141 SVC 142 RET 143 144 TEXT runtime·gettid(SB),NOSPLIT,$0-4 145 MOVD $SYS_gettid, R8 146 SVC 147 MOVW R0, ret+0(FP) 148 RET 149 150 TEXT runtime·raise(SB),NOSPLIT,$-8 151 MOVD $SYS_gettid, R8 152 SVC 153 MOVW R0, R0 // arg 1 tid 154 MOVW sig+0(FP), R1 // arg 2 155 MOVD $SYS_tkill, R8 156 SVC 157 RET 158 159 TEXT runtime·raiseproc(SB),NOSPLIT,$-8 160 MOVD $SYS_getpid, R8 161 SVC 162 MOVW R0, R0 // arg 1 pid 163 MOVW sig+0(FP), R1 // arg 2 164 MOVD $SYS_kill, R8 165 SVC 166 RET 167 168 TEXT runtime·setitimer(SB),NOSPLIT,$-8-24 169 MOVW mode+0(FP), R0 170 MOVD new+8(FP), R1 171 MOVD old+16(FP), R2 172 MOVD $SYS_setitimer, R8 173 SVC 174 RET 175 176 TEXT runtime·mincore(SB),NOSPLIT,$-8-28 177 MOVD addr+0(FP), R0 178 MOVD n+8(FP), R1 179 MOVD dst+16(FP), R2 180 MOVD $SYS_mincore, R8 181 SVC 182 MOVW R0, ret+24(FP) 183 RET 184 185 // func now() (sec int64, nsec int32) 186 TEXT time·now(SB),NOSPLIT,$24-12 187 MOVD RSP, R0 188 MOVD $0, R1 189 MOVD $SYS_gettimeofday, R8 190 SVC 191 MOVD 0(RSP), R3 // sec 192 MOVD 8(RSP), R5 // usec 193 MOVD $1000, R4 194 MUL R4, R5 195 MOVD R3, sec+0(FP) 196 MOVW R5, nsec+8(FP) 197 RET 198 199 TEXT runtime·nanotime(SB),NOSPLIT,$24-8 200 MOVW $1, R0 // CLOCK_MONOTONIC 201 MOVD RSP, R1 202 MOVD $SYS_clock_gettime, R8 203 SVC 204 MOVD 0(RSP), R3 // sec 205 MOVD 8(RSP), R5 // nsec 206 // sec is in R3, nsec in R5 207 // return nsec in R3 208 MOVD $1000000000, R4 209 MUL R4, R3 210 ADD R5, R3 211 MOVD R3, ret+0(FP) 212 RET 213 214 TEXT runtime·rtsigprocmask(SB),NOSPLIT,$-8-28 215 MOVW sig+0(FP), R0 216 MOVD new+8(FP), R1 217 MOVD old+16(FP), R2 218 MOVW size+24(FP), R3 219 MOVD $SYS_rt_sigprocmask, R8 220 SVC 221 CMN $4095, R0 222 BCC done 223 MOVD $0, R0 224 MOVD R0, (R0) // crash 225 done: 226 RET 227 228 TEXT runtime·rt_sigaction(SB),NOSPLIT,$-8-36 229 MOVD sig+0(FP), R0 230 MOVD new+8(FP), R1 231 MOVD old+16(FP), R2 232 MOVD size+24(FP), R3 233 MOVD $SYS_rt_sigaction, R8 234 SVC 235 MOVW R0, ret+32(FP) 236 RET 237 238 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 239 MOVW sig+8(FP), R0 240 MOVD info+16(FP), R1 241 MOVD ctx+24(FP), R2 242 MOVD fn+0(FP), R11 243 BL (R11) 244 RET 245 246 TEXT runtime·sigtramp(SB),NOSPLIT,$24 247 // this might be called in external code context, 248 // where g is not set. 249 // first save R0, because runtime·load_g will clobber it 250 MOVW R0, 8(RSP) 251 MOVBU runtime·iscgo(SB), R0 252 CMP $0, R0 253 BEQ 2(PC) 254 BL runtime·load_g(SB) 255 256 MOVD R1, 16(RSP) 257 MOVD R2, 24(RSP) 258 MOVD $runtime·sigtrampgo(SB), R0 259 BL (R0) 260 RET 261 262 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0 263 MOVD $runtime·sigtramp(SB), R3 264 B (R3) 265 266 TEXT runtime·mmap(SB),NOSPLIT,$-8 267 MOVD addr+0(FP), R0 268 MOVD n+8(FP), R1 269 MOVW prot+16(FP), R2 270 MOVW flags+20(FP), R3 271 MOVW fd+24(FP), R4 272 MOVW off+28(FP), R5 273 274 MOVD $SYS_mmap, R8 275 SVC 276 CMN $4095, R0 277 BCC 2(PC) 278 NEG R0,R0 279 MOVD R0, ret+32(FP) 280 RET 281 282 TEXT runtime·munmap(SB),NOSPLIT,$-8 283 MOVD addr+0(FP), R0 284 MOVD n+8(FP), R1 285 MOVD $SYS_munmap, R8 286 SVC 287 CMN $4095, R0 288 BCC cool 289 MOVD R0, 0xf0(R0) 290 cool: 291 RET 292 293 TEXT runtime·madvise(SB),NOSPLIT,$-8 294 MOVD addr+0(FP), R0 295 MOVD n+8(FP), R1 296 MOVW flags+16(FP), R2 297 MOVD $SYS_madvise, R8 298 SVC 299 // ignore failure - maybe pages are locked 300 RET 301 302 // int64 futex(int32 *uaddr, int32 op, int32 val, 303 // struct timespec *timeout, int32 *uaddr2, int32 val2); 304 TEXT runtime·futex(SB),NOSPLIT,$-8 305 MOVD addr+0(FP), R0 306 MOVW op+8(FP), R1 307 MOVW val+12(FP), R2 308 MOVD ts+16(FP), R3 309 MOVD addr2+24(FP), R4 310 MOVW val3+32(FP), R5 311 MOVD $SYS_futex, R8 312 SVC 313 MOVW R0, ret+40(FP) 314 RET 315 316 // int64 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void)); 317 TEXT runtime·clone(SB),NOSPLIT,$-8 318 MOVW flags+0(FP), R0 319 MOVD stk+8(FP), R1 320 321 // Copy mp, gp, fn off parent stack for use by child. 322 MOVD mm+16(FP), R10 323 MOVD gg+24(FP), R11 324 MOVD fn+32(FP), R12 325 326 MOVD R10, -8(R1) 327 MOVD R11, -16(R1) 328 MOVD R12, -24(R1) 329 MOVD $1234, R10 330 MOVD R10, -32(R1) 331 332 MOVD $SYS_clone, R8 333 SVC 334 335 // In parent, return. 336 CMP ZR, R0 337 BEQ child 338 MOVW R0, ret+40(FP) 339 RET 340 child: 341 342 // In child, on new stack. 343 MOVD -32(RSP), R10 344 MOVD $1234, R0 345 CMP R0, R10 346 BEQ good 347 MOVD $0, R0 348 MOVD R0, (R0) // crash 349 350 good: 351 // Initialize m->procid to Linux tid 352 MOVD $SYS_gettid, R8 353 SVC 354 355 MOVD -24(RSP), R12 // fn 356 MOVD -16(RSP), R11 // g 357 MOVD -8(RSP), R10 // m 358 359 CMP $0, R10 360 BEQ nog 361 CMP $0, R11 362 BEQ nog 363 364 MOVD R0, m_procid(R10) 365 366 // TODO: setup TLS. 367 368 // In child, set up new stack 369 MOVD R10, g_m(R11) 370 MOVD R11, g 371 //CALL runtime·stackcheck(SB) 372 373 nog: 374 // Call fn 375 MOVD R12, R0 376 BL (R0) 377 378 // It shouldn't return. If it does, exit that thread. 379 MOVW $111, R0 380 again: 381 MOVD $SYS_exit, R8 382 SVC 383 B again // keep exiting 384 385 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 386 MOVD new+0(FP), R0 387 MOVD old+8(FP), R1 388 MOVD $SYS_sigaltstack, R8 389 SVC 390 CMN $4095, R0 391 BCC ok 392 MOVD $0, R0 393 MOVD R0, (R0) // crash 394 ok: 395 RET 396 397 TEXT runtime·osyield(SB),NOSPLIT,$-8 398 MOVD $SYS_sched_yield, R8 399 SVC 400 RET 401 402 TEXT runtime·sched_getaffinity(SB),NOSPLIT,$-8 403 MOVD pid+0(FP), R0 404 MOVD len+8(FP), R1 405 MOVD buf+16(FP), R2 406 MOVD $SYS_sched_getaffinity, R8 407 SVC 408 MOVW R0, ret+24(FP) 409 RET 410 411 // int32 runtime·epollcreate(int32 size); 412 TEXT runtime·epollcreate(SB),NOSPLIT,$-8 413 MOVW $0, R0 414 MOVD $SYS_epoll_create1, R8 415 SVC 416 MOVW R0, ret+8(FP) 417 RET 418 419 // int32 runtime·epollcreate1(int32 flags); 420 TEXT runtime·epollcreate1(SB),NOSPLIT,$-8 421 MOVW flags+0(FP), R0 422 MOVD $SYS_epoll_create1, R8 423 SVC 424 MOVW R0, ret+8(FP) 425 RET 426 427 // func epollctl(epfd, op, fd int32, ev *epollEvent) int 428 TEXT runtime·epollctl(SB),NOSPLIT,$-8 429 MOVW epfd+0(FP), R0 430 MOVW op+4(FP), R1 431 MOVW fd+8(FP), R2 432 MOVD ev+16(FP), R3 433 MOVD $SYS_epoll_ctl, R8 434 SVC 435 MOVW R0, ret+24(FP) 436 RET 437 438 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout); 439 TEXT runtime·epollwait(SB),NOSPLIT,$-8 440 MOVW epfd+0(FP), R0 441 MOVD ev+8(FP), R1 442 MOVW nev+16(FP), R2 443 MOVW timeout+20(FP), R3 444 MOVD $0, R4 445 MOVD $SYS_epoll_pwait, R8 446 SVC 447 MOVW R0, ret+24(FP) 448 RET 449 450 // void runtime·closeonexec(int32 fd); 451 TEXT runtime·closeonexec(SB),NOSPLIT,$-8 452 MOVW fd+0(FP), R0 // fd 453 MOVD $2, R1 // F_SETFD 454 MOVD $1, R2 // FD_CLOEXEC 455 MOVD $SYS_fcntl, R8 456 SVC 457 RET 458 459 // int access(const char *name, int mode) 460 TEXT runtime·access(SB),NOSPLIT,$0-20 461 MOVD $AT_FDCWD, R0 462 MOVD name+0(FP), R1 463 MOVW mode+8(FP), R2 464 MOVD $SYS_faccessat, R8 465 SVC 466 MOVW R0, ret+16(FP) 467 RET 468 469 // int connect(int fd, const struct sockaddr *addr, socklen_t len) 470 TEXT runtime·connect(SB),NOSPLIT,$0-28 471 MOVW fd+0(FP), R0 472 MOVD addr+8(FP), R1 473 MOVW len+16(FP), R2 474 MOVD $SYS_connect, R8 475 SVC 476 MOVW R0, ret+24(FP) 477 RET 478 479 // int socket(int domain, int typ, int prot) 480 TEXT runtime·socket(SB),NOSPLIT,$0-20 481 MOVW domain+0(FP), R0 482 MOVW typ+4(FP), R1 483 MOVW prot+8(FP), R2 484 MOVD $SYS_socket, R8 485 SVC 486 MOVW R0, ret+16(FP) 487 RET