< prev index next >

src/hotspot/cpu/aarch64/vm_version_aarch64.cpp

Print this page
@@ -47,14 +47,14 @@
  int VM_Version::_initial_sve_vector_length;
  int VM_Version::_max_supported_sve_vector_length;
  bool VM_Version::_rop_protection;
  uintptr_t VM_Version::_pac_mask;
  
- SpinWait VM_Version::_spin_wait;
- 
  const char* VM_Version::_features_names[MAX_CPU_FEATURES] = { nullptr };
  
+ SpinWait VM_Version::_spin_wait;
+ 
  static SpinWait get_spin_wait_desc() {
    SpinWait spin_wait(OnSpinWaitInst, OnSpinWaitInstCount);
    if (spin_wait.inst() == SpinWait::SB && !VM_Version::supports_sb()) {
      vm_exit_during_initialization("OnSpinWaitInst is SB but current CPU does not support SB instruction");
    }

@@ -647,23 +647,10 @@
  
    _cpu_info_string = ss.as_string(true);
    _features_string = _cpu_info_string + features_offset;
  }
  
- void VM_Version::insert_features_names(uint64_t features, stringStream& ss) {
-   int i = 0;
-   ss.join([&]() {
-     while (i < MAX_CPU_FEATURES) {
-       if (supports_feature((VM_Version::Feature_Flag)i)) {
-         return _features_names[i++];
-       }
-       i += 1;
-     }
-     return (const char*)nullptr;
-   }, ", ");
- }
- 
  #if defined(LINUX)
  static bool check_info_file(const char* fpath,
                              const char* virt1, VirtualizationType vt1,
                              const char* virt2, VirtualizationType vt2) {
    char line[500];

@@ -728,5 +715,53 @@
    desc_len = (int)strlen(_cpu_desc);
    os::snprintf_checked(_cpu_desc + desc_len, CPU_DETAILED_DESC_BUF_SIZE - desc_len, " %s", _cpu_info_string);
  
    _initialized = true;
  }
+ 
+ void VM_Version::insert_features_names(uint64_t features, stringStream& ss) {
+   int i = 0;
+   ss.join([&]() {
+     const char* str = nullptr;
+     while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
+       if (supports_feature((VM_Version::Feature_Flag)i)) {
+         str = _features_names[i];
+       }
+       i += 1;
+     }
+     return str;
+   }, ", ");
+ }
+ 
+ void VM_Version::get_cpu_features_name(void* features_buffer, stringStream& ss) {
+   uint64_t features = *(uint64_t*)features_buffer;
+   insert_features_names(features, ss);
+ }
+ 
+ void VM_Version::get_missing_features_name(void* features_buffer, stringStream& ss) {
+   uint64_t features_to_test = *(uint64_t*)features_buffer;
+   int i = 0;
+   ss.join([&]() {
+     const char* str = nullptr;
+     while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
+       Feature_Flag flag = (Feature_Flag)i;
+       if (supports_feature(features_to_test, flag) && !supports_feature(flag)) {
+         str = _features_names[i];
+       }
+       i += 1;
+     }
+     return str;
+   }, ", ");
+ }
+ 
+ int VM_Version::cpu_features_size() {
+   return sizeof(_features);
+ }
+ 
+ void VM_Version::store_cpu_features(void* buf) {
+   *(uint64_t*)buf = _features;
+ }
+ 
+ bool VM_Version::supports_features(void* features_buffer) {
+   uint64_t features_to_test = *(uint64_t*)features_buffer;
+   return (_features & features_to_test) == features_to_test;
+ }
< prev index next >