aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2016-07-07 16:41:29 -0700
committerAndrew Gerrand <adg@golang.org>2016-07-08 03:48:20 +0000
commit53da5fd4d431881bb3583c9790db7735a6530a1b (patch)
treebb8a715172854b6e17ea81b2a8b550438e49987c
parenta91416e7abf2236909f99aea85accfe98a9ba1fd (diff)
downloadgo-53da5fd4d431881bb3583c9790db7735a6530a1b.tar.gz
go-53da5fd4d431881bb3583c9790db7735a6530a1b.zip
[release-branch.go1.7] runtime: fix nanotime for macOS Sierrago1.7rc1
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: Ibe5ad50a2c5b125e92b5a4e787db4b5179f6b723 Reviewed-on: https://go-review.googlesource.com/24812 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-on: https://go-review.googlesource.com/24755 Reviewed-by: Chris Broadfoot <cbro@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 9e45f8a002..83f4709f38 100644
--- a/src/runtime/sys_darwin_386.s
+++ b/src/runtime/sys_darwin_386.s
@@ -201,6 +201,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 7b9cf6a3bc..e09b906ba5 100644
--- a/src/runtime/sys_darwin_amd64.s
+++ b/src/runtime/sys_darwin_amd64.s
@@ -155,10 +155,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