From ae6a5a874d46aa462576fec53a780b3318420525 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Wed, 13 Nov 2024 20:22:24 +0100 Subject: [PATCH] msys2-runtime-3.3: Update See https://github.com/msys2/msys2-runtime/pull/235 --- ..._cwd-don-t-run-assembler-checking-co.patch | 64 ++++++++++++++++ ...ad-suspend-thread-before-terminating.patch | 74 +++++++++++++++++++ msys2-runtime-3.3/PKGBUILD | 16 ++-- 3 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 msys2-runtime-3.3/0061-Cygwin-find_fast_cwd-don-t-run-assembler-checking-co.patch create mode 100644 msys2-runtime-3.3/0062-cygthread-suspend-thread-before-terminating.patch diff --git a/msys2-runtime-3.3/0061-Cygwin-find_fast_cwd-don-t-run-assembler-checking-co.patch b/msys2-runtime-3.3/0061-Cygwin-find_fast_cwd-don-t-run-assembler-checking-co.patch new file mode 100644 index 00000000000..66c42414716 --- /dev/null +++ b/msys2-runtime-3.3/0061-Cygwin-find_fast_cwd-don-t-run-assembler-checking-co.patch @@ -0,0 +1,64 @@ +From bb6258c2ba359726cdffc268bf1d1f14f9c68037 Mon Sep 17 00:00:00 2001 +From: Corinna Vinschen +Date: Tue, 13 Feb 2024 16:47:51 +0100 +Subject: [PATCH 61/N] Cygwin: find_fast_cwd: don't run assembler checking + code on ARM64 + +https://cygwin.com/pipermail/cygwin/2024-February/255397.html +reports a crash on ARM64 probably related to checking x86_64 +code on the x86_64 emulator on AArch64. + +At least for testing, pull the code checking the host HW +up to be called before trying to evaluate assembler code. + +Signed-off-by: Corinna Vinschen +--- + winsup/cygwin/path.cc | 34 ++++++++++++++++------------------ + 1 file changed, 16 insertions(+), 18 deletions(-) + +diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc +index 27e203b..8a373c4 100644 +--- a/winsup/cygwin/path.cc ++++ b/winsup/cygwin/path.cc +@@ -5023,25 +5023,23 @@ find_fast_cwd_pointer () + static fcwd_access_t ** + find_fast_cwd () + { +- /* Fetch the pointer but don't set the global fast_cwd_ptr yet. First +- we have to make sure we know the version of the FAST_CWD structure +- used on the system. */ +- fcwd_access_t **f_cwd_ptr = find_fast_cwd_pointer (); +- if (!f_cwd_ptr) ++ USHORT emulated, hosted; ++ fcwd_access_t **f_cwd_ptr; ++ ++ /* First check if we're running in WOW64 on ARM64 emulating AMD64. Skip ++ fetching FAST_CWD pointer as long as there's no solution for finding ++ it on that system. */ ++ if (IsWow64Process2 (GetCurrentProcess (), &emulated, &hosted) ++ && hosted == IMAGE_FILE_MACHINE_ARM64) ++ f_cwd_ptr = NULL; ++ else + { +- bool warn = 1; +- USHORT emulated, hosted; +- +- /* Check if we're running in WOW64 on ARM64. Check on 64 bit as well, +- given that ARM64 Windows 10 provides a x86_64 emulation soon. Skip +- warning as long as there's no solution for finding the FAST_CWD +- pointer on that system. */ +- if (IsWow64Process2 (GetCurrentProcess (), &emulated, &hosted) +- && hosted == IMAGE_FILE_MACHINE_ARM64) +- warn = 0; +- +- if (warn) +- small_printf ("Cygwin WARNING:\n" ++ /* Fetch the pointer but don't set the global fast_cwd_ptr yet. First ++ we have to make sure we know the version of the FAST_CWD structure ++ used on the system. */ ++ f_cwd_ptr = find_fast_cwd_pointer (); ++ if (!f_cwd_ptr) ++ small_printf ("Cygwin WARNING:\n" + " Couldn't compute FAST_CWD pointer. This typically occurs if you're using\n" + " an older Cygwin version on a newer Windows. Please update to the latest\n" + " available Cygwin version from https://cygwin.com/. If the problem persists,\n" diff --git a/msys2-runtime-3.3/0062-cygthread-suspend-thread-before-terminating.patch b/msys2-runtime-3.3/0062-cygthread-suspend-thread-before-terminating.patch new file mode 100644 index 00000000000..25e856c6dec --- /dev/null +++ b/msys2-runtime-3.3/0062-cygthread-suspend-thread-before-terminating.patch @@ -0,0 +1,74 @@ +From 32c179db9db373b1278f64bcba6ec7e059500a01 Mon Sep 17 00:00:00 2001 +From: Jeremy Drake +Date: Mon, 11 Nov 2024 20:09:49 -0800 +Subject: [PATCH 62/N] cygthread: suspend thread before terminating. + +This addresses an extremely difficult to debug deadlock when running +under emulation on ARM64. + +A relatively easy way to trigger this bug is to call `fork()`, then within the +child process immediately call another `fork()` and then `exit()` the +intermediate process. + +It would seem that there is a "code emulation" lock on the wait thread at +this stage, and if the thread is terminated too early, that lock still exists +albeit without a thread, and nothing moves forward. + +It seems that a `SuspendThread()` combined with a `GetThreadContext()` +(to force the thread to _actually_ be suspended, for more details see +https://devblogs.microsoft.com/oldnewthing/20150205-00/?p=44743) +makes sure the thread is "booted" from emulation before it is suspended. + +Hopefully this means it won't be holding any locks or otherwise leave +emulation in a bad state when the thread is terminated. + +Also, attempt to use `CancelSynchonousIo()` (as seen in `flock.cc`) to avoid +the need for `TerminateThread()` altogether. This doesn't always work, +however, so was not a complete fix for the deadlock issue. + +Addresses: https://cygwin.com/pipermail/cygwin-developers/2024-May/012694.html +Signed-off-by: Jeremy Drake +--- + winsup/cygwin/cygthread.cc | 14 ++++++++++++++ + winsup/cygwin/sigproc.cc | 3 ++- + 2 files changed, 16 insertions(+), 1 deletion(-) + +diff --git a/winsup/cygwin/cygthread.cc b/winsup/cygwin/cygthread.cc +index 11c21d8..e487439 100644 +--- a/winsup/cygwin/cygthread.cc ++++ b/winsup/cygwin/cygthread.cc +@@ -302,6 +302,20 @@ cygthread::terminate_thread () + if (!inuse) + goto force_notterminated; + ++ if (_my_tls._ctinfo != this) ++ { ++ CONTEXT context; ++ context.ContextFlags = CONTEXT_CONTROL; ++ /* SuspendThread makes sure a thread is "booted" from emulation before ++ it is suspended. As such, the emulator hopefully won't be in a bad ++ state (aka, holding any locks) when the thread is terminated. */ ++ SuspendThread (h); ++ /* We need to call GetThreadContext, even though we don't care about the ++ context, because SuspendThread is asynchronous and GetThreadContext ++ will make sure the thread is *really* suspended before returning */ ++ GetThreadContext (h, &context); ++ } ++ + TerminateThread (h, 0); + WaitForSingleObject (h, INFINITE); + CloseHandle (h); +diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc +index fbb1f0e..cf53ba9 100644 +--- a/winsup/cygwin/sigproc.cc ++++ b/winsup/cygwin/sigproc.cc +@@ -417,7 +417,8 @@ proc_terminate () + if (!have_execed || !have_execed_cygwin) + chld_procs[i]->ppid = 1; + if (chld_procs[i].wait_thread) +- chld_procs[i].wait_thread->terminate_thread (); ++ if (!CancelSynchronousIo (chld_procs[i].wait_thread->thread_handle ())) ++ chld_procs[i].wait_thread->terminate_thread (); + /* Release memory associated with this process unless it is 'myself'. + 'myself' is only in the chld_procs table when we've execed. We + reach here when the next process has finished initializing but we diff --git a/msys2-runtime-3.3/PKGBUILD b/msys2-runtime-3.3/PKGBUILD index 76062581ca4..55fd12722f4 100644 --- a/msys2-runtime-3.3/PKGBUILD +++ b/msys2-runtime-3.3/PKGBUILD @@ -4,7 +4,7 @@ pkgbase=msys2-runtime-3.3 pkgname=('msys2-runtime-3.3' 'msys2-runtime-3.3-devel') pkgver=3.3.6 -pkgrel=9 +pkgrel=10 pkgdesc="Cygwin POSIX emulation engine" arch=('i686' 'x86_64') url="https://www.cygwin.com/" @@ -88,8 +88,10 @@ source=('msys2-runtime'::git://sourceware.org/git/newlib-cygwin.git#tag=cygwin-$ 0057-Move-_cygheap_start-into-.cygheap-section.patch 0058-Cygwin-dumper-also-link-with-libzstd-as-libbfd-may-r.patch 0059-Cygwin-configure-Add-option-to-disable-building-dump.patch - 0060-Work-around-fragile-include-in-binutils.patch) -sha256sums=('SKIP' + 0060-Work-around-fragile-include-in-binutils.patch + 0061-Cygwin-find_fast_cwd-don-t-run-assembler-checking-co.patch + 0062-cygthread-suspend-thread-before-terminating.patch) +sha256sums=('1495f90ffd49a3ef4835a879881fa5dbb28dc6aa3ee55be3c4327bbab471e9b8' 'c375315e58181ee5589b7966101aa095de3f864a579c3c3f0f0683595d4e428d' '01ea2b131cf5a3b27fdbc458019eac14e45a36782ce3ce33e62328eefcd2d02e' '475ddea4d86605ab097f98ec764951a9d647ea3100dea0e1620f57044ea4a114' @@ -149,7 +151,9 @@ sha256sums=('SKIP' '658288b4dc8306fc56bfd37b32326cf9d05aba1960205c4ba73821c0341a56f9' '1cdf4bff5af6b71c0710e608439f5fda3a097a895a565ad4c2542f301c108d3b' '66193f7b677f46edfba8d054365d58a79b5f141354c9614adb788f89a7360d53' - 'b6a286617f1c3278c2303db8e0bc7d94c455e1fb47e8bb8fd55aa9c5f477ccf0') + 'b6a286617f1c3278c2303db8e0bc7d94c455e1fb47e8bb8fd55aa9c5f477ccf0' + '4034d57ac610d860e79dd61893057a7fde32eecef094ed75e4cd715bcfa40728' + 'e9aac8ae9d1a6f035f1d64a968f0f295fe112c3cdbf354d1f5ac3e2e941c56e5') # Helper macros to help make tasks easier # apply_patch_with_msg() { @@ -246,7 +250,9 @@ prepare() { 0057-Move-_cygheap_start-into-.cygheap-section.patch \ 0058-Cygwin-dumper-also-link-with-libzstd-as-libbfd-may-r.patch \ 0059-Cygwin-configure-Add-option-to-disable-building-dump.patch \ - 0060-Work-around-fragile-include-in-binutils.patch + 0060-Work-around-fragile-include-in-binutils.patch \ + 0061-Cygwin-find_fast_cwd-don-t-run-assembler-checking-co.patch \ + 0062-cygthread-suspend-thread-before-terminating.patch } build() {