* 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> 2006-04-03 Corinna Vinschen <corinna@vinschen.de>
* spawn.cc (linebuf::finish): Drop argument. Don't check command line * 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) #define EXEC_MAGIC_SIZE sizeof(child_info)
/* Change this value if you get a message indicating that it is out-of-sync. */ /* 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 /* NOTE: Do not make gratuitous changes to the names or organization of the
below class. The layout is checksummed to determine compatibility between below class. The layout is checksummed to determine compatibility between
@ -84,6 +84,8 @@ public:
child_info_fork (); child_info_fork ();
void handle_fork () __attribute__ ((regparm (1)));; void handle_fork () __attribute__ ((regparm (1)));;
bool handle_failure (DWORD) __attribute__ ((regparm (2))); bool handle_failure (DWORD) __attribute__ ((regparm (2)));
void alloc_stack ();
void alloc_stack_hard_way (volatile char *);
}; };
class fhandler_base; class fhandler_base;

View File

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