< prev index next >

src/hotspot/cpu/aarch64/vm_version_aarch64.cpp

Print this page

 32 #include "runtime/vm_version.hpp"
 33 #include "utilities/formatBuffer.hpp"
 34 #include "utilities/macros.hpp"
 35 #include "utilities/ostream.hpp"
 36 
 37 int VM_Version::_cpu;
 38 int VM_Version::_model;
 39 int VM_Version::_model2;
 40 int VM_Version::_variant;
 41 int VM_Version::_revision;
 42 int VM_Version::_stepping;
 43 
 44 int VM_Version::_zva_length;
 45 int VM_Version::_dcache_line_size;
 46 int VM_Version::_icache_line_size;
 47 int VM_Version::_initial_sve_vector_length;
 48 int VM_Version::_max_supported_sve_vector_length;
 49 bool VM_Version::_rop_protection;
 50 uintptr_t VM_Version::_pac_mask;
 51 
 52 SpinWait VM_Version::_spin_wait;
 53 
 54 const char* VM_Version::_features_names[MAX_CPU_FEATURES] = { nullptr };
 55 


 56 static SpinWait get_spin_wait_desc() {
 57   SpinWait spin_wait(OnSpinWaitInst, OnSpinWaitInstCount);
 58   if (spin_wait.inst() == SpinWait::SB && !VM_Version::supports_sb()) {
 59     vm_exit_during_initialization("OnSpinWaitInst is SB but current CPU does not support SB instruction");
 60   }
 61 
 62   return spin_wait;
 63 }
 64 
 65 void VM_Version::initialize() {
 66 #define SET_CPU_FEATURE_NAME(id, name, bit) \
 67   _features_names[bit] = XSTR(name);
 68   CPU_FEATURE_FLAGS(SET_CPU_FEATURE_NAME)
 69 #undef SET_CPU_FEATURE_NAME
 70 
 71   _supports_atomic_getset4 = true;
 72   _supports_atomic_getadd4 = true;
 73   _supports_atomic_getset8 = true;
 74   _supports_atomic_getadd8 = true;
 75 

632     clear_feature(CPU_SVEBITPERM);
633   }
634   if (UseSVE < 1) {
635     clear_feature(CPU_SVE);
636   }
637 
638   // Construct the "features" string
639   stringStream ss(512);
640   ss.print("0x%02x:0x%x:0x%03x:%d", _cpu, _variant, _model, _revision);
641   if (_model2) {
642     ss.print("(0x%03x)", _model2);
643   }
644   ss.print(", ");
645   int features_offset = (int)ss.size();
646   insert_features_names(_features, ss);
647 
648   _cpu_info_string = ss.as_string(true);
649   _features_string = _cpu_info_string + features_offset;
650 }
651 
652 void VM_Version::insert_features_names(uint64_t features, stringStream& ss) {
653   int i = 0;
654   ss.join([&]() {
655     while (i < MAX_CPU_FEATURES) {
656       if (supports_feature((VM_Version::Feature_Flag)i)) {
657         return _features_names[i++];
658       }
659       i += 1;
660     }
661     return (const char*)nullptr;
662   }, ", ");
663 }
664 
665 #if defined(LINUX)
666 static bool check_info_file(const char* fpath,
667                             const char* virt1, VirtualizationType vt1,
668                             const char* virt2, VirtualizationType vt2) {
669   char line[500];
670   FILE* fp = os::fopen(fpath, "r");
671   if (fp == nullptr) {
672     return false;
673   }
674   while (fgets(line, sizeof(line), fp) != nullptr) {
675     if (strcasestr(line, virt1) != nullptr) {
676       Abstract_VM_Version::_detected_virtualization = vt1;
677       fclose(fp);
678       return true;
679     }
680     if (virt2 != nullptr && strcasestr(line, virt2) != nullptr) {
681       Abstract_VM_Version::_detected_virtualization = vt2;
682       fclose(fp);
683       return true;
684     }

713 }
714 
715 void VM_Version::initialize_cpu_information(void) {
716   // do nothing if cpu info has been initialized
717   if (_initialized) {
718     return;
719   }
720 
721   _no_of_cores  = os::processor_count();
722   _no_of_threads = _no_of_cores;
723   _no_of_sockets = _no_of_cores;
724   os::snprintf_checked(_cpu_name, CPU_TYPE_DESC_BUF_SIZE - 1, "AArch64");
725 
726   int desc_len = os::snprintf(_cpu_desc, CPU_DETAILED_DESC_BUF_SIZE, "AArch64 ");
727   get_compatible_board(_cpu_desc + desc_len, CPU_DETAILED_DESC_BUF_SIZE - desc_len);
728   desc_len = (int)strlen(_cpu_desc);
729   os::snprintf_checked(_cpu_desc + desc_len, CPU_DETAILED_DESC_BUF_SIZE - desc_len, " %s", _cpu_info_string);
730 
731   _initialized = true;
732 }

















































 32 #include "runtime/vm_version.hpp"
 33 #include "utilities/formatBuffer.hpp"
 34 #include "utilities/macros.hpp"
 35 #include "utilities/ostream.hpp"
 36 
 37 int VM_Version::_cpu;
 38 int VM_Version::_model;
 39 int VM_Version::_model2;
 40 int VM_Version::_variant;
 41 int VM_Version::_revision;
 42 int VM_Version::_stepping;
 43 
 44 int VM_Version::_zva_length;
 45 int VM_Version::_dcache_line_size;
 46 int VM_Version::_icache_line_size;
 47 int VM_Version::_initial_sve_vector_length;
 48 int VM_Version::_max_supported_sve_vector_length;
 49 bool VM_Version::_rop_protection;
 50 uintptr_t VM_Version::_pac_mask;
 51 


 52 const char* VM_Version::_features_names[MAX_CPU_FEATURES] = { nullptr };
 53 
 54 SpinWait VM_Version::_spin_wait;
 55 
 56 static SpinWait get_spin_wait_desc() {
 57   SpinWait spin_wait(OnSpinWaitInst, OnSpinWaitInstCount);
 58   if (spin_wait.inst() == SpinWait::SB && !VM_Version::supports_sb()) {
 59     vm_exit_during_initialization("OnSpinWaitInst is SB but current CPU does not support SB instruction");
 60   }
 61 
 62   return spin_wait;
 63 }
 64 
 65 void VM_Version::initialize() {
 66 #define SET_CPU_FEATURE_NAME(id, name, bit) \
 67   _features_names[bit] = XSTR(name);
 68   CPU_FEATURE_FLAGS(SET_CPU_FEATURE_NAME)
 69 #undef SET_CPU_FEATURE_NAME
 70 
 71   _supports_atomic_getset4 = true;
 72   _supports_atomic_getadd4 = true;
 73   _supports_atomic_getset8 = true;
 74   _supports_atomic_getadd8 = true;
 75 

632     clear_feature(CPU_SVEBITPERM);
633   }
634   if (UseSVE < 1) {
635     clear_feature(CPU_SVE);
636   }
637 
638   // Construct the "features" string
639   stringStream ss(512);
640   ss.print("0x%02x:0x%x:0x%03x:%d", _cpu, _variant, _model, _revision);
641   if (_model2) {
642     ss.print("(0x%03x)", _model2);
643   }
644   ss.print(", ");
645   int features_offset = (int)ss.size();
646   insert_features_names(_features, ss);
647 
648   _cpu_info_string = ss.as_string(true);
649   _features_string = _cpu_info_string + features_offset;
650 }
651 













