< prev index next >
src/os_cpu/linux_s390/vm/os_linux_s390.cpp
Print this page
rev 12273 : 8169317: [s390] Various minor bug fixes and adaptions.
@@ -169,10 +169,12 @@
}
}
}
frame os::current_frame() {
+ // Expected to return the stack pointer of this method.
+ // But if inlined, returns the stack pointer of our caller!
intptr_t* csp = (intptr_t*) *((intptr_t*) os::current_stack_pointer());
assert (csp != NULL, "sp should not be NULL");
// Pass a dummy pc. This way we don't have to load it from the
// stack, since we don't know in which slot we can find it.
frame topframe(csp, (address)0x8);
@@ -182,12 +184,17 @@
} else {
frame senderFrame = os::get_sender_for_C_frame(&topframe);
assert(senderFrame.pc() != NULL, "Sender pc should not be NULL");
// Return sender of sender of current topframe which hopefully
// both have pc != NULL.
+#ifdef _NMT_NOINLINE_ // Is set in slowdebug builds.
+ // Current_stack_pointer is not inlined, we must pop one more frame.
frame tmp = os::get_sender_for_C_frame(&topframe);
return os::get_sender_for_C_frame(&tmp);
+#else
+ return os::get_sender_for_C_frame(&topframe);
+#endif
}
}
// Utility functions
@@ -372,11 +379,11 @@
else if (sig == SIGBUS) {
// BugId 4454115: A read from a MappedByteBuffer can fault here if the
// underlying file has been truncated. Do not crash the VM in such a case.
CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
- nmethod* nm = (cb != NULL && cb->is_nmethod()) ? (nmethod*)cb : NULL;
+ CompiledMethod* nm = (cb != NULL) ? cb->as_compiled_method_or_null() : NULL;
if (nm != NULL && nm->has_unsafe_access()) {
// We don't really need a stub here! Just set the pending exeption and
// continue at the next instruction after the faulting read. Returning
// garbage from this read is ok.
thread->set_pending_unsafe_access_error();
< prev index next >