< 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 >