< prev index next >

src/hotspot/cpu/aarch64/vm_version_aarch64.cpp

Print this page

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


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

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

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

















































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


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

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













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

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