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