Text file
src/runtime/time_linux_amd64.s
Documentation: runtime
1 // Copyright 2021 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 //go:build !faketime
6 // +build !faketime
7
8 #include "go_asm.h"
9 #include "go_tls.h"
10 #include "textflag.h"
11
12 #define SYS_clock_gettime 228
13
14 // func time.now() (sec int64, nsec int32, mono int64)
15 TEXT time·now(SB),NOSPLIT,$16-24
16 MOVQ SP, R12 // Save old SP; R12 unchanged by C code.
17
18 #ifdef GOEXPERIMENT_regabig
19 MOVQ g_m(R14), BX // BX unchanged by C code.
20 #else
21 get_tls(CX)
22 MOVQ g(CX), AX
23 MOVQ g_m(AX), BX // BX unchanged by C code.
24 #endif
25
26 // Store CLOCK_REALTIME results directly to return space.
27 LEAQ sec+0(FP), SI
28
29 // Set vdsoPC and vdsoSP for SIGPROF traceback.
30 // Save the old values on stack and restore them on exit,
31 // so this function is reentrant.
32 MOVQ m_vdsoPC(BX), CX
33 MOVQ m_vdsoSP(BX), DX
34 MOVQ CX, 0(SP)
35 MOVQ DX, 8(SP)
36
37 MOVQ -8(SI), CX // Sets CX to function return address.
38 MOVQ CX, m_vdsoPC(BX)
39 MOVQ SI, m_vdsoSP(BX)
40
41 #ifdef GOEXPERIMENT_regabig
42 CMPQ R14, m_curg(BX) // Only switch if on curg.
43 #else
44 CMPQ AX, m_curg(BX) // Only switch if on curg.
45 #endif
46 JNE noswitch
47
48 MOVQ m_g0(BX), DX
49 MOVQ (g_sched+gobuf_sp)(DX), SP // Set SP to g0 stack
50
51 noswitch:
52 SUBQ $16, SP // Space for monotonic time results
53 ANDQ $~15, SP // Align for C code
54
55 MOVL $0, DI // CLOCK_REALTIME
56 MOVQ runtime·vdsoClockgettimeSym(SB), AX
57 CMPQ AX, $0
58 JEQ fallback
59 CALL AX
60
61 MOVL $1, DI // CLOCK_MONOTONIC
62 LEAQ 0(SP), SI
63 MOVQ runtime·vdsoClockgettimeSym(SB), AX
64 CALL AX
65
66 ret:
67 MOVQ 0(SP), AX // sec
68 MOVQ 8(SP), DX // nsec
69
70 MOVQ R12, SP // Restore real SP
71 // Restore vdsoPC, vdsoSP
72 // We don't worry about being signaled between the two stores.
73 // If we are not in a signal handler, we'll restore vdsoSP to 0,
74 // and no one will care about vdsoPC. If we are in a signal handler,
75 // we cannot receive another signal.
76 MOVQ 8(SP), CX
77 MOVQ CX, m_vdsoSP(BX)
78 MOVQ 0(SP), CX
79 MOVQ CX, m_vdsoPC(BX)
80
81 // sec is in AX, nsec in DX
82 // return nsec in AX
83 IMULQ $1000000000, AX
84 ADDQ DX, AX
85 MOVQ AX, mono+16(FP)
86 RET
87
88 fallback:
89 MOVQ $SYS_clock_gettime, AX
90 SYSCALL
91
92 MOVL $1, DI // CLOCK_MONOTONIC
93 LEAQ 0(SP), SI
94 MOVQ $SYS_clock_gettime, AX
95 SYSCALL
96
97 JMP ret
98
View as plain text