01e72064d4
Signed-off-by: L.W.Reek <syphyr@gmail.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
172 lines
5.0 KiB
Diff
172 lines
5.0 KiB
Diff
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
|
|
|