* 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:
parent
45bdcc689a
commit
9dbb0bc355
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user