public inbox for cygwin-patches@cygwin.com
 help / color / mirror / Atom feed
* [RFC] FAST_CWD warnings on ARM64 insider preview
@ 2021-05-18 18:56 Jeremy Drake
  2021-05-19  9:49 ` Corinna Vinschen
  0 siblings, 1 reply; 4+ messages in thread
From: Jeremy Drake @ 2021-05-18 18:56 UTC (permalink / raw)
  To: cygwin-patches

[-- Attachment #1: Type: text/plain, Size: 745 bytes --]

I have been trying out x86_64 msys2 (a fork of cygwin) on Windows insider
preview builds on ARM64, which added support for x86_64 emulation.  I was
getting the notorious FAST_CWD warnings, which were interfering with
MINGW CMake.  Last night late, I went looking at the cause, and found some
code that attempted to disable FAST_CWD warnings, but only on i686, and
trying to look at GetNativeSystemInfo, which was lying.  I quickly put
together this patch, and it seems to work.

Note I did this late at night, with no real regard to investigating or
matching code style.  This patch is currently more in an RFC state, if the
approach looks OK, and I'd be grateful for any pointers on getting it into
shape for evental acceptance.

Thanks,
Jeremy

[-- Attachment #2: Type: text/plain, Size: 2368 bytes --]

From 346dfb78fc5522d5d7288571d635303c69a5270a Mon Sep 17 00:00:00 2001
From: Jeremy Drake <cygwin@jdrake.com>
Date: Tue, 18 May 2021 00:48:52 -0700
Subject: [PATCH] cygwin: suppress FAST_CWD warnings on ARM64.

The old check was insufficient: new insider preview builds of Windows
allow running x86_64 process on ARM64.  The IsWow64Process2 function
seems to be the intended way to figure this situation out.
---
 winsup/cygwin/path.cc | 30 ++++++++++--------------------
 1 file changed, 10 insertions(+), 20 deletions(-)

diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index dd7048486..5c4adcd49 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -4708,29 +4708,19 @@ find_fast_cwd ()
     {
       bool warn = 1;
 
-#ifndef __x86_64__
-      #ifndef PROCESSOR_ARCHITECTURE_ARM64
-      #define PROCESSOR_ARCHITECTURE_ARM64 12
-      #endif
+#ifndef IMAGE_FILE_MACHINE_ARM64
+#define IMAGE_FILE_MACHINE_ARM64 0xAA64
+#endif
 
-      SYSTEM_INFO si;
+      USHORT procmachine, nativemachine;
 
       /* Check if we're running in WOW64 on ARM64.  Skip the warning as long as
-	 there's no solution for finding the FAST_CWD pointer on that system.
-
-	 2018-07-12: Apparently current ARM64 WOW64 has a bug:
-	 It's GetNativeSystemInfo returns PROCESSOR_ARCHITECTURE_INTEL in
-	 wProcessorArchitecture.  Since that's an invalid value (a 32 bit
-	 host system hosting a 32 bit emulator for itself?) we can use this
-	 value as an indicator to skip the message as well. */
-      if (wincap.is_wow64 ())
-	{
-	  GetNativeSystemInfo (&si);
-	  if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64
-	      || si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
-	    warn = 0;
-	}
-#endif /* !__x86_64__ */
+	 there's no solution for finding the FAST_CWD pointer on that system. */
+
+      typedef BOOL (WINAPI * IsWow64Process2_t)(HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine);
+      IsWow64Process2_t pfnIsWow64Process2 = (IsWow64Process2_t)GetProcAddress(GetModuleHandle("kernel32.dll"), "IsWow64Process2");
+      if (pfnIsWow64Process2 && pfnIsWow64Process2(GetCurrentProcess(), &procmachine, &nativemachine) && nativemachine == IMAGE_FILE_MACHINE_ARM64)
+	warn = 0;
 
       if (warn)
 	small_printf ("Cygwin WARNING:\n"
-- 
2.31.1.windows.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC] FAST_CWD warnings on ARM64 insider preview
  2021-05-18 18:56 [RFC] FAST_CWD warnings on ARM64 insider preview Jeremy Drake
@ 2021-05-19  9:49 ` Corinna Vinschen
  2021-05-19 18:02   ` Jeremy Drake
  0 siblings, 1 reply; 4+ messages in thread
From: Corinna Vinschen @ 2021-05-19  9:49 UTC (permalink / raw)
  To: Jeremy Drake; +Cc: cygwin-patches

Hi Jeremy,

On May 18 11:56, Jeremy Drake via Cygwin-patches wrote:
> I have been trying out x86_64 msys2 (a fork of cygwin) on Windows insider
> preview builds on ARM64, which added support for x86_64 emulation.  I was
> getting the notorious FAST_CWD warnings, which were interfering with
> MINGW CMake.  Last night late, I went looking at the cause, and found some
> code that attempted to disable FAST_CWD warnings, but only on i686, and
> trying to look at GetNativeSystemInfo, which was lying.  I quickly put
> together this patch, and it seems to work.
> 
> Note I did this late at night, with no real regard to investigating or
> matching code style.  This patch is currently more in an RFC state, if the
> approach looks OK, and I'd be grateful for any pointers on getting it into
> shape for evental acceptance.

> +#ifndef IMAGE_FILE_MACHINE_ARM64
> +#define IMAGE_FILE_MACHINE_ARM64 0xAA64
> +#endif

IMAGE_FILE_MACHINE_ARM64 is already defined for some time in winnt.h
so we won't need the ifdef.

> +      typedef BOOL (WINAPI * IsWow64Process2_t)(HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine);
> +      IsWow64Process2_t pfnIsWow64Process2 = (IsWow64Process2_t)GetProcAddress(GetModuleHandle("kernel32.dll"), "IsWow64Process2");
> +      if (pfnIsWow64Process2 && pfnIsWow64Process2(GetCurrentProcess(), &procmachine, &nativemachine) && nativemachine == IMAGE_FILE_MACHINE_ARM64)

We're having the autoload mechanism for that, i. e., your patch can get
rid of the GetModuleHandle/GetProcAddress preliminaries entirely.

By using the LoadDLLfuncEx() expression, failure to load the function
will result in a return value of FALSE with GetLastError ==
ERROR_PROC_NOT_FOUND, so this is safe on older systems.

It's easier to understand with a full example, so I took the liberty to
rewrite your patch accordingly.  Since the idea and the basic work is
yours, I'd push this under your name, see below.


Thanks,
Corinna


From ee6dfb3bb0a5d51416d788133f818df0b8c1a207 Mon Sep 17 00:00:00 2001
From: Jeremy Drake <cygwin@jdrake.com>
Date: Wed, 19 May 2021 11:43:48 +0200
Subject: [PATCH] Cygwin: suppress FAST_CWD warnings on ARM64

The old check was insufficient: new insider preview builds of Windows
allow running x86_64 process on ARM64.  The IsWow64Process2 function
seems to be the intended way to figure this situation out.
---
 winsup/cygwin/autoload.cc |  1 +
 winsup/cygwin/path.cc     | 33 +++++++++------------------------
 2 files changed, 10 insertions(+), 24 deletions(-)

diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index b2de2c3f42ce..0ebe15332013 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -587,6 +587,7 @@ LoadDLLfuncEx (GetLogicalProcessorInformationEx, 12, kernel32, 1)
 LoadDLLfuncEx (GetProcessGroupAffinity, 12, kernel32, 1)
 LoadDLLfunc (GetSystemTimePreciseAsFileTime, 4, kernel32)
 LoadDLLfuncEx (GetThreadGroupAffinity, 8, kernel32, 1)
+LoadDLLfuncEx (IsWow64Process2, 12, kernel32, 1)
 LoadDLLfuncEx (PrefetchVirtualMemory, 16, kernel32, 1)
 LoadDLLfunc (SetThreadGroupAffinity, 12, kernel32)
 
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index dd7048486a65..9b38793aa7d9 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -4707,30 +4707,15 @@ find_fast_cwd ()
   if (!f_cwd_ptr)
     {
       bool warn = 1;
-
-#ifndef __x86_64__
-      #ifndef PROCESSOR_ARCHITECTURE_ARM64
-      #define PROCESSOR_ARCHITECTURE_ARM64 12
-      #endif
-
-      SYSTEM_INFO si;
-
-      /* Check if we're running in WOW64 on ARM64.  Skip the warning as long as
-	 there's no solution for finding the FAST_CWD pointer on that system.
-
-	 2018-07-12: Apparently current ARM64 WOW64 has a bug:
-	 It's GetNativeSystemInfo returns PROCESSOR_ARCHITECTURE_INTEL in
-	 wProcessorArchitecture.  Since that's an invalid value (a 32 bit
-	 host system hosting a 32 bit emulator for itself?) we can use this
-	 value as an indicator to skip the message as well. */
-      if (wincap.is_wow64 ())
-	{
-	  GetNativeSystemInfo (&si);
-	  if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64
-	      || si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
-	    warn = 0;
-	}
-#endif /* !__x86_64__ */
+      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"
-- 
2.30.2


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC] FAST_CWD warnings on ARM64 insider preview
  2021-05-19  9:49 ` Corinna Vinschen
