...

Text file src/runtime/sys_netbsd_arm64.s

     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, NetBSD
     7	//
     8	
     9	#include "go_asm.h"
    10	#include "go_tls.h"
    11	#include "textflag.h"
    12	
    13	#define CLOCK_REALTIME		0
    14	#define CLOCK_MONOTONIC		3
    15	#define FD_CLOEXEC		1
    16	#define F_SETFD			2
    17	
    18	#define SYS_exit			1
    19	#define SYS_read			3
    20	#define SYS_write			4
    21	#define SYS_open			5
    22	#define SYS_close			6
    23	#define SYS_getpid			20
    24	#define SYS_kill			37
    25	#define SYS_munmap			73
    26	#define SYS_madvise			75
    27	#define SYS_fcntl			92
    28	#define SYS_mmap			197
    29	#define SYS___sysctl			202
    30	#define SYS___sigaltstack14		281
    31	#define SYS___sigprocmask14		293
    32	#define SYS_getcontext			307
    33	#define SYS_setcontext			308
    34	#define SYS__lwp_create			309
    35	#define SYS__lwp_exit			310
    36	#define SYS__lwp_self			311
    37	#define SYS__lwp_kill			318
    38	#define SYS__lwp_unpark			321
    39	#define SYS___sigaction_sigtramp	340
    40	#define SYS_kqueue			344
    41	#define SYS_sched_yield			350
    42	#define SYS___setitimer50		425
    43	#define SYS___clock_gettime50		427
    44	#define SYS___nanosleep50		430
    45	#define SYS___kevent50			435
    46	#define SYS_openat			468
    47	#define SYS____lwp_park60		478
    48	
    49	// int32 lwp_create(void *context, uintptr flags, void *lwpid)
    50	TEXT runtime·lwp_create(SB),NOSPLIT,$0
    51		MOVD	ctxt+0(FP), R0
    52		MOVD	flags+8(FP), R1
    53		MOVD	lwpid+16(FP), R2
    54		SVC	$SYS__lwp_create
    55		BCC	ok
    56		NEG	R0, R0
    57	ok:
    58		MOVW	R0, ret+24(FP)
    59		RET
    60	
    61	TEXT runtime·lwp_tramp(SB),NOSPLIT,$0
    62		CMP	$0, R1
    63		BEQ	nog
    64		CMP	$0, R2
    65		BEQ	nog
    66	
    67		MOVD	R0, g_m(R1)
    68		MOVD	R1, g
    69	nog:
    70		CALL	(R2)
    71	
    72		MOVD	$0, R0  // crash (not reached)
    73		MOVD	R0, (R8)
    74	
    75	TEXT runtime·osyield(SB),NOSPLIT,$0
    76		SVC	$SYS_sched_yield
    77		RET
    78	
    79	TEXT runtime·lwp_park(SB),NOSPLIT,$0
    80		MOVW	clockid+0(FP), R0	// arg 1 - clockid
    81		MOVW	flags+4(FP), R1		// arg 2 - flags
    82		MOVD	ts+8(FP), R2		// arg 3 - ts
    83		MOVW	unpark+16(FP), R3	// arg 4 - unpark
    84		MOVD	hint+24(FP), R4		// arg 5 - hint
    85		MOVD	unparkhint+32(FP), R5	// arg 6 - unparkhint
    86		SVC	$SYS____lwp_park60
    87		MOVW	R0, ret+40(FP)
    88		RET
    89	
    90	TEXT runtime·lwp_unpark(SB),NOSPLIT,$0
    91		MOVW	lwp+0(FP), R0		// arg 1 - lwp
    92		MOVD	hint+8(FP), R1		// arg 2 - hint
    93		SVC	$SYS__lwp_unpark
    94		MOVW	R0, ret+16(FP)
    95		RET
    96	
    97	TEXT runtime·lwp_self(SB),NOSPLIT,$0
    98		SVC	$SYS__lwp_self
    99		MOVW	R0, ret+0(FP)
   100		RET
   101	
   102	// Exit the entire program (like C exit)
   103	TEXT runtime·exit(SB),NOSPLIT,$-8
   104		MOVW	code+0(FP), R0		// arg 1 - exit status
   105		SVC	$SYS_exit
   106		MOVD	$0, R0			// If we're still running,
   107		MOVD	R0, (R0)		// crash
   108	
   109	// func exitThread(wait *uint32)
   110	TEXT runtime·exitThread(SB),NOSPLIT,$0-8
   111		MOVD	wait+0(FP), R0
   112		// We're done using the stack.
   113		MOVW	$0, R1
   114		STLRW	R1, (R0)
   115		SVC	$SYS__lwp_exit
   116		JMP	0(PC)
   117	
   118	TEXT runtime·open(SB),NOSPLIT|NOFRAME,$-8
   119		MOVD	name+0(FP), R0		// arg 1 - pathname
   120		MOVW	mode+8(FP), R1		// arg 2 - flags
   121		MOVW	perm+12(FP), R2		// arg 3 - mode
   122		SVC	$SYS_open
   123		BCC	ok
   124		MOVW	$-1, R0
   125	ok:
   126		MOVW	R0, ret+16(FP)
   127		RET
   128	
   129	TEXT runtime·closefd(SB),NOSPLIT,$-8
   130		MOVW	fd+0(FP), R0		// arg 1 - fd
   131		SVC	$SYS_close
   132		BCC	ok
   133		MOVW	$-1, R0
   134	ok:
   135		MOVW	R0, ret+8(FP)
   136		RET
   137	
   138	TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0
   139		MOVW	fd+0(FP), R0		// arg 1 - fd
   140		MOVD	p+8(FP), R1		// arg 2 - buf
   141		MOVW	n+16(FP), R2		// arg 3 - count
   142		SVC	$SYS_read
   143		BCC	ok
   144		MOVW	$-1, R0
   145	ok:
   146		MOVW	R0, ret+24(FP)
   147		RET
   148	
   149	TEXT runtime·write(SB),NOSPLIT,$-8
   150		MOVD	fd+0(FP), R0		// arg 1 - fd
   151		MOVD	p+8(FP), R1		// arg 2 - buf
   152		MOVW	n+16(FP), R2		// arg 3 - nbyte
   153		SVC	$SYS_write
   154		BCC	ok
   155		MOVW	$-1, R0
   156	ok:
   157		MOVW	R0, ret+24(FP)
   158		RET
   159	
   160	TEXT runtime·usleep(SB),NOSPLIT,$24-4
   161		MOVWU	usec+0(FP), R3
   162		MOVD	R3, R5
   163		MOVW	$1000000, R4
   164		UDIV	R4, R3
   165		MOVD	R3, 8(RSP)		// sec
   166		MUL	R3, R4
   167		SUB	R4, R5
   168		MOVW	$1000, R4
   169		MUL	R4, R5
   170		MOVD	R5, 16(RSP)		// nsec
   171	
   172		MOVD	$8(RSP), R0		// arg 1 - rqtp
   173		MOVD	$0, R1			// arg 2 - rmtp
   174		SVC	$SYS___nanosleep50
   175		RET
   176	
   177	TEXT runtime·raise(SB),NOSPLIT,$16
   178		SVC	$SYS__lwp_self
   179						// arg 1 - target (lwp_self)
   180		MOVW	sig+0(FP), R1		// arg 2 - signo
   181		SVC	$SYS__lwp_kill
   182		RET
   183	
   184	TEXT runtime·raiseproc(SB),NOSPLIT,$16
   185		SVC	$SYS_getpid
   186						// arg 1 - pid (from getpid)
   187		MOVD	sig+0(FP), R1		// arg 2 - signo
   188		SVC	$SYS_kill
   189		RET
   190	
   191	TEXT runtime·setitimer(SB),NOSPLIT,$-8
   192		MOVW	mode+0(FP), R0		// arg 1 - which
   193		MOVD	new+8(FP), R1		// arg 2 - itv
   194		MOVD	old+16(FP), R2		// arg 3 - oitv
   195		SVC	$SYS___setitimer50
   196		RET
   197	
   198	// func walltime() (sec int64, nsec int32)
   199	TEXT runtime·walltime(SB), NOSPLIT, $32
   200		MOVW	$CLOCK_REALTIME, R0	// arg 1 - clock_id
   201		MOVD	$8(RSP), R1		// arg 2 - tp
   202		SVC	$SYS___clock_gettime50
   203	
   204		MOVD	8(RSP), R0		// sec
   205		MOVD	16(RSP), R1		// nsec
   206	
   207		// sec is in R0, nsec in R1
   208		MOVD	R0, sec+0(FP)
   209		MOVW	R1, nsec+8(FP)
   210		RET
   211	
   212	// int64 nanotime(void) so really
   213	// void nanotime(int64 *nsec)
   214	TEXT runtime·nanotime(SB), NOSPLIT, $32
   215		MOVD	$CLOCK_MONOTONIC, R0	// arg 1 - clock_id
   216		MOVD	$8(RSP), R1		// arg 2 - tp
   217		SVC	$SYS___clock_gettime50
   218		MOVD	8(RSP), R0		// sec
   219		MOVD	16(RSP), R2		// nsec
   220	
   221		// sec is in R0, nsec in R2
   222		// return nsec in R2
   223		MOVD	$1000000000, R3
   224		MUL	R3, R0
   225		ADD	R2, R0
   226	
   227		MOVD	R0, ret+0(FP)
   228		RET
   229	
   230	TEXT runtime·getcontext(SB),NOSPLIT,$-8
   231		MOVD	ctxt+0(FP), R0		// arg 1 - context
   232		SVC	$SYS_getcontext
   233		BCS	fail
   234		RET
   235	fail:
   236		MOVD	$0, R0
   237		MOVD	R0, (R0)		// crash
   238	
   239	TEXT runtime·sigprocmask(SB),NOSPLIT,$0
   240		MOVW	how+0(FP), R0		// arg 1 - how
   241		MOVD	new+8(FP), R1		// arg 2 - set
   242		MOVD	old+16(FP), R2		// arg 3 - oset
   243		SVC	$SYS___sigprocmask14
   244		BCS	fail
   245		RET
   246	fail:
   247		MOVD	$0, R0
   248		MOVD	R0, (R0)		// crash
   249	
   250	TEXT sigreturn_tramp<>(SB),NOSPLIT,$-8
   251		MOVD	g, R0
   252		SVC	$SYS_setcontext
   253		MOVD	$0x4242, R0		// Something failed, return magic number
   254		SVC	$SYS_exit
   255	
   256	TEXT runtime·sigaction(SB),NOSPLIT,$-8
   257		MOVW	sig+0(FP), R0		// arg 1 - signum
   258		MOVD	new+8(FP), R1		// arg 2 - nsa
   259		MOVD	old+16(FP), R2		// arg 3 - osa
   260						// arg 4 - tramp
   261		MOVD	$sigreturn_tramp<>(SB), R3
   262		MOVW	$2, R4			// arg 5 - vers
   263		SVC	$SYS___sigaction_sigtramp
   264		BCS	fail
   265		RET
   266	fail:
   267		MOVD	$0, R0
   268		MOVD	R0, (R0)		// crash
   269	
   270	// XXX ???
   271	TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
   272		MOVW	sig+8(FP), R0
   273		MOVD	info+16(FP), R1
   274		MOVD	ctx+24(FP), R2
   275		MOVD	fn+0(FP), R11
   276		BL	(R11)
   277		RET
   278	
   279	TEXT runtime·sigtramp(SB),NOSPLIT,$192
   280		// Save callee-save registers in the case of signal forwarding.
   281		// Please refer to https://golang.org/issue/31827 .
   282		MOVD	R19, 8*4(RSP)
   283		MOVD	R20, 8*5(RSP)
   284		MOVD	R21, 8*6(RSP)
   285		MOVD	R22, 8*7(RSP)
   286		MOVD	R23, 8*8(RSP)
   287		MOVD	R24, 8*9(RSP)
   288		MOVD	R25, 8*10(RSP)
   289		MOVD	R26, 8*11(RSP)
   290		MOVD	R27, 8*12(RSP)
   291		MOVD	g, 8*13(RSP)
   292		MOVD	R29, 8*14(RSP)
   293		FMOVD	F8, 8*15(RSP)
   294		FMOVD	F9, 8*16(RSP)
   295		FMOVD	F10, 8*17(RSP)
   296		FMOVD	F11, 8*18(RSP)
   297		FMOVD	F12, 8*19(RSP)
   298		FMOVD	F13, 8*20(RSP)
   299		FMOVD	F14, 8*21(RSP)
   300		FMOVD	F15, 8*22(RSP)
   301	
   302		// this might be called in external code context,
   303		// where g is not set.
   304		// first save R0, because runtime·load_g will clobber it
   305		MOVD	R0, 8(RSP)		// signum
   306		MOVB	runtime·iscgo(SB), R0
   307		CMP 	$0, R0
   308		// XXX branch destination
   309		BEQ	2(PC)
   310		BL	runtime·load_g(SB)
   311	
   312		MOVD	R1, 16(RSP)
   313		MOVD	R2, 24(RSP)
   314		BL	runtime·sigtrampgo(SB)
   315	
   316		// Restore callee-save registers.
   317		MOVD	8*4(RSP), R19
   318		MOVD	8*5(RSP), R20
   319		MOVD	8*6(RSP), R21
   320		MOVD	8*7(RSP), R22
   321		MOVD	8*8(RSP), R23
   322		MOVD	8*9(RSP), R24
   323		MOVD	8*10(RSP), R25
   324		MOVD	8*11(RSP), R26
   325		MOVD	8*12(RSP), R27
   326		MOVD	8*13(RSP), g
   327		MOVD	8*14(RSP), R29
   328		FMOVD	8*15(RSP), F8
   329		FMOVD	8*16(RSP), F9
   330		FMOVD	8*17(RSP), F10
   331		FMOVD	8*18(RSP), F11
   332		FMOVD	8*19(RSP), F12
   333		FMOVD	8*20(RSP), F13
   334		FMOVD	8*21(RSP), F14
   335		FMOVD	8*22(RSP), F15
   336	
   337		RET
   338	
   339	TEXT runtime·mmap(SB),NOSPLIT,$0
   340		MOVD	addr+0(FP), R0		// arg 1 - addr
   341		MOVD	n+8(FP), R1		// arg 2 - len
   342		MOVW	prot+16(FP), R2		// arg 3 - prot
   343		MOVW	flags+20(FP), R3	// arg 4 - flags
   344		MOVW	fd+24(FP), R4		// arg 5 - fd
   345		MOVW	$0, R5			// arg 6 - pad
   346		MOVD	off+28(FP), R6		// arg 7 - offset
   347		SVC	$SYS_mmap
   348		BCS	fail
   349		MOVD	R0, p+32(FP)
   350		MOVD	$0, err+40(FP)
   351		RET
   352	fail:
   353		MOVD	$0, p+32(FP)
   354		MOVD	R0, err+40(FP)
   355		RET
   356	
   357	TEXT runtime·munmap(SB),NOSPLIT,$0
   358		MOVD	addr+0(FP), R0	// arg 1 - addr
   359		MOVD	n+8(FP), R1	// arg 2 - len
   360		SVC	$SYS_munmap
   361		BCS	fail
   362		RET
   363	fail:
   364		MOVD	$0, R0
   365		MOVD	R0, (R0)	// crash
   366	
   367	TEXT runtime·madvise(SB),NOSPLIT,$0
   368		MOVD	addr+0(FP), R0		// arg 1 - addr
   369		MOVD	n+8(FP), R1		// arg 2 - len
   370		MOVW	flags+16(FP), R2	// arg 3 - behav
   371		SVC	$SYS_madvise
   372		BCC	ok
   373		MOVD	$-1, R0
   374	ok:
   375		MOVD	R0, ret+24(FP)
   376		RET
   377	
   378	TEXT runtime·sigaltstack(SB),NOSPLIT,$0
   379		MOVD	new+0(FP), R0		// arg 1 - nss
   380		MOVD	old+8(FP), R1		// arg 2 - oss
   381		SVC	$SYS___sigaltstack14
   382		BCS	fail
   383		RET
   384	fail:
   385		MOVD	$0, R0
   386		MOVD	R0, (R0)		// crash
   387	
   388	TEXT runtime·sysctl(SB),NOSPLIT,$0
   389		MOVD	mib+0(FP), R0		// arg 1 - name
   390		MOVW	miblen+8(FP), R1	// arg 2 - namelen
   391		MOVD	out+16(FP), R2		// arg 3 - oldp
   392		MOVD	size+24(FP), R3		// arg 4 - oldlenp
   393		MOVD	dst+32(FP), R4		// arg 5 - newp
   394		MOVD	ndst+40(FP), R5		// arg 6 - newlen
   395		SVC	$SYS___sysctl
   396		BCC	ok
   397		NEG	R0, R0
   398	ok:
   399		MOVW	R0, ret+48(FP)
   400		RET
   401	
   402	// int32 runtime·kqueue(void)
   403	TEXT runtime·kqueue(SB),NOSPLIT,$0
   404		MOVD	$0, R0
   405		SVC	$SYS_kqueue
   406		BCC	ok
   407		NEG	R0, R0
   408	ok:
   409		MOVW	R0, ret+0(FP)
   410		RET
   411	
   412	// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout)
   413	TEXT runtime·kevent(SB),NOSPLIT,$0
   414		MOVW	kq+0(FP), R0	// arg 1 - kq
   415		MOVD	ch+8(FP), R1	// arg 2 - changelist
   416		MOVW	nch+16(FP), R2	// arg 3 - nchanges
   417		MOVD	ev+24(FP), R3	// arg 4 - eventlist
   418		MOVW	nev+32(FP), R4	// arg 5 - nevents
   419		MOVD	ts+40(FP), R5	// arg 6 - timeout
   420		SVC	$SYS___kevent50
   421		BCC	ok
   422		NEG	R0, R0
   423	ok:
   424		MOVW	R0, ret+48(FP)
   425		RET
   426	
   427	// void runtime·closeonexec(int32 fd)
   428	TEXT runtime·closeonexec(SB),NOSPLIT,$0
   429		MOVW	fd+0(FP), R0		// arg 1 - fd
   430		MOVW	$F_SETFD, R1
   431		MOVW	$FD_CLOEXEC, R2
   432		SVC	$SYS_fcntl
   433		RET

View as plain text