Drop has_set_thread_stack_guarantee flag

This commit is contained in:
Corinna Vinschen 2015-12-15 16:00:20 +01:00
parent 8b8c6c014b
commit 23a556f2c5
6 changed files with 37 additions and 72 deletions

View File

@ -588,7 +588,6 @@ LoadDLLfuncEx (IdnToUnicode, 20, kernel32, 1)
LoadDLLfunc (LocaleNameToLCID, 8, kernel32) LoadDLLfunc (LocaleNameToLCID, 8, kernel32)
LoadDLLfuncEx (PrefetchVirtualMemory, 16, kernel32, 1) LoadDLLfuncEx (PrefetchVirtualMemory, 16, kernel32, 1)
LoadDLLfunc (SetThreadGroupAffinity, 12, kernel32) LoadDLLfunc (SetThreadGroupAffinity, 12, kernel32)
LoadDLLfunc (SetThreadStackGuarantee, 4, kernel32)
/* ldap functions are cdecl! */ /* ldap functions are cdecl! */
#pragma push_macro ("mangle") #pragma push_macro ("mangle")

View File

@ -443,11 +443,9 @@ child_info_fork::alloc_stack ()
api_fatal ("fork: couldn't allocate new stack guard page %p, %E", api_fatal ("fork: couldn't allocate new stack guard page %p, %E",
stack_ptr); stack_ptr);
} }
/* On post-XP systems, set thread stack guarantee matching the /* Set thread stack guarantee matching the guardsize.
guardsize. Note that the guardsize is one page bigger than Note that the guardsize is one page bigger than the guarantee. */
the guarantee. */ if (real_guardsize > wincap.def_guard_page_size ())
if (wincap.has_set_thread_stack_guarantee ()
&& real_guardsize > wincap.def_guard_page_size ())
{ {
real_guardsize -= wincap.page_size (); real_guardsize -= wincap.page_size ();
SetThreadStackGuarantee (&real_guardsize); SetThreadStackGuarantee (&real_guardsize);

View File

@ -1581,10 +1581,9 @@ altstack_wrapper (int sig, siginfo_t *siginfo, ucontext_t *sigctx,
/* ...restore guard pages in original stack as if MSVCRT::_resetstkovlw /* ...restore guard pages in original stack as if MSVCRT::_resetstkovlw
has been called. has been called.
Compute size of guard pages. If SetThreadStackGuarantee isn't Compute size of guard pages. If SetThreadStackGuarantee returns 0,
supported, or if it returns 0, use the default guard page size. */ use the default guard page size. */
if (wincap.has_set_thread_stack_guarantee ()) SetThreadStackGuarantee (&guard_size);
SetThreadStackGuarantee (&guard_size);
if (!guard_size) if (!guard_size)
guard_size = wincap.def_guard_page_size (); guard_size = wincap.def_guard_page_size ();
else else

View File

@ -609,10 +609,9 @@ pthread_wrapper (PVOID arg)
The below assembler code will release the OS stack after switching to our The below assembler code will release the OS stack after switching to our
new stack. */ new stack. */
wrapper_arg.stackaddr = dealloc_addr; 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. */ Note that the guardsize is one page bigger than the guarantee. */
if (wincap.has_set_thread_stack_guarantee () if (wrapper_arg.guardsize > wincap.def_guard_page_size ())
&& wrapper_arg.guardsize > wincap.def_guard_page_size ())
{ {
wrapper_arg.guardsize -= wincap.page_size (); wrapper_arg.guardsize -= wincap.page_size ();
SetThreadStackGuarantee (&wrapper_arg.guardsize); SetThreadStackGuarantee (&wrapper_arg.guardsize);
@ -877,59 +876,38 @@ CygwinCreateThread (LPTHREAD_START_ROUTINE thread_func, PVOID thread_arg,
#endif #endif
if (!real_stackaddr) if (!real_stackaddr)
return NULL; return NULL;
/* Set up committed region. We have two cases: */ /* Set up committed region. We set up the stack like the OS does,
if (!wincap.has_set_thread_stack_guarantee () with a reserved region, the guard pages, and a commited region.
&& real_guardsize != wincap.def_guard_page_size ()) 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 PIMAGE_DOS_HEADER dosheader;
size, and if we're running on Windows XP 32 bit, we commit the PIMAGE_NT_HEADERS ntheader;
entire stack, and, if guardsize is > 0, set up a guard page. */
real_stacklimit = (PBYTE) real_stackaddr + wincap.page_size (); dosheader = (PIMAGE_DOS_HEADER) GetModuleHandle (NULL);
if (real_guardsize ntheader = (PIMAGE_NT_HEADERS)
&& !VirtualAlloc (real_stacklimit, real_guardsize, MEM_COMMIT, ((PBYTE) dosheader + dosheader->e_lfanew);
PAGE_READWRITE | PAGE_GUARD)) exe_commitsize = ntheader->OptionalHeader.SizeOfStackCommit;
goto err; exe_commitsize = roundup2 (exe_commitsize, wincap.page_size ());
real_stacklimit += real_guardsize;
if (!VirtualAlloc (real_stacklimit, real_stacksize - real_guardsize
- wincap.page_size (),
MEM_COMMIT, PAGE_READWRITE))
goto err;
} }
else ULONG commitsize = exe_commitsize;
{ if (commitsize > real_stacksize - real_guardsize - wincap.page_size ())
/* Otherwise we set up the stack like the OS does, with a reserved commitsize = real_stacksize - real_guardsize - wincap.page_size ();
region, the guard pages, and a commited region. We commit the else if (commitsize < PTHREAD_STACK_MIN)
stack commit size from the executable header, but at least commitsize = PTHREAD_STACK_MIN;
PTHREAD_STACK_MIN (64K). */ real_stacklimit = (PBYTE) real_stackaddr + real_stacksize
static ULONG exe_commitsize; - 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->stackaddr = (PBYTE) real_stackaddr;
wrapper_arg->stackbase = (PBYTE) real_stackaddr + real_stacksize; wrapper_arg->stackbase = (PBYTE) real_stackaddr + real_stacksize;
wrapper_arg->stacklimit = real_stacklimit; wrapper_arg->stacklimit = real_stacklimit;

View File

@ -29,7 +29,6 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:false, terminate_thread_frees_stack:false,
has_precise_system_time:false, has_precise_system_time:false,
has_microsoft_accounts:false, has_microsoft_accounts:false,
has_set_thread_stack_guarantee:false,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:false, has_processor_groups:false,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -49,7 +48,6 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:false, terminate_thread_frees_stack:false,
has_precise_system_time:false, has_precise_system_time:false,
has_microsoft_accounts:false, has_microsoft_accounts:false,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:true, has_broken_rtl_query_process_debug_information:true,
has_processor_groups:false, has_processor_groups:false,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -69,7 +67,6 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:false, has_precise_system_time:false,
has_microsoft_accounts:false, has_microsoft_accounts:false,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:false, has_processor_groups:false,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -89,7 +86,6 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:false, has_precise_system_time:false,
has_microsoft_accounts:false, has_microsoft_accounts:false,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:true, has_processor_groups:true,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -109,7 +105,6 @@ wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:true, has_precise_system_time:true,
has_microsoft_accounts:true, has_microsoft_accounts:true,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:true, has_processor_groups:true,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -129,7 +124,6 @@ wincaps wincap_10 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:true, has_precise_system_time:true,
has_microsoft_accounts:true, has_microsoft_accounts:true,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:true, has_processor_groups:true,
has_broken_prefetchvm:true, has_broken_prefetchvm:true,
@ -149,7 +143,6 @@ wincaps wincap_10_1511 __attribute__((section (".cygwin_dll_common"), shared)) =
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:true, has_precise_system_time:true,
has_microsoft_accounts:true, has_microsoft_accounts:true,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:true, has_processor_groups:true,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,

View File

@ -22,7 +22,6 @@ struct wincaps
unsigned terminate_thread_frees_stack : 1; unsigned terminate_thread_frees_stack : 1;
unsigned has_precise_system_time : 1; unsigned has_precise_system_time : 1;
unsigned has_microsoft_accounts : 1; unsigned has_microsoft_accounts : 1;
unsigned has_set_thread_stack_guarantee : 1;
unsigned has_broken_rtl_query_process_debug_information : 1; unsigned has_broken_rtl_query_process_debug_information : 1;
unsigned has_processor_groups : 1; unsigned has_processor_groups : 1;
unsigned has_broken_prefetchvm : 1; unsigned has_broken_prefetchvm : 1;
@ -67,7 +66,6 @@ public:
bool IMPLEMENT (terminate_thread_frees_stack) bool IMPLEMENT (terminate_thread_frees_stack)
bool IMPLEMENT (has_precise_system_time) bool IMPLEMENT (has_precise_system_time)
bool IMPLEMENT (has_microsoft_accounts) bool IMPLEMENT (has_microsoft_accounts)
bool IMPLEMENT (has_set_thread_stack_guarantee)
bool IMPLEMENT (has_broken_rtl_query_process_debug_information) bool IMPLEMENT (has_broken_rtl_query_process_debug_information)
bool IMPLEMENT (has_processor_groups) bool IMPLEMENT (has_processor_groups)
bool IMPLEMENT (has_broken_prefetchvm) bool IMPLEMENT (has_broken_prefetchvm)