diff --git a/src/lisp/Linux-os.c b/src/lisp/Linux-os.c index 7f7a4d7acd350c1ef5b443ef5a28cf848c2e368f..b56354859660ea3a42b8b73e451f2ed5a6f8c546 100644 --- a/src/lisp/Linux-os.c +++ b/src/lisp/Linux-os.c @@ -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, DYNAMIC_0_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, BINDING_STACK_START, binding_stack_size)) + || in_range_p(addr, control_stack, control_stack_size) + || in_range_p(addr, binding_stack, binding_stack_size)) return TRUE; return FALSE; } diff --git a/src/lisp/globals.c b/src/lisp/globals.c index 18b4556c83491b2d799647c4a73f40ad4781d41e..3d5f7cb015d0ba4270d7b9d49842599c1d92d218 100644 --- a/src/lisp/globals.c +++ b/src/lisp/globals.c @@ -29,6 +29,7 @@ unsigned dynamic_space_size; lispobj *control_stack; +lispobj *control_stack_start; #if (defined(i386) || defined(__x86_64)) lispobj *control_stack_end; #endif diff --git a/src/lisp/globals.h b/src/lisp/globals.h index 71a65c393d304a9053bb9b98369ab7fb0b6b3e85..b36325fc65fdda9806ed732968df9c309ef5be47 100644 --- a/src/lisp/globals.h +++ b/src/lisp/globals.h @@ -37,6 +37,8 @@ extern unsigned long binding_stack_size; extern unsigned long static_space_size; extern unsigned long control_stack_size; +extern lispobj *control_stack_start; + #if (defined(i386) || defined(__x86_64)) extern lispobj *control_stack_end; #endif diff --git a/src/lisp/lisp.c b/src/lisp/lisp.c index 72a523dba62ebee2e87e30f58c8a492f0b6f31a2..8bfb8473ecd0e0117b8551c7b72c686481eb3463 100644 --- a/src/lisp/lisp.c +++ b/src/lisp/lisp.c @@ -676,6 +676,7 @@ main(int argc, const char *argv[], const char *envp[]) #endif validate(); gc_init(); + validate_stacks(); /* This is the first use of malloc() and must come after the * static memory layout is mmapped to avoid conflicts with possible diff --git a/src/lisp/os-common.c b/src/lisp/os-common.c index ab82d3688167068d5bd40254eeed8af66d6d4eb9..4398a917823608886df3b26e2b6c6fd122f918fb 100755 --- a/src/lisp/os-common.c +++ b/src/lisp/os-common.c @@ -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. */ - char *end = (char *) CONTROL_STACK_START; + char *end = (char *) control_stack; *red_start = end; *yellow_start = *red_start + RED_ZONE_SIZE; @@ -424,7 +424,7 @@ guard_zones(char **yellow_start, char **red_start) * 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; *yellow_start = *red_start - YELLOW_ZONE_SIZE; diff --git a/src/lisp/save.c b/src/lisp/save.c index 795fac9f3367d0b8b1474e17e0cff23d17d5cbf6..2df0d9c3093beef731e89177207263b96b38078f 100644 --- a/src/lisp/save.c +++ b/src/lisp/save.c @@ -136,7 +136,11 @@ save(char *filename, lispobj init_function, int sse2_mode) } printf("[Undoing binding stack... "); fflush(stdout); +#if 0 unbind_to_here((lispobj *) BINDING_STACK_START); +#else + unbind_to_here((lispobj *) binding_stack); +#endif SetSymbolValue(CURRENT_CATCH_BLOCK, 0); SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0); SetSymbolValue(EVAL_STACK_TOP, 0); @@ -277,7 +281,11 @@ save_executable(char *filename, lispobj init_function) printf("[Undoing binding stack... "); fflush(stdout); +#if 0 unbind_to_here((lispobj *)BINDING_STACK_START); +#else + unbind_to_here((lispobj *)binding_stack); +#endif SetSymbolValue(CURRENT_CATCH_BLOCK, 0); SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0); SetSymbolValue(EVAL_STACK_TOP, 0); diff --git a/src/lisp/validate.c b/src/lisp/validate.c index 7872a12ceb2d1cfc860c9c447a4901409e6d292a..0dec450537f851446eea2f81f6317e543d63140d 100644 --- a/src/lisp/validate.c +++ b/src/lisp/validate.c @@ -92,20 +92,10 @@ validate(void) */ #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 ensure_space((lispobj *) SIGNAL_STACK_START, SIGNAL_STACK_SIZE); #endif - /* Binding Stack */ - binding_stack = (lispobj *) BINDING_STACK_START; - ensure_space(binding_stack, binding_stack_size); #ifdef LINKAGE_TABLE ensure_space((lispobj *) FOREIGN_LINKAGE_SPACE_START, FOREIGN_LINKAGE_SPACE_SIZE); @@ -118,6 +108,22 @@ validate(void) printf(" done.\n"); #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 os_guard_control_stack(0, 1); #endif