src/cpu/sparc/vm/vm_version_sparc.cpp

Thu, 07 Apr 2011 09:53:20 -0700

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2403
c04052fd6ae1
child 3001
faa472957b38
permissions
-rw-r--r--

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes

duke@435 1 /*
kvn@2269 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #include "precompiled.hpp"
stefank@2314 26 #include "assembler_sparc.inline.hpp"
stefank@2314 27 #include "memory/resourceArea.hpp"
stefank@2314 28 #include "runtime/java.hpp"
stefank@2314 29 #include "runtime/stubCodeGenerator.hpp"
stefank@2314 30 #include "vm_version_sparc.hpp"
stefank@2314 31 #ifdef TARGET_OS_FAMILY_linux
stefank@2314 32 # include "os_linux.inline.hpp"
stefank@2314 33 #endif
stefank@2314 34 #ifdef TARGET_OS_FAMILY_solaris
stefank@2314 35 # include "os_solaris.inline.hpp"
stefank@2314 36 #endif
duke@435 37
duke@435 38 int VM_Version::_features = VM_Version::unknown_m;
duke@435 39 const char* VM_Version::_features_str = "";
duke@435 40
duke@435 41 void VM_Version::initialize() {
duke@435 42 _features = determine_features();
duke@435 43 PrefetchCopyIntervalInBytes = prefetch_copy_interval_in_bytes();
duke@435 44 PrefetchScanIntervalInBytes = prefetch_scan_interval_in_bytes();
duke@435 45 PrefetchFieldsAhead = prefetch_fields_ahead();
duke@435 46
duke@435 47 // Allocation prefetch settings
duke@435 48 intx cache_line_size = L1_data_cache_line_size();
duke@435 49 if( cache_line_size > AllocatePrefetchStepSize )
duke@435 50 AllocatePrefetchStepSize = cache_line_size;
duke@435 51 if( FLAG_IS_DEFAULT(AllocatePrefetchLines) )
duke@435 52 AllocatePrefetchLines = 3; // Optimistic value
duke@435 53 assert( AllocatePrefetchLines > 0, "invalid value");
duke@435 54 if( AllocatePrefetchLines < 1 ) // set valid value in product VM
duke@435 55 AllocatePrefetchLines = 1; // Conservative value
duke@435 56
duke@435 57 AllocatePrefetchDistance = allocate_prefetch_distance();
duke@435 58 AllocatePrefetchStyle = allocate_prefetch_style();
duke@435 59
duke@435 60 assert(AllocatePrefetchDistance % AllocatePrefetchStepSize == 0, "invalid value");
duke@435 61
duke@435 62 UseSSE = 0; // Only on x86 and x64
duke@435 63
duke@435 64 _supports_cx8 = has_v9();
duke@435 65
kvn@2403 66 if (is_niagara()) {
duke@435 67 // Indirect branch is the same cost as direct
duke@435 68 if (FLAG_IS_DEFAULT(UseInlineCaches)) {
kvn@1110 69 FLAG_SET_DEFAULT(UseInlineCaches, false);
duke@435 70 }
kvn@2403 71 // Align loops on a single instruction boundary.
kvn@2403 72 if (FLAG_IS_DEFAULT(OptoLoopAlignment)) {
kvn@2403 73 FLAG_SET_DEFAULT(OptoLoopAlignment, 4);
kvn@2403 74 }
kvn@2403 75 // When using CMS, we cannot use memset() in BOT updates because
kvn@2403 76 // the sun4v/CMT version in libc_psr uses BIS which exposes
kvn@2403 77 // "phantom zeros" to concurrent readers. See 6948537.
kvn@2403 78 if (FLAG_IS_DEFAULT(UseMemSetInBOT) && UseConcMarkSweepGC) {
kvn@2403 79 FLAG_SET_DEFAULT(UseMemSetInBOT, false);
kvn@2403 80 }
coleenp@548 81 #ifdef _LP64
kvn@1077 82 // 32-bit oops don't make sense for the 64-bit VM on sparc
kvn@1077 83 // since the 32-bit VM has the same registers and smaller objects.
kvn@1077 84 Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes);
coleenp@548 85 #endif // _LP64
duke@435 86 #ifdef COMPILER2
duke@435 87 // Indirect branch is the same cost as direct
duke@435 88 if (FLAG_IS_DEFAULT(UseJumpTables)) {
kvn@1110 89 FLAG_SET_DEFAULT(UseJumpTables, true);
duke@435 90 }
duke@435 91 // Single-issue, so entry and loop tops are
duke@435 92 // aligned on a single instruction boundary
duke@435 93 if (FLAG_IS_DEFAULT(InteriorEntryAlignment)) {
kvn@1110 94 FLAG_SET_DEFAULT(InteriorEntryAlignment, 4);
duke@435 95 }
kvn@2403 96 if (is_niagara_plus()) {
kvn@2269 97 if (has_blk_init() && AllocatePrefetchStyle > 0 &&
kvn@2269 98 FLAG_IS_DEFAULT(AllocatePrefetchStyle)) {
kvn@1802 99 // Use BIS instruction for allocation prefetch.
kvn@1802 100 FLAG_SET_DEFAULT(AllocatePrefetchStyle, 3);
kvn@1802 101 if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) {
kvn@1802 102 // Use smaller prefetch distance on N2 with BIS
kvn@1802 103 FLAG_SET_DEFAULT(AllocatePrefetchDistance, 64);
kvn@1802 104 }
kvn@1802 105 }
kvn@1802 106 if (AllocatePrefetchStyle != 3 && FLAG_IS_DEFAULT(AllocatePrefetchDistance)) {
kvn@1802 107 // Use different prefetch distance without BIS
kvn@1802 108 FLAG_SET_DEFAULT(AllocatePrefetchDistance, 256);
kvn@1802 109 }
duke@435 110 }
duke@435 111 #endif
duke@435 112 }
duke@435 113
twisti@1078 114 // Use hardware population count instruction if available.
twisti@1078 115 if (has_hardware_popc()) {
twisti@1078 116 if (FLAG_IS_DEFAULT(UsePopCountInstruction)) {
kvn@1110 117 FLAG_SET_DEFAULT(UsePopCountInstruction, true);
twisti@1078 118 }
twisti@1078 119 }
twisti@1078 120
never@2085 121 #ifdef COMPILER2
never@2085 122 // Currently not supported anywhere.
never@2085 123 FLAG_SET_DEFAULT(UseFPUForSpilling, false);
never@2085 124 #endif
never@2085 125
duke@435 126 char buf[512];
kvn@2403 127 jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
duke@435 128 (has_v8() ? ", has_v8" : ""),
duke@435 129 (has_v9() ? ", has_v9" : ""),
twisti@1078 130 (has_hardware_popc() ? ", popc" : ""),
duke@435 131 (has_vis1() ? ", has_vis1" : ""),
duke@435 132 (has_vis2() ? ", has_vis2" : ""),
kvn@2403 133 (has_vis3() ? ", has_vis3" : ""),
kvn@2269 134 (has_blk_init() ? ", has_blk_init" : ""),
duke@435 135 (is_ultra3() ? ", is_ultra3" : ""),
duke@435 136 (is_sun4v() ? ", is_sun4v" : ""),
kvn@2403 137 (is_niagara() ? ", is_niagara" : ""),
kvn@2403 138 (is_niagara_plus() ? ", is_niagara_plus" : ""),
kvn@2269 139 (is_sparc64() ? ", is_sparc64" : ""),
twisti@1076 140 (!has_hardware_mul32() ? ", no-mul32" : ""),
twisti@1076 141 (!has_hardware_div32() ? ", no-div32" : ""),
duke@435 142 (!has_hardware_fsmuld() ? ", no-fsmuld" : ""));
duke@435 143
duke@435 144 // buf is started with ", " or is empty
duke@435 145 _features_str = strdup(strlen(buf) > 2 ? buf + 2 : buf);
duke@435 146
duke@435 147 #ifndef PRODUCT
duke@435 148 if (PrintMiscellaneous && Verbose) {
duke@435 149 tty->print("Allocation: ");
duke@435 150 if (AllocatePrefetchStyle <= 0) {
duke@435 151 tty->print_cr("no prefetching");
duke@435 152 } else {
duke@435 153 if (AllocatePrefetchLines > 1) {
duke@435 154 tty->print_cr("PREFETCH %d, %d lines of size %d bytes", AllocatePrefetchDistance, AllocatePrefetchLines, AllocatePrefetchStepSize);
duke@435 155 } else {
duke@435 156 tty->print_cr("PREFETCH %d, one line", AllocatePrefetchDistance);
duke@435 157 }
duke@435 158 }
duke@435 159 if (PrefetchCopyIntervalInBytes > 0) {
duke@435 160 tty->print_cr("PrefetchCopyIntervalInBytes %d", PrefetchCopyIntervalInBytes);
duke@435 161 }
duke@435 162 if (PrefetchScanIntervalInBytes > 0) {
duke@435 163 tty->print_cr("PrefetchScanIntervalInBytes %d", PrefetchScanIntervalInBytes);
duke@435 164 }
duke@435 165 if (PrefetchFieldsAhead > 0) {
duke@435 166 tty->print_cr("PrefetchFieldsAhead %d", PrefetchFieldsAhead);
duke@435 167 }
duke@435 168 }
duke@435 169 #endif // PRODUCT
duke@435 170 }
duke@435 171
duke@435 172 void VM_Version::print_features() {
duke@435 173 tty->print_cr("Version:%s", cpu_features());
duke@435 174 }
duke@435 175
duke@435 176 int VM_Version::determine_features() {
duke@435 177 if (UseV8InstrsOnly) {
duke@435 178 NOT_PRODUCT(if (PrintMiscellaneous && Verbose) tty->print_cr("Version is Forced-V8");)
duke@435 179 return generic_v8_m;
duke@435 180 }
duke@435 181
duke@435 182 int features = platform_features(unknown_m); // platform_features() is os_arch specific
duke@435 183
duke@435 184 if (features == unknown_m) {
duke@435 185 features = generic_v9_m;
duke@435 186 warning("Cannot recognize SPARC version. Default to V9");
duke@435 187 }
duke@435 188
kvn@2403 189 assert(is_T_family(features) == is_niagara(features), "Niagara should be T series");
kvn@2403 190 if (UseNiagaraInstrs) { // Force code generation for Niagara
kvn@2403 191 if (is_T_family(features)) {
duke@435 192 // Happy to accomodate...
duke@435 193 } else {
duke@435 194 NOT_PRODUCT(if (PrintMiscellaneous && Verbose) tty->print_cr("Version is Forced-Niagara");)
kvn@2403 195 features |= T_family_m;
duke@435 196 }
duke@435 197 } else {
kvn@2403 198 if (is_T_family(features) && !FLAG_IS_DEFAULT(UseNiagaraInstrs)) {
duke@435 199 NOT_PRODUCT(if (PrintMiscellaneous && Verbose) tty->print_cr("Version is Forced-Not-Niagara");)
kvn@2403 200 features &= ~(T_family_m | T1_model_m);
duke@435 201 } else {
duke@435 202 // Happy to accomodate...
duke@435 203 }
duke@435 204 }
duke@435 205
duke@435 206 return features;
duke@435 207 }
duke@435 208
duke@435 209 static int saved_features = 0;
duke@435 210
duke@435 211 void VM_Version::allow_all() {
duke@435 212 saved_features = _features;
duke@435 213 _features = all_features_m;
duke@435 214 }
duke@435 215
duke@435 216 void VM_Version::revert() {
duke@435 217 _features = saved_features;
duke@435 218 }
jmasa@445 219
jmasa@445 220 unsigned int VM_Version::calc_parallel_worker_threads() {
jmasa@445 221 unsigned int result;
kvn@2403 222 if (is_niagara_plus()) {
jmasa@445 223 result = nof_parallel_worker_threads(5, 16, 8);
jmasa@445 224 } else {
jmasa@445 225 result = nof_parallel_worker_threads(5, 8, 8);
jmasa@445 226 }
jmasa@445 227 return result;
jmasa@445 228 }

mercurial