1.1 --- a/src/cpu/mips/vm/macroAssembler_mips.cpp Thu Jul 19 14:03:08 2018 +0800 1.2 +++ b/src/cpu/mips/vm/macroAssembler_mips.cpp Thu Jul 19 19:06:43 2018 +0800 1.3 @@ -1283,7 +1283,7 @@ 1.4 // discard thread and arguments 1.5 ld_ptr(SP, java_thread, in_bytes(JavaThread::last_Java_sp_offset())); 1.6 // reset last Java frame 1.7 - reset_last_Java_frame(java_thread, false, true); 1.8 + reset_last_Java_frame(java_thread, false); 1.9 1.10 check_and_handle_popframe(java_thread); 1.11 check_and_handle_earlyret(java_thread); 1.12 @@ -1426,7 +1426,7 @@ 1.13 call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint))); 1.14 } 1.15 */ 1.16 -void MacroAssembler::reset_last_Java_frame(Register java_thread, bool clear_fp, bool clear_pc) { 1.17 +void MacroAssembler::reset_last_Java_frame(Register java_thread, bool clear_fp) { 1.18 // determine java_thread register 1.19 if (!java_thread->is_valid()) { 1.20 #ifndef OPT_THREAD 1.21 @@ -1440,15 +1440,15 @@ 1.22 st_ptr(R0, java_thread, in_bytes(JavaThread::last_Java_sp_offset())); 1.23 // must clear fp, so that compiled frames are not confused; it is possible 1.24 // that we need it only for debugging 1.25 - if(clear_fp) 1.26 + if(clear_fp) { 1.27 st_ptr(R0, java_thread, in_bytes(JavaThread::last_Java_fp_offset())); 1.28 - 1.29 - if (clear_pc) 1.30 - st_ptr(R0, java_thread, in_bytes(JavaThread::last_Java_pc_offset())); 1.31 + } 1.32 + 1.33 + // Always clear the pc because it could have been set by make_walkable() 1.34 + st_ptr(R0, java_thread, in_bytes(JavaThread::last_Java_pc_offset())); 1.35 } 1.36 1.37 -void MacroAssembler::reset_last_Java_frame(bool clear_fp, 1.38 - bool clear_pc) { 1.39 +void MacroAssembler::reset_last_Java_frame(bool clear_fp) { 1.40 Register thread = TREG; 1.41 #ifndef OPT_THREAD 1.42 get_thread(thread); 1.43 @@ -1461,9 +1461,8 @@ 1.44 sd(R0, Address(thread, JavaThread::last_Java_fp_offset())); 1.45 } 1.46 1.47 - if (clear_pc) { 1.48 - sd(R0, Address(thread, JavaThread::last_Java_pc_offset())); 1.49 - } 1.50 + // Always clear the pc because it could have been set by make_walkable() 1.51 + sd(R0, Address(thread, JavaThread::last_Java_pc_offset())); 1.52 } 1.53 1.54 // Write serialization page so VM thread can do a pseudo remote membar. 1.55 @@ -1502,17 +1501,15 @@ 1.56 } 1.57 1.58 // last_java_fp is optional 1.59 - 1.60 if (last_java_fp->is_valid()) { 1.61 st_ptr(last_java_fp, java_thread, in_bytes(JavaThread::last_Java_fp_offset())); 1.62 } 1.63 1.64 // last_java_pc is optional 1.65 - 1.66 if (last_java_pc != NULL) { 1.67 - relocate(relocInfo::internal_pc_type); 1.68 + relocate(relocInfo::internal_word_type); 1.69 patchable_set48(AT, (long)last_java_pc); 1.70 - st_ptr(AT, java_thread, in_bytes(JavaThread::last_Java_pc_offset())); 1.71 + st_ptr(AT, java_thread, in_bytes(JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset())); 1.72 } 1.73 st_ptr(last_java_sp, java_thread, in_bytes(JavaThread::last_Java_sp_offset())); 1.74 } 1.75 @@ -1536,10 +1533,9 @@ 1.76 1.77 // last_java_pc is optional 1.78 if (last_java_pc != NULL) { 1.79 - Address java_pc(thread, 1.80 - JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset()); 1.81 - li(AT, (intptr_t)(last_java_pc)); 1.82 - sd(AT, java_pc); 1.83 + relocate(relocInfo::internal_word_type); 1.84 + patchable_set48(AT, (long)last_java_pc); 1.85 + st_ptr(AT, thread, in_bytes(JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset())); 1.86 } 1.87 1.88 sd(last_java_sp, Address(thread, JavaThread::last_Java_sp_offset()));