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