From f65b55d7ce760a3c9957cc3da1127c1f8fe8e33c Mon Sep 17 00:00:00 2001 From: Robert Vollmert Date: Sat, 8 Jul 2017 00:35:49 +0200 Subject: [PATCH] go_1_6: Fix darwin (sierra) compile, backport systime syscall fix This patches go1.6 minimally with a change that was backported to upstream go1.4. --- pkgs/development/compilers/go/1.6.nix | 1 + .../compilers/go/fix-systime-1.6.patch | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 pkgs/development/compilers/go/fix-systime-1.6.patch diff --git a/pkgs/development/compilers/go/1.6.nix b/pkgs/development/compilers/go/1.6.nix index 4a777d7b4f1..61408c0ebb3 100644 --- a/pkgs/development/compilers/go/1.6.nix +++ b/pkgs/development/compilers/go/1.6.nix @@ -113,6 +113,7 @@ stdenv.mkDerivation rec { patches = [ ./remove-tools-1.5.patch ./creds-test.patch + ./fix-systime-1.6.patch # This test checks for the wrong thing with recent tzdata. It's been fixed in master but the patch # actually works on old versions too. diff --git a/pkgs/development/compilers/go/fix-systime-1.6.patch b/pkgs/development/compilers/go/fix-systime-1.6.patch new file mode 100644 index 00000000000..e4a3932001e --- /dev/null +++ b/pkgs/development/compilers/go/fix-systime-1.6.patch @@ -0,0 +1,45 @@ +diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s +index e09b906ba5..fa8ff2f65c 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 +diff --git a/src/syscall/syscall_darwin_amd64.go b/src/syscall/syscall_darwin_amd64.go +index 70b53b87f4..79083117b6 100644 +--- a/src/syscall/syscall_darwin_amd64.go ++++ b/src/syscall/syscall_darwin_amd64.go +@@ -26,14 +26,21 @@ 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) {