v4:
fixes x86_64-on-aarch64 on Windows 11 22000.  I'm sending patch 5
only since 1-4 are identical, but I can send them again if necessary.

Jeremy Drake (5):
  Cygwin: factor out find_fast_cwd_pointer to arch-specific file.
  Cygwin: vendor libudis86 1.7.2/libudis86
  Cygwin: patch libudis86 to build as part of Cygwin
  Cygwin: use udis86 to find fast cwd pointer on x64
  Cygwin: add find_fast_cwd_pointer_aarch64.

 winsup/cygwin/Makefile.am        |   14 +-
 winsup/cygwin/aarch64/fastcwd.cc |  207 +
 winsup/cygwin/path.cc            |  145 +-
 winsup/cygwin/udis86/decode.c    | 1113 ++++
 winsup/cygwin/udis86/decode.h    |  195 +
 winsup/cygwin/udis86/extern.h    |  109 +
 winsup/cygwin/udis86/itab.c      | 8404 ++++++++++++++++++++++++++++++
 winsup/cygwin/udis86/itab.h      |  680 +++
 winsup/cygwin/udis86/types.h     |  260 +
 winsup/cygwin/udis86/udint.h     |   91 +
 winsup/cygwin/udis86/udis86.c    |  464 ++
 winsup/cygwin/x86_64/fastcwd.cc  |  200 +
 12 files changed, 11759 insertions(+), 123 deletions(-)
 create mode 100644 winsup/cygwin/aarch64/fastcwd.cc
 create mode 100644 winsup/cygwin/udis86/decode.c
 create mode 100644 winsup/cygwin/udis86/decode.h
 create mode 100644 winsup/cygwin/udis86/extern.h
 create mode 100644 winsup/cygwin/udis86/itab.c
 create mode 100644 winsup/cygwin/udis86/itab.h
 create mode 100644 winsup/cygwin/udis86/types.h
 create mode 100644 winsup/cygwin/udis86/udint.h
 create mode 100644 winsup/cygwin/udis86/udis86.c
 create mode 100644 winsup/cygwin/x86_64/fastcwd.cc

Range-diff against v3:
1:  a1c9f722d7 = 1:  a1c9f722d7 Cygwin: factor out find_fast_cwd_pointer to 
arch-specific file.
2:  1c290dbc53 = 2:  1c290dbc53 Cygwin: vendor libudis86 1.7.2/libudis86
3:  bd2dca35eb = 3:  bd2dca35eb Cygwin: patch libudis86 to build as part of 
Cygwin
4:  140a61c9e1 = 4:  140a61c9e1 Cygwin: use udis86 to find fast cwd pointer on 
x64
5:  87f2bcf895 ! 5:  d55f8f3efa Cygwin: add find_fast_cwd_pointer_aarch64.
    @@ winsup/cygwin/aarch64/fastcwd.cc (new)
     +#if defined (__aarch64__)
     +  return proc;
     +#else
    -+#if defined(__i386__)
    ++#if defined (__i386__)
     +  static const BYTE thunk[] = "\x8b\xff\x55\x8b\xec\x5d\x90\xe9";
    -+#elif defined(__x86_64__)
    ++  static const BYTE thunk2[0];
    ++#elif defined (__x86_64__)
     +  /* see
     +     
https://learn.microsoft.com/en-us/windows/arm/arm64ec-abi#fast-forward-sequences
 */
     +  static const BYTE thunk[] = "\x48\x8b\xc4\x48\x89\x58\x20\x55\x5d\xe9";
    ++  /* on windows 11 22000 the thunk is different than documented on that 
page */
    ++  static const BYTE thunk2[] = "\x48\x8b\xff\x55\x48\x8b\xec\x5d\x90\xe9";
     +#else
     +#error "Unhandled architecture for thunk detection"
     +#endif
    -+  if (memcmp (proc, thunk, sizeof (thunk) - 1) == 0)
    ++  if (memcmp (proc, thunk, sizeof (thunk) - 1) == 0 ||
    ++     (sizeof(thunk2) && memcmp (proc, thunk2, sizeof (thunk2) - 1) == 0))
     +    {
     +      proc += sizeof (thunk) - 1;
     +      proc += 4 + *(const int32_t *) proc;
-- 
2.48.1.windows.1

Reply via email to