< prev index next >

src/hotspot/cpu/s390/vm_version_s390.cpp

Print this page

        

@@ -45,13 +45,29 @@
 unsigned int  VM_Version::_ncipher_features                         = 0;
 unsigned int  VM_Version::_nmsgdigest_features                      = 0;
 unsigned int  VM_Version::_Dcache_lineSize                          = DEFAULT_CACHE_LINE_SIZE;
 unsigned int  VM_Version::_Icache_lineSize                          = DEFAULT_CACHE_LINE_SIZE;
 
-static const char* z_gen[]     = {"  ",   "G1",   "G2", "G3",    "G4",     "G5",      "G6",   "G7"   };
-static const char* z_machine[] = {"  ", "2064", "2084", "2094",  "2097",   "2817",    "  ",   "2964" };
-static const char* z_name[]    = {"  ", "z900", "z990", "z9 EC", "z10 EC", "z196 EC", "ec12", "z13"  };
+// The following list contains the (approximate) announcement/availability
+// dates of the many System z generations in existence as of now.
+// Information compiled from https://www.ibm.com/support/techdocs/atsmastr.nsf/WebIndex/TD105503
+//   z900: 2000-10
+//   z990: 2003-06
+//   z9:   2005-09
+//   z10:  2007-04
+//   z10:  2008-02
+//   z196: 2010-08
+//   ec12: 2012-09
+//   z13:  2015-03
+//   z14:  2017-09
+//   z15:  2019-09
+
+static const char* z_gen[]     = {"  ", "G1",         "G2",         "G3",         "G4",         "G5",         "G6",         "G7",         "G8",         "G9"  };
+static const char* z_machine[] = {"  ", "2064",       "2084",       "2094",       "2097",       "2817",       "2827",       "2964",       "3906",       "8561" };
+static const char* z_name[]    = {"  ", "z900",       "z990",       "z9 EC",      "z10 EC",     "z196 EC",    "ec12",       "z13",        "z14",        "z15" };
+static const char* z_WDFM[]    = {"  ", "2006-06-30", "2008-06-30", "2010-06-30", "2012-06-30", "2014-06-30", "2016-12-31", "2019-06-30", "2021-06-30", "tbd" };
+static const char* z_EOS[]     = {"  ", "2014-12-31", "2014-12-31", "2017-10-31", "2019-12-31", "2021-12-31", "tbd",        "tbd",        "tbd",        "tbd" };
 
 void VM_Version::initialize() {
   determine_features();      // Get processor capabilities.
   set_features_string();     // Set a descriptive feature indication.
 

@@ -260,76 +276,90 @@
   //   about the unusual notation of features - and when adding new ones.
   //   Features may have one comma at the end.
   //   Furthermore, use one, and only one, separator space between features.
   //   Multiple spaces are considered separate tokens, messing up everything.
   unsigned int ambiguity = 0;
-  _model_string = z_name[0];
+  unsigned int model_ix  = 0;
+  if (is_z15()) {
+    _features_string = "system-z g9-z15 ldisp_fast, extimm, pcrel_load/store, cmpb, cond_load/store, interlocked_update, txm, vectorinstr, instrext2, venh1, instrext3, VEnh2 )";
+    model_ix = 9;
+    ambiguity++;
+  }
+  if (is_z14()) {
+    _features_string = "system-z g8-z14 ldisp_fast, extimm, pcrel_load/store, cmpb, cond_load/store, interlocked_update, txm, vectorinstr, instrext2, venh1)";
+    model_ix = 8;
+    ambiguity++;
+  }
   if (is_z13()) {
     _features_string = "system-z, g7-z13, ldisp_fast, extimm, pcrel_load/store, cmpb, cond_load/store, interlocked_update, txm, vectorinstr";
-    _model_string = z_name[7];
+    model_ix = 7;
     ambiguity++;
   }
   if (is_ec12()) {
     _features_string = "system-z, g6-ec12, ldisp_fast, extimm, pcrel_load/store, cmpb, cond_load/store, interlocked_update, txm";
-    _model_string = z_name[6];
+    model_ix = 6;
     ambiguity++;
   }
   if (is_z196()) {
     _features_string = "system-z, g5-z196, ldisp_fast, extimm, pcrel_load/store, cmpb, cond_load/store, interlocked_update";
-    _model_string = z_name[5];
+    model_ix = 5;
     ambiguity++;
   }
   if (is_z10()) {
     _features_string = "system-z, g4-z10, ldisp_fast, extimm, pcrel_load/store, cmpb";
-    _model_string = z_name[4];
+    model_ix = 4;
     ambiguity++;
   }
   if (is_z9()) {
-    _features_string = "system-z, g3-z9, ldisp_fast, extimm, out-of-support as of 2016-04-01";
-    _model_string = z_name[3];
+    _features_string = "system-z, g3-z9, ldisp_fast, extimm";
+    model_ix = 3;
     ambiguity++;
   }
   if (is_z990()) {
-    _features_string = "system-z, g2-z990, ldisp_fast, out-of-support as of 2014-07-01";
-    _model_string = z_name[2];
+    _features_string = "system-z, g2-z990, ldisp_fast";
+    model_ix = 2;
     ambiguity++;
   }
   if (is_z900()) {
-    _features_string = "system-z, g1-z900, ldisp, out-of-support as of 2014-07-01";
-    _model_string = z_name[1];
+    _features_string = "system-z, g1-z900, ldisp";
+    model_ix = 1;
     ambiguity++;
   }
 
+  char buf[512];
   if (ambiguity == 0) {
-    _features_string = "z/Architecture (unknown generation)";
+    strcpy(buf, "z/Architecture (unknown generation)");
+  } else if (ambiguity == 1) {
+    _model_string = z_name[model_ix];
+    jio_snprintf(buf, sizeof(buf), "%s, out-of-support_as_of_", _features_string, z_EOS[model_ix]);
   } else if (ambiguity > 1) {
     tty->print_cr("*** WARNING *** Ambiguous z/Architecture detection, ambiguity = %d", ambiguity);
     tty->print_cr("                oldest detected generation is %s", _features_string);
-    _features_string = "z/Architecture (ambiguous detection)";
+    strcpy(buf, "z/Architecture (ambiguous detection)");
   }
+  _features_string = os::strdup(buf);
 
   if (has_Crypto_AES()) {
-    char buf[256];
     assert(strlen(_features_string) + 3*8 < sizeof(buf), "increase buffer size");
     jio_snprintf(buf, sizeof(buf), "%s%s%s%s",
                  _features_string,
                  has_Crypto_AES128() ? ", aes128" : "",
                  has_Crypto_AES192() ? ", aes192" : "",
                  has_Crypto_AES256() ? ", aes256" : "");
+    os::free((void *)_features_string);
     _features_string = os::strdup(buf);
   }
 
   if (has_Crypto_SHA()) {
-    char buf[256];
     assert(strlen(_features_string) + 6 + 2*8 + 7 < sizeof(buf), "increase buffer size");
     jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s",
                  _features_string,
                  has_Crypto_SHA1()   ? ", sha1"   : "",
                  has_Crypto_SHA256() ? ", sha256" : "",
                  has_Crypto_SHA512() ? ", sha512" : "",
                  has_Crypto_GHASH()  ? ", ghash"  : "");
-    if (has_Crypto_AES()) { os::free((void *)_features_string); }
+    os::free((void *)_features_string);
     _features_string = os::strdup(buf);
   }
 }
 
 // featureBuffer - bit array indicating availability of various features

