1// Copyright 2016 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 && (mips || mipsle)67//8// System calls and other sys.stuff for mips, Linux9//1011#include "go_asm.h"12#include "go_tls.h"13#include "textflag.h"1415#define SYS_exit 400116#define SYS_read 400317#define SYS_write 400418#define SYS_open 400519#define SYS_close 400620#define SYS_getpid 402021#define SYS_kill 403722#define SYS_brk 404523#define SYS_mmap 409024#define SYS_munmap 409125#define SYS_setitimer 410426#define SYS_clone 412027#define SYS_sched_yield 416228#define SYS_nanosleep 416629#define SYS_rt_sigreturn 419330#define SYS_rt_sigaction 419431#define SYS_rt_sigprocmask 419532#define SYS_sigaltstack 420633#define SYS_madvise 421834#define SYS_mincore 421735#define SYS_gettid 422236#define SYS_futex 423837#define SYS_futex_time64 442238#define SYS_sched_getaffinity 424039#define SYS_exit_group 424640#define SYS_timer_create 425741#define SYS_timer_settime 425842#define SYS_timer_settime64 440943#define SYS_timer_delete 426144#define SYS_clock_gettime 426345#define SYS_tgkill 426646#define SYS_pipe2 43284748TEXT runtime·exit(SB),NOSPLIT,$0-449 MOVW code+0(FP), R450 MOVW $SYS_exit_group, R251 SYSCALL52 UNDEF53 RET5455// func exitThread(wait *atomic.Uint32)56TEXT runtime·exitThread(SB),NOSPLIT,$0-457 MOVW wait+0(FP), R158 // We're done using the stack.59 MOVW $0, R260 SYNC61 MOVW R2, (R1)62 SYNC63 MOVW $0, R4 // exit code64 MOVW $SYS_exit, R265 SYSCALL66 UNDEF67 JMP 0(PC)6869TEXT runtime·open(SB),NOSPLIT,$0-1670 MOVW name+0(FP), R471 MOVW mode+4(FP), R572 MOVW perm+8(FP), R673 MOVW $SYS_open, R274 SYSCALL75 BEQ R7, 2(PC)76 MOVW $-1, R277 MOVW R2, ret+12(FP)78 RET7980TEXT runtime·closefd(SB),NOSPLIT,$0-881 MOVW fd+0(FP), R482 MOVW $SYS_close, R283 SYSCALL84 BEQ R7, 2(PC)85 MOVW $-1, R286 MOVW R2, ret+4(FP)87 RET8889TEXT runtime·write1(SB),NOSPLIT,$0-1690 MOVW fd+0(FP), R491 MOVW p+4(FP), R592 MOVW n+8(FP), R693 MOVW $SYS_write, R294 SYSCALL95 BEQ R7, 2(PC)96 SUBU R2, R0, R2 // caller expects negative errno97 MOVW R2, ret+12(FP)98 RET99100TEXT runtime·read(SB),NOSPLIT,$0-16101 MOVW fd+0(FP), R4102 MOVW p+4(FP), R5103 MOVW n+8(FP), R6104 MOVW $SYS_read, R2105 SYSCALL106 BEQ R7, 2(PC)107 SUBU R2, R0, R2 // caller expects negative errno108 MOVW R2, ret+12(FP)109 RET110111// func pipe2(flags int32) (r, w int32, errno int32)112TEXT runtime·pipe2(SB),NOSPLIT,$0-16113 MOVW $r+4(FP), R4114 MOVW flags+0(FP), R5115 MOVW $SYS_pipe2, R2116 SYSCALL117 BEQ R7, 2(PC)118 SUBU R2, R0, R2 // caller expects negative errno119 MOVW R2, errno+12(FP)120 RET121122TEXT runtime·usleep(SB),NOSPLIT,$28-4123 MOVW usec+0(FP), R3124 MOVW R3, R5125 MOVW $1000000, R4126 DIVU R4, R3127 MOVW LO, R3128 MOVW R3, 24(R29)129 MOVW $1000, R4130 MULU R3, R4131 MOVW LO, R4132 SUBU R4, R5133 MOVW R5, 28(R29)134135 // nanosleep(&ts, 0)136 ADDU $24, R29, R4137 MOVW $0, R5138 MOVW $SYS_nanosleep, R2139 SYSCALL140 RET141142TEXT runtime·gettid(SB),NOSPLIT,$0-4143 MOVW $SYS_gettid, R2144 SYSCALL145 MOVW R2, ret+0(FP)146 RET147148TEXT runtime·raise(SB),NOSPLIT,$0-4149 MOVW $SYS_getpid, R2150 SYSCALL151 MOVW R2, R16152 MOVW $SYS_gettid, R2153 SYSCALL154 MOVW R2, R5 // arg 2 tid155 MOVW R16, R4 // arg 1 pid156 MOVW sig+0(FP), R6 // arg 3157 MOVW $SYS_tgkill, R2158 SYSCALL159 RET160161TEXT runtime·raiseproc(SB),NOSPLIT,$0162 MOVW $SYS_getpid, R2163 SYSCALL164 MOVW R2, R4 // arg 1 pid165 MOVW sig+0(FP), R5 // arg 2166 MOVW $SYS_kill, R2167 SYSCALL168 RET169170TEXT ·getpid(SB),NOSPLIT,$0-4171 MOVW $SYS_getpid, R2172 SYSCALL173 MOVW R2, ret+0(FP)174 RET175176TEXT ·tgkill(SB),NOSPLIT,$0-12177 MOVW tgid+0(FP), R4178 MOVW tid+4(FP), R5179 MOVW sig+8(FP), R6180 MOVW $SYS_tgkill, R2181 SYSCALL182 RET183184TEXT runtime·setitimer(SB),NOSPLIT,$0-12185 MOVW mode+0(FP), R4186 MOVW new+4(FP), R5187 MOVW old+8(FP), R6188 MOVW $SYS_setitimer, R2189 SYSCALL190 RET191192TEXT runtime·timer_create(SB),NOSPLIT,$0-16193 MOVW clockid+0(FP), R4194 MOVW sevp+4(FP), R5195 MOVW timerid+8(FP), R6196 MOVW $SYS_timer_create, R2197 SYSCALL198 MOVW R2, ret+12(FP)199 RET200201// Linux: kernel/time/posix-timer.c, requiring COMPAT_32BIT_TIME202TEXT runtime·timer_settime32(SB),NOSPLIT,$0-20203 MOVW timerid+0(FP), R4204 MOVW flags+4(FP), R5205 MOVW new+8(FP), R6206 MOVW old+12(FP), R7207 MOVW $SYS_timer_settime, R2208 SYSCALL209 MOVW R2, ret+16(FP)210 RET211212TEXT runtime·timer_settime64(SB),NOSPLIT,$0-20213 MOVW timerid+0(FP), R4214 MOVW flags+4(FP), R5215 MOVW new+8(FP), R6216 MOVW old+12(FP), R7217 MOVW $SYS_timer_settime64, R2218 SYSCALL219 MOVW R2, ret+16(FP)220 RET221222TEXT runtime·timer_delete(SB),NOSPLIT,$0-8223 MOVW timerid+0(FP), R4224 MOVW $SYS_timer_delete, R2225 SYSCALL226 MOVW R2, ret+4(FP)227 RET228229TEXT runtime·mincore(SB),NOSPLIT,$0-16230 MOVW addr+0(FP), R4231 MOVW n+4(FP), R5232 MOVW dst+8(FP), R6233 MOVW $SYS_mincore, R2234 SYSCALL235 SUBU R2, R0, R2 // caller expects negative errno236 MOVW R2, ret+12(FP)237 RET238239// func walltime() (sec int64, nsec int32)240TEXT runtime·walltime(SB),NOSPLIT,$8-12241 MOVW $0, R4 // CLOCK_REALTIME242 MOVW $4(R29), R5243 MOVW $SYS_clock_gettime, R2244 SYSCALL245 MOVW 4(R29), R3 // sec246 MOVW 8(R29), R5 // nsec247 MOVW $sec+0(FP), R6248#ifdef GOARCH_mips249 MOVW R3, 4(R6)250 MOVW R0, 0(R6)251#else252 MOVW R3, 0(R6)253 MOVW R0, 4(R6)254#endif255 MOVW R5, nsec+8(FP)256 RET257258TEXT runtime·nanotime1(SB),NOSPLIT,$8-8259 MOVW $1, R4 // CLOCK_MONOTONIC260 MOVW $4(R29), R5261 MOVW $SYS_clock_gettime, R2262 SYSCALL263 MOVW 4(R29), R3 // sec264 MOVW 8(R29), R5 // nsec265 // sec is in R3, nsec in R5266 // return nsec in R3267 MOVW $1000000000, R4268 MULU R4, R3269 MOVW LO, R3270 ADDU R5, R3271 SGTU R5, R3, R4272 MOVW $ret+0(FP), R6273#ifdef GOARCH_mips274 MOVW R3, 4(R6)275#else276 MOVW R3, 0(R6)277#endif278 MOVW HI, R3279 ADDU R4, R3280#ifdef GOARCH_mips281 MOVW R3, 0(R6)282#else283 MOVW R3, 4(R6)284#endif285 RET286287TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0-16288 MOVW how+0(FP), R4289 MOVW new+4(FP), R5290 MOVW old+8(FP), R6291 MOVW size+12(FP), R7292 MOVW $SYS_rt_sigprocmask, R2293 SYSCALL294 BEQ R7, 2(PC)295 UNDEF // crash296 RET297298TEXT runtime·rt_sigaction(SB),NOSPLIT,$0-20299 MOVW sig+0(FP), R4300 MOVW new+4(FP), R5301 MOVW old+8(FP), R6302 MOVW size+12(FP), R7303 MOVW $SYS_rt_sigaction, R2304 SYSCALL305 BEQ R7, 2(PC)306 SUBU R2, R0, R2 // caller expects negative errno307 MOVW R2, ret+16(FP)308 RET309310TEXT runtime·sigfwd(SB),NOSPLIT,$0-16311 MOVW sig+4(FP), R4312 MOVW info+8(FP), R5313 MOVW ctx+12(FP), R6314 MOVW fn+0(FP), R25315 MOVW R29, R22316 SUBU $16, R29317 AND $~7, R29 // shadow space for 4 args aligned to 8 bytes as per O32 ABI318 JAL (R25)319 MOVW R22, R29320 RET321322TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$104323 MOVW R16, 16(R29)324 MOVW R17, 20(R29)325 MOVW R18, 24(R29)326 MOVW R19, 28(R29)327 MOVW R20, 32(R29)328 MOVW R21, 36(R29)329 MOVW R22, 40(R29)330 MOVW R23, 44(R29)331 MOVW R28, 48(R29)332 MOVW g, 52(R29)333 #ifndef GOMIPS_softfloat334 MOVF F20, 56(R29)335 MOVF F21, 60(R29)336 MOVF F22, 64(R29)337 MOVF F23, 68(R29)338 MOVF F24, 72(R29)339 MOVF F25, 76(R29)340 MOVF F26, 80(R29)341 MOVF F27, 84(R29)342 MOVF F28, 88(R29)343 MOVF F29, 92(R29)344 MOVF F30, 96(R29)345 MOVF F31, 100(R29)346 #endif347348 // this might be called in external code context,349 // where g is not set.350 MOVB runtime·iscgo(SB), R1351 BEQ R1, 2(PC)352 JAL runtime·load_g(SB)353354 MOVW R4, 4(R29)355 MOVW R5, 8(R29)356 MOVW R6, 12(R29)357 MOVW $runtime·sigtrampgo(SB), R1358 JAL (R1)359360 MOVW 16(R29), R16361 MOVW 20(R29), R17362 MOVW 24(R29), R18363 MOVW 28(R29), R19364 MOVW 32(R29), R20365 MOVW 36(R29), R21366 MOVW 40(R29), R22367 MOVW 44(R29), R23368 MOVW 48(R29), R28369 MOVW 52(R29), g370 #ifndef GOMIPS_softfloat371 MOVF 56(R29), F20372 MOVF 60(R29), F21373 MOVF 64(R29), F22374 MOVF 68(R29), F23375 MOVF 72(R29), F24376 MOVF 76(R29), F25377 MOVF 80(R29), F26378 MOVF 84(R29), F27379 MOVF 88(R29), F28380 MOVF 92(R29), F29381 MOVF 96(R29), F30382 MOVF 100(R29), F31383 #endif384 RET385386TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0387 JMP runtime·sigtramp(SB)388389TEXT runtime·mmap(SB),NOSPLIT,$20-32390 MOVW addr+0(FP), R4391 MOVW n+4(FP), R5392 MOVW prot+8(FP), R6393 MOVW flags+12(FP), R7394 MOVW fd+16(FP), R8395 MOVW off+20(FP), R9396 MOVW R8, 16(R29)397 MOVW R9, 20(R29)398399 MOVW $SYS_mmap, R2400 SYSCALL401 BEQ R7, ok402 MOVW $0, p+24(FP)403 MOVW R2, err+28(FP)404 RET405ok:406 MOVW R2, p+24(FP)407 MOVW $0, err+28(FP)408 RET409410TEXT runtime·munmap(SB),NOSPLIT,$0-8411 MOVW addr+0(FP), R4412 MOVW n+4(FP), R5413 MOVW $SYS_munmap, R2414 SYSCALL415 BEQ R7, 2(PC)416 UNDEF // crash417 RET418419TEXT runtime·madvise(SB),NOSPLIT,$0-16420 MOVW addr+0(FP), R4421 MOVW n+4(FP), R5422 MOVW flags+8(FP), R6423 MOVW $SYS_madvise, R2424 SYSCALL425 MOVW R2, ret+12(FP)426 RET427428// Linux: kernel/futex/syscalls.c, requiring COMPAT_32BIT_TIME429// int32 futex(int32 *uaddr, int32 op, int32 val,430// struct old_timespec32 *timeout, int32 *uaddr2, int32 val2);431TEXT runtime·futex_time32(SB),NOSPLIT,$20-28432 MOVW addr+0(FP), R4433 MOVW op+4(FP), R5434 MOVW val+8(FP), R6435 MOVW ts+12(FP), R7436437 MOVW addr2+16(FP), R8438 MOVW val3+20(FP), R9439440 MOVW R8, 16(R29)441 MOVW R9, 20(R29)442443 MOVW $SYS_futex, R2444 SYSCALL445 BEQ R7, 2(PC)446 SUBU R2, R0, R2 // caller expects negative errno447 MOVW R2, ret+24(FP)448 RET449450// Linux: kernel/futex/syscalls.c451// int32 futex(int32 *uaddr, int32 op, int32 val,452// struct timespec *timeout, int32 *uaddr2, int32 val2);453TEXT runtime·futex_time64(SB),NOSPLIT,$20-28454 MOVW addr+0(FP), R4455 MOVW op+4(FP), R5456 MOVW val+8(FP), R6457 MOVW ts+12(FP), R7458459 MOVW addr2+16(FP), R8460 MOVW val3+20(FP), R9461462 MOVW R8, 16(R29)463 MOVW R9, 20(R29)464465 MOVW $SYS_futex_time64, R2466 SYSCALL467 BEQ R7, 2(PC)468 SUBU R2, R0, R2 // caller expects negative errno469 MOVW R2, ret+24(FP)470 RET471472// int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));473TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0-24474 MOVW flags+0(FP), R4475 MOVW stk+4(FP), R5476 MOVW R0, R6 // ptid477 MOVW R0, R7 // tls478479 // O32 syscall handler unconditionally copies arguments 5-8 from stack,480 // even for syscalls with less than 8 arguments. Reserve 32 bytes of new481 // stack so that any syscall invoked immediately in the new thread won't fail.482 ADD $-32, R5483484 // Copy mp, gp, fn off parent stack for use by child.485 MOVW mp+8(FP), R16486 MOVW gp+12(FP), R17487 MOVW fn+16(FP), R18488489 MOVW $1234, R1490491 MOVW R16, 0(R5)492 MOVW R17, 4(R5)493 MOVW R18, 8(R5)494495 MOVW R1, 12(R5)496497 MOVW $SYS_clone, R2498 SYSCALL499 BEQ R7, 2(PC)500 SUBU R2, R0, R2 // caller expects negative errno501502 // In parent, return.503 BEQ R2, 3(PC)504 MOVW R2, ret+20(FP)505 RET506507 // In child, on new stack.508 // Check that SP is as we expect509 NOP R29 // tell vet R29/SP changed - stop checking offsets510 MOVW 12(R29), R16511 MOVW $1234, R1512 BEQ R16, R1, 2(PC)513 MOVW (R0), R0514515 // Initialize m->procid to Linux tid516 MOVW $SYS_gettid, R2517 SYSCALL518519 MOVW 0(R29), R16 // m520 MOVW 4(R29), R17 // g521 MOVW 8(R29), R18 // fn522523 BEQ R16, nog524 BEQ R17, nog525526 MOVW R2, m_procid(R16)527528 // In child, set up new stack529 MOVW R16, g_m(R17)530 MOVW R17, g531532// TODO(mips32): doesn't have runtime·stackcheck(SB)533534nog:535 // Call fn536 ADDU $32, R29537 JAL (R18)538539 // It shouldn't return. If it does, exit that thread.540 ADDU $-32, R29541 MOVW $0xf4, R4542 MOVW $SYS_exit, R2543 SYSCALL544 UNDEF545546TEXT runtime·sigaltstack(SB),NOSPLIT,$0547 MOVW new+0(FP), R4548 MOVW old+4(FP), R5549 MOVW $SYS_sigaltstack, R2550 SYSCALL551 BEQ R7, 2(PC)552 UNDEF // crash553 RET554555TEXT runtime·osyield(SB),NOSPLIT,$0556 MOVW $SYS_sched_yield, R2557 SYSCALL558 RET559560TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0-16561 MOVW pid+0(FP), R4562 MOVW len+4(FP), R5563 MOVW buf+8(FP), R6564 MOVW $SYS_sched_getaffinity, R2565 SYSCALL566 BEQ R7, 2(PC)567 SUBU R2, R0, R2 // caller expects negative errno568 MOVW R2, ret+12(FP)569 RET570571// func sbrk0() uintptr572TEXT runtime·sbrk0(SB),NOSPLIT,$0-4573 // Implemented as brk(NULL).574 MOVW $0, R4575 MOVW $SYS_brk, R2576 SYSCALL577 MOVW R2, ret+0(FP)578 RET579580TEXT runtime·access(SB),$0-12581 BREAK // unimplemented, only needed for android; declared in stubs_linux.go582 MOVW R0, ret+8(FP) // for vet583 RET584585TEXT runtime·connect(SB),$0-16586 BREAK // unimplemented, only needed for android; declared in stubs_linux.go587 MOVW R0, ret+12(FP) // for vet588 RET589590TEXT runtime·socket(SB),$0-16591 BREAK // unimplemented, only needed for android; declared in stubs_linux.go592 MOVW R0, ret+12(FP) // for vet593 RET
Findings
✓ No findings reported for this file.