Alexandre Julliard : ntdll: Also pass the TEB to signal_exit_thread().

Alexandre Julliard julliard at winehq.org
Mon Jun 14 16:00:36 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jun 14 12:56:38 2021 +0200

ntdll: Also pass the TEB to signal_exit_thread().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/signal_arm.c    | 14 ++++----------
 dlls/ntdll/unix/signal_arm64.c  | 16 ++++------------
 dlls/ntdll/unix/signal_i386.c   |  5 +++--
 dlls/ntdll/unix/signal_x86_64.c |  9 ++++-----
 dlls/ntdll/unix/thread.c        |  6 +++---
 dlls/ntdll/unix/unix_private.h  |  2 +-
 6 files changed, 19 insertions(+), 33 deletions(-)

diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c
index 8a45d0ba086..a0d826ea178 100644
--- a/dlls/ntdll/unix/signal_arm.c
+++ b/dlls/ntdll/unix/signal_arm.c
@@ -973,8 +973,10 @@ __ASM_GLOBAL_FUNC( signal_start_thread,
                    "bx r5" )
 
 
-extern void DECLSPEC_NORETURN call_thread_exit_func( int status, void (*func)(int), TEB *teb );
-__ASM_GLOBAL_FUNC( call_thread_exit_func,
+/***********************************************************************
+ *           signal_exit_thread
+ */
+__ASM_GLOBAL_FUNC( signal_exit_thread,
                    "ldr r3, [r2, #0x1d4]\n\t"  /* arm_thread_data()->exit_frame */
                    "mov ip, #0\n\t"
                    "str ip, [r2, #0x1d4]\n\t"
@@ -983,12 +985,4 @@ __ASM_GLOBAL_FUNC( call_thread_exit_func,
                    "movne sp, r3\n\t"
                    "blx r1" )
 
-/***********************************************************************
- *           signal_exit_thread
- */
-void signal_exit_thread( int status, void (*func)(int) )
-{
-    call_thread_exit_func( status, func, NtCurrentTeb() );
-}
-
 #endif  /* __arm__ */
diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c
index 0cb1bde1d55..669e44aaa2b 100644
--- a/dlls/ntdll/unix/signal_arm64.c
+++ b/dlls/ntdll/unix/signal_arm64.c
@@ -1146,9 +1146,10 @@ __ASM_GLOBAL_FUNC( signal_start_thread,
                    "mov lr, #0\n\t"
                    "br x19" )
 
-
-extern void DECLSPEC_NORETURN call_thread_exit_func( int status, void (*func)(int), TEB *teb );
-__ASM_GLOBAL_FUNC( call_thread_exit_func,
+/***********************************************************************
+ *           signal_exit_thread
+ */
+__ASM_GLOBAL_FUNC( signal_exit_thread,
                    "stp x29, x30, [sp,#-16]!\n\t"
                    "ldr x3, [x2, #0x2f0]\n\t"  /* arm64_thread_data()->exit_frame */
                    "str xzr, [x2, #0x2f0]\n\t"
@@ -1157,15 +1158,6 @@ __ASM_GLOBAL_FUNC( call_thread_exit_func,
                    "1:\tldp x29, x30, [sp], #16\n\t"
                    "br x1" )
 
-/***********************************************************************
- *           signal_exit_thread
- */
-void signal_exit_thread( int status, void (*func)(int) )
-{
-    call_thread_exit_func( status, func, NtCurrentTeb() );
-}
-
-
 /**********************************************************************
  *           NtCurrentTeb   (NTDLL.@)
  */
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index cb90eade4c6..4ce1b519da3 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -2436,14 +2436,15 @@ __ASM_GLOBAL_FUNC( signal_start_thread,
  */
 __ASM_GLOBAL_FUNC( signal_exit_thread,
                    "movl 8(%esp),%ecx\n\t"
+                   "movl 12(%esp),%esi\n\t"
+                   "xorl %edx,%edx\n\t"
                    /* fetch exit frame */
-                   "movl %fs:0x1f4,%edx\n\t"    /* x86_thread_data()->exit_frame */
+                   "xchgl %edx,0x1f4(%esi)\n\t"    /* x86_thread_data()->exit_frame */
                    "testl %edx,%edx\n\t"
                    "jnz 1f\n\t"
                    "jmp *%ecx\n\t"
                    /* switch to exit frame stack */
                    "1:\tmovl 4(%esp),%eax\n\t"
-                   "movl $0,%fs:0x1f4\n\t"
                    "movl %edx,%ebp\n\t"
                    __ASM_CFI(".cfi_def_cfa %ebp,4\n\t")
                    __ASM_CFI(".cfi_rel_offset %ebp,0\n\t")
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 46243ea00d4..04442a012a2 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -2691,14 +2691,13 @@ __ASM_GLOBAL_FUNC( signal_start_thread,
  */
 __ASM_GLOBAL_FUNC( signal_exit_thread,
                    /* fetch exit frame */
-                   "movq %gs:0x30,%rax\n\t"
-                   "movq 0x320(%rax),%rdx\n\t"      /* amd64_thread_data()->exit_frame */
-                   "testq %rdx,%rdx\n\t"
+                   "xorl %ecx,%ecx\n\t"
+                   "xchgq %rcx,0x320(%rdx)\n\t"      /* amd64_thread_data()->exit_frame */
+                   "testq %rcx,%rcx\n\t"
                    "jnz 1f\n\t"
                    "jmp *%rsi\n"
                    /* switch to exit frame stack */
-                   "1:\tmovq $0,0x320(%rax)\n\t"
-                   "movq %rdx,%rsp\n\t"
+                   "1:\tmovq %rcx,%rsp\n\t"
                    __ASM_CFI(".cfi_adjust_cfa_offset 56\n\t")
                    __ASM_CFI(".cfi_rel_offset %rbp,48\n\t")
                    __ASM_CFI(".cfi_rel_offset %rbx,40\n\t")
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
index ce72cc8b6cb..1c3c77cf24d 100644
--- a/dlls/ntdll/unix/thread.c
+++ b/dlls/ntdll/unix/thread.c
@@ -1017,7 +1017,7 @@ void abort_thread( int status )
 {
     pthread_sigmask( SIG_BLOCK, &server_block_set, NULL );
     if (InterlockedDecrement( &nb_threads ) <= 0) abort_process( status );
-    signal_exit_thread( status, pthread_exit_wrapper );
+    signal_exit_thread( status, pthread_exit_wrapper, NtCurrentTeb() );
 }
 
 
@@ -1050,7 +1050,7 @@ static DECLSPEC_NORETURN void exit_thread( int status )
             virtual_free_teb( teb );
         }
     }
-    signal_exit_thread( status, pthread_exit_wrapper );
+    signal_exit_thread( status, pthread_exit_wrapper, NtCurrentTeb() );
 }
 
 
@@ -1060,7 +1060,7 @@ static DECLSPEC_NORETURN void exit_thread( int status )
 void exit_process( int status )
 {
     pthread_sigmask( SIG_BLOCK, &server_block_set, NULL );
-    signal_exit_thread( get_unix_exit_code( status ), process_exit_wrapper );
+    signal_exit_thread( get_unix_exit_code( status ), process_exit_wrapper, NtCurrentTeb() );
 }
 
 
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index 28ba07ceac1..2392b2ea274 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -246,7 +246,7 @@ extern void signal_init_thread( TEB *teb ) DECLSPEC_HIDDEN;
 extern void signal_init_process(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;
+extern void DECLSPEC_NORETURN signal_exit_thread( int status, void (*func)(int), TEB *teb ) DECLSPEC_HIDDEN;
 extern void __wine_syscall_dispatcher(void) DECLSPEC_HIDDEN;
 extern unsigned int __wine_syscall_flags DECLSPEC_HIDDEN;
 extern NTSTATUS signal_set_full_context( CONTEXT *context ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list