Andreas Wacknitz
2024-01-27 9a6458b68a833ac3c968ac953949a8dc833c2b77
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
--- a/src/hotspot/os_cpu/solaris_x86/os_solaris_x86.cpp    Fri Oct 16 12:20:06 2020
+++ b/src/hotspot/os_cpu/solaris_x86/os_solaris_x86.cpp    Fri Oct 16 14:58:59 2020
@@ -224,42 +224,12 @@
   return frame(sp, fp, epc);
 }
 
-bool os::Solaris::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t* uc, frame* fr) {
- address pc = (address) os::Solaris::ucontext_get_pc(uc);
-  if (Interpreter::contains(pc)) {
-    // interpreter performs stack banging after the fixed frame header has
-    // been generated while the compilers perform it before. To maintain
-    // semantic consistency between interpreted and compiled frames, the
-    // method returns the Java sender of the current frame.
-    *fr = os::fetch_frame_from_context(uc);
-    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 = os::Solaris::ucontext_get_fp(uc);
-      intptr_t* sp = os::Solaris::ucontext_get_sp(uc);
-      *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;
+frame os::fetch_compiled_frame_from_context(const void* ucVoid) {
+  const ucontext_t* uc = (const ucontext_t*)ucVoid;
+  frame fr = os::fetch_frame_from_context(uc);
+  // in compiled code, the stack banging is performed just after the return pc
+  // has been pushed on the stack
+  return frame(fr.sp() + 1, fr.fp(), (address)*(fr.sp()));
 }
 
 frame os::get_sender_for_C_frame(frame* fr) {
@@ -459,39 +429,8 @@
     // Handle ALL stack overflow variations here
     if (sig == SIGSEGV && info->si_code == SEGV_ACCERR) {
       address addr = (address) info->si_addr;
-      if (thread->in_stack_yellow_reserved_zone(addr)) {
-        if (thread->thread_state() == _thread_in_Java) {
-          if (thread->in_stack_reserved_zone(addr)) {
-            frame fr;
-            if (os::Solaris::get_frame_at_stack_banging_point(thread, uc, &fr)) {
-              assert(fr.is_java_frame(), "Must be Java frame");
-              frame activation = SharedRuntime::look_for_reserved_stack_annotated_method(thread, fr);
-              if (activation.sp() != NULL) {
-                thread->disable_stack_reserved_zone();
-                if (activation.is_interpreted_frame()) {
-                  thread->set_reserved_stack_activation((address)(
-                    activation.fp() + frame::interpreter_frame_initial_sp_offset));
-                } else {
-                  thread->set_reserved_stack_activation((address)activation.unextended_sp());
-                }
-                return true;
-              }
-            }
-          }
-          // Throw a stack overflow exception.  Guard pages will be reenabled
-          // while unwinding the stack.
-          thread->disable_stack_yellow_reserved_zone();
-          stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW);
-        } else {
-          // Thread was in the vm or native code.  Return and try to finish.
-          thread->disable_stack_yellow_reserved_zone();
-          return true;
-        }
-      } else if (thread->in_stack_red_zone(addr)) {
-        // Fatal red zone violation.  Disable the guard pages and fall through
-        // to handle_unexpected_exception way down below.
-        thread->disable_stack_red_zone();
-        tty->print_raw_cr("An irrecoverable stack overflow has occurred.");
+      if (os::Posix::handle_stack_overflow(thread, addr, pc, uc, &stub)) {
+        return 1; // continue
       }
     }