Black Lives Matter. Support the Equal Justice Initiative.

Text file src/runtime/sys_linux_riscv64.s

Documentation: runtime

     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  //
     6  // System calls and other sys.stuff for riscv64, Linux
     7  //
     8  
     9  #include "textflag.h"
    10  #include "go_asm.h"
    11  
    12  #define AT_FDCWD -100
    13  
    14  #define SYS_brk			214
    15  #define SYS_clock_gettime	113
    16  #define SYS_clone		220
    17  #define SYS_close		57
    18  #define SYS_connect		203
    19  #define SYS_epoll_create1	20
    20  #define SYS_epoll_ctl		21
    21  #define SYS_epoll_pwait		22
    22  #define SYS_exit		93
    23  #define SYS_exit_group		94
    24  #define SYS_faccessat		48
    25  #define SYS_fcntl		25
    26  #define SYS_futex		98
    27  #define SYS_getpid		172
    28  #define SYS_getrlimit		163
    29  #define SYS_gettid		178
    30  #define SYS_gettimeofday	169
    31  #define SYS_kill		129
    32  #define SYS_madvise		233
    33  #define SYS_mincore		232
    34  #define SYS_mmap		222
    35  #define SYS_munmap		215
    36  #define SYS_nanosleep		101
    37  #define SYS_openat		56
    38  #define SYS_pipe2		59
    39  #define SYS_pselect6		72
    40  #define SYS_read		63
    41  #define SYS_rt_sigaction	134
    42  #define SYS_rt_sigprocmask	135
    43  #define SYS_rt_sigreturn	139
    44  #define SYS_sched_getaffinity	123
    45  #define SYS_sched_yield		124
    46  #define SYS_setitimer		103
    47  #define SYS_sigaltstack		132
    48  #define SYS_socket		198
    49  #define SYS_tgkill		131
    50  #define SYS_tkill		130
    51  #define SYS_write		64
    52  
    53  // func exit(code int32)
    54  TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4
    55  	MOVW	code+0(FP), A0
    56  	MOV	$SYS_exit_group, A7
    57  	ECALL
    58  	RET
    59  
    60  // func exitThread(wait *uint32)
    61  TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8
    62  	MOV	wait+0(FP), A0
    63  	// We're done using the stack.
    64  	FENCE
    65  	MOVW	ZERO, (A0)
    66  	FENCE
    67  	MOV	$0, A0	// exit code
    68  	MOV	$SYS_exit, A7
    69  	ECALL
    70  	JMP	0(PC)
    71  
    72  // func open(name *byte, mode, perm int32) int32
    73  TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
    74  	MOV	$AT_FDCWD, A0
    75  	MOV	name+0(FP), A1
    76  	MOVW	mode+8(FP), A2
    77  	MOVW	perm+12(FP), A3
    78  	MOV	$SYS_openat, A7
    79  	ECALL
    80  	MOV	$-4096, T0
    81  	BGEU	T0, A0, 2(PC)
    82  	MOV	$-1, A0
    83  	MOVW	A0, ret+16(FP)
    84  	RET
    85  
    86  // func closefd(fd int32) int32
    87  TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12
    88  	MOVW	fd+0(FP), A0
    89  	MOV	$SYS_close, A7
    90  	ECALL
    91  	MOV	$-4096, T0
    92  	BGEU	T0, A0, 2(PC)
    93  	MOV	$-1, A0
    94  	MOVW	A0, ret+8(FP)
    95  	RET
    96  
    97  // func write1(fd uintptr, p unsafe.Pointer, n int32) int32
    98  TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28
    99  	MOV	fd+0(FP), A0
   100  	MOV	p+8(FP), A1
   101  	MOVW	n+16(FP), A2
   102  	MOV	$SYS_write, A7
   103  	ECALL
   104  	MOVW	A0, ret+24(FP)
   105  	RET
   106  
   107  // func read(fd int32, p unsafe.Pointer, n int32) int32
   108  TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
   109  	MOVW	fd+0(FP), A0
   110  	MOV	p+8(FP), A1
   111  	MOVW	n+16(FP), A2
   112  	MOV	$SYS_read, A7
   113  	ECALL
   114  	MOVW	A0, ret+24(FP)
   115  	RET
   116  
   117  // func pipe() (r, w int32, errno int32)
   118  TEXT runtime·pipe(SB),NOSPLIT|NOFRAME,$0-12
   119  	MOV	$r+0(FP), A0
   120  	MOV	ZERO, A1
   121  	MOV	$SYS_pipe2, A7
   122  	ECALL
   123  	MOVW	A0, errno+8(FP)
   124  	RET
   125  
   126  // func pipe2(flags int32) (r, w int32, errno int32)
   127  TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20
   128  	MOV	$r+8(FP), A0
   129  	MOVW	flags+0(FP), A1
   130  	MOV	$SYS_pipe2, A7
   131  	ECALL
   132  	MOVW	A0, errno+16(FP)
   133  	RET
   134  
   135  // func getrlimit(kind int32, limit unsafe.Pointer) int32
   136  TEXT runtime·getrlimit(SB),NOSPLIT|NOFRAME,$0-20
   137  	MOVW	kind+0(FP), A0
   138  	MOV	limit+8(FP), A1
   139  	MOV	$SYS_getrlimit, A7
   140  	ECALL
   141  	MOVW	A0, ret+16(FP)
   142  	RET
   143  
   144  // func usleep(usec uint32)
   145  TEXT runtime·usleep(SB),NOSPLIT,$24-4
   146  	MOVWU	usec+0(FP), A0
   147  	MOV	$1000, A1
   148  	MUL	A1, A0, A0
   149  	MOV	$1000000000, A1
   150  	DIV	A1, A0, A2
   151  	MOV	A2, 8(X2)
   152  	REM	A1, A0, A3
   153  	MOV	A3, 16(X2)
   154  	ADD	$8, X2, A0
   155  	MOV	ZERO, A1
   156  	MOV	$SYS_nanosleep, A7
   157  	ECALL
   158  	RET
   159  
   160  // func gettid() uint32
   161  TEXT runtime·gettid(SB),NOSPLIT,$0-4
   162  	MOV	$SYS_gettid, A7
   163  	ECALL
   164  	MOVW	A0, ret+0(FP)
   165  	RET
   166  
   167  // func raise(sig uint32)
   168  TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0
   169  	MOV	$SYS_gettid, A7
   170  	ECALL
   171  	// arg 1 tid - already in A0
   172  	MOVW	sig+0(FP), A1	// arg 2
   173  	MOV	$SYS_tkill, A7
   174  	ECALL
   175  	RET
   176  
   177  // func raiseproc(sig uint32)
   178  TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
   179  	MOV	$SYS_getpid, A7
   180  	ECALL
   181  	// arg 1 pid - already in A0
   182  	MOVW	sig+0(FP), A1	// arg 2
   183  	MOV	$SYS_kill, A7
   184  	ECALL
   185  	RET
   186  
   187  // func getpid() int
   188  TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8
   189  	MOV	$SYS_getpid, A7
   190  	ECALL
   191  	MOV	A0, ret+0(FP)
   192  	RET
   193  
   194  // func tgkill(tgid, tid, sig int)
   195  TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24
   196  	MOV	tgid+0(FP), A0
   197  	MOV	tid+8(FP), A1
   198  	MOV	sig+16(FP), A2
   199  	MOV	$SYS_tgkill, A7
   200  	ECALL
   201  	RET
   202  
   203  // func setitimer(mode int32, new, old *itimerval)
   204  TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
   205  	MOVW	mode+0(FP), A0
   206  	MOV	new+8(FP), A1
   207  	MOV	old+16(FP), A2
   208  	MOV	$SYS_setitimer, A7
   209  	ECALL
   210  	RET
   211  
   212  // func mincore(addr unsafe.Pointer, n uintptr, dst *byte) int32
   213  TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
   214  	MOV	addr+0(FP), A0
   215  	MOV	n+8(FP), A1
   216  	MOV	dst+16(FP), A2
   217  	MOV	$SYS_mincore, A7
   218  	ECALL
   219  	MOVW	A0, ret+24(FP)
   220  	RET
   221  
   222  // func walltime() (sec int64, nsec int32)
   223  TEXT runtime·walltime(SB),NOSPLIT,$24-12
   224  	MOV	$0, A0 // CLOCK_REALTIME
   225  	MOV	$8(X2), A1
   226  	MOV	$SYS_clock_gettime, A7
   227  	ECALL
   228  	MOV	8(X2), T0	// sec
   229  	MOV	16(X2), T1	// nsec
   230  	MOV	T0, sec+0(FP)
   231  	MOVW	T1, nsec+8(FP)
   232  	RET
   233  
   234  // func nanotime1() int64
   235  TEXT runtime·nanotime1(SB),NOSPLIT,$24-8
   236  	MOV	$1, A0 // CLOCK_MONOTONIC
   237  	MOV	$8(X2), A1
   238  	MOV	$SYS_clock_gettime, A7
   239  	ECALL
   240  	MOV	8(X2), T0	// sec
   241  	MOV	16(X2), T1	// nsec
   242  	// sec is in T0, nsec in T1
   243  	// return nsec in T0
   244  	MOV	$1000000000, T2
   245  	MUL	T2, T0
   246  	ADD	T1, T0
   247  	MOV	T0, ret+0(FP)
   248  	RET
   249  
   250  // func rtsigprocmask(how int32, new, old *sigset, size int32)
   251  TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
   252  	MOVW	how+0(FP), A0
   253  	MOV	new+8(FP), A1
   254  	MOV	old+16(FP), A2
   255  	MOVW	size+24(FP), A3
   256  	MOV	$SYS_rt_sigprocmask, A7
   257  	ECALL
   258  	MOV	$-4096, T0
   259  	BLTU	A0, T0, 2(PC)
   260  	WORD	$0	// crash
   261  	RET
   262  
   263  // func rt_sigaction(sig uintptr, new, old *sigactiont, size uintptr) int32
   264  TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36
   265  	MOV	sig+0(FP), A0
   266  	MOV	new+8(FP), A1
   267  	MOV	old+16(FP), A2
   268  	MOV	size+24(FP), A3
   269  	MOV	$SYS_rt_sigaction, A7
   270  	ECALL
   271  	MOVW	A0, ret+32(FP)
   272  	RET
   273  
   274  // func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)
   275  TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
   276  	MOVW	sig+8(FP), A0
   277  	MOV	info+16(FP), A1
   278  	MOV	ctx+24(FP), A2
   279  	MOV	fn+0(FP), T1
   280  	JALR	RA, T1
   281  	RET
   282  
   283  // func sigtramp(signo, ureg, ctxt unsafe.Pointer)
   284  TEXT runtime·sigtramp(SB),NOSPLIT,$64
   285  	MOVW	A0, 8(X2)
   286  	MOV	A1, 16(X2)
   287  	MOV	A2, 24(X2)
   288  
   289  	// this might be called in external code context,
   290  	// where g is not set.
   291  	MOVBU	runtime·iscgo(SB), A0
   292  	BEQ	A0, ZERO, 2(PC)
   293  	CALL	runtime·load_g(SB)
   294  
   295  	MOV	$runtime·sigtrampgo(SB), A0
   296  	JALR	RA, A0
   297  	RET
   298  
   299  // func cgoSigtramp()
   300  TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
   301  	MOV	$runtime·sigtramp(SB), T1
   302  	JALR	ZERO, T1
   303  
   304  // func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (p unsafe.Pointer, err int)
   305  TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0
   306  	MOV	addr+0(FP), A0
   307  	MOV	n+8(FP), A1
   308  	MOVW	prot+16(FP), A2
   309  	MOVW	flags+20(FP), A3
   310  	MOVW	fd+24(FP), A4
   311  	MOVW	off+28(FP), A5
   312  	MOV	$SYS_mmap, A7
   313  	ECALL
   314  	MOV	$-4096, T0
   315  	BGEU	T0, A0, 5(PC)
   316  	SUB	A0, ZERO, A0
   317  	MOV	ZERO, p+32(FP)
   318  	MOV	A0, err+40(FP)
   319  	RET
   320  ok:
   321  	MOV	A0, p+32(FP)
   322  	MOV	ZERO, err+40(FP)
   323  	RET
   324  
   325  // func munmap(addr unsafe.Pointer, n uintptr)
   326  TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0
   327  	MOV	addr+0(FP), A0
   328  	MOV	n+8(FP), A1
   329  	MOV	$SYS_munmap, A7
   330  	ECALL
   331  	MOV	$-4096, T0
   332  	BLTU	A0, T0, 2(PC)
   333  	WORD	$0	// crash
   334  	RET
   335  
   336  // func madvise(addr unsafe.Pointer, n uintptr, flags int32)
   337  TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0
   338  	MOV	addr+0(FP), A0
   339  	MOV	n+8(FP), A1
   340  	MOVW	flags+16(FP), A2
   341  	MOV	$SYS_madvise, A7
   342  	ECALL
   343  	MOVW	A0, ret+24(FP)
   344  	RET
   345  
   346  // func futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32
   347  TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0
   348  	MOV	addr+0(FP), A0
   349  	MOVW	op+8(FP), A1
   350  	MOVW	val+12(FP), A2
   351  	MOV	ts+16(FP), A3
   352  	MOV	addr2+24(FP), A4
   353  	MOVW	val3+32(FP), A5
   354  	MOV	$SYS_futex, A7
   355  	ECALL
   356  	MOVW	A0, ret+40(FP)
   357  	RET
   358  
   359  // func clone(flags int32, stk, mp, gp, fn unsafe.Pointer) int32
   360  TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0
   361  	MOVW	flags+0(FP), A0
   362  	MOV	stk+8(FP), A1
   363  
   364  	// Copy mp, gp, fn off parent stack for use by child.
   365  	MOV	mp+16(FP), T0
   366  	MOV	gp+24(FP), T1
   367  	MOV	fn+32(FP), T2
   368  
   369  	MOV	T0, -8(A1)
   370  	MOV	T1, -16(A1)
   371  	MOV	T2, -24(A1)
   372  	MOV	$1234, T0
   373  	MOV	T0, -32(A1)
   374  
   375  	MOV	$SYS_clone, A7
   376  	ECALL
   377  
   378  	// In parent, return.
   379  	BEQ	ZERO, A0, child
   380  	MOVW	ZERO, ret+40(FP)
   381  	RET
   382  
   383  child:
   384  	// In child, on new stack.
   385  	MOV	-32(X2), T0
   386  	MOV	$1234, A0
   387  	BEQ	A0, T0, good
   388  	WORD	$0	// crash
   389  
   390  good:
   391  	// Initialize m->procid to Linux tid
   392  	MOV	$SYS_gettid, A7
   393  	ECALL
   394  
   395  	MOV	-24(X2), T2	// fn
   396  	MOV	-16(X2), T1	// g
   397  	MOV	-8(X2), T0	// m
   398  
   399  	BEQ	ZERO, T0, nog
   400  	BEQ	ZERO, T1, nog
   401  
   402  	MOV	A0, m_procid(T0)
   403  
   404  	// In child, set up new stack
   405  	MOV	T0, g_m(T1)
   406  	MOV	T1, g
   407  
   408  nog:
   409  	// Call fn
   410  	JALR	RA, T2
   411  
   412  	// It shouldn't return.  If it does, exit this thread.
   413  	MOV	$111, A0
   414  	MOV	$SYS_exit, A7
   415  	ECALL
   416  	JMP	-3(PC)	// keep exiting
   417  
   418  // func sigaltstack(new, old *stackt)
   419  TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0
   420  	MOV	new+0(FP), A0
   421  	MOV	old+8(FP), A1
   422  	MOV	$SYS_sigaltstack, A7
   423  	ECALL
   424  	MOV	$-4096, T0
   425  	BLTU	A0, T0, 2(PC)
   426  	WORD	$0	// crash
   427  	RET
   428  
   429  // func osyield()
   430  TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0
   431  	MOV	$SYS_sched_yield, A7
   432  	ECALL
   433  	RET
   434  
   435  // func sched_getaffinity(pid, len uintptr, buf *uintptr) int32
   436  TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0
   437  	MOV	pid+0(FP), A0
   438  	MOV	len+8(FP), A1
   439  	MOV	buf+16(FP), A2
   440  	MOV	$SYS_sched_getaffinity, A7
   441  	ECALL
   442  	MOV	A0, ret+24(FP)
   443  	RET
   444  
   445  // func epollcreate(size int32) int32
   446  TEXT runtime·epollcreate(SB),NOSPLIT|NOFRAME,$0
   447  	MOV	$0, A0
   448  	MOV	$SYS_epoll_create1, A7
   449  	ECALL
   450  	MOVW	A0, ret+8(FP)
   451  	RET
   452  
   453  // func epollcreate1(flags int32) int32
   454  TEXT runtime·epollcreate1(SB),NOSPLIT|NOFRAME,$0
   455  	MOVW	flags+0(FP), A0
   456  	MOV	$SYS_epoll_create1, A7
   457  	ECALL
   458  	MOVW	A0, ret+8(FP)
   459  	RET
   460  
   461  // func epollctl(epfd, op, fd int32, ev *epollevent) int32
   462  TEXT runtime·epollctl(SB),NOSPLIT|NOFRAME,$0
   463  	MOVW	epfd+0(FP), A0
   464  	MOVW	op+4(FP), A1
   465  	MOVW	fd+8(FP), A2
   466  	MOV	ev+16(FP), A3
   467  	MOV	$SYS_epoll_ctl, A7
   468  	ECALL
   469  	MOVW	A0, ret+24(FP)
   470  	RET
   471  
   472  // func epollwait(epfd int32, ev *epollevent, nev, timeout int32) int32
   473  TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0
   474  	MOVW	epfd+0(FP), A0
   475  	MOV	ev+8(FP), A1
   476  	MOVW	nev+16(FP), A2
   477  	MOVW	timeout+20(FP), A3
   478  	MOV	$0, A4
   479  	MOV	$SYS_epoll_pwait, A7
   480  	ECALL
   481  	MOVW	A0, ret+24(FP)
   482  	RET
   483  
   484  // func closeonexec(int32)
   485  TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0
   486  	MOVW	fd+0(FP), A0  // fd
   487  	MOV	$2, A1	// F_SETFD
   488  	MOV	$1, A2	// FD_CLOEXEC
   489  	MOV	$SYS_fcntl, A7
   490  	ECALL
   491  	RET
   492  
   493  // func runtime·setNonblock(int32 fd)
   494  TEXT runtime·setNonblock(SB),NOSPLIT|NOFRAME,$0-4
   495  	MOVW	fd+0(FP), A0 // fd
   496  	MOV	$3, A1	// F_GETFL
   497  	MOV	$0, A2
   498  	MOV	$SYS_fcntl, A7
   499  	ECALL
   500  	MOV	$0x800, A2 // O_NONBLOCK
   501  	OR	A0, A2
   502  	MOVW	fd+0(FP), A0 // fd
   503  	MOV	$4, A1	// F_SETFL
   504  	MOV	$SYS_fcntl, A7
   505  	ECALL
   506  	RET
   507  
   508  // func sbrk0() uintptr
   509  TEXT runtime·sbrk0(SB),NOSPLIT,$0-8
   510  	// Implemented as brk(NULL).
   511  	MOV	$0, A0
   512  	MOV	$SYS_brk, A7
   513  	ECALL
   514  	MOVW	A0, ret+0(FP)
   515  	RET
   516  

View as plain text