From: Christophe R. <cr...@us...> - 2005-03-14 09:55:02
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25680/src/runtime Modified Files: bsd-os.c interrupt.h linux-os.c Log Message: 0.8.20.20: Fix handling of SIG_MEMORY_FAULT in the (conceptual) interrupt_handle_now() case -- arrange_return_to_lisp_function() to MEMORY_FAULT_ERROR instead, for x86(-64). (I hope I haven't broken anything on other architectures... please check!) ... also log problem with reporting the error in BUGS Index: bsd-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/bsd-os.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- bsd-os.c 3 Dec 2004 17:50:12 -0000 1.23 +++ bsd-os.c 14 Mar 2005 09:54:49 -0000 1.24 @@ -188,9 +188,11 @@ 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_HANDLER)); +#else + interrupt_handle_now(signal, siginfo, context); +#endif } void os_install_interrupt_handlers(void) Index: interrupt.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/interrupt.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- interrupt.h 3 Dec 2004 17:50:13 -0000 1.13 +++ interrupt.h 14 Mar 2005 09:54:49 -0000 1.14 @@ -44,6 +44,7 @@ extern void interrupt_init(); extern void fake_foreign_function_call(os_context_t* context); extern void undo_fake_foreign_function_call(os_context_t* context); +extern void arrange_return_to_lisp_function(os_context_t *, lispobj); extern void interrupt_handle_now(int, siginfo_t*, void*); extern void interrupt_handle_pending(os_context_t*); extern void interrupt_internal_error(int, siginfo_t*, os_context_t*, Index: linux-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/linux-os.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- linux-os.c 3 Dec 2004 17:50:13 -0000 1.35 +++ linux-os.c 14 Mar 2005 09:54:49 -0000 1.36 @@ -28,10 +28,12 @@ #include "os.h" #include "arch.h" #include "globals.h" -#include "sbcl.h" #include "interrupt.h" #include "interr.h" #include "lispregs.h" +#include "runtime.h" +#include "genesis/static-symbols.h" +#include "genesis/fdefn.h" #include <sys/socket.h> #include <sys/utsname.h> @@ -225,7 +227,11 @@ void* fault_addr = (void*)info->si_addr; if (!gencgc_handle_wp_violation(fault_addr)) if(!handle_guard_page_triggered(context,fault_addr)) - interrupt_handle_now(signal, info, 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, info, context); +#endif } #else |