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