Module: wine Branch: master Commit: 0abbb467af8e9b6025a28bd46ea168306ddf0414 URL: https://gitlab.winehq.org/wine/wine/-/commit/0abbb467af8e9b6025a28bd46ea1683...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Feb 26 13:02:58 2024 +0100
include: Add SEH information to ARM64EC syscalls.
---
dlls/ntdll/signal_arm64ec.c | 10 +++++----- dlls/win32u/main.c | 2 +- include/wine/asm.h | 18 ++++++++++-------- 3 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 9a20a827964..e03878d521f 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -48,7 +48,7 @@ ALL_SYSCALLS64 };
#define SYSCALL_API __attribute__((naked)) -#define SYSCALL_FUNC(name) __ASM_SYSCALL_FUNC( __id_##name ) +#define SYSCALL_FUNC(name) __ASM_SYSCALL_FUNC( __id_##name, name )
NTSTATUS SYSCALL_API NtAcceptConnectPort( HANDLE *handle, ULONG id, LPC_MESSAGE *msg, BOOLEAN accept, LPC_SECTION_WRITE *write, LPC_SECTION_READ *read ) @@ -203,7 +203,7 @@ NTSTATUS SYSCALL_API NtConnectPort( HANDLE *handle, UNICODE_STRING *name, SECURI
static NTSTATUS SYSCALL_API syscall_NtContinue( ARM64_NT_CONTEXT *context, BOOLEAN alertable ) { - __ASM_SYSCALL_FUNC( __id_NtContinue ); + __ASM_SYSCALL_FUNC( __id_NtContinue, syscall_NtContinue ); }
NTSTATUS WINAPI NtContinue( CONTEXT *context, BOOLEAN alertable ) @@ -502,7 +502,7 @@ NTSTATUS SYSCALL_API NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTI
static NTSTATUS SYSCALL_API syscall_NtGetContextThread( HANDLE handle, ARM64_NT_CONTEXT *context ) { - __ASM_SYSCALL_FUNC( __id_NtGetContextThread ); + __ASM_SYSCALL_FUNC( __id_NtGetContextThread, syscall_NtGetContextThread ); }
NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context ) @@ -995,7 +995,7 @@ NTSTATUS SYSCALL_API NtQueueApcThread( HANDLE handle, PNTAPCFUNC func, ULONG_PTR
static NTSTATUS SYSCALL_API syscall_NtRaiseException( EXCEPTION_RECORD *rec, ARM64_NT_CONTEXT *context, BOOL first_chance ) { - __ASM_SYSCALL_FUNC( __id_NtRaiseException ); + __ASM_SYSCALL_FUNC( __id_NtRaiseException, syscall_NtRaiseException ); }
NTSTATUS WINAPI NtRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_chance ) @@ -1137,7 +1137,7 @@ NTSTATUS SYSCALL_API NtSecureConnectPort( HANDLE *handle, UNICODE_STRING *name,
static NTSTATUS SYSCALL_API syscall_NtSetContextThread( HANDLE handle, const ARM64_NT_CONTEXT *context ) { - __ASM_SYSCALL_FUNC( __id_NtSetContextThread ); + __ASM_SYSCALL_FUNC( __id_NtSetContextThread, syscall_NtSetContextThread ); }
NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context ) diff --git a/dlls/win32u/main.c b/dlls/win32u/main.c index 7f88bb0186a..1e6c5c56daf 100644 --- a/dlls/win32u/main.c +++ b/dlls/win32u/main.c @@ -46,7 +46,7 @@ ALL_SYSCALLS64 };
#define SYSCALL_API __attribute__((naked)) -#define SYSCALL_FUNC(name) __ASM_SYSCALL_FUNC( __id_##name ) +#define SYSCALL_FUNC(name) __ASM_SYSCALL_FUNC( __id_##name, name )
INT SYSCALL_API NtGdiAbortDoc( HDC hdc ) { diff --git a/include/wine/asm.h b/include/wine/asm.h index 908c7d7d19a..694e647ac83 100644 --- a/include/wine/asm.h +++ b/include/wine/asm.h @@ -209,7 +209,7 @@ #elif defined __aarch64__ # define __ASM_SYSCALL_FUNC(id,name) \ __ASM_GLOBAL_FUNC( name, \ - __ASM_SEH(".seh_endprologue\n\t") \ + ".seh_endprologue\n\t" \ "mov x8, #(" #id ")\n\t" \ "mov x9, x30\n\t" \ "ldr x16, 1f\n\t" \ @@ -218,13 +218,16 @@ "ret\n" \ "1:\t.quad " __ASM_NAME("__wine_syscall_dispatcher") ) #elif defined __arm64ec__ -# define __ASM_SYSCALL_FUNC(id) \ - asm( "mov x8, #%0\n\t" \ +# define __ASM_SYSCALL_FUNC(id,name) \ + asm( ".seh_proc " #name "\n\t" \ + ".seh_endprologue\n\t" \ + "mov x8, #%0\n\t" \ "mov x9, x30\n\t" \ - "adr x16, " __ASM_NAME("__wine_syscall_dispatcher") "\n\t" \ - "ldr x16, [x16]\n\t" \ + "adrp x16, __wine_syscall_dispatcher\n\t" \ + "ldr x16, [x16, :lo12:__wine_syscall_dispatcher]\n\t" \ "blr x16\n\t" \ - "ret" :: "i" (id) ) + "ret\n\t" \ + ".seh_endproc" :: "i" (id) ) #elif defined __x86_64__ /* Chromium depends on syscall thunks having the same form as on * Windows. For 64-bit systems the only viable form we can emulate is @@ -234,7 +237,7 @@ # ifdef __WINE_PE_BUILD # define __ASM_SYSCALL_FUNC(id,name) \ __ASM_GLOBAL_FUNC( name, \ - __ASM_SEH(".seh_endprologue\n\t") \ + ".seh_endprologue\n\t" \ ".byte 0x4c,0x8b,0xd1\n\t" /* movq %rcx,%r10 */ \ ".byte 0xb8\n\t" /* movl $i,%eax */ \ ".long (" #id ")\n\t" \ @@ -250,7 +253,6 @@ # else # define __ASM_SYSCALL_FUNC(id,name) \ __ASM_GLOBAL_FUNC( name, \ - __ASM_SEH(".seh_endprologue\n\t") \ ".byte 0x4c,0x8b,0xd1\n\t" /* movq %rcx,%r10 */ \ ".byte 0xb8\n\t" /* movl $i,%eax */ \ ".long (" #id ")\n\t" \