github.com/peggyl/go@v0.0.0-20151008231540-ae315999c2d5/src/syscall/asm_freebsd_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 call support for AMD64, FreeBSD
    13  //
    14  
    15  // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
    16  // func Syscall6(trap int64, a1, a2, a3, a4, a5, a6 int64) (r1, r2, err int64);
    17  // func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64)
    18  // Trap # in AX, args in DI SI DX, return in AX DX
    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  	JCC	ok
    31  	MOVQ	$-1, 40(SP)	// r1
    32  	MOVQ	$0, 48(SP)	// r2
    33  	MOVQ	AX, 56(SP)  // errno
    34  	CALL	runtime·exitsyscall(SB)
    35  	RET
    36  ok:
    37  	MOVQ	AX, 40(SP)	// r1
    38  	MOVQ	DX, 48(SP)	// r2
    39  	MOVQ	$0, 56(SP)	// errno
    40  	CALL	runtime·exitsyscall(SB)
    41  	RET
    42  
    43  TEXT	·Syscall6(SB),NOSPLIT,$0-80
    44  	CALL	runtime·entersyscall(SB)
    45  	MOVQ	16(SP), DI
    46  	MOVQ	24(SP), SI
    47  	MOVQ	32(SP), DX
    48  	MOVQ	40(SP), R10
    49  	MOVQ	48(SP), R8
    50  	MOVQ	56(SP), R9
    51  	MOVQ	8(SP), AX	// syscall entry
    52  	SYSCALL
    53  	JCC	ok6
    54  	MOVQ	$-1, 64(SP)	// r1
    55  	MOVQ	$0, 72(SP)	// r2
    56  	MOVQ	AX, 80(SP)  // errno
    57  	CALL	runtime·exitsyscall(SB)
    58  	RET
    59  ok6:
    60  	MOVQ	AX, 64(SP)	// r1
    61  	MOVQ	DX, 72(SP)	// r2
    62  	MOVQ	$0, 80(SP)	// errno
    63  	CALL	runtime·exitsyscall(SB)
    64  	RET
    65  
    66  TEXT	·Syscall9(SB),NOSPLIT,$0-104
    67  	CALL	runtime·entersyscall(SB)
    68  	MOVQ	8(SP), AX
    69  	MOVQ	16(SP), DI
    70  	MOVQ	24(SP), SI
    71  	MOVQ	32(SP), DX
    72  	MOVQ	40(SP),	R10
    73  	MOVQ	48(SP), R8
    74  	MOVQ	56(SP), R9
    75  
    76  	// shift around the last three arguments so they're at the
    77  	// top of the stack when the syscall is called.
    78  	MOVQ	64(SP), R11 // arg 7
    79  	MOVQ	R11, 8(SP)
    80  	MOVQ	72(SP), R11 // arg 8
    81  	MOVQ	R11, 16(SP)
    82  	MOVQ	80(SP), R11 // arg 9
    83  	MOVQ	R11, 24(SP)
    84  
    85  	SYSCALL
    86  	JCC	ok9
    87  	MOVQ	$-1, 88(SP)	// r1
    88  	MOVQ	$0, 96(SP)	// r2
    89  	MOVQ	AX, 104(SP)  // errno
    90  	CALL	runtime·exitsyscall(SB)
    91  	RET
    92  ok9:
    93  	MOVQ	AX, 88(SP)	// r1
    94  	MOVQ	DX, 96(SP)	// r2
    95  	MOVQ	$0, 104(SP)	// errno
    96  	CALL	runtime·exitsyscall(SB)
    97  	RET
    98  
    99  TEXT ·RawSyscall(SB),NOSPLIT,$0-56
   100  	MOVQ	16(SP), DI
   101  	MOVQ	24(SP), SI
   102  	MOVQ	32(SP), DX
   103  	MOVQ	$0, R10
   104  	MOVQ	$0, R8
   105  	MOVQ	$0, R9
   106  	MOVQ	8(SP), AX	// syscall entry
   107  	SYSCALL
   108  	JCC	ok1
   109  	MOVQ	$-1, 40(SP)	// r1
   110  	MOVQ	$0, 48(SP)	// r2
   111  	MOVQ	AX, 56(SP)  // errno
   112  	RET
   113  ok1:
   114  	MOVQ	AX, 40(SP)	// r1
   115  	MOVQ	DX, 48(SP)	// r2
   116  	MOVQ	$0, 56(SP)	// errno
   117  	RET
   118  
   119  TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
   120  	MOVQ	16(SP), DI
   121  	MOVQ	24(SP), SI
   122  	MOVQ	32(SP), DX
   123  	MOVQ	40(SP), R10
   124  	MOVQ	48(SP), R8
   125  	MOVQ	56(SP), R9
   126  	MOVQ	8(SP), AX	// syscall entry
   127  	SYSCALL
   128  	JCC	ok2
   129  	MOVQ	$-1, 64(SP)	// r1
   130  	MOVQ	$0, 72(SP)	// r2
   131  	MOVQ	AX, 80(SP)  // errno
   132  	RET
   133  ok2:
   134  	MOVQ	AX, 64(SP)	// r1
   135  	MOVQ	DX, 72(SP)	// r2
   136  	MOVQ	$0, 80(SP)	// errno
   137  	RET