@ 2021-05-19 18:02   ` Jeremy Drake
  2021-05-20  7:17     ` Corinna Vinschen
  0 siblings, 1 reply; 4+ messages in thread
From: Jeremy Drake @ 2021-05-19 18:02 UTC (permalink / raw)
  To: cygwin-patches

On Wed, 19 May 2021, Corinna Vinschen wrote:

> > +#ifndef IMAGE_FILE_MACHINE_ARM64
> > +#define IMAGE_FILE_MACHINE_ARM64 0xAA64
> > +#endif
>
> IMAGE_FILE_MACHINE_ARM64 is already defined for some time in winnt.h
> so we won't need the ifdef.

OK.  Was just matching what was done with PROCESSOR_ARCHITECTURE_ARM64.

> > +      typedef BOOL (WINAPI * IsWow64Process2_t)(HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine);
> > +      IsWow64Process2_t pfnIsWow64Process2 = (IsWow64Process2_t)GetProcAddress(GetModuleHandle("kernel32.dll"), "IsWow64Process2");
> > +      if (pfnIsWow64Process2 && pfnIsWow64Process2(GetCurrentProcess(), &procmachine, &nativemachine) && nativemachine == IMAGE_FILE_MACHINE_ARM64)
>
> We're having the autoload mechanism for that, i. e., your patch can get
> rid of the GetModuleHandle/GetProcAddress preliminaries entirely.
>
> By using the LoadDLLfuncEx() expression, failure to load the function
> will result in a return value of FALSE with GetLastError ==
> ERROR_PROC_NOT_FOUND, so this is safe on older systems.

