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