[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