diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c74d1ba60..cffd7c2ca 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2015-12-02 Corinna Vinschen + + * child_info.h (CURR_CHILD_INFO_MAGIC): Align to below change. + (class child_info_fork): Rename stacktop to stacklimit. Rename + stackbottom to stackbase. Accommodate name change throughout Cygwin. + Rephrase comments to be clearer. + 2015-12-02 Corinna Vinschen * cygtls.h (_tlsbase): Remove. Replace throughout with diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h index 7d8d0b818..1ec612788 100644 --- a/winsup/cygwin/child_info.h +++ b/winsup/cygwin/child_info.h @@ -39,7 +39,7 @@ enum child_status #define EXEC_MAGIC_SIZE sizeof(child_info) /* Change this value if you get a message indicating that it is out-of-sync. */ -#define CURR_CHILD_INFO_MAGIC 0x4a91a908U +#define CURR_CHILD_INFO_MAGIC 0xc96f5e9U #define NPROCS 256 @@ -103,9 +103,10 @@ class child_info_fork: public child_info public: HANDLE forker_finished;// for synchronization with child jmp_buf jmp; // where child will jump to - void *stackaddr; // address of parent stack - void *stacktop; // location of top of parent stack - void *stackbottom; // location of bottom of parent stack + void *stackaddr; // DeallocationStack or user-provided allocation address + // of parent thread + void *stacklimit; // StackLimit of parent thread + void *stackbase; // StackBase of parent thread size_t guardsize; // size of POSIX guard region or (size_t) -1 if // user stack char filler[4]; diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 7ec0ba3bf..de95121c7 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -412,15 +412,15 @@ child_info_fork::alloc_stack () /* Make sure not to try a hard allocation if we have been forked off from the main thread of a Cygwin process which has been started from a 64 bit parent. In that case the StackBase of the forked child is not the same - as the StackBase of the parent (== stackbottom), but only because the + as the StackBase of the parent (== this.stackbase), but only because the stack of the parent has been slightly rearranged. See comment in wow64_revert_to_original_stack for details. We check here if the parent stack fits into the child stack. */ PTEB teb = NtCurrentTeb (); - if (teb->Tib.StackBase != stackbottom + if (teb->Tib.StackBase != stackbase && (!wincap.is_wow64 () - || stacktop < teb->DeallocationStack - || stackbottom > teb->Tib.StackBase)) + || stacklimit < teb->DeallocationStack + || stackbase > teb->Tib.StackBase)) { void *stack_ptr; size_t stacksize; @@ -430,21 +430,21 @@ child_info_fork::alloc_stack () if (guardsize == (size_t) -1) return; /* Reserve entire stack. */ - stacksize = (PBYTE) stackbottom - (PBYTE) stackaddr; + stacksize = (PBYTE) stackbase - (PBYTE) stackaddr; if (!VirtualAlloc (stackaddr, stacksize, MEM_RESERVE, PAGE_NOACCESS)) { api_fatal ("fork: can't reserve memory for parent stack " "%p - %p, (child has %p - %p), %E", - stackaddr, stackbottom, teb->DeallocationStack, + stackaddr, stackbase, teb->DeallocationStack, teb->Tib.StackBase); } /* Commit the area commited in parent. */ - stacksize = (PBYTE) stackbottom - (PBYTE) stacktop; - stack_ptr = VirtualAlloc (stacktop, stacksize, MEM_COMMIT, + stacksize = (PBYTE) stackbase - (PBYTE) stacklimit; + stack_ptr = VirtualAlloc (stacklimit, stacksize, MEM_COMMIT, PAGE_READWRITE); if (!stack_ptr) api_fatal ("can't commit memory for stack %p(%ly), %E", - stacktop, stacksize); + stacklimit, stacksize); /* Set up guardpages. */ ULONG real_guardsize = guardsize ? roundup2 (guardsize, wincap.page_size ()) @@ -472,26 +472,26 @@ child_info_fork::alloc_stack () /* Fork has been called from main thread. Simply commit the region of the stack commited in the parent but not yet commited in the child and create new guardpages. */ - if (NtCurrentTeb()->Tib.StackLimit > stacktop) + if (NtCurrentTeb()->Tib.StackLimit > stacklimit) { SIZE_T commitsize = (PBYTE) NtCurrentTeb()->Tib.StackLimit - - (PBYTE) stacktop; - if (!VirtualAlloc (stacktop, commitsize, MEM_COMMIT, PAGE_READWRITE)) + - (PBYTE) stacklimit; + if (!VirtualAlloc (stacklimit, commitsize, MEM_COMMIT, PAGE_READWRITE)) api_fatal ("can't commit child memory for stack %p(%ly), %E", - stacktop, commitsize); - PVOID guardpage = (PBYTE) stacktop - wincap.def_guard_page_size (); + stacklimit, commitsize); + PVOID guardpage = (PBYTE) stacklimit - wincap.def_guard_page_size (); if (!VirtualAlloc (guardpage, wincap.def_guard_page_size (), MEM_COMMIT, PAGE_READWRITE | PAGE_GUARD)) api_fatal ("fork: couldn't allocate new stack guard page %p, %E", guardpage); - NtCurrentTeb()->Tib.StackLimit = stacktop; + NtCurrentTeb()->Tib.StackLimit = stacklimit; } stackaddr = 0; /* This only affects forked children of a process started from a native 64 bit process, but it doesn't hurt to do it unconditionally. Fix StackBase in the child to be the same as in the parent, so that the computation of _my_tls is correct. */ - teb->Tib.StackBase = (PVOID) stackbottom; + teb->Tib.StackBase = (PVOID) stackbase; } } @@ -920,8 +920,8 @@ dll_crt0_1 (void *) this step. */ if (fork_info->stackaddr) { - NtCurrentTeb()->Tib.StackBase = (PVOID) fork_info->stackbottom; - NtCurrentTeb()->Tib.StackLimit = (PVOID) fork_info->stacktop; + NtCurrentTeb()->Tib.StackBase = (PVOID) fork_info->stackbase; + NtCurrentTeb()->Tib.StackLimit = (PVOID) fork_info->stacklimit; } /* Not resetting _my_tls.incyg here because presumably fork will overwrite diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 78ae932d3..d4a973eb2 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -307,7 +307,7 @@ frok::parent (volatile char * volatile stack_here) ch.forker_finished = forker_finished; - ch.stackbottom = NtCurrentTeb()->Tib.StackBase; + ch.stackbase = NtCurrentTeb()->Tib.StackBase; ch.stackaddr = NtCurrentTeb ()->DeallocationStack; if (!ch.stackaddr) { @@ -315,25 +315,25 @@ frok::parent (volatile char * volatile stack_here) stack. If so, the entire stack is committed anyway and StackLimit points to the allocation address of the stack. Mark in guardsize that we must not set up guard pages. */ - ch.stackaddr = ch.stacktop = NtCurrentTeb()->Tib.StackLimit; + ch.stackaddr = ch.stacklimit = NtCurrentTeb()->Tib.StackLimit; ch.guardsize = (size_t) -1; } else { /* Otherwise we're running on a system-allocated stack. Since stack_here is the address of the stack pointer we start the child with anyway, we - can set ch.stacktop to this value rounded down to page size. The + can set ch.stacklimit to this value rounded down to page size. The child will not need the rest of the stack anyway. Guardsize depends on whether we're running on a pthread or not. If pthread, we fetch the guardpage size from the pthread attribs, otherwise we use the system default. */ - ch.stacktop = (void *) ((uintptr_t) stack_here & ~wincap.page_size ()); + ch.stacklimit = (void *) ((uintptr_t) stack_here & ~wincap.page_size ()); ch.guardsize = (&_my_tls != _main_tls && _my_tls.tid) ? _my_tls.tid->attr.guardsize : wincap.def_guard_page_size (); } debug_printf ("stack - bottom %p, top %p, addr %p, guardsize %ly", - ch.stackbottom, ch.stacktop, ch.stackaddr, ch.guardsize); + ch.stackbase, ch.stacklimit, ch.stackaddr, ch.guardsize); PROCESS_INFORMATION pi; STARTUPINFOW si; @@ -475,7 +475,7 @@ frok::parent (volatile char * volatile stack_here) impure_end = _impure_ptr + 1; } rc = child_copy (hchild, true, - "stack", stack_here, ch.stackbottom, + "stack", stack_here, ch.stackbase, impure, impure_beg, impure_end, NULL);