src/os/windows/vm/os_windows.cpp
Print this page
*** 2353,2362 ****
--- 2353,2391 ----
// If UseOsErrorReporting, this will return here and save the error file
// somewhere where we can find it in the minidump.
}
+ bool os::win32::get_frame_at_stack_banging_point(JavaThread* thread,
+ struct _EXCEPTION_POINTERS* exceptionInfo, address pc, frame* fr) {
+ PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
+ address addr = (address) exceptionRecord->ExceptionInformation[1];
+ if (Interpreter::contains(pc)) {
+ *fr = os::fetch_frame_from_context((void*)exceptionInfo->ContextRecord);
+ assert(fr->safe_for_sender(thread), "Safety check");
+ } else {
+ // more complex code with compiled code
+ assert(!Interpreter::contains(pc), "Interpreted methods should have been handled above");
+ CodeBlob* cb = CodeCache::find_blob(pc);
+ if (cb == NULL || !cb->is_nmethod() || cb->is_frame_complete_at(pc)) {
+ // Not sure where the pc points to, fallback to default
+ // stack overflow handling
+ return false;
+ } else {
+ *fr = os::fetch_frame_from_context((void*)exceptionInfo->ContextRecord);
+ // in compiled code, the stack banging is performed just after the return pc
+ // has been pushed on the stack
+ *fr = frame(fr->sp() + 1, fr->fp(), (address)*(fr->sp()));
+ if (!fr->is_java_frame()) {
+ assert(fr->safe_for_sender(thread), "Safety check");
+ *fr = fr->java_sender();
+ }
+ }
+ }
+ return true;
+ }
+
//-----------------------------------------------------------------------------
LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH;
DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
#ifdef _M_IA64
*** 2529,2539 ****
return Handle_Exception(exceptionInfo,
SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
}
#endif
! if (thread->stack_yellow_zone_enabled()) {
// Yellow zone violation. The o/s has unprotected the first yellow
// zone page for us. Note: must call disable_stack_yellow_zone to
// update the enabled status, even if the zone contains only one page.
thread->disable_stack_yellow_zone();
// If not in java code, return and hope for the best.
--- 2558,2577 ----
return Handle_Exception(exceptionInfo,
SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
}
#endif
! if (thread->stack_guards_enabled()) {
! if (_thread_in_Java) {
! frame fr;
! PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
! address addr = (address) exceptionRecord->ExceptionInformation[1];
! if (os::win32::get_frame_at_stack_banging_point(thread, exceptionInfo, pc, &fr)) {
! assert(fr.is_java_frame(), "Must be a Java frame");
! SharedRuntime::look_for_reserved_stack_annotated_method(thread, fr);
! }
! }
// Yellow zone violation. The o/s has unprotected the first yellow
// zone page for us. Note: must call disable_stack_yellow_zone to
// update the enabled status, even if the zone contains only one page.
thread->disable_stack_yellow_zone();
// If not in java code, return and hope for the best.