Module: wine Branch: master Commit: b35f00070f838981b1d40ff1c316cfda89606b0e URL: https://gitlab.winehq.org/wine/wine/-/commit/b35f00070f838981b1d40ff1c316cfd...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Oct 13 15:57:03 2023 +0200
ntdll: Move LdrInitializeThunk to the CPU backends.
---
dlls/ntdll/loader.c | 16 ++-------------- dlls/ntdll/ntdll_misc.h | 2 +- dlls/ntdll/signal_arm.c | 13 +++++++------ dlls/ntdll/signal_arm64.c | 13 +++++++------ dlls/ntdll/signal_i386.c | 11 +++++++++++ dlls/ntdll/signal_x86_64.c | 11 +++++++++++ 6 files changed, 39 insertions(+), 27 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index e0cfead6893..1a87f4d1f5e 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -4188,28 +4188,17 @@ static void release_address_space(void) }
/****************************************************************** - * LdrInitializeThunk (NTDLL.@) + * loader_init * * Attach to all the loaded dlls. * If this is the first time, perform the full process initialization. */ -void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR unknown3, ULONG_PTR unknown4 ) +void loader_init( CONTEXT *context, void **entry ) { static int attach_done; NTSTATUS status; ULONG_PTR cookie; WINE_MODREF *wm; - void **entry; - -#ifdef __i386__ - entry = (void **)&context->Eax; -#elif defined(__x86_64__) - entry = (void **)&context->Rcx; -#elif defined(__arm__) - entry = (void **)&context->R0; -#elif defined(__aarch64__) - entry = (void **)&context->X0; -#endif
if (process_detaching) NtTerminateThread( GetCurrentThread(), 0 );
@@ -4335,7 +4324,6 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR }
RtlLeaveCriticalSection( &loader_section ); - signal_start_thread( context ); }
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index ad8e2691224..8d489afda7f 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -68,12 +68,12 @@ extern const char *debugstr_exception_code( DWORD code ) DECLSPEC_HIDDEN; extern void set_native_thread_name( DWORD tid, const char *name ) DECLSPEC_HIDDEN;
/* init routines */ +extern void loader_init( CONTEXT *context, void **entry ) DECLSPEC_HIDDEN; extern void version_init(void) DECLSPEC_HIDDEN; extern void debug_init(void) DECLSPEC_HIDDEN; extern void actctx_init(void) DECLSPEC_HIDDEN; extern void locale_init(void) DECLSPEC_HIDDEN; extern void init_user_process_params(void) DECLSPEC_HIDDEN; -extern void CDECL DECLSPEC_NORETURN signal_start_thread( CONTEXT *ctx ) DECLSPEC_HIDDEN; extern void get_resource_lcids( LANGID *user, LANGID *user_neutral, LANGID *system ) DECLSPEC_HIDDEN;
/* module handling */ diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index f5b2f8c1252..fd653e16381 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -1487,13 +1487,14 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, return 0; }
-/*********************************************************************** - * signal_start_thread +/****************************************************************** + * LdrInitializeThunk (NTDLL.@) */ -__ASM_GLOBAL_FUNC( signal_start_thread, - "mov sp, r0\n\t" /* context */ - "mov r1, #1\n\t" - "b " __ASM_NAME("NtContinue") ) +void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unk2, ULONG_PTR unk3, ULONG_PTR unk4 ) +{ + loader_init( context, (void **)&context->R0 ); + NtContinue( context, TRUE ); +}
/********************************************************************** * DbgBreakPoint (NTDLL.@) diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index dfc5c0e31ed..85d31abc028 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -1524,13 +1524,14 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, return 0; }
-/*********************************************************************** - * signal_start_thread +/****************************************************************** + * LdrInitializeThunk (NTDLL.@) */ -__ASM_GLOBAL_FUNC( signal_start_thread, - "mov sp, x0\n\t" /* context */ - "mov x1, #1\n\t" - "b " __ASM_NAME("NtContinue") ) +void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unk2, ULONG_PTR unk3, ULONG_PTR unk4 ) +{ + loader_init( context, (void **)&context->X0 ); + NtContinue( context, TRUE ); +}
/********************************************************************** * DbgBreakPoint (NTDLL.@) diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index b2f251bf26a..7174bd36afe 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -537,6 +537,7 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, /*********************************************************************** * signal_start_thread */ +extern void CDECL DECLSPEC_NORETURN signal_start_thread( CONTEXT *ctx ) DECLSPEC_HIDDEN; __ASM_GLOBAL_FUNC( signal_start_thread, "movl 4(%esp),%esi\n\t" /* context */ "leal -12(%esi),%edi\n\t" @@ -554,6 +555,16 @@ __ASM_GLOBAL_FUNC( signal_start_thread, "movl %esi,(%esp)\n\t" "call " __ASM_STDCALL("NtContinue", 8) )
+/****************************************************************** + * LdrInitializeThunk (NTDLL.@) + */ +void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unk2, ULONG_PTR unk3, ULONG_PTR unk4 ) +{ + loader_init( context, (void **)&context->Eax ); + signal_start_thread( context ); +} + + /********************************************************************** * DbgBreakPoint (NTDLL.@) */ diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 2f7715a0a60..ce57722a930 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -1590,6 +1590,7 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, /*********************************************************************** * signal_start_thread */ +extern void CDECL DECLSPEC_NORETURN signal_start_thread( CONTEXT *ctx ) DECLSPEC_HIDDEN; __ASM_GLOBAL_FUNC( signal_start_thread, "movq %rcx,%rbx\n\t" /* context */ /* clear the thread stack */ @@ -1607,6 +1608,16 @@ __ASM_GLOBAL_FUNC( signal_start_thread, "call " __ASM_NAME("NtContinue") )
+/****************************************************************** + * LdrInitializeThunk (NTDLL.@) + */ +void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unk2, ULONG_PTR unk3, ULONG_PTR unk4 ) +{ + loader_init( context, (void **)&context->Rcx ); + signal_start_thread( context ); +} + + /********************************************************************** * DbgBreakPoint (NTDLL.@) */