X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-darwin-os.c;h=ad41b0fe4ff102fafdb76af320f2947743d27034;hb=922fe0d6da0e4bdcd366f5101395670aabd14e62;hp=248e782dc0307492df158d0ff7dedfd3194b4621;hpb=e2b2b8f2156ede16d70a0bdd0cfad29ea31b8ccc;p=sbcl.git diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c index 248e782..ad41b0f 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -1,5 +1,3 @@ - - #ifdef LISP_FEATURE_SB_THREAD #include #include @@ -25,6 +23,7 @@ #include #include #include +#include #ifdef LISP_FEATURE_SB_THREAD @@ -116,9 +115,10 @@ int arch_os_thread_cleanup(struct thread *thread) { #ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER -void sigill_handler(int signal, siginfo_t *siginfo, void *void_context); -void sigtrap_handler(int signal, siginfo_t *siginfo, void *void_context); -void memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context); +void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context); +void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context); +void memory_fault_handler(int signal, siginfo_t *siginfo, + os_context_t *context); /* exc_server handles mach exception messages from the kernel and * calls catch exception raise. We use the system-provided @@ -254,18 +254,10 @@ void signal_emulation_wrapper(x86_thread_state32_t *thread_state, */ os_context_t *context; -#if MAC_OS_X_VERSION_10_5 - struct __darwin_mcontext32 *regs; -#else - struct mcontext *regs; -#endif + mcontext_t *regs; context = (os_context_t*) os_validate(0, sizeof(os_context_t)); -#if MAC_OS_X_VERSION_10_5 - regs = (struct __darwin_mcontext32*) os_validate(0, sizeof(struct __darwin_mcontext32)); -#else - regs = (struct mcontext*) os_validate(0, sizeof(struct mcontext)); -#endif + regs = (mcontext_t*) os_validate(0, sizeof(mcontext_t)); context->uc_mcontext = regs; /* when BSD signals are fired, they mask they signals in sa_mask @@ -278,18 +270,14 @@ void signal_emulation_wrapper(x86_thread_state32_t *thread_state, build_fake_signal_context(context, thread_state, float_state); - block_blockable_signals(); + block_blockable_signals(0, 0); handler(signal, siginfo, context); update_thread_state_from_context(thread_state, float_state, context); os_invalidate((os_vm_address_t)context, sizeof(os_context_t)); -#if MAC_OS_X_VERSION_10_5 - os_invalidate((os_vm_address_t)regs, sizeof(struct __darwin_mcontext32)); -#else - os_invalidate((os_vm_address_t)regs, sizeof(struct mcontext)); -#endif + os_invalidate((os_vm_address_t)regs, sizeof(mcontext_t)); /* Trap to restore the signal context. */ asm volatile ("movl %0, %%eax; movl %1, %%ebx; .long 0xffff0b0f" @@ -312,6 +300,7 @@ void call_handler_on_thread(mach_port_t thread, /* Initialize the new state */ new_state = *thread_state; open_stack_allocation(&new_state); + stack_allocate(&new_state, 256); /* Save old state */ save_thread_state = (x86_thread_state32_t *)stack_allocate(&new_state, sizeof(*save_thread_state)); *save_thread_state = *thread_state; @@ -382,17 +371,16 @@ void dump_context(x86_thread_state32_t *thread_state) #endif void -control_stack_exhausted_handler(int signal, siginfo_t *siginfo, void *void_context) { - os_context_t *context = arch_os_get_context(&void_context); +control_stack_exhausted_handler(int signal, siginfo_t *siginfo, + os_context_t *context) { + unblock_signals_in_context_and_maybe_warn(context); arrange_return_to_lisp_function (context, StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR)); } void -undefined_alien_handler(int signal, siginfo_t *siginfo, void *void_context) { - os_context_t *context = arch_os_get_context(&void_context); - +undefined_alien_handler(int signal, siginfo_t *siginfo, os_context_t *context) { arrange_return_to_lisp_function (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR)); } @@ -442,36 +430,13 @@ catch_exception_raise(mach_port_t exception_port, } /* At stack guard */ if (os_trunc_to_page(addr) == CONTROL_STACK_GUARD_PAGE(th)) { - protect_control_stack_guard_page_thread(0, th); - protect_control_stack_return_guard_page_thread(1, th); + lower_thread_control_stack_guard_page(th); handler = control_stack_exhausted_handler; break; } /* Return from stack guard */ if (os_trunc_to_page(addr) == CONTROL_STACK_RETURN_GUARD_PAGE(th)) { - protect_control_stack_guard_page_thread(1, th); - protect_control_stack_return_guard_page_thread(0, th); - break; - } - /* Get vm_region info */ - region_addr = (vm_address_t)code_vector[1]; - info_count = VM_REGION_BASIC_INFO_COUNT; - if ((ret = vm_region(mach_task_self(), - ®ion_addr, - ®ion_size, - VM_REGION_BASIC_INFO, - (vm_region_info_t)®ion_info, - &info_count, - ®ion_name))) - lose("vm_region (VM_REGION_BASIC_INFO) failed failed %d\n", ret); - /* Check if still protected */ - if ((region_info.protection & OS_VM_PROT_ALL) == 0) { - /* KLUDGE: - * If two threads fault on the same page, the protection - * is cleared as the first thread runs memory_fault_handler. - * Grep for "not marked as write-protected" in gencgc.c - */ - ret = KERN_SUCCESS; + reset_thread_control_stack_guard_page(th); break; } /* Regular memory fault */ @@ -547,7 +512,7 @@ mach_exception_handler(void *port) /* mach_msg_server should never return, but it should dispatch mach * exceptions to our catch_exception_raise function */ - abort(); + lose("mach_msg_server returned"); } #endif