Text file src/pkg/syscall/asm_linux_amd64.s
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 #include "textflag.h"
6 #include "funcdata.h"
7
8 //
9 // System calls for AMD64, Linux
10 //
11
12 // func Syscall(trap int64, a1, a2, a3 uintptr) (r1, r2, err uintptr);
13 // Trap # in AX, args in DI SI DX R10 R8 R9, return in AX DX
14 // Note that this differs from "standard" ABI convention, which
15 // would pass 4th arg in CX, not R10.
16
17 TEXT ·Syscall(SB),NOSPLIT,$0-56
18 CALL runtime·entersyscall(SB)
19 MOVQ a1+8(FP), DI
20 MOVQ a2+16(FP), SI
21 MOVQ a3+24(FP), DX
22 MOVQ $0, R10
23 MOVQ $0, R8
24 MOVQ $0, R9
25 MOVQ trap+0(FP), AX // syscall entry
26 SYSCALL
27 CMPQ AX, $0xfffffffffffff001
28 JLS ok
29 MOVQ $-1, r1+32(FP)
30 MOVQ $0, r2+40(FP)
31 NEGQ AX
32 MOVQ AX, err+48(FP)
33 CALL runtime·exitsyscall(SB)
34 RET
35 ok:
36 MOVQ AX, r1+32(FP)
37 MOVQ DX, r2+40(FP)
38 MOVQ $0, err+48(FP)
39 CALL runtime·exitsyscall(SB)
40 RET
41
42 // func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
43 TEXT ·Syscall6(SB),NOSPLIT,$0-80
44 CALL runtime·entersyscall(SB)
45 MOVQ a1+8(FP), DI
46 MOVQ a2+16(FP), SI
47 MOVQ a3+24(FP), DX
48 MOVQ a4+32(FP), R10
49 MOVQ a5+40(FP), R8
50 MOVQ a6+48(FP), R9
51 MOVQ trap+0(FP), AX // syscall entry
52 SYSCALL
53 CMPQ AX, $0xfffffffffffff001
54 JLS ok6
55 MOVQ $-1, r1+56(FP)
56 MOVQ $0, r2+64(FP)
57 NEGQ AX
58 MOVQ AX, err+72(FP)
59 CALL runtime·exitsyscall(SB)
60 RET
61 ok6:
62 MOVQ AX, r1+56(FP)
63 MOVQ DX, r2+64(FP)
64 MOVQ $0, err+72(FP)
65 CALL runtime·exitsyscall(SB)
66 RET
67
68 // func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
69 TEXT ·RawSyscall(SB),NOSPLIT,$0-56
70 MOVQ a1+8(FP), DI
71 MOVQ a2+16(FP), SI
72 MOVQ a3+24(FP), DX
73 MOVQ $0, R10
74 MOVQ $0, R8
75 MOVQ $0, R9
76 MOVQ trap+0(FP), AX // syscall entry
77 SYSCALL
78 CMPQ AX, $0xfffffffffffff001
79 JLS ok1
80 MOVQ $-1, r1+32(FP)
81 MOVQ $0, r2+40(FP)
82 NEGQ AX
83 MOVQ AX, err+48(FP)
84 RET
85 ok1:
86 MOVQ AX, r1+32(FP)
87 MOVQ DX, r2+40(FP)
88 MOVQ $0, err+48(FP)
89 RET
90
91 // func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
92 TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
93 MOVQ a1+8(FP), DI
94 MOVQ a2+16(FP), SI
95 MOVQ a3+24(FP), DX
96 MOVQ a4+32(FP), R10
97 MOVQ a5+40(FP), R8
98 MOVQ a6+48(FP), R9
99 MOVQ trap+0(FP), AX // syscall entry
100 SYSCALL
101 CMPQ AX, $0xfffffffffffff001
102 JLS ok2
103 MOVQ $-1, r1+56(FP)
104 MOVQ $0, r2+64(FP)
105 NEGQ AX
106 MOVQ AX, err+72(FP)
107 RET
108 ok2:
109 MOVQ AX, r1+56(FP)
110 MOVQ DX, r2+64(FP)
111 MOVQ $0, err+72(FP)
112 RET
113
114 // func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
115 TEXT ·rawVforkSyscall(SB),NOSPLIT,$0-32
116 MOVQ a1+8(FP), DI
117 MOVQ $0, SI
118 MOVQ $0, DX
119 MOVQ $0, R10
120 MOVQ $0, R8
121 MOVQ $0, R9
122 MOVQ trap+0(FP), AX // syscall entry
123 POPQ R12 // preserve return address
124 SYSCALL
125 PUSHQ R12
126 CMPQ AX, $0xfffffffffffff001
127 JLS ok2
128 MOVQ $-1, r1+16(FP)
129 NEGQ AX
130 MOVQ AX, err+24(FP)
131 RET
132 ok2:
133 MOVQ AX, r1+16(FP)
134 MOVQ $0, err+24(FP)
135 RET
136
137 // func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr)
138 TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48
139 MOVQ a1+8(FP), DI
140 MOVQ a2+16(FP), SI
141 MOVQ a3+24(FP), DX
142 MOVQ $0, R10
143 MOVQ $0, R8
144 MOVQ $0, R9
145 MOVQ trap+0(FP), AX // syscall entry
146 SYSCALL
147 MOVQ AX, r1+32(FP)
148 MOVQ DX, r2+40(FP)
149 RET
150
151 // func gettimeofday(tv *Timeval) (err uintptr)
152 TEXT ·gettimeofday(SB),NOSPLIT,$0-16
153 MOVQ tv+0(FP), DI
154 MOVQ $0, SI
155 MOVQ runtime·vdsoGettimeofdaySym(SB), AX
156 CALL AX
157
158 CMPQ AX, $0xfffffffffffff001
159 JLS ok7
160 NEGQ AX
161 MOVQ AX, err+8(FP)
162 RET
163 ok7:
164 MOVQ $0, err+8(FP)
165 RET
View as plain text