< prev index next >
src/hotspot/cpu/aarch64/frame_aarch64.cpp
Print this page
rev 58072 : [mq]: v2
*** 74,93 ****
// interpreter frames the sender's SP saved in a frame might be less than
// the SP at the point of call.
// So unextended sp must be within the stack but we need not to check
// that unextended sp >= sp
!
! bool unextended_sp_safe = (unextended_sp < thread->stack_base());
!
! if (!unextended_sp_safe) {
return false;
}
// an fp must be within the stack and above (but not equal) sp
// second evaluation on fp+ is added to handle situation where fp is -1
! bool fp_safe = (fp < thread->stack_base() && (fp > sp) && (((fp + (return_addr_offset * sizeof(void*))) < thread->stack_base())));
// We know sp/unextended_sp are safe only fp is questionable here
// If the current frame is known to the code cache then we can attempt to
// to construct the sender and do some validation of it. This goes a long way
--- 74,91 ----
// interpreter frames the sender's SP saved in a frame might be less than
// the SP at the point of call.
// So unextended sp must be within the stack but we need not to check
// that unextended sp >= sp
! if (!thread->is_in_full_stack(unextended_sp)) {
return false;
}
// an fp must be within the stack and above (but not equal) sp
// second evaluation on fp+ is added to handle situation where fp is -1
! bool fp_safe = thread->is_in_stack_range_excl(fp, sp) &&
! thread->is_in_full_stack(fp + (return_addr_offset * sizeof(void*)));
// We know sp/unextended_sp are safe only fp is questionable here
// If the current frame is known to the code cache then we can attempt to
// to construct the sender and do some validation of it. This goes a long way
*** 145,155 ****
return false;
}
sender_sp = _unextended_sp + _cb->frame_size();
// Is sender_sp safe?
! if ((address)sender_sp >= thread->stack_base()) {
return false;
}
sender_unextended_sp = sender_sp;
sender_pc = (address) *(sender_sp-1);
// Note: frame::sender_sp_offset is only valid for compiled frame
--- 143,153 ----
return false;
}
sender_sp = _unextended_sp + _cb->frame_size();
// Is sender_sp safe?
! if (!thread->is_in_full_stack((address)sender_sp)) {
return false;
}
sender_unextended_sp = sender_sp;
sender_pc = (address) *(sender_sp-1);
// Note: frame::sender_sp_offset is only valid for compiled frame
*** 162,174 ****
// fp is always saved in a recognizable place in any code we generate. However
// only if the sender is interpreted/call_stub (c1 too?) are we certain that the saved fp
// is really a frame pointer.
! bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp);
!
! if (!saved_fp_safe) {
return false;
}
// construct the potential sender
--- 160,170 ----
// fp is always saved in a recognizable place in any code we generate. However
// only if the sender is interpreted/call_stub (c1 too?) are we certain that the saved fp
// is really a frame pointer.
! if (!thread->is_in_stack_range_excl((address)saved_fp, (address)sender_sp)) {
return false;
}
// construct the potential sender
*** 199,224 ****
return false;
}
// Could be the call_stub
if (StubRoutines::returns_to_call_stub(sender_pc)) {
! bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp);
!
! if (!saved_fp_safe) {
return false;
}
// construct the potential sender
frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
// Validate the JavaCallWrapper an entry frame must have
address jcw = (address)sender.entry_frame_call_wrapper();
! bool jcw_safe = (jcw < thread->stack_base()) && (jcw > (address)sender.fp());
!
! return jcw_safe;
}
CompiledMethod* nm = sender_blob->as_compiled_method_or_null();
if (nm != NULL) {
if (nm->is_deopt_mh_entry(sender_pc) || nm->is_deopt_entry(sender_pc) ||
--- 195,216 ----
return false;
}
// Could be the call_stub
if (StubRoutines::returns_to_call_stub(sender_pc)) {
! if (!thread->is_in_stack_range_excl((address)saved_fp, (address)sender_sp)) {
return false;
}
// construct the potential sender
frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
// Validate the JavaCallWrapper an entry frame must have
address jcw = (address)sender.entry_frame_call_wrapper();
! return thread->is_in_stack_range_excl(jcw, (address)sender.fp());
}
CompiledMethod* nm = sender_blob->as_compiled_method_or_null();
if (nm != NULL) {
if (nm->is_deopt_mh_entry(sender_pc) || nm->is_deopt_entry(sender_pc) ||
*** 555,569 ****
if (MetaspaceObj::is_valid(cp) == false) return false;
// validate locals
address locals = (address) *interpreter_frame_locals_addr();
!
! if (locals >= thread->stack_base() || locals < (address) fp()) return false;
!
! // We'd have to be pretty unlucky to be mislead at this point
! return true;
}
BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) {
assert(is_interpreted_frame(), "interpreted frame expected");
Method* method = interpreter_frame_method();
--- 547,557 ----
if (MetaspaceObj::is_valid(cp) == false) return false;
// validate locals
address locals = (address) *interpreter_frame_locals_addr();
! return thread->is_in_stack_range_incl(locals, (address)fp());
}
BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) {
assert(is_interpreted_frame(), "interpreted frame expected");
Method* method = interpreter_frame_method();
< prev index next >