github.com/tcnksm/go@v0.0.0-20141208075154-439b32936367/src/syscall/asm_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  // TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP)
     6  // so that go vet can check that they are correct.
     7  
     8  #include "textflag.h"
     9  #include "funcdata.h"
    10  
    11  //
    12  // System calls for AMD64, Linux
    13  //
    14  
    15  // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
    16  // Trap # in AX, args in DI SI DX R10 R8 R9, return in AX DX
    17  // Note that this differs from "standard" ABI convention, which
    18  // would pass 4th arg in CX, not R10.
    19  
    20  TEXT	·Syscall(SB),NOSPLIT,$0-56
    21  	CALL	runtime·entersyscall(SB)
    22  	MOVQ	16(SP), DI
    23  	MOVQ	24(SP), SI
    24  	MOVQ	32(SP), DX
    25  	MOVQ	$0, R10
    26  	MOVQ	$0, R8
    27  	MOVQ	$0, R9
    28  	MOVQ	8(SP), AX	// syscall entry
    29  	SYSCALL
    30  	CMPQ	AX, $0xfffffffffffff001
    31  	JLS	ok
    32  	MOVQ	$-1, 40(SP)	// r1
    33  	MOVQ	$0, 48(SP)	// r2
    34  	NEGQ	AX
    35  	MOVQ	AX, 56(SP)  // errno
    36  	CALL	runtime·exitsyscall(SB)
    37  	RET
    38  ok:
    39  	MOVQ	AX, 40(SP)	// r1
    40  	MOVQ	DX, 48(SP)	// r2
    41  	MOVQ	$0, 56(SP)	// errno
    42  	CALL	runtime·exitsyscall(SB)
    43  	RET
    44  
    45  TEXT ·Syscall6(SB),NOSPLIT,$0-80
    46  	CALL	runtime·entersyscall(SB)
    47  	MOVQ	16(SP), DI
    48  	MOVQ	24(SP), SI
    49  	MOVQ	32(SP), DX
    50  	MOVQ	40(SP), R10
    51  	MOVQ	48(SP), R8
    52  	MOVQ	56(SP), R9
    53  	MOVQ	8(SP), AX	// syscall entry
    54  	SYSCALL
    55  	CMPQ	AX, $0xfffffffffffff001
    56  	JLS	ok6
    57  	MOVQ	$-1, 64(SP)	// r1
    58  	MOVQ	$0, 72(SP)	// r2
    59  	NEGQ	AX
    60  	MOVQ	AX, 80(SP)  // errno
    61  	CALL	runtime·exitsyscall(SB)
    62  	RET
    63  ok6:
    64  	MOVQ	AX, 64(SP)	// r1
    65  	MOVQ	DX, 72(SP)	// r2
    66  	MOVQ	$0, 80(SP)	// errno
    67  	CALL	runtime·exitsyscall(SB)
    68  	RET
    69  
    70  TEXT ·RawSyscall(SB),NOSPLIT,$0-56
    71  	MOVQ	16(SP), DI
    72  	MOVQ	24(SP), SI
    73  	MOVQ	32(SP), DX
    74  	MOVQ	$0, R10
    75  	MOVQ	$0, R8
    76  	MOVQ	$0, R9
    77  	MOVQ	8(SP), AX	// syscall entry
    78  	SYSCALL
    79  	CMPQ	AX, $0xfffffffffffff001
    80  	JLS	ok1
    81  	MOVQ	$-1, 40(SP)	// r1
    82  	MOVQ	$0, 48(SP)	// r2
    83  	NEGQ	AX
    84  	MOVQ	AX, 56(SP)  // errno
    85  	RET
    86  ok1:
    87  	MOVQ	AX, 40(SP)	// r1
    88  	MOVQ	DX, 48(SP)	// r2
    89  	MOVQ	$0, 56(SP)	// errno
    90  	RET
    91  
    92  TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
    93  	MOVQ	16(SP), DI
    94  	MOVQ	24(SP), SI
    95  	MOVQ	32(SP), DX
    96  	MOVQ	40(SP), R10
    97  	MOVQ	48(SP), R8
    98  	MOVQ	56(SP), R9
    99  	MOVQ	8(SP), AX	// syscall entry
   100  	SYSCALL
   101  	CMPQ	AX, $0xfffffffffffff001
   102  	JLS	ok2
   103  	MOVQ	$-1, 64(SP)	// r1
   104  	MOVQ	$0, 72(SP)	// r2
   105  	NEGQ	AX
   106  	MOVQ	AX, 80(SP)  // errno
   107  	RET
   108  ok2:
   109  	MOVQ	AX, 64(SP)	// r1
   110  	MOVQ	DX, 72(SP)	// r2
   111  	MOVQ	$0, 80(SP)	// errno
   112  	RET
   113  
   114  TEXT ·gettimeofday(SB),NOSPLIT,$0-16
   115  	MOVQ	8(SP), DI
   116  	MOVQ	$0, SI
   117  	MOVQ	runtime·__vdso_gettimeofday_sym(SB), AX
   118  	CALL	AX
   119  
   120  	CMPQ	AX, $0xfffffffffffff001
   121  	JLS	ok7
   122  	NEGQ	AX
   123  	MOVQ	AX, 16(SP)  // errno
   124  	RET
   125  ok7:
   126  	MOVQ	$0, 16(SP)  // errno
   127  	RET