From 23a556f2c50c00dccec06f11d32eb9ca2d5e22f8 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 15 Dec 2015 16:00:20 +0100 Subject: [PATCH] Drop has_set_thread_stack_guarantee flag --- winsup/cygwin/autoload.cc | 1 - winsup/cygwin/dcrt0.cc | 8 ++-- winsup/cygwin/exceptions.cc | 7 ++-- winsup/cygwin/miscfuncs.cc | 84 ++++++++++++++----------------------- winsup/cygwin/wincap.cc | 7 ---- winsup/cygwin/wincap.h | 2 - 6 files changed, 37 insertions(+), 72 deletions(-) diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc index d9bf96b7d..a4a872e13 100644 --- a/winsup/cygwin/autoload.cc +++ b/winsup/cygwin/autoload.cc @@ -588,7 +588,6 @@ LoadDLLfuncEx (IdnToUnicode, 20, kernel32, 1) LoadDLLfunc (LocaleNameToLCID, 8, kernel32) LoadDLLfuncEx (PrefetchVirtualMemory, 16, kernel32, 1) LoadDLLfunc (SetThreadGroupAffinity, 12, kernel32) -LoadDLLfunc (SetThreadStackGuarantee, 4, kernel32) /* ldap functions are cdecl! */ #pragma push_macro ("mangle") diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 822e36e62..2b8b9f51c 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -443,11 +443,9 @@ child_info_fork::alloc_stack () api_fatal ("fork: couldn't allocate new stack guard page %p, %E", stack_ptr); } - /* On post-XP systems, set thread stack guarantee matching the - guardsize. Note that the guardsize is one page bigger than - the guarantee. */ - if (wincap.has_set_thread_stack_guarantee () - && real_guardsize > wincap.def_guard_page_size ()) + /* Set thread stack guarantee matching the guardsize. + Note that the guardsize is one page bigger than the guarantee. */ + if (real_guardsize > wincap.def_guard_page_size ()) { real_guardsize -= wincap.page_size (); SetThreadStackGuarantee (&real_guardsize); diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 504fae438..d65f56e3f 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -1581,10 +1581,9 @@ altstack_wrapper (int sig, siginfo_t *siginfo, ucontext_t *sigctx, /* ...restore guard pages in original stack as if MSVCRT::_resetstkovlw has been called. - Compute size of guard pages. If SetThreadStackGuarantee isn't - supported, or if it returns 0, use the default guard page size. */ - if (wincap.has_set_thread_stack_guarantee ()) - SetThreadStackGuarantee (&guard_size); + Compute size of guard pages. If SetThreadStackGuarantee returns 0, + use the default guard page size. */ + SetThreadStackGuarantee (&guard_size); if (!guard_size) guard_size = wincap.def_guard_page_size (); else diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc index 80fa95420..d0e4bf719 100644 --- a/winsup/cygwin/miscfuncs.cc +++ b/winsup/cygwin/miscfuncs.cc @@ -609,10 +609,9 @@ pthread_wrapper (PVOID arg) The below assembler code will release the OS stack after switching to our new stack. */ wrapper_arg.stackaddr = dealloc_addr; - /* On post-XP systems, set thread stack guarantee matching the guardsize. + /* Set thread stack guarantee matching the guardsize. Note that the guardsize is one page bigger than the guarantee. */ - if (wincap.has_set_thread_stack_guarantee () - && wrapper_arg.guardsize > wincap.def_guard_page_size ()) + if (wrapper_arg.guardsize > wincap.def_guard_page_size ()) { wrapper_arg.guardsize -= wincap.page_size (); SetThreadStackGuarantee (&wrapper_arg.guardsize); @@ -877,59 +876,38 @@ CygwinCreateThread (LPTHREAD_START_ROUTINE thread_func, PVOID thread_arg, #endif if (!real_stackaddr) return NULL; - /* Set up committed region. We have two cases: */ - if (!wincap.has_set_thread_stack_guarantee () - && real_guardsize != wincap.def_guard_page_size ()) + /* Set up committed region. We set up the stack like the OS does, + with a reserved region, the guard pages, and a commited region. + We commit the stack commit size from the executable header, but + at least PTHREAD_STACK_MIN (64K). */ + static ULONG exe_commitsize; + + if (!exe_commitsize) { - /* If guardsize is set to something other than the default guard page - size, and if we're running on Windows XP 32 bit, we commit the - entire stack, and, if guardsize is > 0, set up a guard page. */ - real_stacklimit = (PBYTE) real_stackaddr + wincap.page_size (); - if (real_guardsize - && !VirtualAlloc (real_stacklimit, real_guardsize, MEM_COMMIT, - PAGE_READWRITE | PAGE_GUARD)) - goto err; - real_stacklimit += real_guardsize; - if (!VirtualAlloc (real_stacklimit, real_stacksize - real_guardsize - - wincap.page_size (), - MEM_COMMIT, PAGE_READWRITE)) - goto err; + PIMAGE_DOS_HEADER dosheader; + PIMAGE_NT_HEADERS ntheader; + + dosheader = (PIMAGE_DOS_HEADER) GetModuleHandle (NULL); + ntheader = (PIMAGE_NT_HEADERS) + ((PBYTE) dosheader + dosheader->e_lfanew); + exe_commitsize = ntheader->OptionalHeader.SizeOfStackCommit; + exe_commitsize = roundup2 (exe_commitsize, wincap.page_size ()); } - else - { - /* Otherwise we set up the stack like the OS does, with a reserved - region, the guard pages, and a commited region. We commit the - stack commit size from the executable header, but at least - PTHREAD_STACK_MIN (64K). */ - static ULONG exe_commitsize; + ULONG commitsize = exe_commitsize; + if (commitsize > real_stacksize - real_guardsize - wincap.page_size ()) + commitsize = real_stacksize - real_guardsize - wincap.page_size (); + else if (commitsize < PTHREAD_STACK_MIN) + commitsize = PTHREAD_STACK_MIN; + real_stacklimit = (PBYTE) real_stackaddr + real_stacksize + - commitsize - real_guardsize; + if (!VirtualAlloc (real_stacklimit, real_guardsize, MEM_COMMIT, + PAGE_READWRITE | PAGE_GUARD)) + goto err; + real_stacklimit += real_guardsize; + if (!VirtualAlloc (real_stacklimit, commitsize, MEM_COMMIT, + PAGE_READWRITE)) + goto err; - if (!exe_commitsize) - { - PIMAGE_DOS_HEADER dosheader; - PIMAGE_NT_HEADERS ntheader; - - dosheader = (PIMAGE_DOS_HEADER) GetModuleHandle (NULL); - ntheader = (PIMAGE_NT_HEADERS) - ((PBYTE) dosheader + dosheader->e_lfanew); - exe_commitsize = ntheader->OptionalHeader.SizeOfStackCommit; - exe_commitsize = roundup2 (exe_commitsize, wincap.page_size ()); - } - ULONG commitsize = exe_commitsize; - if (commitsize > real_stacksize - real_guardsize - - wincap.page_size ()) - commitsize = real_stacksize - real_guardsize - wincap.page_size (); - else if (commitsize < PTHREAD_STACK_MIN) - commitsize = PTHREAD_STACK_MIN; - real_stacklimit = (PBYTE) real_stackaddr + real_stacksize - - commitsize - real_guardsize; - if (!VirtualAlloc (real_stacklimit, real_guardsize, - MEM_COMMIT, PAGE_READWRITE | PAGE_GUARD)) - goto err; - real_stacklimit += real_guardsize; - if (!VirtualAlloc (real_stacklimit, commitsize, MEM_COMMIT, - PAGE_READWRITE)) - goto err; - } wrapper_arg->stackaddr = (PBYTE) real_stackaddr; wrapper_arg->stackbase = (PBYTE) real_stackaddr + real_stacksize; wrapper_arg->stacklimit = real_stacklimit; diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc index caa335365..dd2bdff98 100644 --- a/winsup/cygwin/wincap.cc +++ b/winsup/cygwin/wincap.cc @@ -29,7 +29,6 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = { terminate_thread_frees_stack:false, has_precise_system_time:false, has_microsoft_accounts:false, - has_set_thread_stack_guarantee:false, has_broken_rtl_query_process_debug_information:false, has_processor_groups:false, has_broken_prefetchvm:false, @@ -49,7 +48,6 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = { terminate_thread_frees_stack:false, has_precise_system_time:false, has_microsoft_accounts:false, - has_set_thread_stack_guarantee:true, has_broken_rtl_query_process_debug_information:true, has_processor_groups:false, has_broken_prefetchvm:false, @@ -69,7 +67,6 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = { terminate_thread_frees_stack:true, has_precise_system_time:false, has_microsoft_accounts:false, - has_set_thread_stack_guarantee:true, has_broken_rtl_query_process_debug_information:false, has_processor_groups:false, has_broken_prefetchvm:false, @@ -89,7 +86,6 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = { terminate_thread_frees_stack:true, has_precise_system_time:false, has_microsoft_accounts:false, - has_set_thread_stack_guarantee:true, has_broken_rtl_query_process_debug_information:false, has_processor_groups:true, has_broken_prefetchvm:false, @@ -109,7 +105,6 @@ wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = { terminate_thread_frees_stack:true, has_precise_system_time:true, has_microsoft_accounts:true, - has_set_thread_stack_guarantee:true, has_broken_rtl_query_process_debug_information:false, has_processor_groups:true, has_broken_prefetchvm:false, @@ -129,7 +124,6 @@ wincaps wincap_10 __attribute__((section (".cygwin_dll_common"), shared)) = { terminate_thread_frees_stack:true, has_precise_system_time:true, has_microsoft_accounts:true, - has_set_thread_stack_guarantee:true, has_broken_rtl_query_process_debug_information:false, has_processor_groups:true, has_broken_prefetchvm:true, @@ -149,7 +143,6 @@ wincaps wincap_10_1511 __attribute__((section (".cygwin_dll_common"), shared)) = terminate_thread_frees_stack:true, has_precise_system_time:true, has_microsoft_accounts:true, - has_set_thread_stack_guarantee:true, has_broken_rtl_query_process_debug_information:false, has_processor_groups:true, has_broken_prefetchvm:false, diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h index d7ba0ec9f..b3e613442 100644 --- a/winsup/cygwin/wincap.h +++ b/winsup/cygwin/wincap.h @@ -22,7 +22,6 @@ struct wincaps unsigned terminate_thread_frees_stack : 1; unsigned has_precise_system_time : 1; unsigned has_microsoft_accounts : 1; - unsigned has_set_thread_stack_guarantee : 1; unsigned has_broken_rtl_query_process_debug_information : 1; unsigned has_processor_groups : 1; unsigned has_broken_prefetchvm : 1; @@ -67,7 +66,6 @@ public: bool IMPLEMENT (terminate_thread_frees_stack) bool IMPLEMENT (has_precise_system_time) bool IMPLEMENT (has_microsoft_accounts) - bool IMPLEMENT (has_set_thread_stack_guarantee) bool IMPLEMENT (has_broken_rtl_query_process_debug_information) bool IMPLEMENT (has_processor_groups) bool IMPLEMENT (has_broken_prefetchvm)