Mercurial > hg > graal-compiler
comparison src/os/windows/vm/os_windows.cpp @ 14243:2cfad8cc3bab
7012961: runtime/jni/WindowsExceptionFilter/WindowsExceptionFilter01 crashes on windows-amd64
Summary: VM needs to handle EXCEPTION_FLT_* exceptions on Win64
Reviewed-by: coleenp, ccheung
author | zgu |
---|---|
date | Thu, 09 Jan 2014 14:06:53 -0500 |
parents | 179cd89fb279 |
children | 5944dba4badc |
comparison
equal
deleted
inserted
replaced
14242:6ffbf4c1c98c | 14243:2cfad8cc3bab |
---|---|
164 // For Windows at the moment does nothing | 164 // For Windows at the moment does nothing |
165 void os::run_periodic_checks() { | 165 void os::run_periodic_checks() { |
166 return; | 166 return; |
167 } | 167 } |
168 | 168 |
169 #ifndef _WIN64 | |
170 // previous UnhandledExceptionFilter, if there is one | 169 // previous UnhandledExceptionFilter, if there is one |
171 static LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL; | 170 static LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL; |
172 | 171 |
173 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo); | 172 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo); |
174 #endif | |
175 void os::init_system_properties_values() { | 173 void os::init_system_properties_values() { |
176 /* sysclasspath, java_home, dll_dir */ | 174 /* sysclasspath, java_home, dll_dir */ |
177 { | 175 { |
178 char *home_path; | 176 char *home_path; |
179 char *dll_path; | 177 char *dll_path; |
2238 // Continue the execution | 2236 // Continue the execution |
2239 #endif | 2237 #endif |
2240 return EXCEPTION_CONTINUE_EXECUTION; | 2238 return EXCEPTION_CONTINUE_EXECUTION; |
2241 } | 2239 } |
2242 | 2240 |
2243 #ifndef _WIN64 | |
2244 //----------------------------------------------------------------------------- | 2241 //----------------------------------------------------------------------------- |
2245 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) { | 2242 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) { |
2243 PCONTEXT ctx = exceptionInfo->ContextRecord; | |
2244 #ifndef _WIN64 | |
2246 // handle exception caused by native method modifying control word | 2245 // handle exception caused by native method modifying control word |
2247 PCONTEXT ctx = exceptionInfo->ContextRecord; | |
2248 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; | 2246 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; |
2249 | 2247 |
2250 switch (exception_code) { | 2248 switch (exception_code) { |
2251 case EXCEPTION_FLT_DENORMAL_OPERAND: | 2249 case EXCEPTION_FLT_DENORMAL_OPERAND: |
2252 case EXCEPTION_FLT_DIVIDE_BY_ZERO: | 2250 case EXCEPTION_FLT_DIVIDE_BY_ZERO: |
2268 if (prev_uef_handler != NULL) { | 2266 if (prev_uef_handler != NULL) { |
2269 // We didn't handle this exception so pass it to the previous | 2267 // We didn't handle this exception so pass it to the previous |
2270 // UnhandledExceptionFilter. | 2268 // UnhandledExceptionFilter. |
2271 return (prev_uef_handler)(exceptionInfo); | 2269 return (prev_uef_handler)(exceptionInfo); |
2272 } | 2270 } |
2273 | 2271 #else // !_WIN64 |
2274 return EXCEPTION_CONTINUE_SEARCH; | |
2275 } | |
2276 #else //_WIN64 | |
2277 /* | 2272 /* |
2278 On Windows, the mxcsr control bits are non-volatile across calls | 2273 On Windows, the mxcsr control bits are non-volatile across calls |
2279 See also CR 6192333 | 2274 See also CR 6192333 |
2280 If EXCEPTION_FLT_* happened after some native method modified | 2275 */ |
2281 mxcsr - it is not a jvm fault. | |
2282 However should we decide to restore of mxcsr after a faulty | |
2283 native method we can uncomment following code | |
2284 jint MxCsr = INITIAL_MXCSR; | 2276 jint MxCsr = INITIAL_MXCSR; |
2285 // we can't use StubRoutines::addr_mxcsr_std() | 2277 // we can't use StubRoutines::addr_mxcsr_std() |
2286 // because in Win64 mxcsr is not saved there | 2278 // because in Win64 mxcsr is not saved there |
2287 if (MxCsr != ctx->MxCsr) { | 2279 if (MxCsr != ctx->MxCsr) { |
2288 ctx->MxCsr = MxCsr; | 2280 ctx->MxCsr = MxCsr; |
2289 return EXCEPTION_CONTINUE_EXECUTION; | 2281 return EXCEPTION_CONTINUE_EXECUTION; |
2290 } | 2282 } |
2291 | 2283 #endif // !_WIN64 |
2292 */ | 2284 |
2293 #endif //_WIN64 | 2285 return EXCEPTION_CONTINUE_SEARCH; |
2294 | 2286 } |
2295 | 2287 |
2296 // Fatal error reporting is single threaded so we can make this a | 2288 // Fatal error reporting is single threaded so we can make this a |
2297 // static and preallocated. If it's more than MAX_PATH silently ignore | 2289 // static and preallocated. If it's more than MAX_PATH silently ignore |
2298 // it. | 2290 // it. |
2299 static char saved_error_file[MAX_PATH] = {0}; | 2291 static char saved_error_file[MAX_PATH] = {0}; |
2638 case EXCEPTION_INT_OVERFLOW: | 2630 case EXCEPTION_INT_OVERFLOW: |
2639 return Handle_IDiv_Exception(exceptionInfo); | 2631 return Handle_IDiv_Exception(exceptionInfo); |
2640 | 2632 |
2641 } // switch | 2633 } // switch |
2642 } | 2634 } |
2643 #ifndef _WIN64 | |
2644 if (((thread->thread_state() == _thread_in_Java) || | 2635 if (((thread->thread_state() == _thread_in_Java) || |
2645 (thread->thread_state() == _thread_in_native)) && | 2636 (thread->thread_state() == _thread_in_native)) && |
2646 exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION) | 2637 exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION) |
2647 { | 2638 { |
2648 LONG result=Handle_FLT_Exception(exceptionInfo); | 2639 LONG result=Handle_FLT_Exception(exceptionInfo); |
2649 if (result==EXCEPTION_CONTINUE_EXECUTION) return result; | 2640 if (result==EXCEPTION_CONTINUE_EXECUTION) return result; |
2650 } | 2641 } |
2651 #endif //_WIN64 | |
2652 } | 2642 } |
2653 | 2643 |
2654 if (exception_code != EXCEPTION_BREAKPOINT) { | 2644 if (exception_code != EXCEPTION_BREAKPOINT) { |
2655 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, | 2645 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, |
2656 exceptionInfo->ContextRecord); | 2646 exceptionInfo->ContextRecord); |