< prev index next >
src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp
Print this page
rev 60629 : 8248656: Add Windows AArch64 platform support code
Reviewed-by:
Contributed-by: mbeckwit, luhenry, burban
@@ -352,10 +352,45 @@
StubRoutines::x86::get_previous_sp_entry());
return (*func)();
}
#endif
+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);
+ if (!fr->is_first_java_frame()) {
+ // get_frame_at_stack_banging_point() is only called when we
+ // have well defined stacks so java_sender() calls do not need
+ // to assert safe_for_sender() first.
+ *fr = fr->java_sender();
+ }
+ } 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 {
+ // in compiled code, the stack banging is performed just after the return pc
+ // has been pushed on the stack
+ intptr_t* fp = (intptr_t*)exceptionInfo->ContextRecord->REG_FP;
+ intptr_t* sp = (intptr_t*)exceptionInfo->ContextRecord->REG_SP;
+ *fr = frame(sp + 1, fp, (address)*sp);
+ if (!fr->is_java_frame()) {
+ // See java_sender() comment above.
+ *fr = fr->java_sender();
+ }
+ }
+ }
+ assert(fr->is_java_frame(), "Safety check");
+ return true;
+}
#ifndef AMD64
intptr_t* _get_previous_fp() {
intptr_t **frameptr;
__asm {
< prev index next >