31 #include "logging/log.hpp"
32 #include "logging/logStream.hpp"
33 #include "memory/resourceArea.hpp"
34 #include "memory/universe.hpp"
35 #include "runtime/globals_extension.hpp"
36 #include "runtime/java.hpp"
37 #include "runtime/os.inline.hpp"
38 #include "runtime/stubCodeGenerator.hpp"
39 #include "runtime/vm_version.hpp"
40 #include "utilities/checkedCast.hpp"
41 #include "utilities/ostream.hpp"
42 #include "utilities/powerOfTwo.hpp"
43 #include "utilities/virtualizationSupport.hpp"
44
45 int VM_Version::_cpu;
46 int VM_Version::_model;
47 int VM_Version::_stepping;
48 bool VM_Version::_has_intel_jcc_erratum;
49 VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, };
50
51 #define DECLARE_CPU_FEATURE_NAME(id, name, bit) name,
52 const char* VM_Version::_features_names[] = { CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_NAME)};
53 #undef DECLARE_CPU_FEATURE_NAME
54
55 // Address of instruction which causes SEGV
56 address VM_Version::_cpuinfo_segv_addr = nullptr;
57 // Address of instruction after the one which causes SEGV
58 address VM_Version::_cpuinfo_cont_addr = nullptr;
59 // Address of instruction which causes APX specific SEGV
60 address VM_Version::_cpuinfo_segv_addr_apx = nullptr;
61 // Address of instruction after the one which causes APX specific SEGV
62 address VM_Version::_cpuinfo_cont_addr_apx = nullptr;
63
64 static BufferBlob* stub_blob;
65 static const int stub_size = 2000;
66
67 int VM_Version::VM_Features::_features_bitmap_size = sizeof(VM_Version::VM_Features::_features_bitmap) / BytesPerLong;
68
69 VM_Version::VM_Features VM_Version::_features;
70 VM_Version::VM_Features VM_Version::_cpu_features;
71
3270 }
3271
3272 bool VM_Version::is_intrinsic_supported(vmIntrinsicID id) {
3273 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
3274 switch (id) {
3275 case vmIntrinsics::_floatToFloat16:
3276 case vmIntrinsics::_float16ToFloat:
3277 if (!supports_float16()) {
3278 return false;
3279 }
3280 break;
3281 default:
3282 break;
3283 }
3284 return true;
3285 }
3286
3287 void VM_Version::insert_features_names(VM_Version::VM_Features features, stringStream& ss) {
3288 int i = 0;
3289 ss.join([&]() {
3290 while (i < MAX_CPU_FEATURES) {
3291 if (_features.supports_feature((VM_Version::Feature_Flag)i)) {
3292 return _features_names[i++];
3293 }
3294 i += 1;
3295 }
3296 return (const char*)nullptr;
3297 }, ", ");
3298 }
|
31 #include "logging/log.hpp"
32 #include "logging/logStream.hpp"
33 #include "memory/resourceArea.hpp"
34 #include "memory/universe.hpp"
35 #include "runtime/globals_extension.hpp"
36 #include "runtime/java.hpp"
37 #include "runtime/os.inline.hpp"
38 #include "runtime/stubCodeGenerator.hpp"
39 #include "runtime/vm_version.hpp"
40 #include "utilities/checkedCast.hpp"
41 #include "utilities/ostream.hpp"
42 #include "utilities/powerOfTwo.hpp"
43 #include "utilities/virtualizationSupport.hpp"
44
45 int VM_Version::_cpu;
46 int VM_Version::_model;
47 int VM_Version::_stepping;
48 bool VM_Version::_has_intel_jcc_erratum;
49 VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, };
50
51 #define DECLARE_CPU_FEATURE_NAME(id, name, bit) XSTR(name),
52 const char* VM_Version::_features_names[] = { CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_NAME)};
53 #undef DECLARE_CPU_FEATURE_NAME
54
55 // Address of instruction which causes SEGV
56 address VM_Version::_cpuinfo_segv_addr = nullptr;
57 // Address of instruction after the one which causes SEGV
58 address VM_Version::_cpuinfo_cont_addr = nullptr;
59 // Address of instruction which causes APX specific SEGV
60 address VM_Version::_cpuinfo_segv_addr_apx = nullptr;
61 // Address of instruction after the one which causes APX specific SEGV
62 address VM_Version::_cpuinfo_cont_addr_apx = nullptr;
63
64 static BufferBlob* stub_blob;
65 static const int stub_size = 2000;
66
67 int VM_Version::VM_Features::_features_bitmap_size = sizeof(VM_Version::VM_Features::_features_bitmap) / BytesPerLong;
68
69 VM_Version::VM_Features VM_Version::_features;
70 VM_Version::VM_Features VM_Version::_cpu_features;
71
3270 }
3271
3272 bool VM_Version::is_intrinsic_supported(vmIntrinsicID id) {
3273 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
3274 switch (id) {
3275 case vmIntrinsics::_floatToFloat16:
3276 case vmIntrinsics::_float16ToFloat:
3277 if (!supports_float16()) {
3278 return false;
3279 }
3280 break;
3281 default:
3282 break;
3283 }
3284 return true;
3285 }
3286
3287 void VM_Version::insert_features_names(VM_Version::VM_Features features, stringStream& ss) {
3288 int i = 0;
3289 ss.join([&]() {
3290 const char* str = nullptr;
3291 while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
3292 if (features.supports_feature((VM_Version::Feature_Flag)i)) {
3293 str = _features_names[i];
3294 }
3295 i += 1;
3296 }
3297 return str;
3298 }, ", ");
3299 }
3300
3301 void VM_Version::get_cpu_features_name(void* features_buffer, stringStream& ss) {
3302 VM_Features* features = (VM_Features*)features_buffer;
3303 insert_features_names(*features, ss);
3304 }
3305
3306 void VM_Version::get_missing_features_name(void* features_buffer, stringStream& ss) {
3307 VM_Features* features_to_test = (VM_Features*)features_buffer;
3308 int i = 0;
3309 ss.join([&]() {
3310 const char* str = nullptr;
3311 while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
3312 Feature_Flag flag = (Feature_Flag)i;
3313 if (features_to_test->supports_feature(flag) && !_features.supports_feature(flag)) {
3314 str = _features_names[i];
3315 }
3316 i += 1;
3317 }
3318 return str;
3319 }, ", ");
3320 }
3321
3322 int VM_Version::cpu_features_size() {
3323 return sizeof(VM_Features);
3324 }
3325
3326 void VM_Version::store_cpu_features(void* buf) {
3327 VM_Features copy = _features;
3328 copy.clear_feature(CPU_HT); // HT does not result in incompatibility of aot code cache
3329 memcpy(buf, ©, sizeof(VM_Features));
3330 }
3331
3332 bool VM_Version::supports_features(void* features_buffer) {
3333 VM_Features* features_to_test = (VM_Features*)features_buffer;
3334 return _features.supports_features(features_to_test);
3335 }
|