< 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 >