annotate src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp @ 3612:ed3ac862d22d

IdealGraphVisualizer: make Graal graph-to-text converter work again after last commit by copying properties that have the same value in the two input graphs groups to the newly created diff group's properties.
author Peter Hofer <peter.hofer@jku.at>
date Wed, 02 Nov 2011 17:27:31 +0100
parents c52cba2a3359
children 3d42f82cd811
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2247
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
2 * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 643
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 643
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 643
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
26 #include "runtime/os.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
27 #include "vm_version_sparc.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
28
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
29 # include <sys/auxv.h>
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
30 # include <sys/auxv_SPARC.h>
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31 # include <sys/systeminfo.h>
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
32 # include <kstat.h>
0
a61af66fc99e Initial load
duke
parents:
diff changeset
33
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
34 // We need to keep these here as long as we have to build on Solaris
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
35 // versions before 10.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
36 #ifndef SI_ARCHITECTURE_32
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
37 #define SI_ARCHITECTURE_32 516 /* basic 32-bit SI_ARCHITECTURE */
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
38 #endif
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
39
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
40 #ifndef SI_ARCHITECTURE_64
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
41 #define SI_ARCHITECTURE_64 517 /* basic 64-bit SI_ARCHITECTURE */
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
42 #endif
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
43
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
44 static void do_sysinfo(int si, const char* string, int* features, int mask) {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
45 char tmp;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
46 size_t bufsize = sysinfo(si, &tmp, 1);
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
47
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
48 // All SI defines used below must be supported.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
49 guarantee(bufsize != -1, "must be supported");
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
50
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
51 char* buf = (char*) malloc(bufsize);
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
52
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
53 if (buf == NULL)
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
54 return;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
55
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
56 if (sysinfo(si, buf, bufsize) == bufsize) {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
57 // Compare the string.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
58 if (strcmp(buf, string) == 0) {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
59 *features |= mask;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
60 }
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
61 }
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
62
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
63 free(buf);
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
64 }
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
65
0
a61af66fc99e Initial load
duke
parents:
diff changeset
66 int VM_Version::platform_features(int features) {
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
67 // getisax(2), SI_ARCHITECTURE_32, and SI_ARCHITECTURE_64 are
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
68 // supported on Solaris 10 and later.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
69 if (os::Solaris::supports_getisax()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
71 // Check 32-bit architecture.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
72 do_sysinfo(SI_ARCHITECTURE_32, "sparc", &features, v8_instructions_m);
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
73
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
74 // Check 64-bit architecture.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
75 do_sysinfo(SI_ARCHITECTURE_64, "sparcv9", &features, generic_v9_m);
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
76
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
77 // Extract valid instruction set extensions.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
78 uint_t av;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
79 uint_t avn = os::Solaris::getisax(&av, 1);
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
80 assert(avn == 1, "should only return one av");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
82 #ifndef PRODUCT
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
83 if (PrintMiscellaneous && Verbose)
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
84 tty->print_cr("getisax(2) returned: " PTR32_FORMAT, av);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
85 #endif
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
86
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
87 if (av & AV_SPARC_MUL32) features |= hardware_mul32_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
88 if (av & AV_SPARC_DIV32) features |= hardware_div32_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
89 if (av & AV_SPARC_FSMULD) features |= hardware_fsmuld_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
90 if (av & AV_SPARC_V8PLUS) features |= v9_instructions_m;
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 641
diff changeset
91 if (av & AV_SPARC_POPC) features |= hardware_popc_m;
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
92 if (av & AV_SPARC_VIS) features |= vis1_instructions_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
93 if (av & AV_SPARC_VIS2) features |= vis2_instructions_m;
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
94
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
95 // Next values are not defined before Solaris 10
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
96 // but Solaris 8 is used for jdk6 update builds.
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
97 #ifndef AV_SPARC_ASI_BLK_INIT
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
98 #define AV_SPARC_ASI_BLK_INIT 0x0080 /* ASI_BLK_INIT_xxx ASI */
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
99 #endif
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
100 if (av & AV_SPARC_ASI_BLK_INIT) features |= blk_init_instructions_m;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
101
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
102 #ifndef AV_SPARC_FMAF
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
103 #define AV_SPARC_FMAF 0x0100 /* Fused Multiply-Add */
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
104 #endif
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
105 if (av & AV_SPARC_FMAF) features |= fmaf_instructions_m;
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
106
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
107 #ifndef AV_SPARC_FMAU
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
108 #define AV_SPARC_FMAU 0x0200 /* Unfused Multiply-Add */
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
109 #endif
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
110 if (av & AV_SPARC_FMAU) features |= fmau_instructions_m;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
111
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
112 #ifndef AV_SPARC_VIS3
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
113 #define AV_SPARC_VIS3 0x0400 /* VIS3 instruction set extensions */
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
114 #endif
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
115 if (av & AV_SPARC_VIS3) features |= vis3_instructions_m;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
116
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
117 } else {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
118 // getisax(2) failed, use the old legacy code.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
119 #ifndef PRODUCT
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
120 if (PrintMiscellaneous && Verbose)
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
121 tty->print_cr("getisax(2) is not supported.");
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
122 #endif
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
123
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
124 char tmp;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
125 size_t bufsize = sysinfo(SI_ISALIST, &tmp, 1);
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
126 char* buf = (char*) malloc(bufsize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
128 if (buf != NULL) {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
129 if (sysinfo(SI_ISALIST, buf, bufsize) == bufsize) {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
130 // Figure out what kind of sparc we have
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
131 char *sparc_string = strstr(buf, "sparc");
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
132 if (sparc_string != NULL) { features |= v8_instructions_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
133 if (sparc_string[5] == 'v') {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
134 if (sparc_string[6] == '8') {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
135 if (sparc_string[7] == '-') { features |= hardware_mul32_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
136 features |= hardware_div32_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
137 } else if (sparc_string[7] == 'p') features |= generic_v9_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
138 else features |= generic_v8_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
139 } else if (sparc_string[6] == '9') features |= generic_v9_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
140 }
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
141 }
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
142
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
143 // Check for visualization instructions
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
144 char *vis = strstr(buf, "vis");
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
145 if (vis != NULL) { features |= vis1_instructions_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
146 if (vis[3] == '2') features |= vis2_instructions_m;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 }
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
149 free(buf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
153 // Determine the machine type.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
154 do_sysinfo(SI_MACHINE, "sun4v", &features, sun4v_m);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
155
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
156 {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
157 // Using kstat to determine the machine type.
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
158 kstat_ctl_t* kc = kstat_open();
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
159 kstat_t* ksp = kstat_lookup(kc, (char*)"cpu_info", -1, NULL);
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
160 const char* implementation = "UNKNOWN";
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
161 if (ksp != NULL) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
162 if (kstat_read(kc, ksp, NULL) != -1 && ksp->ks_data != NULL) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
163 kstat_named_t* knm = (kstat_named_t *)ksp->ks_data;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
164 for (int i = 0; i < ksp->ks_ndata; i++) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
165 if (strcmp((const char*)&(knm[i].name),"implementation") == 0) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
166 #ifndef KSTAT_DATA_STRING
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
167 #define KSTAT_DATA_STRING 9
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
168 #endif
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
169 if (knm[i].data_type == KSTAT_DATA_CHAR) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
170 // VM is running on Solaris 8 which does not have value.str.
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
171 implementation = &(knm[i].value.c[0]);
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
172 } else if (knm[i].data_type == KSTAT_DATA_STRING) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
173 // VM is running on Solaris 10.
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
174 #ifndef KSTAT_NAMED_STR_PTR
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
175 // Solaris 8 was used to build VM, define the structure it misses.
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
176 struct str_t {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
177 union {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
178 char *ptr; /* NULL-term string */
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
179 char __pad[8]; /* 64-bit padding */
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
180 } addr;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
181 uint32_t len; /* # bytes for strlen + '\0' */
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
182 };
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
183 #define KSTAT_NAMED_STR_PTR(knptr) (( (str_t*)&((knptr)->value) )->addr.ptr)
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
184 #endif
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
185 implementation = KSTAT_NAMED_STR_PTR(&knm[i]);
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
186 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
187 #ifndef PRODUCT
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
188 if (PrintMiscellaneous && Verbose) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
189 tty->print_cr("cpu_info.implementation: %s", implementation);
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
190 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
191 #endif
2247
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
192 // Convert to UPPER case before compare.
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
193 char* impl = strdup(implementation);
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
194
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
195 for (int i = 0; impl[i] != 0; i++)
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
196 impl[i] = (char)toupper((uint)impl[i]);
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
197 if (strstr(impl, "SPARC64") != NULL) {
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
198 features |= sparc64_family_m;
2247
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
199 } else if (strstr(impl, "SPARC-T") != NULL) {
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
200 features |= T_family_m;
2247
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
201 if (strstr(impl, "SPARC-T1") != NULL) {
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
202 features |= T1_model_m;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
203 }
2247
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
204 } else {
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
205 assert(strstr(impl, "SPARC") != NULL, "should be sparc");
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
206 }
2247
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
207 free((void*)impl);
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
208 break;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
209 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
210 } // for(
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
211 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
212 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
213 assert(strcmp(implementation, "UNKNOWN") != 0,
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
214 "unknown cpu info (changed kstat interface?)");
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
215 kstat_close(kc);
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
216 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
217
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 return features;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }