* 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:
parent
40fb18380b
commit
f500a700b1
@ -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
|
||||||
|
@ -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. */
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user