aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-11-05 00:59:07 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2021-11-06 14:36:57 +0100
commit6144b4844252806b36a76147677b14b234cb2ade (patch)
tree3a64ceb1524a2d0aba8a278ce633b9a99e44d0a3
parentgo-patches: read nanotime in 1 instruction on 64bit (diff)
downloadwireguard-windows-6144b4844252806b36a76147677b14b234cb2ade.tar.xz
wireguard-windows-6144b4844252806b36a76147677b14b234cb2ade.zip
go-patches: return correct nanosec param on arm64
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--go-patches/0004-runtime-use-correct-constant-when-computing-nsec-rem.patch81
1 files changed, 81 insertions, 0 deletions
diff --git a/go-patches/0004-runtime-use-correct-constant-when-computing-nsec-rem.patch b/go-patches/0004-runtime-use-correct-constant-when-computing-nsec-rem.patch
new file mode 100644
index 00000000..4a826068
--- /dev/null
+++ b/go-patches/0004-runtime-use-correct-constant-when-computing-nsec-rem.patch
@@ -0,0 +1,81 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: "Jason A. Donenfeld" <Jason@zx2c4.com>
+Date: Fri, 5 Nov 2021 00:10:31 +0100
+Subject: [PATCH] runtime: use correct constant when computing nsec remainder
+
+A code comment on amd64 for windows and plan9 contained a snippet for
+splitting apart the sec and nsec components of a unix timestamp, with
+produced assembly below, which was then cleaned up by hand. When arm64
+was ported, that code snippet in the comment went through the compiler
+to produce some code that was then pasted and cleaned up. Unfortunately,
+the comment had a typo in it, containing 8 zeros instead of 9.
+
+This resulted in the constant used in the assembly being wrong, spotted
+by @bufflig's eagle eyes. So, this commit fixes the comment on all three
+platforms, and the assembly on windows/arm64.
+
+Fixes #48072.
+
+Change-Id: I786fe89147328b0d25544f52c927ddfdb9f6f1cf
+Reviewed-on: https://go-review.googlesource.com/c/go/+/361474
+Trust: Jason A. Donenfeld <Jason@zx2c4.com>
+Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com>
+Reviewed-by: Patrik Nyblom <pnyb@google.com>
+TryBot-Result: Go Bot <gobot@golang.org>
+---
+ src/runtime/sys_plan9_amd64.s | 2 +-
+ src/runtime/time_windows_amd64.s | 2 +-
+ src/runtime/time_windows_arm64.s | 9 +++------
+ 3 files changed, 5 insertions(+), 8 deletions(-)
+
+diff --git a/src/runtime/sys_plan9_amd64.s b/src/runtime/sys_plan9_amd64.s
+index 731306ab44..068200b7f3 100644
+--- a/src/runtime/sys_plan9_amd64.s
++++ b/src/runtime/sys_plan9_amd64.s
+@@ -94,7 +94,7 @@ TEXT runtime·walltime(SB),NOSPLIT,$8-12
+ MOVQ 0(SP), AX
+
+ // generated code for
+- // func f(x uint64) (uint64, uint64) { return x/1000000000, x%100000000 }
++ // func f(x uint64) (uint64, uint64) { return x/1000000000, x%1000000000 }
+ // adapted to reduce duplication
+ MOVQ AX, CX
+ MOVQ $1360296554856532783, AX
+diff --git a/src/runtime/time_windows_amd64.s b/src/runtime/time_windows_amd64.s
+index 045f64eb46..70f6a008cd 100644
+--- a/src/runtime/time_windows_amd64.s
++++ b/src/runtime/time_windows_amd64.s
+@@ -25,7 +25,7 @@ TEXT time·now(SB),NOSPLIT,$0-24
+ IMULQ $100, AX
+
+ // generated code for
+- // func f(x uint64) (uint64, uint64) { return x/1000000000, x%100000000 }
++ // func f(x uint64) (uint64, uint64) { return x/1000000000, x%1000000000 }
+ // adapted to reduce duplication
+ MOVQ AX, CX
+ MOVQ $1360296554856532783, AX
+diff --git a/src/runtime/time_windows_arm64.s b/src/runtime/time_windows_arm64.s
+index e8a0eb2f93..ef5b848473 100644
+--- a/src/runtime/time_windows_arm64.s
++++ b/src/runtime/time_windows_arm64.s
+@@ -32,17 +32,14 @@ TEXT time·now(SB),NOSPLIT|NOFRAME,$0-24
+ // Code stolen from compiler output for:
+ //
+ // var x uint64
+- // func f() (sec uint64, nsec uint32) { return x / 1000000000, uint32(x % 100000000) }
++ // func f() (sec uint64, nsec uint32) { return x / 1000000000, uint32(x % 1000000000) }
+ //
+ LSR $1, R0, R1
+ MOVD $-8543223759426509416, R2
+- UMULH R2, R1, R1
++ UMULH R1, R2, R1
+ LSR $28, R1, R1
+ MOVD R1, sec+0(FP)
+- MOVD $-6067343680855748867, R1
+- UMULH R0, R1, R1
+- LSR $26, R1, R1
+- MOVD $100000000, R2
++ MOVD $1000000000, R2
+ MSUB R1, R0, R2, R0
+ MOVW R0, nsec+8(FP)
+ RET