Text file src/runtime/sys_linux_s390x.s

     1  // Copyright 2016 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  // System calls and other system stuff for Linux s390x; see
     6  // /usr/include/asm/unistd.h for the syscall number definitions.
     7  
     8  #include "go_asm.h"
     9  #include "go_tls.h"
    10  #include "textflag.h"
    11  
    12  #define SYS_exit                  1
    13  #define SYS_read                  3
    14  #define SYS_write                 4
    15  #define SYS_open                  5
    16  #define SYS_close                 6
    17  #define SYS_getpid               20
    18  #define SYS_kill                 37
    19  #define SYS_brk			 45
    20  #define SYS_mmap                 90
    21  #define SYS_munmap               91
    22  #define SYS_setitimer           104
    23  #define SYS_clone               120
    24  #define SYS_sched_yield         158
    25  #define SYS_nanosleep           162
    26  #define SYS_rt_sigreturn        173
    27  #define SYS_rt_sigaction        174
    28  #define SYS_rt_sigprocmask      175
    29  #define SYS_sigaltstack         186
    30  #define SYS_madvise             219
    31  #define SYS_mincore             218
    32  #define SYS_gettid              236
    33  #define SYS_futex               238
    34  #define SYS_sched_getaffinity   240
    35  #define SYS_tgkill              241
    36  #define SYS_exit_group          248
    37  #define SYS_timer_create        254
    38  #define SYS_timer_settime       255
    39  #define SYS_timer_delete        258
    40  #define SYS_clock_gettime       260
    41  #define SYS_pipe2		325
    42  
    43  TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4
    44  	MOVW	code+0(FP), R2
    45  	MOVW	$SYS_exit_group, R1
    46  	SYSCALL
    47  	RET
    48  
    49  // func exitThread(wait *atomic.Uint32)
    50  TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8
    51  	MOVD	wait+0(FP), R1
    52  	// We're done using the stack.
    53  	MOVW	$0, R2
    54  	MOVW	R2, (R1)
    55  	MOVW	$0, R2	// exit code
    56  	MOVW	$SYS_exit, R1
    57  	SYSCALL
    58  	JMP	0(PC)
    59  
    60  TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
    61  	MOVD	name+0(FP), R2
    62  	MOVW	mode+8(FP), R3
    63  	MOVW	perm+12(FP), R4
    64  	MOVW	$SYS_open, R1
    65  	SYSCALL
    66  	MOVD	$-4095, R3
    67  	CMPUBLT	R2, R3, 2(PC)
    68  	MOVW	$-1, R2
    69  	MOVW	R2, ret+16(FP)
    70  	RET
    71  
    72  TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12
    73  	MOVW	fd+0(FP), R2
    74  	MOVW	$SYS_close, R1
    75  	SYSCALL
    76  	MOVD	$-4095, R3
    77  	CMPUBLT	R2, R3, 2(PC)
    78  	MOVW	$-1, R2
    79  	MOVW	R2, ret+8(FP)
    80  	RET
    81  
    82  TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28
    83  	MOVD	fd+0(FP), R2
    84  	MOVD	p+8(FP), R3
    85  	MOVW	n+16(FP), R4
    86  	MOVW	$SYS_write, R1
    87  	SYSCALL
    88  	MOVW	R2, ret+24(FP)
    89  	RET
    90  
    91  TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
    92  	MOVW	fd+0(FP), R2
    93  	MOVD	p+8(FP), R3
    94  	MOVW	n+16(FP), R4
    95  	MOVW	$SYS_read, R1
    96  	SYSCALL
    97  	MOVW	R2, ret+24(FP)
    98  	RET
    99  
   100  // func pipe2() (r, w int32, errno int32)
   101  TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20
   102  	MOVD	$r+8(FP), R2
   103  	MOVW	flags+0(FP), R3
   104  	MOVW	$SYS_pipe2, R1
   105  	SYSCALL
   106  	MOVW	R2, errno+16(FP)
   107  	RET
   108  
   109  TEXT runtime·usleep(SB),NOSPLIT,$16-4
   110  	MOVW	usec+0(FP), R2
   111  	MOVD	R2, R4
   112  	MOVW	$1000000, R3
   113  	DIVD	R3, R2
   114  	MOVD	R2, 8(R15)
   115  	MULLD	R2, R3		// Convert sec to usec and subtract
   116  	SUB	R3, R4
   117  	MOVW	$1000, R3
   118  	MULLD	R3, R4		// Convert remaining usec into nsec.
   119  	MOVD	R4, 16(R15)
   120  
   121  	// nanosleep(&ts, 0)
   122  	ADD	$8, R15, R2
   123  	MOVW	$0, R3
   124  	MOVW	$SYS_nanosleep, R1
   125  	SYSCALL
   126  	RET
   127  
   128  TEXT runtime·gettid(SB),NOSPLIT,$0-4
   129  	MOVW	$SYS_gettid, R1
   130  	SYSCALL
   131  	MOVW	R2, ret+0(FP)
   132  	RET
   133  
   134  TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0
   135  	MOVW	$SYS_getpid, R1
   136  	SYSCALL
   137  	MOVW	R2, R10
   138  	MOVW	$SYS_gettid, R1
   139  	SYSCALL
   140  	MOVW	R2, R3	// arg 2 tid
   141  	MOVW	R10, R2	// arg 1 pid
   142  	MOVW	sig+0(FP), R4	// arg 2
   143  	MOVW	$SYS_tgkill, R1
   144  	SYSCALL
   145  	RET
   146  
   147  TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
   148  	MOVW	$SYS_getpid, R1
   149  	SYSCALL
   150  	MOVW	R2, R2	// arg 1 pid
   151  	MOVW	sig+0(FP), R3	// arg 2
   152  	MOVW	$SYS_kill, R1
   153  	SYSCALL
   154  	RET
   155  
   156  TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8
   157  	MOVW	$SYS_getpid, R1
   158  	SYSCALL
   159  	MOVD	R2, ret+0(FP)
   160  	RET
   161  
   162  TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24
   163  	MOVD	tgid+0(FP), R2
   164  	MOVD	tid+8(FP), R3
   165  	MOVD	sig+16(FP), R4
   166  	MOVW	$SYS_tgkill, R1
   167  	SYSCALL
   168  	RET
   169  
   170  TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
   171  	MOVW	mode+0(FP), R2
   172  	MOVD	new+8(FP), R3
   173  	MOVD	old+16(FP), R4
   174  	MOVW	$SYS_setitimer, R1
   175  	SYSCALL
   176  	RET
   177  
   178  TEXT runtime·timer_create(SB),NOSPLIT|NOFRAME,$0-28
   179  	MOVW	clockid+0(FP), R2
   180  	MOVD	sevp+8(FP), R3
   181  	MOVD	timerid+16(FP), R4
   182  	MOVW	$SYS_timer_create, R1
   183  	SYSCALL
   184  	MOVW	R2, ret+24(FP)
   185  	RET
   186  
   187  TEXT runtime·timer_settime(SB),NOSPLIT|NOFRAME,$0-28
   188  	MOVW	timerid+0(FP), R2
   189  	MOVW	flags+4(FP), R3
   190  	MOVD	new+8(FP), R4
   191  	MOVD	old+16(FP), R5
   192  	MOVW	$SYS_timer_settime, R1
   193  	SYSCALL
   194  	MOVW	R2, ret+24(FP)
   195  	RET
   196  
   197  TEXT runtime·timer_delete(SB),NOSPLIT|NOFRAME,$0-12
   198  	MOVW	timerid+0(FP), R2
   199  	MOVW	$SYS_timer_delete, R1
   200  	SYSCALL
   201  	MOVW	R2, ret+8(FP)
   202  	RET
   203  
   204  TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
   205  	MOVD	addr+0(FP), R2
   206  	MOVD	n+8(FP), R3
   207  	MOVD	dst+16(FP), R4
   208  	MOVW	$SYS_mincore, R1
   209  	SYSCALL
   210  	MOVW	R2, ret+24(FP)
   211  	RET
   212  
   213  // func walltime() (sec int64, nsec int32)
   214  TEXT runtime·walltime(SB),NOSPLIT,$32-12
   215  	MOVW	$0, R2			// CLOCK_REALTIME
   216  	MOVD	R15, R7			// Backup stack pointer
   217  
   218  	MOVD	g_m(g), R6		//m
   219  
   220  	MOVD	runtime·vdsoClockgettimeSym(SB), R9	// Check for VDSO availability
   221  	CMPBEQ	R9, $0, fallback
   222  
   223  	MOVD	m_vdsoPC(R6), R4
   224  	MOVD	R4, 16(R15)
   225  	MOVD	m_vdsoSP(R6), R4
   226  	MOVD	R4, 24(R15)
   227  
   228  	MOVD	R14, R8 		// Backup return address
   229  	MOVD	$ret-8(FP), R4 	// caller's SP
   230  
   231  	MOVD	R8, m_vdsoPC(R6)
   232  	MOVD	R4, m_vdsoSP(R6)
   233  
   234  	MOVD	m_curg(R6), R5
   235  	CMP		g, R5
   236  	BNE		noswitch
   237  
   238  	MOVD	m_g0(R6), R4
   239  	MOVD	(g_sched+gobuf_sp)(R4), R15	// Set SP to g0 stack
   240  
   241  noswitch:
   242  	SUB		$16, R15		// reserve 2x 8 bytes for parameters
   243  	MOVD	$~7, R4			// align to 8 bytes because of gcc ABI
   244  	AND		R4, R15
   245  	MOVD	R15, R3			// R15 needs to be in R3 as expected by kernel_clock_gettime
   246  
   247  	MOVB	runtime·iscgo(SB),R12
   248  	CMPBNE	R12, $0, nosaveg
   249  
   250  	MOVD	m_gsignal(R6), R12	// g.m.gsignal
   251  	CMPBEQ	R12, $0, nosaveg
   252  
   253  	CMPBEQ	g, R12, nosaveg
   254  	MOVD	(g_stack+stack_lo)(R12), R12 // g.m.gsignal.stack.lo
   255  	MOVD	g, (R12)
   256  
   257  	BL	R9 // to vdso lookup
   258  
   259  	MOVD	$0, (R12)
   260  
   261  	JMP	finish
   262  
   263  nosaveg:
   264  	BL	R9					// to vdso lookup
   265  
   266  finish:
   267  	MOVD	0(R15), R3		// sec
   268  	MOVD	8(R15), R5		// nsec
   269  	MOVD	R7, R15			// Restore SP
   270  
   271  	// Restore vdsoPC, vdsoSP
   272  	// We don't worry about being signaled between the two stores.
   273  	// If we are not in a signal handler, we'll restore vdsoSP to 0,
   274  	// and no one will care about vdsoPC. If we are in a signal handler,
   275  	// we cannot receive another signal.
   276  	MOVD	24(R15), R12
   277  	MOVD	R12, m_vdsoSP(R6)
   278  	MOVD	16(R15), R12
   279  	MOVD	R12, m_vdsoPC(R6)
   280  
   281  return:
   282  	// sec is in R3, nsec in R5
   283  	// return nsec in R3
   284  	MOVD	R3, sec+0(FP)
   285  	MOVW	R5, nsec+8(FP)
   286  	RET
   287  
   288  	// Syscall fallback
   289  fallback:
   290  	MOVD	$tp-16(SP), R3
   291  	MOVW	$SYS_clock_gettime, R1
   292  	SYSCALL
   293  	LMG		tp-16(SP), R2, R3
   294  	// sec is in R2, nsec in R3
   295  	MOVD	R2, sec+0(FP)
   296  	MOVW	R3, nsec+8(FP)
   297  	RET
   298  
   299  TEXT runtime·nanotime1(SB),NOSPLIT,$32-8
   300  	MOVW	$1, R2			// CLOCK_MONOTONIC
   301  
   302  	MOVD	R15, R7			// Backup stack pointer
   303  
   304  	MOVD	g_m(g), R6		//m
   305  
   306  	MOVD	runtime·vdsoClockgettimeSym(SB), R9	// Check for VDSO availability
   307  	CMPBEQ	R9, $0, fallback
   308  
   309  	MOVD	m_vdsoPC(R6), R4
   310  	MOVD	R4, 16(R15)
   311  	MOVD	m_vdsoSP(R6), R4
   312  	MOVD	R4, 24(R15)
   313  
   314  	MOVD	R14, R8			// Backup return address
   315  	MOVD	$ret-8(FP), R4	// caller's SP
   316  
   317  	MOVD	R8, m_vdsoPC(R6)
   318  	MOVD	R4, m_vdsoSP(R6)
   319  
   320  	MOVD	m_curg(R6), R5
   321  	CMP		g, R5
   322  	BNE		noswitch
   323  
   324  	MOVD	m_g0(R6), R4
   325  	MOVD	(g_sched+gobuf_sp)(R4), R15	// Set SP to g0 stack
   326  
   327  noswitch:
   328  	SUB		$16, R15		// reserve 2x 8 bytes for parameters
   329  	MOVD	$~7, R4			// align to 8 bytes because of gcc ABI
   330  	AND		R4, R15
   331  	MOVD	R15, R3			// R15 needs to be in R3 as expected by kernel_clock_gettime
   332  
   333  	MOVB	runtime·iscgo(SB),R12
   334  	CMPBNE	R12, $0, nosaveg
   335  
   336  	MOVD	m_gsignal(R6), R12	// g.m.gsignal
   337  	CMPBEQ	R12, $0, nosaveg
   338  
   339  	CMPBEQ	g, R12, nosaveg
   340  	MOVD	(g_stack+stack_lo)(R12), R12	// g.m.gsignal.stack.lo
   341  	MOVD	g, (R12)
   342  
   343  	BL	R9 					// to vdso lookup
   344  
   345  	MOVD $0, (R12)
   346  
   347  	JMP	finish
   348  
   349  nosaveg:
   350  	BL	R9					// to vdso lookup
   351  
   352  finish:
   353  	MOVD	0(R15), R3		// sec
   354  	MOVD	8(R15), R5		// nsec
   355  	MOVD	R7, R15			// Restore SP
   356  
   357  	// Restore vdsoPC, vdsoSP
   358  	// We don't worry about being signaled between the two stores.
   359  	// If we are not in a signal handler, we'll restore vdsoSP to 0,
   360  	// and no one will care about vdsoPC. If we are in a signal handler,
   361  	// we cannot receive another signal.
   362  
   363  	MOVD	24(R15), R12
   364  	MOVD	R12, m_vdsoSP(R6)
   365  	MOVD	16(R15), R12
   366  	MOVD	R12, m_vdsoPC(R6)
   367  
   368  return:
   369  	// sec is in R3, nsec in R5
   370  	// return nsec in R3
   371  	MULLD	$1000000000, R3
   372  	ADD		R5, R3
   373  	MOVD	R3, ret+0(FP)
   374  	RET
   375  
   376  	// Syscall fallback
   377  fallback:
   378  	MOVD	$tp-16(SP), R3
   379  	MOVD	$SYS_clock_gettime, R1
   380  	SYSCALL
   381  	LMG		tp-16(SP), R2, R3
   382  	MOVD	R3, R5
   383  	MOVD	R2, R3
   384  	JMP	return
   385  
   386  TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
   387  	MOVW	how+0(FP), R2
   388  	MOVD	new+8(FP), R3
   389  	MOVD	old+16(FP), R4
   390  	MOVW	size+24(FP), R5
   391  	MOVW	$SYS_rt_sigprocmask, R1
   392  	SYSCALL
   393  	MOVD	$-4095, R3
   394  	CMPUBLT	R2, R3, 2(PC)
   395  	MOVD	R0, 0(R0) // crash
   396  	RET
   397  
   398  TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36
   399  	MOVD	sig+0(FP), R2
   400  	MOVD	new+8(FP), R3
   401  	MOVD	old+16(FP), R4
   402  	MOVD	size+24(FP), R5
   403  	MOVW	$SYS_rt_sigaction, R1
   404  	SYSCALL
   405  	MOVW	R2, ret+32(FP)
   406  	RET
   407  
   408  TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
   409  	MOVW	sig+8(FP), R2
   410  	MOVD	info+16(FP), R3
   411  	MOVD	ctx+24(FP), R4
   412  	MOVD	fn+0(FP), R5
   413  	BL	R5
   414  	RET
   415  
   416  TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$160
   417  	// initialize essential registers (just in case)
   418  	XOR	R0, R0
   419  
   420  	MOVD	R6, 32(R15)
   421  	MOVD	R7, 40(R15)
   422  	MOVD	R8, 48(R15)
   423  	MOVD	R9, 56(R15)
   424  	MOVD	R10, 64(R15)
   425  	MOVD	R11, 72(R15)
   426  	MOVD	R12, 80(R15)
   427  	MOVD	g, 88(R15)
   428  	FMOVD	F8, 96(R15)
   429  	FMOVD	F9, 104(R15)
   430  	FMOVD	F10, 112(R15)
   431  	FMOVD	F11, 120(R15)
   432  	FMOVD	F12, 128(R15)
   433  	FMOVD	F13, 136(R15)
   434  	FMOVD	F14, 144(R15)
   435  	FMOVD	F15, 152(R15)
   436  
   437  	// this might be called in external code context,
   438  	// where g is not set.
   439  	MOVB	runtime·iscgo(SB), R6
   440  	CMPBEQ	R6, $0, 2(PC)
   441  	BL	runtime·load_g(SB)
   442  
   443  	MOVW	R2, 8(R15)
   444  	MOVD	R3, 16(R15)
   445  	MOVD	R4, 24(R15)
   446  	MOVD	$runtime·sigtrampgo(SB), R5
   447  	BL	R5
   448  
   449  	MOVD	32(R15), R6
   450  	MOVD	40(R15), R7
   451  	MOVD	48(R15), R8
   452  	MOVD	56(R15), R9
   453  	MOVD	64(R15), R10
   454  	MOVD	72(R15), R11
   455  	MOVD	80(R15), R12
   456  	MOVD	88(R15), g
   457  	FMOVD	96(R15), F8
   458  	FMOVD	104(R15), F9
   459  	FMOVD	112(R15), F10
   460  	FMOVD	120(R15), F11
   461  	FMOVD	128(R15), F12
   462  	FMOVD	136(R15), F13
   463  	FMOVD	144(R15), F14
   464  	FMOVD	152(R15), F15
   465  	RET
   466  
   467  TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
   468  	BR	runtime·sigtramp(SB)
   469  
   470  // func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) unsafe.Pointer
   471  TEXT runtime·mmap(SB),NOSPLIT,$48-48
   472  	MOVD	addr+0(FP), R2
   473  	MOVD	n+8(FP), R3
   474  	MOVW	prot+16(FP), R4
   475  	MOVW	flags+20(FP), R5
   476  	MOVW	fd+24(FP), R6
   477  	MOVWZ	off+28(FP), R7
   478  
   479  	// s390x uses old_mmap, so the arguments need to be placed into
   480  	// a struct and a pointer to the struct passed to mmap.
   481  	MOVD	R2, addr-48(SP)
   482  	MOVD	R3, n-40(SP)
   483  	MOVD	R4, prot-32(SP)
   484  	MOVD	R5, flags-24(SP)
   485  	MOVD	R6, fd-16(SP)
   486  	MOVD	R7, off-8(SP)
   487  
   488  	MOVD	$addr-48(SP), R2
   489  	MOVW	$SYS_mmap, R1
   490  	SYSCALL
   491  	MOVD	$-4095, R3
   492  	CMPUBLT	R2, R3, ok
   493  	NEG	R2
   494  	MOVD	$0, p+32(FP)
   495  	MOVD	R2, err+40(FP)
   496  	RET
   497  ok:
   498  	MOVD	R2, p+32(FP)
   499  	MOVD	$0, err+40(FP)
   500  	RET
   501  
   502  TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0
   503  	MOVD	addr+0(FP), R2
   504  	MOVD	n+8(FP), R3
   505  	MOVW	$SYS_munmap, R1
   506  	SYSCALL
   507  	MOVD	$-4095, R3
   508  	CMPUBLT	R2, R3, 2(PC)
   509  	MOVD	R0, 0(R0) // crash
   510  	RET
   511  
   512  TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0
   513  	MOVD	addr+0(FP), R2
   514  	MOVD	n+8(FP), R3
   515  	MOVW	flags+16(FP), R4
   516  	MOVW	$SYS_madvise, R1
   517  	SYSCALL
   518  	MOVW	R2, ret+24(FP)
   519  	RET
   520  
   521  // int64 futex(int32 *uaddr, int32 op, int32 val,
   522  //	struct timespec *timeout, int32 *uaddr2, int32 val2);
   523  TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0
   524  	MOVD	addr+0(FP), R2
   525  	MOVW	op+8(FP), R3
   526  	MOVW	val+12(FP), R4
   527  	MOVD	ts+16(FP), R5
   528  	MOVD	addr2+24(FP), R6
   529  	MOVW	val3+32(FP),  R7
   530  	MOVW	$SYS_futex, R1
   531  	SYSCALL
   532  	MOVW	R2, ret+40(FP)
   533  	RET
   534  
   535  // int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));
   536  TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0
   537  	MOVW	flags+0(FP), R3
   538  	MOVD	stk+8(FP), R2
   539  
   540  	// Copy mp, gp, fn off parent stack for use by child.
   541  	// Careful: Linux system call clobbers ???.
   542  	MOVD	mp+16(FP), R7
   543  	MOVD	gp+24(FP), R8
   544  	MOVD	fn+32(FP), R9
   545  
   546  	MOVD	R7, -8(R2)
   547  	MOVD	R8, -16(R2)
   548  	MOVD	R9, -24(R2)
   549  	MOVD	$1234, R7
   550  	MOVD	R7, -32(R2)
   551  
   552  	SYSCALL $SYS_clone
   553  
   554  	// In parent, return.
   555  	CMPBEQ	R2, $0, 3(PC)
   556  	MOVW	R2, ret+40(FP)
   557  	RET
   558  
   559  	// In child, on new stack.
   560  	// initialize essential registers
   561  	XOR	R0, R0
   562  	MOVD	-32(R15), R7
   563  	CMP	R7, $1234
   564  	BEQ	2(PC)
   565  	MOVD	R0, 0(R0)
   566  
   567  	// Initialize m->procid to Linux tid
   568  	SYSCALL $SYS_gettid
   569  
   570  	MOVD	-24(R15), R9        // fn
   571  	MOVD	-16(R15), R8        // g
   572  	MOVD	-8(R15), R7         // m
   573  
   574  	CMPBEQ	R7, $0, nog
   575  	CMP	R8, $0
   576  	BEQ	nog
   577  
   578  	MOVD	R2, m_procid(R7)
   579  
   580  	// In child, set up new stack
   581  	MOVD	R7, g_m(R8)
   582  	MOVD	R8, g
   583  	//CALL	runtime·stackcheck(SB)
   584  
   585  nog:
   586  	// Call fn
   587  	BL	R9
   588  
   589  	// It shouldn't return.	 If it does, exit that thread.
   590  	MOVW	$111, R2
   591  	MOVW	$SYS_exit, R1
   592  	SYSCALL
   593  	BR	-2(PC)	// keep exiting
   594  
   595  TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0
   596  	MOVD	new+0(FP), R2
   597  	MOVD	old+8(FP), R3
   598  	MOVW	$SYS_sigaltstack, R1
   599  	SYSCALL
   600  	MOVD	$-4095, R3
   601  	CMPUBLT	R2, R3, 2(PC)
   602  	MOVD	R0, 0(R0) // crash
   603  	RET
   604  
   605  TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0
   606  	MOVW	$SYS_sched_yield, R1
   607  	SYSCALL
   608  	RET
   609  
   610  TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0
   611  	MOVD	pid+0(FP), R2
   612  	MOVD	len+8(FP), R3
   613  	MOVD	buf+16(FP), R4
   614  	MOVW	$SYS_sched_getaffinity, R1
   615  	SYSCALL
   616  	MOVW	R2, ret+24(FP)
   617  	RET
   618  
   619  // func sbrk0() uintptr
   620  TEXT runtime·sbrk0(SB),NOSPLIT|NOFRAME,$0-8
   621  	// Implemented as brk(NULL).
   622  	MOVD	$0, R2
   623  	MOVW	$SYS_brk, R1
   624  	SYSCALL
   625  	MOVD	R2, ret+0(FP)
   626  	RET
   627  
   628  TEXT runtime·access(SB),$0-20
   629  	MOVD	$0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
   630  	MOVW	R0, ret+16(FP)
   631  	RET
   632  
   633  TEXT runtime·connect(SB),$0-28
   634  	MOVD	$0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
   635  	MOVW	R0, ret+24(FP)
   636  	RET
   637  
   638  TEXT runtime·socket(SB),$0-20
   639  	MOVD	$0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
   640  	MOVW	R0, ret+16(FP)
   641  	RET
   642  
   643  // func vgetrandom1(buf *byte, length uintptr, flags uint32, state uintptr, stateSize uintptr) int
   644  TEXT runtime·vgetrandom1(SB),NOSPLIT,$16-48
   645  	MOVD	buf+0(FP), R2
   646  	MOVD	length+8(FP), R3
   647  	MOVW	flags+16(FP), R4
   648  	MOVD	state+24(FP), R5
   649  	MOVD	stateSize+32(FP), R6
   650  
   651  	MOVD	R15, R7
   652  
   653  	MOVD	runtime·vdsoGetrandomSym(SB), R1
   654  	MOVD	g_m(g), R9
   655  
   656  	MOVD	m_vdsoPC(R9), R12
   657  	MOVD	R12, 8(R15)
   658  	MOVD	m_vdsoSP(R9), R12
   659  	MOVD	R12, 16(R15)
   660  	MOVD	R14, m_vdsoPC(R9)
   661  	MOVD	$buf+0(FP), R12
   662  	MOVD	R12, m_vdsoSP(R9)
   663  
   664  	SUB	$160, R15
   665  	MOVD	$~7, R12
   666  	AND	R12, R15
   667  
   668  	MOVB	runtime·iscgo(SB), R12
   669  	CMPBNE	R12, $0, nosaveg
   670  	MOVD	m_gsignal(R9), R12
   671  	CMPBEQ	R12, $0, nosaveg
   672  	CMPBEQ	g, R12, nosaveg
   673  	MOVD	(g_stack+stack_lo)(R12), R12
   674  	MOVD	g, (R12)
   675  
   676  	BL	R1
   677  
   678  	MOVD	$0, (R12)
   679  	JMP	restore
   680  
   681  nosaveg:
   682  	BL	R1
   683  
   684  restore:
   685  	MOVD	R7, R15
   686  	MOVD	16(R15), R12
   687  	MOVD	R12, m_vdsoSP(R9)
   688  	MOVD	8(R15), R12
   689  	MOVD	R12, m_vdsoPC(R9)
   690  	MOVD	R2, ret+40(FP)
   691  	RET
   692  

View as plain text