From 6998a7866b8428fd49c31506795c9f8154826d13 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 27 Feb 2019 05:05:44 +0100 Subject: [PATCH] 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 | 2 +- src/runtime/sys_linux_mipsx.s | 2 +- src/runtime/sys_linux_ppc64x.s | 2 +- src/runtime/sys_linux_s390x.s | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/runtime/sys_linux_386.s b/src/runtime/sys_linux_386.s index 40b55a67eb..6105780ff4 100644 --- a/src/runtime/sys_linux_386.s +++ b/src/runtime/sys_linux_386.s @@ -288,13 +288,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 b709f77060..18a1f1d43a 100644 --- a/src/runtime/sys_linux_amd64.s +++ b/src/runtime/sys_linux_amd64.s @@ -261,7 +261,7 @@ noswitch: MOVQ runtime·vdsoClockgettimeSym(SB), AX CMPQ AX, $0 JEQ fallback - MOVL $1, DI // CLOCK_MONOTONIC + MOVL $7, DI // CLOCK_BOOTTIME LEAQ 0(SP), SI CALL AX MOVQ 0(SP), AX // sec diff --git a/src/runtime/sys_linux_arm.s b/src/runtime/sys_linux_arm.s index 43a58335c8..8b93635f4f 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 @@ -291,7 +291,7 @@ noswitch: SUB $24, R13 // Space for results BIC $0x7, R13 // Align for C code - MOVW $CLOCK_MONOTONIC, R0 + MOVW $CLOCK_BOOTTIME, R0 MOVW $8(R13), R1 // timespec MOVW runtime·vdsoClockgettimeSym(SB), R11 CMP $0, R11 diff --git a/src/runtime/sys_linux_arm64.s b/src/runtime/sys_linux_arm64.s index 8b344be8f8..daf142fba0 100644 --- a/src/runtime/sys_linux_arm64.s +++ b/src/runtime/sys_linux_arm64.s @@ -13,7 +13,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 @@ -247,7 +247,7 @@ noswitch: BIC $15, R1 MOVD R1, RSP - MOVW $CLOCK_MONOTONIC, R0 + MOVW $CLOCK_BOOTTIME, R0 MOVD runtime·vdsoClockgettimeSym(SB), R2 CBZ R2, fallback BL (R2) diff --git a/src/runtime/sys_linux_mips64x.s b/src/runtime/sys_linux_mips64x.s index c45703d228..9842b596e7 100644 --- a/src/runtime/sys_linux_mips64x.s +++ b/src/runtime/sys_linux_mips64x.s @@ -189,7 +189,7 @@ TEXT runtime·walltime(SB),NOSPLIT,$16 RET TEXT runtime·nanotime(SB),NOSPLIT,$16 - MOVW $1, R4 // CLOCK_MONOTONIC + MOVW $7, R4 // CLOCK_BOOTTIME MOVV $0(R29), R5 MOVV $SYS_clock_gettime, R2 SYSCALL diff --git a/src/runtime/sys_linux_mipsx.s b/src/runtime/sys_linux_mipsx.s index f362b0f3f1..5ab866e047 100644 --- a/src/runtime/sys_linux_mipsx.s +++ b/src/runtime/sys_linux_mipsx.s @@ -193,7 +193,7 @@ TEXT runtime·walltime(SB),NOSPLIT,$8-12 RET TEXT runtime·nanotime(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 6835f434de..46618b2d91 100644 --- a/src/runtime/sys_linux_ppc64x.s +++ b/src/runtime/sys_linux_ppc64x.s @@ -204,7 +204,7 @@ fallback: JMP finish TEXT runtime·nanotime(SB),NOSPLIT,$16 - 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 c79ceea751..44e3258e60 100644 --- a/src/runtime/sys_linux_s390x.s +++ b/src/runtime/sys_linux_s390x.s @@ -180,7 +180,7 @@ TEXT runtime·walltime(SB),NOSPLIT,$16 RET TEXT runtime·nanotime(SB),NOSPLIT,$16 - MOVW $1, R2 // CLOCK_MONOTONIC + MOVW $7, R2 // CLOCK_BOOTTIME MOVD $tp-16(SP), R3 MOVW $SYS_clock_gettime, R1 SYSCALL -- 2.20.1