Ignore:
Timestamp:
Apr 9, 2009, 10:16:42 PM (11 years ago)
Author:
rme
Message:

Merge trunk changes r11863 through r11898.

File:
1 edited

Legend:

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

    r11814 r11927  
    866866#endif
    867867#endif
    868 
    869 
    870   if (addr && (addr == tcr->safe_ref_address)) {
    871     xpGPR(xp,Iimm0) = 0;
    872     xpPC(xp) = xpGPR(xp,Ira0);
    873     return true;
    874   } else {
    875     protected_area *a = find_protected_area(addr);
    876     protection_handler *handler;
    877 
    878     if (a) {
    879       handler = protection_handlers[a->why];
    880       return handler(xp, a, addr);
     868  Boolean valid = IS_PAGE_FAULT(info,xp);
     869
     870  if (valid) {
     871    if (addr && (addr == tcr->safe_ref_address)) {
     872      xpGPR(xp,Iimm0) = 0;
     873      xpPC(xp) = xpGPR(xp,Ira0);
     874      return true;
    881875    } else {
    882       if ((addr >= readonly_area->low) &&
    883           (addr < readonly_area->active)) {
    884         UnProtectMemory((LogicalAddress)(truncate_to_power_of_2(addr,log2_page_size)),
    885                         page_size);
    886         return true;
     876      protected_area *a = find_protected_area(addr);
     877      protection_handler *handler;
     878     
     879      if (a) {
     880        handler = protection_handlers[a->why];
     881        return handler(xp, a, addr);
     882      } else {
     883        if ((addr >= readonly_area->low) &&
     884            (addr < readonly_area->active)) {
     885          UnProtectMemory((LogicalAddress)(truncate_to_power_of_2(addr,log2_page_size)),
     886                          page_size);
     887          return true;
     888        }
    887889      }
    888890    }
     
    894896      (header_subtag(header_of(cmain)) == subtag_macptr)) {
    895897      xcf = create_exception_callback_frame(xp, tcr);
    896       callback_to_lisp(tcr, cmain, xp, xcf, SIGBUS, is_write_fault(xp,info), (natural)addr, 0);
     898      callback_to_lisp(tcr, cmain, xp, xcf, SIGBUS, valid ? is_write_fault(xp,info) : (natural)-1, valid ? (natural)addr : 0, 0);
    897899    }
    898900  }
     
    18211823}
    18221824
     1825static
     1826DWORD mxcsr_bit_to_fpe_code[] = {
     1827  EXCEPTION_FLT_INVALID_OPERATION, /* ie */
     1828  0,                            /* de */
     1829  EXCEPTION_FLT_DIVIDE_BY_ZERO, /* ze */
     1830  EXCEPTION_FLT_OVERFLOW,       /* oe */
     1831  EXCEPTION_FLT_UNDERFLOW,      /* ue */
     1832  EXCEPTION_FLT_INEXACT_RESULT  /* pe */
     1833};
     1834
     1835#ifndef STATUS_FLOAT_MULTIPLE_FAULTS
     1836#define STATUS_FLOAT_MULTIPLE_FAULTS 0xc00002b4
     1837#endif
     1838
     1839#ifndef STATUS_FLOAT_MULTIPLE_TRAPS
     1840#define  STATUS_FLOAT_MULTIPLE_TRAPS 0xc00002b5
     1841#endif
     1842
    18231843int
    1824 map_windows_exception_code_to_posix_signal(DWORD code)
     1844map_windows_exception_code_to_posix_signal(DWORD code, siginfo_t *info, ExceptionInformation *context)
    18251845{
    18261846  switch (code) {
     1847#ifdef WIN_32
     1848  case STATUS_FLOAT_MULTIPLE_FAULTS:
     1849  case STATUS_FLOAT_MULTIPLE_TRAPS:
     1850    {
     1851      int xbit, maskbit;
     1852      DWORD mxcsr = *(xpMXCSRptr(context));
     1853
     1854      for (xbit = 0, maskbit = MXCSR_IM_BIT; xbit < 6; xbit++, maskbit++) {
     1855        if ((mxcsr & (1 << xbit)) &&
     1856            !(mxcsr & (1 << maskbit))) {
     1857          info->ExceptionCode = mxcsr_bit_to_fpe_code[xbit];
     1858          break;
     1859        }
     1860      }
     1861    }
     1862    return SIGFPE;
     1863#endif
     1864     
    18271865  case EXCEPTION_ACCESS_VIOLATION:
    18281866    return SIGSEGV;
     
    18601898  wait_for_exception_lock_in_handler(tcr, context, &xframes);
    18611899
    1862   signal_number = map_windows_exception_code_to_posix_signal(code);
     1900  signal_number = map_windows_exception_code_to_posix_signal(code, info, context);
    18631901 
    18641902  if (!handle_exception(signal_number, info, context, tcr, old_valence)) {
Note: See TracChangeset for help on using the changeset viewer.