github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/sys_linux_amd64.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  //
     6  // System calls and other sys.stuff for AMD64, Linux
     7  //
     8  
     9  #include "zasm_GOOS_GOARCH.h"
    10  
    11  TEXT runtime·exit(SB),7,$0-8
    12  	MOVL	8(SP), DI
    13  	MOVL	$231, AX	// exitgroup - force all os threads to exit
    14  	SYSCALL
    15  	RET
    16  
    17  TEXT runtime·exit1(SB),7,$0-8
    18  	MOVL	8(SP), DI
    19  	MOVL	$60, AX	// exit - exit the current os thread
    20  	SYSCALL
    21  	RET
    22  
    23  TEXT runtime·open(SB),7,$0-16
    24  	MOVQ	8(SP), DI
    25  	MOVL	16(SP), SI
    26  	MOVL	20(SP), DX
    27  	MOVL	$2, AX			// syscall entry
    28  	SYSCALL
    29  	RET
    30  
    31  TEXT runtime·close(SB),7,$0-16
    32  	MOVL	8(SP), DI
    33  	MOVL	$3, AX			// syscall entry
    34  	SYSCALL
    35  	RET
    36  
    37  TEXT runtime·write(SB),7,$0-24
    38  	MOVL	8(SP), DI
    39  	MOVQ	16(SP), SI
    40  	MOVL	24(SP), DX
    41  	MOVL	$1, AX			// syscall entry
    42  	SYSCALL
    43  	RET
    44  
    45  TEXT runtime·read(SB),7,$0-24
    46  	MOVL	8(SP), DI
    47  	MOVQ	16(SP), SI
    48  	MOVL	24(SP), DX
    49  	MOVL	$0, AX			// syscall entry
    50  	SYSCALL
    51  	RET
    52  
    53  TEXT runtime·getrlimit(SB),7,$0-24
    54  	MOVL	8(SP), DI
    55  	MOVQ	16(SP), SI
    56  	MOVL	$97, AX			// syscall entry
    57  	SYSCALL
    58  	RET
    59  
    60  TEXT runtime·usleep(SB),7,$16
    61  	MOVL	$0, DX
    62  	MOVL	usec+0(FP), AX
    63  	MOVL	$1000000, CX
    64  	DIVL	CX
    65  	MOVQ	AX, 0(SP)
    66  	MOVQ	DX, 8(SP)
    67  
    68  	// select(0, 0, 0, 0, &tv)
    69  	MOVL	$0, DI
    70  	MOVL	$0, SI
    71  	MOVL	$0, DX
    72  	MOVL	$0, R10
    73  	MOVQ	SP, R8
    74  	MOVL	$23, AX
    75  	SYSCALL
    76  	RET
    77  
    78  TEXT runtime·raise(SB),7,$12
    79  	MOVL	$186, AX	// syscall - gettid
    80  	SYSCALL
    81  	MOVL	AX, DI	// arg 1 tid
    82  	MOVL	sig+0(FP), SI	// arg 2
    83  	MOVL	$200, AX	// syscall - tkill
    84  	SYSCALL
    85  	RET
    86  
    87  TEXT runtime·setitimer(SB),7,$0-24
    88  	MOVL	8(SP), DI
    89  	MOVQ	16(SP), SI
    90  	MOVQ	24(SP), DX
    91  	MOVL	$38, AX			// syscall entry
    92  	SYSCALL
    93  	RET
    94  
    95  TEXT runtime·mincore(SB),7,$0-24
    96  	MOVQ	8(SP), DI
    97  	MOVQ	16(SP), SI
    98  	MOVQ	24(SP), DX
    99  	MOVL	$27, AX			// syscall entry
   100  	SYSCALL
   101  	RET
   102  
   103  // func now() (sec int64, nsec int32)
   104  TEXT time·now(SB),7,$16
   105  	// Be careful. We're calling a function with gcc calling convention here.
   106  	// We're guaranteed 128 bytes on entry, and we've taken 16, and the
   107  	// call uses another 8.
   108  	// That leaves 104 for the gettime code to use. Hope that's enough!
   109  	MOVQ	runtime·__vdso_clock_gettime_sym(SB), AX
   110  	CMPQ	AX, $0
   111  	JEQ	fallback_gtod
   112  	MOVL	$0, DI // CLOCK_REALTIME
   113  	LEAQ	0(SP), SI
   114  	CALL	AX
   115  	MOVQ	0(SP), AX	// sec
   116  	MOVQ	8(SP), DX	// nsec
   117  	MOVQ	AX, sec+0(FP)
   118  	MOVL	DX, nsec+8(FP)
   119  	RET
   120  fallback_gtod:
   121  	LEAQ	0(SP), DI
   122  	MOVQ	$0, SI
   123  	MOVQ	runtime·__vdso_gettimeofday_sym(SB), AX
   124  	CALL	AX
   125  	MOVQ	0(SP), AX	// sec
   126  	MOVL	8(SP), DX	// usec
   127  	IMULQ	$1000, DX
   128  	MOVQ	AX, sec+0(FP)
   129  	MOVL	DX, nsec+8(FP)
   130  	RET
   131  
   132  TEXT runtime·nanotime(SB),7,$16
   133  	// Duplicate time.now here to avoid using up precious stack space.
   134  	// See comment above in time.now.
   135  	MOVQ	runtime·__vdso_clock_gettime_sym(SB), AX
   136  	CMPQ	AX, $0
   137  	JEQ	fallback_gtod_nt
   138  	MOVL	$0, DI // CLOCK_REALTIME
   139  	LEAQ	0(SP), SI
   140  	CALL	AX
   141  	MOVQ	0(SP), AX	// sec
   142  	MOVQ	8(SP), DX	// nsec
   143  	// sec is in AX, nsec in DX
   144  	// return nsec in AX
   145  	IMULQ	$1000000000, AX
   146  	ADDQ	DX, AX
   147  	RET
   148  fallback_gtod_nt:
   149  	LEAQ	0(SP), DI
   150  	MOVQ	$0, SI
   151  	MOVQ	runtime·__vdso_gettimeofday_sym(SB), AX
   152  	CALL	AX
   153  	MOVQ	0(SP), AX	// sec
   154  	MOVL	8(SP), DX	// usec
   155  	IMULQ	$1000, DX
   156  	// sec is in AX, nsec in DX
   157  	// return nsec in AX
   158  	IMULQ	$1000000000, AX
   159  	ADDQ	DX, AX
   160  	RET
   161  
   162  TEXT runtime·rtsigprocmask(SB),7,$0-32
   163  	MOVL	8(SP), DI
   164  	MOVQ	16(SP), SI
   165  	MOVQ	24(SP), DX
   166  	MOVL	32(SP), R10
   167  	MOVL	$14, AX			// syscall entry
   168  	SYSCALL
   169  	CMPQ	AX, $0xfffffffffffff001
   170  	JLS	2(PC)
   171  	MOVL	$0xf1, 0xf1  // crash
   172  	RET
   173  
   174  TEXT runtime·rt_sigaction(SB),7,$0-32
   175  	MOVL	8(SP), DI
   176  	MOVQ	16(SP), SI
   177  	MOVQ	24(SP), DX
   178  	MOVQ	32(SP), R10
   179  	MOVL	$13, AX			// syscall entry
   180  	SYSCALL
   181  	RET
   182  
   183  TEXT runtime·sigtramp(SB),7,$64
   184  	get_tls(BX)
   185  
   186  	// check that m exists
   187  	MOVQ	m(BX), BP
   188  	CMPQ	BP, $0
   189  	JNE	4(PC)
   190  	MOVQ	DI, 0(SP)
   191  	CALL	runtime·badsignal(SB)
   192  	RET
   193  
   194  	// save g
   195  	MOVQ	g(BX), R10
   196  	MOVQ	R10, 40(SP)
   197  
   198  	// g = m->gsignal
   199  	MOVQ	m_gsignal(BP), BP
   200  	MOVQ	BP, g(BX)
   201  
   202  	MOVQ	DI, 0(SP)
   203  	MOVQ	SI, 8(SP)
   204  	MOVQ	DX, 16(SP)
   205  	MOVQ	R10, 24(SP)
   206  
   207  	CALL	runtime·sighandler(SB)
   208  
   209  	// restore g
   210  	get_tls(BX)
   211  	MOVQ	40(SP), R10
   212  	MOVQ	R10, g(BX)
   213  	RET
   214  
   215  TEXT runtime·sigreturn(SB),7,$0
   216  	MOVL	$15, AX	// rt_sigreturn
   217  	SYSCALL
   218  	INT $3	// not reached
   219  
   220  TEXT runtime·mmap(SB),7,$0
   221  	MOVQ	8(SP), DI
   222  	MOVQ	$0, SI
   223  	MOVQ	16(SP), SI
   224  	MOVL	24(SP), DX
   225  	MOVL	28(SP), R10
   226  	MOVL	32(SP), R8
   227  	MOVL	36(SP), R9
   228  
   229  	MOVL	$9, AX			// mmap
   230  	SYSCALL
   231  	CMPQ	AX, $0xfffffffffffff001
   232  	JLS	3(PC)
   233  	NOTQ	AX
   234  	INCQ	AX
   235  	RET
   236  
   237  TEXT runtime·munmap(SB),7,$0
   238  	MOVQ	8(SP), DI
   239  	MOVQ	16(SP), SI
   240  	MOVQ	$11, AX	// munmap
   241  	SYSCALL
   242  	CMPQ	AX, $0xfffffffffffff001
   243  	JLS	2(PC)
   244  	MOVL	$0xf1, 0xf1  // crash
   245  	RET
   246  
   247  TEXT runtime·madvise(SB),7,$0
   248  	MOVQ	8(SP), DI
   249  	MOVQ	16(SP), SI
   250  	MOVQ	24(SP), DX
   251  	MOVQ	$28, AX	// madvise
   252  	SYSCALL
   253  	// ignore failure - maybe pages are locked
   254  	RET
   255  
   256  // int64 futex(int32 *uaddr, int32 op, int32 val,
   257  //	struct timespec *timeout, int32 *uaddr2, int32 val2);
   258  TEXT runtime·futex(SB),7,$0
   259  	MOVQ	8(SP), DI
   260  	MOVL	16(SP), SI
   261  	MOVL	20(SP), DX
   262  	MOVQ	24(SP), R10
   263  	MOVQ	32(SP), R8
   264  	MOVL	40(SP), R9
   265  	MOVL	$202, AX
   266  	SYSCALL
   267  	RET
   268  
   269  // int64 clone(int32 flags, void *stack, M *mp, G *gp, void (*fn)(void));
   270  TEXT runtime·clone(SB),7,$0
   271  	MOVL	flags+8(SP), DI
   272  	MOVQ	stack+16(SP), SI
   273  
   274  	// Copy mp, gp, fn off parent stack for use by child.
   275  	// Careful: Linux system call clobbers CX and R11.
   276  	MOVQ	mm+24(SP), R8
   277  	MOVQ	gg+32(SP), R9
   278  	MOVQ	fn+40(SP), R12
   279  
   280  	MOVL	$56, AX
   281  	SYSCALL
   282  
   283  	// In parent, return.
   284  	CMPQ	AX, $0
   285  	JEQ	2(PC)
   286  	RET
   287  
   288  	// In child, on new stack.
   289  	MOVQ	SI, SP
   290  
   291  	// Initialize m->procid to Linux tid
   292  	MOVL	$186, AX	// gettid
   293  	SYSCALL
   294  	MOVQ	AX, m_procid(R8)
   295  
   296  	// Set FS to point at m->tls.
   297  	LEAQ	m_tls(R8), DI
   298  	CALL	runtime·settls(SB)
   299  
   300  	// In child, set up new stack
   301  	get_tls(CX)
   302  	MOVQ	R8, m(CX)
   303  	MOVQ	R9, g(CX)
   304  	CALL	runtime·stackcheck(SB)
   305  
   306  	// Call fn
   307  	CALL	R12
   308  
   309  	// It shouldn't return.  If it does, exit
   310  	MOVL	$111, DI
   311  	MOVL	$60, AX
   312  	SYSCALL
   313  	JMP	-3(PC)	// keep exiting
   314  
   315  TEXT runtime·sigaltstack(SB),7,$-8
   316  	MOVQ	new+8(SP), DI
   317  	MOVQ	old+16(SP), SI
   318  	MOVQ	$131, AX
   319  	SYSCALL
   320  	CMPQ	AX, $0xfffffffffffff001
   321  	JLS	2(PC)
   322  	MOVL	$0xf1, 0xf1  // crash
   323  	RET
   324  
   325  // set tls base to DI
   326  TEXT runtime·settls(SB),7,$32
   327  	ADDQ	$16, DI	// ELF wants to use -16(FS), -8(FS)
   328  
   329  	MOVQ	DI, SI
   330  	MOVQ	$0x1002, DI	// ARCH_SET_FS
   331  	MOVQ	$158, AX	// arch_prctl
   332  	SYSCALL
   333  	CMPQ	AX, $0xfffffffffffff001
   334  	JLS	2(PC)
   335  	MOVL	$0xf1, 0xf1  // crash
   336  	RET
   337  
   338  TEXT runtime·osyield(SB),7,$0
   339  	MOVL	$24, AX
   340  	SYSCALL
   341  	RET
   342  
   343  TEXT runtime·sched_getaffinity(SB),7,$0
   344  	MOVQ	8(SP), DI
   345  	MOVL	16(SP), SI
   346  	MOVQ	24(SP), DX
   347  	MOVL	$204, AX			// syscall entry
   348  	SYSCALL
   349  	RET
   350  
   351  // int32 runtime·epollcreate(int32 size);
   352  TEXT runtime·epollcreate(SB),7,$0
   353  	MOVL    8(SP), DI
   354  	MOVL    $213, AX                        // syscall entry
   355  	SYSCALL
   356  	RET
   357  
   358  // int32 runtime·epollcreate1(int32 flags);
   359  TEXT runtime·epollcreate1(SB),7,$0
   360  	MOVL	8(SP), DI
   361  	MOVL	$291, AX			// syscall entry
   362  	SYSCALL
   363  	RET
   364  
   365  // int32 runtime·epollctl(int32 epfd, int32 op, int32 fd, EpollEvent *ev);
   366  TEXT runtime·epollctl(SB),7,$0
   367  	MOVL	8(SP), DI
   368  	MOVL	12(SP), SI
   369  	MOVL	16(SP), DX
   370  	MOVQ	24(SP), R10
   371  	MOVL	$233, AX			// syscall entry
   372  	SYSCALL
   373  	RET
   374  
   375  // int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
   376  TEXT runtime·epollwait(SB),7,$0
   377  	MOVL	8(SP), DI
   378  	MOVQ	16(SP), SI
   379  	MOVL	24(SP), DX
   380  	MOVL	28(SP), R10
   381  	MOVL	$232, AX			// syscall entry
   382  	SYSCALL
   383  	RET
   384  
   385  // void runtime·closeonexec(int32 fd);
   386  TEXT runtime·closeonexec(SB),7,$0
   387  	MOVL    8(SP), DI  // fd
   388  	MOVQ    $2, SI  // F_SETFD
   389  	MOVQ    $1, DX  // FD_CLOEXEC
   390  	MOVL	$72, AX  // fcntl
   391  	SYSCALL
   392  	RET