* dcrt0.cc (_dll_crt0): Rephrase comments. Set $ebp to NULL, as in

the pthread stack setup.
	* wow64.cc (wow64_revert_to_original_stack): Rephrase some comments.
	Return _tlsbase-16 rather than _main_tls-4 so as not to waste stack.
This commit is contained in:
Corinna Vinschen 2011-12-21 17:19:48 +00:00
parent 40fb18380b
commit f500a700b1
3 changed files with 20 additions and 9 deletions

View File

@ -1,3 +1,10 @@
2011-12-11 Corinna Vinschen <vinschen@redhat.com>
* dcrt0.cc (_dll_crt0): Rephrase comments. Set $ebp to NULL, as in
the pthread stack setup.
* wow64.cc (wow64_revert_to_original_stack): Rephrase some comments.
Return _tlsbase-16 rather than _main_tls-4 so as not to waste stack.
2011-12-19 Corinna Vinschen <vinschen@redhat.com> 2011-12-19 Corinna Vinschen <vinschen@redhat.com>
* syscalls.cc (rename): Fix typo in comment. Fix condition to handle * syscalls.cc (rename): Fix typo in comment. Fix condition to handle

View File

@ -951,19 +951,21 @@ _dll_crt0 ()
description. */ description. */
if (wow64_needs_stack_adjustment && !dynamically_loaded) if (wow64_needs_stack_adjustment && !dynamically_loaded)
{ {
/* Must be static since it's referenced after the stack pointers have /* Must be static since it's referenced after the stack and frame
been moved. */ pointer registers have been changed. */
static PVOID allocationbase = 0; static PVOID allocationbase = 0;
/* Check if we just move the stack. See comment in /* Check if we just move the stack. If so, wow64_revert_to_original_stack
returns a non-NULL, 16 byte aligned address. See comments in
wow64_revert_to_original_stack for the gory details. */ wow64_revert_to_original_stack for the gory details. */
PVOID stackaddr = wow64_revert_to_original_stack (allocationbase); PVOID stackaddr = wow64_revert_to_original_stack (allocationbase);
if (stackaddr) if (stackaddr)
{ {
/* 2nd half of the stack move. Set stack pointers to new address. */ /* 2nd half of the stack move. Set stack pointer to new address.
Set frame pointer to 0. */
__asm__ ("\n\ __asm__ ("\n\
movl %[ADDR], %%esp \n\ movl %[ADDR], %%esp \n\
movl %%esp, %%ebp \n" xorl %%ebp, %%ebp \n"
: : [ADDR] "r" (stackaddr)); : : [ADDR] "r" (stackaddr));
/* Now we're back on the original stack. Free up space taken by the /* Now we're back on the original stack. Free up space taken by the
former main thread stack and set DeallocationStack correctly. */ former main thread stack and set DeallocationStack correctly. */

View File

@ -128,7 +128,8 @@ wow64_revert_to_original_stack (PVOID &allocationbase)
/* Next we expect a guard page. We fetch the size of the guard area to /* Next we expect a guard page. We fetch the size of the guard area to
see how big it is. Apparently the guard area on 64 bit systems spans see how big it is. Apparently the guard area on 64 bit systems spans
2 pages. */ 2 pages, only for the main thread for some reason. We better keep it
that way. */
PVOID addr = PTR_ADD (mbi.BaseAddress, mbi.RegionSize); PVOID addr = PTR_ADD (mbi.BaseAddress, mbi.RegionSize);
VirtualQuery (addr, &mbi, sizeof mbi); VirtualQuery (addr, &mbi, sizeof mbi);
if (mbi.AllocationBase != allocationbase if (mbi.AllocationBase != allocationbase
@ -163,12 +164,13 @@ wow64_revert_to_original_stack (PVOID &allocationbase)
/* We're going to reuse the original stack. Yay, no more respawn! /* We're going to reuse the original stack. Yay, no more respawn!
Set the StackBase and StackLimit values in the TEB, set _main_tls Set the StackBase and StackLimit values in the TEB, set _main_tls
accordingly, and return the new address for the stack pointer. accordingly, and return the new, 16 byte aligned address for the
The second half of the stack move is done by the caller _dll_crt0. */ stack pointer. The second half of the stack move is done by the
caller _dll_crt0. */
_tlsbase = (char *) newbase; _tlsbase = (char *) newbase;
_tlstop = (char *) newtop; _tlstop = (char *) newtop;
_main_tls = &_my_tls; _main_tls = &_my_tls;
return PTR_ADD (_main_tls, -4); return PTR_ADD (_tlsbase, -16);
} }
/* Respawn WOW64 process. This is only called if we can't reuse the original /* Respawn WOW64 process. This is only called if we can't reuse the original