|
- From b19623e7673a4d6743745382d5d38751b64e011d Mon Sep 17 00:00:00 2001
- From: "Jason A. Donenfeld" <Jason@zx2c4.com>
- 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 72c43bd9da..daadfe32a9 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 5c300f553d..e4a6f12ec6 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 9c7398451c..61b6cd91f6 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 2835b6ca1c..346ca9cfce 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 33ed1050c2..59a5be179c 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 6e539fbc6f..55b2bf7156 100644
- --- a/src/runtime/sys_linux_mipsx.s
- +++ b/src/runtime/sys_linux_mipsx.s
- @@ -194,7 +194,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 13d23156bd..f67e5062aa 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 58b36dff0a..cb92e9a402 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.23.0
|