Module: wine Branch: master Commit: a0a62463e3d1d053459a194e2e1bcc91bfbec0f5 URL: https://source.winehq.org/git/wine.git/?a=commit;h=a0a62463e3d1d053459a194e2...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Feb 19 19:08:48 2021 +0100
ntdll: Introduce signal_init_syscalls.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/loader.c | 4 +++- dlls/ntdll/unix/signal_arm.c | 9 +++++++++ dlls/ntdll/unix/signal_arm64.c | 10 ++++++++++ dlls/ntdll/unix/signal_i386.c | 9 +++++++++ dlls/ntdll/unix/signal_x86_64.c | 17 +++++++++++++++++ dlls/ntdll/unix/unix_private.h | 1 + dlls/ntdll/unix/virtual.c | 6 ------ 7 files changed, 49 insertions(+), 7 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 8b1fd6edb7a..c4f897f3d0d 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -104,6 +104,7 @@ void (WINAPI *pLdrInitializeThunk)(CONTEXT*,void**,ULONG_PTR,ULONG_PTR) = NU void (WINAPI *pRtlUserThreadStart)( PRTL_THREAD_START_ROUTINE entry, void *arg ) = NULL;
static NTSTATUS (CDECL *p__wine_set_unix_funcs)( int version, const struct unix_funcs *funcs ); +static void *syscall_dispatcher;
#ifdef __GNUC__ static void fatal_error( const char *err, ... ) __attribute__((noreturn, format(printf,1,2))); @@ -883,7 +884,7 @@ static void load_ntdll_functions( HMODULE module ) if ((ptr = (void *)find_named_export( module, ntdll_exports, #name ))) *ptr = val; \ else ERR( "%s not found\n", #name )
- SET_PTR( __wine_syscall_dispatcher, __wine_syscall_dispatcher ); + SET_PTR( __wine_syscall_dispatcher, syscall_dispatcher ); #ifdef __i386__ SET_PTR( __wine_ldt_copy, &__wine_ldt_copy ); #endif @@ -1650,6 +1651,7 @@ static void start_main_thread(void) startup_info_size = server_init_process(); virtual_map_user_shared_data(); init_cpu_info(); + syscall_dispatcher = signal_init_syscalls(); init_files(); init_startup_info(); NtCreateKeyedEvent( &keyed_event, GENERIC_READ | GENERIC_WRITE, NULL, 0 ); diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c index 385e4807990..2de58925c84 100644 --- a/dlls/ntdll/unix/signal_arm.c +++ b/dlls/ntdll/unix/signal_arm.c @@ -963,6 +963,15 @@ void signal_init_process(void) }
+/********************************************************************** + * signal_init_syscalls + */ +void *signal_init_syscalls(void) +{ + return __wine_syscall_dispatcher; +} + + /*********************************************************************** * init_thread_context */ diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index 95042de45e1..9a36746f5bc 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -1120,6 +1120,16 @@ void signal_init_process(void) exit(1); }
+ +/********************************************************************** + * signal_init_syscalls + */ +void *signal_init_syscalls(void) +{ + return __wine_syscall_dispatcher; +} + + /*********************************************************************** * init_thread_context */ diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index f2d58dc654d..09529a1ea96 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -2467,6 +2467,15 @@ void signal_init_process(void) }
+/********************************************************************** + * signal_init_syscalls + */ +void *signal_init_syscalls(void) +{ + return __wine_syscall_dispatcher; +} + + /*********************************************************************** * init_thread_context */ diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 892d208e43a..bed4958f251 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -34,6 +34,7 @@ #include <stdarg.h> #include <stdio.h> #include <sys/types.h> +#include <sys/mman.h> #ifdef HAVE_UNISTD_H # include <unistd.h> #endif @@ -2787,6 +2788,22 @@ void signal_init_process(void) }
+/********************************************************************** + * signal_init_syscalls + */ +void *signal_init_syscalls(void) +{ + void *ptr; + + /* sneak in a syscall dispatcher pointer at a fixed address (7ffe1000) */ + ptr = (char *)user_shared_data + page_size; + anon_mmap_fixed( ptr, page_size, PROT_READ | PROT_WRITE, 0 ); + *(void **)ptr = __wine_syscall_dispatcher; + + return __wine_syscall_dispatcher; +} + + /*********************************************************************** * init_thread_context */ diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 1a864b6fb5d..65f526d0f7d 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -208,6 +208,7 @@ extern NTSTATUS signal_alloc_thread( TEB *teb ) DECLSPEC_HIDDEN; extern void signal_free_thread( TEB *teb ) DECLSPEC_HIDDEN; extern void signal_init_thread( TEB *teb ) DECLSPEC_HIDDEN; extern void signal_init_process(void) DECLSPEC_HIDDEN; +extern void *signal_init_syscalls(void) DECLSPEC_HIDDEN; extern void DECLSPEC_NORETURN signal_start_thread( PRTL_THREAD_START_ROUTINE entry, void *arg, BOOL suspend, void *thunk, TEB *teb ) DECLSPEC_HIDDEN; extern void DECLSPEC_NORETURN signal_exit_thread( int status, void (*func)(int) ) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index c35f9c2fc07..3350dc665c1 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -2597,12 +2597,6 @@ TEB *virtual_alloc_first_teb(void) exit(1); }
-#ifdef __x86_64__ /* sneak in a syscall dispatcher pointer at a fixed address (7ffe1000) */ - ptr = (char *)user_shared_data + page_size; - anon_mmap_fixed( ptr, page_size, PROT_READ | PROT_WRITE, 0 ); - *(void **)ptr = __wine_syscall_dispatcher; -#endif - NtAllocateVirtualMemory( NtCurrentProcess(), &teb_block, 0, &total, MEM_RESERVE | MEM_TOP_DOWN, PAGE_READWRITE ); teb_block_pos = 30;