We introduced VDSO feature for mips64x in Go1.14, however Linux kernel
didn't ship VDSO safe fallback until 4.13.
This CL checks vdso return code it may fix this issue.
name old time/op new time/op delta
Now 174ns ± 0% 176ns ± 0% +1.20% (p=0.000 n=8+9)
NowUnixNano 175ns ± 0% 177ns ± 0% +1.13% (p=0.000 n=9+7)
FormatNow 1.01µs ± 1% 1.02µs ± 3% ~ (p=0.181 n=10+10)
Fixes #39046
Change-Id: Ibcefe4c8334f634c7ef18fa70f3c7dbe8306f224
Reviewed-on: https://go-review.googlesource.com/c/go/+/270717
Run-TryBot: Meng Zhuo <mzh@golangcn.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Michael Pratt <mpratt@google.com>
Trust: Meng Zhuo <mzh@golangcn.org>
BEQ R25, fallback
JAL (R25)
+ // check on vdso call return for kernel compatibility
+ // see https://golang.org/issues/39046
+ // if we get any error make fallback permanent.
+ BEQ R2, R0, finish
+ MOVV R0, runtime·vdsoClockgettimeSym(SB)
+ MOVW $0, R4 // CLOCK_REALTIME
+ MOVV $0(R29), R5
+ JMP fallback
finish:
MOVV 0(R29), R3 // sec
BEQ R25, fallback
JAL (R25)
+ // see walltime1 for detail
+ BEQ R2, R0, finish
+ MOVV R0, runtime·vdsoClockgettimeSym(SB)
+ MOVW $1, R4 // CLOCK_MONOTONIC
+ MOVV $0(R29), R5
+ JMP fallback
finish:
MOVV 0(R29), R3 // sec