github.com/geraldss/go/src@v0.0.0-20210511222824-ac7d0ebfc235/runtime/sys_linux_mipsx.s (about) 1 // Copyright 2016 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 // +build linux 6 // +build mips mipsle 7 8 // 9 // System calls and other sys.stuff for mips, Linux 10 // 11 12 #include "go_asm.h" 13 #include "go_tls.h" 14 #include "textflag.h" 15 16 #define SYS_exit 4001 17 #define SYS_read 4003 18 #define SYS_write 4004 19 #define SYS_open 4005 20 #define SYS_close 4006 21 #define SYS_getpid 4020 22 #define SYS_kill 4037 23 #define SYS_pipe 4042 24 #define SYS_brk 4045 25 #define SYS_fcntl 4055 26 #define SYS_mmap 4090 27 #define SYS_munmap 4091 28 #define SYS_setitimer 4104 29 #define SYS_clone 4120 30 #define SYS_sched_yield 4162 31 #define SYS_nanosleep 4166 32 #define SYS_rt_sigreturn 4193 33 #define SYS_rt_sigaction 4194 34 #define SYS_rt_sigprocmask 4195 35 #define SYS_sigaltstack 4206 36 #define SYS_madvise 4218 37 #define SYS_mincore 4217 38 #define SYS_gettid 4222 39 #define SYS_futex 4238 40 #define SYS_sched_getaffinity 4240 41 #define SYS_exit_group 4246 42 #define SYS_epoll_create 4248 43 #define SYS_epoll_ctl 4249 44 #define SYS_epoll_wait 4250 45 #define SYS_clock_gettime 4263 46 #define SYS_tgkill 4266 47 #define SYS_epoll_create1 4326 48 #define SYS_pipe2 4328 49 50 TEXT runtime·exit(SB),NOSPLIT,$0-4 51 MOVW code+0(FP), R4 52 MOVW $SYS_exit_group, R2 53 SYSCALL 54 UNDEF 55 RET 56 57 // func exitThread(wait *uint32) 58 TEXT runtime·exitThread(SB),NOSPLIT,$0-4 59 MOVW wait+0(FP), R1 60 // We're done using the stack. 61 MOVW $0, R2 62 SYNC 63 MOVW R2, (R1) 64 SYNC 65 MOVW $0, R4 // exit code 66 MOVW $SYS_exit, R2 67 SYSCALL 68 UNDEF 69 JMP 0(PC) 70 71 TEXT runtime·open(SB),NOSPLIT,$0-16 72 MOVW name+0(FP), R4 73 MOVW mode+4(FP), R5 74 MOVW perm+8(FP), R6 75 MOVW $SYS_open, R2 76 SYSCALL 77 BEQ R7, 2(PC) 78 MOVW $-1, R2 79 MOVW R2, ret+12(FP) 80 RET 81 82 TEXT runtime·closefd(SB),NOSPLIT,$0-8 83 MOVW fd+0(FP), R4 84 MOVW $SYS_close, R2 85 SYSCALL 86 BEQ R7, 2(PC) 87 MOVW $-1, R2 88 MOVW R2, ret+4(FP) 89 RET 90 91 TEXT runtime·write1(SB),NOSPLIT,$0-16 92 MOVW fd+0(FP), R4 93 MOVW p+4(FP), R5 94 MOVW n+8(FP), R6 95 MOVW $SYS_write, R2 96 SYSCALL 97 BEQ R7, 2(PC) 98 SUBU R2, R0, R2 // caller expects negative errno 99 MOVW R2, ret+12(FP) 100 RET 101 102 TEXT runtime·read(SB),NOSPLIT,$0-16 103 MOVW fd+0(FP), R4 104 MOVW p+4(FP), R5 105 MOVW n+8(FP), R6 106 MOVW $SYS_read, R2 107 SYSCALL 108 BEQ R7, 2(PC) 109 SUBU R2, R0, R2 // caller expects negative errno 110 MOVW R2, ret+12(FP) 111 RET 112 113 // func pipe() (r, w int32, errno int32) 114 TEXT runtime·pipe(SB),NOSPLIT,$0-12 115 MOVW $SYS_pipe, R2 116 SYSCALL 117 BEQ R7, pipeok 118 MOVW $-1, R1 119 MOVW R1, r+0(FP) 120 MOVW R1, w+4(FP) 121 SUBU R2, R0, R2 // caller expects negative errno 122 MOVW R2, errno+8(FP) 123 RET 124 pipeok: 125 MOVW R2, r+0(FP) 126 MOVW R3, w+4(FP) 127 MOVW R0, errno+8(FP) 128 RET 129 130 // func pipe2(flags int32) (r, w int32, errno int32) 131 TEXT runtime·pipe2(SB),NOSPLIT,$0-16 132 MOVW $r+4(FP), R4 133 MOVW flags+0(FP), R5 134 MOVW $SYS_pipe2, R2 135 SYSCALL 136 BEQ R7, 2(PC) 137 SUBU R2, R0, R2 // caller expects negative errno 138 MOVW R2, errno+12(FP) 139 RET 140 141 TEXT runtime·usleep(SB),NOSPLIT,$28-4 142 MOVW usec+0(FP), R3 143 MOVW R3, R5 144 MOVW $1000000, R4 145 DIVU R4, R3 146 MOVW LO, R3 147 MOVW R3, 24(R29) 148 MOVW $1000, R4 149 MULU R3, R4 150 MOVW LO, R4 151 SUBU R4, R5 152 MOVW R5, 28(R29) 153 154 // nanosleep(&ts, 0) 155 ADDU $24, R29, R4 156 MOVW $0, R5 157 MOVW $SYS_nanosleep, R2 158 SYSCALL 159 RET 160 161 TEXT runtime·gettid(SB),NOSPLIT,$0-4 162 MOVW $SYS_gettid, R2 163 SYSCALL 164 MOVW R2, ret+0(FP) 165 RET 166 167 TEXT runtime·raise(SB),NOSPLIT,$0-4 168 MOVW $SYS_getpid, R2 169 SYSCALL 170 MOVW R2, R16 171 MOVW $SYS_gettid, R2 172 SYSCALL 173 MOVW R2, R5 // arg 2 tid 174 MOVW R16, R4 // arg 1 pid 175 MOVW sig+0(FP), R6 // arg 3 176 MOVW $SYS_tgkill, R2 177 SYSCALL 178 RET 179 180 TEXT runtime·raiseproc(SB),NOSPLIT,$0 181 MOVW $SYS_getpid, R2 182 SYSCALL 183 MOVW R2, R4 // arg 1 pid 184 MOVW sig+0(FP), R5 // arg 2 185 MOVW $SYS_kill, R2 186 SYSCALL 187 RET 188 189 TEXT ·getpid(SB),NOSPLIT,$0-4 190 MOVW $SYS_getpid, R2 191 SYSCALL 192 MOVW R2, ret+0(FP) 193 RET 194 195 TEXT ·tgkill(SB),NOSPLIT,$0-12 196 MOVW tgid+0(FP), R4 197 MOVW tid+4(FP), R5 198 MOVW sig+8(FP), R6 199 MOVW $SYS_tgkill, R2 200 SYSCALL 201 RET 202 203 TEXT runtime·setitimer(SB),NOSPLIT,$0-12 204 MOVW mode+0(FP), R4 205 MOVW new+4(FP), R5 206 MOVW old+8(FP), R6 207 MOVW $SYS_setitimer, R2 208 SYSCALL 209 RET 210 211 TEXT runtime·mincore(SB),NOSPLIT,$0-16 212 MOVW addr+0(FP), R4 213 MOVW n+4(FP), R5 214 MOVW dst+8(FP), R6 215 MOVW $SYS_mincore, R2 216 SYSCALL 217 SUBU R2, R0, R2 // caller expects negative errno 218 MOVW R2, ret+12(FP) 219 RET 220 221 // func walltime1() (sec int64, nsec int32) 222 TEXT runtime·walltime1(SB),NOSPLIT,$8-12 223 MOVW $0, R4 // CLOCK_REALTIME 224 MOVW $4(R29), R5 225 MOVW $SYS_clock_gettime, R2 226 SYSCALL 227 MOVW 4(R29), R3 // sec 228 MOVW 8(R29), R5 // nsec 229 MOVW $sec+0(FP), R6 230 #ifdef GOARCH_mips 231 MOVW R3, 4(R6) 232 MOVW R0, 0(R6) 233 #else 234 MOVW R3, 0(R6) 235 MOVW R0, 4(R6) 236 #endif 237 MOVW R5, nsec+8(FP) 238 RET 239 240 TEXT runtime·nanotime1(SB),NOSPLIT,$8-8 241 MOVW $1, R4 // CLOCK_MONOTONIC 242 MOVW $4(R29), R5 243 MOVW $SYS_clock_gettime, R2 244 SYSCALL 245 MOVW 4(R29), R3 // sec 246 MOVW 8(R29), R5 // nsec 247 // sec is in R3, nsec in R5 248 // return nsec in R3 249 MOVW $1000000000, R4 250 MULU R4, R3 251 MOVW LO, R3 252 ADDU R5, R3 253 SGTU R5, R3, R4 254 MOVW $ret+0(FP), R6 255 #ifdef GOARCH_mips 256 MOVW R3, 4(R6) 257 #else 258 MOVW R3, 0(R6) 259 #endif 260 MOVW HI, R3 261 ADDU R4, R3 262 #ifdef GOARCH_mips 263 MOVW R3, 0(R6) 264 #else 265 MOVW R3, 4(R6) 266 #endif 267 RET 268 269 TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0-16 270 MOVW how+0(FP), R4 271 MOVW new+4(FP), R5 272 MOVW old+8(FP), R6 273 MOVW size+12(FP), R7 274 MOVW $SYS_rt_sigprocmask, R2 275 SYSCALL 276 BEQ R7, 2(PC) 277 UNDEF // crash 278 RET 279 280 TEXT runtime·rt_sigaction(SB),NOSPLIT,$0-20 281 MOVW sig+0(FP), R4 282 MOVW new+4(FP), R5 283 MOVW old+8(FP), R6 284 MOVW size+12(FP), R7 285 MOVW $SYS_rt_sigaction, R2 286 SYSCALL 287 BEQ R7, 2(PC) 288 SUBU R2, R0, R2 // caller expects negative errno 289 MOVW R2, ret+16(FP) 290 RET 291 292 TEXT runtime·sigfwd(SB),NOSPLIT,$0-16 293 MOVW sig+4(FP), R4 294 MOVW info+8(FP), R5 295 MOVW ctx+12(FP), R6 296 MOVW fn+0(FP), R25 297 MOVW R29, R22 298 SUBU $16, R29 299 AND $~7, R29 // shadow space for 4 args aligned to 8 bytes as per O32 ABI 300 JAL (R25) 301 MOVW R22, R29 302 RET 303 304 TEXT runtime·sigtramp(SB),NOSPLIT,$12 305 // this might be called in external code context, 306 // where g is not set. 307 MOVB runtime·iscgo(SB), R1 308 BEQ R1, 2(PC) 309 JAL runtime·load_g(SB) 310 311 MOVW R4, 4(R29) 312 MOVW R5, 8(R29) 313 MOVW R6, 12(R29) 314 MOVW $runtime·sigtrampgo(SB), R1 315 JAL (R1) 316 RET 317 318 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0 319 JMP runtime·sigtramp(SB) 320 321 TEXT runtime·mmap(SB),NOSPLIT,$20-32 322 MOVW addr+0(FP), R4 323 MOVW n+4(FP), R5 324 MOVW prot+8(FP), R6 325 MOVW flags+12(FP), R7 326 MOVW fd+16(FP), R8 327 MOVW off+20(FP), R9 328 MOVW R8, 16(R29) 329 MOVW R9, 20(R29) 330 331 MOVW $SYS_mmap, R2 332 SYSCALL 333 BEQ R7, ok 334 MOVW $0, p+24(FP) 335 MOVW R2, err+28(FP) 336 RET 337 ok: 338 MOVW R2, p+24(FP) 339 MOVW $0, err+28(FP) 340 RET 341 342 TEXT runtime·munmap(SB),NOSPLIT,$0-8 343 MOVW addr+0(FP), R4 344 MOVW n+4(FP), R5 345 MOVW $SYS_munmap, R2 346 SYSCALL 347 BEQ R7, 2(PC) 348 UNDEF // crash 349 RET 350 351 TEXT runtime·madvise(SB),NOSPLIT,$0-16 352 MOVW addr+0(FP), R4 353 MOVW n+4(FP), R5 354 MOVW flags+8(FP), R6 355 MOVW $SYS_madvise, R2 356 SYSCALL 357 MOVW R2, ret+12(FP) 358 RET 359 360 // int32 futex(int32 *uaddr, int32 op, int32 val, struct timespec *timeout, int32 *uaddr2, int32 val2); 361 TEXT runtime·futex(SB),NOSPLIT,$20-28 362 MOVW addr+0(FP), R4 363 MOVW op+4(FP), R5 364 MOVW val+8(FP), R6 365 MOVW ts+12(FP), R7 366 367 MOVW addr2+16(FP), R8 368 MOVW val3+20(FP), R9 369 370 MOVW R8, 16(R29) 371 MOVW R9, 20(R29) 372 373 MOVW $SYS_futex, R2 374 SYSCALL 375 BEQ R7, 2(PC) 376 SUBU R2, R0, R2 // caller expects negative errno 377 MOVW R2, ret+24(FP) 378 RET 379 380 381 // int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void)); 382 TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0-24 383 MOVW flags+0(FP), R4 384 MOVW stk+4(FP), R5 385 MOVW R0, R6 // ptid 386 MOVW R0, R7 // tls 387 388 // O32 syscall handler unconditionally copies arguments 5-8 from stack, 389 // even for syscalls with less than 8 arguments. Reserve 32 bytes of new 390 // stack so that any syscall invoked immediately in the new thread won't fail. 391 ADD $-32, R5 392 393 // Copy mp, gp, fn off parent stack for use by child. 394 MOVW mp+8(FP), R16 395 MOVW gp+12(FP), R17 396 MOVW fn+16(FP), R18 397 398 MOVW $1234, R1 399 400 MOVW R16, 0(R5) 401 MOVW R17, 4(R5) 402 MOVW R18, 8(R5) 403 404 MOVW R1, 12(R5) 405 406 MOVW $SYS_clone, R2 407 SYSCALL 408 BEQ R7, 2(PC) 409 SUBU R2, R0, R2 // caller expects negative errno 410 411 // In parent, return. 412 BEQ R2, 3(PC) 413 MOVW R2, ret+20(FP) 414 RET 415 416 // In child, on new stack. 417 // Check that SP is as we expect 418 NOP R29 // tell vet R29/SP changed - stop checking offsets 419 MOVW 12(R29), R16 420 MOVW $1234, R1 421 BEQ R16, R1, 2(PC) 422 MOVW (R0), R0 423 424 // Initialize m->procid to Linux tid 425 MOVW $SYS_gettid, R2 426 SYSCALL 427 428 MOVW 0(R29), R16 // m 429 MOVW 4(R29), R17 // g 430 MOVW 8(R29), R18 // fn 431 432 BEQ R16, nog 433 BEQ R17, nog 434 435 MOVW R2, m_procid(R16) 436 437 // In child, set up new stack 438 MOVW R16, g_m(R17) 439 MOVW R17, g 440 441 // TODO(mips32): doesn't have runtime·stackcheck(SB) 442 443 nog: 444 // Call fn 445 ADDU $32, R29 446 JAL (R18) 447 448 // It shouldn't return. If it does, exit that thread. 449 ADDU $-32, R29 450 MOVW $0xf4, R4 451 MOVW $SYS_exit, R2 452 SYSCALL 453 UNDEF 454 455 TEXT runtime·sigaltstack(SB),NOSPLIT,$0 456 MOVW new+0(FP), R4 457 MOVW old+4(FP), R5 458 MOVW $SYS_sigaltstack, R2 459 SYSCALL 460 BEQ R7, 2(PC) 461 UNDEF // crash 462 RET 463 464 TEXT runtime·osyield(SB),NOSPLIT,$0 465 MOVW $SYS_sched_yield, R2 466 SYSCALL 467 RET 468 469 TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0-16 470 MOVW pid+0(FP), R4 471 MOVW len+4(FP), R5 472 MOVW buf+8(FP), R6 473 MOVW $SYS_sched_getaffinity, R2 474 SYSCALL 475 BEQ R7, 2(PC) 476 SUBU R2, R0, R2 // caller expects negative errno 477 MOVW R2, ret+12(FP) 478 RET 479 480 // int32 runtime·epollcreate(int32 size); 481 TEXT runtime·epollcreate(SB),NOSPLIT,$0-8 482 MOVW size+0(FP), R4 483 MOVW $SYS_epoll_create, R2 484 SYSCALL 485 BEQ R7, 2(PC) 486 SUBU R2, R0, R2 // caller expects negative errno 487 MOVW R2, ret+4(FP) 488 RET 489 490 // int32 runtime·epollcreate1(int32 flags); 491 TEXT runtime·epollcreate1(SB),NOSPLIT,$0-8 492 MOVW flags+0(FP), R4 493 MOVW $SYS_epoll_create1, R2 494 SYSCALL 495 BEQ R7, 2(PC) 496 SUBU R2, R0, R2 // caller expects negative errno 497 MOVW R2, ret+4(FP) 498 RET 499 500 // func epollctl(epfd, op, fd int32, ev *epollEvent) int 501 TEXT runtime·epollctl(SB),NOSPLIT,$0-20 502 MOVW epfd+0(FP), R4 503 MOVW op+4(FP), R5 504 MOVW fd+8(FP), R6 505 MOVW ev+12(FP), R7 506 MOVW $SYS_epoll_ctl, R2 507 SYSCALL 508 SUBU R2, R0, R2 // caller expects negative errno 509 MOVW R2, ret+16(FP) 510 RET 511 512 // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout); 513 TEXT runtime·epollwait(SB),NOSPLIT,$0-20 514 MOVW epfd+0(FP), R4 515 MOVW ev+4(FP), R5 516 MOVW nev+8(FP), R6 517 MOVW timeout+12(FP), R7 518 MOVW $SYS_epoll_wait, R2 519 SYSCALL 520 BEQ R7, 2(PC) 521 SUBU R2, R0, R2 // caller expects negative errno 522 MOVW R2, ret+16(FP) 523 RET 524 525 // void runtime·closeonexec(int32 fd); 526 TEXT runtime·closeonexec(SB),NOSPLIT,$0-4 527 MOVW fd+0(FP), R4 // fd 528 MOVW $2, R5 // F_SETFD 529 MOVW $1, R6 // FD_CLOEXEC 530 MOVW $SYS_fcntl, R2 531 SYSCALL 532 RET 533 534 // func runtime·setNonblock(int32 fd) 535 TEXT runtime·setNonblock(SB),NOSPLIT,$0-4 536 MOVW fd+0(FP), R4 // fd 537 MOVW $3, R5 // F_GETFL 538 MOVW $0, R6 539 MOVW $SYS_fcntl, R2 540 SYSCALL 541 MOVW $0x80, R6 // O_NONBLOCK 542 OR R2, R6 543 MOVW fd+0(FP), R4 // fd 544 MOVW $4, R5 // F_SETFL 545 MOVW $SYS_fcntl, R2 546 SYSCALL 547 RET 548 549 // func sbrk0() uintptr 550 TEXT runtime·sbrk0(SB),NOSPLIT,$0-4 551 // Implemented as brk(NULL). 552 MOVW $0, R4 553 MOVW $SYS_brk, R2 554 SYSCALL 555 MOVW R2, ret+0(FP) 556 RET 557 558 TEXT runtime·access(SB),$0-12 559 BREAK // unimplemented, only needed for android; declared in stubs_linux.go 560 MOVW R0, ret+8(FP) // for vet 561 RET 562 563 TEXT runtime·connect(SB),$0-16 564 BREAK // unimplemented, only needed for android; declared in stubs_linux.go 565 MOVW R0, ret+12(FP) // for vet 566 RET 567 568 TEXT runtime·socket(SB),$0-16 569 BREAK // unimplemented, only needed for android; declared in stubs_linux.go 570 MOVW R0, ret+12(FP) // for vet 571 RET