< prev index next >

src/hotspot/os_cpu/linux_s390/thread_linux_s390.cpp

Print this page
rev 58071 : imported patch v1


  46 
  47   // If we have a last_Java_frame, then we should use it even if
  48   // isInJava == true.  It should be more reliable than ucontext info.
  49   if (has_last_Java_frame() && frame_anchor()->walkable()) {
  50     *fr_addr = pd_last_frame();
  51     return true;
  52   }
  53 
  54   if (isInJava) {
  55     ucontext_t* uc = (ucontext_t*) ucontext;
  56     frame ret_frame((intptr_t*)uc->uc_mcontext.gregs[15/*Z_SP*/],
  57                    (address)uc->uc_mcontext.psw.addr);
  58 
  59     if (ret_frame.pc() == NULL) {
  60       // ucontext wasn't useful
  61       return false;
  62     }
  63 
  64     if (ret_frame.is_interpreted_frame()) {
  65       frame::z_ijava_state* istate = ret_frame.ijava_state_unchecked();
  66       if (on_local_stack((address)istate)) {
  67         return false;
  68       }
  69       const Method *m = (const Method*)(istate->method);
  70       if (!Method::is_valid_method(m)) return false;
  71       if (!Metaspace::contains(m->constMethod())) return false;
  72 
  73       uint64_t reg_bcp = uc->uc_mcontext.gregs[13/*Z_BCP*/];
  74       uint64_t istate_bcp = istate->bcp;
  75       uint64_t code_start = (uint64_t)(m->code_base());
  76       uint64_t code_end = (uint64_t)(m->code_base() + m->code_size());
  77       if (istate_bcp >= code_start && istate_bcp < code_end) {
  78         // we have a valid bcp, don't touch it, do nothing
  79       } else if (reg_bcp >= code_start && reg_bcp < code_end) {
  80         istate->bcp = reg_bcp;
  81       } else {
  82         return false;
  83       }
  84     }
  85     if (!ret_frame.safe_for_sender(this)) {
  86       // nothing else to try if the frame isn't good


  46 
  47   // If we have a last_Java_frame, then we should use it even if
  48   // isInJava == true.  It should be more reliable than ucontext info.
  49   if (has_last_Java_frame() && frame_anchor()->walkable()) {
  50     *fr_addr = pd_last_frame();
  51     return true;
  52   }
  53 
  54   if (isInJava) {
  55     ucontext_t* uc = (ucontext_t*) ucontext;
  56     frame ret_frame((intptr_t*)uc->uc_mcontext.gregs[15/*Z_SP*/],
  57                    (address)uc->uc_mcontext.psw.addr);
  58 
  59     if (ret_frame.pc() == NULL) {
  60       // ucontext wasn't useful
  61       return false;
  62     }
  63 
  64     if (ret_frame.is_interpreted_frame()) {
  65       frame::z_ijava_state* istate = ret_frame.ijava_state_unchecked();
  66       if (is_in_full_stack((address)istate)) {
  67         return false;
  68       }
  69       const Method *m = (const Method*)(istate->method);
  70       if (!Method::is_valid_method(m)) return false;
  71       if (!Metaspace::contains(m->constMethod())) return false;
  72 
  73       uint64_t reg_bcp = uc->uc_mcontext.gregs[13/*Z_BCP*/];
  74       uint64_t istate_bcp = istate->bcp;
  75       uint64_t code_start = (uint64_t)(m->code_base());
  76       uint64_t code_end = (uint64_t)(m->code_base() + m->code_size());
  77       if (istate_bcp >= code_start && istate_bcp < code_end) {
  78         // we have a valid bcp, don't touch it, do nothing
  79       } else if (reg_bcp >= code_start && reg_bcp < code_end) {
  80         istate->bcp = reg_bcp;
  81       } else {
  82         return false;
  83       }
  84     }
  85     if (!ret_frame.safe_for_sender(this)) {
  86       // nothing else to try if the frame isn't good
< prev index next >