src/hotspot/cpu/x86/rdtsc_x86.cpp
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58095 adc72cd1d1f2
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
58041
d8902e9c307c 8230422: Convert uninterruptible os::sleep calls to os::naked_short_sleep
dholmes
parents: 54983
diff changeset
     2
 * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
#include "precompiled.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
#include "rdtsc_x86.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
#include "runtime/thread.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "vm_version_ext_x86.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
// The following header contains the implementations of rdtsc()
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
#include OS_CPU_HEADER_INLINE(os)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
static jlong _epoch = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
static bool rdtsc_elapsed_counter_enabled = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
static jlong tsc_frequency = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
static jlong set_epoch() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
  assert(0 == _epoch, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
  _epoch = os::rdtsc();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
  return _epoch;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
// Base loop to estimate ticks frequency for tsc counter from user mode.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
// Volatiles and sleep() are used to prevent compiler from applying optimizations.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
static void do_time_measurements(volatile jlong& time_base,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
                                 volatile jlong& time_fast,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
                                 volatile jlong& time_base_elapsed,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
                                 volatile jlong& time_fast_elapsed) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
  static const unsigned int FT_SLEEP_MILLISECS = 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  const unsigned int loopcount = 3;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
  volatile jlong start = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
  volatile jlong fstart = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
  volatile jlong end = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
  volatile jlong fend = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
  // Figure out the difference between rdtsc and os provided timer.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
  // base algorithm adopted from JRockit.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
  for (unsigned int times = 0; times < loopcount; times++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
    start = os::elapsed_counter();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
    OrderAccess::fence();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
    fstart = os::rdtsc();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
    // use sleep to prevent compiler from optimizing
58095
adc72cd1d1f2 8230423: Move os::sleep to JavaThread::sleep
dholmes
parents: 58041
diff changeset
    65
    JavaThread::current()->sleep(FT_SLEEP_MILLISECS);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
    end = os::elapsed_counter();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
    OrderAccess::fence();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
    fend = os::rdtsc();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
    time_base += end - start;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
    time_fast += fend - fstart;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
    // basis for calculating the os tick start
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
    // to fast time tick start offset
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
    time_base_elapsed += end;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
    time_fast_elapsed += (fend - _epoch);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
  time_base /= loopcount;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
  time_fast /= loopcount;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
  time_base_elapsed /= loopcount;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
  time_fast_elapsed /= loopcount;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
static jlong initialize_frequency() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
  assert(0 == tsc_frequency, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
  assert(0 == _epoch, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
  const jlong initial_counter = set_epoch();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
  if (initial_counter == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
    return 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
  // os time frequency
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
  static double os_freq = (double)os::elapsed_frequency();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
  assert(os_freq > 0, "os_elapsed frequency corruption!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
  double tsc_freq = .0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
  double os_to_tsc_conv_factor = 1.0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
  // if platform supports invariant tsc,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
  // apply higher resolution and granularity for conversion calculations
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
  if (VM_Version_Ext::supports_tscinv_ext()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
    // for invariant tsc platforms, take the maximum qualified cpu frequency
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
    tsc_freq = (double)VM_Version_Ext::maximum_qualified_cpu_frequency();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
    os_to_tsc_conv_factor = tsc_freq / os_freq;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
  } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
    // use measurements to estimate
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
    // a conversion factor and the tsc frequency
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
    volatile jlong time_base = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
    volatile jlong time_fast = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
    volatile jlong time_base_elapsed = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
    volatile jlong time_fast_elapsed = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
    // do measurements to get base data
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
    // on os timer and fast ticks tsc time relation.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
    do_time_measurements(time_base, time_fast, time_base_elapsed, time_fast_elapsed);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
    // if invalid measurements, cannot proceed
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
    if (time_fast == 0 || time_base == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
      return 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
    os_to_tsc_conv_factor = (double)time_fast / (double)time_base;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
    if (os_to_tsc_conv_factor > 1) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
      // estimate on tsc counter frequency
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
      tsc_freq = os_to_tsc_conv_factor * os_freq;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
  if ((tsc_freq < 0) || (tsc_freq > 0 && tsc_freq <= os_freq) || (os_to_tsc_conv_factor <= 1)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
    // safer to run with normal os time
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
    tsc_freq = .0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
  // frequency of the tsc_counter
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
  return (jlong)tsc_freq;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
static bool initialize_elapsed_counter() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
  tsc_frequency = initialize_frequency();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
  return tsc_frequency != 0 && _epoch != 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
static bool ergonomics() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
  const bool invtsc_support = Rdtsc::is_supported();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
  if (FLAG_IS_DEFAULT(UseFastUnorderedTimeStamps) && invtsc_support) {
54983
81becad91321 8224203: Remove need to specify type when using FLAG_SET macros
stefank
parents: 50113
diff changeset
   148
    FLAG_SET_ERGO(UseFastUnorderedTimeStamps, true);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
  bool ft_enabled = UseFastUnorderedTimeStamps && invtsc_support;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
  if (!ft_enabled) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
    if (UseFastUnorderedTimeStamps && VM_Version::supports_tsc()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
      warning("\nThe hardware does not support invariant tsc (INVTSC) register and/or cannot guarantee tsc synchronization between sockets at startup.\n"\
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
        "Values returned via rdtsc() are not guaranteed to be accurate, esp. when comparing values from cross sockets reads. Enabling UseFastUnorderedTimeStamps on non-invariant tsc hardware should be considered experimental.\n");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
      ft_enabled = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
  if (!ft_enabled) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
    // Warn if unable to support command-line flag
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
    if (UseFastUnorderedTimeStamps && !VM_Version::supports_tsc()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
      warning("Ignoring UseFastUnorderedTimeStamps, hardware does not support normal tsc");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
  return ft_enabled;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
bool Rdtsc::is_supported() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
  return VM_Version_Ext::supports_tscinv_ext();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
bool Rdtsc::is_elapsed_counter_enabled() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
  return rdtsc_elapsed_counter_enabled;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
jlong Rdtsc::frequency() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
  return tsc_frequency;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
jlong Rdtsc::elapsed_counter() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
  return os::rdtsc() - _epoch;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
jlong Rdtsc::epoch() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
  return _epoch;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
jlong Rdtsc::raw() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
  return os::rdtsc();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
bool Rdtsc::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
  static bool initialized = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
  if (!initialized) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
    assert(!rdtsc_elapsed_counter_enabled, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
    VM_Version_Ext::initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    assert(0 == tsc_frequency, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
    assert(0 == _epoch, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
    bool result = initialize_elapsed_counter(); // init hw
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
    if (result) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
      result = ergonomics(); // check logical state
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
    rdtsc_elapsed_counter_enabled = result;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
    initialized = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
  return rdtsc_elapsed_counter_enabled;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
}