Commit 424738e4 authored by Yao Zhang's avatar Yao Zhang Committed by Minux Ma

runtime: added assembly part of linux/mips64{,le} support

Change-Id: I9e94027ef66c88007107de2b2b75c3d7cf1352af
Reviewed-on: https://go-review.googlesource.com/14467Reviewed-by: 's avatarMinux Ma <minux@golang.org>
parent b4501ac4
This diff is collapsed.
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build mips64 mips64le
#include "textflag.h"
#define SYNC WORD $0xf
TEXT ·publicationBarrier(SB),NOSPLIT,$-8-0
SYNC
RET
// AUTO-GENERATED by mkduff.go
// Run go generate from src/runtime to update.
// See mkduff.go for comments.
// +build mips64 mips64le
#include "textflag.h"
TEXT runtime·duffzero(SB), NOSPLIT, $-8-0
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
MOVV R0, 8(R1)
ADDV $8, R1
RET
// TODO: Implement runtime·duffcopy.
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build mips64 mips64le
#include "textflag.h"
// void runtime·memclr(void*, uintptr)
TEXT runtime·memclr(SB),NOSPLIT,$0-16
MOVV ptr+0(FP), R1
MOVV n+8(FP), R2
ADDV R1, R2, R4
// if less than 8 bytes, do one byte at a time
SGTU $8, R2, R3
BNE R3, out
// do one byte at a time until 8-aligned
AND $7, R1, R3
BEQ R3, words
MOVB R0, (R1)
ADDV $1, R1
JMP -4(PC)
words:
// do 8 bytes at a time if there is room
ADDV $-7, R4, R2
SGTU R2, R1, R3
BEQ R3, out
MOVV R0, (R1)
ADDV $8, R1
JMP -4(PC)
out:
BEQ R1, R4, done
MOVB R0, (R1)
ADDV $1, R1
JMP -3(PC)
done:
RET
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build mips64 mips64le
#include "textflag.h"
// void runtime·memmove(void*, void*, uintptr)
TEXT runtime·memmove(SB), NOSPLIT, $-8-24
MOVV to+0(FP), R1
MOVV from+8(FP), R2
MOVV n+16(FP), R3
BNE R3, check
RET
check:
SGTU R1, R2, R4
BNE R4, backward
ADDV R1, R3, R6 // end pointer
// if the two pointers are not of same alignments, do byte copying
SUBVU R2, R1, R4
AND $7, R4
BNE R4, out
// if less than 8 bytes, do byte copying
SGTU $8, R3, R4
BNE R4, out
// do one byte at a time until 8-aligned
AND $7, R1, R5
BEQ R5, words
MOVB (R2), R4
ADDV $1, R2
MOVB R4, (R1)
ADDV $1, R1
JMP -6(PC)
words:
// do 8 bytes at a time if there is room
ADDV $-7, R6, R3 // R3 is end pointer-7
SGTU R3, R1, R5
BEQ R5, out
MOVV (R2), R4
ADDV $8, R2
MOVV R4, (R1)
ADDV $8, R1
JMP -6(PC)
out:
BEQ R1, R6, done
MOVB (R2), R4
ADDV $1, R2
MOVB R4, (R1)
ADDV $1, R1
JMP -5(PC)
done:
RET
backward:
ADDV R3, R2 // from-end pointer
ADDV R1, R3, R6 // to-end pointer
// if the two pointers are not of same alignments, do byte copying
SUBVU R6, R2, R4
AND $7, R4
BNE R4, out1
// if less than 8 bytes, do byte copying
SGTU $8, R3, R4
BNE R4, out1
// do one byte at a time until 8-aligned
AND $7, R6, R5
BEQ R5, words1
ADDV $-1, R2
MOVB (R2), R4
ADDV $-1, R6
MOVB R4, (R6)
JMP -6(PC)
words1:
// do 8 bytes at a time if there is room
ADDV $7, R1, R3 // R3 is start pointer+7
SGTU R6, R3, R5
BEQ R5, out1
ADDV $-8, R2
MOVV (R2), R4
ADDV $-8, R6
MOVV R4, (R6)
JMP -6(PC)
out1:
BEQ R1, R6, done1
ADDV $-1, R2
MOVB (R2), R4
ADDV $-1, R6
MOVB R4, (R6)
JMP -5(PC)
done1:
RET
......@@ -37,6 +37,7 @@ func main() {
gen("arm", notags, zeroARM, copyARM)
gen("arm64", notags, zeroARM64, copyARM64)
gen("ppc64x", tagsPPC64x, zeroPPC64x, copyPPC64x)
gen("mips64x", tagsMIPS64x, zeroMIPS64x, copyMIPS64x)
}
func gen(arch string, tags, zero, copy func(io.Writer)) {
......@@ -183,3 +184,25 @@ func zeroPPC64x(w io.Writer) {
func copyPPC64x(w io.Writer) {
fmt.Fprintln(w, "// TODO: Implement runtime·duffcopy.")
}
func tagsMIPS64x(w io.Writer) {
fmt.Fprintln(w)
fmt.Fprintln(w, "// +build mips64 mips64le")
fmt.Fprintln(w)
}
func zeroMIPS64x(w io.Writer) {
// R0: always zero
// R1 (aka REGRT1): ptr to memory to be zeroed - 8
// On return, R1 points to the last zeroed dword.
fmt.Fprintln(w, "TEXT runtime·duffzero(SB), NOSPLIT, $-8-0")
for i := 0; i < 128; i++ {
fmt.Fprintln(w, "\tMOVV\tR0, 8(R1)")
fmt.Fprintln(w, "\tADDV\t$8, R1")
}
fmt.Fprintln(w, "\tRET")
}
func copyMIPS64x(w io.Writer) {
fmt.Fprintln(w, "// TODO: Implement runtime·duffcopy.")
}
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build linux
// +build mips64 mips64le
#include "textflag.h"
TEXT _rt0_mips64_linux(SB),NOSPLIT,$0
JMP _main<>(SB)
TEXT _rt0_mips64le_linux(SB),NOSPLIT,$0
JMP _main<>(SB)
TEXT _main<>(SB),NOSPLIT,$-8
// In a statically linked binary, the stack contains argc,
// argv as argc string pointers followed by a NULL, envv as a
// sequence of string pointers followed by a NULL, and auxv.
// There is no TLS base pointer.
#ifdef GOARCH_mips64
MOVW 4(R29), R1 // argc, big-endian ABI places int32 at offset 4
#else
MOVW 0(R29), R1 // argc
#endif
ADDV $8, R29, R2 // argv
JMP main(SB)
TEXT main(SB),NOSPLIT,$-8
MOVV $runtime·rt0_go(SB), R4
JMP (R4)
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build linux
// +build mips64 mips64le
//
// System calls and other sys.stuff for mips64, Linux
//
#include "go_asm.h"
#include "go_tls.h"
#include "textflag.h"
#define SYS_exit 5058
#define SYS_read 5000
#define SYS_write 5001
#define SYS_open 5002
#define SYS_close 5003
#define SYS_getpid 5038
#define SYS_kill 5060
#define SYS_fcntl 5080
#define SYS_gettimeofday 5094
#define SYS_mmap 5009
#define SYS_munmap 5011
#define SYS_setitimer 5036
#define SYS_clone 5055
#define SYS_newselect 5022
#define SYS_sched_yield 5023
#define SYS_rt_sigreturn 5211
#define SYS_rt_sigaction 5013
#define SYS_rt_sigprocmask 5014
#define SYS_sigaltstack 5129
#define SYS_getrlimit 5095
#define SYS_madvise 5027
#define SYS_mincore 5026
#define SYS_gettid 5178
#define SYS_tkill 5192
#define SYS_futex 5194
#define SYS_sched_getaffinity 5196
#define SYS_exit_group 5205
#define SYS_epoll_create 5207
#define SYS_epoll_ctl 5208
#define SYS_epoll_wait 5209
#define SYS_clock_gettime 5222
#define SYS_epoll_create1 5285
TEXT runtime·exit(SB),NOSPLIT,$-8-4
MOVW code+0(FP), R4
MOVV $SYS_exit_group, R2
SYSCALL
RET
TEXT runtime·exit1(SB),NOSPLIT,$-8-4
MOVW code+0(FP), R4
MOVV $SYS_exit, R2
SYSCALL
RET
TEXT runtime·open(SB),NOSPLIT,$-8-20
MOVV name+0(FP), R4
MOVW mode+8(FP), R5
MOVW perm+12(FP), R6
MOVV $SYS_open, R2
SYSCALL
BEQ R7, 2(PC)
MOVW $-1, R2
MOVW R2, ret+16(FP)
RET
TEXT runtime·closefd(SB),NOSPLIT,$-8-12
MOVW fd+0(FP), R4
MOVV $SYS_close, R2
SYSCALL
BEQ R7, 2(PC)
MOVW $-1, R2
MOVW R2, ret+8(FP)
RET
TEXT runtime·write(SB),NOSPLIT,$-8-28
MOVV fd+0(FP), R4
MOVV p+8(FP), R5
MOVW n+16(FP), R6
MOVV $SYS_write, R2
SYSCALL
BEQ R7, 2(PC)
MOVW $-1, R2
MOVW R2, ret+24(FP)
RET
TEXT runtime·read(SB),NOSPLIT,$-8-28
MOVW fd+0(FP), R4
MOVV p+8(FP), R5
MOVW n+16(FP), R6
MOVV $SYS_read, R2
SYSCALL
BEQ R7, 2(PC)
MOVW $-1, R2
MOVW R2, ret+24(FP)
RET
TEXT runtime·getrlimit(SB),NOSPLIT,$-8-20
MOVW kind+0(FP), R4 // _RLIMIT_AS = 6 on linux/mips
MOVV limit+8(FP), R5
MOVV $SYS_getrlimit, R2
SYSCALL
MOVW R2, ret+16(FP)
RET
TEXT runtime·usleep(SB),NOSPLIT,$16-4
MOVWU usec+0(FP), R3
MOVV R3, R5
MOVW $1000000, R4
DIVVU R4, R3
MOVV LO, R3
MOVV R3, 8(R29)
MULVU R3, R4
MOVV LO, R4
SUBVU R4, R5
MOVV R5, 16(R29)
// select(0, 0, 0, 0, &tv)
MOVW $0, R4
MOVW $0, R5
MOVW $0, R6
MOVW $0, R7
ADDV $8, R29, R8
MOVV $SYS_newselect, R2
SYSCALL
RET
TEXT runtime·gettid(SB),NOSPLIT,$0-4
MOVV $SYS_gettid, R2
SYSCALL
MOVW R2, ret+0(FP)
RET
TEXT runtime·raise(SB),NOSPLIT,$-8
MOVV $SYS_gettid, R2
SYSCALL
MOVW R2, R4 // arg 1 tid
MOVW sig+0(FP), R5 // arg 2
MOVV $SYS_tkill, R2
SYSCALL
RET
TEXT runtime·raiseproc(SB),NOSPLIT,$-8
MOVV $SYS_getpid, R2
SYSCALL
MOVW R2, R4 // arg 1 pid
MOVW sig+0(FP), R5 // arg 2
MOVV $SYS_kill, R2
SYSCALL
RET
TEXT runtime·setitimer(SB),NOSPLIT,$-8-24
MOVW mode+0(FP), R4
MOVV new+8(FP), R5
MOVV old+16(FP), R6
MOVV $SYS_setitimer, R2
SYSCALL
RET
TEXT runtime·mincore(SB),NOSPLIT,$-8-28
MOVV addr+0(FP), R4
MOVV n+8(FP), R5
MOVV dst+16(FP), R6
MOVV $SYS_mincore, R2
SYSCALL
MOVW R2, ret+24(FP)
RET
// func now() (sec int64, nsec int32)
TEXT time·now(SB),NOSPLIT,$16
MOVV $0(R29), R4
MOVV $0, R5
MOVV $SYS_gettimeofday, R2
SYSCALL
MOVV 0(R29), R3 // sec
MOVV 8(R29), R5 // usec
MOVV $1000, R4
MULVU R4, R5
MOVV LO, R5
MOVV R3, sec+0(FP)
MOVW R5, nsec+8(FP)
RET
TEXT runtime·nanotime(SB),NOSPLIT,$16
MOVW $1, R4 // CLOCK_MONOTONIC
MOVV $0(R29), R5
MOVV $SYS_clock_gettime, R2
SYSCALL
MOVV 0(R29), R3 // sec
MOVV 8(R29), R5 // nsec
// sec is in R3, nsec in R5
// return nsec in R3
MOVV $1000000000, R4
MULVU R4, R3
MOVV LO, R3
ADDVU R5, R3
MOVV R3, ret+0(FP)
RET
TEXT runtime·rtsigprocmask(SB),NOSPLIT,$-8-28
MOVW sig+0(FP), R4
MOVV new+8(FP), R5
MOVV old+16(FP), R6
MOVW size+24(FP), R7
MOVV $SYS_rt_sigprocmask, R2
SYSCALL
BEQ R7, 2(PC)
MOVV R0, 0xf1(R0) // crash
RET
TEXT runtime·rt_sigaction(SB),NOSPLIT,$-8-36
MOVV sig+0(FP), R4
MOVV new+8(FP), R5
MOVV old+16(FP), R6
MOVV size+24(FP), R7
MOVV $SYS_rt_sigaction, R2
SYSCALL
MOVW R2, ret+32(FP)
RET
TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
MOVW sig+8(FP), R4
MOVV info+16(FP), R5
MOVV ctx+24(FP), R6
MOVV fn+0(FP), R1
JAL (R1)
RET
TEXT runtime·sigtramp(SB),NOSPLIT,$64
// initialize essential registers (just in case)
JAL runtime·reginit(SB)
// this might be called in external code context,
// where g is not set.
MOVB runtime·iscgo(SB), R1
BEQ R1, 2(PC)
JAL runtime·load_g(SB)
MOVW R4, 8(R29)
MOVV R5, 16(R29)
MOVV R6, 24(R29)
MOVV $runtime·sigtrampgo(SB), R1
JAL (R1)
RET
TEXT runtime·mmap(SB),NOSPLIT,$-8
MOVV addr+0(FP), R4
MOVV n+8(FP), R5
MOVW prot+16(FP), R6
MOVW flags+20(FP), R7
MOVW fd+24(FP), R8
MOVW off+28(FP), R9
MOVV $SYS_mmap, R2
SYSCALL
MOVV R2, ret+32(FP)
RET
TEXT runtime·munmap(SB),NOSPLIT,$-8
MOVV addr+0(FP), R4
MOVV n+8(FP), R5
MOVV $SYS_munmap, R2
SYSCALL
BEQ R7, 2(PC)
MOVV R0, 0xf3(R0) // crash
RET
TEXT runtime·madvise(SB),NOSPLIT,$-8
MOVV addr+0(FP), R4
MOVV n+8(FP), R5
MOVW flags+16(FP), R6
MOVV $SYS_madvise, R2
SYSCALL
// ignore failure - maybe pages are locked
RET
// int64 futex(int32 *uaddr, int32 op, int32 val,
// struct timespec *timeout, int32 *uaddr2, int32 val2);
TEXT runtime·futex(SB),NOSPLIT,$-8
MOVV addr+0(FP), R4
MOVW op+8(FP), R5
MOVW val+12(FP), R6
MOVV ts+16(FP), R7
MOVV addr2+24(FP), R8
MOVW val3+32(FP), R9
MOVV $SYS_futex, R2
SYSCALL
MOVW R2, ret+40(FP)
RET
// int64 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));
TEXT runtime·clone(SB),NOSPLIT,$-8
MOVW flags+0(FP), R4
MOVV stk+8(FP), R5
// Copy mp, gp, fn off parent stack for use by child.
// Careful: Linux system call clobbers ???.
MOVV mm+16(FP), R16
MOVV gg+24(FP), R17
MOVV fn+32(FP), R18
MOVV R16, -8(R5)
MOVV R17, -16(R5)
MOVV R18, -24(R5)
MOVV $1234, R16
MOVV R16, -32(R5)
MOVV $SYS_clone, R2
SYSCALL
// In parent, return.
BEQ R2, 3(PC)
MOVW R2, ret+40(FP)
RET
// In child, on new stack.
// initialize essential registers
JAL runtime·reginit(SB)
MOVV -32(R29), R16
MOVV $1234, R1
BEQ R16, R1, 2(PC)
MOVV R0, 0(R0)
// Initialize m->procid to Linux tid
MOVV $SYS_gettid, R2
SYSCALL
MOVV -24(R29), R18 // fn
MOVV -16(R29), R17 // g
MOVV -8(R29), R16 // m
BEQ R16, nog
BEQ R17, nog
MOVV R2, m_procid(R16)
// TODO: setup TLS.
// In child, set up new stack
MOVV R16, g_m(R17)
MOVV R17, g
//CALL runtime·stackcheck(SB)
nog:
// Call fn
JAL (R18)
// It shouldn't return. If it does, exit that thread.
MOVW $111, R4
MOVV $SYS_exit, R2
SYSCALL
JMP -3(PC) // keep exiting
TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
MOVV new+0(FP), R4
MOVV old+8(FP), R5
MOVV $SYS_sigaltstack, R2
SYSCALL
BEQ R7, 2(PC)
MOVV R0, 0xf1(R0) // crash
RET
TEXT runtime·osyield(SB),NOSPLIT,$-8
MOVV $SYS_sched_yield, R2
SYSCALL
RET
TEXT runtime·sched_getaffinity(SB),NOSPLIT,$-8
MOVV pid+0(FP), R4
MOVV len+8(FP), R5
MOVV buf+16(FP), R6
MOVV $SYS_sched_getaffinity, R2
SYSCALL
MOVW R2, ret+24(FP)
RET
// int32 runtime·epollcreate(int32 size);
TEXT runtime·epollcreate(SB),NOSPLIT,$-8
MOVW size+0(FP), R4
MOVV $SYS_epoll_create, R2
SYSCALL
MOVW R2, ret+8(FP)
RET
// int32 runtime·epollcreate1(int32 flags);
TEXT runtime·epollcreate1(SB),NOSPLIT,$-8
MOVW flags+0(FP), R4
MOVV $SYS_epoll_create1, R2
SYSCALL
MOVW R2, ret+8(FP)
RET
// func epollctl(epfd, op, fd int32, ev *epollEvent) int
TEXT runtime·epollctl(SB),NOSPLIT,$-8
MOVW epfd+0(FP), R4
MOVW op+4(FP), R5
MOVW fd+8(FP), R6
MOVV ev+16(FP), R7
MOVV $SYS_epoll_ctl, R2
SYSCALL
MOVW R2, ret+24(FP)
RET
// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
TEXT runtime·epollwait(SB),NOSPLIT,$-8
MOVW epfd+0(FP), R4
MOVV ev+8(FP), R5
MOVW nev+16(FP), R6
MOVW timeout+20(FP), R7
MOVV $SYS_epoll_wait, R2
SYSCALL
MOVW R2, ret+24(FP)
RET
// void runtime·closeonexec(int32 fd);
TEXT runtime·closeonexec(SB),NOSPLIT,$-8
MOVW fd+0(FP), R4 // fd
MOVV $2, R5 // F_SETFD
MOVV $1, R6 // FD_CLOEXEC
MOVV $SYS_fcntl, R2
SYSCALL
RET
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build mips64 mips64le
#include "go_asm.h"
#include "go_tls.h"
#include "funcdata.h"
#include "textflag.h"
// If !iscgo, this is a no-op.
//
// NOTE: mcall() assumes this clobbers only R28 (REGTMP).
TEXT runtime·save_g(SB),NOSPLIT,$-8-0
MOVB runtime·iscgo(SB), R28
BEQ R28, nocgo
nocgo:
RET
TEXT runtime·load_g(SB),NOSPLIT,$-8-0
RET
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment