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