X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fruntime%2Fbsd-os.c;h=eb07274f8ecb3a174232c888d3c9a5356a0e0d99;hb=343ef95fda9da33830d5ab6aabe5368c898f0918;hp=63b28ef652453f239fa6a7f794ebe617aad3b179;hpb=5e1fcdac979db9a6aebe69531229355def8c0f90;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 63b28ef..eb07274 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -32,6 +32,9 @@ #include "interr.h" #include "lispregs.h" #include "thread.h" +#include "runtime.h" +#include "genesis/static-symbols.h" +#include "genesis/fdefn.h" #include #include @@ -188,9 +191,11 @@ 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_guard_page_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); +#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) @@ -215,7 +220,7 @@ sigsegv_handler(int signal, siginfo_t *info, void* void_context) if(!handle_guard_page_triggered(context,addr)) interrupt_handle_now(signal, info, context); /* Work around G5 bug; fix courtesy gbyers */ - sigreturn(void_context); + DARWIN_FIX_CONTEXT(context); } void