...

Text file src/runtime/sys_freebsd_386.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 386, FreeBSD
     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	TEXT runtime·sys_umtx_op(SB),NOSPLIT,$-4
    14		MOVL	$454, AX
    15		INT	$0x80
    16		MOVL	AX, ret+20(FP)
    17		RET
    18	
    19	TEXT runtime·thr_new(SB),NOSPLIT,$-4
    20		MOVL	$455, AX
    21		INT	$0x80
    22		MOVL	AX, ret+8(FP)
    23		RET
    24	
    25	// Called by OS using C ABI.
    26	TEXT runtime·thr_start(SB),NOSPLIT,$0
    27		NOP	SP	// tell vet SP changed - stop checking offsets
    28		MOVL	4(SP), AX // m
    29		MOVL	m_g0(AX), BX
    30		LEAL	m_tls(AX), BP
    31		MOVL	m_id(AX), DI
    32		ADDL	$7, DI
    33		PUSHAL
    34		PUSHL	$32
    35		PUSHL	BP
    36		PUSHL	DI
    37		CALL	runtime·setldt(SB)
    38		POPL	AX
    39		POPL	AX
    40		POPL	AX
    41		POPAL
    42		get_tls(CX)
    43		MOVL	BX, g(CX)
    44	
    45		MOVL	AX, g_m(BX)
    46		CALL	runtime·stackcheck(SB)		// smashes AX
    47		CALL	runtime·mstart(SB)
    48	
    49		MOVL	0, AX			// crash (not reached)
    50	
    51	// Exit the entire program (like C exit)
    52	TEXT runtime·exit(SB),NOSPLIT,$-4
    53		MOVL	$1, AX
    54		INT	$0x80
    55		MOVL	$0xf1, 0xf1  // crash
    56		RET
    57	
    58	GLOBL exitStack<>(SB),RODATA,$8
    59	DATA exitStack<>+0x00(SB)/4, $0
    60	DATA exitStack<>+0x04(SB)/4, $0
    61	
    62	// func exitThread(wait *uint32)
    63	TEXT runtime·exitThread(SB),NOSPLIT,$0-4
    64		MOVL	wait+0(FP), AX
    65		// We're done using the stack.
    66		MOVL	$0, (AX)
    67		// thr_exit takes a single pointer argument, which it expects
    68		// on the stack. We want to pass 0, so switch over to a fake
    69		// stack of 0s. It won't write to the stack.
    70		MOVL	$exitStack<>(SB), SP
    71		MOVL	$431, AX	// thr_exit
    72		INT	$0x80
    73		MOVL	$0xf1, 0xf1  // crash
    74		JMP	0(PC)
    75	
    76	TEXT runtime·open(SB),NOSPLIT,$-4
    77		MOVL	$5, AX
    78		INT	$0x80
    79		JAE	2(PC)
    80		MOVL	$-1, AX
    81		MOVL	AX, ret+12(FP)
    82		RET
    83	
    84	TEXT runtime·closefd(SB),NOSPLIT,$-4
    85		MOVL	$6, AX
    86		INT	$0x80
    87		JAE	2(PC)
    88		MOVL	$-1, AX
    89		MOVL	AX, ret+4(FP)
    90		RET
    91	
    92	TEXT runtime·read(SB),NOSPLIT,$-4
    93		MOVL	$3, AX
    94		INT	$0x80
    95		JAE	2(PC)
    96		MOVL	$-1, AX
    97		MOVL	AX, ret+12(FP)
    98		RET
    99	
   100	TEXT runtime·write(SB),NOSPLIT,$-4
   101		MOVL	$4, AX
   102		INT	$0x80
   103		JAE	2(PC)
   104		MOVL	$-1, AX
   105		MOVL	AX, ret+12(FP)
   106		RET
   107	
   108	TEXT runtime·raise(SB),NOSPLIT,$16
   109		// thr_self(&8(SP))
   110		LEAL	8(SP), AX
   111		MOVL	AX, 4(SP)
   112		MOVL	$432, AX
   113		INT	$0x80
   114		// thr_kill(self, SIGPIPE)
   115		MOVL	8(SP), AX
   116		MOVL	AX, 4(SP)
   117		MOVL	sig+0(FP), AX
   118		MOVL	AX, 8(SP)
   119		MOVL	$433, AX
   120		INT	$0x80
   121		RET
   122	
   123	TEXT runtime·raiseproc(SB),NOSPLIT,$16
   124		// getpid
   125		MOVL	$20, AX
   126		INT	$0x80
   127		// kill(self, sig)
   128		MOVL	AX, 4(SP)
   129		MOVL	sig+0(FP), AX
   130		MOVL	AX, 8(SP)
   131		MOVL	$37, AX
   132		INT	$0x80
   133		RET
   134	
   135	TEXT runtime·mmap(SB),NOSPLIT,$32
   136		LEAL addr+0(FP), SI
   137		LEAL	4(SP), DI
   138		CLD
   139		MOVSL
   140		MOVSL
   141		MOVSL
   142		MOVSL
   143		MOVSL
   144		MOVSL
   145		MOVL	$0, AX	// top 32 bits of file offset
   146		STOSL
   147		MOVL	$477, AX
   148		INT	$0x80
   149		JAE	ok
   150		MOVL	$0, p+24(FP)
   151		MOVL	AX, err+28(FP)
   152		RET
   153	ok:
   154		MOVL	AX, p+24(FP)
   155		MOVL	$0, err+28(FP)
   156		RET
   157	
   158	TEXT runtime·munmap(SB),NOSPLIT,$-4
   159		MOVL	$73, AX
   160		INT	$0x80
   161		JAE	2(PC)
   162		MOVL	$0xf1, 0xf1  // crash
   163		RET
   164	
   165	TEXT runtime·madvise(SB),NOSPLIT,$-4
   166		MOVL	$75, AX	// madvise
   167		INT	$0x80
   168		JAE	2(PC)
   169		MOVL	$-1, AX
   170		MOVL	AX, ret+12(FP)
   171		RET
   172	
   173	TEXT runtime·setitimer(SB), NOSPLIT, $-4
   174		MOVL	$83, AX
   175		INT	$0x80
   176		RET
   177	
   178	// func fallback_walltime() (sec int64, nsec int32)
   179	TEXT runtime·fallback_walltime(SB), NOSPLIT, $32-12
   180		MOVL	$232, AX // clock_gettime
   181		LEAL	12(SP), BX
   182		MOVL	$0, 4(SP)	// CLOCK_REALTIME
   183		MOVL	BX, 8(SP)
   184		INT	$0x80
   185		MOVL	12(SP), AX	// sec
   186		MOVL	16(SP), BX	// nsec
   187	
   188		// sec is in AX, nsec in BX
   189		MOVL	AX, sec_lo+0(FP)
   190		MOVL	$0, sec_hi+4(FP)
   191		MOVL	BX, nsec+8(FP)
   192		RET
   193	
   194	// func fallback_nanotime() int64
   195	TEXT runtime·fallback_nanotime(SB), NOSPLIT, $32-8
   196		MOVL	$232, AX
   197		LEAL	12(SP), BX
   198		MOVL	$4, 4(SP)	// CLOCK_MONOTONIC
   199		MOVL	BX, 8(SP)
   200		INT	$0x80
   201		MOVL	12(SP), AX	// sec
   202		MOVL	16(SP), BX	// nsec
   203	
   204		// sec is in AX, nsec in BX
   205		// convert to DX:AX nsec
   206		MOVL	$1000000000, CX
   207		MULL	CX
   208		ADDL	BX, AX
   209		ADCL	$0, DX
   210	
   211		MOVL	AX, ret_lo+0(FP)
   212		MOVL	DX, ret_hi+4(FP)
   213		RET
   214	
   215	
   216	TEXT runtime·asmSigaction(SB),NOSPLIT,$-4
   217		MOVL	$416, AX
   218		INT	$0x80
   219		MOVL	AX, ret+12(FP)
   220		RET
   221	
   222	TEXT runtime·sigfwd(SB),NOSPLIT,$12-16
   223		MOVL	fn+0(FP), AX
   224		MOVL	sig+4(FP), BX
   225		MOVL	info+8(FP), CX
   226		MOVL	ctx+12(FP), DX
   227		MOVL	SP, SI
   228		SUBL	$32, SP
   229		ANDL	$~15, SP	// align stack: handler might be a C function
   230		MOVL	BX, 0(SP)
   231		MOVL	CX, 4(SP)
   232		MOVL	DX, 8(SP)
   233		MOVL	SI, 12(SP)	// save SI: handler might be a Go function
   234		CALL	AX
   235		MOVL	12(SP), AX
   236		MOVL	AX, SP
   237		RET
   238	
   239	// Called by OS using C ABI.
   240	TEXT runtime·sigtramp(SB),NOSPLIT,$12
   241		NOP	SP	// tell vet SP changed - stop checking offsets
   242		MOVL	16(SP), BX	// signo
   243		MOVL	BX, 0(SP)
   244		MOVL	20(SP), BX // info
   245		MOVL	BX, 4(SP)
   246		MOVL	24(SP), BX // context
   247		MOVL	BX, 8(SP)
   248		CALL	runtime·sigtrampgo(SB)
   249	
   250		// call sigreturn
   251		MOVL	24(SP), AX	// context
   252		MOVL	$0, 0(SP)	// syscall gap
   253		MOVL	AX, 4(SP)
   254		MOVL	$417, AX	// sigreturn(ucontext)
   255		INT	$0x80
   256		MOVL	$0xf1, 0xf1  // crash
   257		RET
   258	
   259	TEXT runtime·sigaltstack(SB),NOSPLIT,$0
   260		MOVL	$53, AX
   261		INT	$0x80
   262		JAE	2(PC)
   263		MOVL	$0xf1, 0xf1  // crash
   264		RET
   265	
   266	TEXT runtime·usleep(SB),NOSPLIT,$20
   267		MOVL	$0, DX
   268		MOVL	usec+0(FP), AX
   269		MOVL	$1000000, CX
   270		DIVL	CX
   271		MOVL	AX, 12(SP)		// tv_sec
   272		MOVL	$1000, AX
   273		MULL	DX
   274		MOVL	AX, 16(SP)		// tv_nsec
   275	
   276		MOVL	$0, 0(SP)
   277		LEAL	12(SP), AX
   278		MOVL	AX, 4(SP)		// arg 1 - rqtp
   279		MOVL	$0, 8(SP)		// arg 2 - rmtp
   280		MOVL	$240, AX		// sys_nanosleep
   281		INT	$0x80
   282		RET
   283	
   284	/*
   285	descriptor entry format for system call
   286	is the native machine format, ugly as it is:
   287	
   288		2-byte limit
   289		3-byte base
   290		1-byte: 0x80=present, 0x60=dpl<<5, 0x1F=type
   291		1-byte: 0x80=limit is *4k, 0x40=32-bit operand size,
   292			0x0F=4 more bits of limit
   293		1 byte: 8 more bits of base
   294	
   295	int i386_get_ldt(int, union ldt_entry *, int);
   296	int i386_set_ldt(int, const union ldt_entry *, int);
   297	
   298	*/
   299	
   300	// setldt(int entry, int address, int limit)
   301	TEXT runtime·setldt(SB),NOSPLIT,$32
   302		MOVL	base+4(FP), BX
   303		// see comment in sys_linux_386.s; freebsd is similar
   304		ADDL	$0x4, BX
   305	
   306		// set up data_desc
   307		LEAL	16(SP), AX	// struct data_desc
   308		MOVL	$0, 0(AX)
   309		MOVL	$0, 4(AX)
   310	
   311		MOVW	BX, 2(AX)
   312		SHRL	$16, BX
   313		MOVB	BX, 4(AX)
   314		SHRL	$8, BX
   315		MOVB	BX, 7(AX)
   316	
   317		MOVW	$0xffff, 0(AX)
   318		MOVB	$0xCF, 6(AX)	// 32-bit operand, 4k limit unit, 4 more bits of limit
   319	
   320		MOVB	$0xF2, 5(AX)	// r/w data descriptor, dpl=3, present
   321	
   322		// call i386_set_ldt(entry, desc, 1)
   323		MOVL	$0xffffffff, 0(SP)	// auto-allocate entry and return in AX
   324		MOVL	AX, 4(SP)
   325		MOVL	$1, 8(SP)
   326		CALL	i386_set_ldt<>(SB)
   327	
   328		// compute segment selector - (entry*8+7)
   329		SHLL	$3, AX
   330		ADDL	$7, AX
   331		MOVW	AX, GS
   332		RET
   333	
   334	TEXT i386_set_ldt<>(SB),NOSPLIT,$16
   335		LEAL	args+0(FP), AX	// 0(FP) == 4(SP) before SP got moved
   336		MOVL	$0, 0(SP)	// syscall gap
   337		MOVL	$1, 4(SP)
   338		MOVL	AX, 8(SP)
   339		MOVL	$165, AX
   340		INT	$0x80
   341		JAE	2(PC)
   342		INT	$3
   343		RET
   344	
   345	TEXT runtime·sysctl(SB),NOSPLIT,$28
   346		LEAL	mib+0(FP), SI
   347		LEAL	4(SP), DI
   348		CLD
   349		MOVSL				// arg 1 - name
   350		MOVSL				// arg 2 - namelen
   351		MOVSL				// arg 3 - oldp
   352		MOVSL				// arg 4 - oldlenp
   353		MOVSL				// arg 5 - newp
   354		MOVSL				// arg 6 - newlen
   355		MOVL	$202, AX		// sys___sysctl
   356		INT	$0x80
   357		JAE	4(PC)
   358		NEGL	AX
   359		MOVL	AX, ret+24(FP)
   360		RET
   361		MOVL	$0, AX
   362		MOVL	AX, ret+24(FP)
   363		RET
   364	
   365	TEXT runtime·osyield(SB),NOSPLIT,$-4
   366		MOVL	$331, AX		// sys_sched_yield
   367		INT	$0x80
   368		RET
   369	
   370	TEXT runtime·sigprocmask(SB),NOSPLIT,$16
   371		MOVL	$0, 0(SP)		// syscall gap
   372		MOVL	how+0(FP), AX		// arg 1 - how
   373		MOVL	AX, 4(SP)
   374		MOVL	new+4(FP), AX
   375		MOVL	AX, 8(SP)		// arg 2 - set
   376		MOVL	old+8(FP), AX
   377		MOVL	AX, 12(SP)		// arg 3 - oset
   378		MOVL	$340, AX		// sys_sigprocmask
   379		INT	$0x80
   380		JAE	2(PC)
   381		MOVL	$0xf1, 0xf1  // crash
   382		RET
   383	
   384	// int32 runtime·kqueue(void);
   385	TEXT runtime·kqueue(SB),NOSPLIT,$0
   386		MOVL	$362, AX
   387		INT	$0x80
   388		JAE	2(PC)
   389		NEGL	AX
   390		MOVL	AX, ret+0(FP)
   391		RET
   392	
   393	// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout);
   394	TEXT runtime·kevent(SB),NOSPLIT,$0
   395		MOVL	$363, AX
   396		INT	$0x80
   397		JAE	2(PC)
   398		NEGL	AX
   399		MOVL	AX, ret+24(FP)
   400		RET
   401	
   402	// int32 runtime·closeonexec(int32 fd);
   403	TEXT runtime·closeonexec(SB),NOSPLIT,$32
   404		MOVL	$92, AX		// fcntl
   405		// 0(SP) is where the caller PC would be; kernel skips it
   406		MOVL	fd+0(FP), BX
   407		MOVL	BX, 4(SP)	// fd
   408		MOVL	$2, 8(SP)	// F_SETFD
   409		MOVL	$1, 12(SP)	// FD_CLOEXEC
   410		INT	$0x80
   411		JAE	2(PC)
   412		NEGL	AX
   413		RET
   414	
   415	// func cpuset_getaffinity(level int, which int, id int64, size int, mask *byte) int32
   416	TEXT runtime·cpuset_getaffinity(SB), NOSPLIT, $0-28
   417		MOVL	$487, AX
   418		INT	$0x80
   419		JAE	2(PC)
   420		NEGL	AX
   421		MOVL	AX, ret+24(FP)
   422		RET
   423	
   424	GLOBL runtime·tlsoffset(SB),NOPTR,$4

View as plain text