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
17TEXT ·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	trap+0(FP), AX	// syscall entry
23	SYSCALL
24	CMPQ	AX, $0xfffffffffffff001
25	JLS	ok
26	MOVQ	$-1, r1+32(FP)
27	MOVQ	$0, r2+40(FP)
28	NEGQ	AX
29	MOVQ	AX, err+48(FP)
30	CALL	runtime·exitsyscall(SB)
31	RET
32ok:
33	MOVQ	AX, r1+32(FP)
34	MOVQ	DX, r2+40(FP)
35	MOVQ	$0, err+48(FP)
36	CALL	runtime·exitsyscall(SB)
37	RET
38
39// func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
40TEXT ·Syscall6(SB),NOSPLIT,$0-80
41	CALL	runtime·entersyscall(SB)
42	MOVQ	a1+8(FP), DI
43	MOVQ	a2+16(FP), SI
44	MOVQ	a3+24(FP), DX
45	MOVQ	a4+32(FP), R10
46	MOVQ	a5+40(FP), R8
47	MOVQ	a6+48(FP), R9
48	MOVQ	trap+0(FP), AX	// syscall entry
49	SYSCALL
50	CMPQ	AX, $0xfffffffffffff001
51	JLS	ok6
52	MOVQ	$-1, r1+56(FP)
53	MOVQ	$0, r2+64(FP)
54	NEGQ	AX
55	MOVQ	AX, err+72(FP)
56	CALL	runtime·exitsyscall(SB)
57	RET
58ok6:
59	MOVQ	AX, r1+56(FP)
60	MOVQ	DX, r2+64(FP)
61	MOVQ	$0, err+72(FP)
62	CALL	runtime·exitsyscall(SB)
63	RET
64
65// func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
66TEXT ·RawSyscall(SB),NOSPLIT,$0-56
67	MOVQ	a1+8(FP), DI
68	MOVQ	a2+16(FP), SI
69	MOVQ	a3+24(FP), DX
70	MOVQ	trap+0(FP), AX	// syscall entry
71	SYSCALL
72	CMPQ	AX, $0xfffffffffffff001
73	JLS	ok1
74	MOVQ	$-1, r1+32(FP)
75	MOVQ	$0, r2+40(FP)
76	NEGQ	AX
77	MOVQ	AX, err+48(FP)
78	RET
79ok1:
80	MOVQ	AX, r1+32(FP)
81	MOVQ	DX, r2+40(FP)
82	MOVQ	$0, err+48(FP)
83	RET
84
85// func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
86TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
87	MOVQ	a1+8(FP), DI
88	MOVQ	a2+16(FP), SI
89	MOVQ	a3+24(FP), DX
90	MOVQ	a4+32(FP), R10
91	MOVQ	a5+40(FP), R8
92	MOVQ	a6+48(FP), R9
93	MOVQ	trap+0(FP), AX	// syscall entry
94	SYSCALL
95	CMPQ	AX, $0xfffffffffffff001
96	JLS	ok2
97	MOVQ	$-1, r1+56(FP)
98	MOVQ	$0, r2+64(FP)
99	NEGQ	AX
100	MOVQ	AX, err+72(FP)
101	RET
102ok2:
103	MOVQ	AX, r1+56(FP)
104	MOVQ	DX, r2+64(FP)
105	MOVQ	$0, err+72(FP)
106	RET
107
108// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
109TEXT ·rawVforkSyscall(SB),NOSPLIT,$0-32
110	MOVQ	a1+8(FP), DI
111	MOVQ	$0, SI
112	MOVQ	$0, DX
113	MOVQ	$0, R10
114	MOVQ	$0, R8
115	MOVQ	$0, R9
116	MOVQ	trap+0(FP), AX	// syscall entry
117	POPQ	R12 // preserve return address
118	SYSCALL
119	PUSHQ	R12
120	CMPQ	AX, $0xfffffffffffff001
121	JLS	ok2
122	MOVQ	$-1, r1+16(FP)
123	NEGQ	AX
124	MOVQ	AX, err+24(FP)
125	RET
126ok2:
127	MOVQ	AX, r1+16(FP)
128	MOVQ	$0, err+24(FP)
129	RET
130
131// func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr)
132TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48
133	MOVQ	a1+8(FP), DI
134	MOVQ	a2+16(FP), SI
135	MOVQ	a3+24(FP), DX
136	MOVQ	trap+0(FP), AX	// syscall entry
137	SYSCALL
138	MOVQ	AX, r1+32(FP)
139	MOVQ	DX, r2+40(FP)
140	RET
141
142// func gettimeofday(tv *Timeval) (err uintptr)
143TEXT ·gettimeofday(SB),NOSPLIT,$0-16
144	MOVQ	tv+0(FP), DI
145	MOVQ	$0, SI
146	MOVQ	runtime·vdsoGettimeofdaySym(SB), AX
147	CALL	AX
148
149	CMPQ	AX, $0xfffffffffffff001
150	JLS	ok7
151	NEGQ	AX
152	MOVQ	AX, err+8(FP)
153	RET
154ok7:
155	MOVQ	$0, err+8(FP)
156	RET
157