From 220a70bee268415925d1ae747611f48e51665e64 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Tue, 14 Nov 2023 18:55:39 +0100
Subject: [PATCH] ntdll: Don't use x86-64 assembly on ARM64EC.

---
 dlls/ntdll/loader.c  | 6 +++---
 dlls/ntdll/process.c | 6 +++++-
 dlls/ntdll/relay.c   | 2 +-
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 1a87f4d1f5e..93edc237405 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -304,7 +304,7 @@ __ASM_GLOBAL_FUNC(call_dll_entry_point,
                   __ASM_CFI(".cfi_def_cfa %esp,4\n\t")
                   __ASM_CFI(".cfi_same_value %ebp\n\t")
                   "ret" )
-#elif defined(__x86_64__)
+#elif defined(__x86_64__) && !defined(__arm64ec__)
 extern BOOL CDECL call_dll_entry_point( DLLENTRYPROC proc, void *module, UINT reason, void *reserved );
 /* Some apps modify rbx in TLS entry point. */
 __ASM_GLOBAL_FUNC(call_dll_entry_point,
@@ -379,7 +379,7 @@ struct stub
     const char *name;
     const void* entry;
 };
-#elif defined(__aarch64__)
+#elif defined(__aarch64__) || defined(__arm64ec__)
 struct stub
 {
     DWORD ldr_x0;        /* ldr x0, $dll */
@@ -443,7 +443,7 @@ static ULONG_PTR allocate_stub( const char *dll, const char *name )
     stub->dll       = dll;
     stub->name      = name;
     stub->entry     = stub_entry_point;
-#elif defined(__aarch64__)
+#elif defined(__aarch64__) || defined(__arm64ec__)
     stub->ldr_x0    = 0x580000a0; /* ldr x0, #20 ($dll) */
     stub->ldr_x1    = 0x580000c1; /* ldr x1, #24 ($name) */
     stub->mov_x2_lr = 0xaa1e03e2; /* mov x2, lr */
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index 3ca4195ab3d..f3b899a43f8 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -249,7 +249,11 @@ NTSTATUS WINAPI RtlWow64GetThreadSelectorEntry( HANDLE handle, THREAD_DESCRIPTOR
     if (RtlWow64GetThreadContext( handle, &context ))
     {
         /* hardcoded values */
-#ifdef __x86_64__
+#ifdef __arm64ec__
+        context.SegCs = 0x33;
+        context.SegSs = 0x2b;
+        context.SegFs = 0x53;
+#elif defined(__x86_64__)
         context.SegCs = 0x23;
         __asm__( "movw %%fs,%0" : "=m" (context.SegFs) );
         __asm__( "movw %%ss,%0" : "=m" (context.SegSs) );
diff --git a/dlls/ntdll/relay.c b/dlls/ntdll/relay.c
index adc8267ae1f..b6046bb661f 100644
--- a/dlls/ntdll/relay.c
+++ b/dlls/ntdll/relay.c
@@ -34,7 +34,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(relay);
 
-#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)
+#if (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)) && !defined(__arm64ec__)
 
 struct relay_descr  /* descriptor for a module */
 {
-- 
GitLab