1// Copyright 2015 The Go Authors. All rights reserved.2// Use of this source code is governed by a BSD-style3// license that can be found in the LICENSE file.45//go:build linux && (mips64 || mips64le)67//8// System calls and other sys.stuff for mips64, Linux9//1011#include "go_asm.h"12#include "go_tls.h"13#include "textflag.h"1415#define AT_FDCWD -1001617#define SYS_exit 505818#define SYS_read 500019#define SYS_write 500120#define SYS_close 500321#define SYS_getpid 503822#define SYS_kill 506023#define SYS_mmap 500924#define SYS_munmap 501125#define SYS_setitimer 503626#define SYS_clone 505527#define SYS_nanosleep 503428#define SYS_sched_yield 502329#define SYS_rt_sigreturn 521130#define SYS_rt_sigaction 501331#define SYS_rt_sigprocmask 501432#define SYS_sigaltstack 512933#define SYS_madvise 502734#define SYS_mincore 502635#define SYS_gettid 517836#define SYS_futex 519437#define SYS_sched_getaffinity 519638#define SYS_exit_group 520539#define SYS_timer_create 521640#define SYS_timer_settime 521741#define SYS_timer_delete 522042#define SYS_tgkill 522543#define SYS_openat 524744#define SYS_clock_gettime 522245#define SYS_brk 501246#define SYS_pipe2 52874748TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-449 MOVW code+0(FP), R450 MOVV $SYS_exit_group, R251 SYSCALL52 RET5354// func exitThread(wait *atomic.Uint32)55TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-856 MOVV wait+0(FP), R157 // We're done using the stack.58 MOVW $0, R259 SYNC60 MOVW R2, (R1)61 SYNC62 MOVW $0, R4 // exit code63 MOVV $SYS_exit, R264 SYSCALL65 JMP 0(PC)6667TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-2068 // This uses openat instead of open, because Android O blocks open.69 MOVW $AT_FDCWD, R4 // AT_FDCWD, so this acts like open70 MOVV name+0(FP), R571 MOVW mode+8(FP), R672 MOVW perm+12(FP), R773 MOVV $SYS_openat, R274 SYSCALL75 BEQ R7, 2(PC)76 MOVW $-1, R277 MOVW R2, ret+16(FP)78 RET7980TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-1281 MOVW fd+0(FP), R482 MOVV $SYS_close, R283 SYSCALL84 BEQ R7, 2(PC)85 MOVW $-1, R286 MOVW R2, ret+8(FP)87 RET8889TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-2890 MOVV fd+0(FP), R491 MOVV p+8(FP), R592 MOVW n+16(FP), R693 MOVV $SYS_write, R294 SYSCALL95 BEQ R7, 2(PC)96 SUBVU R2, R0, R2 // caller expects negative errno97 MOVW R2, ret+24(FP)98 RET99100TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28101 MOVW fd+0(FP), R4102 MOVV p+8(FP), R5103 MOVW n+16(FP), R6104 MOVV $SYS_read, R2105 SYSCALL106 BEQ R7, 2(PC)107 SUBVU R2, R0, R2 // caller expects negative errno108 MOVW R2, ret+24(FP)109 RET110111// func pipe2(flags int32) (r, w int32, errno int32)112TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20113 MOVV $r+8(FP), R4114 MOVW flags+0(FP), R5115 MOVV $SYS_pipe2, R2116 SYSCALL117 BEQ R7, 2(PC)118 SUBVU R2, R0, R2 // caller expects negative errno119 MOVW R2, errno+16(FP)120 RET121122TEXT runtime·usleep(SB),NOSPLIT,$16-4123 MOVWU usec+0(FP), R3124 MOVV R3, R5125 MOVW $1000000, R4126 DIVVU R4, R3127 MOVV LO, R3128 MOVV R3, 8(R29)129 MOVW $1000, R4130 MULVU R3, R4131 MOVV LO, R4132 SUBVU R4, R5133 MOVV R5, 16(R29)134135 // nanosleep(&ts, 0)136 ADDV $8, R29, R4137 MOVW $0, R5138 MOVV $SYS_nanosleep, R2139 SYSCALL140 RET141142TEXT runtime·gettid(SB),NOSPLIT,$0-4143 MOVV $SYS_gettid, R2144 SYSCALL145 MOVW R2, ret+0(FP)146 RET147148TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0149 MOVV $SYS_getpid, R2150 SYSCALL151 MOVW R2, R16152 MOVV $SYS_gettid, R2153 SYSCALL154 MOVW R2, R5 // arg 2 tid155 MOVW R16, R4 // arg 1 pid156 MOVW sig+0(FP), R6 // arg 3157 MOVV $SYS_tgkill, R2158 SYSCALL159 RET160161TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0162 MOVV $SYS_getpid, R2163 SYSCALL164 MOVW R2, R4 // arg 1 pid165 MOVW sig+0(FP), R5 // arg 2166 MOVV $SYS_kill, R2167 SYSCALL168 RET169170TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8171 MOVV $SYS_getpid, R2172 SYSCALL173 MOVV R2, ret+0(FP)174 RET175176TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24177 MOVV tgid+0(FP), R4178 MOVV tid+8(FP), R5179 MOVV sig+16(FP), R6180 MOVV $SYS_tgkill, R2181 SYSCALL182 RET183184TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24185 MOVW mode+0(FP), R4186 MOVV new+8(FP), R5187 MOVV old+16(FP), R6188 MOVV $SYS_setitimer, R2189 SYSCALL190 RET191192TEXT runtime·timer_create(SB),NOSPLIT,$0-28193 MOVW clockid+0(FP), R4194 MOVV sevp+8(FP), R5195 MOVV timerid+16(FP), R6196 MOVV $SYS_timer_create, R2197 SYSCALL198 MOVW R2, ret+24(FP)199 RET200201TEXT runtime·timer_settime(SB),NOSPLIT,$0-28202 MOVW timerid+0(FP), R4203 MOVW flags+4(FP), R5204 MOVV new+8(FP), R6205 MOVV old+16(FP), R7206 MOVV $SYS_timer_settime, R2207 SYSCALL208 MOVW R2, ret+24(FP)209 RET210211TEXT runtime·timer_delete(SB),NOSPLIT,$0-12212 MOVW timerid+0(FP), R4213 MOVV $SYS_timer_delete, R2214 SYSCALL215 MOVW R2, ret+8(FP)216 RET217218TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28219 MOVV addr+0(FP), R4220 MOVV n+8(FP), R5221 MOVV dst+16(FP), R6222 MOVV $SYS_mincore, R2223 SYSCALL224 SUBVU R2, R0, R2 // caller expects negative errno225 MOVW R2, ret+24(FP)226 RET227228// func walltime() (sec int64, nsec int32)229TEXT runtime·walltime(SB),NOSPLIT,$16-12230 MOVV R29, R16 // R16 is unchanged by C code231 MOVV R29, R1232233 MOVV g_m(g), R17 // R17 = m234235 // Set vdsoPC and vdsoSP for SIGPROF traceback.236 // Save the old values on stack and restore them on exit,237 // so this function is reentrant.238 MOVV m_vdsoPC(R17), R2239 MOVV m_vdsoSP(R17), R3240 MOVV R2, 8(R29)241 MOVV R3, 16(R29)242243 MOVV $ret-8(FP), R2 // caller's SP244 MOVV R31, m_vdsoPC(R17)245 MOVV R2, m_vdsoSP(R17)246247 MOVV m_curg(R17), R4248 MOVV g, R5249 BNE R4, R5, noswitch250251 MOVV m_g0(R17), R4252 MOVV (g_sched+gobuf_sp)(R4), R1 // Set SP to g0 stack253254noswitch:255 SUBV $16, R1256 AND $~15, R1 // Align for C code257 MOVV R1, R29258259 MOVW $0, R4 // CLOCK_REALTIME260 MOVV $0(R29), R5261262 MOVV runtime·vdsoClockgettimeSym(SB), R25263 BEQ R25, fallback264265 JAL (R25)266 // check on vdso call return for kernel compatibility267 // see https://golang.org/issues/39046268 // if we get any error make fallback permanent.269 BEQ R2, R0, finish270 MOVV R0, runtime·vdsoClockgettimeSym(SB)271 MOVW $0, R4 // CLOCK_REALTIME272 MOVV $0(R29), R5273 JMP fallback274275finish:276 MOVV 0(R29), R3 // sec277 MOVV 8(R29), R5 // nsec278279 MOVV R16, R29 // restore SP280 // Restore vdsoPC, vdsoSP281 // We don't worry about being signaled between the two stores.282 // If we are not in a signal handler, we'll restore vdsoSP to 0,283 // and no one will care about vdsoPC. If we are in a signal handler,284 // we cannot receive another signal.285 MOVV 16(R29), R1286 MOVV R1, m_vdsoSP(R17)287 MOVV 8(R29), R1288 MOVV R1, m_vdsoPC(R17)289290 MOVV R3, sec+0(FP)291 MOVW R5, nsec+8(FP)292 RET293294fallback:295 MOVV $SYS_clock_gettime, R2296 SYSCALL297 JMP finish298299TEXT runtime·nanotime1(SB),NOSPLIT,$16-8300 MOVV R29, R16 // R16 is unchanged by C code301 MOVV R29, R1302303 MOVV g_m(g), R17 // R17 = m304305 // Set vdsoPC and vdsoSP for SIGPROF traceback.306 // Save the old values on stack and restore them on exit,307 // so this function is reentrant.308 MOVV m_vdsoPC(R17), R2309 MOVV m_vdsoSP(R17), R3310 MOVV R2, 8(R29)311 MOVV R3, 16(R29)312313 MOVV $ret-8(FP), R2 // caller's SP314 MOVV R31, m_vdsoPC(R17)315 MOVV R2, m_vdsoSP(R17)316317 MOVV m_curg(R17), R4318 MOVV g, R5319 BNE R4, R5, noswitch320321 MOVV m_g0(R17), R4322 MOVV (g_sched+gobuf_sp)(R4), R1 // Set SP to g0 stack323324noswitch:325 SUBV $16, R1326 AND $~15, R1 // Align for C code327 MOVV R1, R29328329 MOVW $1, R4 // CLOCK_MONOTONIC330 MOVV $0(R29), R5331332 MOVV runtime·vdsoClockgettimeSym(SB), R25333 BEQ R25, fallback334335 JAL (R25)336 // see walltime for detail337 BEQ R2, R0, finish338 MOVV R0, runtime·vdsoClockgettimeSym(SB)339 MOVW $1, R4 // CLOCK_MONOTONIC340 MOVV $0(R29), R5341 JMP fallback342343finish:344 MOVV 0(R29), R3 // sec345 MOVV 8(R29), R5 // nsec346347 MOVV R16, R29 // restore SP348 // Restore vdsoPC, vdsoSP349 // We don't worry about being signaled between the two stores.350 // If we are not in a signal handler, we'll restore vdsoSP to 0,351 // and no one will care about vdsoPC. If we are in a signal handler,352 // we cannot receive another signal.353 MOVV 16(R29), R1354 MOVV R1, m_vdsoSP(R17)355 MOVV 8(R29), R1356 MOVV R1, m_vdsoPC(R17)357358 // sec is in R3, nsec in R5359 // return nsec in R3360 MOVV $1000000000, R4361 MULVU R4, R3362 MOVV LO, R3363 ADDVU R5, R3364 MOVV R3, ret+0(FP)365 RET366367fallback:368 MOVV $SYS_clock_gettime, R2369 SYSCALL370 JMP finish371372TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28373 MOVW how+0(FP), R4374 MOVV new+8(FP), R5375 MOVV old+16(FP), R6376 MOVW size+24(FP), R7377 MOVV $SYS_rt_sigprocmask, R2378 SYSCALL379 BEQ R7, 2(PC)380 MOVV R0, 0xf1(R0) // crash381 RET382383TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36384 MOVV sig+0(FP), R4385 MOVV new+8(FP), R5386 MOVV old+16(FP), R6387 MOVV size+24(FP), R7388 MOVV $SYS_rt_sigaction, R2389 SYSCALL390 BEQ R7, 2(PC)391 SUBVU R2, R0, R2 // caller expects negative errno392 MOVW R2, ret+32(FP)393 RET394395TEXT runtime·sigfwd(SB),NOSPLIT,$0-32396 MOVW sig+8(FP), R4397 MOVV info+16(FP), R5398 MOVV ctx+24(FP), R6399 MOVV fn+0(FP), R25400 JAL (R25)401 RET402403TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$176404 MOVV R16, 32(R29)405 MOVV R17, 40(R29)406 MOVV R18, 48(R29)407 MOVV R19, 56(R29)408 MOVV R20, 64(R29)409 MOVV R21, 72(R29)410 MOVV R22, 80(R29)411 MOVV R23, 88(R29)412 MOVV RSB, 96(R29)413 MOVV g, 104(R29)414 #ifndef GOMIPS64_softfloat415 MOVD F24, 112(R29)416 MOVD F25, 120(R29)417 MOVD F26, 128(R29)418 MOVD F27, 136(R29)419 MOVD F28, 144(R29)420 MOVD F29, 152(R29)421 MOVD F30, 160(R29)422 MOVD F31, 168(R29)423 #endif424425 // initialize REGSB = PC&0xffffffff00000000426 BGEZAL R0, 1(PC)427 SRLV $32, R31, RSB428 SLLV $32, RSB429430 // this might be called in external code context,431 // where g is not set.432 MOVB runtime·iscgo(SB), R1433 BEQ R1, 2(PC)434 JAL runtime·load_g(SB)435436 MOVW R4, 8(R29)437 MOVV R5, 16(R29)438 MOVV R6, 24(R29)439 MOVV $runtime·sigtrampgo(SB), R1440 JAL (R1)441442 MOVV 32(R29), R16443 MOVV 40(R29), R17444 MOVV 48(R29), R18445 MOVV 56(R29), R19446 MOVV 64(R29), R20447 MOVV 72(R29), R21448 MOVV 80(R29), R22449 MOVV 88(R29), R23450 MOVV 96(R29), RSB451 MOVV 104(R29), g452 #ifndef GOMIPS64_softfloat453 MOVD 112(R29), F24454 MOVD 120(R29), F25455 MOVD 128(R29), F26456 MOVD 136(R29), F27457 MOVD 144(R29), F28458 MOVD 152(R29), F29459 MOVD 160(R29), F30460 MOVD 168(R29), F31461 #endif462 RET463464TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0465 JMP runtime·sigtramp(SB)466467TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0468 MOVV addr+0(FP), R4469 MOVV n+8(FP), R5470 MOVW prot+16(FP), R6471 MOVW flags+20(FP), R7472 MOVW fd+24(FP), R8473 MOVW off+28(FP), R9474475 MOVV $SYS_mmap, R2476 SYSCALL477 BEQ R7, ok478 MOVV $0, p+32(FP)479 MOVV R2, err+40(FP)480 RET481ok:482 MOVV R2, p+32(FP)483 MOVV $0, err+40(FP)484 RET485486TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0487 MOVV addr+0(FP), R4488 MOVV n+8(FP), R5489 MOVV $SYS_munmap, R2490 SYSCALL491 BEQ R7, 2(PC)492 MOVV R0, 0xf3(R0) // crash493 RET494495TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0496 MOVV addr+0(FP), R4497 MOVV n+8(FP), R5498 MOVW flags+16(FP), R6499 MOVV $SYS_madvise, R2500 SYSCALL501 MOVW R2, ret+24(FP)502 RET503504// int64 futex(int32 *uaddr, int32 op, int32 val,505// struct timespec *timeout, int32 *uaddr2, int32 val2);506TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0507 MOVV addr+0(FP), R4508 MOVW op+8(FP), R5509 MOVW val+12(FP), R6510 MOVV ts+16(FP), R7511 MOVV addr2+24(FP), R8512 MOVW val3+32(FP), R9513 MOVV $SYS_futex, R2514 SYSCALL515 BEQ R7, 2(PC)516 SUBVU R2, R0, R2 // caller expects negative errno517 MOVW R2, ret+40(FP)518 RET519520// int64 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));521TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0522 MOVW flags+0(FP), R4523 MOVV stk+8(FP), R5524525 // Copy mp, gp, fn off parent stack for use by child.526 // Careful: Linux system call clobbers ???.527 MOVV mp+16(FP), R16528 MOVV gp+24(FP), R17529 MOVV fn+32(FP), R18530531 MOVV R16, -8(R5)532 MOVV R17, -16(R5)533 MOVV R18, -24(R5)534 MOVV $1234, R16535 MOVV R16, -32(R5)536537 MOVV $SYS_clone, R2538 SYSCALL539 BEQ R7, 2(PC)540 SUBVU R2, R0, R2 // caller expects negative errno541542 // In parent, return.543 BEQ R2, 3(PC)544 MOVW R2, ret+40(FP)545 RET546547 // In child, on new stack.548 MOVV -32(R29), R16549 MOVV $1234, R1550 BEQ R16, R1, 2(PC)551 MOVV R0, 0(R0)552553 // Initialize m->procid to Linux tid554 MOVV $SYS_gettid, R2555 SYSCALL556557 MOVV -24(R29), R18 // fn558 MOVV -16(R29), R17 // g559 MOVV -8(R29), R16 // m560561 BEQ R16, nog562 BEQ R17, nog563564 MOVV R2, m_procid(R16)565566 // TODO: setup TLS.567568 // In child, set up new stack569 MOVV R16, g_m(R17)570 MOVV R17, g571 //CALL runtime·stackcheck(SB)572573nog:574 // Call fn575 JAL (R18)576577 // It shouldn't return. If it does, exit that thread.578 MOVW $111, R4579 MOVV $SYS_exit, R2580 SYSCALL581 JMP -3(PC) // keep exiting582583TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0584 MOVV new+0(FP), R4585 MOVV old+8(FP), R5586 MOVV $SYS_sigaltstack, R2587 SYSCALL588 BEQ R7, 2(PC)589 MOVV R0, 0xf1(R0) // crash590 RET591592TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0593 MOVV $SYS_sched_yield, R2594 SYSCALL595 RET596597TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0598 MOVV pid+0(FP), R4599 MOVV len+8(FP), R5600 MOVV buf+16(FP), R6601 MOVV $SYS_sched_getaffinity, R2602 SYSCALL603 BEQ R7, 2(PC)604 SUBVU R2, R0, R2 // caller expects negative errno605 MOVW R2, ret+24(FP)606 RET607608// func sbrk0() uintptr609TEXT runtime·sbrk0(SB),NOSPLIT|NOFRAME,$0-8610 // Implemented as brk(NULL).611 MOVV $0, R4612 MOVV $SYS_brk, R2613 SYSCALL614 MOVV R2, ret+0(FP)615 RET616617TEXT runtime·access(SB),$0-20618 MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go619 MOVW R0, ret+16(FP) // for vet620 RET621622TEXT runtime·connect(SB),$0-28623 MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go624 MOVW R0, ret+24(FP) // for vet625 RET626627TEXT runtime·socket(SB),$0-20628 MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go629 MOVW R0, ret+16(FP) // for vet630 RET
Findings
✓ No findings reported for this file.