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

Get this view in your editor

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