annotate src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp @ 14304:a2866d45e99e

8027454: Do not traverse string table during G1 remark when treating them as strong roots during initial mark Summary: Do not try to unlink string table entries unconditionally during remark. This is without side effects as the preceding initial mark always uses the string table as strong roots. Needs to be fixed with class unloading during concurrent mark. Reviewed-by: brutisso, mgerdin
author tschatzl
date Mon, 20 Jan 2014 11:47:29 +0100
parents 00f5eff62d18
children 73b1030c6253
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6842
b9a9ed0f8eeb 7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents: 6269
diff changeset
2 * Copyright (c) 2006, 2012, 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
3839
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 2247
diff changeset
117 #ifndef AV_SPARC_CBCOND
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 2247
diff changeset
118 #define AV_SPARC_CBCOND 0x10000000 /* compare and branch instrs supported */
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 2247
diff changeset
119 #endif
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 2247
diff changeset
120 if (av & AV_SPARC_CBCOND) features |= cbcond_instructions_m;
3d42f82cd811 7063628: Use cbcond on T4
kvn
parents: 2247
diff changeset
121
14261
00f5eff62d18 8002074: Support for AES on SPARC
kvn
parents: 6842
diff changeset
122 #ifndef AV_SPARC_AES
00f5eff62d18 8002074: Support for AES on SPARC
kvn
parents: 6842
diff changeset
123 #define AV_SPARC_AES 0x00020000 /* aes instrs supported */
00f5eff62d18 8002074: Support for AES on SPARC
kvn
parents: 6842
diff changeset
124 #endif
00f5eff62d18 8002074: Support for AES on SPARC
kvn
parents: 6842
diff changeset
125 if (av & AV_SPARC_AES) features |= aes_instructions_m;
00f5eff62d18 8002074: Support for AES on SPARC
kvn
parents: 6842
diff changeset
126
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
127 } else {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
128 // getisax(2) failed, use the old legacy code.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
129 #ifndef PRODUCT
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
130 if (PrintMiscellaneous && Verbose)
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1552
diff changeset
131 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
132 #endif
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
133
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
134 char tmp;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
135 size_t bufsize = sysinfo(SI_ISALIST, &tmp, 1);
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
136 char* buf = (char*) malloc(bufsize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
137
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
138 if (buf != NULL) {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
139 if (sysinfo(SI_ISALIST, buf, bufsize) == bufsize) {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
140 // Figure out what kind of sparc we have
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
141 char *sparc_string = strstr(buf, "sparc");
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
142 if (sparc_string != NULL) { features |= v8_instructions_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
143 if (sparc_string[5] == 'v') {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
144 if (sparc_string[6] == '8') {
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
145 if (sparc_string[7] == '-') { features |= hardware_mul32_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
146 features |= hardware_div32_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
147 } 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
148 else features |= generic_v8_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
149 } 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
150 }
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
151 }
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
152
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
153 // Check for visualization instructions
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
154 char *vis = strstr(buf, "vis");
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
155 if (vis != NULL) { features |= vis1_instructions_m;
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
156 if (vis[3] == '2') features |= vis2_instructions_m;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
159 free(buf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
641
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
163 // Determine the machine type.
6af0a709d52b 6812587: Use auxv to determine SPARC hardware features on Solaris
twisti
parents: 0
diff changeset
164 do_sysinfo(SI_MACHINE, "sun4v", &features, sun4v_m);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
165
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
166 {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
167 // Using kstat to determine the machine type.
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
168 kstat_ctl_t* kc = kstat_open();
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
169 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
170 const char* implementation = "UNKNOWN";
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
171 if (ksp != NULL) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
172 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
173 kstat_named_t* knm = (kstat_named_t *)ksp->ks_data;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
174 for (int i = 0; i < ksp->ks_ndata; i++) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
175 if (strcmp((const char*)&(knm[i].name),"implementation") == 0) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
176 #ifndef KSTAT_DATA_STRING
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
177 #define KSTAT_DATA_STRING 9
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
178 #endif
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
179 if (knm[i].data_type == KSTAT_DATA_CHAR) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
180 // 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
181 implementation = &(knm[i].value.c[0]);
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
182 } else if (knm[i].data_type == KSTAT_DATA_STRING) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
183 // VM is running on Solaris 10.
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
184 #ifndef KSTAT_NAMED_STR_PTR
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
185 // 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
186 struct str_t {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
187 union {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
188 char *ptr; /* NULL-term string */
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
189 char __pad[8]; /* 64-bit padding */
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
190 } addr;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
191 uint32_t len; /* # bytes for strlen + '\0' */
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
192 };
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
193 #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
194 #endif
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
195 implementation = KSTAT_NAMED_STR_PTR(&knm[i]);
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
196 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
197 #ifndef PRODUCT
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
198 if (PrintMiscellaneous && Verbose) {
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
199 tty->print_cr("cpu_info.implementation: %s", implementation);
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
200 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
201 #endif
2247
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
202 // 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
203 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
204
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
205 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
206 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
207 if (strstr(impl, "SPARC64") != NULL) {
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
208 features |= sparc64_family_m;
6269
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
209 } else if (strstr(impl, "SPARC-M") != NULL) {
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
210 // M-series SPARC is based on T-series.
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
211 features |= (M_family_m | 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
212 } else if (strstr(impl, "SPARC-T") != NULL) {
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
213 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
214 if (strstr(impl, "SPARC-T1") != NULL) {
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
215 features |= T1_model_m;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
216 }
2247
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
217 } else {
6269
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
218 if (strstr(impl, "SPARC") == NULL) {
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
219 #ifndef PRODUCT
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
220 // kstat on Solaris 8 virtual machines (branded zones)
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
221 // returns "(unsupported)" implementation.
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
222 warning("kstat cpu_info implementation = '%s', should contain SPARC", impl);
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
223 #endif
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
224 implementation = "SPARC";
8cb110fd7627 7188227: VM should recognize M-series SPARC
kvn
parents: 3839
diff changeset
225 }
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
226 }
2247
c52cba2a3359 7014998: assert(is_T_family(features) == is_niagara(features)) failed: Niagara should be T series
kvn
parents: 2080
diff changeset
227 free((void*)impl);
2080
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
228 break;
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
229 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
230 } // for(
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
231 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
232 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
233 assert(strcmp(implementation, "UNKNOWN") != 0,
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
234 "unknown cpu info (changed kstat interface?)");
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
235 kstat_close(kc);
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
236 }
c04052fd6ae1 7006505: Use kstat info to identify SPARC processor
kvn
parents: 1972
diff changeset
237
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238 return features;
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }