From 3ee55ba5b826f2dd944c142625ca7858af54c2ee Mon Sep 17 00:00:00 2001 From: Raymond Toy <toy.raymond@gmail.com> Date: Mon, 28 Sep 2015 15:17:37 -0700 Subject: [PATCH] Let the OS mmap the binding and control stacks wherever. --- src/lisp/Linux-os.c | 4 ++-- src/lisp/globals.c | 1 + src/lisp/globals.h | 2 ++ src/lisp/lisp.c | 1 + src/lisp/os-common.c | 4 ++-- src/lisp/save.c | 8 ++++++++ src/lisp/validate.c | 26 ++++++++++++++++---------- 7 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/lisp/Linux-os.c b/src/lisp/Linux-os.c index 7f7a4d7ac..b56354859 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 18b4556c8..3d5f7cb01 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 71a65c393..b36325fc6 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 72a523dba..8bfb8473e 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 ab82d3688..4398a9178 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 795fac9f3..2df0d9c30 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 7872a12ce..0dec45053 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 -- GitLab