src/cpu/mips/vm/macroAssembler_mips.cpp

changeset 9171
c67c94f5b85d
parent 9170
e9c6bf40f656
child 9205
cce12244eb8c
     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()));

mercurial