X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=0d221f5b9fafa72eea4918cc273c567948e3ee96;hb=b6a842dc8eb0c3aa0364c26b5b41bfc3b38fef31;hp=e9dacd5b96bc155fdb80d54923aa2b1b381075bb;hpb=4f9b5cd4268d3e28ac54748c4871e07f38acfd4c;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index e9dacd5..0d221f5 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -194,14 +194,13 @@ is_valid_lisp_addr(os_vm_address_t addr) */ void -memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context +memory_fault_handler(int signal, siginfo_t *siginfo, os_context_t *context #if defined(LISP_FEATURE_FREEBSD) && defined(LISP_FEATURE_X86_64) /* FreeBSD/amd64 stores fault address only in undocumented 4th arg. */ ,void *fault_addr #endif ) { - os_context_t *context = arch_os_get_context(&void_context); #if defined(LISP_FEATURE_FREEBSD) && defined(LISP_FEATURE_X86_64) /* KLUDGE: Store fault address into si_addr for compatibilities. */ siginfo->si_addr = fault_addr; @@ -218,30 +217,14 @@ memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context FSHOW((stderr, "Memory fault at: %p, PC: %p\n", fault_addr, *os_context_pc_addr(context))); if (!gencgc_handle_wp_violation(fault_addr)) - if(!handle_guard_page_triggered(context,fault_addr)) { -#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK + if(!handle_guard_page_triggered(context,fault_addr)) lisp_memory_fault_error(context, fault_addr); -#else - - /* this disabled section is what used to be here: */ -#if 0 - /* FIXME: never returns 0 */ - if (!maybe_gc(context)) { - interrupt_handle_now(signal, siginfo, context); - } -#endif - /* FIXME: Nowadays, maybe_gc does return 1 to indicate - * that GC did happen, but I'm keeping the code as it - * was. */ - maybe_gc(context); - interrupt_handle_now(signal, siginfo, context); -#endif - } } #if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) void -mach_error_memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context) { +mach_error_memory_fault_handler(int signal, siginfo_t *siginfo, + os_context_t *context) { lose("Unhandled memory fault. Exiting."); } #endif @@ -262,8 +245,6 @@ os_install_interrupt_handlers(void) #endif #ifdef LISP_FEATURE_SB_THREAD - undoably_install_low_level_interrupt_handler(SIG_INTERRUPT_THREAD, - interrupt_thread_handler); undoably_install_low_level_interrupt_handler(SIG_STOP_FOR_GC, sig_stop_for_gc_handler); #endif @@ -273,9 +254,8 @@ os_install_interrupt_handlers(void) #else /* Currently PPC/Darwin/Cheney only */ static void -sigsegv_handler(int signal, siginfo_t *info, void* void_context) +sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) { - os_context_t *context = arch_os_get_context(&void_context); #if 0 unsigned int pc = (unsigned int *)(*os_context_pc_addr(context)); #endif @@ -416,7 +396,6 @@ futex_wait(int *lock_word, long oldval, long sec, unsigned long usec) struct timespec timeout; int ret; -again: if (sec < 0) ret = umtx_wait((void *)lock_word, oldval, NULL); else { @@ -431,8 +410,7 @@ again: case ETIMEDOUT: return 1; case EINTR: - /* spurious wakeup from interrupt */ - goto again; + return 2; default: /* EWOULDBLOCK and others, need to check the lock */ return -1;