0.7.13.28:
[sbcl.git] / src / runtime / validate.c
index cf91204..be8ad27 100644 (file)
  */
 
 #include <stdio.h>
+#include <stdlib.h>
+
 #include "runtime.h"
 #include "os.h"
 #include "globals.h"
 #include "sbcl.h"
 #include "validate.h"
 
-static void ensure_space(lispobj *start, unsigned long size)
+static void
+ensure_space(lispobj *start, unsigned long size)
 {
     if (os_validate((os_vm_address_t)start,(os_vm_size_t)size)==NULL) {
        fprintf(stderr,
@@ -35,7 +38,8 @@ static void ensure_space(lispobj *start, unsigned long size)
 
 static os_vm_address_t holes[] = HOLES;
 
-static void make_holes(void)
+static void
+make_holes(void)
 {
     int i;
 
@@ -52,32 +56,41 @@ static void make_holes(void)
 }
 #endif
 
-void validate(void)
+void
+validate(void)
 {
 #ifdef PRINTNOISE
-       printf("validating memory ...");
-       fflush(stdout);
+    printf("validating memory ...");
+    fflush(stdout);
 #endif
-
-       ensure_space( (lispobj *)READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE);
-       ensure_space( (lispobj *)STATIC_SPACE_START   , STATIC_SPACE_SIZE);
-#ifdef GENCGC
-       ensure_space( (lispobj *)DYNAMIC_SPACE_START  , DYNAMIC_SPACE_SIZE);
+    
+    ensure_space( (lispobj *)READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE);
+    ensure_space( (lispobj *)STATIC_SPACE_START   , STATIC_SPACE_SIZE);
+#ifdef LISP_FEATURE_GENCGC
+    ensure_space( (lispobj *)DYNAMIC_SPACE_START  , DYNAMIC_SPACE_SIZE);
 #else
-       ensure_space( (lispobj *)DYNAMIC_0_SPACE_START  , DYNAMIC_SPACE_SIZE);
-       ensure_space( (lispobj *)DYNAMIC_1_SPACE_START  , DYNAMIC_SPACE_SIZE);
+    ensure_space( (lispobj *)DYNAMIC_0_SPACE_START  , DYNAMIC_SPACE_SIZE);
+    ensure_space( (lispobj *)DYNAMIC_1_SPACE_START  , DYNAMIC_SPACE_SIZE);
+#endif
+    ensure_space( (lispobj *)CONTROL_STACK_START  , CONTROL_STACK_SIZE);
+    ensure_space( (lispobj *)BINDING_STACK_START  , BINDING_STACK_SIZE);
+#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
+    ensure_space( (lispobj *) ALTERNATE_SIGNAL_STACK_START, SIGSTKSZ);
 #endif
-       ensure_space( (lispobj *)CONTROL_STACK_START  , CONTROL_STACK_SIZE);
-       ensure_space( (lispobj *)BINDING_STACK_START  , BINDING_STACK_SIZE);
 
 #ifdef HOLES
-       make_holes();
-#endif
-#ifndef GENCGC
-       current_dynamic_space = DYNAMIC_0_SPACE_START;
+    make_holes();
 #endif
-
+    
 #ifdef PRINTNOISE
-       printf(" done.\n");
+    printf(" done.\n");
 #endif
+    protect_control_stack_guard_page(1);
+}
+
+void protect_control_stack_guard_page(int protect_p) {
+    os_protect(CONTROL_STACK_GUARD_PAGE,
+              os_vm_page_size,protect_p ?
+              (OS_VM_PROT_READ|OS_VM_PROT_EXECUTE) : OS_VM_PROT_ALL);
 }
+