X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-darwin-os.c;h=bb9212ed5c5b721bb06cef69acb11151b79b2013;hb=b5b36522d5398715e53a3c6ca75cf16001ce46ac;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..bb9212e 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -254,18 +254,10 @@ void signal_emulation_wrapper(x86_thread_state32_t *thread_state, */ os_context_t *context; -#if __DARWIN_UNIX03 - struct __darwin_mcontext32 *regs; -#else - struct mcontext *regs; -#endif + mcontext_t *regs; context = (os_context_t*) os_validate(0, sizeof(os_context_t)); -#if __DARWIN_UNIX03 - 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 @@ -285,11 +277,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 - 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; @@ -386,7 +375,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 +383,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,28 +423,12 @@ catch_exception_raise(mach_port_t exception_port, ret = KERN_INVALID_RIGHT; 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; + addr = (void*)code_vector[1]; + /* Undefined alien */ + if (os_trunc_to_page(addr) == undefined_alien_address) { + handler = undefined_alien_handler; 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); @@ -469,11 +442,6 @@ catch_exception_raise(mach_port_t exception_port, 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;