vm_version.cpp revision 5965:bdd155477289
1/*
2 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. 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 it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 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 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "memory/universe.hpp"
27#include "oops/oop.inline.hpp"
28#include "runtime/arguments.hpp"
29#ifdef TARGET_ARCH_x86
30# include "vm_version_x86.hpp"
31#endif
32#ifdef TARGET_ARCH_sparc
33# include "vm_version_sparc.hpp"
34#endif
35#ifdef TARGET_ARCH_zero
36# include "vm_version_zero.hpp"
37#endif
38#ifdef TARGET_ARCH_arm
39# include "vm_version_arm.hpp"
40#endif
41#ifdef TARGET_ARCH_ppc
42# include "vm_version_ppc.hpp"
43#endif
44
45const char* Abstract_VM_Version::_s_vm_release = Abstract_VM_Version::vm_release();
46const char* Abstract_VM_Version::_s_internal_vm_info_string = Abstract_VM_Version::internal_vm_info_string();
47bool Abstract_VM_Version::_supports_cx8 = false;
48bool Abstract_VM_Version::_supports_atomic_getset4 = false;
49bool Abstract_VM_Version::_supports_atomic_getset8 = false;
50bool Abstract_VM_Version::_supports_atomic_getadd4 = false;
51bool Abstract_VM_Version::_supports_atomic_getadd8 = false;
52unsigned int Abstract_VM_Version::_logical_processors_per_package = 1U;
53int Abstract_VM_Version::_reserve_for_allocation_prefetch = 0;
54
55#ifndef HOTSPOT_RELEASE_VERSION
56  #error HOTSPOT_RELEASE_VERSION must be defined
57#endif
58#ifndef JRE_RELEASE_VERSION
59  #error JRE_RELEASE_VERSION must be defined
60#endif
61#ifndef HOTSPOT_BUILD_TARGET
62  #error HOTSPOT_BUILD_TARGET must be defined
63#endif
64
65#ifdef PRODUCT
66  #define VM_RELEASE HOTSPOT_RELEASE_VERSION
67#else
68  #define VM_RELEASE HOTSPOT_RELEASE_VERSION "-" HOTSPOT_BUILD_TARGET
69#endif
70
71// HOTSPOT_RELEASE_VERSION must follow the release version naming convention
72// <major_ver>.<minor_ver>-b<nn>[-<identifier>][-<debug_target>]
73int Abstract_VM_Version::_vm_major_version = 0;
74int Abstract_VM_Version::_vm_minor_version = 0;
75int Abstract_VM_Version::_vm_build_number = 0;
76bool Abstract_VM_Version::_initialized = false;
77int Abstract_VM_Version::_parallel_worker_threads = 0;
78bool Abstract_VM_Version::_parallel_worker_threads_initialized = false;
79
80void Abstract_VM_Version::initialize() {
81  if (_initialized) {
82    return;
83  }
84  char* vm_version = os::strdup(HOTSPOT_RELEASE_VERSION);
85
86  // Expecting the next vm_version format:
87  // <major_ver>.<minor_ver>-b<nn>[-<identifier>]
88  char* vm_major_ver = vm_version;
89  assert(isdigit(vm_major_ver[0]),"wrong vm major version number");
90  char* vm_minor_ver = strchr(vm_major_ver, '.');
91  assert(vm_minor_ver != NULL && isdigit(vm_minor_ver[1]),"wrong vm minor version number");
92  vm_minor_ver[0] = '\0'; // terminate vm_major_ver
93  vm_minor_ver += 1;
94  char* vm_build_num = strchr(vm_minor_ver, '-');
95  assert(vm_build_num != NULL && vm_build_num[1] == 'b' && isdigit(vm_build_num[2]),"wrong vm build number");
96  vm_build_num[0] = '\0'; // terminate vm_minor_ver
97  vm_build_num += 2;
98
99  _vm_major_version = atoi(vm_major_ver);
100  _vm_minor_version = atoi(vm_minor_ver);
101  _vm_build_number  = atoi(vm_build_num);
102
103  os::free(vm_version);
104  _initialized = true;
105}
106
107#if defined(_LP64)
108  #define VMLP "64-Bit "
109#else
110  #define VMLP ""
111#endif
112
113#ifndef VMTYPE
114  #ifdef TIERED
115    #define VMTYPE "Server"
116  #else // TIERED
117  #ifdef ZERO
118  #ifdef SHARK
119    #define VMTYPE "Shark"
120  #else // SHARK
121    #define VMTYPE "Zero"
122  #endif // SHARK
123  #else // ZERO
124     #define VMTYPE COMPILER1_PRESENT("Client")   \
125                    COMPILER2_PRESENT("Server")
126  #endif // ZERO
127  #endif // TIERED
128#endif
129
130#ifndef HOTSPOT_VM_DISTRO
131  #error HOTSPOT_VM_DISTRO must be defined
132#endif
133#define VMNAME HOTSPOT_VM_DISTRO " " VMLP EMBEDDED_ONLY("Embedded ") VMTYPE " VM"
134
135const char* Abstract_VM_Version::vm_name() {
136  return VMNAME;
137}
138
139
140const char* Abstract_VM_Version::vm_vendor() {
141#ifdef VENDOR
142  return XSTR(VENDOR);
143#else
144  return JDK_Version::is_gte_jdk17x_version() ?
145    "Oracle Corporation" : "Sun Microsystems Inc.";
146#endif
147}
148
149
150const char* Abstract_VM_Version::vm_info_string() {
151  switch (Arguments::mode()) {
152    case Arguments::_int:
153      return UseSharedSpaces ? "interpreted mode, sharing" : "interpreted mode";
154    case Arguments::_mixed:
155      return UseSharedSpaces ? "mixed mode, sharing"       :  "mixed mode";
156    case Arguments::_comp:
157      return UseSharedSpaces ? "compiled mode, sharing"    : "compiled mode";
158  };
159  ShouldNotReachHere();
160  return "";
161}
162
163// NOTE: do *not* use stringStream. this function is called by
164//       fatal error handler. if the crash is in native thread,
165//       stringStream cannot get resource allocated and will SEGV.
166const char* Abstract_VM_Version::vm_release() {
167  return VM_RELEASE;
168}
169
170// NOTE: do *not* use stringStream. this function is called by
171//       fatal error handlers. if the crash is in native thread,
172//       stringStream cannot get resource allocated and will SEGV.
173const char* Abstract_VM_Version::jre_release_version() {
174  return JRE_RELEASE_VERSION;
175}
176
177#define OS       LINUX_ONLY("linux")             \
178                 WINDOWS_ONLY("windows")         \
179                 SOLARIS_ONLY("solaris")         \
180                 AIX_ONLY("aix")                 \
181                 BSD_ONLY("bsd")
182
183#ifdef ZERO
184#define CPU      ZERO_LIBARCH
185#else
186#define CPU      IA32_ONLY("x86")                \
187                 IA64_ONLY("ia64")               \
188                 AMD64_ONLY("amd64")             \
189                 ARM_ONLY("arm")                 \
190                 PPC32_ONLY("ppc")               \
191                 PPC64_ONLY("ppc64")             \
192                 SPARC_ONLY("sparc")
193#endif // ZERO
194
195const char *Abstract_VM_Version::vm_platform_string() {
196  return OS "-" CPU;
197}
198
199const char* Abstract_VM_Version::internal_vm_info_string() {
200  #ifndef HOTSPOT_BUILD_USER
201    #define HOTSPOT_BUILD_USER unknown
202  #endif
203
204  #ifndef HOTSPOT_BUILD_COMPILER
205    #ifdef _MSC_VER
206      #if   _MSC_VER == 1100
207        #define HOTSPOT_BUILD_COMPILER "MS VC++ 5.0"
208      #elif _MSC_VER == 1200
209        #define HOTSPOT_BUILD_COMPILER "MS VC++ 6.0"
210      #elif _MSC_VER == 1310
211        #define HOTSPOT_BUILD_COMPILER "MS VC++ 7.1 (VS2003)"
212      #elif _MSC_VER == 1400
213        #define HOTSPOT_BUILD_COMPILER "MS VC++ 8.0 (VS2005)"
214      #elif _MSC_VER == 1500
215        #define HOTSPOT_BUILD_COMPILER "MS VC++ 9.0 (VS2008)"
216      #elif _MSC_VER == 1600
217        #define HOTSPOT_BUILD_COMPILER "MS VC++ 10.0 (VS2010)"
218      #elif _MSC_VER == 1700
219        #define HOTSPOT_BUILD_COMPILER "MS VC++ 11.0 (VS2012)"
220      #else
221        #define HOTSPOT_BUILD_COMPILER "unknown MS VC++:" XSTR(_MSC_VER)
222      #endif
223    #elif defined(__SUNPRO_CC)
224      #if   __SUNPRO_CC == 0x420
225        #define HOTSPOT_BUILD_COMPILER "Workshop 4.2"
226      #elif __SUNPRO_CC == 0x500
227        #define HOTSPOT_BUILD_COMPILER "Workshop 5.0 compat=" XSTR(__SUNPRO_CC_COMPAT)
228      #elif __SUNPRO_CC == 0x520
229        #define HOTSPOT_BUILD_COMPILER "Workshop 5.2 compat=" XSTR(__SUNPRO_CC_COMPAT)
230      #elif __SUNPRO_CC == 0x580
231        #define HOTSPOT_BUILD_COMPILER "Workshop 5.8"
232      #elif __SUNPRO_CC == 0x590
233        #define HOTSPOT_BUILD_COMPILER "Workshop 5.9"
234      #elif __SUNPRO_CC == 0x5100
235        #define HOTSPOT_BUILD_COMPILER "Sun Studio 12u1"
236      #else
237        #define HOTSPOT_BUILD_COMPILER "unknown Workshop:" XSTR(__SUNPRO_CC)
238      #endif
239    #elif defined(__GNUC__)
240        #define HOTSPOT_BUILD_COMPILER "gcc " __VERSION__
241    #elif defined(__IBMCPP__)
242        #define HOTSPOT_BUILD_COMPILER "xlC " XSTR(__IBMCPP__)
243
244    #else
245      #define HOTSPOT_BUILD_COMPILER "unknown compiler"
246    #endif
247  #endif
248
249  #ifndef FLOAT_ARCH
250    #if defined(__SOFTFP__)
251      #define FLOAT_ARCH_STR "-sflt"
252    #elif defined(E500V2)
253      #define FLOAT_ARCH_STR "-e500v2"
254    #elif defined(ARM)
255      #define FLOAT_ARCH_STR "-vfp"
256    #elif defined(PPC32)
257      #define FLOAT_ARCH_STR "-hflt"
258    #else
259      #define FLOAT_ARCH_STR ""
260    #endif
261  #else
262    #define FLOAT_ARCH_STR XSTR(FLOAT_ARCH)
263  #endif
264
265  return VMNAME " (" VM_RELEASE ") for " OS "-" CPU FLOAT_ARCH_STR
266         " JRE (" JRE_RELEASE_VERSION "), built on " __DATE__ " " __TIME__
267         " by " XSTR(HOTSPOT_BUILD_USER) " with " HOTSPOT_BUILD_COMPILER;
268}
269
270const char *Abstract_VM_Version::vm_build_user() {
271  return HOTSPOT_BUILD_USER;
272}
273
274unsigned int Abstract_VM_Version::jvm_version() {
275  return ((Abstract_VM_Version::vm_major_version() & 0xFF) << 24) |
276         ((Abstract_VM_Version::vm_minor_version() & 0xFF) << 16) |
277         (Abstract_VM_Version::vm_build_number() & 0xFF);
278}
279
280
281void VM_Version_init() {
282  VM_Version::initialize();
283
284#ifndef PRODUCT
285  if (PrintMiscellaneous && Verbose) {
286    os::print_cpu_info(tty);
287  }
288#endif
289}
290
291unsigned int Abstract_VM_Version::nof_parallel_worker_threads(
292                                                      unsigned int num,
293                                                      unsigned int den,
294                                                      unsigned int switch_pt) {
295  if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
296    assert(ParallelGCThreads == 0, "Default ParallelGCThreads is not 0");
297    // For very large machines, there are diminishing returns
298    // for large numbers of worker threads.  Instead of
299    // hogging the whole system, use a fraction of the workers for every
300    // processor after the first 8.  For example, on a 72 cpu machine
301    // and a chosen fraction of 5/8
302    // use 8 + (72 - 8) * (5/8) == 48 worker threads.
303    unsigned int ncpus = (unsigned int) os::active_processor_count();
304    return (ncpus <= switch_pt) ?
305           ncpus :
306          (switch_pt + ((ncpus - switch_pt) * num) / den);
307  } else {
308    return ParallelGCThreads;
309  }
310}
311
312unsigned int Abstract_VM_Version::calc_parallel_worker_threads() {
313  return nof_parallel_worker_threads(5, 8, 8);
314}
315
316
317// Does not set the _initialized flag since it is
318// a global flag.
319unsigned int Abstract_VM_Version::parallel_worker_threads() {
320  if (!_parallel_worker_threads_initialized) {
321    if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
322      _parallel_worker_threads = VM_Version::calc_parallel_worker_threads();
323    } else {
324      _parallel_worker_threads = ParallelGCThreads;
325    }
326    _parallel_worker_threads_initialized = true;
327  }
328  return _parallel_worker_threads;
329}
330