Skip to content

Commit

Permalink
msys2-runtime-3.3: Update
Browse files Browse the repository at this point in the history
  • Loading branch information
lazka committed Nov 13, 2024
1 parent 46023e5 commit ae6a5a8
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
From bb6258c2ba359726cdffc268bf1d1f14f9c68037 Mon Sep 17 00:00:00 2001
From: Corinna Vinschen <[email protected]>
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 <[email protected]>
---
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"
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
From 32c179db9db373b1278f64bcba6ec7e059500a01 Mon Sep 17 00:00:00 2001
From: Jeremy Drake <[email protected]>
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 <[email protected]>
---
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
16 changes: 11 additions & 5 deletions msys2-runtime-3.3/PKGBUILD
Original file line number Diff line number Diff line change
Expand Up @@ -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/"
Expand Down Expand Up @@ -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'
Expand Down Expand Up @@ -149,7 +151,9 @@ sha256sums=('SKIP'
'658288b4dc8306fc56bfd37b32326cf9d05aba1960205c4ba73821c0341a56f9'
'1cdf4bff5af6b71c0710e608439f5fda3a097a895a565ad4c2542f301c108d3b'
'66193f7b677f46edfba8d054365d58a79b5f141354c9614adb788f89a7360d53'
'b6a286617f1c3278c2303db8e0bc7d94c455e1fb47e8bb8fd55aa9c5f477ccf0')
'b6a286617f1c3278c2303db8e0bc7d94c455e1fb47e8bb8fd55aa9c5f477ccf0'
'4034d57ac610d860e79dd61893057a7fde32eecef094ed75e4cd715bcfa40728'
'e9aac8ae9d1a6f035f1d64a968f0f295fe112c3cdbf354d1f5ac3e2e941c56e5')

# Helper macros to help make tasks easier #
apply_patch_with_msg() {
Expand Down Expand Up @@ -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() {
Expand Down

0 comments on commit ae6a5a8

Please sign in to comment.