Module: wine Branch: master Commit: 9650f1d3a19857f8bab414188542952b0b21ee1b URL: https://source.winehq.org/git/wine.git/?a=commit;h=9650f1d3a19857f8bab414188...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Apr 28 13:26:34 2020 +0200
ntdll: Move signal stack size computation to the common code.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/ntdll_misc.h | 3 +++ dlls/ntdll/signal_arm.c | 14 ++------------ dlls/ntdll/signal_arm64.c | 1 - dlls/ntdll/signal_i386.c | 21 ++++----------------- dlls/ntdll/signal_powerpc.c | 14 ++------------ dlls/ntdll/signal_x86_64.c | 17 ++--------------- dlls/ntdll/virtual.c | 12 ++++++++++++ 7 files changed, 25 insertions(+), 57 deletions(-)
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 55de8dbce8..7b139db90c 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -77,6 +77,9 @@ extern LPCSTR debugstr_us( const UNICODE_STRING *str ) DECLSPEC_HIDDEN; extern LPCSTR debugstr_ObjectAttributes(const OBJECT_ATTRIBUTES *oa) DECLSPEC_HIDDEN;
/* init routines */ +extern SIZE_T signal_stack_size DECLSPEC_HIDDEN; +extern SIZE_T signal_stack_mask DECLSPEC_HIDDEN; +extern SIZE_T signal_stack_align DECLSPEC_HIDDEN; extern void signal_init_threading(void) DECLSPEC_HIDDEN; extern NTSTATUS signal_alloc_thread( TEB **teb ) DECLSPEC_HIDDEN; extern void signal_free_thread( TEB *teb ) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 5935f5f8d9..3654fe38e5 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -966,22 +966,12 @@ void signal_init_threading(void) */ NTSTATUS signal_alloc_thread( TEB **teb ) { - static size_t sigstack_alignment; - SIZE_T size; + SIZE_T size = signal_stack_mask + 1; NTSTATUS status;
- if (!sigstack_alignment) - { - size_t min_size = page_size; - /* find the first power of two not smaller than min_size */ - while ((1u << sigstack_alignment) < min_size) sigstack_alignment++; - assert( sizeof(TEB) <= min_size ); - } - - size = 1 << sigstack_alignment; *teb = NULL; if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN, - PAGE_READWRITE, sigstack_alignment ))) + PAGE_READWRITE, signal_stack_align ))) { (*teb)->Tib.Self = &(*teb)->Tib; (*teb)->Tib.ExceptionList = (void *)~0UL; diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 2c61d8a774..2c03169395 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -111,7 +111,6 @@ static DWORD64 get_fault_esr( ucontext_t *sigcontext ) #endif /* linux */
static const size_t teb_size = 0x2000; /* we reserve two pages for the TEB */ -static const size_t signal_stack_size = max( MINSIGSTKSZ, 8192 );
/* stack layout when calling an exception raise function */ struct stack_layout diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index f7cdbd606e..151c72263b 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -474,8 +474,6 @@ struct stack_layout typedef int (*wine_signal_handler)(unsigned int sig);
static const size_t teb_size = 4096; /* we reserve one page for the TEB */ -static size_t signal_stack_mask; -static size_t signal_stack_size;
static ULONG first_ldt_entry = 32;
@@ -2592,26 +2590,14 @@ void signal_init_threading(void) */ NTSTATUS signal_alloc_thread( TEB **teb ) { - static size_t sigstack_alignment; struct x86_thread_data *thread_data; - SIZE_T size; + SIZE_T size = signal_stack_mask + 1; void *addr = NULL; NTSTATUS status; - int first_thread = !sigstack_alignment; + static int first_thread = 1;
- if (!sigstack_alignment) - { - size_t min_size = teb_size + max( MINSIGSTKSZ, 8192 ); - /* find the first power of two not smaller than min_size */ - sigstack_alignment = 12; - while ((1u << sigstack_alignment) < min_size) sigstack_alignment++; - signal_stack_mask = (1 << sigstack_alignment) - 1; - signal_stack_size = (1 << sigstack_alignment) - teb_size; - } - - size = signal_stack_mask + 1; if (!(status = virtual_alloc_aligned( &addr, 0, &size, MEM_COMMIT | MEM_TOP_DOWN, - PAGE_READWRITE, sigstack_alignment ))) + PAGE_READWRITE, signal_stack_align ))) { *teb = addr; (*teb)->Tib.Self = &(*teb)->Tib; @@ -2623,6 +2609,7 @@ NTSTATUS signal_alloc_thread( TEB **teb ) NtFreeVirtualMemory( NtCurrentProcess(), &addr, &size, MEM_RELEASE ); status = STATUS_TOO_MANY_THREADS; } + first_thread = 0; } return status; } diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c index 0ef71af351..81bb8fc596 100644 --- a/dlls/ntdll/signal_powerpc.c +++ b/dlls/ntdll/signal_powerpc.c @@ -1027,22 +1027,12 @@ void signal_init_threading(void) */ NTSTATUS signal_alloc_thread( TEB **teb ) { - static size_t sigstack_alignment; - SIZE_T size; + SIZE_T size = signal_stack_mask + 1; NTSTATUS status;
- if (!sigstack_alignment) - { - size_t min_size = page_size; /* this is just for the TEB, we don't use a signal stack yet */ - /* find the first power of two not smaller than min_size */ - while ((1u << sigstack_alignment) < min_size) sigstack_alignment++; - assert( sizeof(TEB) <= min_size ); - } - - size = 1 << sigstack_alignment; *teb = NULL; if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN, - PAGE_READWRITE, sigstack_alignment ))) + PAGE_READWRITE, signal_stack_align ))) { (*teb)->Tib.Self = &(*teb)->Tib; (*teb)->Tib.ExceptionList = (void *)~0UL; diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index b53edf7633..2f4acbc27a 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -282,7 +282,6 @@ enum i386_trap_code };
static const size_t teb_size = 0x2000; /* we reserve two pages for the TEB */ -static size_t signal_stack_size;
typedef void (*raise_func)( EXCEPTION_RECORD *rec, CONTEXT *context );
@@ -3120,24 +3119,12 @@ void signal_init_threading(void) */ NTSTATUS signal_alloc_thread( TEB **teb ) { - static size_t sigstack_alignment; - SIZE_T size; + SIZE_T size = signal_stack_mask + 1; NTSTATUS status;
- if (!sigstack_alignment) - { - size_t min_size = teb_size + max( MINSIGSTKSZ, 8192 ); - /* find the first power of two not smaller than min_size */ - sigstack_alignment = 12; - while ((1u << sigstack_alignment) < min_size) sigstack_alignment++; - signal_stack_size = (1 << sigstack_alignment) - teb_size; - assert( sizeof(TEB) <= teb_size ); - } - - size = 1 << sigstack_alignment; *teb = NULL; if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN, - PAGE_READWRITE, sigstack_alignment ))) + PAGE_READWRITE, signal_stack_align ))) { (*teb)->Tib.Self = &(*teb)->Tib; (*teb)->Tib.ExceptionList = (void *)~0UL; diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index 6ad2d21e01..f9a461bdd8 100644 --- a/dlls/ntdll/virtual.c +++ b/dlls/ntdll/virtual.c @@ -31,6 +31,7 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> +#include <signal.h> #include <sys/types.h> #ifdef HAVE_SYS_SOCKET_H # include <sys/socket.h> @@ -159,6 +160,10 @@ static void *address_space_start = (void *)0x10000; #endif /* __i386__ */ static const BOOL is_win64 = (sizeof(void *) > sizeof(int));
+SIZE_T signal_stack_size = 0; +SIZE_T signal_stack_mask = 0; +SIZE_T signal_stack_align = 0; + #define ROUND_ADDR(addr,mask) \ ((void *)((UINT_PTR)(addr) & ~(UINT_PTR)(mask)))
@@ -1974,6 +1979,13 @@ void virtual_init(void) } }
+ size = ROUND_SIZE( 0, sizeof(TEB) ) + max( MINSIGSTKSZ, 8192 ); + /* find the first power of two not smaller than size */ + signal_stack_align = page_shift; + while ((1u << signal_stack_align) < size) signal_stack_align++; + signal_stack_mask = (1 << signal_stack_align) - 1; + signal_stack_size = (1 << signal_stack_align) - ROUND_SIZE( 0, sizeof(TEB) ); + /* try to find space in a reserved area for the views and pages protection table */ #ifdef _WIN64 pages_vprot_size = ((size_t)address_space_limit >> page_shift >> pages_vprot_shift) + 1;