Fix nanotime for macOS Sierra
This commit is contained in:
parent
7e3e63c06c
commit
1ffe9f2d11
@ -131,6 +131,11 @@ Patch215: ./go1.5-zoneinfo_testing_only.patch
|
||||
# Backport of https://go-review.googlesource.com/#/c/20471/
|
||||
Patch216: runtime-use-entire-address-space-on-32-bit.patch
|
||||
|
||||
# Backport of https://github.com/golang/go/issues/16570
|
||||
# and https://github.com/golang/go/issues/16606
|
||||
Patch217: macos-01.patch
|
||||
Patch218: macos-02.patch
|
||||
|
||||
# Having documentation separate was broken
|
||||
Obsoletes: %{name}-docs < 1.1-4
|
||||
|
||||
@ -258,6 +263,9 @@ Summary: Golang shared object libraries
|
||||
|
||||
%patch216 -p1
|
||||
|
||||
%patch217 -p1
|
||||
%patch218 -p1
|
||||
|
||||
%build
|
||||
# print out system information
|
||||
uname -a
|
||||
@ -464,6 +472,7 @@ fi
|
||||
%changelog
|
||||
* Tue Sep 27 2016 Jakub Čajka <jcajka@redhat.com> - 1.6.3-3
|
||||
- Resolves: BZ#1378960 - make possible to use whole address space on 32bit
|
||||
- Fix nanotime for macOS Sierra
|
||||
|
||||
* Mon Aug 08 2016 Jakub Čajka <jcajka@redhat.com> - 1.6.3-2
|
||||
- Obsolete golang-vet and golang-cover from golang-googlecode-tools package
|
||||
|
60
macos-01.patch
Normal file
60
macos-01.patch
Normal file
@ -0,0 +1,60 @@
|
||||
From 2da5633eb9091608047881953f75b489a3134cdc Mon Sep 17 00:00:00 2001
|
||||
From: Brad Fitzpatrick <bradfitz@golang.org>
|
||||
Date: Mon, 1 Aug 2016 21:54:40 -0700
|
||||
Subject: [PATCH] runtime: fix nanotime for macOS Sierra, again.
|
||||
|
||||
macOS Sierra beta4 changed the kernel interface for getting time.
|
||||
DX now optionally points to an address for additional info.
|
||||
Set it to zero to avoid corrupting memory.
|
||||
|
||||
Fixes #16570
|
||||
|
||||
Change-Id: I9f537e552682045325cdbb68b7d0b4ddafade14a
|
||||
Reviewed-on: https://go-review.googlesource.com/25400
|
||||
Reviewed-by: David Crawshaw <crawshaw@golang.org>
|
||||
Reviewed-by: Ian Lance Taylor <iant@golang.org>
|
||||
Reviewed-by: Quentin Smith <quentin@golang.org>
|
||||
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
|
||||
Reviewed-by: Austin Clements <austin@google.com>
|
||||
TryBot-Result: Gobot Gobot <gobot@golang.org>
|
||||
---
|
||||
src/runtime/sys_darwin_386.s | 7 ++++---
|
||||
src/runtime/sys_darwin_amd64.s | 1 +
|
||||
2 files changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/runtime/sys_darwin_386.s b/src/runtime/sys_darwin_386.s
|
||||
index 83f4709..b5e65e6 100644
|
||||
--- a/src/runtime/sys_darwin_386.s
|
||||
+++ b/src/runtime/sys_darwin_386.s
|
||||
@@ -196,15 +196,16 @@ timeloop:
|
||||
|
||||
systime:
|
||||
// Fall back to system call (usually first call in this thread)
|
||||
- LEAL 12(SP), AX // must be non-nil, unused
|
||||
+ LEAL 16(SP), AX // must be non-nil, unused
|
||||
MOVL AX, 4(SP)
|
||||
MOVL $0, 8(SP) // time zone pointer
|
||||
+ MOVL $0, 12(SP) // required as of Sierra; Issue 16570
|
||||
MOVL $116, AX
|
||||
INT $0x80
|
||||
CMPL AX, $0
|
||||
JNE inreg
|
||||
- MOVL 12(SP), AX
|
||||
- MOVL 16(SP), DX
|
||||
+ MOVL 16(SP), AX
|
||||
+ MOVL 20(SP), DX
|
||||
inreg:
|
||||
// sec is in AX, usec in DX
|
||||
// convert to DX:AX nsec
|
||||
diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s
|
||||
index e4837ce..ea2cc06 100644
|
||||
--- a/src/runtime/sys_darwin_amd64.s
|
||||
+++ b/src/runtime/sys_darwin_amd64.s
|
||||
@@ -157,6 +157,7 @@ systime:
|
||||
// Fall back to system call (usually first call in this thread).
|
||||
MOVQ SP, DI
|
||||
MOVQ $0, SI
|
||||
+ MOVQ $0, DX // required as of Sierra; Issue 16570
|
||||
MOVL $(0x2000000+116), AX
|
||||
SYSCALL
|
||||
CMPQ AX, $0
|
68
macos-02.patch
Normal file
68
macos-02.patch
Normal file
@ -0,0 +1,68 @@
|
||||
diff --git a/src/syscall/syscall_darwin_386.go b/src/syscall/syscall_darwin_386.go
|
||||
index 2074e7a..286ca98 100644
|
||||
--- a/src/syscall/syscall_darwin_386.go
|
||||
+++ b/src/syscall/syscall_darwin_386.go
|
||||
@@ -26,14 +26,22 @@ func NsecToTimeval(nsec int64) (tv Timeval) {
|
||||
}
|
||||
|
||||
//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error)
|
||||
-func Gettimeofday(tv *Timeval) (err error) {
|
||||
- // The tv passed to gettimeofday must be non-nil
|
||||
- // but is otherwise unused. The answers come back
|
||||
- // in the two registers.
|
||||
+func Gettimeofday(tv *Timeval) error {
|
||||
+ // The tv passed to gettimeofday must be non-nil.
|
||||
+ // Before macOS Sierra (10.12), tv was otherwise unused and
|
||||
+ // the answers came back in the two registers.
|
||||
+ // As of Sierra, gettimeofday return zeros and populates
|
||||
+ // tv itself.
|
||||
sec, usec, err := gettimeofday(tv)
|
||||
- tv.Sec = int32(sec)
|
||||
- tv.Usec = int32(usec)
|
||||
- return err
|
||||
+ if err != nil {
|
||||
+ return err
|
||||
+ }
|
||||
+ if sec != 0 || usec != 0 {
|
||||
+ tv.Sec = int32(sec)
|
||||
+ tv.Usec = int32(usec)
|
||||
+ }
|
||||
+ return nil
|
||||
+
|
||||
}
|
||||
|
||||
func SetKevent(k *Kevent_t, fd, mode, flags int) {
|
||||
diff --git a/src/syscall/syscall_darwin_amd64.go b/src/syscall/syscall_darwin_amd64.go
|
||||
index 70b53b8..e2565ba 100644
|
||||
--- a/src/syscall/syscall_darwin_amd64.go
|
||||
+++ b/src/syscall/syscall_darwin_amd64.go
|
||||
@@ -26,14 +26,22 @@ func NsecToTimeval(nsec int64) (tv Timeval) {
|
||||
}
|
||||
|
||||
//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error)
|
||||
-func Gettimeofday(tv *Timeval) (err error) {
|
||||
- // The tv passed to gettimeofday must be non-nil
|
||||
- // but is otherwise unused. The answers come back
|
||||
- // in the two registers.
|
||||
+func Gettimeofday(tv *Timeval) error {
|
||||
+ // The tv passed to gettimeofday must be non-nil.
|
||||
+ // Before macOS Sierra (10.12), tv was otherwise unused and
|
||||
+ // the answers came back in the two registers.
|
||||
+ // As of Sierra, gettimeofday return zeros and populates
|
||||
+ // tv itself.
|
||||
sec, usec, err := gettimeofday(tv)
|
||||
- tv.Sec = sec
|
||||
- tv.Usec = usec
|
||||
- return err
|
||||
+ if err != nil {
|
||||
+ return err
|
||||
+ }
|
||||
+ if sec != 0 || usec != 0 {
|
||||
+ tv.Sec = sec
|
||||
+ tv.Usec = usec
|
||||
+ }
|
||||
+ return nil
|
||||
+
|
||||
}
|
||||
|
||||
func SetKevent(k *Kevent_t, fd, mode, flags int) {
|
Loading…
Reference in New Issue
Block a user