github.com/megatontech/mynoteforgo@v0.0.0-20200507084910-5d0c6ea6e890/源码/runtime/sys_nacl_amd64p32.s (about)

     1  // Copyright 2013 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  #include "go_asm.h"
     6  #include "go_tls.h"
     7  #include "textflag.h"
     8  #include "syscall_nacl.h"
     9  
    10  #define NACL_SYSCALL(code) \
    11  	MOVL $(0x10000 + ((code)<<5)), AX; CALL AX
    12  
    13  TEXT runtime·settls(SB),NOSPLIT,$0
    14  	MOVL	DI, TLS // really BP
    15  	RET
    16  
    17  TEXT runtime·exit(SB),NOSPLIT,$0
    18  	MOVL code+0(FP), DI
    19  	NACL_SYSCALL(SYS_exit)
    20  	RET
    21  
    22  // func exitThread(wait *uint32)
    23  TEXT runtime·exitThread(SB),NOSPLIT,$0-4
    24  	MOVL wait+0(FP), DI
    25  	// SYS_thread_exit will clear *wait when the stack is free.
    26  	NACL_SYSCALL(SYS_thread_exit)
    27  	JMP 0(PC)
    28  
    29  TEXT runtime·open(SB),NOSPLIT,$0
    30  	MOVL name+0(FP), DI
    31  	MOVL mode+4(FP), SI
    32  	MOVL perm+8(FP), DX
    33  	NACL_SYSCALL(SYS_open)
    34  	MOVL AX, ret+16(FP)
    35  	RET
    36  
    37  TEXT runtime·closefd(SB),NOSPLIT,$0
    38  	MOVL fd+0(FP), DI
    39  	NACL_SYSCALL(SYS_close)
    40  	MOVL AX, ret+8(FP)
    41  	RET
    42  
    43  TEXT runtime·read(SB),NOSPLIT,$0
    44  	MOVL fd+0(FP), DI
    45  	MOVL p+4(FP), SI
    46  	MOVL n+8(FP), DX
    47  	NACL_SYSCALL(SYS_read)
    48  	MOVL AX, ret+16(FP)
    49  	RET
    50  
    51  TEXT syscall·naclWrite(SB), NOSPLIT, $24-20
    52  	MOVL arg1+0(FP), DI
    53  	MOVL arg2+4(FP), SI
    54  	MOVL arg3+8(FP), DX
    55  	MOVL DI, 0(SP)
    56  	MOVL SI, 4(SP)
    57  	MOVL DX, 8(SP)
    58  	CALL runtime·write(SB)
    59  	MOVL 16(SP), AX
    60  	MOVL AX, ret+16(FP)
    61  	RET
    62  
    63  TEXT runtime·write(SB),NOSPLIT,$16-20
    64  	// If using fake time and writing to stdout or stderr,
    65  	// emit playback header before actual data.
    66  	MOVQ runtime·faketime(SB), AX
    67  	CMPQ AX, $0
    68  	JEQ write
    69  	MOVL fd+0(FP), DI
    70  	CMPL DI, $1
    71  	JEQ playback
    72  	CMPL DI, $2
    73  	JEQ playback
    74  
    75  write:
    76  	// Ordinary write.
    77  	MOVL fd+0(FP), DI
    78  	MOVL p+4(FP), SI
    79  	MOVL n+8(FP), DX
    80  	NACL_SYSCALL(SYS_write)
    81  	MOVL	AX, ret+16(FP)
    82  	RET
    83  
    84  	// Write with playback header.
    85  	// First, lock to avoid interleaving writes.
    86  playback:
    87  	MOVL $1, BX
    88  	XCHGL	runtime·writelock(SB), BX
    89  	CMPL BX, $0
    90  	JNE playback
    91  
    92  	MOVQ runtime·lastfaketime(SB), CX
    93  	MOVL runtime·lastfaketimefd(SB), BX
    94  	CMPL DI, BX
    95  	JE samefd
    96  
    97  	// If the current fd doesn't match the fd of the previous write,
    98  	// ensure that the timestamp is strictly greater. That way, we can
    99  	// recover the original order even if we read the fds separately.
   100  	INCQ CX
   101  	MOVL DI, runtime·lastfaketimefd(SB)
   102  
   103  samefd:
   104  	CMPQ AX, CX
   105  	CMOVQLT CX, AX
   106  	MOVQ AX, runtime·lastfaketime(SB)
   107  
   108  	// Playback header: 0 0 P B <8-byte time> <4-byte data length>
   109  	MOVL $(('B'<<24) | ('P'<<16)), 0(SP)
   110  	BSWAPQ AX
   111  	MOVQ AX, 4(SP)
   112  	MOVL n+8(FP), DX
   113  	BSWAPL DX
   114  	MOVL DX, 12(SP)
   115  	MOVL fd+0(FP), DI
   116  	MOVL SP, SI
   117  	MOVL $16, DX
   118  	NACL_SYSCALL(SYS_write)
   119  
   120  	// Write actual data.
   121  	MOVL fd+0(FP), DI
   122  	MOVL p+4(FP), SI
   123  	MOVL n+8(FP), DX
   124  	NACL_SYSCALL(SYS_write)
   125  
   126  	// Unlock.
   127  	MOVL	$0, runtime·writelock(SB)
   128  
   129  	MOVL	AX, ret+16(FP)
   130  	RET
   131  
   132  TEXT runtime·nacl_exception_stack(SB),NOSPLIT,$0
   133  	MOVL p+0(FP), DI
   134  	MOVL size+4(FP), SI
   135  	NACL_SYSCALL(SYS_exception_stack)
   136  	MOVL AX, ret+8(FP)
   137  	RET
   138  
   139  TEXT runtime·nacl_exception_handler(SB),NOSPLIT,$0
   140  	MOVL fn+0(FP), DI
   141  	MOVL arg+4(FP), SI
   142  	NACL_SYSCALL(SYS_exception_handler)
   143  	MOVL AX, ret+8(FP)
   144  	RET
   145  
   146  TEXT runtime·nacl_sem_create(SB),NOSPLIT,$0
   147  	MOVL flag+0(FP), DI
   148  	NACL_SYSCALL(SYS_sem_create)
   149  	MOVL AX, ret+8(FP)
   150  	RET
   151  
   152  TEXT runtime·nacl_sem_wait(SB),NOSPLIT,$0
   153  	MOVL sem+0(FP), DI
   154  	NACL_SYSCALL(SYS_sem_wait)
   155  	MOVL AX, ret+8(FP)
   156  	RET
   157  
   158  TEXT runtime·nacl_sem_post(SB),NOSPLIT,$0
   159  	MOVL sem+0(FP), DI
   160  	NACL_SYSCALL(SYS_sem_post)
   161  	MOVL AX, ret+8(FP)
   162  	RET
   163  
   164  TEXT runtime·nacl_mutex_create(SB),NOSPLIT,$0
   165  	MOVL flag+0(FP), DI
   166  	NACL_SYSCALL(SYS_mutex_create)
   167  	MOVL AX, ret+8(FP)
   168  	RET
   169  
   170  TEXT runtime·nacl_mutex_lock(SB),NOSPLIT,$0
   171  	MOVL mutex+0(FP), DI
   172  	NACL_SYSCALL(SYS_mutex_lock)
   173  	MOVL AX, ret+8(FP)
   174  	RET
   175  
   176  TEXT runtime·nacl_mutex_trylock(SB),NOSPLIT,$0
   177  	MOVL mutex+0(FP), DI
   178  	NACL_SYSCALL(SYS_mutex_trylock)
   179  	MOVL AX, ret+8(FP)
   180  	RET
   181  
   182  TEXT runtime·nacl_mutex_unlock(SB),NOSPLIT,$0
   183  	MOVL mutex+0(FP), DI
   184  	NACL_SYSCALL(SYS_mutex_unlock)
   185  	MOVL AX, ret+8(FP)
   186  	RET
   187  
   188  TEXT runtime·nacl_cond_create(SB),NOSPLIT,$0
   189  	MOVL flag+0(FP), DI
   190  	NACL_SYSCALL(SYS_cond_create)
   191  	MOVL AX, ret+8(FP)
   192  	RET
   193  
   194  TEXT runtime·nacl_cond_wait(SB),NOSPLIT,$0
   195  	MOVL cond+0(FP), DI
   196  	MOVL n+4(FP), SI
   197  	NACL_SYSCALL(SYS_cond_wait)
   198  	MOVL AX, ret+8(FP)
   199  	RET
   200  
   201  TEXT runtime·nacl_cond_signal(SB),NOSPLIT,$0
   202  	MOVL cond+0(FP), DI
   203  	NACL_SYSCALL(SYS_cond_signal)
   204  	MOVL AX, ret+8(FP)
   205  	RET
   206  
   207  TEXT runtime·nacl_cond_broadcast(SB),NOSPLIT,$0
   208  	MOVL cond+0(FP), DI
   209  	NACL_SYSCALL(SYS_cond_broadcast)
   210  	MOVL AX, ret+8(FP)
   211  	RET
   212  
   213  TEXT runtime·nacl_cond_timed_wait_abs(SB),NOSPLIT,$0
   214  	MOVL cond+0(FP), DI
   215  	MOVL lock+4(FP), SI
   216  	MOVL ts+8(FP), DX
   217  	NACL_SYSCALL(SYS_cond_timed_wait_abs)
   218  	MOVL AX, ret+16(FP)
   219  	RET
   220  
   221  TEXT runtime·nacl_thread_create(SB),NOSPLIT,$0
   222  	MOVL fn+0(FP), DI
   223  	MOVL stk+4(FP), SI
   224  	MOVL tls+8(FP), DX
   225  	MOVL xx+12(FP), CX
   226  	NACL_SYSCALL(SYS_thread_create)
   227  	MOVL AX, ret+16(FP)
   228  	RET
   229  
   230  TEXT runtime·mstart_nacl(SB),NOSPLIT,$0
   231  	NACL_SYSCALL(SYS_tls_get)
   232  	SUBL	$8, AX
   233  	MOVL	AX, TLS
   234  	JMP runtime·mstart(SB)
   235  
   236  TEXT runtime·nacl_nanosleep(SB),NOSPLIT,$0
   237  	MOVL ts+0(FP), DI
   238  	MOVL extra+4(FP), SI
   239  	NACL_SYSCALL(SYS_nanosleep)
   240  	MOVL AX, ret+8(FP)
   241  	RET
   242  
   243  TEXT runtime·osyield(SB),NOSPLIT,$0
   244  	NACL_SYSCALL(SYS_sched_yield)
   245  	RET
   246  
   247  TEXT runtime·mmap(SB),NOSPLIT,$8
   248  	MOVL addr+0(FP), DI
   249  	MOVL n+4(FP), SI
   250  	MOVL prot+8(FP), DX
   251  	MOVL flags+12(FP), CX
   252  	MOVL fd+16(FP), R8
   253  	MOVL off+20(FP), AX
   254  	MOVQ AX, 0(SP)
   255  	MOVL SP, R9
   256  	NACL_SYSCALL(SYS_mmap)
   257  	CMPL AX, $-4095
   258  	JNA ok
   259  	NEGL AX
   260  	MOVL	$0, p+24(FP)
   261  	MOVL	AX, err+28(FP)
   262  	RET
   263  ok:
   264  	MOVL	AX, p+24(FP)
   265  	MOVL	$0, err+28(FP)
   266  	RET
   267  
   268  TEXT runtime·walltime(SB),NOSPLIT,$16
   269  	MOVQ runtime·faketime(SB), AX
   270  	CMPQ AX, $0
   271  	JEQ realtime
   272  	MOVQ $0, DX
   273  	MOVQ $1000000000, CX
   274  	DIVQ CX
   275  	MOVQ AX, sec+0(FP)
   276  	MOVL DX, nsec+8(FP)
   277  	RET
   278  realtime:
   279  	MOVL $0, DI // real time clock
   280  	LEAL 0(SP), AX
   281  	MOVL AX, SI // timespec
   282  	NACL_SYSCALL(SYS_clock_gettime)
   283  	MOVL 0(SP), AX // low 32 sec
   284  	MOVL 4(SP), CX // high 32 sec
   285  	MOVL 8(SP), BX // nsec
   286  
   287  	// sec is in AX, nsec in BX
   288  	MOVL	AX, sec_lo+0(FP)
   289  	MOVL	CX, sec_hi+4(FP)
   290  	MOVL	BX, nsec+8(FP)
   291  	RET
   292  
   293  TEXT syscall·now(SB),NOSPLIT,$0
   294  	JMP runtime·walltime(SB)
   295  
   296  TEXT runtime·nacl_clock_gettime(SB),NOSPLIT,$0
   297  	MOVL arg1+0(FP), DI
   298  	MOVL arg2+4(FP), SI
   299  	NACL_SYSCALL(SYS_clock_gettime)
   300  	MOVL AX, ret+8(FP)
   301  	RET
   302  
   303  TEXT runtime·nanotime(SB),NOSPLIT,$16
   304  	MOVQ runtime·faketime(SB), AX
   305  	CMPQ AX, $0
   306  	JEQ 3(PC)
   307  	MOVQ	AX, ret+0(FP)
   308  	RET
   309  	MOVL $0, DI // real time clock
   310  	LEAL 0(SP), AX
   311  	MOVL AX, SI // timespec
   312  	NACL_SYSCALL(SYS_clock_gettime)
   313  	MOVQ 0(SP), AX // sec
   314  	MOVL 8(SP), DX // nsec
   315  
   316  	// sec is in AX, nsec in DX
   317  	// return nsec in AX
   318  	IMULQ	$1000000000, AX
   319  	ADDQ	DX, AX
   320  	MOVQ	AX, ret+0(FP)
   321  	RET
   322  
   323  TEXT runtime·sigtramp(SB),NOSPLIT,$80
   324  	// restore TLS register at time of execution,
   325  	// in case it's been smashed.
   326  	// the TLS register is really BP, but for consistency
   327  	// with non-NaCl systems it is referred to here as TLS.
   328  	// NOTE: Cannot use SYS_tls_get here (like we do in mstart_nacl),
   329  	// because the main thread never calls tls_set.
   330  	LEAL ctxt+0(FP), AX
   331  	MOVL (16*4+5*8)(AX), AX
   332  	MOVL	AX, TLS
   333  
   334  	// check that g exists
   335  	get_tls(CX)
   336  	MOVL	g(CX), DI
   337  
   338  	CMPL	DI, $0
   339  	JEQ	nog
   340  
   341  	// save g
   342  	MOVL	DI, 20(SP)
   343  
   344  	// g = m->gsignal
   345  	MOVL	g_m(DI), BX
   346  	MOVL	m_gsignal(BX), BX
   347  	MOVL	BX, g(CX)
   348  
   349  //JMP debughandler
   350  
   351  	// copy arguments for sighandler
   352  	MOVL	$11, 0(SP) // signal
   353  	MOVL	$0, 4(SP) // siginfo
   354  	LEAL	ctxt+0(FP), AX
   355  	MOVL	AX, 8(SP) // context
   356  	MOVL	DI, 12(SP) // g
   357  
   358  	CALL	runtime·sighandler(SB)
   359  
   360  	// restore g
   361  	get_tls(CX)
   362  	MOVL	20(SP), BX
   363  	MOVL	BX, g(CX)
   364  
   365  	// Enable exceptions again.
   366  	NACL_SYSCALL(SYS_exception_clear_flag)
   367  
   368  	// Restore registers as best we can. Impossible to do perfectly.
   369  	// See comment in sys_nacl_386.s for extended rationale.
   370  	LEAL	ctxt+0(FP), SI
   371  	ADDL	$64, SI
   372  	MOVQ	0(SI), AX
   373  	MOVQ	8(SI), CX
   374  	MOVQ	16(SI), DX
   375  	MOVQ	24(SI), BX
   376  	MOVL	32(SI), SP	// MOVL for SP sandboxing
   377  	// 40(SI) is saved BP aka TLS, already restored above
   378  	// 48(SI) is saved SI, never to be seen again
   379  	MOVQ	56(SI), DI
   380  	MOVQ	64(SI), R8
   381  	MOVQ	72(SI), R9
   382  	MOVQ	80(SI), R10
   383  	MOVQ	88(SI), R11
   384  	MOVQ	96(SI), R12
   385  	MOVQ	104(SI), R13
   386  	MOVQ	112(SI), R14
   387  	// 120(SI) is R15, which is owned by Native Client and must not be modified
   388  	MOVQ	128(SI), SI // saved PC
   389  	// 136(SI) is saved EFLAGS, never to be seen again
   390  	JMP	SI
   391  
   392  //debughandler:
   393  	//// print basic information
   394  	//LEAL	ctxt+0(FP), DI
   395  	//MOVL	$runtime·sigtrampf(SB), AX
   396  	//MOVL	AX, 0(SP)
   397  	//MOVQ	(16*4+16*8)(DI), BX // rip
   398  	//MOVQ	BX, 8(SP)
   399  	//MOVQ	(16*4+0*8)(DI), BX // rax
   400  	//MOVQ	BX, 16(SP)
   401  	//MOVQ	(16*4+1*8)(DI), BX // rcx
   402  	//MOVQ	BX, 24(SP)
   403  	//MOVQ	(16*4+2*8)(DI), BX // rdx
   404  	//MOVQ	BX, 32(SP)
   405  	//MOVQ	(16*4+3*8)(DI), BX // rbx
   406  	//MOVQ	BX, 40(SP)
   407  	//MOVQ	(16*4+7*8)(DI), BX // rdi
   408  	//MOVQ	BX, 48(SP)
   409  	//MOVQ	(16*4+15*8)(DI), BX // r15
   410  	//MOVQ	BX, 56(SP)
   411  	//MOVQ	(16*4+4*8)(DI), BX // rsp
   412  	//MOVQ	0(BX), BX
   413  	//MOVQ	BX, 64(SP)
   414  	//CALL	runtime·printf(SB)
   415  	//
   416  	//LEAL	ctxt+0(FP), DI
   417  	//MOVQ	(16*4+16*8)(DI), BX // rip
   418  	//MOVL	BX, 0(SP)
   419  	//MOVQ	(16*4+4*8)(DI), BX // rsp
   420  	//MOVL	BX, 4(SP)
   421  	//MOVL	$0, 8(SP)	// lr
   422  	//get_tls(CX)
   423  	//MOVL	g(CX), BX
   424  	//MOVL	BX, 12(SP)	// gp
   425  	//CALL	runtime·traceback(SB)
   426  
   427  notls:
   428  	MOVL	0, AX
   429  	RET
   430  
   431  nog:
   432  	MOVL	0, AX
   433  	RET
   434  
   435  // cannot do real signal handling yet, because gsignal has not been allocated.
   436  MOVL $1, DI; NACL_SYSCALL(SYS_exit)
   437  
   438  // func getRandomData([]byte)
   439  TEXT runtime·getRandomData(SB),NOSPLIT,$0-12
   440  	MOVL arg_base+0(FP), DI
   441  	MOVL arg_len+4(FP), SI
   442  	NACL_SYSCALL(SYS_get_random_bytes)
   443  	RET
   444  
   445  TEXT runtime·nacl_sysinfo(SB),NOSPLIT,$16
   446  /*
   447  	MOVL	di+0(FP), DI
   448  	LEAL	12(DI), BX
   449  	MOVL	8(DI), AX
   450  	ADDL	4(DI), AX
   451  	ADDL	$2, AX
   452  	LEAL	(BX)(AX*4), BX
   453  	MOVL	BX, runtime·nacl_irt_query(SB)
   454  auxloop:
   455  	MOVL	0(BX), DX
   456  	CMPL	DX, $0
   457  	JNE	2(PC)
   458  	RET
   459  	CMPL	DX, $32
   460  	JEQ	auxfound
   461  	ADDL	$8, BX
   462  	JMP	auxloop
   463  auxfound:
   464  	MOVL	4(BX), BX
   465  	MOVL	BX, runtime·nacl_irt_query(SB)
   466  
   467  	LEAL	runtime·nacl_irt_basic_v0_1_str(SB), DI
   468  	LEAL	runtime·nacl_irt_basic_v0_1(SB), SI
   469  	MOVL	runtime·nacl_irt_basic_v0_1_size(SB), DX
   470  	MOVL	runtime·nacl_irt_query(SB), BX
   471  	CALL	BX
   472  
   473  	LEAL	runtime·nacl_irt_memory_v0_3_str(SB), DI
   474  	LEAL	runtime·nacl_irt_memory_v0_3(SB), SI
   475  	MOVL	runtime·nacl_irt_memory_v0_3_size(SB), DX
   476  	MOVL	runtime·nacl_irt_query(SB), BX
   477  	CALL	BX
   478  
   479  	LEAL	runtime·nacl_irt_thread_v0_1_str(SB), DI
   480  	LEAL	runtime·nacl_irt_thread_v0_1(SB), SI
   481  	MOVL	runtime·nacl_irt_thread_v0_1_size(SB), DX
   482  	MOVL	runtime·nacl_irt_query(SB), BX
   483  	CALL	BX
   484  
   485  	// TODO: Once we have a NaCl SDK with futex syscall support,
   486  	// try switching to futex syscalls and here load the
   487  	// nacl-irt-futex-0.1 table.
   488  */
   489  	RET