src/runtime/sys_linux_mips64x.s 631 lines View on github.com → Search inside
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.

Get this view in your editor

Same data, no extra tab — call code_get_file + code_get_findings over MCP from Claude/Cursor/Copilot.