[Openmcl-cvs-notifications] r14426 - /trunk/source/lisp-kernel/x86-exceptions.c
gb at clozure.com
gb at clozure.com
Fri Nov 12 14:26:32 CST 2010
Author: gb
Date: Fri Nov 12 14:26:32 2010
New Revision: 14426
Log:
Do Darwin x86-64 foreign FPE handling in the Mach exception thread.
Modified:
trunk/source/lisp-kernel/x86-exceptions.c
Modified: trunk/source/lisp-kernel/x86-exceptions.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/lisp-kernel/x86-exceptions.c (original)
+++ trunk/source/lisp-kernel/x86-exceptions.c Fri Nov 12 14:26:32 2010
@@ -3413,6 +3413,31 @@
default:
break;
}
+#if WORD_SIZE=3D=3D64
+ if ((signum=3D=3DSIGFPE) && =
+ (code !=3D FPE_INTDIV) && =
+ (tcr->valence !=3D TCR_STATE_LISP)) {
+ mach_msg_type_number_t thread_state_count =3D x86_FLOAT_STATE64_CO=
UNT;
+ x86_float_state64_t fs;
+
+ thread_get_state(thread,
+ x86_FLOAT_STATE64,
+ (thread_state_t)&fs,
+ &thread_state_count);
+ =
+ if (! (tcr->flags & (1<<TCR_FLAG_BIT_FOREIGN_FPE))) {
+ tcr->flags |=3D (1<<TCR_FLAG_BIT_FOREIGN_FPE);
+ tcr->lisp_mxcsr =3D (fs.__fpu_mxcsr & ~MXCSR_STATUS_MASK);
+ }
+ fs.__fpu_mxcsr &=3D ~MXCSR_STATUS_MASK;
+ fs.__fpu_mxcsr |=3D MXCSR_CONTROL_MASK;
+ thread_set_state(thread,
+ x86_FLOAT_STATE64,
+ (thread_state_t)&fs,
+ x86_FLOAT_STATE64_COUNT);
+ return 0;
+ }
+#endif
if (signum) {
kret =3D setup_signal_frame(thread,
(void *)DARWIN_EXCEPTION_HANDLER,
More information about the Openmcl-cvs-notifications
mailing list