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#define SYS_gettimeofday 96
13
14// func rawVforkSyscall(trap, a1, a2, a3 uintptr) (r1, err uintptr)
15TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-48
16	MOVQ	a1+8(FP), DI
17	MOVQ	a2+16(FP), SI
18	MOVQ	a3+24(FP), DX
19	MOVQ	$0, R10
20	MOVQ	$0, R8
21	MOVQ	$0, R9
22	MOVQ	trap+0(FP), AX	// syscall entry
23	POPQ	R12 // preserve return address
24	SYSCALL
25	PUSHQ	R12
26	CMPQ	AX, $0xfffffffffffff001
27	JLS	ok2
28	MOVQ	$-1, r1+32(FP)
29	NEGQ	AX
30	MOVQ	AX, err+40(FP)
31	RET
32ok2:
33	MOVQ	AX, r1+32(FP)
34	MOVQ	$0, err+40(FP)
35	RET
36
37// func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr)
38TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48
39	MOVQ	a1+8(FP), DI
40	MOVQ	a2+16(FP), SI
41	MOVQ	a3+24(FP), DX
42	MOVQ	trap+0(FP), AX	// syscall entry
43	SYSCALL
44	MOVQ	AX, r1+32(FP)
45	MOVQ	DX, r2+40(FP)
46	RET
47
48// func gettimeofday(tv *Timeval) (err uintptr)
49TEXT ·gettimeofday(SB),NOSPLIT,$0-16
50	MOVQ	tv+0(FP), DI
51	MOVQ	$0, SI
52	MOVQ	runtime·vdsoGettimeofdaySym(SB), AX
53	TESTQ   AX, AX
54	JZ fallback
55	CALL	AX
56ret:
57	CMPQ	AX, $0xfffffffffffff001
58	JLS	ok7
59	NEGQ	AX
60	MOVQ	AX, err+8(FP)
61	RET
62fallback:
63	MOVL	$SYS_gettimeofday, AX
64	SYSCALL
65	JMP ret
66ok7:
67	MOVQ	$0, err+8(FP)
68	RET
69