Nice.

> It's easier to understand with a full example, so I took the liberty to
> rewrite your patch accordingly.  Since the idea and the basic work is
> yours, I'd push this under your name, see below.

Looks good.  Thanks

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RFC] FAST_CWD warnings on ARM64 insider preview
  2021-05-19 18:02   ` Jeremy Drake
@ 2021-05-20  7:17     ` Corinna Vinschen
  0 siblings, 0 replies; 4+ messages in thread
From: Corinna Vinschen @ 2021-05-20  7:17 UTC (permalink / raw)
  To: cygwin-patches

On May 19 11:02, Jeremy Drake via Cygwin-patches wrote:
> On Wed, 19 May 2021, Corinna Vinschen wrote:
> 
> > > +#ifndef IMAGE_FILE_MACHINE_ARM64
> > > +#define IMAGE_FILE_MACHINE_ARM64 0xAA64
> > > +#endif
> >
> > IMAGE_FILE_MACHINE_ARM64 is already defined for some time in winnt.h
> > so we won't need the ifdef.
> 
> OK.  Was just matching what was done with PROCESSOR_ARCHITECTURE_ARM64.
> 
> > > +      typedef BOOL (WINAPI * IsWow64Process2_t)(HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine);
> > > +      IsWow64Process2_t pfnIsWow64Process2 = (IsWow64Process2_t)GetProcAddress(GetModuleHandle("kernel32.dll"), "IsWow64Process2");
> > > +      if (pfnIsWow64Process2 && pfnIsWow64Process2(GetCurrentProcess(), &procmachine, &nativemachine) && nativemachine == IMAGE_FILE_MACHINE_ARM64)
> >
> > We're having the autoload mechanism for that, i. e., your patch can get
> > rid of the GetModuleHandle/GetProcAddress preliminaries entirely.
> >
> > By using the LoadDLLfuncEx() expression, failure to load the function
> > will result in a return value of FALSE with GetLastError ==
> > ERROR_PROC_NOT_FOUND, so this is safe on older systems.
> 
> Nice.
> 
> > It's easier to understand with a full example, so I took the liberty to
> > rewrite your patch accordingly.  Since the idea and the basic work is
> > yours, I'd push this under your name, see below.
> 
> Looks good.  Thanks

Pushed.

Thanks,
Corinna

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-05-20  7:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-18 18:56 [RFC] FAST_CWD warnings on ARM64 insider preview Jeremy Drake
2021-05-19  9:49 ` Corinna Vinschen
2021-05-19 18:02   ` Jeremy Drake
2021-05-20  7:17     ` Corinna Vinschen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).