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