Module: wine Branch: master Commit: 6ecc8039506b91a0a907148f4ea64a2285db28fa URL: https://gitlab.winehq.org/wine/wine/-/commit/6ecc8039506b91a0a907148f4ea64a2...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Nov 10 09:50:41 2022 +0100
ntdll: Use a pthread key for the TEB on all platforms.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/signal_arm.c | 5 ----- dlls/ntdll/unix/signal_arm64.c | 14 -------------- dlls/ntdll/unix/signal_i386.c | 6 ------ dlls/ntdll/unix/signal_x86_64.c | 5 ----- dlls/ntdll/unix/thread.c | 12 ++++++++++++ dlls/ntdll/unix/unix_private.h | 1 + dlls/ntdll/unix/virtual.c | 6 +++++- 7 files changed, 18 insertions(+), 31 deletions(-)
diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c index a9f77f55ba4..9eef8ff7c69 100644 --- a/dlls/ntdll/unix/signal_arm.c +++ b/dlls/ntdll/unix/signal_arm.c @@ -1770,9 +1770,4 @@ __ASM_GLOBAL_FUNC( __wine_longjmp, "mov r0, r1\n\t" /* retval */ "bx r2" )
-/********************************************************************** - * NtCurrentTeb (NTDLL.@) - */ -__ASM_GLOBAL_FUNC( NtCurrentTeb, "mrc p15, 0, r0, c13, c0, 2; bx lr" ) - #endif /* __arm__ */ diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index 7bce856d616..66f11c1653b 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -129,8 +129,6 @@ static DWORD64 get_fault_esr( ucontext_t *sigcontext )
#endif /* linux */
-static pthread_key_t teb_key; - struct syscall_frame { ULONG64 x[29]; /* 000 */ @@ -1320,7 +1318,6 @@ NTSTATUS WINAPI NtSetLdtEntries( ULONG sel1, LDT_ENTRY entry1, ULONG sel2, LDT_E */ void signal_init_threading(void) { - pthread_key_create( &teb_key, NULL ); }
@@ -1348,8 +1345,6 @@ void signal_init_thread( TEB *teb ) { /* Win64/ARM applications expect the TEB pointer to be in the x18 platform register. */ __asm__ __volatile__( "mov x18, %0" : : "r" (teb) ); - - pthread_setspecific( teb_key, teb ); }
@@ -1634,13 +1629,4 @@ __ASM_GLOBAL_FUNC( __wine_longjmp, "mov x0, x1\n\t" /* retval */ "ret" )
- -/********************************************************************** - * NtCurrentTeb (NTDLL.@) - */ -TEB * WINAPI NtCurrentTeb(void) -{ - return pthread_getspecific( teb_key ); -} - #endif /* __aarch64__ */ diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index efb7cc497ef..31187bb478e 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -2752,10 +2752,4 @@ __ASM_GLOBAL_FUNC( __wine_longjmp, "addl $4,%esp\n\t" /* get rid of return address */ "jmp *20(%ecx)\n\t" /* jmp_buf.Eip */ )
- -/********************************************************************** - * NtCurrentTeb (NTDLL.@) - */ -__ASM_STDCALL_FUNC( NtCurrentTeb, 0, ".byte 0x64\n\tmovl 0x18,%eax\n\tret" ) - #endif /* __i386__ */ diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 263bb64c8cc..3c61e0728cb 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -2896,9 +2896,4 @@ __ASM_GLOBAL_FUNC( __wine_longjmp, "movq 0x10(%rcx),%rsp\n\t" /* jmp_buf->Rsp */ "jmp *%rdx" )
-/********************************************************************** - * NtCurrentTeb (NTDLL.@) - */ -__ASM_GLOBAL_FUNC( NtCurrentTeb, "movq %gs:0x30,%rax; ret" ) - #endif /* __x86_64__ */ diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c index 029f13dc4f9..c4eee74036d 100644 --- a/dlls/ntdll/unix/thread.c +++ b/dlls/ntdll/unix/thread.c @@ -73,6 +73,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(thread); WINE_DECLARE_DEBUG_CHANNEL(seh); WINE_DECLARE_DEBUG_CHANNEL(threadname);
+pthread_key_t teb_key = 0; + static int nb_threads = 1;
static inline int get_unix_exit_code( NTSTATUS status ) @@ -1066,6 +1068,7 @@ static void start_thread( TEB *teb ) BOOL suspend;
thread_data->pthread_id = pthread_self(); + pthread_setspecific( teb_key, teb ); signal_init_thread( teb ); server_init_thread( thread_data->start, &suspend ); signal_start_thread( thread_data->start, thread_data->param, suspend, teb ); @@ -1523,6 +1526,15 @@ NTSTATUS WINAPI NtRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL }
+/********************************************************************** + * NtCurrentTeb (NTDLL.@) + */ +TEB * WINAPI NtCurrentTeb(void) +{ + return pthread_getspecific( teb_key ); +} + + /*********************************************************************** * NtOpenThread (NTDLL.@) */ diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 73b9ed76de0..d2abf19aa25 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -117,6 +117,7 @@ extern const char *config_dir DECLSPEC_HIDDEN; extern const char *user_name DECLSPEC_HIDDEN; extern const char **dll_paths DECLSPEC_HIDDEN; extern const char **system_dll_paths DECLSPEC_HIDDEN; +extern pthread_key_t teb_key DECLSPEC_HIDDEN; extern PEB *peb DECLSPEC_HIDDEN; extern USHORT *uctable DECLSPEC_HIDDEN; extern USHORT *lctable DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 422d717b00d..5f1005a129f 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -2929,6 +2929,7 @@ static TEB *init_teb( void *ptr, BOOL is_wow ) TEB *virtual_alloc_first_teb(void) { void *ptr; + TEB *teb; NTSTATUS status; SIZE_T data_size = page_size; SIZE_T block_size = signal_stack_mask + 1; @@ -2950,7 +2951,10 @@ TEB *virtual_alloc_first_teb(void) data_size = 2 * block_size; NtAllocateVirtualMemory( NtCurrentProcess(), (void **)&ptr, 0, &data_size, MEM_COMMIT, PAGE_READWRITE ); peb = (PEB *)((char *)teb_block + 31 * block_size + (is_win64 ? 0 : page_size)); - return init_teb( ptr, FALSE ); + teb = init_teb( ptr, FALSE ); + pthread_key_create( &teb_key, NULL ); + pthread_setspecific( teb_key, teb ); + return teb; }