Module: wine Branch: master Commit: 1fe7b8dd6d5e20e26e502af74e5823acaca1fbb2 URL: https://gitlab.winehq.org/wine/wine/-/commit/1fe7b8dd6d5e20e26e502af74e5823a...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Nov 10 10:32:51 2022 +0100
ntdll: Use a proper Unix syscall for unwind_builtin_dll().
---
dlls/ntdll/loader.c | 7 ------- dlls/ntdll/signal_arm.c | 4 +++- dlls/ntdll/signal_arm64.c | 4 +++- dlls/ntdll/signal_x86_64.c | 3 ++- dlls/ntdll/unix/loader.c | 4 +++- dlls/ntdll/unix/signal_arm.c | 5 ++++- dlls/ntdll/unix/signal_arm64.c | 5 ++++- dlls/ntdll/unix/signal_i386.c | 2 +- dlls/ntdll/unix/signal_x86_64.c | 5 ++++- dlls/ntdll/unix/unix_private.h | 4 +--- dlls/ntdll/unixlib.h | 14 +++++++++----- 11 files changed, 34 insertions(+), 23 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 1b541e79a99..f5a07b510c9 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -4602,12 +4602,6 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) }
-static NTSTATUS CDECL unwind_builtin_dll_fallback( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, - CONTEXT *context ) -{ - return STATUS_UNSUCCESSFUL; -} - static LONGLONG WINAPI RtlGetSystemTimePrecise_fallback(void) { LARGE_INTEGER now; @@ -4617,7 +4611,6 @@ static LONGLONG WINAPI RtlGetSystemTimePrecise_fallback(void)
static const struct unix_funcs unix_fallbacks = { - unwind_builtin_dll_fallback, RtlGetSystemTimePrecise_fallback, };
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 37f2144e078..3be642e1348 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -163,7 +163,9 @@ static NTSTATUS virtual_unwind( ULONG type, DISPATCHER_CONTEXT *dispatch, CONTEX
if (!module || (module->Flags & LDR_WINE_INTERNAL)) { - status = unix_funcs->unwind_builtin_dll( type, dispatch, context ); + struct unwind_builtin_dll_params params = { type, dispatch, context }; + + status = NTDLL_UNIX_CALL( unwind_builtin_dll, ¶ms ); if (status != STATUS_SUCCESS) return status;
if (dispatch->EstablisherFrame) diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 76108f69c9f..c61590ceec4 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -197,7 +197,9 @@ static NTSTATUS virtual_unwind( ULONG type, DISPATCHER_CONTEXT *dispatch, CONTEX
if (!module || (module->Flags & LDR_WINE_INTERNAL)) { - status = unix_funcs->unwind_builtin_dll( type, dispatch, context ); + struct unwind_builtin_dll_params params = { type, dispatch, context }; + + status = NTDLL_UNIX_CALL( unwind_builtin_dll, ¶ms ); if (status != STATUS_SUCCESS) return status;
if (dispatch->EstablisherFrame) diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index b6fb0a2ff1f..39cf6a308a7 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -280,8 +280,9 @@ static NTSTATUS virtual_unwind( ULONG type, DISPATCHER_CONTEXT *dispatch, CONTEX
if (!module || (module->Flags & LDR_WINE_INTERNAL)) { - status = unix_funcs->unwind_builtin_dll( type, dispatch, context ); + struct unwind_builtin_dll_params params = { type, dispatch, context };
+ status = NTDLL_UNIX_CALL( unwind_builtin_dll, ¶ms ); if (!status && dispatch->LanguageHandler && !module) { FIXME( "calling personality routine in system library not supported yet\n" ); diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 8c6febcbef4..3f16d2f0086 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -2155,7 +2155,6 @@ static ULONG_PTR get_image_address(void) */ static struct unix_funcs unix_funcs = { - unwind_builtin_dll, RtlGetSystemTimePrecise, };
@@ -2167,11 +2166,13 @@ const unixlib_entry_t __wine_unix_call_funcs[] = { load_so_dll, init_builtin_dll, + unwind_builtin_dll, };
static NTSTATUS wow64_load_so_dll( void *args ) { return STATUS_INVALID_IMAGE_FORMAT; } static NTSTATUS wow64_init_builtin_dll( void *args ) { return STATUS_UNSUCCESSFUL; } +static NTSTATUS wow64_unwind_builtin_dll( void *args ) { return STATUS_UNSUCCESSFUL; }
/*********************************************************************** * __wine_unix_call_wow64_funcs @@ -2180,6 +2181,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = { wow64_load_so_dll, wow64_init_builtin_dll, + wow64_unwind_builtin_dll, };
diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c index d2f07236dc0..fe51629838c 100644 --- a/dlls/ntdll/unix/signal_arm.c +++ b/dlls/ntdll/unix/signal_arm.c @@ -728,8 +728,11 @@ static NTSTATUS libunwind_virtual_unwind( DWORD ip, DWORD *frame, CONTEXT *conte /*********************************************************************** * unwind_builtin_dll */ -NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, CONTEXT *context ) +NTSTATUS unwind_builtin_dll( void *args ) { + struct unwind_builtin_dll_params *params = args; + DISPATCHER_CONTEXT *dispatch = params->dispatch; + CONTEXT *context = params->context; DWORD ip = context->Pc - (dispatch->ControlPcIsUnwound ? 2 : 0); #ifdef linux const struct exidx_entry *entry = find_exidx_entry( (void *)ip ); diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index 5f0171fb020..794aa7b2925 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -458,8 +458,11 @@ static NTSTATUS libunwind_virtual_unwind( ULONG_PTR ip, ULONG_PTR *frame, CONTEX * * Equivalent of RtlVirtualUnwind for builtin modules. */ -NTSTATUS CDECL unwind_builtin_dll( ULONG type, DISPATCHER_CONTEXT *dispatch, CONTEXT *context ) +NTSTATUS unwind_builtin_dll( void *args ) { + struct unwind_builtin_dll_params *params = args; + DISPATCHER_CONTEXT *dispatch = params->dispatch; + CONTEXT *context = params->context; struct dwarf_eh_bases bases; const struct dwarf_fde *fde = _Unwind_Find_FDE( (void *)(context->Pc - 1), &bases );
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index f3c7f5b0ac7..cc8605c2a4f 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -512,7 +512,7 @@ static inline void set_gs( WORD val ) { __asm__( "mov %0,%%gs" :: "r" (val)); } /*********************************************************************** * unwind_builtin_dll */ -NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, CONTEXT *context ) +NTSTATUS unwind_builtin_dll( void *args ) { return STATUS_UNSUCCESSFUL; } diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index fcbe1c0f540..cc070dda5ae 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -746,8 +746,11 @@ static NTSTATUS libunwind_virtual_unwind( ULONG64 ip, ULONG64 *frame, CONTEXT *c /*********************************************************************** * unwind_builtin_dll */ -NTSTATUS CDECL unwind_builtin_dll( ULONG type, DISPATCHER_CONTEXT *dispatch, CONTEXT *context ) +NTSTATUS unwind_builtin_dll( void *args ) { + struct unwind_builtin_dll_params *params = args; + DISPATCHER_CONTEXT *dispatch = params->dispatch; + CONTEXT *context = params->context; struct dwarf_eh_bases bases; const struct dwarf_fde *fde = _Unwind_Find_FDE( (void *)(context->Rip - 1), &bases );
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 17159cd6a44..9e3db02fe47 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -108,9 +108,6 @@ extern void (WINAPI *p__wine_ctrl_routine)(void *) DECLSPEC_HIDDEN; extern SYSTEM_DLL_INIT_BLOCK *pLdrSystemDllInitBlock DECLSPEC_HIDDEN; extern LONGLONG CDECL fast_RtlGetSystemTimePrecise(void) DECLSPEC_HIDDEN;
-extern NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, - CONTEXT *context ) DECLSPEC_HIDDEN; - struct _FILE_FS_DEVICE_INFORMATION;
extern const char wine_build[] DECLSPEC_HIDDEN; @@ -230,6 +227,7 @@ extern void virtual_fill_image_information( const pe_image_info_t *pe_info, extern void release_builtin_module( void *module ) DECLSPEC_HIDDEN; extern void *get_builtin_so_handle( void *module ) DECLSPEC_HIDDEN; extern NTSTATUS load_builtin_unixlib( void *module, const char *name ) DECLSPEC_HIDDEN; +extern NTSTATUS unwind_builtin_dll( void *args ) DECLSPEC_HIDDEN;
extern NTSTATUS get_thread_ldt_entry( HANDLE handle, void *data, ULONG len, ULONG *ret_len ) DECLSPEC_HIDDEN; extern void *get_native_context( CONTEXT *context ) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h index fd23468ed80..59cd6b48788 100644 --- a/dlls/ntdll/unixlib.h +++ b/dlls/ntdll/unixlib.h @@ -31,10 +31,18 @@ struct load_so_dll_params void **module; };
+struct unwind_builtin_dll_params +{ + ULONG type; + struct _DISPATCHER_CONTEXT *dispatch; + CONTEXT *context; +}; + enum ntdll_unix_funcs { unix_load_so_dll, unix_init_builtin_dll, + unix_unwind_builtin_dll, };
extern unixlib_handle_t ntdll_unix_handle; @@ -42,14 +50,10 @@ extern unixlib_handle_t ntdll_unix_handle; #define NTDLL_UNIX_CALL( func, params ) __wine_unix_call( ntdll_unix_handle, unix_ ## func, params )
/* increment this when you change the function table */ -#define NTDLL_UNIXLIB_VERSION 137 +#define NTDLL_UNIXLIB_VERSION 138
struct unix_funcs { - /* loader functions */ - NTSTATUS (CDECL *unwind_builtin_dll)( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, - CONTEXT *context ); - /* other Win32 API functions */ LONGLONG (WINAPI *RtlGetSystemTimePrecise)(void); };