aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--Makefile12
-rw-r--r--build.bat6
-rw-r--r--golang-runtime-resume-timers.patch203
3 files changed, 2 insertions, 219 deletions
diff --git a/Makefile b/Makefile
index 39d3046c..b7117fd3 100644
--- a/Makefile
+++ b/Makefile
@@ -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" $@
diff --git a/build.bat b/build.bat
index 8dbf44cb..89468cf1 100644
--- a/build.bat
+++ b/build.bat
@@ -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(&params)),
-+ 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