< prev index next >
src/hotspot/cpu/arm/frame_arm.cpp
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 55,88 ****
bool frame::safe_for_sender(JavaThread *thread) {
address sp = (address)_sp;
address fp = (address)_fp;
address unextended_sp = (address)_unextended_sp;
! static size_t stack_guard_size = os::uses_stack_guard_pages() ?
! (JavaThread::stack_red_zone_size() + JavaThread::stack_yellow_zone_size()) : 0;
! size_t usable_stack_size = thread->stack_size() - stack_guard_size;
!
// sp must be within the usable part of the stack (not in guards)
! bool sp_safe = (sp != NULL &&
! (sp <= thread->stack_base()) &&
! (sp >= thread->stack_base() - usable_stack_size));
!
! if (!sp_safe) {
return false;
}
bool unextended_sp_safe = (unextended_sp != NULL &&
! (unextended_sp <= thread->stack_base()) &&
(unextended_sp >= sp));
if (!unextended_sp_safe) {
return false;
}
// We know sp/unextended_sp are safe. Only fp is questionable here.
bool fp_safe = (fp != NULL &&
! (fp <= thread->stack_base()) &&
fp >= sp);
if (_cb != NULL ) {
// First check if frame is complete and tester is reliable
--- 55,81 ----
bool frame::safe_for_sender(JavaThread *thread) {
address sp = (address)_sp;
address fp = (address)_fp;
address unextended_sp = (address)_unextended_sp;
! // consider stack guards when trying to determine "safe" stack pointers
// sp must be within the usable part of the stack (not in guards)
! if (!thread->is_in_usable_stack(sp)) {
return false;
}
bool unextended_sp_safe = (unextended_sp != NULL &&
! (unextended_sp < thread->stack_base()) &&
(unextended_sp >= sp));
if (!unextended_sp_safe) {
return false;
}
// We know sp/unextended_sp are safe. Only fp is questionable here.
bool fp_safe = (fp != NULL &&
! (fp < thread->stack_base()) &&
fp >= sp);
if (_cb != NULL ) {
// First check if frame is complete and tester is reliable
*** 146,156 ****
// 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.
intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset + link_offset);
! bool saved_fp_safe = ((address)saved_fp <= thread->stack_base()) && (saved_fp > sender_sp);
if (!saved_fp_safe) {
return false;
}
--- 139,149 ----
// 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.
intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset + link_offset);
! bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp);
if (!saved_fp_safe) {
return false;
}
*** 176,186 ****
}
// Could be the call_stub
if (StubRoutines::returns_to_call_stub(sender_pc)) {
intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset + link_offset);
! bool saved_fp_safe = ((address)saved_fp <= thread->stack_base()) && (saved_fp >= sender_sp);
if (!saved_fp_safe) {
return false;
}
--- 169,179 ----
}
// Could be the call_stub
if (StubRoutines::returns_to_call_stub(sender_pc)) {
intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset + link_offset);
! bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp >= sender_sp);
if (!saved_fp_safe) {
return false;
}
*** 189,199 ****
frame sender(sender_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;
}
// If the frame size is 0 something (or less) is bad because every nmethod has a non-zero frame size
--- 182,192 ----
frame sender(sender_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;
}
// If the frame size is 0 something (or less) is bad because every nmethod has a non-zero frame size
*** 499,509 ****
// 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;
}
--- 492,502 ----
// 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;
}
< prev index next >