github.com/x04/go/src@v0.0.0-20200202162449-3d481ceb3525/runtime/sys_darwin_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, Darwin
     6  // System calls are implemented in libSystem, this file contains
     7  // trampolines that convert from Go to C calling convention.
     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_trampoline(SB),NOSPLIT,$0
    15  	PUSHL	BP
    16  	MOVL	SP, BP
    17  	SUBL	$8, SP   	// allocate space for callee args (must be 8 mod 16)
    18  	MOVL	16(SP), CX	// arg ptr
    19  	MOVL	0(CX), AX	// arg 1 exit status
    20  	MOVL	AX, 0(SP)
    21  	CALL	libc_exit(SB)
    22  	MOVL	$0xf1, 0xf1  // crash
    23  	MOVL	BP, SP
    24  	POPL	BP
    25  	RET
    26  
    27  TEXT runtime·open_trampoline(SB),NOSPLIT,$0
    28  	PUSHL	BP
    29  	MOVL	SP, BP
    30  	SUBL	$24, SP
    31  	MOVL	32(SP), CX
    32  	MOVL	0(CX), AX		// arg 1 name
    33  	MOVL	AX, 0(SP)
    34  	MOVL	4(CX), AX		// arg 2 mode
    35  	MOVL	AX, 4(SP)
    36  	MOVL	8(CX), AX		// arg 3 perm
    37  	MOVL	AX, 8(SP)
    38  	CALL	libc_open(SB)
    39  	MOVL	BP, SP
    40  	POPL	BP
    41  	RET
    42  
    43  TEXT runtime·close_trampoline(SB),NOSPLIT,$0
    44  	PUSHL	BP
    45  	MOVL	SP, BP
    46  	SUBL	$8, SP
    47  	MOVL	16(SP), CX
    48  	MOVL	0(CX), AX		// arg 1 fd
    49  	MOVL	AX, 0(SP)
    50  	CALL	libc_close(SB)
    51  	MOVL	BP, SP
    52  	POPL	BP
    53  	RET
    54  
    55  TEXT runtime·read_trampoline(SB),NOSPLIT,$0
    56  	PUSHL	BP
    57  	MOVL	SP, BP
    58  	SUBL	$24, SP
    59  	MOVL	32(SP), CX
    60  	MOVL	0(CX), AX		// arg 1 fd
    61  	MOVL	AX, 0(SP)
    62  	MOVL	4(CX), AX		// arg 2 buf
    63  	MOVL	AX, 4(SP)
    64  	MOVL	8(CX), AX		// arg 3 count
    65  	MOVL	AX, 8(SP)
    66  	CALL	libc_read(SB)
    67  	TESTL	AX, AX
    68  	JGE	noerr
    69  	CALL	libc_error(SB)
    70  	MOVL	(AX), AX
    71  	NEGL	AX			// caller expects negative errno value
    72  noerr:
    73  	MOVL	BP, SP
    74  	POPL	BP
    75  	RET
    76  
    77  TEXT runtime·write_trampoline(SB),NOSPLIT,$0
    78  	PUSHL	BP
    79  	MOVL	SP, BP
    80  	SUBL	$24, SP
    81  	MOVL	32(SP), CX
    82  	MOVL	0(CX), AX		// arg 1 fd
    83  	MOVL	AX, 0(SP)
    84  	MOVL	4(CX), AX		// arg 2 buf
    85  	MOVL	AX, 4(SP)
    86  	MOVL	8(CX), AX		// arg 3 count
    87  	MOVL	AX, 8(SP)
    88  	CALL	libc_write(SB)
    89  	TESTL	AX, AX
    90  	JGE	noerr
    91  	CALL	libc_error(SB)
    92  	MOVL	(AX), AX
    93  	NEGL	AX			// caller expects negative errno value
    94  noerr:
    95  	MOVL	BP, SP
    96  	POPL	BP
    97  	RET
    98  
    99  TEXT runtime·pipe_trampoline(SB),NOSPLIT,$0
   100  	PUSHL	BP
   101  	MOVL	SP, BP
   102  	SUBL	$8, SP
   103  	MOVL	16(SP), AX		// arg 1 pipefd
   104  	MOVL	AX, 0(SP)
   105  	CALL	libc_pipe(SB)
   106  	TESTL	AX, AX
   107  	JEQ	3(PC)
   108  	CALL	libc_error(SB)		// return negative errno value
   109  	NEGL	AX
   110  	MOVL	BP, SP
   111  	POPL	BP
   112  	RET
   113  
   114  TEXT runtime·mmap_trampoline(SB),NOSPLIT,$0
   115  	PUSHL	BP
   116  	MOVL	SP, BP
   117  	SUBL	$24, SP
   118  	MOVL	32(SP), CX
   119  	MOVL	0(CX), AX		// arg 1 addr
   120  	MOVL	AX, 0(SP)
   121  	MOVL	4(CX), AX		// arg 2 len
   122  	MOVL	AX, 4(SP)
   123  	MOVL	8(CX), AX		// arg 3 prot
   124  	MOVL	AX, 8(SP)
   125  	MOVL	12(CX), AX		// arg 4 flags
   126  	MOVL	AX, 12(SP)
   127  	MOVL	16(CX), AX		// arg 5 fid
   128  	MOVL	AX, 16(SP)
   129  	MOVL	20(CX), AX		// arg 6 offset
   130  	MOVL	AX, 20(SP)
   131  	CALL	libc_mmap(SB)
   132  	XORL	DX, DX
   133  	CMPL	AX, $-1
   134  	JNE	ok
   135  	CALL	libc_error(SB)
   136  	MOVL	(AX), DX		// errno
   137  	XORL	AX, AX
   138  ok:
   139  	MOVL	32(SP), CX
   140  	MOVL	AX, 24(CX)		// result pointer
   141  	MOVL	DX, 28(CX)		// errno
   142  	MOVL	BP, SP
   143  	POPL	BP
   144  	RET
   145  
   146  TEXT runtime·madvise_trampoline(SB),NOSPLIT,$0
   147  	PUSHL	BP
   148  	MOVL	SP, BP
   149  	SUBL	$24, SP
   150  	MOVL	32(SP), CX
   151  	MOVL	0(CX), AX		// arg 1 addr
   152  	MOVL	AX, 0(SP)
   153  	MOVL	4(CX), AX		// arg 2 len
   154  	MOVL	AX, 4(SP)
   155  	MOVL	8(CX), AX		// arg 3 advice
   156  	MOVL	AX, 8(SP)
   157  	CALL	libc_madvise(SB)
   158  	// ignore failure - maybe pages are locked
   159  	MOVL	BP, SP
   160  	POPL	BP
   161  	RET
   162  
   163  TEXT runtime·munmap_trampoline(SB),NOSPLIT,$0
   164  	PUSHL	BP
   165  	MOVL	SP, BP
   166  	SUBL	$8, SP
   167  	MOVL	16(SP), CX
   168  	MOVL	0(CX), AX		// arg 1 addr
   169  	MOVL	AX, 0(SP)
   170  	MOVL	4(CX), AX		// arg 2 len
   171  	MOVL	AX, 4(SP)
   172  	CALL	libc_munmap(SB)
   173  	TESTL	AX, AX
   174  	JEQ	2(PC)
   175  	MOVL	$0xf1, 0xf1  // crash
   176  	MOVL	BP, SP
   177  	POPL	BP
   178  	RET
   179  
   180  TEXT runtime·setitimer_trampoline(SB),NOSPLIT,$0
   181  	PUSHL	BP
   182  	MOVL	SP, BP
   183  	SUBL	$24, SP
   184  	MOVL	32(SP), CX
   185  	MOVL	0(CX), AX		// arg 1 mode
   186  	MOVL	AX, 0(SP)
   187  	MOVL	4(CX), AX		// arg 2 new
   188  	MOVL	AX, 4(SP)
   189  	MOVL	8(CX), AX		// arg 3 old
   190  	MOVL	AX, 8(SP)
   191  	CALL	libc_setitimer(SB)
   192  	MOVL	BP, SP
   193  	POPL	BP
   194  	RET
   195  
   196  TEXT runtime·walltime_trampoline(SB),NOSPLIT,$0
   197  	PUSHL	BP
   198  	MOVL	SP, BP
   199  	SUBL	$8, SP
   200  	MOVL	16(SP), AX
   201  	MOVL	AX, 0(SP)	// *timeval
   202  	MOVL	$0, 4(SP)	// no timezone needed
   203  	CALL	libc_gettimeofday(SB)
   204  	MOVL	BP, SP
   205  	POPL	BP
   206  	RET
   207  
   208  GLOBL timebase<>(SB),NOPTR,$(machTimebaseInfo__size)
   209  
   210  TEXT runtime·nanotime_trampoline(SB),NOSPLIT,$0
   211  	PUSHL	BP
   212  	MOVL	SP, BP
   213  	SUBL	$8+(machTimebaseInfo__size+15)/16*16, SP
   214  	CALL	libc_mach_absolute_time(SB)
   215  	MOVL	16+(machTimebaseInfo__size+15)/16*16(SP), CX
   216  	MOVL	AX, 0(CX)
   217  	MOVL	DX, 4(CX)
   218  	MOVL	timebase<>+machTimebaseInfo_denom(SB), DI // atomic read
   219  	MOVL	timebase<>+machTimebaseInfo_numer(SB), SI
   220  	TESTL	DI, DI
   221  	JNE	initialized
   222  
   223  	LEAL	4(SP), AX
   224  	MOVL	AX, 0(SP)
   225  	CALL	libc_mach_timebase_info(SB)
   226  	MOVL	4+machTimebaseInfo_numer(SP), SI
   227  	MOVL	4+machTimebaseInfo_denom(SP), DI
   228  
   229  	MOVL	SI, timebase<>+machTimebaseInfo_numer(SB)
   230  	MOVL	DI, AX
   231  	XCHGL	AX, timebase<>+machTimebaseInfo_denom(SB) // atomic write
   232  	MOVL	16+(machTimebaseInfo__size+15)/16*16(SP), CX
   233  
   234  initialized:
   235  	MOVL	SI, 8(CX)
   236  	MOVL	DI, 12(CX)
   237  	MOVL	BP, SP
   238  	POPL	BP
   239  	RET
   240  
   241  TEXT runtime·sigaction_trampoline(SB),NOSPLIT,$0
   242  	PUSHL	BP
   243  	MOVL	SP, BP
   244  	SUBL	$24, SP
   245  	MOVL	32(SP), CX
   246  	MOVL	0(CX), AX		// arg 1 sig
   247  	MOVL	AX, 0(SP)
   248  	MOVL	4(CX), AX		// arg 2 new
   249  	MOVL	AX, 4(SP)
   250  	MOVL	8(CX), AX		// arg 3 old
   251  	MOVL	AX, 8(SP)
   252  	CALL	libc_sigaction(SB)
   253  	TESTL	AX, AX
   254  	JEQ	2(PC)
   255  	MOVL	$0xf1, 0xf1  // crash
   256  	MOVL	BP, SP
   257  	POPL	BP
   258  	RET
   259  
   260  TEXT runtime·sigprocmask_trampoline(SB),NOSPLIT,$0
   261  	PUSHL	BP
   262  	MOVL	SP, BP
   263  	SUBL	$24, SP
   264  	MOVL	32(SP), CX
   265  	MOVL	0(CX), AX		// arg 1 how
   266  	MOVL	AX, 0(SP)
   267  	MOVL	4(CX), AX		// arg 2 new
   268  	MOVL	AX, 4(SP)
   269  	MOVL	8(CX), AX		// arg 3 old
   270  	MOVL	AX, 8(SP)
   271  	CALL	libc_pthread_sigmask(SB)
   272  	TESTL	AX, AX
   273  	JEQ	2(PC)
   274  	MOVL	$0xf1, 0xf1  // crash
   275  	MOVL	BP, SP
   276  	POPL	BP
   277  	RET
   278  
   279  TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0
   280  	PUSHL	BP
   281  	MOVL	SP, BP
   282  	SUBL	$8, SP
   283  	MOVL	16(SP), CX
   284  	MOVL	0(CX), AX		// arg 1 new
   285  	MOVL	AX, 0(SP)
   286  	MOVL	4(CX), AX		// arg 2 old
   287  	MOVL	AX, 4(SP)
   288  	CALL	libc_sigaltstack(SB)
   289  	TESTL	AX, AX
   290  	JEQ	2(PC)
   291  	MOVL	$0xf1, 0xf1  // crash
   292  	MOVL	BP, SP
   293  	POPL	BP
   294  	RET
   295  
   296  TEXT runtime·raiseproc_trampoline(SB),NOSPLIT,$0
   297  	PUSHL	BP
   298  	MOVL	SP, BP
   299  	SUBL	$8, SP
   300  	CALL	libc_getpid(SB)
   301  	MOVL	AX, 0(SP)	// arg 1 pid
   302  	MOVL	16(SP), CX
   303  	MOVL	0(CX), AX
   304  	MOVL	AX, 4(SP)	// arg 2 signal
   305  	CALL	libc_kill(SB)
   306  	MOVL	BP, SP
   307  	POPL	BP
   308  	RET
   309  
   310  TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
   311  	MOVL	fn+0(FP), AX
   312  	MOVL	sig+4(FP), BX
   313  	MOVL	info+8(FP), CX
   314  	MOVL	ctx+12(FP), DX
   315  	MOVL	SP, SI
   316  	SUBL	$32, SP
   317  	ANDL	$~15, SP	// align stack: handler might be a C function
   318  	MOVL	BX, 0(SP)
   319  	MOVL	CX, 4(SP)
   320  	MOVL	DX, 8(SP)
   321  	MOVL	SI, 12(SP)	// save SI: handler might be a Go function
   322  	CALL	AX
   323  	MOVL	12(SP), AX
   324  	MOVL	AX, SP
   325  	RET
   326  
   327  // Sigtramp's job is to call the actual signal handler.
   328  // It is called with the C calling convention, and calls out
   329  // to sigtrampgo with the Go calling convention.
   330  TEXT runtime·sigtramp(SB),NOSPLIT,$0
   331  	SUBL	$28, SP
   332  
   333  	// Save callee-save registers.
   334  	MOVL	BP, 12(SP)
   335  	MOVL	BX, 16(SP)
   336  	MOVL	SI, 20(SP)
   337  	MOVL	DI, 24(SP)
   338  
   339  	MOVL	32(SP), AX
   340  	MOVL	AX, 0(SP)	// arg 1 signal number
   341  	MOVL	36(SP), AX
   342  	MOVL	AX, 4(SP)	// arg 2 siginfo
   343  	MOVL	40(SP), AX
   344  	MOVL	AX, 8(SP)	// arg 3 ctxt
   345  	CALL	runtime·sigtrampgo(SB)
   346  
   347  	// Restore callee-save registers.
   348  	MOVL	12(SP), BP
   349  	MOVL	16(SP), BX
   350  	MOVL	20(SP), SI
   351  	MOVL	24(SP), DI
   352  
   353  	ADDL	$28, SP
   354  	RET
   355  
   356  TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
   357  	JMP	runtime·sigtramp(SB)
   358  
   359  TEXT runtime·usleep_trampoline(SB),NOSPLIT,$0
   360  	PUSHL	BP
   361  	MOVL	SP, BP
   362  	SUBL	$8, SP
   363  	MOVL	16(SP), CX
   364  	MOVL	0(CX), AX	// arg 1 usec
   365  	MOVL	AX, 0(SP)
   366  	CALL	libc_usleep(SB)
   367  	MOVL	BP, SP
   368  	POPL	BP
   369  	RET
   370  
   371  // func setldt(entry int, address int, limit int)
   372  TEXT runtime·setldt(SB),NOSPLIT,$32
   373  	// Nothing to do on Darwin, pthread already set thread-local storage up.
   374  	RET
   375  
   376  TEXT runtime·sysctl_trampoline(SB),NOSPLIT,$0
   377  	PUSHL	BP
   378  	MOVL	SP, BP
   379  	SUBL	$24, SP
   380  	MOVL	32(SP), CX
   381  	MOVL	0(CX), AX		// arg 1 mib
   382  	MOVL	AX, 0(SP)
   383  	MOVL	4(CX), AX		// arg 2 miblen
   384  	MOVL	AX, 4(SP)
   385  	MOVL	8(CX), AX		// arg 3 out
   386  	MOVL	AX, 8(SP)
   387  	MOVL	12(CX), AX		// arg 4 size
   388  	MOVL	AX, 12(SP)
   389  	MOVL	16(CX), AX		// arg 5 dst
   390  	MOVL	AX, 16(SP)
   391  	MOVL	20(CX), AX		// arg 6 ndst
   392  	MOVL	AX, 20(SP)
   393  	CALL	libc_sysctl(SB)
   394  	MOVL	BP, SP
   395  	POPL	BP
   396  	RET
   397  
   398  TEXT runtime·kqueue_trampoline(SB),NOSPLIT,$0
   399  	PUSHL	BP
   400  	MOVL	SP, BP
   401  	SUBL	$8, SP
   402  	CALL	libc_kqueue(SB)
   403  	MOVL	BP, SP
   404  	POPL	BP
   405  	RET
   406  
   407  TEXT runtime·kevent_trampoline(SB),NOSPLIT,$0
   408  	PUSHL	BP
   409  	MOVL	SP, BP
   410  	SUBL	$24, SP
   411  	MOVL	32(SP), CX
   412  	MOVL	0(CX), AX		// arg 1 kq
   413  	MOVL	AX, 0(SP)
   414  	MOVL	4(CX), AX		// arg 2 ch
   415  	MOVL	AX, 4(SP)
   416  	MOVL	8(CX), AX		// arg 3 nch
   417  	MOVL	AX, 8(SP)
   418  	MOVL	12(CX), AX		// arg 4 ev
   419  	MOVL	AX, 12(SP)
   420  	MOVL	16(CX), AX		// arg 5 nev
   421  	MOVL	AX, 16(SP)
   422  	MOVL	20(CX), AX		// arg 6 ts
   423  	MOVL	AX, 20(SP)
   424  	CALL	libc_kevent(SB)
   425  	CMPL	AX, $-1
   426  	JNE	ok
   427  	CALL	libc_error(SB)
   428  	MOVL	(AX), AX		// errno
   429  	NEGL	AX			// caller wants it as a negative error code
   430  ok:
   431  	MOVL	BP, SP
   432  	POPL	BP
   433  	RET
   434  
   435  TEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0
   436  	PUSHL	BP
   437  	MOVL	SP, BP
   438  	SUBL	$24, SP
   439  	MOVL	32(SP), CX
   440  	MOVL	0(CX), AX		// arg 1 fd
   441  	MOVL	AX, 0(SP)
   442  	MOVL	4(CX), AX		// arg 2 cmd
   443  	MOVL	AX, 4(SP)
   444  	MOVL	8(CX), AX		// arg 3 arg
   445  	MOVL	AX, 8(SP)
   446  	CALL	libc_fcntl(SB)
   447  	MOVL	BP, SP
   448  	POPL	BP
   449  	RET
   450  
   451  // mstart_stub is the first function executed on a new thread started by pthread_create.
   452  // It just does some low-level setup and then calls mstart.
   453  // Note: called with the C calling convention.
   454  TEXT runtime·mstart_stub(SB),NOSPLIT,$0
   455  	// The value at SP+4 points to the m.
   456  	// We are already on m's g0 stack.
   457  
   458  	// Save callee-save registers.
   459  	SUBL	$16, SP
   460  	MOVL	BP, 0(SP)
   461  	MOVL	BX, 4(SP)
   462  	MOVL	SI, 8(SP)
   463  	MOVL	DI, 12(SP)
   464  
   465  	MOVL	SP, AX       // hide argument read from vet (vet thinks this function is using the Go calling convention)
   466  	MOVL	20(AX), DI   // m
   467  	MOVL	m_g0(DI), DX // g
   468  
   469  	// Initialize TLS entry.
   470  	// See cmd/link/internal/ld/sym.go:computeTLSOffset.
   471  	MOVL	DX, 0x18(GS)
   472  
   473  	// Someday the convention will be D is always cleared.
   474  	CLD
   475  
   476  	CALL	runtime·mstart(SB)
   477  
   478  	// Restore callee-save registers.
   479  	MOVL	0(SP), BP
   480  	MOVL	4(SP), BX
   481  	MOVL	8(SP), SI
   482  	MOVL	12(SP), DI
   483  
   484  	// Go is all done with this OS thread.
   485  	// Tell pthread everything is ok (we never join with this thread, so
   486  	// the value here doesn't really matter).
   487  	XORL	AX, AX
   488  
   489  	ADDL	$16, SP
   490  	RET
   491  
   492  TEXT runtime·pthread_attr_init_trampoline(SB),NOSPLIT,$0
   493  	PUSHL	BP
   494  	MOVL	SP, BP
   495  	SUBL	$8, SP
   496  	MOVL	16(SP), CX
   497  	MOVL	0(CX), AX	// arg 1 attr
   498  	MOVL	AX, 0(SP)
   499  	CALL	libc_pthread_attr_init(SB)
   500  	MOVL	BP, SP
   501  	POPL	BP
   502  	RET
   503  
   504  TEXT runtime·pthread_attr_getstacksize_trampoline(SB),NOSPLIT,$0
   505  	PUSHL	BP
   506  	MOVL	SP, BP
   507  	SUBL	$8, SP
   508  	MOVL	16(SP), CX
   509  	MOVL	0(CX), AX	// arg 1 attr
   510  	MOVL	AX, 0(SP)
   511  	MOVL	4(CX), AX	// arg 2 size
   512  	MOVL	AX, 4(SP)
   513  	CALL	libc_pthread_attr_getstacksize(SB)
   514  	MOVL	BP, SP
   515  	POPL	BP
   516  	RET
   517  
   518  TEXT runtime·pthread_attr_setdetachstate_trampoline(SB),NOSPLIT,$0
   519  	PUSHL	BP
   520  	MOVL	SP, BP
   521  	SUBL	$8, SP
   522  	MOVL	16(SP), CX
   523  	MOVL	0(CX), AX	// arg 1 attr
   524  	MOVL	AX, 0(SP)
   525  	MOVL	4(CX), AX	// arg 2 state
   526  	MOVL	AX, 4(SP)
   527  	CALL	libc_pthread_attr_setdetachstate(SB)
   528  	MOVL	BP, SP
   529  	POPL	BP
   530  	RET
   531  
   532  TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0
   533  	PUSHL	BP
   534  	MOVL	SP, BP
   535  	SUBL	$24, SP
   536  	MOVL	32(SP), CX
   537  	LEAL	16(SP), AX	// arg "0" &threadid (which we throw away)
   538  	MOVL	AX, 0(SP)
   539  	MOVL	0(CX), AX	// arg 1 attr
   540  	MOVL	AX, 4(SP)
   541  	MOVL	4(CX), AX	// arg 2 start
   542  	MOVL	AX, 8(SP)
   543  	MOVL	8(CX), AX	// arg 3 arg
   544  	MOVL	AX, 12(SP)
   545  	CALL	libc_pthread_create(SB)
   546  	MOVL	BP, SP
   547  	POPL	BP
   548  	RET
   549  
   550  TEXT runtime·raise_trampoline(SB),NOSPLIT,$0
   551  	PUSHL   BP
   552  	MOVL    SP, BP
   553  	SUBL	$8, SP
   554  	MOVL	16(SP), CX
   555  	MOVL    0(CX), AX	// arg 1 sig
   556  	MOVL	AX, 0(SP)
   557  	CALL    libc_raise(SB)
   558  	MOVL    BP, SP
   559  	POPL    BP
   560  	RET
   561  
   562  TEXT runtime·pthread_mutex_init_trampoline(SB),NOSPLIT,$0
   563  	PUSHL	BP
   564  	MOVL	SP, BP
   565  	SUBL	$8, SP
   566  	MOVL	16(SP), CX
   567  	MOVL	0(CX), AX	// arg 1 mutex
   568  	MOVL	AX, 0(SP)
   569  	MOVL	4(CX), AX	// arg 2 attr
   570  	MOVL	AX, 4(SP)
   571  	CALL	libc_pthread_mutex_init(SB)
   572  	MOVL	BP, SP
   573  	POPL	BP
   574  	RET
   575  
   576  TEXT runtime·pthread_mutex_lock_trampoline(SB),NOSPLIT,$0
   577  	PUSHL	BP
   578  	MOVL	SP, BP
   579  	SUBL	$8, SP
   580  	MOVL	16(SP), CX
   581  	MOVL	0(CX), AX	// arg 1 mutex
   582  	MOVL	AX, 0(SP)
   583  	CALL	libc_pthread_mutex_lock(SB)
   584  	MOVL	BP, SP
   585  	POPL	BP
   586  	RET
   587  
   588  TEXT runtime·pthread_mutex_unlock_trampoline(SB),NOSPLIT,$0
   589  	PUSHL	BP
   590  	MOVL	SP, BP
   591  	SUBL	$8, SP
   592  	MOVL	16(SP), CX
   593  	MOVL	0(CX), AX	// arg 1 mutex
   594  	MOVL	AX, 0(SP)
   595  	CALL	libc_pthread_mutex_unlock(SB)
   596  	MOVL	BP, SP
   597  	POPL	BP
   598  	RET
   599  
   600  TEXT runtime·pthread_cond_init_trampoline(SB),NOSPLIT,$0
   601  	PUSHL	BP
   602  	MOVL	SP, BP
   603  	SUBL	$8, SP
   604  	MOVL	16(SP), CX
   605  	MOVL	0(CX), AX	// arg 1 cond
   606  	MOVL	AX, 0(SP)
   607  	MOVL	4(CX), AX	// arg 2 attr
   608  	MOVL	AX, 4(SP)
   609  	CALL	libc_pthread_cond_init(SB)
   610  	MOVL	BP, SP
   611  	POPL	BP
   612  	RET
   613  
   614  TEXT runtime·pthread_cond_wait_trampoline(SB),NOSPLIT,$0
   615  	PUSHL	BP
   616  	MOVL	SP, BP
   617  	SUBL	$8, SP
   618  	MOVL	16(SP), CX
   619  	MOVL	0(CX), AX	// arg 1 cond
   620  	MOVL	AX, 0(SP)
   621  	MOVL	4(CX), AX	// arg 2 mutex
   622  	MOVL	AX, 4(SP)
   623  	CALL	libc_pthread_cond_wait(SB)
   624  	MOVL	BP, SP
   625  	POPL	BP
   626  	RET
   627  
   628  TEXT runtime·pthread_cond_timedwait_relative_np_trampoline(SB),NOSPLIT,$0
   629  	PUSHL	BP
   630  	MOVL	SP, BP
   631  	SUBL	$24, SP
   632  	MOVL	32(SP), CX
   633  	MOVL	0(CX), AX	// arg 1 cond
   634  	MOVL	AX, 0(SP)
   635  	MOVL	4(CX), AX	// arg 2 mutex
   636  	MOVL	AX, 4(SP)
   637  	MOVL	8(CX), AX	// arg 3 timeout
   638  	MOVL	AX, 8(SP)
   639  	CALL	libc_pthread_cond_timedwait_relative_np(SB)
   640  	MOVL	BP, SP
   641  	POPL	BP
   642  	RET
   643  
   644  TEXT runtime·pthread_cond_signal_trampoline(SB),NOSPLIT,$0
   645  	PUSHL	BP
   646  	MOVL	SP, BP
   647  	SUBL	$8, SP
   648  	MOVL	16(SP), CX
   649  	MOVL	0(CX), AX	// arg 1 cond
   650  	MOVL	AX, 0(SP)
   651  	CALL	libc_pthread_cond_signal(SB)
   652  	MOVL	BP, SP
   653  	POPL	BP
   654  	RET
   655  
   656  TEXT runtime·pthread_self_trampoline(SB),NOSPLIT,$0
   657  	PUSHL	BP
   658  	MOVL	SP, BP
   659  	NOP	SP	// hide SP from vet
   660  	CALL	libc_pthread_self(SB)
   661  	MOVL	8(SP), CX
   662  	MOVL	AX, 0(CX)		// return value
   663  	MOVL	BP, SP
   664  	POPL	BP
   665  	RET
   666  
   667  TEXT runtime·pthread_kill_trampoline(SB),NOSPLIT,$0
   668  	PUSHL	BP
   669  	MOVL	SP, BP
   670  	SUBL	$8, SP
   671  	MOVL	16(SP), CX
   672  	MOVL	0(CX), AX	// arg 1 thread
   673  	MOVL	AX, 0(SP)
   674  	MOVL	4(CX), AX	// arg 2 sig
   675  	MOVL	AX, 4(SP)
   676  	CALL	libc_pthread_kill(SB)
   677  	MOVL	BP, SP
   678  	POPL	BP
   679  	RET
   680  
   681  // syscall calls a function in libc on behalf of the syscall package.
   682  // syscall takes a pointer to a struct like:
   683  // struct {
   684  //	fn    uintptr
   685  //	a1    uintptr
   686  //	a2    uintptr
   687  //	a3    uintptr
   688  //	r1    uintptr
   689  //	r2    uintptr
   690  //	err   uintptr
   691  // }
   692  // syscall must be called on the g0 stack with the
   693  // C calling convention (use libcCall).
   694  TEXT runtime·syscall(SB),NOSPLIT,$0
   695  	PUSHL	BP
   696  	MOVL	SP, BP
   697  	SUBL	$24, SP
   698  	MOVL	32(SP), CX
   699  	MOVL	(0*4)(CX), AX // fn
   700  	MOVL	(1*4)(CX), DX // a1
   701  	MOVL	DX, 0(SP)
   702  	MOVL	(2*4)(CX), DX // a2
   703  	MOVL	DX, 4(SP)
   704  	MOVL	(3*4)(CX), DX // a3
   705  	MOVL	DX, 8(SP)
   706  
   707  	CALL	AX
   708  
   709  	MOVL	32(SP), CX
   710  	MOVL	AX, (4*4)(CX) // r1
   711  	MOVL	DX, (5*4)(CX) // r2
   712  
   713  	// Standard libc functions return -1 on error
   714  	// and set errno.
   715  	CMPL	AX, $-1
   716  	JNE	ok
   717  
   718  	// Get error code from libc.
   719  	CALL	libc_error(SB)
   720  	MOVL	(AX), AX
   721  	MOVL	32(SP), CX
   722  	MOVL	AX, (6*4)(CX) // err
   723  
   724  ok:
   725  	XORL	AX, AX        // no error (it's ignored anyway)
   726  	MOVL	BP, SP
   727  	POPL	BP
   728  	RET
   729  
   730  // syscallPtr is like syscall except the libc function reports an
   731  // error by returning NULL and setting errno.
   732  TEXT runtime·syscallPtr(SB),NOSPLIT,$0
   733  	PUSHL	BP
   734  	MOVL	SP, BP
   735  	SUBL	$24, SP
   736  	MOVL	32(SP), CX
   737  	MOVL	(0*4)(CX), AX // fn
   738  	MOVL	(1*4)(CX), DX // a1
   739  	MOVL	DX, 0(SP)
   740  	MOVL	(2*4)(CX), DX // a2
   741  	MOVL	DX, 4(SP)
   742  	MOVL	(3*4)(CX), DX // a3
   743  	MOVL	DX, 8(SP)
   744  
   745  	CALL	AX
   746  
   747  	MOVL	32(SP), CX
   748  	MOVL	AX, (4*4)(CX) // r1
   749  	MOVL	DX, (5*4)(CX) // r2
   750  
   751  	// syscallPtr libc functions return NULL on error
   752  	// and set errno.
   753  	TESTL	AX, AX
   754  	JNE	ok
   755  
   756  	// Get error code from libc.
   757  	CALL	libc_error(SB)
   758  	MOVL	(AX), AX
   759  	MOVL	32(SP), CX
   760  	MOVL	AX, (6*4)(CX) // err
   761  
   762  ok:
   763  	XORL	AX, AX        // no error (it's ignored anyway)
   764  	MOVL	BP, SP
   765  	POPL	BP
   766  	RET
   767  
   768  // syscall6 calls a function in libc on behalf of the syscall package.
   769  // syscall6 takes a pointer to a struct like:
   770  // struct {
   771  //	fn    uintptr
   772  //	a1    uintptr
   773  //	a2    uintptr
   774  //	a3    uintptr
   775  //	a4    uintptr
   776  //	a5    uintptr
   777  //	a6    uintptr
   778  //	r1    uintptr
   779  //	r2    uintptr
   780  //	err   uintptr
   781  // }
   782  // syscall6 must be called on the g0 stack with the
   783  // C calling convention (use libcCall).
   784  TEXT runtime·syscall6(SB),NOSPLIT,$0
   785  	PUSHL	BP
   786  	MOVL	SP, BP
   787  	SUBL	$24, SP
   788  	MOVL	32(SP), CX
   789  	MOVL	(0*4)(CX), AX // fn
   790  	MOVL	(1*4)(CX), DX // a1
   791  	MOVL	DX, 0(SP)
   792  	MOVL	(2*4)(CX), DX // a2
   793  	MOVL	DX, 4(SP)
   794  	MOVL	(3*4)(CX), DX // a3
   795  	MOVL	DX, 8(SP)
   796  	MOVL	(4*4)(CX), DX // a4
   797  	MOVL	DX, 12(SP)
   798  	MOVL	(5*4)(CX), DX // a5
   799  	MOVL	DX, 16(SP)
   800  	MOVL	(6*4)(CX), DX // a6
   801  	MOVL	DX, 20(SP)
   802  
   803  	CALL	AX
   804  
   805  	MOVL	32(SP), CX
   806  	MOVL	AX, (7*4)(CX) // r1
   807  	MOVL	DX, (8*4)(CX) // r2
   808  
   809  	// Standard libc functions return -1 on error
   810  	// and set errno.
   811  	CMPL	AX, $-1
   812  	JNE	ok
   813  
   814  	// Get error code from libc.
   815  	CALL	libc_error(SB)
   816  	MOVL	(AX), AX
   817  	MOVL	32(SP), CX
   818  	MOVL	AX, (9*4)(CX) // err
   819  
   820  ok:
   821  	XORL	AX, AX        // no error (it's ignored anyway)
   822  	MOVL	BP, SP
   823  	POPL	BP
   824  	RET
   825  
   826  // syscall6X calls a function in libc on behalf of the syscall package.
   827  // syscall6X takes a pointer to a struct like:
   828  // struct {
   829  //	fn    uintptr
   830  //	a1    uintptr
   831  //	a2    uintptr
   832  //	a3    uintptr
   833  //	a4    uintptr
   834  //	a5    uintptr
   835  //	a6    uintptr
   836  //	r1    uintptr
   837  //	r2    uintptr
   838  //	err   uintptr
   839  // }
   840  // syscall6X must be called on the g0 stack with the
   841  // C calling convention (use libcCall).
   842  TEXT runtime·syscall6X(SB),NOSPLIT,$0
   843  	PUSHL	BP
   844  	MOVL	SP, BP
   845  	SUBL	$24, SP
   846  	MOVL	32(SP), CX
   847  	MOVL	(0*4)(CX), AX // fn
   848  	MOVL	(1*4)(CX), DX // a1
   849  	MOVL	DX, 0(SP)
   850  	MOVL	(2*4)(CX), DX // a2
   851  	MOVL	DX, 4(SP)
   852  	MOVL	(3*4)(CX), DX // a3
   853  	MOVL	DX, 8(SP)
   854  	MOVL	(4*4)(CX), DX // a4
   855  	MOVL	DX, 12(SP)
   856  	MOVL	(5*4)(CX), DX // a5
   857  	MOVL	DX, 16(SP)
   858  	MOVL	(6*4)(CX), DX // a6
   859  	MOVL	DX, 20(SP)
   860  
   861  	CALL	AX
   862  
   863  	MOVL	32(SP), CX
   864  	MOVL	AX, (7*4)(CX) // r1
   865  	MOVL	DX, (8*4)(CX) // r2
   866  
   867  	// Standard libc functions return -1 on error
   868  	// and set errno.
   869  	CMPL	AX, $-1
   870  	JNE	ok
   871  	CMPL	DX, $-1
   872  	JNE	ok
   873  
   874  	// Get error code from libc.
   875  	CALL	libc_error(SB)
   876  	MOVL	(AX), AX
   877  	MOVL	32(SP), CX
   878  	MOVL	AX, (9*4)(CX) // err
   879  
   880  ok:
   881  	XORL	AX, AX        // no error (it's ignored anyway)
   882  	MOVL	BP, SP
   883  	POPL	BP
   884  	RET
   885  
   886  // syscall9 calls a function in libc on behalf of the syscall package.
   887  // syscall9 takes a pointer to a struct like:
   888  // struct {
   889  //	fn    uintptr
   890  //	a1    uintptr
   891  //	a2    uintptr
   892  //	a3    uintptr
   893  //	a4    uintptr
   894  //	a5    uintptr
   895  //	a6    uintptr
   896  //	a7    uintptr
   897  //	a8    uintptr
   898  //	a9    uintptr
   899  //	r1    uintptr
   900  //	r2    uintptr
   901  //	err   uintptr
   902  // }
   903  // syscall9 must be called on the g0 stack with the
   904  // C calling convention (use libcCall).
   905  TEXT runtime·syscall9(SB),NOSPLIT,$0
   906  	PUSHL	BP
   907  	MOVL	SP, BP
   908  	SUBL	$40, SP
   909  	MOVL	48(SP), CX
   910  	MOVL	(0*4)(CX), AX // fn
   911  	MOVL	(1*4)(CX), DX // a1
   912  	MOVL	DX, 0(SP)
   913  	MOVL	(2*4)(CX), DX // a2
   914  	MOVL	DX, 4(SP)
   915  	MOVL	(3*4)(CX), DX // a3
   916  	MOVL	DX, 8(SP)
   917  	MOVL	(4*4)(CX), DX // a4
   918  	MOVL	DX, 12(SP)
   919  	MOVL	(5*4)(CX), DX // a5
   920  	MOVL	DX, 16(SP)
   921  	MOVL	(6*4)(CX), DX // a6
   922  	MOVL	DX, 20(SP)
   923  	MOVL	(7*4)(CX), DX // a7
   924  	MOVL	DX, 24(SP)
   925  	MOVL	(8*4)(CX), DX // a8
   926  	MOVL	DX, 28(SP)
   927  	MOVL	(9*4)(CX), DX // a9
   928  	MOVL	DX, 32(SP)
   929  
   930  	CALL	AX
   931  
   932  	MOVL	48(SP), CX
   933  	MOVL	AX, (10*4)(CX) // r1
   934  	MOVL	DX, (11*4)(CX) // r2
   935  
   936  	// Standard libc functions return -1 on error
   937  	// and set errno.
   938  	CMPL	AX, $-1
   939  	JNE	ok
   940  
   941  	// Get error code from libc.
   942  	CALL	libc_error(SB)
   943  	MOVL	(AX), AX
   944  	MOVL	48(SP), CX
   945  	MOVL	AX, (12*4)(CX) // err
   946  
   947  ok:
   948  	XORL	AX, AX        // no error (it's ignored anyway)
   949  	MOVL	BP, SP
   950  	POPL	BP
   951  	RET