From f26aea9a33aa1b79a6ac2d61a2b4fcf870c74472 Mon Sep 17 00:00:00 2001 From: kevinw Date: Fri, 31 Mar 2017 07:46:19 -0700 Subject: [PATCH] 8165482: java in ldoms, with cpu-arch=generic has problems Reviewed-by: dholmes, alanbur --- src/cpu/sparc/vm/vm_version_sparc.cpp | 14 ++--- .../vm/vm_version_solaris_sparc.cpp | 57 +++++++++++-------- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/cpu/sparc/vm/vm_version_sparc.cpp b/src/cpu/sparc/vm/vm_version_sparc.cpp index 4961c6b14..fd86388d3 100644 --- a/src/cpu/sparc/vm/vm_version_sparc.cpp +++ b/src/cpu/sparc/vm/vm_version_sparc.cpp @@ -236,7 +236,7 @@ void VM_Version::initialize() { assert((OptoLoopAlignment % relocInfo::addr_unit()) == 0, "alignment is not a multiple of NOP size"); char buf[512]; - jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", (has_v9() ? ", v9" : (has_v8() ? ", v8" : "")), (has_hardware_popc() ? ", popc" : ""), (has_vis1() ? ", vis1" : ""), @@ -249,6 +249,7 @@ void VM_Version::initialize() { (has_sha256() ? ", sha256" : ""), (has_sha512() ? ", sha512" : ""), (is_ultra3() ? ", ultra3" : ""), + (has_sparc5_instr() ? ", sparc5" : ""), (is_sun4v() ? ", sun4v" : ""), (is_niagara_plus() ? ", niagara_plus" : (is_niagara() ? ", niagara" : "")), (is_sparc64() ? ", sparc64" : ""), @@ -479,16 +480,13 @@ int VM_Version::parse_features(const char* implementation) { if (strstr(impl, "SPARC-T1") != NULL) { features |= T1_model_m; } + } else if (strstr(impl, "SUN4V-CPU") != NULL) { + // Generic or migration class LDOM + features |= T_family_m; } else { - if (strstr(impl, "SPARC") == NULL) { #ifndef PRODUCT - // kstat on Solaris 8 virtual machines (branded zones) - // returns "(unsupported)" implementation. Solaris 8 is not - // supported anymore, but include this check to be on the - // safe side. - warning("Can't parse CPU implementation = '%s', assume generic SPARC", impl); + warning("Failed to parse CPU implementation = '%s'", impl); #endif - } } os::free((void*)impl); return features; diff --git a/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp b/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp index 51731e369..0e1b7b307 100644 --- a/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp +++ b/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp @@ -438,40 +438,47 @@ int VM_Version::platform_features(int features) { features |= sun4v_m; } - bool use_solaris_12_api = false; - Sysinfo impl(SI_CPUBRAND); - if (impl.valid()) { - // If SI_CPUBRAND works, that means Solaris 12 API to get the cache line sizes - // is available to us as well - use_solaris_12_api = true; - features |= parse_features(impl.value()); + // If SI_CPUBRAND works, that means Solaris 12 API to get the cache line sizes + // is available to us as well + Sysinfo cpu_info(SI_CPUBRAND); + bool use_solaris_12_api = cpu_info.valid(); + const char* impl; + int impl_m = 0; + if (use_solaris_12_api) { + impl = cpu_info.value(); +#ifndef PRODUCT + if (PrintMiscellaneous && Verbose) { + tty->print_cr("Parsing CPU implementation from %s", impl); + } +#endif + impl_m = parse_features(impl); } else { // Otherwise use kstat to determine the machine type. kstat_ctl_t* kc = kstat_open(); - kstat_t* ksp = kstat_lookup(kc, (char*)"cpu_info", -1, NULL); - const char* implementation; - bool has_implementation = false; - if (ksp != NULL) { - if (kstat_read(kc, ksp, NULL) != -1 && ksp->ks_data != NULL) { - kstat_named_t* knm = (kstat_named_t *)ksp->ks_data; - for (int i = 0; i < ksp->ks_ndata; i++) { - if (strcmp((const char*)&(knm[i].name),"implementation") == 0) { - implementation = KSTAT_NAMED_STR_PTR(&knm[i]); - has_implementation = true; + if (kc != NULL) { + kstat_t* ksp = kstat_lookup(kc, (char*)"cpu_info", -1, NULL); + if (ksp != NULL) { + if (kstat_read(kc, ksp, NULL) != -1 && ksp->ks_data != NULL) { + kstat_named_t* knm = (kstat_named_t *)ksp->ks_data; + for (int i = 0; i < ksp->ks_ndata; i++) { + if (strcmp((const char*)&(knm[i].name), "implementation") == 0) { + impl = KSTAT_NAMED_STR_PTR(&knm[i]); #ifndef PRODUCT - if (PrintMiscellaneous && Verbose) { - tty->print_cr("cpu_info.implementation: %s", implementation); - } + if (PrintMiscellaneous && Verbose) { + tty->print_cr("Parsing CPU implementation from %s", impl); + } #endif - features |= parse_features(implementation); - break; + impl_m = parse_features(impl); + break; + } } - } // for( + } } + kstat_close(kc); } - assert(has_implementation, "unknown cpu info (changed kstat interface?)"); - kstat_close(kc); } + assert(impl_m != 0, err_msg("Unknown CPU implementation %s", impl)); + features |= impl_m; bool is_sun4v = (features & sun4v_m) != 0; if (use_solaris_12_api && is_sun4v) { -- GitLab