From bb6258c2ba359726cdffc268bf1d1f14f9c68037 Mon Sep 17 00:00:00 2001
From: Corinna Vinschen <corinna@vinschen.de>
Date: Tue, 13 Feb 2024 16:47:51 +0100
Subject: [PATCH 55/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 <corinna@vinschen.de>
---
 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"