@@ -418,15 +448,18 @@
     // z13
     if (has_LoadStoreConditional2()    ) tty->print_cr("available: %s", "Load/Store Conditional 2");
     if (has_CryptoExt5()               ) tty->print_cr("available: %s", "Crypto Extensions 5");
     if (has_DFPPackedConversion()      ) tty->print_cr("available: %s", "DFP Packed Conversions");
     if (has_VectorFacility()           ) tty->print_cr("available: %s", "Vector Facility");
-    // test switches
-    if (has_TestFeature1Impl()         ) tty->print_cr("available: %s", "TestFeature1Impl");
-    if (has_TestFeature2Impl()         ) tty->print_cr("available: %s", "TestFeature2Impl");
-    if (has_TestFeature4Impl()         ) tty->print_cr("available: %s", "TestFeature4Impl");
-    if (has_TestFeature8Impl()         ) tty->print_cr("available: %s", "TestFeature8Impl");
+    // z14
+    if (has_MiscInstrExt2()            ) tty->print_cr("available: %s", "Miscelaneous Instruction Extensions 2");
+    if (has_VectorEnhancements1()      ) tty->print_cr("available: %s", "Vector Facility Enhancements 3");
+    if (has_CryptoExt8()               ) tty->print_cr("available: %s", "Crypto Extensions 8");
+    // z15
+    if (has_MiscInstrExt3()            ) tty->print_cr("available: %s", "Miscelaneous Instruction Extensions 3");
+    if (has_VectorEnhancements2()      ) tty->print_cr("available: %s", "Vector Facility Enhancements 3");
+    if (has_CryptoExt9()               ) tty->print_cr("available: %s", "Crypto Extensions 9");
 
     if (has_Crypto()) {
       tty->cr();
       tty->print_cr("detailed availability of %s capabilities:", "CryptoFacility");
       if (test_feature_bit(&_cipher_features[0], -1, 2*Cipher::_featureBits)) {

@@ -630,10 +663,30 @@
   set_has_LoadStoreConditional2();
   set_has_CryptoExt5();
   set_has_VectorFacility();
 }
 
+void VM_Version::set_features_z14(bool reset) {
+  reset_features(reset);
+
+  set_features_z13(false);
+  set_has_MiscInstrExt2();
+  set_has_VectorEnhancements1();
+  has_VectorPackedDecimal();
+  set_has_CryptoExt8();
+}
+
+void VM_Version::set_features_z15(bool reset) {
+  reset_features(reset);
+
+  set_features_z14(false);
+  set_has_MiscInstrExt3();
+  set_has_VectorEnhancements2();
+  has_VectorPackedDecimalEnh();
+  set_has_CryptoExt9();
+}
+
 void VM_Version::set_features_from(const char* march) {
   bool err = false;
   bool prt = false;
 
   if ((march != NULL) && (march[0] != '\0')) {

@@ -659,37 +712,14 @@
         set_features_z196();
     } else if (!strcmp(march, "ec12")) {
         set_features_ec12();
     } else if (!strcmp(march, "z13")) {
         set_features_z13();
-    } else if (!strcmp(buf, "ztest")) {
-      assert(!has_TestFeaturesImpl(), "possible facility list flag conflict");
-      if (strlen(march) > hdr_len) {
-        int itest = 0;
-        if ((strlen(march)-hdr_len) >= buf_len) err = true;
-        if (!err) {
-          memcpy(buf, &march[hdr_len], strlen(march)-hdr_len);
-          buf[strlen(march)-hdr_len] = '\00';
-          for (size_t i = 0; !err && (i < strlen(buf)); i++) {
-            itest = itest*10 + buf[i]-'0';
-            err   = err || ((buf[i]-'0') < 0) || ((buf[i]-'0') > 9) || (itest > 15);
-          }
-        }
-        if (!err) {
-          prt = true;
-          if (itest & 0x01) { set_has_TestFeature1Impl(); }
-          if (itest & 0x02) { set_has_TestFeature2Impl(); }
-          if (itest & 0x04) { set_has_TestFeature4Impl(); }
-          if (itest & 0x08) { set_has_TestFeature8Impl(); }
-        }
-      } else {
-        prt = true;
-        set_has_TestFeature1Impl();
-        set_has_TestFeature2Impl();
-        set_has_TestFeature4Impl();
-        set_has_TestFeature8Impl();
-      }
+    } else if (!strcmp(march, "z14")) {
+        set_features_z14();
+    } else if (!strcmp(march, "z15")) {
+        set_features_z15();
     } else {
       err = true;
     }
     if (!err) {
       set_features_string();
< prev index next >