-
Notifications
You must be signed in to change notification settings - Fork 491
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
149 additions
and
5 deletions.
There are no files selected for viewing
64 changes: 64 additions & 0 deletions
64
msys2-runtime-3.3/0061-Cygwin-find_fast_cwd-don-t-run-assembler-checking-co.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" |
74 changes: 74 additions & 0 deletions
74
msys2-runtime-3.3/0062-cygthread-suspend-thread-before-terminating.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters