Changeset 14426


Ignore:
Timestamp:
Nov 12, 2010, 8:26:32 PM (9 years ago)
Author:
gb
Message:

Do Darwin x86-64 foreign FPE handling in the Mach exception thread.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/x86-exceptions.c

    r14295 r14426  
    34143414        break;
    34153415      }
     3416#if WORD_SIZE==64
     3417      if ((signum==SIGFPE) &&
     3418          (code != FPE_INTDIV) &&
     3419          (tcr->valence != TCR_STATE_LISP)) {
     3420        mach_msg_type_number_t thread_state_count = x86_FLOAT_STATE64_COUNT;
     3421        x86_float_state64_t fs;
     3422
     3423        thread_get_state(thread,
     3424                         x86_FLOAT_STATE64,
     3425                         (thread_state_t)&fs,
     3426                         &thread_state_count);
     3427       
     3428        if (! (tcr->flags & (1<<TCR_FLAG_BIT_FOREIGN_FPE))) {
     3429          tcr->flags |= (1<<TCR_FLAG_BIT_FOREIGN_FPE);
     3430          tcr->lisp_mxcsr = (fs.__fpu_mxcsr & ~MXCSR_STATUS_MASK);
     3431        }
     3432        fs.__fpu_mxcsr &= ~MXCSR_STATUS_MASK;
     3433        fs.__fpu_mxcsr |= MXCSR_CONTROL_MASK;
     3434        thread_set_state(thread,
     3435                         x86_FLOAT_STATE64,
     3436                         (thread_state_t)&fs,
     3437                         x86_FLOAT_STATE64_COUNT);
     3438        return 0;
     3439      }
     3440#endif
    34163441      if (signum) {
    34173442        kret = setup_signal_frame(thread,
Note: See TracChangeset for help on using the changeset viewer.