github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/runtime/sys_freebsd_arm64.s (about)

     1  // Copyright 2019 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 arm64, FreeBSD
     7  // /usr/src/sys/kern/syscalls.master for syscall numbers.
     8  //
     9  
    10  #include "go_asm.h"
    11  #include "go_tls.h"
    12  #include "textflag.h"
    13  #include "cgo/abi_arm64.h"
    14  
    15  #define CLOCK_REALTIME		0
    16  #define CLOCK_MONOTONIC		4
    17  #define FD_CLOEXEC		1
    18  #define F_SETFD			2
    19  #define F_GETFL			3
    20  #define F_SETFL			4
    21  #define O_NONBLOCK		4
    22  
    23  #define SYS_exit		1
    24  #define SYS_read		3
    25  #define SYS_write		4
    26  #define SYS_open		5
    27  #define SYS_close		6
    28  #define SYS_getpid		20
    29  #define SYS_kill		37
    30  #define SYS_sigaltstack		53
    31  #define SYS_munmap		73
    32  #define SYS_madvise		75
    33  #define SYS_setitimer		83
    34  #define SYS_fcntl		92
    35  #define SYS___sysctl		202
    36  #define SYS_nanosleep		240
    37  #define SYS_clock_gettime	232
    38  #define SYS_sched_yield		331
    39  #define SYS_sigprocmask		340
    40  #define SYS_kqueue		362
    41  #define SYS_sigaction		416
    42  #define SYS_thr_exit		431
    43  #define SYS_thr_self		432
    44  #define SYS_thr_kill		433
    45  #define SYS__umtx_op		454
    46  #define SYS_thr_new		455
    47  #define SYS_mmap		477
    48  #define SYS_cpuset_getaffinity	487
    49  #define SYS_pipe2 		542
    50  #define SYS_kevent		560
    51  
    52  TEXT emptyfunc<>(SB),0,$0-0
    53  	RET
    54  
    55  // func sys_umtx_op(addr *uint32, mode int32, val uint32, uaddr1 uintptr, ut *umtx_time) int32
    56  TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0
    57  	MOVD	addr+0(FP), R0
    58  	MOVW	mode+8(FP), R1
    59  	MOVW	val+12(FP), R2
    60  	MOVD	uaddr1+16(FP), R3
    61  	MOVD	ut+24(FP), R4
    62  	MOVD	$SYS__umtx_op, R8
    63  	SVC
    64  	BCC	ok
    65  	NEG	R0, R0
    66  ok:
    67  	MOVW	R0, ret+32(FP)
    68  	RET
    69  
    70  // func thr_new(param *thrparam, size int32) int32
    71  TEXT runtime·thr_new(SB),NOSPLIT,$0
    72  	MOVD	param+0(FP), R0
    73  	MOVW	size+8(FP), R1
    74  	MOVD	$SYS_thr_new, R8
    75  	SVC
    76  	BCC	ok
    77  	NEG	R0, R0
    78  ok:
    79  	MOVW	R0, ret+16(FP)
    80  	RET
    81  
    82  // func thr_start()
    83  TEXT runtime·thr_start(SB),NOSPLIT,$0
    84  	// set up g
    85  	MOVD	m_g0(R0), g
    86  	MOVD	R0, g_m(g)
    87  	BL	emptyfunc<>(SB)	 // fault if stack check is wrong
    88  	BL	runtime·mstart(SB)
    89  
    90  	MOVD	$2, R8	// crash (not reached)
    91  	MOVD	R8, (R8)
    92  	RET
    93  
    94  // func exit(code int32)
    95  TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4
    96  	MOVW	code+0(FP), R0
    97  	MOVD	$SYS_exit, R8
    98  	SVC
    99  	MOVD	$0, R0
   100  	MOVD	R0, (R0)
   101  
   102  // func exitThread(wait *atomic.Uint32)
   103  TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8
   104  	MOVD	wait+0(FP), R0
   105  	// We're done using the stack.
   106  	MOVW	$0, R1
   107  	STLRW	R1, (R0)
   108  	MOVW	$0, R0
   109  	MOVD	$SYS_thr_exit, R8
   110  	SVC
   111  	JMP	0(PC)
   112  
   113  // func open(name *byte, mode, perm int32) int32
   114  TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
   115  	MOVD	name+0(FP), R0
   116  	MOVW	mode+8(FP), R1
   117  	MOVW	perm+12(FP), R2
   118  	MOVD	$SYS_open, R8
   119  	SVC
   120  	BCC	ok
   121  	MOVW	$-1, R0
   122  ok:
   123  	MOVW	R0, ret+16(FP)
   124  	RET
   125  
   126  // func closefd(fd int32) int32
   127  TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12
   128  	MOVW	fd+0(FP), R0
   129  	MOVD	$SYS_close, R8
   130  	SVC
   131  	BCC	ok
   132  	MOVW	$-1, R0
   133  ok:
   134  	MOVW	R0, ret+8(FP)
   135  	RET
   136  
   137  // func pipe2(flags int32) (r, w int32, errno int32)
   138  TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20
   139  	MOVD	$r+8(FP), R0
   140  	MOVW	flags+0(FP), R1
   141  	MOVD	$SYS_pipe2, R8
   142  	SVC
   143  	BCC	ok
   144  	NEG	R0, R0
   145  ok:
   146  	MOVW	R0, errno+16(FP)
   147  	RET
   148  
   149  // func write1(fd uintptr, p unsafe.Pointer, n int32) int32
   150  TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28
   151  	MOVD	fd+0(FP), R0
   152  	MOVD	p+8(FP), R1
   153  	MOVW	n+16(FP), R2
   154  	MOVD	$SYS_write, R8
   155  	SVC
   156  	BCC	ok
   157  	NEG	R0, R0		// caller expects negative errno
   158  ok:
   159  	MOVW	R0, ret+24(FP)
   160  	RET
   161  
   162  // func read(fd int32, p unsafe.Pointer, n int32) int32
   163  TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
   164  	MOVW	fd+0(FP), R0
   165  	MOVD	p+8(FP), R1
   166  	MOVW	n+16(FP), R2
   167  	MOVD	$SYS_read, R8
   168  	SVC
   169  	BCC	ok
   170  	NEG	R0, R0		// caller expects negative errno
   171  ok:
   172  	MOVW	R0, ret+24(FP)
   173  	RET
   174  
   175  // func usleep(usec uint32)
   176  TEXT runtime·usleep(SB),NOSPLIT,$24-4
   177  	MOVWU	usec+0(FP), R3
   178  	MOVD	R3, R5
   179  	MOVW	$1000000, R4
   180  	UDIV	R4, R3
   181  	MOVD	R3, 8(RSP)
   182  	MUL	R3, R4
   183  	SUB	R4, R5
   184  	MOVW	$1000, R4
   185  	MUL	R4, R5
   186  	MOVD	R5, 16(RSP)
   187  
   188  	// nanosleep(&ts, 0)
   189  	ADD	$8, RSP, R0
   190  	MOVD	$0, R1
   191  	MOVD	$SYS_nanosleep, R8
   192  	SVC
   193  	RET
   194  
   195  // func thr_self() thread
   196  TEXT runtime·thr_self(SB),NOSPLIT,$8-8
   197  	MOVD	$ptr-8(SP), R0	// arg 1 &8(SP)
   198  	MOVD	$SYS_thr_self, R8
   199  	SVC
   200  	MOVD	ptr-8(SP), R0
   201  	MOVD	R0, ret+0(FP)
   202  	RET
   203  
   204  // func thr_kill(t thread, sig int)
   205  TEXT runtime·thr_kill(SB),NOSPLIT,$0-16
   206  	MOVD	tid+0(FP), R0	// arg 1 pid
   207  	MOVD	sig+8(FP), R1	// arg 2 sig
   208  	MOVD	$SYS_thr_kill, R8
   209  	SVC
   210  	RET
   211  
   212  // func raiseproc(sig uint32)
   213  TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
   214  	MOVD	$SYS_getpid, R8
   215  	SVC
   216  	MOVW	sig+0(FP), R1
   217  	MOVD	$SYS_kill, R8
   218  	SVC
   219  	RET
   220  
   221  // func setitimer(mode int32, new, old *itimerval)
   222  TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
   223  	MOVW	mode+0(FP), R0
   224  	MOVD	new+8(FP), R1
   225  	MOVD	old+16(FP), R2
   226  	MOVD	$SYS_setitimer, R8
   227  	SVC
   228  	RET
   229  
   230  // func fallback_walltime() (sec int64, nsec int32)
   231  TEXT runtime·fallback_walltime(SB),NOSPLIT,$24-12
   232  	MOVW	$CLOCK_REALTIME, R0
   233  	MOVD	$8(RSP), R1
   234  	MOVD	$SYS_clock_gettime, R8
   235  	SVC
   236  	MOVD	8(RSP), R0	// sec
   237  	MOVW	16(RSP), R1	// nsec
   238  	MOVD	R0, sec+0(FP)
   239  	MOVW	R1, nsec+8(FP)
   240  	RET
   241  
   242  // func fallback_nanotime() int64
   243  TEXT runtime·fallback_nanotime(SB),NOSPLIT,$24-8
   244  	MOVD	$CLOCK_MONOTONIC, R0
   245  	MOVD	$8(RSP), R1
   246  	MOVD	$SYS_clock_gettime, R8
   247  	SVC
   248  	MOVD	8(RSP), R0	// sec
   249  	MOVW	16(RSP), R2	// nsec
   250  
   251  	// sec is in R0, nsec in R2
   252  	// return nsec in R2
   253  	MOVD	$1000000000, R3
   254  	MUL	R3, R0
   255  	ADD	R2, R0
   256  
   257  	MOVD	R0, ret+0(FP)
   258  	RET
   259  
   260  // func asmSigaction(sig uintptr, new, old *sigactiont) int32
   261  TEXT runtime·asmSigaction(SB),NOSPLIT|NOFRAME,$0
   262  	MOVD	sig+0(FP), R0		// arg 1 sig
   263  	MOVD	new+8(FP), R1		// arg 2 act
   264  	MOVD	old+16(FP), R2		// arg 3 oact
   265  	MOVD	$SYS_sigaction, R8
   266  	SVC
   267  	BCC	ok
   268  	MOVW	$-1, R0
   269  ok:
   270  	MOVW	R0, ret+24(FP)
   271  	RET
   272  
   273  // func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer)
   274  TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
   275  	MOVW	sig+8(FP), R0
   276  	MOVD	info+16(FP), R1
   277  	MOVD	ctx+24(FP), R2
   278  	MOVD	fn+0(FP), R11
   279  	BL	(R11)
   280  	RET
   281  
   282  // func sigtramp()
   283  TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$176
   284  	// Save callee-save registers in the case of signal forwarding.
   285  	// Please refer to https://golang.org/issue/31827 .
   286  	SAVE_R19_TO_R28(8*4)
   287  	SAVE_F8_TO_F15(8*14)
   288  
   289  	// this might be called in external code context,
   290  	// where g is not set.
   291  	// first save R0, because runtime·load_g will clobber it
   292  	MOVW	R0, 8(RSP)
   293  	MOVBU	runtime·iscgo(SB), R0
   294  	CMP	$0, R0
   295  	BEQ	2(PC)
   296  	BL	runtime·load_g(SB)
   297  
   298  	// Restore signum to R0.
   299  	MOVW	8(RSP), R0
   300  	// R1 and R2 already contain info and ctx, respectively.
   301  	MOVD	$runtime·sigtrampgo<ABIInternal>(SB), R3
   302  	BL	(R3)
   303  
   304  	// Restore callee-save registers.
   305  	RESTORE_R19_TO_R28(8*4)
   306  	RESTORE_F8_TO_F15(8*14)
   307  
   308  	RET
   309  
   310  // func mmap(addr uintptr, n uintptr, prot int, flags int, fd int, off int64) (ret uintptr, err error)
   311  TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0
   312  	MOVD	addr+0(FP), R0
   313  	MOVD	n+8(FP), R1
   314  	MOVW	prot+16(FP), R2
   315  	MOVW	flags+20(FP), R3
   316  	MOVW	fd+24(FP), R4
   317  	MOVW	off+28(FP), R5
   318  	MOVD	$SYS_mmap, R8
   319  	SVC
   320  	BCS	fail
   321  	MOVD	R0, p+32(FP)
   322  	MOVD	$0, err+40(FP)
   323  	RET
   324  fail:
   325  	MOVD	$0, p+32(FP)
   326  	MOVD	R0, err+40(FP)
   327  	RET
   328  
   329  // func munmap(addr uintptr, n uintptr) (err error)
   330  TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0
   331  	MOVD	addr+0(FP), R0
   332  	MOVD	n+8(FP), R1
   333  	MOVD	$SYS_munmap, R8
   334  	SVC
   335  	BCS	fail
   336  	RET
   337  fail:
   338  	MOVD	$0, R0
   339  	MOVD	R0, (R0)	// crash
   340  
   341  // func madvise(addr unsafe.Pointer, n uintptr, flags int32) int32
   342  TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0
   343  	MOVD	addr+0(FP), R0
   344  	MOVD	n+8(FP), R1
   345  	MOVW	flags+16(FP), R2
   346  	MOVD	$SYS_madvise, R8
   347  	SVC
   348  	BCC	ok
   349  	MOVW	$-1, R0
   350  ok:
   351  	MOVW	R0, ret+24(FP)
   352  	RET
   353  
   354  // func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32
   355  TEXT runtime·sysctl(SB),NOSPLIT,$0
   356  	MOVD	mib+0(FP), R0
   357  	MOVD	miblen+8(FP), R1
   358  	MOVD	out+16(FP), R2
   359  	MOVD	size+24(FP), R3
   360  	MOVD	dst+32(FP), R4
   361  	MOVD	ndst+40(FP), R5
   362  	MOVD	$SYS___sysctl, R8
   363  	SVC
   364  	BCC	ok
   365  	NEG	R0, R0
   366  ok:
   367  	MOVW	R0, ret+48(FP)
   368  	RET
   369  
   370  // func sigaltstack(new, old *stackt)
   371  TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0
   372  	MOVD	new+0(FP), R0
   373  	MOVD	old+8(FP), R1
   374  	MOVD	$SYS_sigaltstack, R8
   375  	SVC
   376  	BCS	fail
   377  	RET
   378  fail:
   379  	MOVD	$0, R0
   380  	MOVD	R0, (R0)	// crash
   381  
   382  // func osyield()
   383  TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0
   384  	MOVD	$SYS_sched_yield, R8
   385  	SVC
   386  	RET
   387  
   388  // func sigprocmask(how int32, new, old *sigset)
   389  TEXT runtime·sigprocmask(SB),NOSPLIT|NOFRAME,$0-24
   390  	MOVW	how+0(FP), R0
   391  	MOVD	new+8(FP), R1
   392  	MOVD	old+16(FP), R2
   393  	MOVD	$SYS_sigprocmask, R8
   394  	SVC
   395  	BCS	fail
   396  	RET
   397  fail:
   398  	MOVD	$0, R0
   399  	MOVD	R0, (R0)	// crash
   400  
   401  // func cpuset_getaffinity(level int, which int, id int64, size int, mask *byte) int32
   402  TEXT runtime·cpuset_getaffinity(SB),NOSPLIT|NOFRAME,$0-44
   403  	MOVD	level+0(FP), R0
   404  	MOVD	which+8(FP), R1
   405  	MOVD	id+16(FP), R2
   406  	MOVD	size+24(FP), R3
   407  	MOVD	mask+32(FP), R4
   408  	MOVD	$SYS_cpuset_getaffinity, R8
   409  	SVC
   410  	BCC	ok
   411  	MOVW	$-1, R0
   412  ok:
   413  	MOVW	R0, ret+40(FP)
   414  	RET
   415  
   416  // func kqueue() int32
   417  TEXT runtime·kqueue(SB),NOSPLIT|NOFRAME,$0
   418  	MOVD $SYS_kqueue, R8
   419  	SVC
   420  	BCC	ok
   421  	MOVW	$-1, R0
   422  ok:
   423  	MOVW	R0, ret+0(FP)
   424  	RET
   425  
   426  // func kevent(kq int, ch unsafe.Pointer, nch int, ev unsafe.Pointer, nev int, ts *Timespec) (n int, err error)
   427  TEXT runtime·kevent(SB),NOSPLIT,$0
   428  	MOVW	kq+0(FP), R0
   429  	MOVD	ch+8(FP), R1
   430  	MOVW	nch+16(FP), R2
   431  	MOVD	ev+24(FP), R3
   432  	MOVW	nev+32(FP), R4
   433  	MOVD	ts+40(FP), R5
   434  	MOVD	$SYS_kevent, R8
   435  	SVC
   436  	BCC	ok
   437  	NEG	R0, R0
   438  ok:
   439  	MOVW	R0, ret+48(FP)
   440  	RET
   441  
   442  // func closeonexec(fd int32)
   443  TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0
   444  	MOVW	fd+0(FP), R0
   445  	MOVD	$F_SETFD, R1
   446  	MOVD	$FD_CLOEXEC, R2
   447  	MOVD	$SYS_fcntl, R8
   448  	SVC
   449  	RET
   450  
   451  // func getCntxct(physical bool) uint32
   452  TEXT runtime·getCntxct(SB),NOSPLIT,$0
   453  	MOVB	physical+0(FP), R0
   454  	CMP	$0, R0
   455  	BEQ	3(PC)
   456  
   457  	// get CNTPCT (Physical Count Register) into R0
   458  	MRS	CNTPCT_EL0, R0
   459  	B	2(PC)
   460  
   461  	// get CNTVCT (Virtual Count Register) into R0
   462  	MRS	CNTVCT_EL0, R0
   463  
   464  	MOVW	R0, ret+8(FP)
   465  	RET