github.com/ader1990/go@v0.0.0-20140630135419-8c24447fa791/src/pkg/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 "../../cmd/ld/textflag.h"
     9  
    10  //
    11  // System call support for AMD64, FreeBSD
    12  //
    13  
    14  // The SYSCALL variant for invoking system calls is broken in FreeBSD.
    15  // See comment at top of ../runtime/sys_freebsd_amd64.c and
    16  // golang.org/issue/6372.
    17  #define SYSCALL MOVQ R10, CX; INT $0x80
    18  
    19  // func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
    20  // func Syscall6(trap int64, a1, a2, a3, a4, a5, a6 int64) (r1, r2, err int64);
    21  // func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64)
    22  // Trap # in AX, args in DI SI DX, return in AX DX
    23  
    24  TEXT	·Syscall(SB),NOSPLIT,$0-56
    25  	CALL	runtime·entersyscall(SB)
    26  	MOVQ	16(SP), DI
    27  	MOVQ	24(SP), SI
    28  	MOVQ	32(SP), DX
    29  	MOVQ	$0, R10
    30  	MOVQ	$0, R8
    31  	MOVQ	$0, R9
    32  	MOVQ	8(SP), AX	// syscall entry
    33  	SYSCALL
    34  	JCC	ok
    35  	MOVQ	$-1, 40(SP)	// r1
    36  	MOVQ	$0, 48(SP)	// r2
    37  	MOVQ	AX, 56(SP)  // errno
    38  	CALL	runtime·exitsyscall(SB)
    39  	RET
    40  ok:
    41  	MOVQ	AX, 40(SP)	// r1
    42  	MOVQ	DX, 48(SP)	// r2
    43  	MOVQ	$0, 56(SP)	// errno
    44  	CALL	runtime·exitsyscall(SB)
    45  	RET
    46  
    47  TEXT	·Syscall6(SB),NOSPLIT,$0-80
    48  	CALL	runtime·entersyscall(SB)
    49  	MOVQ	16(SP), DI
    50  	MOVQ	24(SP), SI
    51  	MOVQ	32(SP), DX
    52  	MOVQ	40(SP), R10
    53  	MOVQ	48(SP), R8
    54  	MOVQ	56(SP), R9
    55  	MOVQ	8(SP), AX	// syscall entry
    56  	SYSCALL
    57  	JCC	ok6
    58  	MOVQ	$-1, 64(SP)	// r1
    59  	MOVQ	$0, 72(SP)	// r2
    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	·Syscall9(SB),NOSPLIT,$0-104
    71  	CALL	runtime·entersyscall(SB)
    72  	MOVQ	8(SP), AX
    73  	MOVQ	16(SP), DI
    74  	MOVQ	24(SP), SI
    75  	MOVQ	32(SP), DX
    76  	MOVQ	40(SP),	R10
    77  	MOVQ	48(SP), R8
    78  	MOVQ	56(SP), R9
    79  
    80  	// shift around the last three arguments so they're at the
    81  	// top of the stack when the syscall is called.
    82  	MOVQ	64(SP), R11 // arg 7
    83  	MOVQ	R11, 8(SP)
    84  	MOVQ	72(SP), R11 // arg 8
    85  	MOVQ	R11, 16(SP)
    86  	MOVQ	80(SP), R11 // arg 9
    87  	MOVQ	R11, 24(SP)
    88  
    89  	SYSCALL
    90  	JCC	ok9
    91  	MOVQ	$-1, 88(SP)	// r1
    92  	MOVQ	$0, 96(SP)	// r2
    93  	MOVQ	AX, 104(SP)  // errno
    94  	CALL	runtime·exitsyscall(SB)
    95  	RET
    96  ok9:
    97  	MOVQ	AX, 88(SP)	// r1
    98  	MOVQ	DX, 96(SP)	// r2
    99  	MOVQ	$0, 104(SP)	// errno
   100  	CALL	runtime·exitsyscall(SB)
   101  	RET
   102  
   103  TEXT ·RawSyscall(SB),NOSPLIT,$0-56
   104  	MOVQ	16(SP), DI
   105  	MOVQ	24(SP), SI
   106  	MOVQ	32(SP), DX
   107  	MOVQ	$0, R10
   108  	MOVQ	$0, R8
   109  	MOVQ	$0, R9
   110  	MOVQ	8(SP), AX	// syscall entry
   111  	SYSCALL
   112  	JCC	ok1
   113  	MOVQ	$-1, 40(SP)	// r1
   114  	MOVQ	$0, 48(SP)	// r2
   115  	MOVQ	AX, 56(SP)  // errno
   116  	RET
   117  ok1:
   118  	MOVQ	AX, 40(SP)	// r1
   119  	MOVQ	DX, 48(SP)	// r2
   120  	MOVQ	$0, 56(SP)	// errno
   121  	RET
   122  
   123  TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
   124  	MOVQ	16(SP), DI
   125  	MOVQ	24(SP), SI
   126  	MOVQ	32(SP), DX
   127  	MOVQ	40(SP), R10
   128  	MOVQ	48(SP), R8
   129  	MOVQ	56(SP), R9
   130  	MOVQ	8(SP), AX	// syscall entry
   131  	SYSCALL
   132  	JCC	ok2
   133  	MOVQ	$-1, 64(SP)	// r1
   134  	MOVQ	$0, 72(SP)	// r2
   135  	MOVQ	AX, 80(SP)  // errno
   136  	RET
   137  ok2:
   138  	MOVQ	AX, 64(SP)	// r1
   139  	MOVQ	DX, 72(SP)	// r2
   140  	MOVQ	$0, 80(SP)	// errno
   141  	RET