github.com/x04/go/src@v0.0.0-20200202162449-3d481ceb3525/runtime/sys_freebsd_386.s (about)

     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  	NEGL	AX			// caller expects negative errno
    97  	MOVL	AX, ret+12(FP)
    98  	RET
    99  
   100  // func pipe() (r, w int32, errno int32)
   101  TEXT runtime·pipe(SB),NOSPLIT,$8-12
   102  	MOVL	$42, AX
   103  	INT	$0x80
   104  	JAE	ok
   105  	MOVL	$0, r+0(FP)
   106  	MOVL	$0, w+4(FP)
   107  	MOVL	AX, errno+8(FP)
   108  	RET
   109  ok:
   110  	MOVL	AX, r+0(FP)
   111  	MOVL	DX, w+4(FP)
   112  	MOVL	$0, errno+8(FP)
   113  	RET
   114  
   115  // func pipe2(flags int32) (r, w int32, errno int32)
   116  TEXT runtime·pipe2(SB),NOSPLIT,$12-16
   117  	MOVL	$542, AX
   118  	LEAL	r+4(FP), BX
   119  	MOVL	BX, 4(SP)
   120  	MOVL	flags+0(FP), BX
   121  	MOVL	BX, 8(SP)
   122  	INT	$0x80
   123  	MOVL	AX, errno+12(FP)
   124  	RET
   125  
   126  TEXT runtime·write1(SB),NOSPLIT,$-4
   127  	MOVL	$4, AX
   128  	INT	$0x80
   129  	JAE	2(PC)
   130  	NEGL	AX			// caller expects negative errno
   131  	MOVL	AX, ret+12(FP)
   132  	RET
   133  
   134  TEXT runtime·thr_self(SB),NOSPLIT,$8-4
   135  	// thr_self(&0(FP))
   136  	LEAL	ret+0(FP), AX
   137  	MOVL	AX, 4(SP)
   138  	MOVL	$432, AX
   139  	INT	$0x80
   140  	RET
   141  
   142  TEXT runtime·thr_kill(SB),NOSPLIT,$-4
   143  	// thr_kill(tid, sig)
   144  	MOVL	$433, AX
   145  	INT	$0x80
   146  	RET
   147  
   148  TEXT runtime·raiseproc(SB),NOSPLIT,$16
   149  	// getpid
   150  	MOVL	$20, AX
   151  	INT	$0x80
   152  	// kill(self, sig)
   153  	MOVL	AX, 4(SP)
   154  	MOVL	sig+0(FP), AX
   155  	MOVL	AX, 8(SP)
   156  	MOVL	$37, AX
   157  	INT	$0x80
   158  	RET
   159  
   160  TEXT runtime·mmap(SB),NOSPLIT,$32
   161  	LEAL addr+0(FP), SI
   162  	LEAL	4(SP), DI
   163  	CLD
   164  	MOVSL
   165  	MOVSL
   166  	MOVSL
   167  	MOVSL
   168  	MOVSL
   169  	MOVSL
   170  	MOVL	$0, AX	// top 32 bits of file offset
   171  	STOSL
   172  	MOVL	$477, AX
   173  	INT	$0x80
   174  	JAE	ok
   175  	MOVL	$0, p+24(FP)
   176  	MOVL	AX, err+28(FP)
   177  	RET
   178  ok:
   179  	MOVL	AX, p+24(FP)
   180  	MOVL	$0, err+28(FP)
   181  	RET
   182  
   183  TEXT runtime·munmap(SB),NOSPLIT,$-4
   184  	MOVL	$73, AX
   185  	INT	$0x80
   186  	JAE	2(PC)
   187  	MOVL	$0xf1, 0xf1  // crash
   188  	RET
   189  
   190  TEXT runtime·madvise(SB),NOSPLIT,$-4
   191  	MOVL	$75, AX	// madvise
   192  	INT	$0x80
   193  	JAE	2(PC)
   194  	MOVL	$-1, AX
   195  	MOVL	AX, ret+12(FP)
   196  	RET
   197  
   198  TEXT runtime·setitimer(SB), NOSPLIT, $-4
   199  	MOVL	$83, AX
   200  	INT	$0x80
   201  	RET
   202  
   203  // func fallback_walltime() (sec int64, nsec int32)
   204  TEXT runtime·fallback_walltime(SB), NOSPLIT, $32-12
   205  	MOVL	$232, AX // clock_gettime
   206  	LEAL	12(SP), BX
   207  	MOVL	$0, 4(SP)	// CLOCK_REALTIME
   208  	MOVL	BX, 8(SP)
   209  	INT	$0x80
   210  	MOVL	12(SP), AX	// sec
   211  	MOVL	16(SP), BX	// nsec
   212  
   213  	// sec is in AX, nsec in BX
   214  	MOVL	AX, sec_lo+0(FP)
   215  	MOVL	$0, sec_hi+4(FP)
   216  	MOVL	BX, nsec+8(FP)
   217  	RET
   218  
   219  // func fallback_nanotime() int64
   220  TEXT runtime·fallback_nanotime(SB), NOSPLIT, $32-8
   221  	MOVL	$232, AX
   222  	LEAL	12(SP), BX
   223  	MOVL	$4, 4(SP)	// CLOCK_MONOTONIC
   224  	MOVL	BX, 8(SP)
   225  	INT	$0x80
   226  	MOVL	12(SP), AX	// sec
   227  	MOVL	16(SP), BX	// nsec
   228  
   229  	// sec is in AX, nsec in BX
   230  	// convert to DX:AX nsec
   231  	MOVL	$1000000000, CX
   232  	MULL	CX
   233  	ADDL	BX, AX
   234  	ADCL	$0, DX
   235  
   236  	MOVL	AX, ret_lo+0(FP)
   237  	MOVL	DX, ret_hi+4(FP)
   238  	RET
   239  
   240  
   241  TEXT runtime·asmSigaction(SB),NOSPLIT,$-4
   242  	MOVL	$416, AX
   243  	INT	$0x80
   244  	MOVL	AX, ret+12(FP)
   245  	RET
   246  
   247  TEXT runtime·sigfwd(SB),NOSPLIT,$12-16
   248  	MOVL	fn+0(FP), AX
   249  	MOVL	sig+4(FP), BX
   250  	MOVL	info+8(FP), CX
   251  	MOVL	ctx+12(FP), DX
   252  	MOVL	SP, SI
   253  	SUBL	$32, SP
   254  	ANDL	$~15, SP	// align stack: handler might be a C function
   255  	MOVL	BX, 0(SP)
   256  	MOVL	CX, 4(SP)
   257  	MOVL	DX, 8(SP)
   258  	MOVL	SI, 12(SP)	// save SI: handler might be a Go function
   259  	CALL	AX
   260  	MOVL	12(SP), AX
   261  	MOVL	AX, SP
   262  	RET
   263  
   264  // Called by OS using C ABI.
   265  TEXT runtime·sigtramp(SB),NOSPLIT,$12
   266  	NOP	SP	// tell vet SP changed - stop checking offsets
   267  	MOVL	16(SP), BX	// signo
   268  	MOVL	BX, 0(SP)
   269  	MOVL	20(SP), BX // info
   270  	MOVL	BX, 4(SP)
   271  	MOVL	24(SP), BX // context
   272  	MOVL	BX, 8(SP)
   273  	CALL	runtime·sigtrampgo(SB)
   274  
   275  	// call sigreturn
   276  	MOVL	24(SP), AX	// context
   277  	MOVL	$0, 0(SP)	// syscall gap
   278  	MOVL	AX, 4(SP)
   279  	MOVL	$417, AX	// sigreturn(ucontext)
   280  	INT	$0x80
   281  	MOVL	$0xf1, 0xf1  // crash
   282  	RET
   283  
   284  TEXT runtime·sigaltstack(SB),NOSPLIT,$0
   285  	MOVL	$53, AX
   286  	INT	$0x80
   287  	JAE	2(PC)
   288  	MOVL	$0xf1, 0xf1  // crash
   289  	RET
   290  
   291  TEXT runtime·usleep(SB),NOSPLIT,$20
   292  	MOVL	$0, DX
   293  	MOVL	usec+0(FP), AX
   294  	MOVL	$1000000, CX
   295  	DIVL	CX
   296  	MOVL	AX, 12(SP)		// tv_sec
   297  	MOVL	$1000, AX
   298  	MULL	DX
   299  	MOVL	AX, 16(SP)		// tv_nsec
   300  
   301  	MOVL	$0, 0(SP)
   302  	LEAL	12(SP), AX
   303  	MOVL	AX, 4(SP)		// arg 1 - rqtp
   304  	MOVL	$0, 8(SP)		// arg 2 - rmtp
   305  	MOVL	$240, AX		// sys_nanosleep
   306  	INT	$0x80
   307  	RET
   308  
   309  /*
   310  descriptor entry format for system call
   311  is the native machine format, ugly as it is:
   312  
   313  	2-byte limit
   314  	3-byte base
   315  	1-byte: 0x80=present, 0x60=dpl<<5, 0x1F=type
   316  	1-byte: 0x80=limit is *4k, 0x40=32-bit operand size,
   317  		0x0F=4 more bits of limit
   318  	1 byte: 8 more bits of base
   319  
   320  int i386_get_ldt(int, union ldt_entry *, int);
   321  int i386_set_ldt(int, const union ldt_entry *, int);
   322  
   323  */
   324  
   325  // setldt(int entry, int address, int limit)
   326  TEXT runtime·setldt(SB),NOSPLIT,$32
   327  	MOVL	base+4(FP), BX
   328  	// see comment in sys_linux_386.s; freebsd is similar
   329  	ADDL	$0x4, BX
   330  
   331  	// set up data_desc
   332  	LEAL	16(SP), AX	// struct data_desc
   333  	MOVL	$0, 0(AX)
   334  	MOVL	$0, 4(AX)
   335  
   336  	MOVW	BX, 2(AX)
   337  	SHRL	$16, BX
   338  	MOVB	BX, 4(AX)
   339  	SHRL	$8, BX
   340  	MOVB	BX, 7(AX)
   341  
   342  	MOVW	$0xffff, 0(AX)
   343  	MOVB	$0xCF, 6(AX)	// 32-bit operand, 4k limit unit, 4 more bits of limit
   344  
   345  	MOVB	$0xF2, 5(AX)	// r/w data descriptor, dpl=3, present
   346  
   347  	// call i386_set_ldt(entry, desc, 1)
   348  	MOVL	$0xffffffff, 0(SP)	// auto-allocate entry and return in AX
   349  	MOVL	AX, 4(SP)
   350  	MOVL	$1, 8(SP)
   351  	CALL	i386_set_ldt<>(SB)
   352  
   353  	// compute segment selector - (entry*8+7)
   354  	SHLL	$3, AX
   355  	ADDL	$7, AX
   356  	MOVW	AX, GS
   357  	RET
   358  
   359  TEXT i386_set_ldt<>(SB),NOSPLIT,$16
   360  	LEAL	args+0(FP), AX	// 0(FP) == 4(SP) before SP got moved
   361  	MOVL	$0, 0(SP)	// syscall gap
   362  	MOVL	$1, 4(SP)
   363  	MOVL	AX, 8(SP)
   364  	MOVL	$165, AX
   365  	INT	$0x80
   366  	JAE	2(PC)
   367  	INT	$3
   368  	RET
   369  
   370  TEXT runtime·sysctl(SB),NOSPLIT,$28
   371  	LEAL	mib+0(FP), SI
   372  	LEAL	4(SP), DI
   373  	CLD
   374  	MOVSL				// arg 1 - name
   375  	MOVSL				// arg 2 - namelen
   376  	MOVSL				// arg 3 - oldp
   377  	MOVSL				// arg 4 - oldlenp
   378  	MOVSL				// arg 5 - newp
   379  	MOVSL				// arg 6 - newlen
   380  	MOVL	$202, AX		// sys___sysctl
   381  	INT	$0x80
   382  	JAE	4(PC)
   383  	NEGL	AX
   384  	MOVL	AX, ret+24(FP)
   385  	RET
   386  	MOVL	$0, AX
   387  	MOVL	AX, ret+24(FP)
   388  	RET
   389  
   390  TEXT runtime·osyield(SB),NOSPLIT,$-4
   391  	MOVL	$331, AX		// sys_sched_yield
   392  	INT	$0x80
   393  	RET
   394  
   395  TEXT runtime·sigprocmask(SB),NOSPLIT,$16
   396  	MOVL	$0, 0(SP)		// syscall gap
   397  	MOVL	how+0(FP), AX		// arg 1 - how
   398  	MOVL	AX, 4(SP)
   399  	MOVL	new+4(FP), AX
   400  	MOVL	AX, 8(SP)		// arg 2 - set
   401  	MOVL	old+8(FP), AX
   402  	MOVL	AX, 12(SP)		// arg 3 - oset
   403  	MOVL	$340, AX		// sys_sigprocmask
   404  	INT	$0x80
   405  	JAE	2(PC)
   406  	MOVL	$0xf1, 0xf1  // crash
   407  	RET
   408  
   409  // int32 runtime·kqueue(void);
   410  TEXT runtime·kqueue(SB),NOSPLIT,$0
   411  	MOVL	$362, AX
   412  	INT	$0x80
   413  	JAE	2(PC)
   414  	NEGL	AX
   415  	MOVL	AX, ret+0(FP)
   416  	RET
   417  
   418  // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout);
   419  TEXT runtime·kevent(SB),NOSPLIT,$0
   420  	MOVL	$363, AX
   421  	INT	$0x80
   422  	JAE	2(PC)
   423  	NEGL	AX
   424  	MOVL	AX, ret+24(FP)
   425  	RET
   426  
   427  // int32 runtime·closeonexec(int32 fd);
   428  TEXT runtime·closeonexec(SB),NOSPLIT,$32
   429  	MOVL	$92, AX		// fcntl
   430  	// 0(SP) is where the caller PC would be; kernel skips it
   431  	MOVL	fd+0(FP), BX
   432  	MOVL	BX, 4(SP)	// fd
   433  	MOVL	$2, 8(SP)	// F_SETFD
   434  	MOVL	$1, 12(SP)	// FD_CLOEXEC
   435  	INT	$0x80
   436  	JAE	2(PC)
   437  	NEGL	AX
   438  	RET
   439  
   440  // func runtime·setNonblock(fd int32)
   441  TEXT runtime·setNonblock(SB),NOSPLIT,$16-4
   442  	MOVL	$92, AX // fcntl
   443  	MOVL	fd+0(FP), BX // fd
   444  	MOVL	BX, 4(SP)
   445  	MOVL	$3, 8(SP) // F_GETFL
   446  	MOVL	$0, 12(SP)
   447  	INT	$0x80
   448  	MOVL	fd+0(FP), BX // fd
   449  	MOVL	BX, 4(SP)
   450  	MOVL	$4, 8(SP) // F_SETFL
   451  	ORL	$4, AX // O_NONBLOCK
   452  	MOVL	AX, 12(SP)
   453  	MOVL	$92, AX // fcntl
   454  	INT	$0x80
   455  	RET
   456  
   457  // func cpuset_getaffinity(level int, which int, id int64, size int, mask *byte) int32
   458  TEXT runtime·cpuset_getaffinity(SB), NOSPLIT, $0-28
   459  	MOVL	$487, AX
   460  	INT	$0x80
   461  	JAE	2(PC)
   462  	NEGL	AX
   463  	MOVL	AX, ret+24(FP)
   464  	RET
   465  
   466  GLOBL runtime·tlsoffset(SB),NOPTR,$4