X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-darwin-os.c;h=bdc18543c9633c1196edcaa95667812231c8ebc0;hb=d833d62dd152879f1aa4e974bd8337c51905d5ba;hp=6205445d0b97c626fd54913562f54f302c65cc80;hpb=cbc0ad89d5bb05c1bfa2c712bc8a0e2bbe7b5673;p=sbcl.git diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c index 6205445..bdc1854 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -273,8 +273,8 @@ void signal_emulation_wrapper(x86_thread_state32_t *thread_state, 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" - : : "r" (thread_state), "r" (float_state)); + asm volatile (".long 0xffff0b0f" + : : "a" (thread_state), "c" (float_state)); } /* Convenience wrapper for the above */ @@ -398,7 +398,7 @@ catch_exception_raise(mach_port_t exception_port, int signal = 0; void (*handler)(int, siginfo_t *, void *) = NULL; siginfo_t siginfo; - kern_return_t ret; + kern_return_t ret, dealloc_ret; /* Get state and info */ state_count = x86_THREAD_STATE32_COUNT; @@ -478,7 +478,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,11 +496,29 @@ catch_exception_raise(mach_port_t exception_port, call_handler_on_thread(thread, &thread_state, signal, &siginfo, handler); } - mach_port_deallocate (current_mach_task, exception_port); - mach_port_deallocate (current_mach_task, thread); - mach_port_deallocate (current_mach_task, task); + 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); + } + + dealloc_ret = mach_port_deallocate (current_mach_task, task); + if (dealloc_ret) { + lose("mach_port_deallocate (task) failed with return_code %d\n", dealloc_ret); + } 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