src/os/windows/vm/os_windows.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/os/windows/vm/os_windows.cpp	Wed Dec 11 12:30:36 2013
--- new/src/os/windows/vm/os_windows.cpp	Wed Dec 11 12:30:34 2013

*** 164,179 **** --- 164,177 ---- // For Windows at the moment does nothing void os::run_periodic_checks() { return; } #ifndef _WIN64 // previous UnhandledExceptionFilter, if there is one static LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL; LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo); #endif void os::init_system_properties_values() { /* sysclasspath, java_home, dll_dir */ { char *home_path; char *dll_path;
*** 2238,2250 **** --- 2236,2248 ---- // Continue the execution #endif return EXCEPTION_CONTINUE_EXECUTION; } #ifndef _WIN64 //----------------------------------------------------------------------------- LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) { + #ifndef _WIN64 // handle exception caused by native method modifying control word PCONTEXT ctx = exceptionInfo->ContextRecord; DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; switch (exception_code) {
*** 2268,2299 **** --- 2266,2292 ---- if (prev_uef_handler != NULL) { // We didn't handle this exception so pass it to the previous // UnhandledExceptionFilter. return (prev_uef_handler)(exceptionInfo); } return EXCEPTION_CONTINUE_SEARCH; } #else //_WIN64 + #else // !_WIN64 /* On Windows, the mxcsr control bits are non-volatile across calls See also CR 6192333 If EXCEPTION_FLT_* happened after some native method modified mxcsr - it is not a jvm fault. However should we decide to restore of mxcsr after a faulty native method we can uncomment following code + */ + PCONTEXT ctx = exceptionInfo->ContextRecord; jint MxCsr = INITIAL_MXCSR; // we can't use StubRoutines::addr_mxcsr_std() // because in Win64 mxcsr is not saved there if (MxCsr != ctx->MxCsr) { ctx->MxCsr = MxCsr; return EXCEPTION_CONTINUE_EXECUTION; } + #endif // !_WIN64 */ #endif //_WIN64 + return EXCEPTION_CONTINUE_SEARCH; + } // Fatal error reporting is single threaded so we can make this a // static and preallocated. If it's more than MAX_PATH silently ignore // it. static char saved_error_file[MAX_PATH] = {0};
*** 2638,2656 **** --- 2631,2647 ---- case EXCEPTION_INT_OVERFLOW: return Handle_IDiv_Exception(exceptionInfo); } // switch } #ifndef _WIN64 if (((thread->thread_state() == _thread_in_Java) || (thread->thread_state() == _thread_in_native)) && exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION) { LONG result=Handle_FLT_Exception(exceptionInfo); if (result==EXCEPTION_CONTINUE_EXECUTION) return result; } #endif //_WIN64 } if (exception_code != EXCEPTION_BREAKPOINT) { report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, exceptionInfo->ContextRecord);

src/os/windows/vm/os_windows.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File