...

Text file src/runtime/sys_linux_mips64x.s

     1	// Copyright 2015 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	// +build linux
     6	// +build mips64 mips64le
     7	
     8	//
     9	// System calls and other sys.stuff for mips64, Linux
    10	//
    11	
    12	#include "go_asm.h"
    13	#include "go_tls.h"
    14	#include "textflag.h"
    15	
    16	#define AT_FDCWD -100
    17	
    18	#define SYS_exit		5058
    19	#define SYS_read		5000
    20	#define SYS_write		5001
    21	#define SYS_close		5003
    22	#define SYS_getpid		5038
    23	#define SYS_kill		5060
    24	#define SYS_fcntl		5080
    25	#define SYS_mmap		5009
    26	#define SYS_munmap		5011
    27	#define SYS_setitimer		5036
    28	#define SYS_clone		5055
    29	#define SYS_nanosleep		5034
    30	#define SYS_sched_yield		5023
    31	#define SYS_rt_sigreturn	5211
    32	#define SYS_rt_sigaction	5013
    33	#define SYS_rt_sigprocmask	5014
    34	#define SYS_sigaltstack		5129
    35	#define SYS_madvise		5027
    36	#define SYS_mincore		5026
    37	#define SYS_gettid		5178
    38	#define SYS_futex		5194
    39	#define SYS_sched_getaffinity	5196
    40	#define SYS_exit_group		5205
    41	#define SYS_epoll_create	5207
    42	#define SYS_epoll_ctl		5208
    43	#define SYS_tgkill		5225
    44	#define SYS_openat		5247
    45	#define SYS_epoll_pwait		5272
    46	#define SYS_clock_gettime	5222
    47	#define SYS_epoll_create1	5285
    48	#define SYS_brk			5012
    49	
    50	TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4
    51		MOVW	code+0(FP), R4
    52		MOVV	$SYS_exit_group, R2
    53		SYSCALL
    54		RET
    55	
    56	// func exitThread(wait *uint32)
    57	TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8
    58		MOVV	wait+0(FP), R1
    59		// We're done using the stack.
    60		MOVW	$0, R2
    61		SYNC
    62		MOVW	R2, (R1)
    63		SYNC
    64		MOVW	$0, R4	// exit code
    65		MOVV	$SYS_exit, R2
    66		SYSCALL
    67		JMP	0(PC)
    68	
    69	TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
    70		// This uses openat instead of open, because Android O blocks open.
    71		MOVW	$AT_FDCWD, R4 // AT_FDCWD, so this acts like open
    72		MOVV	name+0(FP), R5
    73		MOVW	mode+8(FP), R6
    74		MOVW	perm+12(FP), R7
    75		MOVV	$SYS_openat, R2
    76		SYSCALL
    77		BEQ	R7, 2(PC)
    78		MOVW	$-1, R2
    79		MOVW	R2, ret+16(FP)
    80		RET
    81	
    82	TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12
    83		MOVW	fd+0(FP), R4
    84		MOVV	$SYS_close, R2
    85		SYSCALL
    86		BEQ	R7, 2(PC)
    87		MOVW	$-1, R2
    88		MOVW	R2, ret+8(FP)
    89		RET
    90	
    91	TEXT runtime·write(SB),NOSPLIT|NOFRAME,$0-28
    92		MOVV	fd+0(FP), R4
    93		MOVV	p+8(FP), R5
    94		MOVW	n+16(FP), R6
    95		MOVV	$SYS_write, R2
    96		SYSCALL
    97		BEQ	R7, 2(PC)
    98		MOVW	$-1, R2
    99		MOVW	R2, ret+24(FP)
   100		RET
   101	
   102	TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
   103		MOVW	fd+0(FP), R4
   104		MOVV	p+8(FP), R5
   105		MOVW	n+16(FP), R6
   106		MOVV	$SYS_read, R2
   107		SYSCALL
   108		BEQ	R7, 2(PC)
   109		MOVW	$-1, R2
   110		MOVW	R2, ret+24(FP)
   111		RET
   112	
   113	TEXT runtime·usleep(SB),NOSPLIT,$16-4
   114		MOVWU	usec+0(FP), R3
   115		MOVV	R3, R5
   116		MOVW	$1000000, R4
   117		DIVVU	R4, R3
   118		MOVV	LO, R3
   119		MOVV	R3, 8(R29)
   120		MOVW	$1000, R4
   121		MULVU	R3, R4
   122		MOVV	LO, R4
   123		SUBVU	R4, R5
   124		MOVV	R5, 16(R29)
   125	
   126		// nanosleep(&ts, 0)
   127		ADDV	$8, R29, R4
   128		MOVW	$0, R5
   129		MOVV	$SYS_nanosleep, R2
   130		SYSCALL
   131		RET
   132	
   133	TEXT runtime·gettid(SB),NOSPLIT,$0-4
   134		MOVV	$SYS_gettid, R2
   135		SYSCALL
   136		MOVW	R2, ret+0(FP)
   137		RET
   138	
   139	TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0
   140		MOVV	$SYS_getpid, R2
   141		SYSCALL
   142		MOVW	R2, R16
   143		MOVV	$SYS_gettid, R2
   144		SYSCALL
   145		MOVW	R2, R5	// arg 2 tid
   146		MOVW	R16, R4	// arg 1 pid
   147		MOVW	sig+0(FP), R6	// arg 3
   148		MOVV	$SYS_tgkill, R2
   149		SYSCALL
   150		RET
   151	
   152	TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
   153		MOVV	$SYS_getpid, R2
   154		SYSCALL
   155		MOVW	R2, R4	// arg 1 pid
   156		MOVW	sig+0(FP), R5	// arg 2
   157		MOVV	$SYS_kill, R2
   158		SYSCALL
   159		RET
   160	
   161	TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
   162		MOVW	mode+0(FP), R4
   163		MOVV	new+8(FP), R5
   164		MOVV	old+16(FP), R6
   165		MOVV	$SYS_setitimer, R2
   166		SYSCALL
   167		RET
   168	
   169	TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
   170		MOVV	addr+0(FP), R4
   171		MOVV	n+8(FP), R5
   172		MOVV	dst+16(FP), R6
   173		MOVV	$SYS_mincore, R2
   174		SYSCALL
   175		SUBVU	R2, R0, R2	// caller expects negative errno
   176		MOVW	R2, ret+24(FP)
   177		RET
   178	
   179	// func walltime() (sec int64, nsec int32)
   180	TEXT runtime·walltime(SB),NOSPLIT,$16
   181		MOVW	$0, R4 // CLOCK_REALTIME
   182		MOVV	$0(R29), R5
   183		MOVV	$SYS_clock_gettime, R2
   184		SYSCALL
   185		MOVV	0(R29), R3	// sec
   186		MOVV	8(R29), R5	// nsec
   187		MOVV	R3, sec+0(FP)
   188		MOVW	R5, nsec+8(FP)
   189		RET
   190	
   191	TEXT runtime·nanotime(SB),NOSPLIT,$16
   192		MOVW	$1, R4 // CLOCK_MONOTONIC
   193		MOVV	$0(R29), R5
   194		MOVV	$SYS_clock_gettime, R2
   195		SYSCALL
   196		MOVV	0(R29), R3	// sec
   197		MOVV	8(R29), R5	// nsec
   198		// sec is in R3, nsec in R5
   199		// return nsec in R3
   200		MOVV	$1000000000, R4
   201		MULVU	R4, R3
   202		MOVV	LO, R3
   203		ADDVU	R5, R3
   204		MOVV	R3, ret+0(FP)
   205		RET
   206	
   207	TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
   208		MOVW	how+0(FP), R4
   209		MOVV	new+8(FP), R5
   210		MOVV	old+16(FP), R6
   211		MOVW	size+24(FP), R7
   212		MOVV	$SYS_rt_sigprocmask, R2
   213		SYSCALL
   214		BEQ	R7, 2(PC)
   215		MOVV	R0, 0xf1(R0)	// crash
   216		RET
   217	
   218	TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36
   219		MOVV	sig+0(FP), R4
   220		MOVV	new+8(FP), R5
   221		MOVV	old+16(FP), R6
   222		MOVV	size+24(FP), R7
   223		MOVV	$SYS_rt_sigaction, R2
   224		SYSCALL
   225		BEQ	R7, 2(PC)
   226		SUBVU	R2, R0, R2	// caller expects negative errno
   227		MOVW	R2, ret+32(FP)
   228		RET
   229	
   230	TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
   231		MOVW	sig+8(FP), R4
   232		MOVV	info+16(FP), R5
   233		MOVV	ctx+24(FP), R6
   234		MOVV	fn+0(FP), R25
   235		JAL	(R25)
   236		RET
   237	
   238	TEXT runtime·sigtramp(SB),NOSPLIT,$64
   239		// initialize REGSB = PC&0xffffffff00000000
   240		BGEZAL	R0, 1(PC)
   241		SRLV	$32, R31, RSB
   242		SLLV	$32, RSB
   243	
   244		// this might be called in external code context,
   245		// where g is not set.
   246		MOVB	runtime·iscgo(SB), R1
   247		BEQ	R1, 2(PC)
   248		JAL	runtime·load_g(SB)
   249	
   250		MOVW	R4, 8(R29)
   251		MOVV	R5, 16(R29)
   252		MOVV	R6, 24(R29)
   253		MOVV	$runtime·sigtrampgo(SB), R1
   254		JAL	(R1)
   255		RET
   256	
   257	TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
   258		JMP	runtime·sigtramp(SB)
   259	
   260	TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0
   261		MOVV	addr+0(FP), R4
   262		MOVV	n+8(FP), R5
   263		MOVW	prot+16(FP), R6
   264		MOVW	flags+20(FP), R7
   265		MOVW	fd+24(FP), R8
   266		MOVW	off+28(FP), R9
   267	
   268		MOVV	$SYS_mmap, R2
   269		SYSCALL
   270		BEQ	R7, ok
   271		MOVV	$0, p+32(FP)
   272		MOVV	R2, err+40(FP)
   273		RET
   274	ok:
   275		MOVV	R2, p+32(FP)
   276		MOVV	$0, err+40(FP)
   277		RET
   278	
   279	TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0
   280		MOVV	addr+0(FP), R4
   281		MOVV	n+8(FP), R5
   282		MOVV	$SYS_munmap, R2
   283		SYSCALL
   284		BEQ	R7, 2(PC)
   285		MOVV	R0, 0xf3(R0)	// crash
   286		RET
   287	
   288	TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0
   289		MOVV	addr+0(FP), R4
   290		MOVV	n+8(FP), R5
   291		MOVW	flags+16(FP), R6
   292		MOVV	$SYS_madvise, R2
   293		SYSCALL
   294		MOVW	R2, ret+24(FP)
   295		RET
   296	
   297	// int64 futex(int32 *uaddr, int32 op, int32 val,
   298	//	struct timespec *timeout, int32 *uaddr2, int32 val2);
   299	TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0
   300		MOVV	addr+0(FP), R4
   301		MOVW	op+8(FP), R5
   302		MOVW	val+12(FP), R6
   303		MOVV	ts+16(FP), R7
   304		MOVV	addr2+24(FP), R8
   305		MOVW	val3+32(FP), R9
   306		MOVV	$SYS_futex, R2
   307		SYSCALL
   308		BEQ	R7, 2(PC)
   309		SUBVU	R2, R0, R2	// caller expects negative errno
   310		MOVW	R2, ret+40(FP)
   311		RET
   312	
   313	// int64 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));
   314	TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0
   315		MOVW	flags+0(FP), R4
   316		MOVV	stk+8(FP), R5
   317	
   318		// Copy mp, gp, fn off parent stack for use by child.
   319		// Careful: Linux system call clobbers ???.
   320		MOVV	mp+16(FP), R16
   321		MOVV	gp+24(FP), R17
   322		MOVV	fn+32(FP), R18
   323	
   324		MOVV	R16, -8(R5)
   325		MOVV	R17, -16(R5)
   326		MOVV	R18, -24(R5)
   327		MOVV	$1234, R16
   328		MOVV	R16, -32(R5)
   329	
   330		MOVV	$SYS_clone, R2
   331		SYSCALL
   332		BEQ	R7, 2(PC)
   333		SUBVU	R2, R0, R2	// caller expects negative errno
   334	
   335		// In parent, return.
   336		BEQ	R2, 3(PC)
   337		MOVW	R2, ret+40(FP)
   338		RET
   339	
   340		// In child, on new stack.
   341		MOVV	-32(R29), R16
   342		MOVV	$1234, R1
   343		BEQ	R16, R1, 2(PC)
   344		MOVV	R0, 0(R0)
   345	
   346		// Initialize m->procid to Linux tid
   347		MOVV	$SYS_gettid, R2
   348		SYSCALL
   349	
   350		MOVV	-24(R29), R18		// fn
   351		MOVV	-16(R29), R17		// g
   352		MOVV	-8(R29), R16		// m
   353	
   354		BEQ	R16, nog
   355		BEQ	R17, nog
   356	
   357		MOVV	R2, m_procid(R16)
   358	
   359		// TODO: setup TLS.
   360	
   361		// In child, set up new stack
   362		MOVV	R16, g_m(R17)
   363		MOVV	R17, g
   364		//CALL	runtime·stackcheck(SB)
   365	
   366	nog:
   367		// Call fn
   368		JAL	(R18)
   369	
   370		// It shouldn't return.	 If it does, exit that thread.
   371		MOVW	$111, R4
   372		MOVV	$SYS_exit, R2
   373		SYSCALL
   374		JMP	-3(PC)	// keep exiting
   375	
   376	TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0
   377		MOVV	new+0(FP), R4
   378		MOVV	old+8(FP), R5
   379		MOVV	$SYS_sigaltstack, R2
   380		SYSCALL
   381		BEQ	R7, 2(PC)
   382		MOVV	R0, 0xf1(R0)	// crash
   383		RET
   384	
   385	TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0
   386		MOVV	$SYS_sched_yield, R2
   387		SYSCALL
   388		RET
   389	
   390	TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0
   391		MOVV	pid+0(FP), R4
   392		MOVV	len+8(FP), R5
   393		MOVV	buf+16(FP), R6
   394		MOVV	$SYS_sched_getaffinity, R2
   395		SYSCALL
   396		BEQ	R7, 2(PC)
   397		SUBVU	R2, R0, R2	// caller expects negative errno
   398		MOVW	R2, ret+24(FP)
   399		RET
   400	
   401	// int32 runtime·epollcreate(int32 size);
   402	TEXT runtime·epollcreate(SB),NOSPLIT|NOFRAME,$0
   403		MOVW    size+0(FP), R4
   404		MOVV	$SYS_epoll_create, R2
   405		SYSCALL
   406		BEQ	R7, 2(PC)
   407		SUBVU	R2, R0, R2	// caller expects negative errno
   408		MOVW	R2, ret+8(FP)
   409		RET
   410	
   411	// int32 runtime·epollcreate1(int32 flags);
   412	TEXT runtime·epollcreate1(SB),NOSPLIT|NOFRAME,$0
   413		MOVW	flags+0(FP), R4
   414		MOVV	$SYS_epoll_create1, R2
   415		SYSCALL
   416		BEQ	R7, 2(PC)
   417		SUBVU	R2, R0, R2	// caller expects negative errno
   418		MOVW	R2, ret+8(FP)
   419		RET
   420	
   421	// func epollctl(epfd, op, fd int32, ev *epollEvent) int
   422	TEXT runtime·epollctl(SB),NOSPLIT|NOFRAME,$0
   423		MOVW	epfd+0(FP), R4
   424		MOVW	op+4(FP), R5
   425		MOVW	fd+8(FP), R6
   426		MOVV	ev+16(FP), R7
   427		MOVV	$SYS_epoll_ctl, R2
   428		SYSCALL
   429		SUBVU	R2, R0, R2	// caller expects negative errno
   430		MOVW	R2, ret+24(FP)
   431		RET
   432	
   433	// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
   434	TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0
   435		// This uses pwait instead of wait, because Android O blocks wait.
   436		MOVW	epfd+0(FP), R4
   437		MOVV	ev+8(FP), R5
   438		MOVW	nev+16(FP), R6
   439		MOVW	timeout+20(FP), R7
   440		MOVV	$0, R8
   441		MOVV	$SYS_epoll_pwait, R2
   442		SYSCALL
   443		BEQ	R7, 2(PC)
   444		SUBVU	R2, R0, R2	// caller expects negative errno
   445		MOVW	R2, ret+24(FP)
   446		RET
   447	
   448	// void runtime·closeonexec(int32 fd);
   449	TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0
   450		MOVW    fd+0(FP), R4  // fd
   451		MOVV    $2, R5  // F_SETFD
   452		MOVV    $1, R6  // FD_CLOEXEC
   453		MOVV	$SYS_fcntl, R2
   454		SYSCALL
   455		RET
   456	
   457	// func sbrk0() uintptr
   458	TEXT runtime·sbrk0(SB),NOSPLIT|NOFRAME,$0-8
   459		// Implemented as brk(NULL).
   460		MOVV	$0, R4
   461		MOVV	$SYS_brk, R2
   462		SYSCALL
   463		MOVV	R2, ret+0(FP)
   464		RET
   465	
   466	TEXT runtime·access(SB),$0-20
   467		MOVV	R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
   468		MOVW	R0, ret+16(FP) // for vet
   469		RET
   470	
   471	TEXT runtime·connect(SB),$0-28
   472		MOVV	R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
   473		MOVW	R0, ret+24(FP) // for vet
   474		RET
   475	
   476	TEXT runtime·socket(SB),$0-20
   477		MOVV	R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
   478		MOVW	R0, ret+16(FP) // for vet
   479		RET

View as plain text