Module: wine Branch: master Commit: a5cec4f5fbef0c586b530ea51acd6e3da2ff3f83 URL: https://source.winehq.org/git/wine.git/?a=commit;h=a5cec4f5fbef0c586b530ea51...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Jun 14 12:59:05 2021 +0200
ntdll: Always use the TEB that was passed to signal_start_thread().
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/signal_i386.c | 24 +++++++++++++----------- dlls/ntdll/unix/signal_x86_64.c | 22 +++++++++++----------- 2 files changed, 24 insertions(+), 22 deletions(-)
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index 4ce1b519da3..89f4fb4151c 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -2342,7 +2342,7 @@ void signal_init_process(void) /*********************************************************************** * init_thread_context */ -static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, void *arg ) +static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, void *arg, TEB *teb ) { context->SegCs = get_cs(); context->SegDs = get_ds(); @@ -2353,7 +2353,7 @@ static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, context->EFlags = 0x202; context->Eax = (DWORD)entry; context->Ebx = (DWORD)arg; - context->Esp = (DWORD)NtCurrentTeb()->Tib.StackBase - 16; + context->Esp = (DWORD)teb->Tib.StackBase - 16; context->Eip = (DWORD)pRtlUserThreadStart; context->FloatSave.ControlWord = 0x27f; ((XSAVE_FORMAT *)context->ExtendedRegisters)->ControlWord = 0x27f; @@ -2369,7 +2369,7 @@ static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, /*********************************************************************** * get_initial_context */ -PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend ) +PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB *teb ) { CONTEXT *ctx;
@@ -2377,15 +2377,15 @@ PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void { CONTEXT context = { CONTEXT_ALL };
- init_thread_context( &context, entry, arg ); + init_thread_context( &context, entry, arg, teb ); wait_suspend( &context ); ctx = (CONTEXT *)((ULONG_PTR)context.Esp & ~15) - 1; *ctx = context; } else { - ctx = (CONTEXT *)((char *)NtCurrentTeb()->Tib.StackBase - 16) - 1; - init_thread_context( ctx, entry, arg ); + ctx = (CONTEXT *)((char *)teb->Tib.StackBase - 16) - 1; + init_thread_context( ctx, entry, arg, teb ); } pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL ); ctx->ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS; @@ -2409,17 +2409,19 @@ __ASM_GLOBAL_FUNC( signal_start_thread, "pushl %edi\n\t" __ASM_CFI(".cfi_rel_offset %edi,-12\n\t") /* store exit frame */ - "movl %ebp,%fs:0x1f4\n\t" /* x86_thread_data()->exit_frame */ + "movl 24(%ebp),%ecx\n\t" /* teb */ + "movl %ebp,0x1f4(%ecx)\n\t" /* x86_thread_data()->exit_frame */ /* set syscall frame */ - "cmpl $0,%fs:0x1f8\n\t" /* x86_thread_data()->syscall_frame */ + "cmpl $0,0x1f8(%ecx)\n\t" /* x86_thread_data()->syscall_frame */ "jnz 1f\n\t" "leal -0x380(%esp),%eax\n\t" /* sizeof(struct syscall_frame) */ "andl $~63,%eax\n\t" - "movl %eax,%fs:0x1f8\n" /* x86_thread_data()->syscall_frame */ + "movl %eax,0x1f8(%ecx)\n" /* x86_thread_data()->syscall_frame */ /* switch to thread stack */ - "1:\tmovl %fs:4,%eax\n\t" /* NtCurrentTeb()->StackBase */ - "leal -0x1004(%eax),%esp\n\t" + "1:\tmovl 4(%ecx),%eax\n\t" /* teb->StackBase */ + "leal -0x1000(%eax),%esp\n\t" /* attach dlls */ + "pushl %ecx\n\t" /* teb */ "pushl 16(%ebp)\n\t" /* suspend */ "pushl 12(%ebp)\n\t" /* arg */ "pushl 8(%ebp)\n\t" /* entry */ diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 04442a012a2..10aa2a516b0 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -2603,13 +2603,13 @@ void signal_init_process(void) /*********************************************************************** * init_thread_context */ -static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, void *arg ) +static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, void *arg, TEB *teb ) { __asm__( "movw %%cs,%0" : "=m" (context->SegCs) ); __asm__( "movw %%ss,%0" : "=m" (context->SegSs) ); context->Rcx = (ULONG_PTR)entry; context->Rdx = (ULONG_PTR)arg; - context->Rsp = (ULONG_PTR)NtCurrentTeb()->Tib.StackBase - 0x28; + context->Rsp = (ULONG_PTR)teb->Tib.StackBase - 0x28; context->Rip = (ULONG_PTR)pRtlUserThreadStart; context->EFlags = 0x200; context->u.FltSave.ControlWord = 0x27f; @@ -2620,7 +2620,7 @@ static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, /*********************************************************************** * get_initial_context */ -PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend ) +PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB *teb ) { CONTEXT *ctx;
@@ -2629,15 +2629,15 @@ PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void CONTEXT context = { 0 };
context.ContextFlags = CONTEXT_ALL; - init_thread_context( &context, entry, arg ); + init_thread_context( &context, entry, arg, teb ); wait_suspend( &context ); ctx = (CONTEXT *)((ULONG_PTR)context.Rsp & ~15) - 1; *ctx = context; } else { - ctx = (CONTEXT *)((char *)NtCurrentTeb()->Tib.StackBase - 0x30) - 1; - init_thread_context( ctx, entry, arg ); + ctx = (CONTEXT *)((char *)teb->Tib.StackBase - 0x30) - 1; + init_thread_context( ctx, entry, arg, teb ); } pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL ); ctx->ContextFlags = CONTEXT_FULL; @@ -2666,17 +2666,17 @@ __ASM_GLOBAL_FUNC( signal_start_thread, "movq %r15,8(%rsp)\n\t" __ASM_CFI(".cfi_rel_offset %r15,8\n\t") /* store exit frame */ - "movq %gs:0x30,%rax\n\t" - "movq %rsp,0x320(%rax)\n\t" /* amd64_thread_data()->exit_frame */ + "movq %rsp,0x320(%r8)\n\t" /* amd64_thread_data()->exit_frame */ /* set syscall frame */ - "cmpq $0,0x328(%rax)\n\t" /* amd64_thread_data()->syscall_frame */ + "cmpq $0,0x328(%r8)\n\t" /* amd64_thread_data()->syscall_frame */ "jnz 1f\n\t" "leaq -0x400(%rsp),%r10\n\t" /* sizeof(struct syscall_frame) */ "andq $~63,%r10\n\t" - "movq %r10,0x328(%rax)\n" /* amd64_thread_data()->syscall_frame */ + "movq %r10,0x328(%r8)\n" /* amd64_thread_data()->syscall_frame */ /* switch to thread stack */ - "1:\tmovq 8(%rax),%rax\n\t" /* NtCurrentTeb()->Tib.StackBase */ + "1:\tmovq 8(%r8),%rax\n\t" /* teb->Tib.StackBase */ "movq %rcx,%rbx\n\t" /* thunk */ + "movq %r8,%rcx\n\t" /* teb */ "leaq -0x1000(%rax),%rsp\n\t" /* attach dlls */ "call " __ASM_NAME("get_initial_context") "\n\t"