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