summaryrefslogtreecommitdiffhomepage
path: root/tunnel/tools/libwg-go/goruntime-boottime-over-monotonic.diff
blob: 5d78242b139e58e43ed0d75ccb3dec0f6efaac55 (plain)
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
From 61f3ae8298d1c503cbc31539e0f3a73446c7db9d Mon Sep 17 00:00:00 2001
From: "Jason A. Donenfeld" <Jason@zx2c4.com>
Date: Tue, 21 Mar 2023 15:33:56 +0100
Subject: [PATCH] [release-branch.go1.20] runtime: use CLOCK_BOOTTIME in
 nanotime on Linux

This makes timers account for having expired while a computer was
asleep, which is quite common on mobile devices. Note that BOOTTIME is
identical to MONOTONIC, except that it takes into account time spent
in suspend. In Linux 4.17, the kernel will actually make MONOTONIC act
like BOOTTIME anyway, so this switch will additionally unify the
timer behavior across kernels.

BOOTTIME was introduced into Linux 2.6.39-rc1 with 70a08cca1227d in
2011.

Fixes #24595

Change-Id: I7b2a6ca0c5bc5fce57ec0eeafe7b68270b429321
---
 src/runtime/sys_linux_386.s     | 4 ++--
 src/runtime/sys_linux_amd64.s   | 2 +-
 src/runtime/sys_linux_arm.s     | 4 ++--
 src/runtime/sys_linux_arm64.s   | 4 ++--
 src/runtime/sys_linux_mips64x.s | 4 ++--
 src/runtime/sys_linux_mipsx.s   | 2 +-
 src/runtime/sys_linux_ppc64x.s  | 2 +-
 src/runtime/sys_linux_s390x.s   | 2 +-
 8 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/runtime/sys_linux_386.s b/src/runtime/sys_linux_386.s
index 12a294153d..17e3524b40 100644
--- a/src/runtime/sys_linux_386.s
+++ b/src/runtime/sys_linux_386.s
@@ -352,13 +352,13 @@ noswitch:
 
 	LEAL	8(SP), BX	// &ts (struct timespec)
 	MOVL	BX, 4(SP)
-	MOVL	$1, 0(SP)	// CLOCK_MONOTONIC
+	MOVL	$7, 0(SP)	// CLOCK_BOOTTIME
 	CALL	AX
 	JMP finish
 
 fallback:
 	MOVL	$SYS_clock_gettime, AX
-	MOVL	$1, BX		// CLOCK_MONOTONIC
+	MOVL	$7, BX		// CLOCK_BOOTTIME
 	LEAL	8(SP), CX
 	INVOKE_SYSCALL
 
diff --git a/src/runtime/sys_linux_amd64.s b/src/runtime/sys_linux_amd64.s
index c7a89ba536..01f0a6a26e 100644
--- a/src/runtime/sys_linux_amd64.s
+++ b/src/runtime/sys_linux_amd64.s
@@ -255,7 +255,7 @@ noswitch:
 	SUBQ	$16, SP		// Space for results
 	ANDQ	$~15, SP	// Align for C code
 
-	MOVL	$1, DI // CLOCK_MONOTONIC
+	MOVL	$7, DI // CLOCK_BOOTTIME
 	LEAQ	0(SP), SI
 	MOVQ	runtime·vdsoClockgettimeSym(SB), AX
 	CMPQ	AX, $0
diff --git a/src/runtime/sys_linux_arm.s b/src/runtime/sys_linux_arm.s
index 7b8c4f0e04..9798a1334e 100644
--- a/src/runtime/sys_linux_arm.s
+++ b/src/runtime/sys_linux_arm.s
@@ -11,7 +11,7 @@
 #include "textflag.h"
 
 #define CLOCK_REALTIME	0
-#define CLOCK_MONOTONIC	1
+#define CLOCK_BOOTTIME	7
 
 // for EABI, as we don't support OABI
 #define SYS_BASE 0x0
@@ -374,7 +374,7 @@ finish:
 
 // func nanotime1() int64
 TEXT runtime·nanotime1(SB),NOSPLIT,$12-8
-	MOVW	$CLOCK_MONOTONIC, R0
+	MOVW	$CLOCK_BOOTTIME, R0
 	MOVW	$spec-12(SP), R1	// timespec
 
 	MOVW	runtime·vdsoClockgettimeSym(SB), R4