652 #if defined(LINUX)
653 static bool check_info_file(const char* fpath,
654                             const char* virt1, VirtualizationType vt1,
655                             const char* virt2, VirtualizationType vt2) {
656   char line[500];
657   FILE* fp = os::fopen(fpath, "r");
658   if (fp == nullptr) {
659     return false;
660   }
661   while (fgets(line, sizeof(line), fp) != nullptr) {
662     if (strcasestr(line, virt1) != nullptr) {
663       Abstract_VM_Version::_detected_virtualization = vt1;
664       fclose(fp);
665       return true;
666     }
667     if (virt2 != nullptr && strcasestr(line, virt2) != nullptr) {
668       Abstract_VM_Version::_detected_virtualization = vt2;
669       fclose(fp);
670       return true;
671     }

700 }
701 
702 void VM_Version::initialize_cpu_information(void) {
703   // do nothing if cpu info has been initialized
704   if (_initialized) {
705     return;
706   }
707 
708   _no_of_cores  = os::processor_count();
709   _no_of_threads = _no_of_cores;
710   _no_of_sockets = _no_of_cores;
711   os::snprintf_checked(_cpu_name, CPU_TYPE_DESC_BUF_SIZE - 1, "AArch64");
712 
713   int desc_len = os::snprintf(_cpu_desc, CPU_DETAILED_DESC_BUF_SIZE, "AArch64 ");
714   get_compatible_board(_cpu_desc + desc_len, CPU_DETAILED_DESC_BUF_SIZE - desc_len);
715   desc_len = (int)strlen(_cpu_desc);
716   os::snprintf_checked(_cpu_desc + desc_len, CPU_DETAILED_DESC_BUF_SIZE - desc_len, " %s", _cpu_info_string);
717 
718   _initialized = true;
719 }
720 
721 void VM_Version::insert_features_names(uint64_t features, stringStream& ss) {
722   int i = 0;
723   ss.join([&]() {
724     const char* str = nullptr;
725     while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
726       if (supports_feature((VM_Version::Feature_Flag)i)) {
727         str = _features_names[i];
728       }
729       i += 1;
730     }
731     return str;
732   }, ", ");
733 }
734 
735 void VM_Version::get_cpu_features_name(void* features_buffer, stringStream& ss) {
736   uint64_t features = *(uint64_t*)features_buffer;
737   insert_features_names(features, ss);
738 }
739 
740 void VM_Version::get_missing_features_name(void* features_buffer, stringStream& ss) {
741   uint64_t features_to_test = *(uint64_t*)features_buffer;
742   int i = 0;
743   ss.join([&]() {
744     const char* str = nullptr;
745     while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
746       Feature_Flag flag = (Feature_Flag)i;
747       if (supports_feature(features_to_test, flag) && !supports_feature(flag)) {
748         str = _features_names[i];
749       }
750       i += 1;
751     }
752     return str;
753   }, ", ");
754 }
755 
756 int VM_Version::cpu_features_size() {
757   return sizeof(_features);
758 }
759 
760 void VM_Version::store_cpu_features(void* buf) {
761   *(uint64_t*)buf = _features;
762 }
763 
764 bool VM_Version::supports_features(void* features_buffer) {
765   uint64_t features_to_test = *(uint64_t*)features_buffer;
766   return (_features & features_to_test) == features_to_test;
767 }
< prev index next >