Jacek Caban : ntdll: Introduce signal_init_syscalls.

Alexandre Julliard julliard at winehq.org
Fri Feb 19 17:20:10 CST 2021


Module: wine
Branch: master
Commit: a0a62463e3d1d053459a194e2e1bcc91bfbec0f5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a0a62463e3d1d053459a194e2e1bcc91bfbec0f5

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Feb 19 19:08:48 2021 +0100

ntdll: Introduce signal_init_syscalls.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list