X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-darwin-os.c;h=bf127b69749408b46deedee97aade5559320a9a6;hb=9e7a18990d8cfe726edca3450f84510f5676a3e1;hp=f10d071c0f378402f04fcc03aa4b1e5bdccd65cc;hpb=c3af3cf3704ce01c71de96cc36c2798014fc9960;p=sbcl.git diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c index f10d071..bf127b6 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -44,14 +44,23 @@ void set_data_desc_addr(data_desc_t* desc, void* addr) #endif -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER -kern_return_t mach_thread_init(mach_port_t thread_exception_port); +#ifdef LISP_FEATURE_SB_THREAD +void +arch_os_load_ldt(struct thread *thread) +{ + sel_t sel; + + sel.index = thread->tls_cookie; + sel.rpl = USER_PRIV; + sel.ti = SEL_LDT; + + __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel)); +} #endif int arch_os_thread_init(struct thread *thread) { #ifdef LISP_FEATURE_SB_THREAD int n; - sel_t sel; data_desc_t ldt_entry = { 0, 0, 0, DESC_DATA_WRITE, 3, 1, 0, DESC_DATA_32B, DESC_GRAN_BYTE, 0 }; @@ -69,17 +78,13 @@ int arch_os_thread_init(struct thread *thread) { thread_mutex_unlock(&modify_ldt_lock); FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", n)); - sel.index = n; - sel.rpl = USER_PRIV; - sel.ti = SEL_LDT; - - __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel)); - thread->tls_cookie=n; + arch_os_load_ldt(thread); + pthread_setspecific(specials,thread); #endif #ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - mach_thread_init(THREAD_STRUCT_TO_EXCEPTION_PORT(thread)); + mach_lisp_thread_init(thread); #endif #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK @@ -274,7 +279,7 @@ void signal_emulation_wrapper(x86_thread_state32_t *thread_state, /* Trap to restore the signal context. */ asm volatile (".long 0xffff0b0f" - : : "a" (thread_state), "b" (float_state)); + : : "a" (thread_state), "c" (float_state)); } /* Convenience wrapper for the above */ @@ -386,7 +391,6 @@ catch_exception_raise(mach_port_t exception_port, exception_data_t code_vector, mach_msg_type_number_t code_count) { - struct thread *th = (struct thread*) exception_port; x86_thread_state32_t thread_state; mach_msg_type_number_t state_count; vm_address_t region_addr; @@ -400,6 +404,10 @@ catch_exception_raise(mach_port_t exception_port, siginfo_t siginfo; kern_return_t ret, dealloc_ret; + struct thread *th; + + FSHOW((stderr,"/entering catch_exception_raise with exception: %d\n", exception)); + th = *(struct thread**)exception_port; /* Get state and info */ state_count = x86_THREAD_STATE32_COUNT; if ((ret = thread_get_state(thread, @@ -478,7 +486,7 @@ catch_exception_raise(mach_port_t exception_port, lose("thread_set_state (x86_THREAD_STATE32) failed %d\n", ret); if ((ret = thread_set_state(thread, x86_FLOAT_STATE32, - (thread_state_t)thread_state.EBX, + (thread_state_t)thread_state.ECX, x86_FLOAT_STATE32_COUNT)) != KERN_SUCCESS) lose("thread_set_state (x86_FLOAT_STATE32) failed %d\n", ret); break; @@ -496,6 +504,9 @@ catch_exception_raise(mach_port_t exception_port, call_handler_on_thread(thread, &thread_state, signal, &siginfo, handler); } + if (current_mach_task == MACH_PORT_NULL) + current_mach_task = mach_task_self(); + dealloc_ret = mach_port_deallocate (current_mach_task, thread); if (dealloc_ret) { lose("mach_port_deallocate (thread) failed with return_code %d\n", dealloc_ret); @@ -509,4 +520,16 @@ catch_exception_raise(mach_port_t exception_port, return ret; } +void +os_restore_fp_control(os_context_t *context) +{ + /* KLUDGE: The x87 FPU control word is some nasty bitfield struct + * thing. Rather than deal with that, just grab it as a 16-bit + * integer. */ + unsigned short fpu_control_word = + *((unsigned short *)&context->uc_mcontext->FS.FPU_FCW); + /* reset exception flags and restore control flags on x87 FPU */ + asm ("fldcw %0" : : "m" (fpu_control_word)); +} + #endif