1 /*
   2  * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * Copyright (c) 2016, 2018 SAP SE. All rights reserved.
   4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5  *
   6  * This code is free software; you can redistribute it and/or modify it
   7  * under the terms of the GNU General Public License version 2 only, as
   8  * published by the Free Software Foundation.
   9  *
  10  * This code is distributed in the hope that it will be useful, but WITHOUT
  11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  * version 2 for more details (a copy is included in the LICENSE file that
  14  * accompanied this code).
  15  *
  16  * You should have received a copy of the GNU General Public License version
  17  * 2 along with this work; if not, write to the Free Software Foundation,
  18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19  *
  20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  * or visit www.oracle.com if you need additional information or have any
  22  * questions.
  23  *
  24  */
  25 
  26 #include "precompiled.hpp"
  27 #include "jvm.h"
  28 #include "asm/assembler.inline.hpp"
  29 #include "compiler/disassembler.hpp"
  30 #include "code/compiledIC.hpp"
  31 #include "memory/resourceArea.hpp"
  32 #include "runtime/java.hpp"
  33 #include "runtime/stubCodeGenerator.hpp"
  34 #include "vm_version_s390.hpp"
  35 
  36 # include <sys/sysinfo.h>
  37 
  38 bool VM_Version::_is_determine_features_test_running  = false;
  39 const char*   VM_Version::_model_string;
  40 
  41 unsigned long VM_Version::_features[_features_buffer_len]           = {0, 0, 0, 0};
  42 unsigned long VM_Version::_cipher_features[_features_buffer_len]    = {0, 0, 0, 0};
  43 unsigned long VM_Version::_msgdigest_features[_features_buffer_len] = {0, 0, 0, 0};
  44 unsigned int  VM_Version::_nfeatures                                = 0;
  45 unsigned int  VM_Version::_ncipher_features                         = 0;
  46 unsigned int  VM_Version::_nmsgdigest_features                      = 0;
  47 unsigned int  VM_Version::_Dcache_lineSize                          = 256;
  48 unsigned int  VM_Version::_Icache_lineSize                          = 256;
  49 
  50 static const char* z_gen[]     = {"  ",   "G1",   "G2", "G3",    "G4",     "G5",      "G6",   "G7"   };
  51 static const char* z_machine[] = {"  ", "2064", "2084", "2094",  "2097",   "2817",    "  ",   "2964" };
  52 static const char* z_name[]    = {"  ", "z900", "z990", "z9 EC", "z10 EC", "z196 EC", "ec12", "z13"  };
  53 
  54 void VM_Version::initialize() {
  55   determine_features();      // Get processor capabilities.
  56   set_features_string();     // Set a descriptive feature indication.
  57 
  58   if (Verbose) {
  59     print_features();
  60   }
  61 
  62   intx cache_line_size = Dcache_lineSize(0);
  63 
  64   MaxVectorSize = 8;
  65 
  66   if (has_PrefetchRaw()) {
  67     if (FLAG_IS_DEFAULT(AllocatePrefetchStyle)) {  // not preset
  68       // 0 = no prefetch.
  69       // 1 = Prefetch instructions for each allocation.
  70       // 2 = Use TLAB watermark to gate allocation prefetch.
  71       AllocatePrefetchStyle = 1;
  72     }
  73 
  74     if (AllocatePrefetchStyle > 0) {  // Prefetching turned on at all?
  75       // Distance to prefetch ahead of allocation pointer.
  76       if (FLAG_IS_DEFAULT(AllocatePrefetchDistance) || (AllocatePrefetchDistance < 0)) {  // not preset
  77         AllocatePrefetchDistance = 0;
  78       }
  79 
  80       // Number of lines to prefetch ahead of allocation pointer.
  81       if (FLAG_IS_DEFAULT(AllocatePrefetchLines) || (AllocatePrefetchLines <= 0)) {      // not preset
  82         AllocatePrefetchLines = 3;
  83       }
  84 
  85       // Step size in bytes of sequential prefetch instructions.
  86       if (FLAG_IS_DEFAULT(AllocatePrefetchStepSize) || (AllocatePrefetchStepSize <= 0)) { // not preset
  87         FLAG_SET_DEFAULT(AllocatePrefetchStepSize, cache_line_size);
  88       } else if (AllocatePrefetchStepSize < cache_line_size) {
  89         FLAG_SET_DEFAULT(AllocatePrefetchStepSize, cache_line_size);
  90       } else {
  91         FLAG_SET_DEFAULT(AllocatePrefetchStepSize, cache_line_size);
  92       }
  93     } else {
  94       FLAG_SET_DEFAULT(AllocatePrefetchStyle, 0);
  95       AllocatePrefetchDistance = 0;
  96       AllocatePrefetchLines    = 0;
  97       // Can't be zero. Will SIGFPE during constraints checking.
  98       FLAG_SET_DEFAULT(AllocatePrefetchStepSize, cache_line_size);
  99     }
 100 
 101   } else {
 102     FLAG_SET_DEFAULT(AllocatePrefetchStyle, 0);
 103     AllocatePrefetchDistance = 0;
 104     AllocatePrefetchLines    = 0;
 105     // Can't be zero. Will SIGFPE during constraints checking.
 106     FLAG_SET_DEFAULT(AllocatePrefetchStepSize, cache_line_size);
 107   }
 108 
 109   // TODO:
 110   // On z/Architecture, cache line size is significantly large (256 bytes). Do we really need
 111   // to keep contended members that far apart? Performance tests are required.
 112   if (FLAG_IS_DEFAULT(ContendedPaddingWidth) && (cache_line_size > ContendedPaddingWidth)) {
 113     ContendedPaddingWidth = cache_line_size;
 114   }
 115 
 116   // On z/Architecture, the CRC32/CRC32C intrinsics are implemented "by hand".
 117   // TODO: Provide implementation based on the vector instructions available from z13.
 118   // Note: The CHECKSUM instruction, which has been there since the very beginning
 119   //       (of z/Architecture), computes "some kind of" a checksum.
 120   //       It has nothing to do with the CRC32 algorithm.
 121   if (FLAG_IS_DEFAULT(UseCRC32Intrinsics)) {
 122     FLAG_SET_DEFAULT(UseCRC32Intrinsics, true);
 123   }
 124   if (FLAG_IS_DEFAULT(UseCRC32CIntrinsics)) {
 125     FLAG_SET_DEFAULT(UseCRC32CIntrinsics, true);
 126   }
 127 
 128   // TODO: Provide implementation.
 129   if (UseAdler32Intrinsics) {
 130     warning("Adler32Intrinsics not available on this CPU.");
 131     FLAG_SET_DEFAULT(UseAdler32Intrinsics, false);
 132   }
 133 
 134   // On z/Architecture, we take UseAES as the general switch to enable/disable the AES intrinsics.
 135   // The specific, and yet to be defined, switches UseAESxxxIntrinsics will then be set
 136   // depending on the actual machine capabilities.
 137   // Explicitly setting them via CmdLine option takes precedence, of course.
 138   // TODO: UseAESIntrinsics must be made keylength specific.
 139   // As of March 2015 and Java8, only AES128 is supported by the Java Cryptographic Extensions.
 140   // Therefore, UseAESIntrinsics is of minimal use at the moment.
 141   if (FLAG_IS_DEFAULT(UseAES) && has_Crypto_AES()) {
 142     FLAG_SET_DEFAULT(UseAES, true);
 143   }
 144   if (UseAES && !has_Crypto_AES()) {
 145     warning("AES instructions are not available on this CPU");
 146     FLAG_SET_DEFAULT(UseAES, false);
 147   }
 148   if (UseAES) {
 149     if (FLAG_IS_DEFAULT(UseAESIntrinsics)) {
 150       FLAG_SET_DEFAULT(UseAESIntrinsics, true);
 151     }
 152   }
 153   if (UseAESIntrinsics && !has_Crypto_AES()) {
 154     warning("AES intrinsics are not available on this CPU");
 155     FLAG_SET_DEFAULT(UseAESIntrinsics, false);
 156   }
 157   if (UseAESIntrinsics && !UseAES) {
 158     warning("AES intrinsics require UseAES flag to be enabled. Intrinsics will be disabled.");
 159     FLAG_SET_DEFAULT(UseAESIntrinsics, false);
 160   }
 161 
 162   // TODO: implement AES/CTR intrinsics
 163   if (UseAESCTRIntrinsics) {
 164     warning("AES/CTR intrinsics are not available on this CPU");
 165     FLAG_SET_DEFAULT(UseAESCTRIntrinsics, false);
 166   }
 167 
 168   // TODO: implement GHASH intrinsics
 169   if (UseGHASHIntrinsics) {
 170     warning("GHASH intrinsics are not available on this CPU");
 171     FLAG_SET_DEFAULT(UseGHASHIntrinsics, false);
 172   }
 173 
 174   if (FLAG_IS_DEFAULT(UseFMA)) {
 175     FLAG_SET_DEFAULT(UseFMA, true);
 176   }
 177 
 178   // On z/Architecture, we take UseSHA as the general switch to enable/disable the SHA intrinsics.
 179   // The specific switches UseSHAxxxIntrinsics will then be set depending on the actual
 180   // machine capabilities.
 181   // Explicitly setting them via CmdLine option takes precedence, of course.
 182   if (FLAG_IS_DEFAULT(UseSHA) && has_Crypto_SHA()) {
 183     FLAG_SET_DEFAULT(UseSHA, true);
 184   }
 185   if (UseSHA && !has_Crypto_SHA()) {
 186     warning("SHA instructions are not available on this CPU");
 187     FLAG_SET_DEFAULT(UseSHA, false);
 188   }
 189   if (UseSHA && has_Crypto_SHA1()) {
 190     if (FLAG_IS_DEFAULT(UseSHA1Intrinsics)) {
 191       FLAG_SET_DEFAULT(UseSHA1Intrinsics, true);
 192     }
 193   } else if (UseSHA1Intrinsics) {
 194     warning("Intrinsics for SHA-1 crypto hash functions not available on this CPU.");
 195     FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
 196   }
 197   if (UseSHA && has_Crypto_SHA256()) {
 198     if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) {
 199       FLAG_SET_DEFAULT(UseSHA256Intrinsics, true);
 200     }
 201   } else if (UseSHA256Intrinsics) {
 202     warning("Intrinsics for SHA-224 and SHA-256 crypto hash functions not available on this CPU.");
 203     FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
 204   }
 205   if (UseSHA && has_Crypto_SHA512()) {
 206     if (FLAG_IS_DEFAULT(UseSHA512Intrinsics)) {
 207       FLAG_SET_DEFAULT(UseSHA512Intrinsics, true);
 208     }
 209   } else if (UseSHA512Intrinsics) {
 210     warning("Intrinsics for SHA-384 and SHA-512 crypto hash functions not available on this CPU.");
 211     FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
 212   }
 213 
 214   if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) {
 215     FLAG_SET_DEFAULT(UseSHA, false);
 216   }
 217 
 218   if (FLAG_IS_DEFAULT(UseMultiplyToLenIntrinsic)) {
 219     FLAG_SET_DEFAULT(UseMultiplyToLenIntrinsic, true);
 220   }
 221   if (FLAG_IS_DEFAULT(UseMontgomeryMultiplyIntrinsic)) {
 222     FLAG_SET_DEFAULT(UseMontgomeryMultiplyIntrinsic, true);
 223   }
 224   if (FLAG_IS_DEFAULT(UseMontgomerySquareIntrinsic)) {
 225     FLAG_SET_DEFAULT(UseMontgomerySquareIntrinsic, true);
 226   }
 227   if (FLAG_IS_DEFAULT(UsePopCountInstruction)) {
 228     FLAG_SET_DEFAULT(UsePopCountInstruction, true);
 229   }
 230 
 231   // z/Architecture supports 8-byte compare-exchange operations
 232   // (see Atomic::cmpxchg)
 233   // and 'atomic long memory ops' (see Unsafe_GetLongVolatile).
 234   _supports_cx8 = true;
 235 
 236   _supports_atomic_getadd4 = VM_Version::has_LoadAndALUAtomicV1();
 237   _supports_atomic_getadd8 = VM_Version::has_LoadAndALUAtomicV1();
 238 
 239   // z/Architecture supports unaligned memory accesses.
 240   // Performance penalty is negligible. An additional tick or so
 241   // is lost if the accessed data spans a cache line boundary.
 242   // Unaligned accesses are not atomic, of course.
 243   if (FLAG_IS_DEFAULT(UseUnalignedAccesses)) {
 244     FLAG_SET_DEFAULT(UseUnalignedAccesses, true);
 245   }
 246 }
 247 
 248 
 249 void VM_Version::set_features_string() {
 250 
 251   unsigned int ambiguity = 0;
 252   _model_string = z_name[0];
 253   if (is_z13()) {
 254     _features_string = "System z G7-z13  (LDISP_fast, ExtImm, PCrel Load/Store, CmpB, Cond Load/Store, Interlocked Update, TxM, VectorInstr)";
 255     _model_string = z_name[7];
 256     ambiguity++;
 257   }
 258   if (is_ec12()) {
 259     _features_string = "System z G6-EC12 (LDISP_fast, ExtImm, PCrel Load/Store, CmpB, Cond Load/Store, Interlocked Update, TxM)";
 260     _model_string = z_name[6];
 261     ambiguity++;
 262   }
 263   if (is_z196()) {
 264     _features_string = "System z G5-z196 (LDISP_fast, ExtImm, PCrel Load/Store, CmpB, Cond Load/Store, Interlocked Update)";
 265     _model_string = z_name[5];
 266     ambiguity++;
 267   }
 268   if (is_z10()) {
 269     _features_string = "System z G4-z10  (LDISP_fast, ExtImm, PCrel Load/Store, CmpB)";
 270     _model_string = z_name[4];
 271     ambiguity++;
 272   }
 273   if (is_z9()) {
 274     _features_string = "System z G3-z9   (LDISP_fast, ExtImm), out-of-support as of 2016-04-01";
 275     _model_string = z_name[3];
 276     ambiguity++;
 277   }
 278   if (is_z990()) {
 279     _features_string = "System z G2-z990 (LDISP_fast), out-of-support as of 2014-07-01";
 280     _model_string = z_name[2];
 281     ambiguity++;
 282   }
 283   if (is_z900()) {
 284     _features_string = "System z G1-z900 (LDISP), out-of-support as of 2014-07-01";
 285     _model_string = z_name[1];
 286     ambiguity++;
 287   }
 288 
 289   if (ambiguity == 0) {
 290     _features_string = "z/Architecture (unknown generation)";
 291   } else if (ambiguity > 1) {
 292     tty->print_cr("*** WARNING *** Ambiguous z/Architecture detection, ambiguity = %d", ambiguity);
 293     tty->print_cr("                oldest detected generation is %s", _features_string);
 294     _features_string = "z/Architecture (ambiguous detection)";
 295   }
 296 
 297   if (has_Crypto_AES()) {
 298     char buf[256];
 299     assert(strlen(_features_string) + 4 + 3*4 + 1 < sizeof(buf), "increase buffer size");
 300     jio_snprintf(buf, sizeof(buf), "%s aes%s%s%s", // String 'aes' must be surrounded by spaces so that jtreg tests recognize it.
 301                  _features_string,
 302                  has_Crypto_AES128() ? " 128" : "",
 303                  has_Crypto_AES192() ? " 192" : "",
 304                  has_Crypto_AES256() ? " 256" : "");
 305     _features_string = os::strdup(buf);
 306   }
 307 
 308   if (has_Crypto_SHA()) {
 309     char buf[256];
 310     assert(strlen(_features_string) + 4 + 2 + 2*4 + 6 + 1 < sizeof(buf), "increase buffer size");
 311     // String 'sha1' etc must be surrounded by spaces so that jtreg tests recognize it.
 312     jio_snprintf(buf, sizeof(buf), "%s %s%s%s%s",
 313                  _features_string,
 314                  has_Crypto_SHA1()   ? " sha1"   : "",
 315                  has_Crypto_SHA256() ? " sha256" : "",
 316                  has_Crypto_SHA512() ? " sha512" : "",
 317                  has_Crypto_GHASH()  ? " ghash"  : "");
 318     if (has_Crypto_AES()) { os::free((void *)_features_string); }
 319     _features_string = os::strdup(buf);
 320   }
 321 }
 322 
 323 // featureBuffer - bit array indicating availability of various features
 324 // featureNum    - bit index of feature to be tested
 325 //                 Featurenum < 0 requests test for any nonzero bit in featureBuffer.
 326 // bufLen        - length of featureBuffer in bits
 327 bool VM_Version::test_feature_bit(unsigned long* featureBuffer, int featureNum, unsigned int bufLen) {
 328   assert(bufLen > 0,             "buffer len must be positive");
 329   assert((bufLen & 0x0007) == 0, "unaligned buffer len");
 330   assert(((intptr_t)featureBuffer&0x0007) == 0, "unaligned feature buffer");
 331   if (featureNum < 0) {
 332     // Any bit set at all?
 333     bool anyBit = false;
 334     for (size_t i = 0; i < bufLen/(8*sizeof(long)); i++) {
 335       anyBit = anyBit || (featureBuffer[i] != 0);
 336     }
 337     return anyBit;
 338   } else {
 339     assert((unsigned int)featureNum < bufLen,    "feature index out of range");
 340     unsigned char* byteBuffer = (unsigned char*)featureBuffer;
 341     int   byteIndex  = featureNum/(8*sizeof(char));
 342     int   bitIndex   = featureNum%(8*sizeof(char));
 343     // Indexed bit set?
 344     return (byteBuffer[byteIndex] & (1U<<(7-bitIndex))) != 0;
 345   }
 346 }
 347 
 348 void VM_Version::print_features_internal(const char* text, bool print_anyway) {
 349   tty->print_cr("%s %s",       text, features_string());
 350   tty->print("%s", text);
 351   for (unsigned int i = 0; i < _nfeatures; i++) {
 352     tty->print("  0x%16.16lx", _features[i]);
 353   }
 354   tty->cr();
 355 
 356   if (Verbose || print_anyway) {
 357     // z900
 358     if (has_long_displacement()        ) tty->print_cr("available: %s", "LongDispFacility");
 359     // z990
 360     if (has_long_displacement_fast()   ) tty->print_cr("available: %s", "LongDispFacilityHighPerf");
 361     if (has_ETF2() && has_ETF3()       ) tty->print_cr("available: %s", "ETF2 and ETF3");
 362     if (has_Crypto()                   ) tty->print_cr("available: %s", "CryptoFacility");
 363     // z9
 364     if (has_extended_immediate()       ) tty->print_cr("available: %s", "ExtImmedFacility");
 365     if (has_StoreFacilityListExtended()) tty->print_cr("available: %s", "StoreFacilityListExtended");
 366     if (has_StoreClockFast()           ) tty->print_cr("available: %s", "StoreClockFast");
 367     if (has_ETF2Enhancements()         ) tty->print_cr("available: %s", "ETF2 Enhancements");
 368     if (has_ETF3Enhancements()         ) tty->print_cr("available: %s", "ETF3 Enhancements");
 369     if (has_HFPUnnormalized()          ) tty->print_cr("available: %s", "HFPUnnormalizedFacility");
 370     if (has_HFPMultiplyAndAdd()        ) tty->print_cr("available: %s", "HFPMultiplyAndAddFacility");
 371     // z10
 372     if (has_ParsingEnhancements()      ) tty->print_cr("available: %s", "Parsing Enhancements");
 373     if (has_ExtractCPUtime()           ) tty->print_cr("available: %s", "ExtractCPUTime");
 374     if (has_CompareSwapStore()         ) tty->print_cr("available: %s", "CompareSwapStore");
 375     if (has_GnrlInstrExtensions()      ) tty->print_cr("available: %s", "General Instruction Extensions");
 376     if (has_CompareBranch()            ) tty->print_cr("  available: %s", "Compare and Branch");
 377     if (has_CompareTrap()              ) tty->print_cr("  available: %s", "Compare and Trap");
 378     if (has_RelativeLoadStore()        ) tty->print_cr("  available: %s", "Relative Load/Store");
 379     if (has_MultiplySingleImm32()      ) tty->print_cr("  available: %s", "MultiplySingleImm32");
 380     if (has_Prefetch()                 ) tty->print_cr("  available: %s", "Prefetch");
 381     if (has_MoveImmToMem()             ) tty->print_cr("  available: %s", "Direct Moves Immediate to Memory");
 382     if (has_MemWithImmALUOps()         ) tty->print_cr("  available: %s", "Direct ALU Ops Memory .op. Immediate");
 383     if (has_ExtractCPUAttributes()     ) tty->print_cr("  available: %s", "Extract CPU Atributes");
 384     if (has_ExecuteExtensions()        ) tty->print_cr("available: %s", "ExecuteExtensions");
 385     if (has_FPSupportEnhancements()    ) tty->print_cr("available: %s", "FPSupportEnhancements");
 386     if (has_DecimalFloatingPoint()     ) tty->print_cr("available: %s", "DecimalFloatingPoint");
 387     // z196
 388     if (has_DistinctOpnds()            ) tty->print_cr("available: %s", "Distinct Operands");
 389     if (has_InterlockedAccessV1()      ) tty->print_cr("  available: %s", "InterlockedAccess V1 (fast)");
 390     if (has_PopCount()                 ) tty->print_cr("  available: %s", "PopCount");
 391     if (has_LoadStoreConditional()     ) tty->print_cr("  available: %s", "LoadStoreConditional");
 392     if (has_HighWordInstr()            ) tty->print_cr("  available: %s", "HighWord Instructions");
 393     if (has_FastSync()                 ) tty->print_cr("  available: %s", "FastSync (bcr 14,0)");
 394     if (has_AtomicMemWithImmALUOps()   ) tty->print_cr("available: %s", "Atomic Direct ALU Ops Memory .op. Immediate");
 395     if (has_FPExtensions()             ) tty->print_cr("available: %s", "Floatingpoint Extensions");
 396     if (has_CryptoExt3()               ) tty->print_cr("available: %s", "Crypto Extensions 3");
 397     if (has_CryptoExt4()               ) tty->print_cr("available: %s", "Crypto Extensions 4");
 398     // EC12
 399     if (has_MiscInstrExt()             ) tty->print_cr("available: %s", "Miscelaneous Instruction Extensions");
 400     if (has_ExecutionHint()            ) tty->print_cr("  available: %s", "Execution Hints (branch prediction)");
 401     if (has_ProcessorAssist()          ) tty->print_cr("  available: %s", "Processor Assists");
 402     if (has_LoadAndTrap()              ) tty->print_cr("  available: %s", "Load and Trap");
 403     if (has_TxMem()                    ) tty->print_cr("available: %s", "Transactional Memory");
 404     if (has_InterlockedAccessV2()      ) tty->print_cr("  available: %s", "InterlockedAccess V2 (fast)");
 405     if (has_DFPZonedConversion()       ) tty->print_cr("  available: %s", "DFP Zoned Conversions");
 406     // z13
 407     if (has_LoadStoreConditional2()    ) tty->print_cr("available: %s", "Load/Store Conditional 2");
 408     if (has_CryptoExt5()               ) tty->print_cr("available: %s", "Crypto Extensions 5");
 409     if (has_DFPPackedConversion()      ) tty->print_cr("available: %s", "DFP Packed Conversions");
 410     if (has_VectorFacility()           ) tty->print_cr("available: %s", "Vector Facility");
 411     // test switches
 412     if (has_TestFeature1Impl()         ) tty->print_cr("available: %s", "TestFeature1Impl");
 413     if (has_TestFeature2Impl()         ) tty->print_cr("available: %s", "TestFeature2Impl");
 414     if (has_TestFeature4Impl()         ) tty->print_cr("available: %s", "TestFeature4Impl");
 415     if (has_TestFeature8Impl()         ) tty->print_cr("available: %s", "TestFeature8Impl");
 416 
 417     if (has_Crypto()) {
 418       tty->cr();
 419       tty->print_cr("detailed availability of %s capabilities:", "CryptoFacility");
 420       if (test_feature_bit(&_cipher_features[0], -1, 2*Cipher::_featureBits)) {
 421         tty->cr();
 422         tty->print_cr("  available: %s", "Message Cipher Functions");
 423       }
 424       if (test_feature_bit(&_cipher_features[0], -1, (int)Cipher::_featureBits)) {
 425         tty->print_cr("    available Crypto Features of KM  (Cipher Message):");
 426         for (unsigned int i = 0; i < Cipher::_featureBits; i++) {
 427           if (test_feature_bit(&_cipher_features[0], i, (int)Cipher::_featureBits)) {
 428             switch (i) {
 429               case Cipher::_Query:              tty->print_cr("      available: KM   Query");                  break;
 430               case Cipher::_DEA:                tty->print_cr("      available: KM   DEA");                    break;
 431               case Cipher::_TDEA128:            tty->print_cr("      available: KM   TDEA-128");               break;
 432               case Cipher::_TDEA192:            tty->print_cr("      available: KM   TDEA-192");               break;
 433               case Cipher::_EncryptedDEA:       tty->print_cr("      available: KM   Encrypted DEA");          break;
 434               case Cipher::_EncryptedDEA128:    tty->print_cr("      available: KM   Encrypted DEA-128");      break;
 435               case Cipher::_EncryptedDEA192:    tty->print_cr("      available: KM   Encrypted DEA-192");      break;
 436               case Cipher::_AES128:             tty->print_cr("      available: KM   AES-128");                break;
 437               case Cipher::_AES192:             tty->print_cr("      available: KM   AES-192");                break;
 438               case Cipher::_AES256:             tty->print_cr("      available: KM   AES-256");                break;
 439               case Cipher::_EnccryptedAES128:   tty->print_cr("      available: KM   Encrypted-AES-128");      break;
 440               case Cipher::_EnccryptedAES192:   tty->print_cr("      available: KM   Encrypted-AES-192");      break;
 441               case Cipher::_EnccryptedAES256:   tty->print_cr("      available: KM   Encrypted-AES-256");      break;
 442               case Cipher::_XTSAES128:          tty->print_cr("      available: KM   XTS-AES-128");            break;
 443               case Cipher::_XTSAES256:          tty->print_cr("      available: KM   XTS-AES-256");            break;
 444               case Cipher::_EncryptedXTSAES128: tty->print_cr("      available: KM   XTS-Encrypted-AES-128");  break;
 445               case Cipher::_EncryptedXTSAES256: tty->print_cr("      available: KM   XTS-Encrypted-AES-256");  break;
 446               default: tty->print_cr("      available: unknown KM  code %d", i);      break;
 447             }
 448           }
 449         }
 450       }
 451       if (test_feature_bit(&_cipher_features[2], -1, (int)Cipher::_featureBits)) {
 452         tty->print_cr("    available Crypto Features of KMC (Cipher Message with Chaining):");
 453         for (unsigned int i = 0; i < Cipher::_featureBits; i++) {
 454             if (test_feature_bit(&_cipher_features[2], i, (int)Cipher::_featureBits)) {
 455             switch (i) {
 456               case Cipher::_Query:              tty->print_cr("      available: KMC  Query");                  break;
 457               case Cipher::_DEA:                tty->print_cr("      available: KMC  DEA");                    break;
 458               case Cipher::_TDEA128:            tty->print_cr("      available: KMC  TDEA-128");               break;
 459               case Cipher::_TDEA192:            tty->print_cr("      available: KMC  TDEA-192");               break;
 460               case Cipher::_EncryptedDEA:       tty->print_cr("      available: KMC  Encrypted DEA");          break;
 461               case Cipher::_EncryptedDEA128:    tty->print_cr("      available: KMC  Encrypted DEA-128");      break;
 462               case Cipher::_EncryptedDEA192:    tty->print_cr("      available: KMC  Encrypted DEA-192");      break;
 463               case Cipher::_AES128:             tty->print_cr("      available: KMC  AES-128");                break;
 464               case Cipher::_AES192:             tty->print_cr("      available: KMC  AES-192");                break;
 465               case Cipher::_AES256:             tty->print_cr("      available: KMC  AES-256");                break;
 466               case Cipher::_EnccryptedAES128:   tty->print_cr("      available: KMC  Encrypted-AES-128");      break;
 467               case Cipher::_EnccryptedAES192:   tty->print_cr("      available: KMC  Encrypted-AES-192");      break;
 468               case Cipher::_EnccryptedAES256:   tty->print_cr("      available: KMC  Encrypted-AES-256");      break;
 469               case Cipher::_PRNG:               tty->print_cr("      available: KMC  PRNG");                   break;
 470               default: tty->print_cr("      available: unknown KMC code %d", i);      break;
 471             }
 472           }
 473         }
 474       }
 475 
 476       if (test_feature_bit(&_msgdigest_features[0], -1, 2*MsgDigest::_featureBits)) {
 477         tty->cr();
 478         tty->print_cr("  available: %s", "Message Digest Functions for SHA");
 479       }
 480       if (test_feature_bit(&_msgdigest_features[0], -1, (int)MsgDigest::_featureBits)) {
 481         tty->print_cr("    available Features of KIMD (Msg Digest):");
 482         for (unsigned int i = 0; i < MsgDigest::_featureBits; i++) {
 483             if (test_feature_bit(&_msgdigest_features[0], i, (int)MsgDigest::_featureBits)) {
 484             switch (i) {
 485               case MsgDigest::_Query:  tty->print_cr("      available: KIMD Query");   break;
 486               case MsgDigest::_SHA1:   tty->print_cr("      available: KIMD SHA-1");   break;
 487               case MsgDigest::_SHA256: tty->print_cr("      available: KIMD SHA-256"); break;
 488               case MsgDigest::_SHA512: tty->print_cr("      available: KIMD SHA-512"); break;
 489               case MsgDigest::_GHASH:  tty->print_cr("      available: KIMD GHASH");   break;
 490               default: tty->print_cr("      available: unknown code %d", i);  break;
 491             }
 492           }
 493         }
 494       }
 495       if (test_feature_bit(&_msgdigest_features[2], -1, (int)MsgDigest::_featureBits)) {
 496         tty->print_cr("    available Features of KLMD (Msg Digest):");
 497         for (unsigned int i = 0; i < MsgDigest::_featureBits; i++) {
 498           if (test_feature_bit(&_msgdigest_features[2], i, (int)MsgDigest::_featureBits)) {
 499             switch (i) {
 500               case MsgDigest::_Query:  tty->print_cr("      available: KLMD Query");   break;
 501               case MsgDigest::_SHA1:   tty->print_cr("      available: KLMD SHA-1");   break;
 502               case MsgDigest::_SHA256: tty->print_cr("      available: KLMD SHA-256"); break;
 503               case MsgDigest::_SHA512: tty->print_cr("      available: KLMD SHA-512"); break;
 504               default: tty->print_cr("      available: unknown code %d", i);  break;
 505             }
 506           }
 507         }
 508       }
 509     }
 510     if (ContendedPaddingWidth > 0) {
 511       tty->cr();
 512       tty->print_cr("ContendedPaddingWidth " INTX_FORMAT, ContendedPaddingWidth);
 513     }
 514   }
 515 }
 516 
 517 void VM_Version::print_features() {
 518   print_features_internal("Version:");
 519 }
 520 
 521 void VM_Version::reset_features(bool reset) {
 522   if (reset) {
 523     for (unsigned int i = 0; i < _features_buffer_len; i++) {
 524       VM_Version::_features[i] = 0;
 525     }
 526   }
 527 }
 528 
 529 void VM_Version::set_features_z900(bool reset) {
 530   reset_features(reset);
 531 
 532   set_has_long_displacement();
 533   set_has_ETF2();
 534 }
 535 
 536 void VM_Version::set_features_z990(bool reset) {
 537   reset_features(reset);
 538 
 539   set_features_z900(false);
 540   set_has_ETF3();
 541   set_has_long_displacement_fast();
 542   set_has_HFPMultiplyAndAdd();
 543 }
 544 
 545 void VM_Version::set_features_z9(bool reset) {
 546   reset_features(reset);
 547 
 548   set_features_z990(false);
 549   set_has_StoreFacilityListExtended();
 550   // set_has_Crypto();   // Do not set, crypto features must be retrieved separately.
 551   set_has_ETF2Enhancements();
 552   set_has_ETF3Enhancements();
 553   set_has_extended_immediate();
 554   set_has_StoreClockFast();
 555   set_has_HFPUnnormalized();
 556 }
 557 
 558 void VM_Version::set_features_z10(bool reset) {
 559   reset_features(reset);
 560 
 561   set_features_z9(false);
 562   set_has_CompareSwapStore();
 563   set_has_RelativeLoadStore();
 564   set_has_CompareBranch();
 565   set_has_CompareTrap();
 566   set_has_MultiplySingleImm32();
 567   set_has_Prefetch();
 568   set_has_MoveImmToMem();
 569   set_has_MemWithImmALUOps();
 570   set_has_ExecuteExtensions();
 571   set_has_FPSupportEnhancements();
 572   set_has_DecimalFloatingPoint();
 573   set_has_ExtractCPUtime();
 574   set_has_CryptoExt3();
 575 }
 576 
 577 void VM_Version::set_features_z196(bool reset) {
 578   reset_features(reset);
 579 
 580   set_features_z10(false);
 581   set_has_InterlockedAccessV1();
 582   set_has_PopCount();
 583   set_has_LoadStoreConditional();
 584   set_has_HighWordInstr();
 585   set_has_FastSync();
 586   set_has_FPExtensions();
 587   set_has_DistinctOpnds();
 588   set_has_CryptoExt4();
 589 }
 590 
 591 void VM_Version::set_features_ec12(bool reset) {
 592   reset_features(reset);
 593 
 594   set_features_z196(false);
 595   set_has_MiscInstrExt();
 596   set_has_InterlockedAccessV2();
 597   set_has_LoadAndALUAtomicV2();
 598   set_has_TxMem();
 599 }
 600 
 601 void VM_Version::set_features_z13(bool reset) {
 602   reset_features(reset);
 603 
 604   set_features_ec12(false);
 605   set_has_LoadStoreConditional2();
 606   set_has_CryptoExt5();
 607   set_has_VectorFacility();
 608 }
 609 
 610 void VM_Version::set_features_from(const char* march) {
 611   bool err = false;
 612   bool prt = false;
 613 
 614   if ((march != NULL) && (march[0] != '\0')) {
 615     const int buf_len = 16;
 616     const int hdr_len =  5;
 617     char buf[buf_len];
 618     if (strlen(march) >= hdr_len) {
 619       memcpy(buf, march, hdr_len);
 620       buf[hdr_len] = '\00';
 621     } else {
 622       buf[0]       = '\00';
 623     }
 624 
 625     if (!strcmp(march, "z900")) {
 626       set_features_z900();
 627     } else if (!strcmp(march, "z990")) {
 628         set_features_z990();
 629     } else if (!strcmp(march, "z9")) {
 630         set_features_z9();
 631     } else if (!strcmp(march, "z10")) {
 632         set_features_z10();
 633     } else if (!strcmp(march, "z196")) {
 634         set_features_z196();
 635     } else if (!strcmp(march, "ec12")) {
 636         set_features_ec12();
 637     } else if (!strcmp(march, "z13")) {
 638         set_features_z13();
 639     } else if (!strcmp(buf, "ztest")) {
 640       assert(!has_TestFeaturesImpl(), "possible facility list flag conflict");
 641       if (strlen(march) > hdr_len) {
 642         int itest = 0;
 643         if ((strlen(march)-hdr_len) >= buf_len) err = true;
 644         if (!err) {
 645           memcpy(buf, &march[hdr_len], strlen(march)-hdr_len);
 646           buf[strlen(march)-hdr_len] = '\00';
 647           for (size_t i = 0; !err && (i < strlen(buf)); i++) {
 648             itest = itest*10 + buf[i]-'0';
 649             err   = err || ((buf[i]-'0') < 0) || ((buf[i]-'0') > 9) || (itest > 15);
 650           }
 651         }
 652         if (!err) {
 653           prt = true;
 654           if (itest & 0x01) { set_has_TestFeature1Impl(); }
 655           if (itest & 0x02) { set_has_TestFeature2Impl(); }
 656           if (itest & 0x04) { set_has_TestFeature4Impl(); }
 657           if (itest & 0x08) { set_has_TestFeature8Impl(); }
 658         }
 659       } else {
 660         prt = true;
 661         set_has_TestFeature1Impl();
 662         set_has_TestFeature2Impl();
 663         set_has_TestFeature4Impl();
 664         set_has_TestFeature8Impl();
 665       }
 666     } else {
 667       err = true;
 668     }
 669     if (!err) {
 670       set_features_string();
 671       if (prt || PrintAssembly) {
 672         print_features_internal("CPU Version as set by cmdline option:", prt);
 673       }
 674     } else {
 675       tty->print_cr("***Warning: Unsupported ProcessorArchitecture: %s, internal settings left undisturbed.", march);
 676     }
 677   }
 678 
 679 }
 680 
 681 static long (*getFeatures)(unsigned long*, int, int) = NULL;
 682 
 683 void VM_Version::set_getFeatures(address entryPoint) {
 684   if (getFeatures == NULL) {
 685     getFeatures = (long(*)(unsigned long*, int, int))entryPoint;
 686   }
 687 }
 688 
 689 long VM_Version::call_getFeatures(unsigned long* buffer, int buflen, int functionCode) {
 690   VM_Version::_is_determine_features_test_running = true;
 691   long functionResult = (*getFeatures)(buffer, buflen, functionCode);
 692   VM_Version::_is_determine_features_test_running = false;
 693   return functionResult;
 694 }
 695 
 696 // Helper function for "extract cache attribute" instruction.
 697 int VM_Version::calculate_ECAG_functionCode(unsigned int attributeIndication,
 698                                             unsigned int levelIndication,
 699                                             unsigned int typeIndication) {
 700   return (attributeIndication<<4) | (levelIndication<<1) | typeIndication;
 701 }
 702 
 703 void VM_Version::determine_features() {
 704 
 705   const int      cbuf_size = _code_buffer_len;
 706   const int      buf_len   = _features_buffer_len;
 707 
 708   // Allocate code buffer space for the detection code.
 709   ResourceMark    rm;
 710   CodeBuffer      cbuf("determine CPU features", cbuf_size, 0);
 711   MacroAssembler* a = new MacroAssembler(&cbuf);
 712 
 713   // Emit code.
 714   set_getFeatures(a->pc());
 715   address   code = a->pc();
 716 
 717   // Try STFLE. Possible INVOP will cause defaults to be used.
 718   Label    getFEATURES;
 719   Label    getCPUFEATURES;                   // fcode = -1 (cache)
 720   Label    getCIPHERFEATURES;                // fcode = -2 (cipher)
 721   Label    getMSGDIGESTFEATURES;             // fcode = -3 (SHA)
 722   Label    getVECTORFEATURES;                // fcode = -4 (OS support for vector instructions)
 723   Label    errRTN;
 724   a->z_ltgfr(Z_R0, Z_ARG2);                  // Buf len to r0 and test.
 725   a->z_brl(getFEATURES);                     // negative -> Get machine features not covered by facility list.
 726   a->z_lghi(Z_R1,0);
 727   a->z_brz(errRTN);                          // zero -> Function code currently not used, indicate "aborted".
 728 
 729   a->z_aghi(Z_R0, -1);
 730   a->z_stfle(0, Z_ARG1);
 731   a->z_lg(Z_R1, 0, Z_ARG1);                  // Get first DW of facility list.
 732   a->z_lgr(Z_RET, Z_R0);                     // Calculate rtn value for success.
 733   a->z_la(Z_RET, 1, Z_RET);
 734   a->z_brnz(errRTN);                         // Instr failed if non-zero CC.
 735   a->z_ltgr(Z_R1, Z_R1);                     // Instr failed if first DW == 0.
 736   a->z_bcr(Assembler::bcondNotZero, Z_R14);  // Successful return.
 737 
 738   a->bind(errRTN);
 739   a->z_lngr(Z_RET, Z_RET);
 740   a->z_ltgr(Z_R1, Z_R1);
 741   a->z_bcr(Assembler::bcondNotZero, Z_R14);  // Return "buffer too small".
 742   a->z_xgr(Z_RET, Z_RET);
 743   a->z_br(Z_R14);                            // Return "operation aborted".
 744 
 745   a->bind(getFEATURES);
 746   a->z_cghi(Z_R0, -1);                       // -1: Extract CPU attributes, currently: cache layout only.
 747   a->z_bre(getCPUFEATURES);
 748   a->z_cghi(Z_R0, -2);                       // -2: Extract detailed crypto capabilities (cipher instructions).
 749   a->z_bre(getCIPHERFEATURES);
 750   a->z_cghi(Z_R0, -3);                       // -3: Extract detailed crypto capabilities (msg digest instructions).
 751   a->z_bre(getMSGDIGESTFEATURES);
 752   a->z_cghi(Z_R0, -4);                       // -4: Verify vector instruction availability (OS support).
 753   a->z_bre(getVECTORFEATURES);
 754 
 755   a->z_xgr(Z_RET, Z_RET);                    // Not a valid function code.
 756   a->z_br(Z_R14);                            // Return "operation aborted".
 757 
 758   // Try KIMD/KLMD query function to get details about msg digest (secure hash, SHA) instructions.
 759   a->bind(getMSGDIGESTFEATURES);
 760   a->z_lghi(Z_R0,(int)MsgDigest::_Query);    // query function code
 761   a->z_lgr(Z_R1,Z_R2);                       // param block addr, 2*16 bytes min size
 762   a->z_kimd(Z_R2,Z_R2);                      // Get available KIMD functions (bit pattern in param blk).
 763   a->z_la(Z_R1,16,Z_R1);                     // next param block addr
 764   a->z_klmd(Z_R2,Z_R2);                      // Get available KLMD functions (bit pattern in param blk).
 765   a->z_lghi(Z_RET,4);
 766   a->z_br(Z_R14);
 767 
 768   // Try KM/KMC query function to get details about crypto instructions.
 769   a->bind(getCIPHERFEATURES);
 770   a->z_lghi(Z_R0,(int)Cipher::_Query);       // query function code
 771   a->z_lgr(Z_R1,Z_R2);                       // param block addr, 2*16 bytes min size (KIMD/KLMD output)
 772   a->z_km(Z_R2,Z_R2);                        // get available KM functions
 773   a->z_la(Z_R1,16,Z_R1);                     // next param block addr
 774   a->z_kmc(Z_R2,Z_R2);                       // get available KMC functions
 775   a->z_lghi(Z_RET,4);
 776   a->z_br(Z_R14);
 777 
 778   // Use EXTRACT CPU ATTRIBUTE instruction to get information about cache layout.
 779   a->bind(getCPUFEATURES);
 780   a->z_xgr(Z_R0,Z_R0);                       // as recommended in instruction documentation
 781   a->z_ecag(Z_RET,Z_R0,0,Z_ARG3);            // Extract information as requested by Z_ARG1 contents.
 782   a->z_br(Z_R14);
 783 
 784   // Use a vector instruction to verify OS support. Will fail with SIGFPE if OS support is missing.
 785   a->bind(getVECTORFEATURES);
 786   a->z_vtm(Z_V0,Z_V0);                       // non-destructive vector instruction. Will cause SIGFPE if not supported.
 787   a->z_br(Z_R14);
 788 
 789   address code_end = a->pc();
 790   a->flush();
 791 
 792   // Print the detection code.
 793   bool printVerbose = Verbose || PrintAssembly || PrintStubCode;
 794   if (printVerbose) {
 795     ttyLocker ttyl;
 796     tty->print_cr("Decoding CPU feature detection stub at " INTPTR_FORMAT " before execution:", p2i(code));
 797     tty->print_cr("Stub length is %ld bytes, codebuffer reserves %d bytes, %ld bytes spare.",
 798                   code_end-code, cbuf_size, cbuf_size-(code_end-code));
 799 
 800     // Use existing decode function. This enables the [Code] format which is needed to DecodeErrorFile.
 801     Disassembler::decode((u_char*)code, (u_char*)code_end, tty);
 802   }
 803 
 804   // Prepare for detection code execution and clear work buffer.
 805   _nfeatures        = 0;
 806   _ncipher_features = 0;
 807   unsigned long  buffer[buf_len];
 808 
 809   for (int i = 0; i < buf_len; i++) {
 810     buffer[i] = 0L;
 811   }
 812 
 813   // execute code
 814   // Illegal instructions will be replaced by 0 in signal handler.
 815   // In case of problems, call_getFeatures will return a not-positive result.
 816   long used_len = call_getFeatures(buffer, buf_len, 0);
 817 
 818   bool ok;
 819   if (used_len == 1) {
 820     ok = true;
 821   } else if (used_len > 1) {
 822     unsigned int used_lenU = (unsigned int)used_len;
 823     ok = true;
 824     for (unsigned int i = 1; i < used_lenU; i++) {
 825       ok = ok && (buffer[i] == 0L);
 826     }
 827     if (printVerbose && !ok) {
 828       bool compact = false;
 829       tty->print_cr("Note: feature list has %d (i.e. more than one) array elements.", used_lenU);
 830       if (compact) {
 831         tty->print("non-zero feature list elements:");
 832         for (unsigned int i = 0; i < used_lenU; i++) {
 833           tty->print("  [%d]: 0x%16.16lx", i, buffer[i]);
 834         }
 835         tty->cr();
 836       } else {
 837         for (unsigned int i = 0; i < used_lenU; i++) {
 838           tty->print_cr("non-zero feature list[%d]: 0x%16.16lx", i, buffer[i]);
 839         }
 840       }
 841 
 842       if (compact) {
 843         tty->print_cr("Active features (compact view):");
 844         for (unsigned int k = 0; k < used_lenU; k++) {
 845           tty->print_cr("  buffer[%d]:", k);
 846           for (unsigned int j = k*sizeof(long); j < (k+1)*sizeof(long); j++) {
 847             bool line = false;
 848             for (unsigned int i = j*8; i < (j+1)*8; i++) {
 849               bool bit  = test_feature_bit(buffer, i, used_lenU*sizeof(long)*8);
 850               if (bit) {
 851                 if (!line) {
 852                   tty->print("    byte[%d]:", j);
 853                   line = true;
 854                 }
 855                 tty->print("  [%3.3d]", i);
 856               }
 857             }
 858             if (line) {
 859               tty->cr();
 860             }
 861           }
 862         }
 863       } else {
 864         tty->print_cr("Active features (full view):");
 865         for (unsigned int k = 0; k < used_lenU; k++) {
 866           tty->print_cr("  buffer[%d]:", k);
 867           for (unsigned int j = k*sizeof(long); j < (k+1)*sizeof(long); j++) {
 868             tty->print("    byte[%d]:", j);
 869             for (unsigned int i = j*8; i < (j+1)*8; i++) {
 870               bool bit  = test_feature_bit(buffer, i, used_lenU*sizeof(long)*8);
 871               if (bit) {
 872                 tty->print("  [%3.3d]", i);
 873               } else {
 874                 tty->print("       ");
 875               }
 876             }
 877             tty->cr();
 878           }
 879         }
 880       }
 881     }
 882     ok = true;
 883   } else {  // No features retrieved if we reach here. Buffer too short or instr not available.
 884     if (used_len < 0) {
 885       ok = false;
 886       if (printVerbose) {
 887         tty->print_cr("feature list buffer[%d] too short, required: buffer[%ld]", buf_len, -used_len);
 888       }
 889     } else {
 890       if (printVerbose) {
 891         tty->print_cr("feature list could not be retrieved. Running on z900 or z990? Trying to find out...");
 892       }
 893       used_len = call_getFeatures(buffer, 0, 0);       // Must provide at least two DW buffer elements!!!!
 894 
 895       ok = used_len > 0;
 896       if (ok) {
 897         if (buffer[1]*10 < buffer[0]) {
 898           set_features_z900();
 899         } else {
 900           set_features_z990();
 901         }
 902 
 903         if (printVerbose) {
 904           tty->print_cr("Note: high-speed long displacement test used %ld iterations.", used_len);
 905           tty->print_cr("      Positive displacement loads took %8.8lu microseconds.", buffer[1]);
 906           tty->print_cr("      Negative displacement loads took %8.8lu microseconds.", buffer[0]);
 907           if (has_long_displacement_fast()) {
 908             tty->print_cr("      assuming high-speed long displacement IS     available.");
 909           } else {
 910             tty->print_cr("      assuming high-speed long displacement is NOT available.");
 911           }
 912         }
 913       } else {
 914         if (printVerbose) {
 915           tty->print_cr("Note: high-speed long displacement test was not successful.");
 916           tty->print_cr("      assuming long displacement is NOT available.");
 917         }
 918       }
 919       return; // Do not copy buffer to _features, no test for cipher features.
 920     }
 921   }
 922 
 923   if (ok) {
 924     // Fill features buffer.
 925     // Clear work buffer.
 926     for (int i = 0; i < buf_len; i++) {
 927       _features[i]           = buffer[i];
 928       _cipher_features[i]    = 0;
 929       _msgdigest_features[i] = 0;
 930       buffer[i]              = 0L;
 931     }
 932     _nfeatures = used_len;
 933   } else {
 934     for (int i = 0; i < buf_len; i++) {
 935       _features[i]           = 0;
 936       _cipher_features[i]    = 0;
 937       _msgdigest_features[i] = 0;
 938       buffer[i]              = 0L;
 939     }
 940     _nfeatures = 0;
 941   }
 942 
 943   if (has_VectorFacility()) {
 944     // Verify that feature can actually be used. OS support required.
 945     call_getFeatures(buffer, -4, 0);
 946     if (printVerbose) {
 947       ttyLocker ttyl;
 948       if (has_VectorFacility()) {
 949         tty->print_cr("  Vector Facility has been verified to be supported by OS");
 950       } else {
 951         tty->print_cr("  Vector Facility has been disabled - not supported by OS");
 952       }
 953     }
 954   }
 955 
 956   // Extract Crypto Facility details.
 957   if (has_Crypto()) {
 958     // Get cipher features.
 959     used_len = call_getFeatures(buffer, -2, 0);
 960     for (int i = 0; i < buf_len; i++) {
 961       _cipher_features[i] = buffer[i];
 962     }
 963     _ncipher_features = used_len;
 964 
 965     // Get msg digest features.
 966     used_len = call_getFeatures(buffer, -3, 0);
 967     for (int i = 0; i < buf_len; i++) {
 968       _msgdigest_features[i] = buffer[i];
 969     }
 970     _nmsgdigest_features = used_len;
 971   }
 972 
 973   static int   levelProperties[_max_cache_levels];     // All property indications per level.
 974   static int   levelScope[_max_cache_levels];          // private/shared
 975   static const char* levelScopeText[4] = {"No cache   ",
 976                                           "CPU private",
 977                                           "shared     ",
 978                                           "reserved   "};
 979 
 980   static int   levelType[_max_cache_levels];           // D/I/mixed
 981   static const char* levelTypeText[4]  = {"separate D and I caches",
 982                                           "I cache only           ",
 983                                           "D-cache only           ",
 984                                           "combined D/I cache     "};
 985 
 986   static unsigned int levelReserved[_max_cache_levels];    // reserved property bits
 987   static unsigned int levelLineSize[_max_cache_levels];
 988   static unsigned int levelTotalSize[_max_cache_levels];
 989   static unsigned int levelAssociativity[_max_cache_levels];
 990 
 991 
 992   // Extract Cache Layout details.
 993   if (has_ExtractCPUAttributes() && printVerbose) { // For information only, as of now.
 994     bool         lineSize_mismatch;
 995     bool         print_something;
 996     long         functionResult;
 997     unsigned int attributeIndication = 0; // 0..15
 998     unsigned int levelIndication     = 0; // 0..8
 999     unsigned int typeIndication      = 0; // 0..1 (D-Cache, I-Cache)
1000     int          functionCode        = calculate_ECAG_functionCode(attributeIndication, levelIndication, typeIndication);
1001 
1002     // Get cache topology.
1003     functionResult = call_getFeatures(buffer, -1, functionCode);
1004 
1005     for (unsigned int i = 0; i < _max_cache_levels; i++) {
1006       if (functionResult > 0) {
1007         int shiftVal          = 8*(_max_cache_levels-(i+1));
1008         levelProperties[i]    = (functionResult & (0xffUL<<shiftVal)) >> shiftVal;
1009         levelReserved[i]      = (levelProperties[i] & 0xf0) >> 4;
1010         levelScope[i]         = (levelProperties[i] & 0x0c) >> 2;
1011         levelType[i]          = (levelProperties[i] & 0x03);
1012       } else {
1013         levelProperties[i]    = 0;
1014         levelReserved[i]      = 0;
1015         levelScope[i]         = 0;
1016         levelType[i]          = 0;
1017       }
1018       levelLineSize[i]      = 0;
1019       levelTotalSize[i]     = 0;
1020       levelAssociativity[i] = 0;
1021     }
1022 
1023     tty->cr();
1024     tty->print_cr("------------------------------------");
1025     tty->print_cr("---  Cache Topology Information  ---");
1026     tty->print_cr("------------------------------------");
1027     for (unsigned int i = 0; (i < _max_cache_levels) && (levelProperties[i] != 0); i++) {
1028       tty->print_cr("  Cache Level %d: <scope>  %s | <type>  %s",
1029                     i+1, levelScopeText[levelScope[i]], levelTypeText[levelType[i]]);
1030     }
1031 
1032     // Get D-cache details per level.
1033     _Dcache_lineSize   = 0;
1034     lineSize_mismatch  = false;
1035     print_something    = false;
1036     typeIndication     = 0; // 0..1 (D-Cache, I-Cache)
1037     for (unsigned int i = 0; (i < _max_cache_levels) && (levelProperties[i] != 0); i++) {
1038       if ((levelType[i] == 0) || (levelType[i] == 2)) {
1039         print_something     = true;
1040 
1041         // Get cache line size of level i.
1042         attributeIndication   = 1;
1043         functionCode          = calculate_ECAG_functionCode(attributeIndication, i, typeIndication);
1044         levelLineSize[i]      = (unsigned int)call_getFeatures(buffer, -1, functionCode);
1045 
1046         // Get cache total size of level i.
1047         attributeIndication   = 2;
1048         functionCode          = calculate_ECAG_functionCode(attributeIndication, i, typeIndication);
1049         levelTotalSize[i]     = (unsigned int)call_getFeatures(buffer, -1, functionCode);
1050 
1051         // Get cache associativity of level i.
1052         attributeIndication   = 3;
1053         functionCode          = calculate_ECAG_functionCode(attributeIndication, i, typeIndication);
1054         levelAssociativity[i] = (unsigned int)call_getFeatures(buffer, -1, functionCode);
1055 
1056         _Dcache_lineSize      = _Dcache_lineSize == 0 ? levelLineSize[i] : _Dcache_lineSize;
1057         lineSize_mismatch     = lineSize_mismatch || (_Dcache_lineSize != levelLineSize[i]);
1058       } else {
1059         levelLineSize[i]      = 0;
1060       }
1061     }
1062 
1063     if (print_something) {
1064       tty->cr();
1065       tty->print_cr("------------------------------------");
1066       tty->print_cr("---  D-Cache Detail Information  ---");
1067       tty->print_cr("------------------------------------");
1068       if (lineSize_mismatch) {
1069         tty->print_cr("WARNING: D-Cache line size mismatch!");
1070       }
1071       for (unsigned int i = 0; (i < _max_cache_levels) && (levelProperties[i] != 0); i++) {
1072         if (levelLineSize[i] > 0) {
1073           tty->print_cr("  D-Cache Level %d: line size = %4d,  total size = %6dKB,  associativity = %2d",
1074                         i+1, levelLineSize[i], levelTotalSize[i]/(int)K, levelAssociativity[i]);
1075         }
1076       }
1077     }
1078 
1079     // Get I-cache details per level.
1080     _Icache_lineSize   = 0;
1081     lineSize_mismatch  = false;
1082     print_something    = false;
1083     typeIndication     = 1; // 0..1 (D-Cache, I-Cache)
1084     for (unsigned int i = 0; (i < _max_cache_levels) && (levelProperties[i] != 0); i++) {
1085       if ((levelType[i] == 0) || (levelType[i] == 1)) {
1086         print_something     = true;
1087 
1088         // Get cache line size of level i.
1089         attributeIndication   = 1;
1090         functionCode          = calculate_ECAG_functionCode(attributeIndication, i, typeIndication);
1091         levelLineSize[i]      = (unsigned int)call_getFeatures(buffer, -1, functionCode);
1092 
1093         // Get cache total size of level i.
1094         attributeIndication   = 2;
1095         functionCode          = calculate_ECAG_functionCode(attributeIndication, i, typeIndication);
1096         levelTotalSize[i]     = (unsigned int)call_getFeatures(buffer, -1, functionCode);
1097 
1098         // Get cache associativity of level i.
1099         attributeIndication   = 3;
1100         functionCode          = calculate_ECAG_functionCode(attributeIndication, i, typeIndication);
1101         levelAssociativity[i] = (unsigned int)call_getFeatures(buffer, -1, functionCode);
1102 
1103         _Icache_lineSize      = _Icache_lineSize == 0 ? levelLineSize[i] : _Icache_lineSize;
1104         lineSize_mismatch     = lineSize_mismatch || (_Icache_lineSize != levelLineSize[i]);
1105       } else {
1106         levelLineSize[i]      = 0;
1107       }
1108     }
1109 
1110     if (print_something) {
1111       tty->cr();
1112       tty->print_cr("------------------------------------");
1113       tty->print_cr("---  I-Cache Detail Information  ---");
1114       tty->print_cr("------------------------------------");
1115       if (lineSize_mismatch) {
1116         tty->print_cr("WARNING: I-Cache line size mismatch!");
1117       }
1118       for (unsigned int i = 0; (i < _max_cache_levels) && (levelProperties[i] != 0); i++) {
1119         if (levelLineSize[i] > 0) {
1120           tty->print_cr("  I-Cache Level %d: line size = %4d,  total size = %6dKB,  associativity = %2d",
1121                         i+1, levelLineSize[i], levelTotalSize[i]/(int)K, levelAssociativity[i]);
1122         }
1123       }
1124     }
1125 
1126     // Get D/I-cache details per level.
1127     lineSize_mismatch  = false;
1128     print_something    = false;
1129     typeIndication     = 0; // 0..1 (D-Cache, I-Cache)
1130     for (unsigned int i = 0; (i < _max_cache_levels) && (levelProperties[i] != 0); i++) {
1131       if (levelType[i] == 3) {
1132         print_something     = true;
1133 
1134         // Get cache line size of level i.
1135         attributeIndication   = 1;
1136         functionCode          = calculate_ECAG_functionCode(attributeIndication, i, typeIndication);
1137         levelLineSize[i]      = (unsigned int)call_getFeatures(buffer, -1, functionCode);
1138 
1139         // Get cache total size of level i.
1140         attributeIndication   = 2;
1141         functionCode          = calculate_ECAG_functionCode(attributeIndication, i, typeIndication);
1142         levelTotalSize[i]     = (unsigned int)call_getFeatures(buffer, -1, functionCode);
1143 
1144         // Get cache associativity of level i.
1145         attributeIndication   = 3;
1146         functionCode          = calculate_ECAG_functionCode(attributeIndication, i, typeIndication);
1147         levelAssociativity[i] = (unsigned int)call_getFeatures(buffer, -1, functionCode);
1148 
1149         _Dcache_lineSize      = _Dcache_lineSize == 0 ? levelLineSize[i] : _Dcache_lineSize;
1150         _Icache_lineSize      = _Icache_lineSize == 0 ? levelLineSize[i] : _Icache_lineSize;
1151         lineSize_mismatch     = lineSize_mismatch || (_Dcache_lineSize != levelLineSize[i])
1152                                                   || (_Icache_lineSize != levelLineSize[i]);
1153       } else {
1154         levelLineSize[i]      = 0;
1155       }
1156     }
1157 
1158     if (print_something) {
1159       tty->cr();
1160       tty->print_cr("--------------------------------------");
1161       tty->print_cr("---  D/I-Cache Detail Information  ---");
1162       tty->print_cr("--------------------------------------");
1163       if (lineSize_mismatch) {
1164         tty->print_cr("WARNING: D/I-Cache line size mismatch!");
1165       }
1166       for (unsigned int i = 0; (i < _max_cache_levels) && (levelProperties[i] != 0); i++) {
1167         if (levelLineSize[i] > 0) {
1168           tty->print_cr("  D/I-Cache Level %d: line size = %4d,  total size = %6dKB,  associativity = %2d",
1169                         i+1, levelLineSize[i], levelTotalSize[i]/(int)K, levelAssociativity[i]);
1170         }
1171       }
1172     }
1173     tty->cr();
1174   }
1175   return;
1176 }
1177 
1178 unsigned long VM_Version::z_SIGILL() {
1179   unsigned long   ZeroBuffer = 0;
1180   unsigned long   work;
1181   asm(
1182     "     LA      %[work],%[buffer]  \n\t"   // Load address of buffer.
1183     "     LARL    14,+6              \n\t"   // Load address of faulting instruction.
1184     "     BCR     15,%[work]         \n\t"   // Branch into buffer, execute whatever is in there.
1185     : [buffer]  "+Q"  (ZeroBuffer)   /* outputs   */
1186     , [work]   "=&a"  (work)         /* outputs   */
1187     :                                /* inputs    */
1188     : "cc"                           /* clobbered */
1189  );
1190   return ZeroBuffer;
1191 }
1192 
1193 unsigned long VM_Version::z_SIGSEGV() {
1194   unsigned long   ZeroBuffer = 0;
1195   unsigned long   work;
1196   asm(
1197     "     LG      %[work],%[buffer]  \n\t"   // Load zero address.
1198     "     STG     %[work],0(,%[work])\n\t"   // Store to address zero.
1199     : [buffer]  "+Q"  (ZeroBuffer)   /* outputs   */
1200     , [work]   "=&a"  (work)         /* outputs   */
1201     :                                /* inputs    */
1202     : "cc"                           /* clobbered */
1203  );
1204   return ZeroBuffer;
1205 }
1206