X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=0d221f5b9fafa72eea4918cc273c567948e3ee96;hb=b6a842dc8eb0c3aa0364c26b5b41bfc3b38fef31;hp=bf71ab9bb30d1b9fbdd9ca15843e4fdd1771f5a1;hpb=409fcc671231b594ec010adf683f72a871ec1d6a;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index bf71ab9..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,21 +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 - /* FIXME: never returns 0 */ - if (!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 @@ -253,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 @@ -264,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 @@ -407,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 { @@ -422,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;