< prev index next >
src/os_cpu/linux_ppc/vm/thread_linux_ppc.cpp
Print this page
rev 9421 : 8231949: [PPC64, s390]: Make async profiling more reliable
Summary: Better checks if method from interpreter frame is valid.
Reviewed-by: rrich, ghaug, goetz
@@ -49,18 +49,19 @@
// ucontext wasn't useful
return false;
}
if (ret_frame.is_interpreted_frame()) {
- frame::ijava_state* istate = ret_frame.get_ijava_state();
- if (!((Method*)(istate->method))->is_metaspace_object()) {
- return false;
- }
+ frame::ijava_state *istate = ret_frame.get_ijava_state();
+ const Method *m = (const Method*)(istate->method);
+ if (m == NULL || !m->is_valid_method()) return false;
+ if (!Metaspace::contains((const void*)m)) return false;
+
uint64_t reg_bcp = uc->uc_mcontext.regs->gpr[14/*R14_bcp*/];
uint64_t istate_bcp = istate->bcp;
- uint64_t code_start = (uint64_t)(((Method*)(istate->method))->code_base());
- uint64_t code_end = (uint64_t)(((Method*)istate->method)->code_base() + ((Method*)istate->method)->code_size());
+ uint64_t code_start = (uint64_t)(m->code_base());
+ uint64_t code_end = (uint64_t)(m->code_base() + m->code_size());
if (istate_bcp >= code_start && istate_bcp < code_end) {
// we have a valid bcp, don't touch it, do nothing
} else if (reg_bcp >= code_start && reg_bcp < code_end) {
istate->bcp = reg_bcp;
} else {
< prev index next >