Skip to content
Snippets Groups Projects
Commit 3ee55ba5 authored by Raymond Toy's avatar Raymond Toy
Browse files

Let the OS mmap the binding and control stacks wherever.

parent b8654321
No related branches found
No related tags found
No related merge requests found
...@@ -385,8 +385,8 @@ valid_addr(os_vm_address_t addr) ...@@ -385,8 +385,8 @@ valid_addr(os_vm_address_t addr)
|| in_range_p(addr, STATIC_SPACE_START, static_space_size) || in_range_p(addr, STATIC_SPACE_START, static_space_size)
|| in_range_p(addr, DYNAMIC_0_SPACE_START, dynamic_space_size) || in_range_p(addr, DYNAMIC_0_SPACE_START, dynamic_space_size)
|| in_range_p(addr, DYNAMIC_1_SPACE_START, dynamic_space_size) || in_range_p(addr, DYNAMIC_1_SPACE_START, dynamic_space_size)
|| in_range_p(addr, CONTROL_STACK_START, control_stack_size) || in_range_p(addr, control_stack, control_stack_size)
|| in_range_p(addr, BINDING_STACK_START, binding_stack_size)) || in_range_p(addr, binding_stack, binding_stack_size))
return TRUE; return TRUE;
return FALSE; return FALSE;
} }
......
...@@ -29,6 +29,7 @@ unsigned dynamic_space_size; ...@@ -29,6 +29,7 @@ unsigned dynamic_space_size;
lispobj *control_stack; lispobj *control_stack;
lispobj *control_stack_start;
#if (defined(i386) || defined(__x86_64)) #if (defined(i386) || defined(__x86_64))
lispobj *control_stack_end; lispobj *control_stack_end;
#endif #endif
......
...@@ -37,6 +37,8 @@ extern unsigned long binding_stack_size; ...@@ -37,6 +37,8 @@ extern unsigned long binding_stack_size;
extern unsigned long static_space_size; extern unsigned long static_space_size;
extern unsigned long control_stack_size; extern unsigned long control_stack_size;
extern lispobj *control_stack_start;
#if (defined(i386) || defined(__x86_64)) #if (defined(i386) || defined(__x86_64))
extern lispobj *control_stack_end; extern lispobj *control_stack_end;
#endif #endif
......
...@@ -676,6 +676,7 @@ main(int argc, const char *argv[], const char *envp[]) ...@@ -676,6 +676,7 @@ main(int argc, const char *argv[], const char *envp[])
#endif #endif
validate(); validate();
gc_init(); gc_init();
validate_stacks();
/* This is the first use of malloc() and must come after the /* This is the first use of malloc() and must come after the
* static memory layout is mmapped to avoid conflicts with possible * static memory layout is mmapped to avoid conflicts with possible
......
...@@ -413,7 +413,7 @@ guard_zones(char **yellow_start, char **red_start) ...@@ -413,7 +413,7 @@ guard_zones(char **yellow_start, char **red_start)
/* /*
* All x86's have a control stack (aka C stack) that grows down. * All x86's have a control stack (aka C stack) that grows down.
*/ */
char *end = (char *) CONTROL_STACK_START; char *end = (char *) control_stack;
*red_start = end; *red_start = end;
*yellow_start = *red_start + RED_ZONE_SIZE; *yellow_start = *red_start + RED_ZONE_SIZE;
...@@ -424,7 +424,7 @@ guard_zones(char **yellow_start, char **red_start) ...@@ -424,7 +424,7 @@ guard_zones(char **yellow_start, char **red_start)
* control stack area. * control stack area.
*/ */
char *end = (char *) CONTROL_STACK_START + control_stack_size; char *end = (char *) control_stack_start + control_stack_size;
*red_start = end - RED_ZONE_SIZE; *red_start = end - RED_ZONE_SIZE;
*yellow_start = *red_start - YELLOW_ZONE_SIZE; *yellow_start = *red_start - YELLOW_ZONE_SIZE;
......
...@@ -136,7 +136,11 @@ save(char *filename, lispobj init_function, int sse2_mode) ...@@ -136,7 +136,11 @@ save(char *filename, lispobj init_function, int sse2_mode)
} }
printf("[Undoing binding stack... "); printf("[Undoing binding stack... ");
fflush(stdout); fflush(stdout);
#if 0
unbind_to_here((lispobj *) BINDING_STACK_START); unbind_to_here((lispobj *) BINDING_STACK_START);
#else
unbind_to_here((lispobj *) binding_stack);
#endif
SetSymbolValue(CURRENT_CATCH_BLOCK, 0); SetSymbolValue(CURRENT_CATCH_BLOCK, 0);
SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0); SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0);
SetSymbolValue(EVAL_STACK_TOP, 0); SetSymbolValue(EVAL_STACK_TOP, 0);
...@@ -277,7 +281,11 @@ save_executable(char *filename, lispobj init_function) ...@@ -277,7 +281,11 @@ save_executable(char *filename, lispobj init_function)
printf("[Undoing binding stack... "); printf("[Undoing binding stack... ");
fflush(stdout); fflush(stdout);
#if 0
unbind_to_here((lispobj *)BINDING_STACK_START); unbind_to_here((lispobj *)BINDING_STACK_START);
#else
unbind_to_here((lispobj *)binding_stack);
#endif
SetSymbolValue(CURRENT_CATCH_BLOCK, 0); SetSymbolValue(CURRENT_CATCH_BLOCK, 0);
SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0); SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0);
SetSymbolValue(EVAL_STACK_TOP, 0); SetSymbolValue(EVAL_STACK_TOP, 0);
......
...@@ -92,20 +92,10 @@ validate(void) ...@@ -92,20 +92,10 @@ validate(void)
*/ */
#endif #endif
/* Control Stack */
control_stack = (lispobj *) CONTROL_STACK_START;
#if (defined(i386) || defined(__x86_64))
control_stack_end = (lispobj *) (CONTROL_STACK_START + control_stack_size);
#endif
ensure_space(control_stack, control_stack_size);
#ifdef SIGNAL_STACK_START #ifdef SIGNAL_STACK_START
ensure_space((lispobj *) SIGNAL_STACK_START, SIGNAL_STACK_SIZE); ensure_space((lispobj *) SIGNAL_STACK_START, SIGNAL_STACK_SIZE);
#endif #endif
/* Binding Stack */
binding_stack = (lispobj *) BINDING_STACK_START;
ensure_space(binding_stack, binding_stack_size);
#ifdef LINKAGE_TABLE #ifdef LINKAGE_TABLE
ensure_space((lispobj *) FOREIGN_LINKAGE_SPACE_START, ensure_space((lispobj *) FOREIGN_LINKAGE_SPACE_START,
FOREIGN_LINKAGE_SPACE_SIZE); FOREIGN_LINKAGE_SPACE_SIZE);
...@@ -118,6 +108,22 @@ validate(void) ...@@ -118,6 +108,22 @@ validate(void)
printf(" done.\n"); printf(" done.\n");
#endif #endif
}
void
validate_stacks()
{
/* Control Stack */
/* Map the conrol stack wherever we have space */
control_stack = os_validate(NULL, control_stack_size);
#if (defined(i386) || defined(__x86_64))
control_stack_end = (void*)control_stack + control_stack_size;
#endif
/* Binding Stack */
binding_stack = os_validate(NULL, binding_stack_size);
#ifdef RED_ZONE_HIT #ifdef RED_ZONE_HIT
os_guard_control_stack(0, 1); os_guard_control_stack(0, 1);
#endif #endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment