46 return pd_get_top_frame(fr_addr, ucontext, isInJava);
47 }
48
49 bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava) {
50
51 assert(this->is_Java_thread(), "must be JavaThread");
52
53 JavaThread* jt = (JavaThread *)this;
54
55 // If we have a last_Java_frame, then we should use it even if
56 // isInJava == true. It should be more reliable than CONTEXT info.
57 if (jt->has_last_Java_frame() && jt->frame_anchor()->walkable()) {
58 *fr_addr = jt->pd_last_frame();
59 return true;
60 }
61
62 // At this point, we don't have a last_Java_frame, so
63 // we try to glean some information out of the CONTEXT
64 // if we were running Java code when SIGPROF came in.
65 if (isInJava) {
66 CONTEXT* uc = (CONTEXT*)ucontext;
67
68 #ifdef AMD64
69 intptr_t* ret_fp = (intptr_t*) uc->Rbp;
70 intptr_t* ret_sp = (intptr_t*) uc->Rsp;
71 address addr = (address)uc->Rip;
72 #else
73 intptr_t* ret_fp = (intptr_t*) uc->Ebp;
74 intptr_t* ret_sp = (intptr_t*) uc->Esp;
75 address addr = (address)uc->Eip;
76 #endif // AMD64
77 if (addr == NULL || ret_sp == NULL ) {
78 // CONTEXT wasn't useful
79 return false;
80 }
81
82 if (MetaspaceShared::is_in_trampoline_frame(addr)) {
83 // In the middle of a trampoline call. Bail out for safety.
84 // This happens rarely so shouldn't affect profiling.
85 return false;
86 }
87
88 frame ret_frame(ret_sp, ret_fp, addr);
89 if (!ret_frame.safe_for_sender(jt)) {
90 #if COMPILER2_OR_JVMCI
91 // C2 and JVMCI use ebp as a general register see if NULL fp helps
92 frame ret_frame2(ret_sp, NULL, addr);
93 if (!ret_frame2.safe_for_sender(jt)) {
94 // nothing else to try if the frame isn't good
95 return false;
96 }
97 ret_frame = ret_frame2;
98 #else
99 // nothing else to try if the frame isn't good
100 return false;
101 #endif // COMPILER2_OR_JVMCI
102 }
103 *fr_addr = ret_frame;
104 return true;
105 }
106
107 // nothing else to try
108 return false;
109 }
110
111 void JavaThread::cache_global_variables() { }
|
46 return pd_get_top_frame(fr_addr, ucontext, isInJava);
47 }
48
49 bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava) {
50
51 assert(this->is_Java_thread(), "must be JavaThread");
52
53 JavaThread* jt = (JavaThread *)this;
54
55 // If we have a last_Java_frame, then we should use it even if
56 // isInJava == true. It should be more reliable than CONTEXT info.
57 if (jt->has_last_Java_frame() && jt->frame_anchor()->walkable()) {
58 *fr_addr = jt->pd_last_frame();
59 return true;
60 }
61
62 // At this point, we don't have a last_Java_frame, so
63 // we try to glean some information out of the CONTEXT
64 // if we were running Java code when SIGPROF came in.
65 if (isInJava) {
66 frame ret_frame = os::fetch_frame_from_context(ucontext);
67 if (ret_frame.pc() == NULL || ret_frame.sp() == NULL ) {
68 // CONTEXT wasn't useful
69 return false;
70 }
71
72 if (MetaspaceShared::is_in_trampoline_frame(ret_frame.pc())) {
73 // In the middle of a trampoline call. Bail out for safety.
74 // This happens rarely so shouldn't affect profiling.
75 return false;
76 }
77
78 if (!ret_frame.safe_for_sender(jt)) {
79 #if COMPILER2_OR_JVMCI
80 // C2 and JVMCI use ebp as a general register see if NULL fp helps
81 frame ret_frame2(ret_frame.sp(), NULL, ret_frame.pc());
82 if (!ret_frame2.safe_for_sender(jt)) {
83 // nothing else to try if the frame isn't good
84 return false;
85 }
86 ret_frame = ret_frame2;
87 #else
88 // nothing else to try if the frame isn't good
89 return false;
90 #endif // COMPILER2_OR_JVMCI
91 }
92 *fr_addr = ret_frame;
93 return true;
94 }
95
96 // nothing else to try
97 return false;
98 }
99
100 void JavaThread::cache_global_variables() { }
|