X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Flinux-os.c;h=371cbb61ceaec042f3bfba236911bf6d4e169152;hb=2010727926b091b23a246f6f659be61e27e19667;hp=69d5a41a109e0b7a3d2e82c3f988d28ec66c0402;hpb=68fd2d2dd6f265669a8957accd8a33e62786a97e;p=sbcl.git diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 69d5a41..371cbb6 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -44,9 +44,7 @@ #include "validate.h" size_t os_vm_page_size; -#if defined GENCGC -#include "gencgc.h" -#endif +#include "gc.h" #ifdef sparc @@ -73,23 +71,24 @@ void os_init(void) * that has more than one digit initially -- CSR, 2002-02-12 */ minor_version = atoi(name.release+2); if (minor_version < 4) { - fprintf(stderr,"linux minor version=%d;\n enabling workarounds for SPARC kernel bugs in signal handling.\n", minor_version); + FSHOW((stderr,"linux minor version=%d;\n enabling workarounds for SPARC kernel bugs in signal handling.\n", minor_version)); early_kernel = 1; } #endif } os_vm_page_size = getpagesize(); - /* This could just as well be in arch_init(), but it's not. */ + /* This could just as well be in arch_init(), but it's not. */ #ifdef __i386__ - SET_FPU_CONTROL_WORD(0x1372|4|8|16|32); /* no interrupts */ + /* FIXME: This used to be here. However, I have just removed it + with no apparent ill effects (it may be that earlier kernels + started up a process with a different set of traps, or + something?) Find out what this was meant to do, and reenable it + or delete it if possible. -- CSR, 2002-07-15 */ + /* SET_FPU_CONTROL_WORD(0x1372|4|8|16|32); no interrupts */ #endif } -/* various os_context_*_addr accessors moved to {x86,alpha}-linux-os.c - * -dan 20010125 - */ - /* In Debian CMU CL ca. 2.4.9, it was possible to get an infinite * cascade of errors from do_mmap(..). This variable is a counter to * prevent that; when it counts down to zero, an error in do_mmap @@ -241,7 +240,8 @@ is_valid_lisp_addr(os_vm_address_t addr) * any OS-dependent special low-level handling for signals */ -#if defined GENCGC + +#if defined LISP_FEATURE_GENCGC /* * The GENCGC needs to be hooked into whatever signal is raised for @@ -252,9 +252,9 @@ sigsegv_handler(int signal, siginfo_t *info, void* void_context) { os_context_t *context = arch_os_get_context(&void_context); void* fault_addr = (void*)context->uc_mcontext.cr2; - if (!gencgc_handle_wp_violation(fault_addr)) { - interrupt_handle_now(signal, info, void_context); - } + if (!gencgc_handle_wp_violation(fault_addr)) + if(!handle_control_stack_guard_triggered(context,fault_addr)) + interrupt_handle_now(signal, info, void_context); } #else @@ -265,49 +265,34 @@ 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; -#ifdef __i386__ - interrupt_handle_now(signal,contextstruct); -#else - char *control_stack_top = (char*)CONTROL_STACK_START + CONTROL_STACK_SIZE; - addr = arch_get_bad_addr(signal,info,context); - if (addr != NULL && - *os_context_register_addr(context,reg_ALLOC) & (1L<<63)){ - /* This is the end of a pseudo-atomic section during which - * a signal was received. We must deal with the pending interrupt - * (see also interrupt.c, ../code/interrupt.lisp) + *os_context_register_addr(context,reg_ALLOC) & (1L<<63)){ + + /* Alpha stuff: This is the end of a pseudo-atomic section + * during which a signal was received. We must deal with the + * pending interrupt (see also interrupt.c, + * ../code/interrupt.lisp) */ - /* (how we got here: when interrupting, we set bit 63 in * reg_Alloc. At the end of the atomic section we tried to - * write to reg_Alloc, got a SIGSEGV (there's nothing mapped + * write to reg_ALLOC, got a SIGSEGV (there's nothing mapped * there) so ended up here */ *os_context_register_addr(context,reg_ALLOC) -= (1L<<63); interrupt_handle_pending(context); - } else if (addr > control_stack_top && addr < BINDING_STACK_START) { - fprintf(stderr, - "Possible stack overflow at 0x%016lX:\n" - "control_stack_top=%lx, BINDING_STACK_START=%lx\n", - addr, - control_stack_top, - BINDING_STACK_START); - /* Try to fix control frame pointer. */ - while ( ! (CONTROL_STACK_START <= *current_control_frame_pointer && - *current_control_frame_pointer <= control_stack_top)) - ((char*)current_control_frame_pointer) -= sizeof(lispobj); - monitor_or_something(); - } else if (!interrupt_maybe_gc(signal, info, context)) { - interrupt_handle_now(signal, info, context); + } else { + if(!interrupt_maybe_gc(signal, info, context)) + if(!handle_control_stack_guard_triggered(context,addr)) + interrupt_handle_now(signal, info, context); } -#endif } #endif void os_install_interrupt_handlers(void) { - undoably_install_low_level_interrupt_handler(SIGSEGV, sigsegv_handler); + undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, + sigsegv_handler); }