diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-10-18 14:56:18 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-10-18 15:19:46 +0200 |
commit | 42f83b3279bb4dd851883f843718787c79b89ef7 (patch) | |
tree | e9724d73db48d5bf7047c2e20af4c7b780d4b1da | |
parent | version: bump (diff) | |
download | wireguard-windows-42f83b3279bb4dd851883f843718787c79b89ef7.tar.xz wireguard-windows-42f83b3279bb4dd851883f843718787c79b89ef7.zip |
build: update to go 1.13.3 and remove patcher
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | Makefile | 12 | ||||
-rw-r--r-- | build.bat | 6 | ||||
-rw-r--r-- | golang-runtime-resume-timers.patch | 203 |
3 files changed, 2 insertions, 219 deletions
@@ -3,11 +3,9 @@ export CGO_ENABLED := 1 export CGO_CFLAGS := -O3 -Wall -Wno-unused-function -Wno-switch -std=gnu11 -DWINVER=0x0601 export CGO_LDFLAGS := -Wl,--major-os-version=6 -Wl,--minor-os-version=1 -Wl,--major-subsystem-version=6 -Wl,--minor-subsystem-version=1 -Wl,--tsaware export GOOS := windows -OLD_GOROOT := $(GOROOT) -export GOROOT := $(CURDIR)/.deps/goroot rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) -SOURCE_FILES := $(call rwildcard,,*.go *.c *.h) .deps/prepared go.mod go.sum +SOURCE_FILES := $(call rwildcard,,*.go *.c *.h) go.mod go.sum RESOURCE_FILES := resources.rc version/version.h manifest.xml $(patsubst %.svg,%.ico,$(wildcard ui/icon/*.svg)) DEPLOYMENT_HOST ?= winvm @@ -15,14 +13,6 @@ DEPLOYMENT_PATH ?= Desktop all: amd64/wireguard.exe x86/wireguard.exe -.deps/prepared: export GOROOT := $(OLD_GOROOT) -.deps/prepared: $(wildcard golang-*.patch) - rm -rf .deps && mkdir -p .deps - if ! rsync --exclude=pkg/obj/go-build/trim.txt -aqL $$(go env GOROOT)/ .deps/goroot; then chmod -R +w .deps/goroot; exit 1; fi - chmod -R +w .deps/goroot - cat $^ | patch -f -N -r- -p1 -d .deps/goroot - touch $@ - %.ico: %.svg convert -background none $< -define icon:auto-resize="256,128,96,64,48,32,16" $@ @@ -13,7 +13,7 @@ if exist .deps\prepared goto :render rmdir /s /q .deps 2> NUL mkdir .deps || goto :error cd .deps || goto :error - call :download go.zip https://dl.google.com/go/go1.13.2.windows-amd64.zip 003c99e778d6f73ba677fec4b66c3bdbbb144b318cfe6ffbe26ed8493b2db9a5 || goto :error + call :download go.zip https://dl.google.com/go/go1.13.3.windows-amd64.zip 9585efeab37783152c81c6ce373b22e68f45c6801dc2c208bfd1e47b646efbef || goto :error rem Mirror of https://musl.cc/i686-w64-mingw32-native.zip call :download mingw-x86.zip https://download.wireguard.com/windows-toolchain/distfiles/i686-w64-mingw32-native-20190903.zip dfb297cc86c4a4c12eedaeb0a89dff2e1cfa9afacfb9c32690dd23ca7726560a || goto :error rem Mirror of https://musl.cc/x86_64-w64-mingw32-native.zip @@ -23,10 +23,6 @@ if exist .deps\prepared goto :render rem Mirror of https://sourceforge.net/projects/ezwinports/files/make-4.2.1-without-guile-w32-bin.zip call :download make.zip https://download.wireguard.com/windows-toolchain/distfiles/make-4.2.1-without-guile-w32-bin.zip 30641be9602712be76212b99df7209f4f8f518ba764cf564262bc9d6e4047cc7 "--strip-components 1 bin" || goto :error call :download wireguard-tools.zip https://git.zx2c4.com/WireGuard/snapshot/WireGuard-0.0.20190905.zip 6683eb4ed83a6b5b18ea4c36276e68457ca4c611e40392685c2e9da562e9c837 "--exclude wg-quick --strip-components 1" || goto :error - rem Mirror of https://sourceforge.net/projects/gnuwin32/files/patch/2.5.9-7/patch-2.5.9-7-bin.zip with fixed manifest - call :download patch.zip https://download.wireguard.com/windows-toolchain/distfiles/patch-2.5.9-7-bin-fixed-manifest.zip 25977006ca9713f2662a5d0a2ed3a5a138225b8be3757035bd7da9dcf985d0a1 "--strip-components 1 bin" || goto :error - echo [+] Patching go - for %%a in ("..\golang-*.patch") do .\patch.exe -f -N -r- -d go -p1 --binary < "%%a" || goto :error copy /y NUL prepared > NUL || goto :error cd .. || goto :error diff --git a/golang-runtime-resume-timers.patch b/golang-runtime-resume-timers.patch deleted file mode 100644 index d2a78406..00000000 --- a/golang-runtime-resume-timers.patch +++ /dev/null @@ -1,203 +0,0 @@ -From 84b070f6fab474f9e278d9e85b198e1382499b48 Mon Sep 17 00:00:00 2001 -From: "Jason A. Donenfeld" <Jason@zx2c4.com> -Date: Tue, 27 Aug 2019 06:46:16 -0600 -Subject: [PATCH] [release-branch.go1.13] runtime: monitor for suspend/resume - to kick timeouts - -Starting in Windows 8, the wait functions don't take into account -suspend time, even though the monotonic counters do. This results in -timer buckets stalling on resume. Therefore, this commit makes it so -that on resume, we return from the wait functions and recalculate the -amount of time left to wait. - -This is a cherry pick of CL 191957 and its cleanup, CL 198417. - -Updates #31528 -Fixes #34130 - -Change-Id: I0db02cc72188cb620954e87a0180e0a3c83f4a56 -Reviewed-on: https://go-review.googlesource.com/c/go/+/193607 -Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com> -TryBot-Result: Gobot Gobot <gobot@golang.org> -Reviewed-by: Austin Clements <austin@google.com> ---- - src/runtime/os_windows.go | 81 ++++++++++++++++++++++++++++++---- - src/runtime/syscall_windows.go | 12 +++-- - 2 files changed, 80 insertions(+), 13 deletions(-) - -diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go -index 074ae0f40de..1cd0932eaed 100644 ---- a/src/runtime/os_windows.go -+++ b/src/runtime/os_windows.go -@@ -49,6 +49,7 @@ const ( - //go:cgo_import_dynamic runtime._VirtualFree VirtualFree%3 "kernel32.dll" - //go:cgo_import_dynamic runtime._VirtualQuery VirtualQuery%3 "kernel32.dll" - //go:cgo_import_dynamic runtime._WaitForSingleObject WaitForSingleObject%2 "kernel32.dll" -+//go:cgo_import_dynamic runtime._WaitForMultipleObjects WaitForMultipleObjects%4 "kernel32.dll" - //go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 "kernel32.dll" - //go:cgo_import_dynamic runtime._WriteFile WriteFile%5 "kernel32.dll" - -@@ -96,6 +97,7 @@ var ( - _VirtualFree, - _VirtualQuery, - _WaitForSingleObject, -+ _WaitForMultipleObjects, - _WriteConsoleW, - _WriteFile, - _ stdFunction -@@ -139,7 +141,8 @@ func tstart_stdcall(newm *m) - func ctrlhandler() - - type mOS struct { -- waitsema uintptr // semaphore for parking on locks -+ waitsema uintptr // semaphore for parking on locks -+ resumesema uintptr // semaphore to indicate suspend/resume - } - - //go:linkname os_sigpipe os.sigpipe -@@ -258,6 +261,40 @@ func loadOptionalSyscalls() { - } - } - -+func monitorSuspendResume() { -+ const _DEVICE_NOTIFY_CALLBACK = 2 -+ type _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS struct { -+ callback uintptr -+ context uintptr -+ } -+ -+ powrprof := windowsLoadSystemLib([]byte("powrprof.dll\000")) -+ if powrprof == 0 { -+ return // Running on Windows 7, where we don't need it anyway. -+ } -+ powerRegisterSuspendResumeNotification := windowsFindfunc(powrprof, []byte("PowerRegisterSuspendResumeNotification\000")) -+ if powerRegisterSuspendResumeNotification == nil { -+ return // Running on Windows 7, where we don't need it anyway. -+ } -+ var fn interface{} = func(context uintptr, changeType uint32, setting uintptr) uintptr { -+ for mp := (*m)(atomic.Loadp(unsafe.Pointer(&allm))); mp != nil; mp = mp.alllink { -+ if mp.resumesema != 0 { -+ stdcall1(_SetEvent, mp.resumesema) -+ } -+ } -+ return 0 -+ } -+ params := _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS{ -+ callback: compileCallback(*efaceOf(&fn), true), -+ } -+ handle := uintptr(0) -+ if stdcall3(powerRegisterSuspendResumeNotification, _DEVICE_NOTIFY_CALLBACK, -+ uintptr(unsafe.Pointer(¶ms)), -+ uintptr(unsafe.Pointer(&handle))) != 0 { -+ throw("PowerRegisterSuspendResumeNotification failure") -+ } -+} -+ - //go:nosplit - func getLoadLibrary() uintptr { - return uintptr(unsafe.Pointer(_LoadLibraryW)) -@@ -488,6 +525,10 @@ func goenvs() { - } - - stdcall1(_FreeEnvironmentStringsW, uintptr(strings)) -+ -+ // We call this all the way here, late in init, so that malloc works -+ // for the callback function this generates. -+ monitorSuspendResume() - } - - // exiting is set to non-zero when the process is exiting. -@@ -606,19 +647,32 @@ func semasleep(ns int64) int32 { - _WAIT_FAILED = 0xFFFFFFFF - ) - -- // store ms in ns to save stack space -+ var result uintptr - if ns < 0 { -- ns = _INFINITE -+ result = stdcall2(_WaitForSingleObject, getg().m.waitsema, uintptr(_INFINITE)) - } else { -- ns = int64(timediv(ns, 1000000, nil)) -- if ns == 0 { -- ns = 1 -+ start := nanotime() -+ elapsed := int64(0) -+ for { -+ ms := int64(timediv(ns-elapsed, 1000000, nil)) -+ if ms == 0 { -+ ms = 1 -+ } -+ result = stdcall4(_WaitForMultipleObjects, 2, -+ uintptr(unsafe.Pointer(&[2]uintptr{getg().m.waitsema, getg().m.resumesema})), -+ 0, uintptr(ms)) -+ if result != _WAIT_OBJECT_0+1 { -+ // Not a suspend/resume event -+ break -+ } -+ elapsed = nanotime() - start -+ if elapsed >= ns { -+ return -1 -+ } - } - } -- -- result := stdcall2(_WaitForSingleObject, getg().m.waitsema, uintptr(ns)) - switch result { -- case _WAIT_OBJECT_0: //signaled -+ case _WAIT_OBJECT_0: // Signaled - return 0 - - case _WAIT_TIMEOUT: -@@ -667,6 +721,15 @@ func semacreate(mp *m) { - throw("runtime.semacreate") - }) - } -+ mp.resumesema = stdcall4(_CreateEventA, 0, 0, 0, 0) -+ if mp.resumesema == 0 { -+ systemstack(func() { -+ print("runtime: createevent failed; errno=", getlasterror(), "\n") -+ throw("runtime.semacreate") -+ }) -+ stdcall1(_CloseHandle, mp.waitsema) -+ mp.waitsema = 0 -+ } - } - - // May run with m.p==nil, so write barriers are not allowed. This -diff --git a/src/runtime/syscall_windows.go b/src/runtime/syscall_windows.go -index 722a73d108e..0e2fcfb02da 100644 ---- a/src/runtime/syscall_windows.go -+++ b/src/runtime/syscall_windows.go -@@ -74,16 +74,18 @@ func compileCallback(fn eface, cleanstack bool) (code uintptr) { - argsize += uintptrSize - } - -- lock(&cbs.lock) -- defer unlock(&cbs.lock) -+ lock(&cbs.lock) // We don't unlock this in a defer because this is used from the system stack. - - n := cbs.n - for i := 0; i < n; i++ { - if cbs.ctxt[i].gobody == fn.data && cbs.ctxt[i].isCleanstack() == cleanstack { -- return callbackasmAddr(i) -+ r := callbackasmAddr(i) -+ unlock(&cbs.lock) -+ return r - } - } - if n >= cb_max { -+ unlock(&cbs.lock) - throw("too many callback functions") - } - -@@ -99,7 +101,9 @@ func compileCallback(fn eface, cleanstack bool) (code uintptr) { - cbs.ctxt[n] = c - cbs.n++ - -- return callbackasmAddr(n) -+ r := callbackasmAddr(n) -+ unlock(&cbs.lock) -+ return r - } - - const _LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 |