hotspot/src/os_cpu/linux_aarch64/vm/thread_linux_aarch64.cpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 29182 78af2a4d1ec3
child 40643 49539fc14e5a
permissions -rw-r--r--
8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive Summary: This optimization reduces the size of the RW region of the CDS archive. It also reduces the amount of pages in the RW region that are actually written into during runtime. Reviewed-by: dlong, iklam, jiangli Contributed-by: ioi.lam@oracle.com, calvin.cheung@oracle.com, goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29182
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
     1
/*
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
     2
 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
     3
 * Copyright (c) 2014, Red Hat Inc. All rights reserved.
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
     5
 *
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
     8
 * published by the Free Software Foundation.
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
     9
 *
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    14
 * accompanied this code).
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    15
 *
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    19
 *
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    22
 * questions.
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    23
 *
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    24
 */
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    25
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    26
#include "precompiled.hpp"
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 29182
diff changeset
    27
#include "memory/metaspaceShared.hpp"
29182
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    28
#include "runtime/frame.inline.hpp"
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    29
#include "runtime/thread.inline.hpp"
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    30
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    31
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    32
// currently interrupted by SIGPROF
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    33
bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr,
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    34
  void* ucontext, bool isInJava) {
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    35
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    36
  assert(Thread::current() == this, "caller must be current thread");
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    37
  return pd_get_top_frame(fr_addr, ucontext, isInJava);
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    38
}
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    39
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    40
bool JavaThread::pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava) {
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    41
  return pd_get_top_frame(fr_addr, ucontext, isInJava);
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    42
}
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    43
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    44
bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava) {
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    45
  assert(this->is_Java_thread(), "must be JavaThread");
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    46
  JavaThread* jt = (JavaThread *)this;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    47
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    48
  // If we have a last_Java_frame, then we should use it even if
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    49
  // isInJava == true.  It should be more reliable than ucontext info.
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    50
  if (jt->has_last_Java_frame()) {
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    51
    *fr_addr = jt->pd_last_frame();
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    52
    return true;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    53
  }
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    54
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    55
  // At this point, we don't have a last_Java_frame, so
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    56
  // we try to glean some information out of the ucontext
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    57
  // if we were running Java code when SIGPROF came in.
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    58
  if (isInJava) {
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    59
    ucontext_t* uc = (ucontext_t*) ucontext;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    60
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    61
    intptr_t* ret_fp;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    62
    intptr_t* ret_sp;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    63
    ExtendedPC addr = os::Linux::fetch_frame_from_ucontext(this, uc,
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    64
      &ret_sp, &ret_fp);
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    65
    if (addr.pc() == NULL || ret_sp == NULL ) {
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    66
      // ucontext wasn't useful
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    67
      return false;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    68
    }
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    69
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 29182
diff changeset
    70
#if INCLUDE_CDS
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 29182
diff changeset
    71
    if (UseSharedSpaces && MetaspaceShared::is_in_shared_region(addr.pc(), MetaspaceShared::md)) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 29182
diff changeset
    72
      // In the middle of a trampoline call. Bail out for safety.
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 29182
diff changeset
    73
      // This happens rarely so shouldn't affect profiling.
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 29182
diff changeset
    74
      return false;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 29182
diff changeset
    75
    }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 29182
diff changeset
    76
#endif
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 29182
diff changeset
    77
29182
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    78
    frame ret_frame(ret_sp, ret_fp, addr.pc());
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    79
    if (!ret_frame.safe_for_sender(jt)) {
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    80
#ifdef COMPILER2
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    81
      frame ret_frame2(ret_sp, NULL, addr.pc());
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    82
      if (!ret_frame2.safe_for_sender(jt)) {
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    83
        // nothing else to try if the frame isn't good
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    84
        return false;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    85
      }
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    86
      ret_frame = ret_frame2;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    87
#else
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    88
      // nothing else to try if the frame isn't good
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    89
      return false;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    90
#endif /* COMPILER2 */
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    91
    }
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    92
    *fr_addr = ret_frame;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    93
    return true;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    94
  }
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    95
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    96
  // nothing else to try
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    97
  return false;
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    98
}
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
    99
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
   100
void JavaThread::cache_global_variables() { }
78af2a4d1ec3 8068055: AARCH64: os_cpu
aph
parents:
diff changeset
   101