aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2016-07-07 16:41:29 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2016-10-23 03:36:42 +0000
commitc26cf5cc1a3a128d1c7e20cf5ca79547263fce38 (patch)
treecf679f9f5a1a3bd4cba87a88751f37b77dccfe64
parentf8c06b1f70334203f4fee20557b4b9ca7a1d9d8d (diff)
downloadgo-c26cf5cc1a3a128d1c7e20cf5ca79547263fce38.tar.gz
go-c26cf5cc1a3a128d1c7e20cf5ca79547263fce38.zip
runtime: fix nanotime for macOS Sierra
This is a cherry-pick of https://go-review.googlesource.com/24812 to the release-branch-go1.4 In the beta version of the macOS Sierra (10.12) release, the gettimeofday system call changed on x86. Previously it always returned the time in the AX/DX registers. Now, if AX is returned as 0, it means that the system call has stored the values into the memory pointed to by the first argument, just as the libc gettimeofday function does. The libc function handles both cases, and we need to do so as well. Fixes #16272. Change-Id: I490ed0a82e251fce73becc4722cbe276feebc7b7 Reviewed-on: https://go-review.googlesource.com/31729 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r--src/runtime/sys_darwin_386.s5
-rw-r--r--src/runtime/sys_darwin_amd64.s7
2 files changed, 11 insertions, 1 deletions
diff --git a/src/runtime/sys_darwin_386.s b/src/runtime/sys_darwin_386.s
index a961c71a83..469cabc174 100644
--- a/src/runtime/sys_darwin_386.s
+++ b/src/runtime/sys_darwin_386.s
@@ -187,6 +187,11 @@ systime:
MOVL $0, 8(SP) // time zone pointer
MOVL $116, AX
INT $0x80
+ CMPL AX, $0
+ JNE inreg
+ MOVL 12(SP), AX
+ MOVL 16(SP), DX
+inreg:
// sec is in AX, usec in DX
// convert to DX:AX nsec
MOVL DX, BX
diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s
index bd397d72a7..8f845e5503 100644
--- a/src/runtime/sys_darwin_amd64.s
+++ b/src/runtime/sys_darwin_amd64.s
@@ -141,10 +141,15 @@ timeloop:
systime:
// Fall back to system call (usually first call in this thread).
- MOVQ SP, DI // must be non-nil, unused
+ MOVQ SP, DI
MOVQ $0, SI
MOVL $(0x2000000+116), AX
SYSCALL
+ CMPQ AX, $0
+ JNE inreg
+ MOVQ 0(SP), AX
+ MOVL 8(SP), DX
+inreg:
// sec is in AX, usec in DX
// return nsec in AX
IMULQ $1000000000, AX