src/hotspot/cpu/x86/rdtsc_x86.cpp
author stefank
Tue, 26 Nov 2019 10:47:46 +0100
changeset 59290 97d13893ec3c
parent 58095 adc72cd1d1f2
permissions -rw-r--r--
8234748: Clean up atomic and orderAccess includes Reviewed-by: dholmes
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"
59290
97d13893ec3c 8234748: Clean up atomic and orderAccess includes
stefank
parents: 58095
diff changeset
    27
#include "runtime/orderAccess.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "runtime/thread.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
#include "vm_version_ext_x86.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
// The following header contains the implementations of rdtsc()
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
#include OS_CPU_HEADER_INLINE(os)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
static jlong _epoch = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
static bool rdtsc_elapsed_counter_enabled = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
static jlong tsc_frequency = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
static jlong set_epoch() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
  assert(0 == _epoch, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
  _epoch = os::rdtsc();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
  return _epoch;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
// Base loop to estimate ticks frequency for tsc counter from user mode.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
// Volatiles and sleep() are used to prevent compiler from applying optimizations.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
static void do_time_measurements(volatile jlong& time_base,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
                                 volatile jlong& time_fast,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
                                 volatile jlong& time_base_elapsed,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
                                 volatile jlong& time_fast_elapsed) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  static const unsigned int FT_SLEEP_MILLISECS = 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
  const unsigned int loopcount = 3;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
  volatile jlong start = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
  volatile jlong fstart = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
  volatile jlong end = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
  volatile jlong fend = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
  // Figure out the difference between rdtsc and os provided timer.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
  // base algorithm adopted from JRockit.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
  for (unsigned int times = 0; times < loopcount; times++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
    start = os::elapsed_counter();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
    OrderAccess::fence();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
    fstart = os::rdtsc();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
    // use sleep to prevent compiler from optimizing
58095
adc72cd1d1f2 8230423: Move os::sleep to JavaThread::sleep
dholmes
parents: 58041
diff changeset
    66
    JavaThread::current()->sleep(FT_SLEEP_MILLISECS);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
    end = os::elapsed_counter();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
    OrderAccess::fence();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
    fend = os::rdtsc();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
    time_base += end - start;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
    time_fast += fend - fstart;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
    // basis for calculating the os tick start
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
    // to fast time tick start offset
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
    time_base_elapsed += end;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
    time_fast_elapsed += (fend - _epoch);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
  time_base /= loopcount;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
  time_fast /= loopcount;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
  time_base_elapsed /= loopcount;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
  time_fast_elapsed /= loopcount;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
static jlong initialize_frequency() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
  assert(0 == tsc_frequency, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
  assert(0 == _epoch, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
  const jlong initial_counter = set_epoch();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
  if (initial_counter == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
    return 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
  // os time frequency
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
  static double os_freq = (double)os::elapsed_frequency();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
  assert(os_freq > 0, "os_elapsed frequency corruption!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
  double tsc_freq = .0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
  double os_to_tsc_conv_factor = 1.0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
  // if platform supports invariant tsc,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
  // apply higher resolution and granularity for conversion calculations
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
  if (VM_Version_Ext::supports_tscinv_ext()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
    // for invariant tsc platforms, take the maximum qualified cpu frequency
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
    tsc_freq = (double)VM_Version_Ext::maximum_qualified_cpu_frequency();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
    os_to_tsc_conv_factor = tsc_freq / os_freq;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
  } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
    // use measurements to estimate
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
    // a conversion factor and the tsc frequency
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
    volatile jlong time_base = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
    volatile jlong time_fast = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
    volatile jlong time_base_elapsed = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
    volatile jlong time_fast_elapsed = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
    // do measurements to get base data
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
    // on os timer and fast ticks tsc time relation.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
    do_time_measurements(time_base, time_fast, time_base_elapsed, time_fast_elapsed);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
    // if invalid measurements, cannot proceed
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
    if (time_fast == 0 || time_base == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
      return 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
    os_to_tsc_conv_factor = (double)time_fast / (double)time_base;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
    if (os_to_tsc_conv_factor > 1) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
      // estimate on tsc counter frequency
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
      tsc_freq = os_to_tsc_conv_factor * os_freq;
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
  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
   133
    // safer to run with normal os time
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
    tsc_freq = .0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
  // frequency of the tsc_counter
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
  return (jlong)tsc_freq;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
static bool initialize_elapsed_counter() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
  tsc_frequency = initialize_frequency();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
  return tsc_frequency != 0 && _epoch != 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
static bool ergonomics() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
  const bool invtsc_support = Rdtsc::is_supported();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
  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
   149
    FLAG_SET_ERGO(UseFastUnorderedTimeStamps, true);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
  bool ft_enabled = UseFastUnorderedTimeStamps && invtsc_support;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
  if (!ft_enabled) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
    if (UseFastUnorderedTimeStamps && VM_Version::supports_tsc()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
      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
   157
        "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
   158
      ft_enabled = true;
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
  if (!ft_enabled) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
    // Warn if unable to support command-line flag
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
    if (UseFastUnorderedTimeStamps && !VM_Version::supports_tsc()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
      warning("Ignoring UseFastUnorderedTimeStamps, hardware does not support normal tsc");
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
  return ft_enabled;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
bool Rdtsc::is_supported() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
  return VM_Version_Ext::supports_tscinv_ext();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
bool Rdtsc::is_elapsed_counter_enabled() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
  return rdtsc_elapsed_counter_enabled;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
jlong Rdtsc::frequency() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
  return tsc_frequency;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
jlong Rdtsc::elapsed_counter() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
  return os::rdtsc() - _epoch;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
jlong Rdtsc::epoch() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
  return _epoch;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
jlong Rdtsc::raw() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
  return os::rdtsc();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
bool Rdtsc::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
  static bool initialized = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
  if (!initialized) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
    assert(!rdtsc_elapsed_counter_enabled, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    VM_Version_Ext::initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
    assert(0 == tsc_frequency, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
    assert(0 == _epoch, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
    bool result = initialize_elapsed_counter(); // init hw
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
    if (result) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
      result = ergonomics(); // check logical state
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
    rdtsc_elapsed_counter_enabled = result;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
    initialized = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
  return rdtsc_elapsed_counter_enabled;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
}