Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2011-12-19 16:50:35 +0400
committerCorinna Vinschen <corinna@vinschen.de>2011-12-19 16:50:35 +0400
commitf08bc8585833ed7d21208d9dbd0b49482470d0ee (patch)
treed011a999c5f64f4032491d8fbb740c9b634d4883
parent93a61a6fe3fbdabe7c4223931309be5954702500 (diff)
* dcrt0.cc (dll_crt0_0): Check for wincap.wow64_has_secondary_stack
rather than for wincap.is_wow64. Accommodate name change from wow64_has_64bit_parent to wow64_needs_stack_adjustment. Align comment. (_dll_crt0): Ditto. * wincap.h (wincaps::wow64_has_secondary_stack): New element. * wincap.cc: Implement above element throughout. (wincapc::init): Set wow64_has_secondary_stack to false on non-64 bit systems. * wow64.cc (wow64_needs_stack_adjustment): Rename (hopefully the last time) from wow64_has_64bit_parent. (wow64_eval_expected_main_stack): Fix comment to reflect real life. (wow64_test_for_64bit_parent): Fix comment. * wow64.h (wow64_needs_stack_adjustment): Accommodate new name.
-rw-r--r--winsup/cygwin/ChangeLog16
-rw-r--r--winsup/cygwin/dcrt0.cc18
-rw-r--r--winsup/cygwin/wincap.cc9
-rw-r--r--winsup/cygwin/wincap.h2
-rw-r--r--winsup/cygwin/wow64.cc23
-rw-r--r--winsup/cygwin/wow64.h2
6 files changed, 53 insertions, 17 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 526ff122c..85a8a9633 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,19 @@
+2011-12-19 Corinna Vinschen <vinschen@redhat.com>
+
+ * dcrt0.cc (dll_crt0_0): Check for wincap.wow64_has_secondary_stack
+ rather than for wincap.is_wow64. Accommodate name change from
+ wow64_has_64bit_parent to wow64_needs_stack_adjustment. Align comment.
+ (_dll_crt0): Ditto.
+ * wincap.h (wincaps::wow64_has_secondary_stack): New element.
+ * wincap.cc: Implement above element throughout.
+ (wincapc::init): Set wow64_has_secondary_stack to false on non-64 bit
+ systems.
+ * wow64.cc (wow64_needs_stack_adjustment): Rename (hopefully the last
+ time) from wow64_has_64bit_parent.
+ (wow64_eval_expected_main_stack): Fix comment to reflect real life.
+ (wow64_test_for_64bit_parent): Fix comment.
+ * wow64.h (wow64_needs_stack_adjustment): Accommodate new name.
+
2011-12-17 Christopher Faylor <me.cygwin2011@cgf.cx>
* fhandler.cc (fhandler_base::close): Move setting isclosed() from here
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index f74c25c09..8d5017715 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -705,11 +705,12 @@ dll_crt0_0 ()
if (!child_proc_info)
{
memory_init (true);
- /* WOW64 process? Check if we have been started from 64 bit process
- and if our stack is at an unusual address. Set wow64_has_64bit_parent
- if so. Problem description in wow64_test_for_64bit_parent. */
- if (wincap.is_wow64 ())
- wow64_has_64bit_parent = wow64_test_for_64bit_parent ();
+ /* WOW64 process on XP/64 or Server 2003/64? Check if we have been
+ started from 64 bit process and if our stack is at an unusual
+ address. Set wow64_needs_stack_adjustment if so. Problem
+ description in wow64_test_for_64bit_parent. */
+ if (wincap.wow64_has_secondary_stack ())
+ wow64_needs_stack_adjustment = wow64_test_for_64bit_parent ();
}
else
{
@@ -945,9 +946,10 @@ __cygwin_exit_return: \n\
extern "C" void __stdcall
_dll_crt0 ()
{
- /* Handle WOW64 process started from native 64 bit process. See comment
- in wow64_test_for_64bit_parent for a full problem description. */
- if (wow64_has_64bit_parent && !dynamically_loaded)
+ /* Handle WOW64 process on XP/2K3 which has been started from native 64 bit
+ process. See comment in wow64_test_for_64bit_parent for a full problem
+ description. */
+ if (wow64_needs_stack_adjustment && !dynamically_loaded)
{
/* Must be static since it's referenced after the stack pointers have
been moved. */
diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc
index 338350f72..3272d8948 100644
--- a/winsup/cygwin/wincap.cc
+++ b/winsup/cygwin/wincap.cc
@@ -52,6 +52,7 @@ wincaps wincap_2000 __attribute__((section (".cygwin_dll_common"), shared)) = {
use_dont_resolve_hack:false,
has_stack_size_param_is_a_reservation:false,
has_console_logon_sid:false,
+ wow64_has_secondary_stack:false,
};
wincaps wincap_2000sp4 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -83,6 +84,7 @@ wincaps wincap_2000sp4 __attribute__((section (".cygwin_dll_common"), shared)) =
use_dont_resolve_hack:false,
has_stack_size_param_is_a_reservation:false,
has_console_logon_sid:false,
+ wow64_has_secondary_stack:false,
};
wincaps wincap_xp __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -114,6 +116,7 @@ wincaps wincap_xp __attribute__((section (".cygwin_dll_common"), shared)) = {
use_dont_resolve_hack:true,
has_stack_size_param_is_a_reservation:true,
has_console_logon_sid:false,
+ wow64_has_secondary_stack:false,
};
wincaps wincap_xpsp1 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -145,6 +148,7 @@ wincaps wincap_xpsp1 __attribute__((section (".cygwin_dll_common"), shared)) = {
use_dont_resolve_hack:true,
has_stack_size_param_is_a_reservation:true,
has_console_logon_sid:false,
+ wow64_has_secondary_stack:false,
};
wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -176,6 +180,7 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = {
use_dont_resolve_hack:true,
has_stack_size_param_is_a_reservation:true,
has_console_logon_sid:false,
+ wow64_has_secondary_stack:false,
};
wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -207,6 +212,7 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
use_dont_resolve_hack:true,
has_stack_size_param_is_a_reservation:true,
has_console_logon_sid:false,
+ wow64_has_secondary_stack:true,
};
wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -238,6 +244,7 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = {
use_dont_resolve_hack:false,
has_stack_size_param_is_a_reservation:true,
has_console_logon_sid:false,
+ wow64_has_secondary_stack:false,
};
wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -269,6 +276,7 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
use_dont_resolve_hack:false,
has_stack_size_param_is_a_reservation:true,
has_console_logon_sid:true,
+ wow64_has_secondary_stack:false,
};
wincapc wincap __attribute__((section (".cygwin_dll_common"), shared));
@@ -356,6 +364,7 @@ wincapc::init ()
{
((wincaps *)caps)->needs_count_in_si_lpres2 = false;
((wincaps *)caps)->has_restricted_stack_args = false;
+ ((wincaps *)caps)->wow64_has_secondary_stack = false;
}
__small_sprintf (osnam, "NT-%d.%d", version.dwMajorVersion,
diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h
index 32f958686..5ea915b47 100644
--- a/winsup/cygwin/wincap.h
+++ b/winsup/cygwin/wincap.h
@@ -42,6 +42,7 @@ struct wincaps
unsigned use_dont_resolve_hack : 1;
unsigned has_stack_size_param_is_a_reservation : 1;
unsigned has_console_logon_sid : 1;
+ unsigned wow64_has_secondary_stack : 1;
};
class wincapc
@@ -92,6 +93,7 @@ public:
bool IMPLEMENT (use_dont_resolve_hack)
bool IMPLEMENT (has_stack_size_param_is_a_reservation)
bool IMPLEMENT (has_console_logon_sid)
+ bool IMPLEMENT (wow64_has_secondary_stack)
#undef IMPLEMENT
};
diff --git a/winsup/cygwin/wow64.cc b/winsup/cygwin/wow64.cc
index 1f5ca6310..342b7edbf 100644
--- a/winsup/cygwin/wow64.cc
+++ b/winsup/cygwin/wow64.cc
@@ -15,7 +15,7 @@ details. */
#define PTR_ADD(p,o) ((PVOID)((PBYTE)(p)+(o)))
-bool NO_COPY wow64_has_64bit_parent = false;
+bool NO_COPY wow64_needs_stack_adjustment = false;
static void
wow64_eval_expected_main_stack (PVOID &allocbase, PVOID &stackbase)
@@ -27,10 +27,17 @@ wow64_eval_expected_main_stack (PVOID &allocbase, PVOID &stackbase)
dosheader = (PIMAGE_DOS_HEADER) GetModuleHandle (NULL);
ntheader = (PIMAGE_NT_HEADERS32) ((PBYTE) dosheader + dosheader->e_lfanew);
/* The main thread stack is expected to be located at 0x30000, which is the
- case for all observed NT systems to date, unless the stacksize requested
- by the StackReserve field in the PE/COFF header is so big that the stack
- doesn't fit in the area between 0x30000 and the start of the image. In
- case of a conflict, the OS allocates the stack right after the image. */
+ case for all observed NT systems up to Server 2003 R2, unless the
+ stacksize requested by the StackReserve field in the PE/COFF header is
+ so big that the stack doesn't fit in the area between 0x30000 and the
+ start of the image. In case of a conflict, the OS allocates the stack
+ right after the image.
+ Sidenote: While post-2K3 32 bit systems continue to have the default
+ main thread stack address located at 0x30000, the default main thread
+ stack address on Vista/2008 64 bit is 0x80000 and on W7/2K8R2 64 bit
+ it is 0x90000. However, this is no problem because the system sticks
+ to that address for all WOW64 processes, not only for the first one
+ started from a 64 bit parent. */
allocbase = (PVOID) 0x30000;
/* Stack size. The OS always rounds the size up to allocation granularity
and it never allocates less than 256K. */
@@ -62,9 +69,9 @@ wow64_test_for_64bit_parent ()
else in the child process.
What we do here is to check if the current stack is the excpected main
thread stack and if not, if we really have been started from a 64 bit
- process here. If so, we note this fact in wow64_has_64bit_parent so we
- can workaround the stack problem in _dll_crt0. See there for how we go
- along. */
+ process here. If so, we note this fact in wow64_needs_stack_adjustment
+ so we can workaround the stack problem in _dll_crt0. See there for how
+ we go along. */
NTSTATUS ret;
PROCESS_BASIC_INFORMATION pbi;
HANDLE parent;
diff --git a/winsup/cygwin/wow64.h b/winsup/cygwin/wow64.h
index 189440950..d82293e69 100644
--- a/winsup/cygwin/wow64.h
+++ b/winsup/cygwin/wow64.h
@@ -8,7 +8,7 @@ This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
-extern bool NO_COPY wow64_has_64bit_parent;
+extern bool NO_COPY wow64_needs_stack_adjustment;
extern bool wow64_test_for_64bit_parent ();
extern PVOID wow64_revert_to_original_stack (PVOID &allocationbase);