X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-darwin-os.c;h=248e782dc0307492df158d0ff7dedfd3194b4621;hb=c2ac5ba3964165ee2d21ccd4c6bf8bdc48e1a165;hp=97d39996ff43a63a621c521bc0674abb1370c9d0;hpb=127fd3d2fb843c6bb7ad0763e143d81877e760e8;p=sbcl.git diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c index 97d3999..248e782 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -254,14 +254,14 @@ void signal_emulation_wrapper(x86_thread_state32_t *thread_state, */ os_context_t *context; -#if __DARWIN_UNIX03 +#if MAC_OS_X_VERSION_10_5 struct __darwin_mcontext32 *regs; #else struct mcontext *regs; #endif context = (os_context_t*) os_validate(0, sizeof(os_context_t)); -#if __DARWIN_UNIX03 +#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)); @@ -285,7 +285,7 @@ void signal_emulation_wrapper(x86_thread_state32_t *thread_state, update_thread_state_from_context(thread_state, float_state, context); os_invalidate((os_vm_address_t)context, sizeof(os_context_t)); -#if __DARWIN_UNIX03 +#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)); @@ -386,7 +386,7 @@ control_stack_exhausted_handler(int signal, siginfo_t *siginfo, void *void_conte os_context_t *context = arch_os_get_context(&void_context); arrange_return_to_lisp_function - (context, SymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR)); + (context, StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR)); } void @@ -394,7 +394,7 @@ undefined_alien_handler(int signal, siginfo_t *siginfo, void *void_context) { os_context_t *context = arch_os_get_context(&void_context); arrange_return_to_lisp_function - (context, SymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR)); + (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR)); } kern_return_t @@ -434,6 +434,25 @@ catch_exception_raise(mach_port_t exception_port, ret = KERN_INVALID_RIGHT; break; } + addr = (void*)code_vector[1]; + /* Undefined alien */ + if (os_trunc_to_page(addr) == undefined_alien_address) { + handler = undefined_alien_handler; + break; + } + /* 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); + 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; @@ -455,25 +474,6 @@ catch_exception_raise(mach_port_t exception_port, ret = KERN_SUCCESS; break; } - addr = (void*)code_vector[1]; - /* 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); - 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; - } - /* Undefined alien */ - if (os_trunc_to_page(addr) == undefined_alien_address) { - handler = undefined_alien_handler; - break; - } /* Regular memory fault */ handler = memory_fault_handler; break;