...

Text file src/pkg/runtime/sys_netbsd_amd64.s

     1	// Copyright 2009 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 sys.stuff for AMD64, NetBSD
     6	// /usr/src/sys/kern/syscalls.master for syscall numbers.
     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_setprivate		317
    38	#define SYS__lwp_kill			318
    39	#define SYS__lwp_unpark			321
    40	#define SYS___sigaction_sigtramp	340
    41	#define SYS_kqueue			344
    42	#define SYS_sched_yield			350
    43	#define SYS___setitimer50		425
    44	#define SYS___clock_gettime50		427
    45	#define SYS___nanosleep50		430
    46	#define SYS___kevent50			435
    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		MOVQ	ctxt+0(FP), DI
    52		MOVQ	flags+8(FP), SI
    53		MOVQ	lwpid+16(FP), DX
    54		MOVL	$SYS__lwp_create, AX
    55		SYSCALL
    56		JCC	2(PC)
    57		NEGQ	AX
    58		MOVL	AX, ret+24(FP)
    59		RET
    60	
    61	TEXT runtime·lwp_tramp(SB),NOSPLIT,$0
    62	
    63		// Set FS to point at m->tls.
    64		LEAQ	m_tls(R8), DI
    65		CALL	runtime·settls(SB)
    66	
    67		// Set up new stack.
    68		get_tls(CX)
    69		MOVQ	R8, g_m(R9)
    70		MOVQ	R9, g(CX)
    71		CALL	runtime·stackcheck(SB)
    72	
    73		// Call fn
    74		CALL	R12
    75	
    76		// It shouldn't return. If it does, exit.
    77		MOVL	$SYS__lwp_exit, AX
    78		SYSCALL
    79		JMP	-3(PC)			// keep exiting
    80	
    81	TEXT runtime·osyield(SB),NOSPLIT,$0
    82		MOVL	$SYS_sched_yield, AX
    83		SYSCALL
    84		RET
    85	
    86	TEXT runtime·lwp_park(SB),NOSPLIT,$0
    87		MOVL	clockid+0(FP), DI		// arg 1 - clockid
    88		MOVL	flags+4(FP), SI			// arg 2 - flags
    89		MOVQ	ts+8(FP), DX			// arg 3 - ts
    90		MOVL	unpark+16(FP), R10		// arg 4 - unpark
    91		MOVQ	hint+24(FP), R8			// arg 5 - hint
    92		MOVQ	unparkhint+32(FP), R9		// arg 6 - unparkhint
    93		MOVL	$SYS____lwp_park60, AX
    94		SYSCALL
    95		MOVL	AX, ret+40(FP)
    96		RET
    97	
    98	TEXT runtime·lwp_unpark(SB),NOSPLIT,$0
    99		MOVL	lwp+0(FP), DI		// arg 1 - lwp
   100		MOVQ	hint+8(FP), SI		// arg 2 - hint
   101		MOVL	$SYS__lwp_unpark, AX
   102		SYSCALL
   103		MOVL	AX, ret+16(FP)
   104		RET
   105	
   106	TEXT runtime·lwp_self(SB),NOSPLIT,$0
   107		MOVL	$SYS__lwp_self, AX
   108		SYSCALL
   109		MOVL	AX, ret+0(FP)
   110		RET
   111	
   112	// Exit the entire program (like C exit)
   113	TEXT runtime·exit(SB),NOSPLIT,$-8
   114		MOVL	code+0(FP), DI		// arg 1 - exit status
   115		MOVL	$SYS_exit, AX
   116		SYSCALL
   117		MOVL	$0xf1, 0xf1		// crash
   118		RET
   119	
   120	// func exitThread(wait *uint32)
   121	TEXT runtime·exitThread(SB),NOSPLIT,$0-8
   122		MOVQ	wait+0(FP), AX
   123		// We're done using the stack.
   124		MOVL	$0, (AX)
   125		MOVL	$SYS__lwp_exit, AX
   126		SYSCALL
   127		MOVL	$0xf1, 0xf1		// crash
   128		JMP	0(PC)
   129	
   130	TEXT runtime·open(SB),NOSPLIT,$-8
   131		MOVQ	name+0(FP), DI		// arg 1 pathname
   132		MOVL	mode+8(FP), SI		// arg 2 flags
   133		MOVL	perm+12(FP), DX		// arg 3 mode
   134		MOVL	$SYS_open, AX
   135		SYSCALL
   136		JCC	2(PC)
   137		MOVL	$-1, AX
   138		MOVL	AX, ret+16(FP)
   139		RET
   140	
   141	TEXT runtime·closefd(SB),NOSPLIT,$-8
   142		MOVL	fd+0(FP), DI		// arg 1 fd
   143		MOVL	$SYS_close, AX
   144		SYSCALL
   145		JCC	2(PC)
   146		MOVL	$-1, AX
   147		MOVL	AX, ret+8(FP)
   148		RET
   149	
   150	TEXT runtime·read(SB),NOSPLIT,$-8
   151		MOVL	fd+0(FP), DI		// arg 1 fd
   152		MOVQ	p+8(FP), SI		// arg 2 buf
   153		MOVL	n+16(FP), DX		// arg 3 count
   154		MOVL	$SYS_read, AX
   155		SYSCALL
   156		JCC	2(PC)
   157		MOVL	$-1, AX
   158		MOVL	AX, ret+24(FP)
   159		RET
   160	
   161	TEXT runtime·write(SB),NOSPLIT,$-8
   162		MOVQ	fd+0(FP), DI		// arg 1 - fd
   163		MOVQ	p+8(FP), SI		// arg 2 - buf
   164		MOVL	n+16(FP), DX		// arg 3 - nbyte
   165		MOVL	$SYS_write, AX
   166		SYSCALL
   167		JCC	2(PC)
   168		MOVL	$-1, AX
   169		MOVL	AX, ret+24(FP)
   170		RET
   171	
   172	TEXT runtime·usleep(SB),NOSPLIT,$16
   173		MOVL	$0, DX
   174		MOVL	usec+0(FP), AX
   175		MOVL	$1000000, CX
   176		DIVL	CX
   177		MOVQ	AX, 0(SP)		// tv_sec
   178		MOVL	$1000, AX
   179		MULL	DX
   180		MOVQ	AX, 8(SP)		// tv_nsec
   181	
   182		MOVQ	SP, DI			// arg 1 - rqtp
   183		MOVQ	$0, SI			// arg 2 - rmtp
   184		MOVL	$SYS___nanosleep50, AX
   185		SYSCALL
   186		RET
   187	
   188	TEXT runtime·raise(SB),NOSPLIT,$16
   189		MOVL	$SYS__lwp_self, AX
   190		SYSCALL
   191		MOVQ	AX, DI			// arg 1 - target
   192		MOVL	sig+0(FP), SI		// arg 2 - signo
   193		MOVL	$SYS__lwp_kill, AX
   194		SYSCALL
   195		RET
   196	
   197	TEXT runtime·raiseproc(SB),NOSPLIT,$16
   198		MOVL	$SYS_getpid, AX
   199		SYSCALL
   200		MOVQ	AX, DI			// arg 1 - pid
   201		MOVL	sig+0(FP), SI		// arg 2 - signo
   202		MOVL	$SYS_kill, AX
   203		SYSCALL
   204		RET
   205	
   206	TEXT runtime·setitimer(SB),NOSPLIT,$-8
   207		MOVL	mode+0(FP), DI		// arg 1 - which
   208		MOVQ	new+8(FP), SI		// arg 2 - itv
   209		MOVQ	old+16(FP), DX		// arg 3 - oitv
   210		MOVL	$SYS___setitimer50, AX
   211		SYSCALL
   212		RET
   213	
   214	// func walltime() (sec int64, nsec int32)
   215	TEXT runtime·walltime(SB), NOSPLIT, $32
   216		MOVQ	$CLOCK_REALTIME, DI	// arg 1 - clock_id
   217		LEAQ	8(SP), SI		// arg 2 - tp
   218		MOVL	$SYS___clock_gettime50, AX
   219		SYSCALL
   220		MOVQ	8(SP), AX		// sec
   221		MOVQ	16(SP), DX		// nsec
   222	
   223		// sec is in AX, nsec in DX
   224		MOVQ	AX, sec+0(FP)
   225		MOVL	DX, nsec+8(FP)
   226		RET
   227	
   228	TEXT runtime·nanotime(SB),NOSPLIT,$32
   229		MOVQ	$CLOCK_MONOTONIC, DI	// arg 1 - clock_id
   230		LEAQ	8(SP), SI		// arg 2 - tp
   231		MOVL	$SYS___clock_gettime50, AX
   232		SYSCALL
   233		MOVQ	8(SP), AX		// sec
   234		MOVQ	16(SP), DX		// nsec
   235	
   236		// sec is in AX, nsec in DX
   237		// return nsec in AX
   238		IMULQ	$1000000000, AX
   239		ADDQ	DX, AX
   240		MOVQ	AX, ret+0(FP)
   241		RET
   242	
   243	TEXT runtime·getcontext(SB),NOSPLIT,$-8
   244		MOVQ	ctxt+0(FP), DI		// arg 1 - context
   245		MOVL	$SYS_getcontext, AX
   246		SYSCALL
   247		JCC	2(PC)
   248		MOVL	$0xf1, 0xf1		// crash
   249		RET
   250	
   251	TEXT runtime·sigprocmask(SB),NOSPLIT,$0
   252		MOVL	how+0(FP), DI		// arg 1 - how
   253		MOVQ	new+8(FP), SI		// arg 2 - set
   254		MOVQ	old+16(FP), DX		// arg 3 - oset
   255		MOVL	$SYS___sigprocmask14, AX
   256		SYSCALL
   257		JCC	2(PC)
   258		MOVL	$0xf1, 0xf1		// crash
   259		RET
   260	
   261	TEXT sigreturn_tramp<>(SB),NOSPLIT,$-8
   262		MOVQ	R15, DI			// Load address of ucontext
   263		MOVQ	$SYS_setcontext, AX
   264		SYSCALL
   265		MOVQ	$-1, DI			// Something failed...
   266		MOVL	$SYS_exit, AX
   267		SYSCALL
   268	
   269	TEXT runtime·sigaction(SB),NOSPLIT,$-8
   270		MOVL	sig+0(FP), DI		// arg 1 - signum
   271		MOVQ	new+8(FP), SI		// arg 2 - nsa
   272		MOVQ	old+16(FP), DX		// arg 3 - osa
   273						// arg 4 - tramp
   274		LEAQ	sigreturn_tramp<>(SB), R10
   275		MOVQ	$2, R8			// arg 5 - vers
   276		MOVL	$SYS___sigaction_sigtramp, AX
   277		SYSCALL
   278		JCC	2(PC)
   279		MOVL	$0xf1, 0xf1		// crash
   280		RET
   281	
   282	TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
   283		MOVQ	fn+0(FP),    AX
   284		MOVL	sig+8(FP),   DI
   285		MOVQ	info+16(FP), SI
   286		MOVQ	ctx+24(FP),  DX
   287		PUSHQ	BP
   288		MOVQ	SP, BP
   289		ANDQ	$~15, SP     // alignment for x86_64 ABI
   290		CALL	AX
   291		MOVQ	BP, SP
   292		POPQ	BP
   293		RET
   294	
   295	TEXT runtime·sigtramp(SB),NOSPLIT,$72
   296		// Save callee-saved C registers, since the caller may be a C signal handler.
   297		MOVQ	BX,  bx-8(SP)
   298		MOVQ	BP,  bp-16(SP)  // save in case GOEXPERIMENT=noframepointer is set
   299		MOVQ	R12, r12-24(SP)
   300		MOVQ	R13, r13-32(SP)
   301		MOVQ	R14, r14-40(SP)
   302		MOVQ	R15, r15-48(SP)
   303		// We don't save mxcsr or the x87 control word because sigtrampgo doesn't
   304		// modify them.
   305	
   306		MOVQ	DX, ctx-56(SP)
   307		MOVQ	SI, info-64(SP)
   308		MOVQ	DI, signum-72(SP)
   309		CALL	runtime·sigtrampgo(SB)
   310	
   311		MOVQ	r15-48(SP), R15
   312		MOVQ	r14-40(SP), R14
   313		MOVQ	r13-32(SP), R13
   314		MOVQ	r12-24(SP), R12
   315		MOVQ	bp-16(SP),  BP
   316		MOVQ	bx-8(SP),   BX
   317		RET
   318	
   319	TEXT runtime·mmap(SB),NOSPLIT,$0
   320		MOVQ	addr+0(FP), DI		// arg 1 - addr
   321		MOVQ	n+8(FP), SI		// arg 2 - len
   322		MOVL	prot+16(FP), DX		// arg 3 - prot
   323		MOVL	flags+20(FP), R10		// arg 4 - flags
   324		MOVL	fd+24(FP), R8		// arg 5 - fd
   325		MOVL	off+28(FP), R9
   326		SUBQ	$16, SP
   327		MOVQ	R9, 8(SP)		// arg 7 - offset (passed on stack)
   328		MOVQ	$0, R9			// arg 6 - pad
   329		MOVL	$SYS_mmap, AX
   330		SYSCALL
   331		JCC	ok
   332		ADDQ	$16, SP
   333		MOVQ	$0, p+32(FP)
   334		MOVQ	AX, err+40(FP)
   335		RET
   336	ok:
   337		ADDQ	$16, SP
   338		MOVQ	AX, p+32(FP)
   339		MOVQ	$0, err+40(FP)
   340		RET
   341	
   342	TEXT runtime·munmap(SB),NOSPLIT,$0
   343		MOVQ	addr+0(FP), DI		// arg 1 - addr
   344		MOVQ	n+8(FP), SI		// arg 2 - len
   345		MOVL	$SYS_munmap, AX
   346		SYSCALL
   347		JCC	2(PC)
   348		MOVL	$0xf1, 0xf1		// crash
   349		RET
   350	
   351	
   352	TEXT runtime·madvise(SB),NOSPLIT,$0
   353		MOVQ	addr+0(FP), DI		// arg 1 - addr
   354		MOVQ	n+8(FP), SI		// arg 2 - len
   355		MOVL	flags+16(FP), DX	// arg 3 - behav
   356		MOVQ	$SYS_madvise, AX
   357		SYSCALL
   358		JCC	2(PC)
   359		MOVL	$-1, AX
   360		MOVL	AX, ret+24(FP)
   361		RET
   362	
   363	TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
   364		MOVQ	new+0(FP), DI		// arg 1 - nss
   365		MOVQ	old+8(FP), SI		// arg 2 - oss
   366		MOVQ	$SYS___sigaltstack14, AX
   367		SYSCALL
   368		JCC	2(PC)
   369		MOVL	$0xf1, 0xf1		// crash
   370		RET
   371	
   372	// set tls base to DI
   373	TEXT runtime·settls(SB),NOSPLIT,$8
   374		// adjust for ELF: wants to use -8(FS) for g
   375		ADDQ	$8, DI			// arg 1 - ptr
   376		MOVQ	$SYS__lwp_setprivate, AX
   377		SYSCALL
   378		JCC	2(PC)
   379		MOVL	$0xf1, 0xf1		// crash
   380		RET
   381	
   382	TEXT runtime·sysctl(SB),NOSPLIT,$0
   383		MOVQ	mib+0(FP), DI		// arg 1 - name
   384		MOVL	miblen+8(FP), SI		// arg 2 - namelen
   385		MOVQ	out+16(FP), DX		// arg 3 - oldp
   386		MOVQ	size+24(FP), R10		// arg 4 - oldlenp
   387		MOVQ	dst+32(FP), R8		// arg 5 - newp
   388		MOVQ	ndst+40(FP), R9		// arg 6 - newlen
   389		MOVQ	$SYS___sysctl, AX
   390		SYSCALL
   391		JCC 4(PC)
   392		NEGQ	AX
   393		MOVL	AX, ret+48(FP)
   394		RET
   395		MOVL	$0, AX
   396		MOVL	AX, ret+48(FP)
   397		RET
   398	
   399	// int32 runtime·kqueue(void)
   400	TEXT runtime·kqueue(SB),NOSPLIT,$0
   401		MOVQ	$0, DI
   402		MOVL	$SYS_kqueue, AX
   403		SYSCALL
   404		JCC	2(PC)
   405		NEGQ	AX
   406		MOVL	AX, ret+0(FP)
   407		RET
   408	
   409	// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout)
   410	TEXT runtime·kevent(SB),NOSPLIT,$0
   411		MOVL	kq+0(FP), DI
   412		MOVQ	ch+8(FP), SI
   413		MOVL	nch+16(FP), DX
   414		MOVQ	ev+24(FP), R10
   415		MOVL	nev+32(FP), R8
   416		MOVQ	ts+40(FP), R9
   417		MOVL	$SYS___kevent50, AX
   418		SYSCALL
   419		JCC	2(PC)
   420		NEGQ	AX
   421		MOVL	AX, ret+48(FP)
   422		RET
   423	
   424	// void runtime·closeonexec(int32 fd)
   425	TEXT runtime·closeonexec(SB),NOSPLIT,$0
   426		MOVL	fd+0(FP), DI	// fd
   427		MOVQ	$F_SETFD, SI
   428		MOVQ	$FD_CLOEXEC, DX
   429		MOVL	$SYS_fcntl, AX
   430		SYSCALL
   431		RET

View as plain text