0.8.20.22:
[sbcl.git] / src / runtime / bsd-os.c
index 552b0c2..26b07f9 100644 (file)
 #include "interr.h"
 #include "lispregs.h"
 #include "thread.h"
+#include "runtime.h"
+#include "genesis/static-symbols.h"
+#include "genesis/fdefn.h"
 
 #include <sys/types.h>
 #include <signal.h>
 /* #include <sys/sysinfo.h> */
 #include "validate.h"
-
 \f
 os_vm_size_t os_vm_page_size;
 
 #ifdef __NetBSD__
 #include <sys/resource.h>
+#include <sys/sysctl.h>
 #include <string.h>
 
 static void netbsd_init();
@@ -187,10 +190,12 @@ memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context)
 
     os_context_t *context = arch_os_get_context(&void_context);
     if (!gencgc_handle_wp_violation(fault_addr)) 
-        if(!handle_control_stack_guard_triggered(context,fault_addr))
-           /* FIXME is this context or void_context?  not that it */
-           /* makes a difference currently except on linux/sparc */
-           interrupt_handle_now(signal, siginfo, void_context);
+        if(!handle_guard_page_triggered(context,fault_addr))
+#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
+           arrange_return_to_lisp_function(context, SymbolFunction(MEMORY_FAULT_ERROR));
+#else
+           interrupt_handle_now(signal, siginfo, context);
+#endif
 }
 void
 os_install_interrupt_handlers(void)
@@ -212,7 +217,7 @@ sigsegv_handler(int signal, siginfo_t *info, void* void_context)
     
     addr = arch_get_bad_addr(signal,info,context);
     if(!interrupt_maybe_gc(signal, info, context))
-       if(!handle_control_stack_guard_triggered(context,addr))
+       if(!handle_guard_page_triggered(context,addr))
            interrupt_handle_now(signal, info, context);
     /* Work around G5 bug; fix courtesy gbyers */
     sigreturn(void_context);
@@ -232,6 +237,21 @@ os_install_interrupt_handlers(void)
 static void netbsd_init()
 {
     struct rlimit rl;
+    int mib[2], osrev;
+    size_t len;
+
+    /* Are we running on a sufficiently functional kernel? */
+    mib[0] = CTL_KERN;
+    mib[1] = KERN_OSREV;
+
+    len = sizeof(osrev);
+    sysctl(mib, 2, &osrev, &len, NULL, 0);
+
+    /* If we're older than 2.0... */
+    if (osrev < 200000000) {
+       fprintf(stderr, "osrev = %d (needed at least 200000000).\n", osrev);
+       lose("NetBSD kernel too old to run sbcl.\n");
+    }
     
     /* NetBSD counts mmap()ed space against the process's data size limit,
      * so yank it up. This might be a nasty thing to do? */