diff --git a/src/runtime/sys_linux_arm64.s b/src/runtime/sys_linux_arm64.s
index 38ff6ac330..6b819c5441 100644
--- a/src/runtime/sys_linux_arm64.s
+++ b/src/runtime/sys_linux_arm64.s
@@ -14,7 +14,7 @@
 #define AT_FDCWD -100
 
 #define CLOCK_REALTIME 0
-#define CLOCK_MONOTONIC 1
+#define CLOCK_BOOTTIME 7
 
 #define SYS_exit		93
 #define SYS_read		63
@@ -338,7 +338,7 @@ noswitch:
 	BIC	$15, R1
 	MOVD	R1, RSP
 
-	MOVW	$CLOCK_MONOTONIC, R0
+	MOVW	$CLOCK_BOOTTIME, R0
 	MOVD	runtime·vdsoClockgettimeSym(SB), R2
 	CBZ	R2, fallback
 
diff --git a/src/runtime/sys_linux_mips64x.s b/src/runtime/sys_linux_mips64x.s
index 47f2da524d..a8b387f193 100644
--- a/src/runtime/sys_linux_mips64x.s
+++ b/src/runtime/sys_linux_mips64x.s
@@ -326,7 +326,7 @@ noswitch:
 	AND	$~15, R1	// Align for C code
 	MOVV	R1, R29
 
-	MOVW	$1, R4 // CLOCK_MONOTONIC
+	MOVW	$7, R4 // CLOCK_BOOTTIME
 	MOVV	$0(R29), R5
 
 	MOVV	runtime·vdsoClockgettimeSym(SB), R25
@@ -336,7 +336,7 @@ noswitch:
 	// see walltime for detail
 	BEQ	R2, R0, finish
 	MOVV	R0, runtime·vdsoClockgettimeSym(SB)
-	MOVW	$1, R4 // CLOCK_MONOTONIC
+	MOVW	$7, R4 // CLOCK_BOOTTIME
 	MOVV	$0(R29), R5
 	JMP	fallback
 
diff --git a/src/runtime/sys_linux_mipsx.s b/src/runtime/sys_linux_mipsx.s
index 5e6b6c1504..7f5fd2a80e 100644
--- a/src/runtime/sys_linux_mipsx.s
+++ b/src/runtime/sys_linux_mipsx.s
@@ -243,7 +243,7 @@ TEXT runtime·walltime(SB),NOSPLIT,$8-12
 	RET
 
 TEXT runtime·nanotime1(SB),NOSPLIT,$8-8
-	MOVW	$1, R4	// CLOCK_MONOTONIC
+	MOVW	$7, R4	// CLOCK_BOOTTIME
 	MOVW	$4(R29), R5
 	MOVW	$SYS_clock_gettime, R2
 	SYSCALL
diff --git a/src/runtime/sys_linux_ppc64x.s b/src/runtime/sys_linux_ppc64x.s
index d0427a4807..05ee9fede9 100644
--- a/src/runtime/sys_linux_ppc64x.s
+++ b/src/runtime/sys_linux_ppc64x.s
@@ -298,7 +298,7 @@ fallback:
 	JMP	return
 
 TEXT runtime·nanotime1(SB),NOSPLIT,$16-8
-	MOVD	$1, R3		// CLOCK_MONOTONIC
+	MOVD	$7, R3		// CLOCK_BOOTTIME
 
 	MOVD	R1, R15		// R15 is unchanged by C code
 	MOVD	g_m(g), R21	// R21 = m
diff --git a/src/runtime/sys_linux_s390x.s b/src/runtime/sys_linux_s390x.s
index 1448670b91..7d2ee3231c 100644
--- a/src/runtime/sys_linux_s390x.s
+++ b/src/runtime/sys_linux_s390x.s
@@ -296,7 +296,7 @@ fallback:
 	RET
 
 TEXT runtime·nanotime1(SB),NOSPLIT,$32-8
-	MOVW	$1, R2			// CLOCK_MONOTONIC
+	MOVW	$7, R2			// CLOCK_BOOTTIME
 
 	MOVD	R15, R7			// Backup stack pointer
 
-- 
2.17.1