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