From: Thiemo Seufer Date: Fri, 21 Oct 2005 11:45:45 +0000 (+0000) Subject: 0.9.5.81: X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=71c1aff9923ecec1b55fdc48a3a2f149e9e7da68;p=sbcl.git 0.9.5.81: Less copy&paste for the Linux sigsegv handler. --- diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index ce900a7..85221c5 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -305,34 +305,15 @@ is_valid_lisp_addr(os_vm_address_t addr) * any OS-dependent special low-level handling for signals */ - -#if defined LISP_FEATURE_GENCGC - /* - * The GENCGC needs to be hooked into whatever signal is raised for + * The GC needs to be hooked into whatever signal is raised for * page fault on this OS. */ static void sigsegv_handler(int signal, siginfo_t *info, void* void_context) { os_context_t *context = arch_os_get_context(&void_context); - void* fault_addr = (void*)info->si_addr; - if (!gencgc_handle_wp_violation(fault_addr)) - 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, info, context); -#endif -} - -#else - -static void -sigsegv_handler(int signal, siginfo_t *info, void* void_context) -{ - os_context_t *context = arch_os_get_context(&void_context); - os_vm_address_t addr = arch_get_bad_addr(signal,info,context); + os_vm_address_t addr = arch_get_bad_addr(signal, info, context); #ifdef LISP_FEATURE_ALPHA /* Alpha stuff: This is the end of a pseudo-atomic section during @@ -343,18 +324,25 @@ sigsegv_handler(int signal, siginfo_t *info, void* void_context) At the end of the atomic section we tried to write to reg_ALLOC, got a SIGSEGV (there's nothing mapped there) so ended up here. */ if (addr != NULL && - *os_context_register_addr(context,reg_ALLOC) & (1L<<63)){ - *os_context_register_addr(context,reg_ALLOC) -= (1L<<63); + *os_context_register_addr(context, reg_ALLOC) & (1L<<63)) { + *os_context_register_addr(context, reg_ALLOC) -= (1L<<63); interrupt_handle_pending(context); return; } #endif - if(!interrupt_maybe_gc(signal, info, context)) - if(!handle_guard_page_triggered(context,addr)) +#ifdef LISP_FEATURE_GENCGC + if (!gencgc_handle_wp_violation(addr)) +#else + if (!interrupt_maybe_gc(signal, info, context)) +#endif + if (!handle_guard_page_triggered(context, addr)) +#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK + arrange_return_to_lisp_function(context, SymbolFunction(MEMORY_FAULT_ERROR)); +#else interrupt_handle_now(signal, info, context); -} #endif +} void os_install_interrupt_handlers(void) diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 5f10060..40b0683 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -36,6 +36,13 @@ unsigned long fast_random_state = 1; void arch_init(void) {} + +os_vm_address_t +arch_get_bad_addr(int sig, siginfo_t *code, os_context_t *context) +{ + return (os_vm_address_t)code->si_addr; +} + /* * hacking signal contexts diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 5b330ac..8b6783b 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -35,6 +35,13 @@ unsigned long fast_random_state = 1; void arch_init(void) {} + +os_vm_address_t +arch_get_bad_addr(int sig, siginfo_t *code, os_context_t *context) +{ + return (os_vm_address_t)code->si_addr; +} + /* * hacking signal contexts diff --git a/version.lisp-expr b/version.lisp-expr index 96ebcc6..bd59d21 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.9.5.80" +"0.9.5.81"