[PATCH v4 0/5] find_fast_cwd_pointer rewrite
Jeremy Drake
cygwin@jdrake.com
Sun Mar 30 01:54:22 GMT 2025
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
More information about the Cygwin-patches
mailing list