1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
| // Copyright 2009 The Go Authors. All rights reserved.
| // Use of this source code is governed by a BSD-style
| // license that can be found in the LICENSE file.
|
| #include "textflag.h"
| #include "funcdata.h"
|
| //
| // System call support for AMD64, Darwin
| //
|
| // Trap # in AX, args in DI SI DX, return in AX DX
|
| // func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno);
| TEXT ·Syscall(SB),NOSPLIT,$0-56
| CALL runtime·entersyscall(SB)
| MOVQ a1+8(FP), DI
| MOVQ a2+16(FP), SI
| MOVQ a3+24(FP), DX
| MOVQ $0, R10
| MOVQ $0, R8
| MOVQ $0, R9
| MOVQ trap+0(FP), AX // syscall entry
| ADDQ $0x2000000, AX
| SYSCALL
| JCC ok
| MOVQ $-1, r1+32(FP)
| MOVQ $0, r2+40(FP)
| MOVQ AX, err+48(FP)
| CALL runtime·exitsyscall(SB)
| RET
| ok:
| MOVQ AX, r1+32(FP)
| MOVQ DX, r2+40(FP)
| MOVQ $0, err+48(FP)
| CALL runtime·exitsyscall(SB)
| RET
|
| // func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno);
| TEXT ·Syscall6(SB),NOSPLIT,$0-80
| CALL runtime·entersyscall(SB)
| MOVQ a1+8(FP), DI
| MOVQ a2+16(FP), SI
| MOVQ a3+24(FP), DX
| MOVQ a4+32(FP), R10
| MOVQ a5+40(FP), R8
| MOVQ a6+48(FP), R9
| MOVQ trap+0(FP), AX // syscall entry
| ADDQ $0x2000000, AX
| SYSCALL
| JCC ok6
| MOVQ $-1, r1+56(FP)
| MOVQ $0, r2+64(FP)
| MOVQ AX, err+72(FP)
| CALL runtime·exitsyscall(SB)
| RET
| ok6:
| MOVQ AX, r1+56(FP)
| MOVQ DX, r2+64(FP)
| MOVQ $0, err+72(FP)
| CALL runtime·exitsyscall(SB)
| RET
|
| // func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
| TEXT ·Syscall9(SB),NOSPLIT,$0-104
| CALL runtime·entersyscall(SB)
| MOVQ trap+0(FP), AX // syscall entry
| MOVQ a1+8(FP), DI
| MOVQ a2+16(FP), SI
| MOVQ a3+24(FP), DX
| MOVQ a4+32(FP), R10
| MOVQ a5+40(FP), R8
| MOVQ a6+48(FP), R9
| MOVQ a7+56(FP), R11
| MOVQ a8+64(FP), R12
| MOVQ a9+72(FP), R13
| SUBQ $32, SP
| MOVQ R11, 8(SP)
| MOVQ R12, 16(SP)
| MOVQ R13, 24(SP)
| ADDQ $0x2000000, AX
| SYSCALL
| JCC ok9
| ADDQ $32, SP
| MOVQ $-1, r1+80(FP)
| MOVQ $0, r2+88(FP)
| MOVQ AX, err+96(FP)
| CALL runtime·exitsyscall(SB)
| RET
| ok9:
| ADDQ $32, SP
| MOVQ AX, r1+80(FP)
| MOVQ DX, r2+88(FP)
| MOVQ $0, err+96(FP)
| CALL runtime·exitsyscall(SB)
| RET
|
| // func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
| TEXT ·RawSyscall(SB),NOSPLIT,$0-56
| MOVQ a1+8(FP), DI
| MOVQ a2+16(FP), SI
| MOVQ a3+24(FP), DX
| MOVQ $0, R10
| MOVQ $0, R8
| MOVQ $0, R9
| MOVQ trap+0(FP), AX // syscall entry
| ADDQ $0x2000000, AX
| SYSCALL
| JCC ok1
| MOVQ $-1, r1+32(FP)
| MOVQ $0, r2+40(FP)
| MOVQ AX, err+48(FP)
| RET
| ok1:
| MOVQ AX, r1+32(FP)
| MOVQ DX, r2+40(FP)
| MOVQ $0, err+48(FP)
| RET
|
| // func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
| TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
| MOVQ a1+8(FP), DI
| MOVQ a2+16(FP), SI
| MOVQ a3+24(FP), DX
| MOVQ a4+32(FP), R10
| MOVQ a5+40(FP), R8
| MOVQ a6+48(FP), R9
| MOVQ trap+0(FP), AX // syscall entry
| ADDQ $0x2000000, AX
| SYSCALL
| JCC ok2
| MOVQ $-1, r1+56(FP)
| MOVQ $0, r2+64(FP)
| MOVQ AX, err+72(FP)
| RET
| ok2:
| MOVQ AX, r1+56(FP)
| MOVQ DX, r2+64(FP)
| MOVQ $0, err+72(FP)
| RET
|
|