github.com/reiver/go@v0.0.0-20150109200633-1d0c7792f172/src/runtime/sys_netbsd_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, 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  // Exit the entire program (like C exit)
    14  TEXT runtime·exit(SB),NOSPLIT,$-4
    15  	MOVL	$1, AX
    16  	INT	$0x80
    17  	MOVL	$0xf1, 0xf1		// crash
    18  	RET
    19  
    20  TEXT runtime·exit1(SB),NOSPLIT,$-4
    21  	MOVL	$310, AX		// sys__lwp_exit
    22  	INT	$0x80
    23  	JAE	2(PC)
    24  	MOVL	$0xf1, 0xf1		// crash
    25  	RET
    26  
    27  TEXT runtime·open(SB),NOSPLIT,$-4
    28  	MOVL	$5, AX
    29  	INT	$0x80
    30  	MOVL	AX, ret+12(FP)
    31  	RET
    32  
    33  TEXT runtime·close(SB),NOSPLIT,$-4
    34  	MOVL	$6, AX
    35  	INT	$0x80
    36  	MOVL	AX, ret+4(FP)
    37  	RET
    38  
    39  TEXT runtime·read(SB),NOSPLIT,$-4
    40  	MOVL	$3, AX
    41  	INT	$0x80
    42  	MOVL	AX, ret+12(FP)
    43  	RET
    44  
    45  TEXT runtime·write(SB),NOSPLIT,$-4
    46  	MOVL	$4, AX			// sys_write
    47  	INT	$0x80
    48  	MOVL	AX, ret+12(FP)
    49  	RET
    50  
    51  TEXT runtime·usleep(SB),NOSPLIT,$24
    52  	MOVL	$0, DX
    53  	MOVL	usec+0(FP), AX
    54  	MOVL	$1000000, CX
    55  	DIVL	CX
    56  	MOVL	AX, 12(SP)		// tv_sec - l32
    57  	MOVL	$0, 16(SP)		// tv_sec - h32
    58  	MOVL	$1000, AX
    59  	MULL	DX
    60  	MOVL	AX, 20(SP)		// tv_nsec
    61  
    62  	MOVL	$0, 0(SP)
    63  	LEAL	12(SP), AX
    64  	MOVL	AX, 4(SP)		// arg 1 - rqtp
    65  	MOVL	$0, 8(SP)		// arg 2 - rmtp
    66  	MOVL	$430, AX		// sys_nanosleep
    67  	INT	$0x80
    68  	RET
    69  
    70  TEXT runtime·raise(SB),NOSPLIT,$12
    71  	MOVL	$311, AX		// sys__lwp_self
    72  	INT	$0x80
    73  	MOVL	$0, 0(SP)
    74  	MOVL	AX, 4(SP)		// arg 1 - target
    75  	MOVL	sig+0(FP), AX
    76  	MOVL	AX, 8(SP)		// arg 2 - signo
    77  	MOVL	$318, AX		// sys__lwp_kill
    78  	INT	$0x80
    79  	RET
    80  
    81  TEXT runtime·mmap(SB),NOSPLIT,$36
    82  	LEAL	addr+0(FP), SI
    83  	LEAL	4(SP), DI
    84  	CLD
    85  	MOVSL				// arg 1 - addr
    86  	MOVSL				// arg 2 - len
    87  	MOVSL				// arg 3 - prot
    88  	MOVSL				// arg 4 - flags
    89  	MOVSL				// arg 5 - fd
    90  	MOVL	$0, AX
    91  	STOSL				// arg 6 - pad
    92  	MOVSL				// arg 7 - offset
    93  	MOVL	$0, AX			// top 32 bits of file offset
    94  	STOSL
    95  	MOVL	$197, AX		// sys_mmap
    96  	INT	$0x80
    97  	MOVL	AX, ret+24(FP)
    98  	RET
    99  
   100  TEXT runtime·munmap(SB),NOSPLIT,$-4
   101  	MOVL	$73, AX			// sys_munmap
   102  	INT	$0x80
   103  	JAE	2(PC)
   104  	MOVL	$0xf1, 0xf1		// crash
   105  	RET
   106  
   107  TEXT runtime·madvise(SB),NOSPLIT,$-4
   108  	MOVL	$75, AX			// sys_madvise
   109  	INT	$0x80
   110  	// ignore failure - maybe pages are locked
   111  	RET
   112  
   113  TEXT runtime·setitimer(SB),NOSPLIT,$-4
   114  	MOVL	$425, AX		// sys_setitimer
   115  	INT	$0x80
   116  	RET
   117  
   118  // func now() (sec int64, nsec int32)
   119  TEXT time·now(SB), NOSPLIT, $32
   120  	LEAL	12(SP), BX
   121  	MOVL	$0, 4(SP)		// arg 1 - clock_id
   122  	MOVL	BX, 8(SP)		// arg 2 - tp
   123  	MOVL	$427, AX		// sys_clock_gettime
   124  	INT	$0x80
   125  
   126  	MOVL	12(SP), AX		// sec - l32
   127  	MOVL	AX, sec+0(FP)
   128  	MOVL	16(SP), AX		// sec - h32
   129  	MOVL	AX, sec+4(FP)
   130  
   131  	MOVL	20(SP), BX		// nsec
   132  	MOVL	BX, nsec+8(FP)
   133  	RET
   134  
   135  // int64 nanotime(void) so really
   136  // void nanotime(int64 *nsec)
   137  TEXT runtime·nanotime(SB),NOSPLIT,$32
   138  	LEAL	12(SP), BX
   139  	MOVL	$0, 4(SP)		// arg 1 - clock_id
   140  	MOVL	BX, 8(SP)		// arg 2 - tp
   141  	MOVL	$427, AX		// sys_clock_gettime
   142  	INT	$0x80
   143  
   144  	MOVL	16(SP), CX		// sec - h32
   145  	IMULL	$1000000000, CX
   146  
   147  	MOVL	12(SP), AX		// sec - l32
   148  	MOVL	$1000000000, BX
   149  	MULL	BX			// result in dx:ax
   150  
   151  	MOVL	20(SP), BX		// nsec
   152  	ADDL	BX, AX
   153  	ADCL	CX, DX			// add high bits with carry
   154  
   155  	MOVL	AX, ret_lo+0(FP)
   156  	MOVL	DX, ret_hi+4(FP)
   157  	RET
   158  
   159  TEXT runtime·getcontext(SB),NOSPLIT,$-4
   160  	MOVL	$307, AX		// sys_getcontext
   161  	INT	$0x80
   162  	JAE	2(PC)
   163  	MOVL	$0xf1, 0xf1		// crash
   164  	RET
   165  
   166  TEXT runtime·sigprocmask(SB),NOSPLIT,$-4
   167  	MOVL	$293, AX		// sys_sigprocmask
   168  	INT	$0x80
   169  	JAE	2(PC)
   170  	MOVL	$0xf1, 0xf1		// crash
   171  	RET
   172  
   173  TEXT runtime·sigreturn_tramp(SB),NOSPLIT,$0
   174  	LEAL	140(SP), AX		// Load address of ucontext
   175  	MOVL	AX, 4(SP)
   176  	MOVL	$308, AX		// sys_setcontext
   177  	INT	$0x80
   178  	MOVL	$-1, 4(SP)		// Something failed...
   179  	MOVL	$1, AX			// sys_exit
   180  	INT	$0x80
   181  
   182  TEXT runtime·sigaction(SB),NOSPLIT,$24
   183  	LEAL	sig+0(FP), SI
   184  	LEAL	4(SP), DI
   185  	CLD
   186  	MOVSL				// arg 1 - sig
   187  	MOVSL				// arg 2 - act
   188  	MOVSL				// arg 3 - oact
   189  	LEAL	runtime·sigreturn_tramp(SB), AX
   190  	STOSL				// arg 4 - tramp
   191  	MOVL	$2, AX
   192  	STOSL				// arg 5 - vers
   193  	MOVL	$340, AX		// sys___sigaction_sigtramp
   194  	INT	$0x80
   195  	JAE	2(PC)
   196  	MOVL	$0xf1, 0xf1		// crash
   197  	RET
   198  
   199  TEXT runtime·sigtramp(SB),NOSPLIT,$44
   200  	get_tls(CX)
   201  
   202  	// check that g exists
   203  	MOVL	g(CX), DI
   204  	CMPL	DI, $0
   205  	JNE	6(PC)
   206  	MOVL	signo+0(FP), BX
   207  	MOVL	BX, 0(SP)
   208  	MOVL	$runtime·badsignal(SB), AX
   209  	CALL	AX
   210  	RET
   211  
   212  	// save g
   213  	MOVL	DI, 20(SP)
   214  
   215  	// g = m->gsignal
   216  	MOVL	g_m(DI), BX
   217  	MOVL	m_gsignal(BX), BX
   218  	MOVL	BX, g(CX)
   219  
   220  	// copy arguments for call to sighandler
   221  	MOVL	signo+0(FP), BX
   222  	MOVL	BX, 0(SP)
   223  	MOVL	info+4(FP), BX
   224  	MOVL	BX, 4(SP)
   225  	MOVL	context+8(FP), BX
   226  	MOVL	BX, 8(SP)
   227  	MOVL	DI, 12(SP)
   228  
   229  	CALL	runtime·sighandler(SB)
   230  
   231  	// restore g
   232  	get_tls(CX)
   233  	MOVL	20(SP), BX
   234  	MOVL	BX, g(CX)
   235  	RET
   236  
   237  // int32 lwp_create(void *context, uintptr flags, void *lwpid);
   238  TEXT runtime·lwp_create(SB),NOSPLIT,$16
   239  	MOVL	$0, 0(SP)
   240  	MOVL	ctxt+0(FP), AX
   241  	MOVL	AX, 4(SP)		// arg 1 - context
   242  	MOVL	flags+4(FP), AX
   243  	MOVL	AX, 8(SP)		// arg 2 - flags
   244  	MOVL	lwpid+8(FP), AX
   245  	MOVL	AX, 12(SP)		// arg 3 - lwpid
   246  	MOVL	$309, AX		// sys__lwp_create
   247  	INT	$0x80
   248  	JCC	2(PC)
   249  	NEGL	AX
   250  	MOVL	AX, ret+12(FP)
   251  	RET
   252  
   253  TEXT runtime·lwp_tramp(SB),NOSPLIT,$0
   254  
   255  	// Set FS to point at m->tls
   256  	LEAL	m_tls(BX), BP
   257  	PUSHAL				// save registers
   258  	PUSHL	BP
   259  	CALL	runtime·settls(SB)
   260  	POPL	AX
   261  	POPAL
   262  
   263  	// Now segment is established.  Initialize m, g.
   264  	get_tls(AX)
   265  	MOVL	DX, g(AX)
   266  	MOVL	BX, g_m(DX)
   267  
   268  	CALL	runtime·stackcheck(SB)	// smashes AX, CX
   269  	MOVL	0(DX), DX		// paranoia; check they are not nil
   270  	MOVL	0(BX), BX
   271  
   272  	// more paranoia; check that stack splitting code works
   273  	PUSHAL
   274  	CALL	runtime·emptyfunc(SB)
   275  	POPAL
   276  
   277  	// Call fn
   278  	CALL	SI
   279  
   280  	CALL	runtime·exit1(SB)
   281  	MOVL	$0x1234, 0x1005
   282  	RET
   283  
   284  TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
   285  	MOVL	$281, AX		// sys___sigaltstack14
   286  	MOVL	new+4(SP), BX
   287  	MOVL	old+8(SP), CX
   288  	INT	$0x80
   289  	CMPL	AX, $0xfffff001
   290  	JLS	2(PC)
   291  	INT	$3
   292  	RET
   293  
   294  TEXT runtime·setldt(SB),NOSPLIT,$8
   295  	// Under NetBSD we set the GS base instead of messing with the LDT.
   296  	MOVL	16(SP), AX		// tls0
   297  	MOVL	AX, 0(SP)
   298  	CALL	runtime·settls(SB)
   299  	RET
   300  
   301  TEXT runtime·settls(SB),NOSPLIT,$16
   302  	// adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
   303  	MOVL	base+0(FP), CX
   304  	ADDL	$8, CX
   305  	MOVL	$0, 0(SP)		// syscall gap
   306  	MOVL	CX, 4(SP)		// arg 1 - ptr
   307  	MOVL	$317, AX		// sys__lwp_setprivate
   308  	INT	$0x80
   309  	JCC	2(PC)
   310  	MOVL	$0xf1, 0xf1		// crash
   311  	RET
   312  
   313  TEXT runtime·osyield(SB),NOSPLIT,$-4
   314  	MOVL	$350, AX		// sys_sched_yield
   315  	INT	$0x80
   316  	RET
   317  
   318  TEXT runtime·lwp_park(SB),NOSPLIT,$-4
   319  	MOVL	$434, AX		// sys__lwp_park
   320  	INT	$0x80
   321  	MOVL	AX, ret+16(FP)
   322  	RET
   323  
   324  TEXT runtime·lwp_unpark(SB),NOSPLIT,$-4
   325  	MOVL	$321, AX		// sys__lwp_unpark
   326  	INT	$0x80
   327  	MOVL	AX, ret+8(FP)
   328  	RET
   329  
   330  TEXT runtime·lwp_self(SB),NOSPLIT,$-4
   331  	MOVL	$311, AX		// sys__lwp_self
   332  	INT	$0x80
   333  	MOVL	AX, ret+0(FP)
   334  	RET
   335  
   336  TEXT runtime·sysctl(SB),NOSPLIT,$28
   337  	LEAL	mib+0(FP), SI
   338  	LEAL	4(SP), DI
   339  	CLD
   340  	MOVSL				// arg 1 - name
   341  	MOVSL				// arg 2 - namelen
   342  	MOVSL				// arg 3 - oldp
   343  	MOVSL				// arg 4 - oldlenp
   344  	MOVSL				// arg 5 - newp
   345  	MOVSL				// arg 6 - newlen
   346  	MOVL	$202, AX		// sys___sysctl
   347  	INT	$0x80
   348  	JCC	3(PC)
   349  	NEGL	AX
   350  	RET
   351  	MOVL	$0, AX
   352  	RET
   353  
   354  GLOBL runtime·tlsoffset(SB),NOPTR,$4
   355  
   356  // int32 runtime·kqueue(void)
   357  TEXT runtime·kqueue(SB),NOSPLIT,$0
   358  	MOVL	$344, AX
   359  	INT	$0x80
   360  	JAE	2(PC)
   361  	NEGL	AX
   362  	MOVL	AX, ret+0(FP)
   363  	RET
   364  
   365  // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout)
   366  TEXT runtime·kevent(SB),NOSPLIT,$0
   367  	MOVL	$435, AX
   368  	INT	$0x80
   369  	JAE	2(PC)
   370  	NEGL	AX
   371  	MOVL	AX, ret+24(FP)
   372  	RET
   373  
   374  // int32 runtime·closeonexec(int32 fd)
   375  TEXT runtime·closeonexec(SB),NOSPLIT,$32
   376  	MOVL	$92, AX		// fcntl
   377  	// 0(SP) is where the caller PC would be; kernel skips it
   378  	MOVL	fd+0(FP), BX
   379  	MOVL	BX, 4(SP)	// fd
   380  	MOVL	$2, 8(SP)	// F_SETFD
   381  	MOVL	$1, 12(SP)	// FD_CLOEXEC
   382  	INT	$0x80
   383  	JAE	2(PC)
   384  	NEGL	AX
   385  	RET