X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterrupt.c;h=e469d8f60b02dc8b832356599d17533ea2427608;hb=c0578d9893429c9c0da80ea5920360e4621fddab;hp=acd1d04a0b7dec8a255e6f979b38fc4aa5aefcbd;hpb=ce73c961ea089afea8ec523e1a5556c27d1aa6d2;p=sbcl.git diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index acd1d04..e469d8f 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -250,11 +250,13 @@ sigset_t gc_sigset; #endif +#if !defined(LISP_FEATURE_WIN32) boolean deferrables_blocked_p(sigset_t *sigset) { return all_signals_blocked_p(sigset, &deferrable_sigset, "deferrable"); } +#endif void check_deferrables_unblocked_or_lose(sigset_t *sigset) @@ -274,11 +276,13 @@ check_deferrables_blocked_or_lose(sigset_t *sigset) #endif } +#if !defined(LISP_FEATURE_WIN32) boolean blockables_blocked_p(sigset_t *sigset) { return all_signals_blocked_p(sigset, &blockable_sigset, "blockable"); } +#endif void check_blockables_unblocked_or_lose(sigset_t *sigset) @@ -298,11 +302,13 @@ check_blockables_blocked_or_lose(sigset_t *sigset) #endif } +#if !defined(LISP_FEATURE_WIN32) boolean gc_signals_blocked_p(sigset_t *sigset) { return all_signals_blocked_p(sigset, &gc_sigset, "gc"); } +#endif void check_gc_signals_unblocked_or_lose(sigset_t *sigset) @@ -1429,17 +1435,19 @@ handle_guard_page_triggered(os_context_t *context,os_vm_address_t addr) { struct thread *th=arch_os_get_current_thread(); - /* note the os_context hackery here. When the signal handler returns, - * it won't go back to what it was doing ... */ - if(addr >= CONTROL_STACK_GUARD_PAGE(th) && - addr < CONTROL_STACK_GUARD_PAGE(th) + os_vm_page_size) { + if(addr >= CONTROL_STACK_HARD_GUARD_PAGE(th) && + addr < CONTROL_STACK_HARD_GUARD_PAGE(th) + os_vm_page_size) { + lose("Control stack exhausted"); + } + else if(addr >= CONTROL_STACK_GUARD_PAGE(th) && + addr < CONTROL_STACK_GUARD_PAGE(th) + os_vm_page_size) { /* We hit the end of the control stack: disable guard page * protection so the error handler has some headroom, protect the * previous page so that we can catch returns from the guard page * and restore it. */ - corruption_warning_and_maybe_lose("Control stack exhausted"); protect_control_stack_guard_page(0, NULL); protect_control_stack_return_guard_page(1, NULL); + fprintf(stderr, "INFO: Control stack guard page unprotected\n"); #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK /* For the unfortunate case, when the control stack is @@ -1456,16 +1464,20 @@ handle_guard_page_triggered(os_context_t *context,os_vm_address_t addr) * unprotect this one. This works even if we somehow missed * the return-guard-page, and hit it on our way to new * exhaustion instead. */ - fprintf(stderr, "INFO: Control stack guard page reprotected\n"); protect_control_stack_guard_page(1, NULL); protect_control_stack_return_guard_page(0, NULL); + fprintf(stderr, "INFO: Control stack guard page reprotected\n"); return 1; } + else if(addr >= BINDING_STACK_HARD_GUARD_PAGE(th) && + addr < BINDING_STACK_HARD_GUARD_PAGE(th) + os_vm_page_size) { + lose("Binding stack exhausted"); + } else if(addr >= BINDING_STACK_GUARD_PAGE(th) && addr < BINDING_STACK_GUARD_PAGE(th) + os_vm_page_size) { - corruption_warning_and_maybe_lose("Binding stack exhausted"); protect_binding_stack_guard_page(0, NULL); protect_binding_stack_return_guard_page(1, NULL); + fprintf(stderr, "INFO: Binding stack guard page unprotected\n"); /* For the unfortunate case, when the binding stack is * exhausted in a signal handler. */ @@ -1476,16 +1488,20 @@ handle_guard_page_triggered(os_context_t *context,os_vm_address_t addr) } else if(addr >= BINDING_STACK_RETURN_GUARD_PAGE(th) && addr < BINDING_STACK_RETURN_GUARD_PAGE(th) + os_vm_page_size) { - fprintf(stderr, "INFO: Binding stack guard page reprotected\n"); protect_binding_stack_guard_page(1, NULL); protect_binding_stack_return_guard_page(0, NULL); + fprintf(stderr, "INFO: Binding stack guard page reprotected\n"); return 1; } + else if(addr >= ALIEN_STACK_HARD_GUARD_PAGE(th) && + addr < ALIEN_STACK_HARD_GUARD_PAGE(th) + os_vm_page_size) { + lose("Alien stack exhausted"); + } else if(addr >= ALIEN_STACK_GUARD_PAGE(th) && addr < ALIEN_STACK_GUARD_PAGE(th) + os_vm_page_size) { - corruption_warning_and_maybe_lose("Alien stack exhausted"); protect_alien_stack_guard_page(0, NULL); protect_alien_stack_return_guard_page(1, NULL); + fprintf(stderr, "INFO: Alien stack guard page unprotected\n"); /* For the unfortunate case, when the alien stack is * exhausted in a signal handler. */ @@ -1496,9 +1512,9 @@ handle_guard_page_triggered(os_context_t *context,os_vm_address_t addr) } else if(addr >= ALIEN_STACK_RETURN_GUARD_PAGE(th) && addr < ALIEN_STACK_RETURN_GUARD_PAGE(th) + os_vm_page_size) { - fprintf(stderr, "INFO: Alien stack guard page reprotected\n"); protect_alien_stack_guard_page(1, NULL); protect_alien_stack_return_guard_page(0, NULL); + fprintf(stderr, "INFO: Alien stack guard page reprotected\n"); return 1; } else if (addr >= undefined_alien_address &&