X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=26b07f9c0e1dbf9daaa040958e86a9870bf6e77c;hb=dce93c6930e8b0a93a0b36f8394a6e1417916ee1;hp=552b0c24d00c832bc4c7381bb046c41bbe722e7a;hpb=4f9ca5ebd934f060f099ce12cd9a3851ba1fc990;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 552b0c2..26b07f9 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -32,17 +32,20 @@ #include "interr.h" #include "lispregs.h" #include "thread.h" +#include "runtime.h" +#include "genesis/static-symbols.h" +#include "genesis/fdefn.h" #include #include /* #include */ #include "validate.h" - os_vm_size_t os_vm_page_size; #ifdef __NetBSD__ #include +#include #include 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? */