Path: blob/master/src/hotspot/os_cpu/linux_s390/thread_linux_s390.cpp
64440 views
/*1* Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved.2* Copyright (c) 2016, 2022 SAP SE. All rights reserved.3* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.4*5* This code is free software; you can redistribute it and/or modify it6* under the terms of the GNU General Public License version 2 only, as7* published by the Free Software Foundation.8*9* This code is distributed in the hope that it will be useful, but WITHOUT10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License12* version 2 for more details (a copy is included in the LICENSE file that13* accompanied this code).14*15* You should have received a copy of the GNU General Public License version16* 2 along with this work; if not, write to the Free Software Foundation,17* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.18*19* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA20* or visit www.oracle.com if you need additional information or have any21* questions.22*23*/2425#include "precompiled.hpp"26#include "memory/metaspace.hpp"27#include "runtime/frame.inline.hpp"28#include "runtime/thread.hpp"2930frame JavaThread::pd_last_frame() {31assert(has_last_Java_frame(), "must have last_Java_sp() when suspended");3233intptr_t* sp = last_Java_sp();34address pc = _anchor.last_Java_pc();3536// Last_Java_pc ist not set if we come here from compiled code.37// Assume spill slot for Z_R14 (return register) contains a suitable pc.38// Should have been filled by method entry code.39if (pc == NULL) {40pc = (address) *(sp + 14);41}4243return frame(sp, pc);44}4546bool JavaThread::pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava) {4748// If we have a last_Java_frame, then we should use it even if49// isInJava == true. It should be more reliable than ucontext info.50if (has_last_Java_frame() && frame_anchor()->walkable()) {51*fr_addr = pd_last_frame();52return true;53}5455// At this point, we don't have a last_Java_frame, so56// we try to glean some information out of the ucontext57// if we were running Java code when SIGPROF came in.58if (isInJava) {59ucontext_t* uc = (ucontext_t*) ucontext;60address pc = (address)uc->uc_mcontext.psw.addr;6162if (pc == NULL) {63// ucontext wasn't useful64return false;65}6667frame ret_frame((intptr_t*)uc->uc_mcontext.gregs[15/*Z_SP*/], pc);6869if (ret_frame.fp() == NULL) {70// The found frame does not have a valid frame pointer.71// Bail out because this will create big trouble later on, either72// - when using istate, calculated as (NULL - z_ijava_state_size (= 0x70 (dbg) or 0x68 (rel)) or73// - when using fp() directly in safe_for_sender()74//75// There is no conclusive description (yet) how this could happen, but it does:76//77// We observed a SIGSEGV with the following stack trace (openjdk.jdk11u-dev, 2021-07-07, linuxs390x fastdebug)78// V [libjvm.so+0x12c8f12] JavaThread::pd_get_top_frame_for_profiling(frame*, void*, bool)+0x14279// V [libjvm.so+0xb1020c] JfrGetCallTrace::get_topframe(void*, frame&)+0x3c80// V [libjvm.so+0xba0b08] OSThreadSampler::protected_task(os::SuspendedThreadTaskContext const&)+0x9881// V [libjvm.so+0xff33c4] os::SuspendedThreadTask::internal_do_task()+0x14c82// V [libjvm.so+0xfe3c9c] os::SuspendedThreadTask::run()+0x2483// V [libjvm.so+0xba0c66] JfrThreadSampleClosure::sample_thread_in_java(JavaThread*, JfrStackFrame*, unsigned int)+0x6684// V [libjvm.so+0xba1718] JfrThreadSampleClosure::do_sample_thread(JavaThread*, JfrStackFrame*, unsigned int, JfrSampleType)+0x27885// V [libjvm.so+0xba4f54] JfrThreadSampler::task_stacktrace(JfrSampleType, JavaThread**) [clone .constprop.62]+0x28486// V [libjvm.so+0xba5e54] JfrThreadSampler::run()+0x2ec87// V [libjvm.so+0x12adc9c] Thread::call_run()+0x9c88// V [libjvm.so+0xff5ab0] thread_native_entry(Thread*)+0x12889// siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0xfffffffffffff00090// failing instruction: e320 6008 0004 LG r2,8(r0,r6)91// contents of r6: 0xffffffffffffff9092//93// Here is the sequence of what happens:94// - ret_frame is constructed with _fp == NULL (for whatever reason)95// - ijava_state_unchecked() calculates it's result as96// istate = fp() - z_ijava_state_size() = NULL - 0x68 DEBUG_ONLY(-8)97// - istate->method dereferences memory at offset 8 from istate98return false;99}100101if (ret_frame.is_interpreted_frame()) {102frame::z_ijava_state* istate = ret_frame.ijava_state_unchecked();103if (!is_in_full_stack((address)istate)) {104return false;105}106const Method *m = (const Method*)(istate->method);107if (!Method::is_valid_method(m)) return false;108if (!Metaspace::contains(m->constMethod())) return false;109110uint64_t reg_bcp = uc->uc_mcontext.gregs[13/*Z_BCP*/];111uint64_t istate_bcp = istate->bcp;112uint64_t code_start = (uint64_t)(m->code_base());113uint64_t code_end = (uint64_t)(m->code_base() + m->code_size());114if (istate_bcp >= code_start && istate_bcp < code_end) {115// we have a valid bcp, don't touch it, do nothing116} else if (reg_bcp >= code_start && reg_bcp < code_end) {117istate->bcp = reg_bcp;118} else {119return false;120}121}122if (!ret_frame.safe_for_sender(this)) {123// nothing else to try if the frame isn't good124return false;125}126*fr_addr = ret_frame;127return true;128}129// nothing else to try130return false;131}132133// Forte Analyzer AsyncGetCallTrace profiling support.134bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr, void* ucontext, bool isInJava) {135return pd_get_top_frame_for_profiling(fr_addr, ucontext, isInJava);136}137138void JavaThread::cache_global_variables() { }139140141