github.com/panjjo/go@v0.0.0-20161104043856-d62b31386338/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 MOVW $0, R0 // CLOCK_REALTIME 188 MOVD RSP, R1 189 MOVD $SYS_clock_gettime, R8 190 SVC 191 MOVD 0(RSP), R3 // sec 192 MOVD 8(RSP), R5 // nsec 193 MOVD R3, sec+0(FP) 194 MOVW R5, nsec+8(FP) 195 RET 196 197 TEXT runtime·nanotime(SB),NOSPLIT,$24-8 198 MOVW $1, R0 // CLOCK_MONOTONIC 199 MOVD RSP, R1 200 MOVD $SYS_clock_gettime, R8 201 SVC 202 MOVD 0(RSP), R3 // sec 203 MOVD 8(RSP), R5 // nsec 204 // sec is in R3, nsec in R5 205 // return nsec in R3 206 MOVD $1000000000, R4 207 MUL R4, R3 208 ADD R5, R3 209 MOVD R3, ret+0(FP) 210 RET 211 212 TEXT runtime·rtsigprocmask(SB),NOSPLIT,$-8-28 213 MOVW how+0(FP), R0 214 MOVD new+8(FP), R1 215 MOVD old+16(FP), R2 216 MOVW size+24(FP), R3 217 MOVD $SYS_rt_sigprocmask, R8 218 SVC 219 CMN $4095, R0 220 BCC done 221 MOVD $0, R0 222 MOVD R0, (R0) // crash 223 done: 224 RET 225 226 TEXT runtime·rt_sigaction(SB),NOSPLIT,$-8-36 227 MOVD sig+0(FP), R0 228 MOVD new+8(FP), R1 229 MOVD old+16(FP), R2 230 MOVD size+24(FP), R3 231 MOVD $SYS_rt_sigaction, R8 232 SVC 233 MOVW R0, ret+32(FP) 234 RET 235 236 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 237 MOVW sig+8(FP), R0 238 MOVD info+16(FP), R1 239 MOVD ctx+24(FP), R2 240 MOVD fn+0(FP), R11 241 BL (R11) 242 RET 243 244 TEXT runtime·sigtramp(SB),NOSPLIT,$24 245 // this might be called in external code context, 246 // where g is not set. 247 // first save R0, because runtime·load_g will clobber it 248 MOVW R0, 8(RSP) 249 MOVBU runtime·iscgo(SB), R0 250 CMP $0, R0 251 BEQ 2(PC) 252 BL runtime·load_g(SB) 253 254 MOVD R1, 16(RSP) 255 MOVD R2, 24(RSP) 256 MOVD $runtime·sigtrampgo(SB), R0 257 BL (R0) 258 RET 259 260 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0 261 MOVD $runtime·sigtramp(SB), R3 262 B (R3) 263 264 TEXT runtime·mmap(SB),NOSPLIT,$-8 265 MOVD addr+0(FP), R0 266 MOVD n+8(FP), R1 267 MOVW prot+16(FP), R2 268 MOVW flags+20(FP), R3 269 MOVW fd+24(FP), R4 270 MOVW off+28(FP), R5 271 272 MOVD $SYS_mmap, R8 273 SVC 274 CMN $4095, R0 275 BCC 2(PC) 276 NEG R0,R0 277 MOVD R0, ret+32(FP) 278 RET 279 280 TEXT runtime·munmap(SB),NOSPLIT,$-8 281 MOVD addr+0(FP), R0 282 MOVD n+8(FP), R1 283 MOVD $SYS_munmap, R8 284 SVC 285 CMN $4095, R0 286 BCC cool 287 MOVD R0, 0xf0(R0) 288 cool: 289 RET 290 291 TEXT runtime·madvise(SB),NOSPLIT,$-8 292 MOVD addr+0(FP), R0 293 MOVD n+8(FP), R1 294 MOVW flags+16(FP), R2 295 MOVD $SYS_madvise, R8 296 SVC 297 // ignore failure - maybe pages are locked 298 RET 299 300 // int64 futex(int32 *uaddr, int32 op, int32 val, 301 // struct timespec *timeout, int32 *uaddr2, int32 val2); 302 TEXT runtime·futex(SB),NOSPLIT,$-8 303 MOVD addr+0(FP), R0 304 MOVW op+8(FP), R1 305 MOVW val+12(FP), R2 306 MOVD ts+16(FP), R3 307 MOVD addr2+24(FP), R4 308 MOVW val3+32(FP), R5 309 MOVD $SYS_futex, R8 310 SVC 311 MOVW R0, ret+40(FP) 312 RET 313 314 // int64 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void)); 315 TEXT runtime·clone(SB),NOSPLIT,$-8 316 MOVW flags+0(FP), R0 317 MOVD stk+8(FP), R1 318 319 // Copy mp, gp, fn off parent stack for use by child. 320 MOVD mp+16(FP), R10 321 MOVD gp+24(FP), R11 322 MOVD fn+32(FP), R12 323 324 MOVD R10, -8(R1) 325 MOVD R11, -16(R1) 326 MOVD R12, -24(R1) 327 MOVD $1234, R10 328 MOVD R10, -32(R1) 329 330 MOVD $SYS_clone, R8 331 SVC 332 333 // In parent, return. 334 CMP ZR, R0 335 BEQ child 336 MOVW R0, ret+40(FP) 337 RET 338 child: 339 340 // In child, on new stack. 341 MOVD -32(RSP), R10 342 MOVD $1234, R0 343 CMP R0, R10 344 BEQ good 345 MOVD $0, R0 346 MOVD R0, (R0) // crash 347 348 good: 349 // Initialize m->procid to Linux tid 350 MOVD $SYS_gettid, R8 351 SVC 352 353 MOVD -24(RSP), R12 // fn 354 MOVD -16(RSP), R11 // g 355 MOVD -8(RSP), R10 // m 356 357 CMP $0, R10 358 BEQ nog 359 CMP $0, R11 360 BEQ nog 361 362 MOVD R0, m_procid(R10) 363 364 // TODO: setup TLS. 365 366 // In child, set up new stack 367 MOVD R10, g_m(R11) 368 MOVD R11, g 369 //CALL runtime·stackcheck(SB) 370 371 nog: 372 // Call fn 373 MOVD R12, R0 374 BL (R0) 375 376 // It shouldn't return. If it does, exit that thread. 377 MOVW $111, R0 378 again: 379 MOVD $SYS_exit, R8 380 SVC 381 B again // keep exiting 382 383 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 384 MOVD new+0(FP), R0 385 MOVD old+8(FP), R1 386 MOVD $SYS_sigaltstack, R8 387 SVC 388 CMN $4095, R0 389 BCC ok 390 MOVD $0, R0 391 MOVD R0, (R0) // crash 392 ok: 393 RET 394 395 TEXT runtime·osyield(SB),NOSPLIT,$-8 396 MOVD $SYS_sched_yield, R8 397 SVC 398 RET 399 400 TEXT runtime·sched_getaffinity(SB),NOSPLIT,$-8 401 MOVD pid+0(FP), R0 402 MOVD len+8(FP), R1 403 MOVD buf+16(FP), R2 404 MOVD $SYS_sched_getaffinity, R8 405 SVC 406 MOVW R0, ret+24(FP) 407 RET 408 409 // int32 runtime·epollcreate(int32 size); 410 TEXT runtime·epollcreate(SB),NOSPLIT,$-8 411 MOVW $0, R0 412 MOVD $SYS_epoll_create1, R8 413 SVC 414 MOVW R0, ret+8(FP) 415 RET 416 417 // int32 runtime·epollcreate1(int32 flags); 418 TEXT runtime·epollcreate1(SB),NOSPLIT,$-8 419 MOVW flags+0(FP), R0 420 MOVD $SYS_epoll_create1, R8 421 SVC 422 MOVW R0, ret+8(FP) 423 RET 424 425 // func epollctl(epfd, op, fd int32, ev *epollEvent) int 426 TEXT runtime·epollctl(SB),NOSPLIT,$-8 427 MOVW epfd+0(FP), R0 428 MOVW op+4(FP), R1 429 MOVW fd+8(FP), R2 430 MOVD ev+16(FP), R3 431 MOVD $SYS_epoll_ctl, R8 432 SVC 433 MOVW R0, ret+24(FP) 434 RET 435 436 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout); 437 TEXT runtime·epollwait(SB),NOSPLIT,$-8 438 MOVW epfd+0(FP), R0 439 MOVD ev+8(FP), R1 440 MOVW nev+16(FP), R2 441 MOVW timeout+20(FP), R3 442 MOVD $0, R4 443 MOVD $SYS_epoll_pwait, R8 444 SVC 445 MOVW R0, ret+24(FP) 446 RET 447 448 // void runtime·closeonexec(int32 fd); 449 TEXT runtime·closeonexec(SB),NOSPLIT,$-8 450 MOVW fd+0(FP), R0 // fd 451 MOVD $2, R1 // F_SETFD 452 MOVD $1, R2 // FD_CLOEXEC 453 MOVD $SYS_fcntl, R8 454 SVC 455 RET 456 457 // int access(const char *name, int mode) 458 TEXT runtime·access(SB),NOSPLIT,$0-20 459 MOVD $AT_FDCWD, R0 460 MOVD name+0(FP), R1 461 MOVW mode+8(FP), R2 462 MOVD $SYS_faccessat, R8 463 SVC 464 MOVW R0, ret+16(FP) 465 RET 466 467 // int connect(int fd, const struct sockaddr *addr, socklen_t len) 468 TEXT runtime·connect(SB),NOSPLIT,$0-28 469 MOVW fd+0(FP), R0 470 MOVD addr+8(FP), R1 471 MOVW len+16(FP), R2 472 MOVD $SYS_connect, R8 473 SVC 474 MOVW R0, ret+24(FP) 475 RET 476 477 // int socket(int domain, int typ, int prot) 478 TEXT runtime·socket(SB),NOSPLIT,$0-20 479 MOVW domain+0(FP), R0 480 MOVW typ+4(FP), R1 481 MOVW prot+8(FP), R2 482 MOVD $SYS_socket, R8 483 SVC 484 MOVW R0, ret+16(FP) 485 RET