* child_info.h (CURR_CHILD_INFO_MAGIC): Update.

(child_info_fork::alloc_stack): Move into this class.
(child_info_fork::alloc_stack_hard_way): Ditto.
* dcrt0.cc (child_info_fork::alloc_stack): Ditto.
(child_info_fork::alloc_stack_hard_way): Ditto.
(_dll_crt0): Reference alloc_stack via fork_info.
This commit is contained in:
Christopher Faylor 2006-04-03 17:33:07 +00:00
parent 45bdcc689a
commit 9dbb0bc355
3 changed files with 31 additions and 21 deletions

View File

@ -1,3 +1,12 @@
2006-04-03 Christopher Faylor <cgf@timesys.com>
* child_info.h (CURR_CHILD_INFO_MAGIC): Update.
(child_info_fork::alloc_stack): Move into this class.
(child_info_fork::alloc_stack_hard_way): Ditto.
* dcrt0.cc (child_info_fork::alloc_stack): Ditto.
(child_info_fork::alloc_stack_hard_way): Ditto.
(_dll_crt0): Reference alloc_stack via fork_info.
2006-04-03 Corinna Vinschen <corinna@vinschen.de>
* spawn.cc (linebuf::finish): Drop argument. Don't check command line

View File

@ -36,7 +36,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 0x1630848cU
#define CURR_CHILD_INFO_MAGIC 0x110015eaU
/* NOTE: Do not make gratuitous changes to the names or organization of the
below class. The layout is checksummed to determine compatibility between
@ -84,6 +84,8 @@ public:
child_info_fork ();
void handle_fork () __attribute__ ((regparm (1)));;
bool handle_failure (DWORD) __attribute__ ((regparm (2)));
void alloc_stack ();
void alloc_stack_hard_way (volatile char *);
};
class fhandler_base;

View File

@ -456,8 +456,8 @@ child_info NO_COPY *child_proc_info = NULL;
#define CYGWIN_GUARD ((wincap.has_page_guard ()) ? \
PAGE_EXECUTE_READWRITE|PAGE_GUARD : PAGE_NOACCESS)
static void
alloc_stack_hard_way (child_info_fork *ci, volatile char *b)
void
child_info_fork::alloc_stack_hard_way (volatile char *b)
{
void *new_stack_pointer;
MEMORY_BASIC_INFORMATION m;
@ -470,28 +470,27 @@ alloc_stack_hard_way (child_info_fork *ci, volatile char *b)
LPBYTE curbot = (LPBYTE) m.BaseAddress + m.RegionSize;
if (ci->stacktop > (LPBYTE) m.AllocationBase && ci->stacktop < curbot)
if (stacktop > (LPBYTE) m.AllocationBase && stacktop < curbot)
{
newbase = curbot;
newlen = (LPBYTE) ci->stackbottom - (LPBYTE) curbot;
newlen = (LPBYTE) stackbottom - (LPBYTE) curbot;
noguard = 1;
}
else
{
newbase = ci->stacktop;
newlen = (DWORD) ci->stackbottom - (DWORD) ci->stacktop;
newbase = stacktop;
newlen = (DWORD) stackbottom - (DWORD) stacktop;
noguard = 0;
}
if (!VirtualAlloc (newbase, newlen, MEM_RESERVE, PAGE_NOACCESS))
api_fatal ("fork: can't reserve memory for stack %p - %p, %E",
ci->stacktop, ci->stackbottom);
stacktop, stackbottom);
new_stack_pointer = (void *) ((LPBYTE) ci->stackbottom - ci->stacksize);
if (!VirtualAlloc (new_stack_pointer, ci->stacksize, MEM_COMMIT,
new_stack_pointer = (void *) ((LPBYTE) stackbottom - stacksize);
if (!VirtualAlloc (new_stack_pointer, stacksize, MEM_COMMIT,
PAGE_EXECUTE_READWRITE))
api_fatal ("fork: can't commit memory for stack %p(%d), %E",
new_stack_pointer, ci->stacksize);
new_stack_pointer, stacksize);
if (!VirtualQuery ((LPCVOID) new_stack_pointer, &m, sizeof m))
api_fatal ("fork: couldn't get new stack info, %E");
if (!noguard)
@ -504,7 +503,7 @@ alloc_stack_hard_way (child_info_fork *ci, volatile char *b)
}
if (!VirtualQuery ((LPCVOID) m.BaseAddress, &m, sizeof m))
api_fatal ("fork: couldn't get new stack info, %E");
ci->stacktop = m.BaseAddress;
stacktop = m.BaseAddress;
b[0] = '\0';
}
@ -519,19 +518,19 @@ getstack (volatile char * volatile p)
/* extend the stack prior to fork longjmp */
static void
alloc_stack (child_info_fork *ci)
void
child_info_fork::alloc_stack ()
{
volatile char * volatile esp;
__asm__ volatile ("movl %%esp,%0": "=r" (esp));
if (_tlsbase != ci->stackbottom)
alloc_stack_hard_way (ci, esp);
if (_tlsbase != stackbottom)
alloc_stack_hard_way (esp);
else
{
char *stacktop = (char *) ci->stacktop - 4096;
while (_tlstop >= stacktop)
char *st = (char *) stacktop - 4096;
while (_tlstop >= st)
esp = getstack (esp);
ci->stacksize = 0;
stacksize = 0;
}
}
@ -978,7 +977,7 @@ _dll_crt0 ()
char padding[CYGTLS_PADSIZE];
if (in_forkee)
alloc_stack (fork_info);
fork_info->alloc_stack ();
else
__sinit (_impure_ptr);