diff --git a/src/hotspot/cpu/aarch64/vmStructs_aarch64.hpp b/src/hotspot/cpu/aarch64/vmStructs_aarch64.hpp index a9f2d2ff2aa..2ec901f6a2e 100644 --- a/src/hotspot/cpu/aarch64/vmStructs_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/vmStructs_aarch64.hpp @@ -41,7 +41,7 @@ #define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant) -#define DECLARE_INT_CPU_FEATURE_CONSTANT(id, name) GENERATE_VM_INT_CONSTANT_ENTRY(VM_Version::CPU_##id) +#define DECLARE_INT_CPU_FEATURE_CONSTANT(id, name, bit) GENERATE_VM_INT_CONSTANT_ENTRY(VM_Version::CPU_##id) #define VM_INT_CPU_FEATURE_CONSTANTS CPU_FEATURE_FLAGS(DECLARE_INT_CPU_FEATURE_CONSTANT) #endif // CPU_AARCH64_VMSTRUCTS_AARCH64_HPP diff --git a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp index a12cc1f5304..f07315a8637 100644 --- a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp @@ -59,6 +59,7 @@ GLIBC_UNSUPPORTED(PACA ); \ GLIBC_UNSUPPORTED(SVEBITPERM); \ GLIBC_UNSUPPORTED(SVE2 ); \ + GLIBC_UNSUPPORTED(STXR_PREFETCH_UNUSED); \ GLIBC_UNSUPPORTED(A53MAC ); \ GLIBC_UNSUPPORTED(ECV ); \ GLIBC_UNSUPPORTED(WFXT ); \ @@ -90,9 +91,7 @@ bool VM_Version::_ic_ivau_trapped; VM_Version::VM_Features VM_Version::_features; VM_Version::VM_Features VM_Version::_cpu_features; -#define DECLARE_CPU_FEATURE_NAME(id, name) XSTR(name), -const char* VM_Version::_features_names[] = { CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_NAME)}; -#undef DECLARE_CPU_FEATURE_NAME +const VM_Features::FeaturesNames VM_Version::_features_names = VM_Features::make_features_names(); static SpinWait get_spin_wait_desc() { SpinWait spin_wait(OnSpinWaitInst, OnSpinWaitInstCount, OnSpinWaitDelay); @@ -897,32 +896,13 @@ bool VM_Version::cpu_features_binary(VM_Version::VM_Features *data) { } VM_Features VM_Version::CPUFeatures_mandatory() { - // TODO: check if there are any mandatory features and set them here return VM_Features(); } VM_Features VM_Version::CPUFeatures_generic() { - VM_Features retval = CPUFeatures_mandatory(); - retval.set_feature(CPU_FP); - retval.set_feature(CPU_ASIMD); - // PACA cannot be made compatible between CPUs that do and do not support it. - if (_cpu_features.supports_feature(CPU_PACA)) { - retval.set_feature(CPU_PACA); - } - if (_cpu_features.supports_feature(CPU_NOTPACA)) { - retval.set_feature(CPU_NOTPACA); - } - return retval; -} - -void VM_Version::print_using_features_cr() { - if (_ignore_glibc_not_using) { - tty->print_raw_cr("CPU features are being kept intact as requested by -XX:CPUFeatures=ignore"); - } else { - tty->print_raw("CPU features being used are: -XX:CPUFeatures="); - _features.print_numbers(*tty); - tty->cr(); - } + // CPU_PACA and non-PACA processors cannot share the same image. Also we cannot disable glibc using features like CPU_LSE. + vm_exit_during_initialization("-XX:CPUFeatures=generic is not available on aarch64"); + ShouldNotReachHere(); } const char *VM_Version::restore_failed_check(const VM_Features *image_features, const VM_Features *current_features) { diff --git a/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp b/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp index bbfc1052c0c..c44c9124523 100644 --- a/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp @@ -34,46 +34,46 @@ class VM_Feature_Flag { public: -#define CPU_FEATURE_FLAGS(decl) \ - decl(FP, fp ) \ - decl(ASIMD, asimd ) \ - decl(EVTSTRM, evtstrm ) \ - decl(AES, aes ) \ - decl(PMULL, pmull ) \ - decl(SHA1, sha1 ) \ - decl(SHA2, sha256 ) \ - decl(CRC32, crc32 ) \ - decl(LSE, lse ) \ - decl(FPHP, fphp ) \ - decl(ASIMDHP, asimdhp ) \ - decl(DCPOP, dcpop ) \ - decl(SHA3, sha3 ) \ - decl(SHA512, sha512 ) \ - decl(SVE, sve ) \ - decl(SB, sb ) \ - decl(PACA, paca ) \ - decl(SVEBITPERM, svebitperm) \ - decl(SVE2, sve2 ) \ - decl(A53MAC, a53mac ) \ - decl(ECV, ecv ) \ - decl(WFXT, wfxt ) \ - decl(NOTPACA, notpaca ) \ +#define CPU_FEATURE_FLAGS(decl) \ + decl(FP, fp, 0) \ + decl(ASIMD, asimd, 1) \ + decl(EVTSTRM, evtstrm, 2) \ + decl(AES, aes, 3) \ + decl(PMULL, pmull, 4) \ + decl(SHA1, sha1, 5) \ + decl(SHA2, sha256, 6) \ + decl(CRC32, crc32, 7) \ + decl(LSE, lse, 8) \ + decl(FPHP, fphp, 9) \ + decl(ASIMDHP, asimdhp, 10) \ + decl(DCPOP, dcpop, 11) \ + decl(SHA3, sha3, 12) \ + decl(SHA512, sha512, 13) \ + decl(SVE, sve, 14) \ + decl(SB, sb, 15) \ + decl(PACA, paca, 16) \ + decl(SVEBITPERM, svebitperm, 17) \ + decl(SVE2, sve2, 18) \ + decl(STXR_PREFETCH_UNUSED, stxr_prefetch, 19) \ + decl(A53MAC, a53mac, 20) \ + decl(ECV, ecv, 21) \ + decl(WFXT, wfxt, 22) \ + /* These features are added for CRaC. */ \ + decl(NOTPACA, notpaca, 63) \ /**/ enum Feature_Flag { - #define DECLARE_CPU_FEATURE_FLAG(id, name) CPU_##id, + #define DECLARE_CPU_FEATURE_FLAG(id, name, bit) CPU_##id = (bit), CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_FLAG) #undef DECLARE_CPU_FEATURE_FLAG - MAX_CPU_FEATURES + MAX_CPU_FEATURES, + LAST_CPU_FEATURE = CPU_WFXT, + FIRST_GLIBC_FEATURE = CPU_NOTPACA }; }; #include "runtime/vm_features.inline.hpp" -class stringStream; - -#define BIT_MASK(flag) (1ULL<<(flag)) - class VM_Version : public Abstract_VM_Version, public VM_Feature_Flag { friend class VMStructs; @@ -214,10 +214,10 @@ class VM_Version : public Abstract_VM_Version, public VM_Feature_Flag { static void cpu_features_init(); - static const char* _features_names[]; + static const VM_Features::FeaturesNames _features_names; // Feature identification -#define CPU_FEATURE_DETECTION(id, name) \ +#define CPU_FEATURE_DETECTION(id, name, bit) \ static bool supports_##name() { return supports_feature(CPU_##id); } CPU_FEATURE_FLAGS(CPU_FEATURE_DETECTION) #undef CPU_FEATURE_DETECTION diff --git a/src/hotspot/cpu/x86/vmStructs_x86.hpp b/src/hotspot/cpu/x86/vmStructs_x86.hpp index 33b1f3c5e57..9c251bebb20 100644 --- a/src/hotspot/cpu/x86/vmStructs_x86.hpp +++ b/src/hotspot/cpu/x86/vmStructs_x86.hpp @@ -45,7 +45,7 @@ #define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant) -#define DECLARE_LONG_CPU_FEATURE_CONSTANT(id, name) GENERATE_VM_LONG_CONSTANT_ENTRY(VM_Version::CPU_##id) +#define DECLARE_LONG_CPU_FEATURE_CONSTANT(id, name, bit) GENERATE_VM_LONG_CONSTANT_ENTRY(VM_Version::CPU_##id) #define VM_LONG_CPU_FEATURE_CONSTANTS CPU_FEATURE_FLAGS(DECLARE_LONG_CPU_FEATURE_CONSTANT) #endif // CPU_X86_VMSTRUCTS_X86_HPP diff --git a/src/hotspot/cpu/x86/vm_version_x86.cpp b/src/hotspot/cpu/x86/vm_version_x86.cpp index d339b73a4a8..7f0f9346554 100644 --- a/src/hotspot/cpu/x86/vm_version_x86.cpp +++ b/src/hotspot/cpu/x86/vm_version_x86.cpp @@ -126,6 +126,9 @@ /* These are handled as an exception in VM_Version::glibc_patch(). */ \ GLIBC_UNSUPPORTED(CMPXCHG16 ); \ GLIBC_UNSUPPORTED(LAHFSAHF ); \ + /* Unused fields, see the enum definition. */ \ + GLIBC_UNSUPPORTED(MMX_UNUSED ); \ + GLIBC_UNSUPPORTED(FLUSH_UNUSED ); \ /**/ #if INCLUDE_CPU_FEATURE_ACTIVE @@ -143,9 +146,7 @@ int VM_Version::_stepping; bool VM_Version::_has_intel_jcc_erratum; VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, }; -#define DECLARE_CPU_FEATURE_NAME(id, name) XSTR(name), -const char* VM_Version::_features_names[] = { CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_NAME)}; -#undef DECLARE_CPU_FEATURE_NAME +const VM_Features::FeaturesNames VM_Version::_features_names = VM_Features::make_features_names(); // Address of instruction which causes SEGV address VM_Version::_cpuinfo_segv_addr = nullptr; @@ -2166,16 +2167,6 @@ bool VM_Version::cpu_features_binary(VM_Version::VM_Features *data) { return true; } -void VM_Version::print_using_features_cr() { - if (_ignore_glibc_not_using) { - tty->print_raw_cr("CPU features are being kept intact as requested by -XX:CPUFeatures=ignore"); - } else { - tty->print_raw("CPU features being used are: -XX:CPUFeatures="); - _features.aot_code_cache_features().print_numbers(*tty); - tty->cr(); - } -} - #ifdef COMPILER2 // Determine if it's running on Cascade Lake using default options. bool VM_Version::is_default_intel_cascade_lake() { @@ -3200,6 +3191,14 @@ VM_Version::VM_Features VM_Version::CpuidInfo::feature_flags() const { if (std_cpuid1_ecx.bits.osxsave != 0) { vm_features.set_feature(CPU_OSXSAVE); } + if (sef_cpuid7_edx.bits.cet_ibt != 0) { + // GLIBC name for CPU_CET_IBT, we could share its bit in VM_Features. + vm_features.set_feature(CPU_IBT); + } + if (sef_cpuid7_ecx.bits.cet_ss != 0) { + // GLIBC name for CPU_CET_SS, we could share its bit in VM_Features. + vm_features.set_feature(CPU_SHSTK); + } if (std_cpuid1_ecx.bits.xsave != 0) { vm_features.set_feature(CPU_XSAVE); } @@ -3230,6 +3229,9 @@ VM_Version::VM_Features VM_Version::CpuidInfo::feature_flags() const { } } } + // Unused fields, see the enum definition. + vm_features.set_feature(CPU_MMX_UNUSED); + vm_features.set_feature(CPU_FLUSH_UNUSED); // Composite features. if (supports_tscinv_bit() && @@ -3421,8 +3423,12 @@ bool VM_Version::is_intrinsic_supported(vmIntrinsicID id) { VM_Features VM_Version::CPUFeatures_mandatory() { VM_Features vm_features; + // JDK-8383881 in jdk28+ removed supports_sse(), supports_sse2(), supports_mmx() and supports_clflush(). + // JDK-8384869 has kept CPU_SSE and CPU_SSE2 bits but they are no longer being checked in JDK code. vm_features.set_feature(CPU_SSE); vm_features.set_feature(CPU_SSE2); + vm_features.set_feature(CPU_MMX_UNUSED); + vm_features.set_feature(CPU_FLUSH_UNUSED); return vm_features; } @@ -3432,7 +3438,7 @@ VM_Features VM_Version::CPUFeatures_generic() { #else VM_Features retval = CPUFeatures_mandatory(); #ifdef AMD64 - // The following options are all in /proc/cpuinfo of one of the first 64-bit CPUs - Atom D2700 (and Opteron 1352): https://superuser.com/q/1572306/1015048 + // The following options are all in /proc/cpuinfo of one of the first 64-bit CPUs - Atom D2700 (and Opteron 1352): https://superuser.com/q/1572306/1015048 retval.set_feature(CPU_FXSR); // enabled in 'gcc -Q --help=target', not used by OpenJDK retval.set_feature(CPU_TSC); // not used by gcc, used by OpenJDK retval.set_feature(CPU_CX8); // gcc detects it to set cpu "pentium" (=32-bit only), used by OpenJDK diff --git a/src/hotspot/cpu/x86/vm_version_x86.hpp b/src/hotspot/cpu/x86/vm_version_x86.hpp index 8ae18ac9860..64e3011c764 100644 --- a/src/hotspot/cpu/x86/vm_version_x86.hpp +++ b/src/hotspot/cpu/x86/vm_version_x86.hpp @@ -38,88 +38,97 @@ class VM_Feature_Flag { public: enum Feature_Flag { + /* Fields *_UNUSED are kept for backwards compatibility of the -XX:CPUFeatures mask. + * They must be defined so that detection of enum contiguity does not trigger. + */ #define CPU_FEATURE_FLAGS(decl) \ - decl(CX8, cx8 ) /* next bits are from cpuid 1 (EDX) */ \ - decl(CMOV, cmov ) \ - decl(FXSR, fxsr ) \ - decl(HT, ht ) \ - decl(3DNOW_PREFETCH, 3dnowpref ) /* Processor supports 3dnow prefetch and prefetchw instructions */ \ - /* may not necessarily support other 3dnow instructions */ \ - decl(SSE, sse ) \ - decl(SSE2, sse2 ) \ - decl(SSE3, sse3 ) /* SSE3 comes from cpuid 1 (ECX) */ \ - decl(SSSE3, ssse3 ) \ - decl(SSE4A, sse4a ) \ - decl(SSE4_1, sse4.1 ) \ - decl(SSE4_2, sse4.2 ) \ - decl(POPCNT, popcnt ) \ - decl(LZCNT, lzcnt ) \ - decl(TSC, tsc ) \ - decl(TSCINV_BIT, tscinvbit ) \ - decl(TSCINV, tscinv ) \ - decl(AVX, avx ) \ - decl(AVX2, avx2 ) \ - decl(AES, aes ) \ - decl(ERMS, erms ) /* enhanced 'rep movsb/stosb' instructions */ \ - decl(CLMUL, clmul ) /* carryless multiply for CRC */ \ - decl(BMI1, bmi1 ) \ - decl(BMI2, bmi2 ) \ - decl(RTM, rtm ) /* Restricted Transactional Memory instructions */ \ - decl(ADX, adx ) \ - decl(AVX512F, avx512f ) /* AVX 512bit foundation instructions */ \ - decl(AVX512DQ, avx512dq ) \ - decl(AVX512PF, avx512pf ) \ - decl(AVX512ER, avx512er ) \ - decl(AVX512CD, avx512cd ) \ - decl(AVX512BW, avx512bw ) /* Byte and word vector instructions */ \ - decl(AVX512VL, avx512vl ) /* EVEX instructions with smaller vector length */ \ - decl(SHA, sha ) /* SHA instructions */ \ - decl(FMA, fma ) /* FMA instructions */ \ - decl(VZEROUPPER, vzeroupper ) /* Vzeroupper instruction */ \ - decl(AVX512_VPOPCNTDQ, avx512_vpopcntdq ) /* Vector popcount */ \ - decl(AVX512_VPCLMULQDQ, avx512_vpclmulqdq ) /* Vector carryless multiplication */ \ - decl(AVX512_VAES, avx512_vaes ) /* Vector AES instruction */ \ - decl(AVX512_VNNI, avx512_vnni ) /* Vector Neural Network Instructions */ \ - decl(FLUSHOPT, clflushopt ) /* flusopth instruction */ \ - decl(CLWB, clwb ) /* clwb instruction */ \ - decl(AVX512_VBMI2, avx512_vbmi2 ) /* VBMI2 shift left double instructions */ \ - decl(AVX512_VBMI, avx512_vbmi ) /* Vector BMI instructions */ \ - decl(HV, hv ) /* Hypervisor instructions */ \ - decl(SERIALIZE, serialize ) /* CPU SERIALIZE */ \ - decl(RDTSCP, rdtscp ) /* RDTSCP instruction */ \ - decl(RDPID, rdpid ) /* RDPID instruction */ \ - decl(FSRM, fsrm ) /* Fast Short REP MOV */ \ - decl(GFNI, gfni ) /* Vector GFNI instructions */ \ - decl(AVX512_BITALG, avx512_bitalg ) /* Vector sub-word popcount and bit gather instructions */\ - decl(F16C, f16c ) /* Half-precision and single precision FP conversion instructions*/ \ - decl(PKU, pku ) /* Protection keys for user-mode pages */ \ - decl(OSPKE, ospke ) /* OS enables protection keys */ \ - decl(CET_IBT, cet_ibt ) /* Control Flow Enforcement - Indirect Branch Tracking */ \ - decl(CET_SS, cet_ss ) /* Control Flow Enforcement - Shadow Stack */ \ - decl(AVX512_IFMA, avx512_ifma ) /* Integer Vector FMA instructions*/ \ - decl(AVX_IFMA, avx_ifma ) /* 256-bit VEX-coded variant of AVX512-IFMA*/ \ - decl(APX_F, apx_f ) /* Intel Advanced Performance Extensions*/ \ - decl(SHA512, sha512 ) /* SHA512 instructions*/ \ - decl(AVX512_FP16, avx512_fp16 ) /* AVX512 FP16 ISA support*/ \ - decl(AVX10_1, avx10_1 ) /* AVX10 512 bit vector ISA Version 1 support*/ \ - decl(AVX10_2, avx10_2 ) /* AVX10 512 bit vector ISA Version 2 support*/ \ - decl(HYBRID, hybrid ) /* Hybrid architecture */ \ - decl(FMA4, fma4 ) \ - decl(MOVBE, movbe ) \ - decl(OSXSAVE, osxsave ) \ - decl(IBT, ibt ) \ - decl(SHSTK, shstk ) /* Also known as cet_ss */ \ - decl(XSAVE, xsave ) \ - decl(CMPXCHG16, cmpxchg16 ) /* Also known in cpuinfo as cx16 and in glibc as cmpxchg16b */ \ - decl(LAHFSAHF, lahfsahf ) /* Also known in cpuinfo as lahf_lm and in glibc as lahf64_sahf64 */ \ - decl(HTT, htt ) /* hotspot calls it 'ht' but that is affected by threads_per_core() */ \ - decl(XSAVEC, xsavec ) \ - decl(AVX_Fast_Unaligned_Load, avx_fast_unaligned_load) \ - -#define DECLARE_CPU_FEATURE_FLAG(id, name) CPU_##id, + decl(CX8, cx8, 0) /* next bits are from cpuid 1 (EDX) */ \ + decl(CMOV, cmov, 1) \ + decl(FXSR, fxsr, 2) \ + decl(HT, ht, 3) \ + decl(MMX_UNUSED, mmx, 4) \ + decl(3DNOW_PREFETCH, 3dnowpref, 5) /* Processor supports 3dnow prefetch and prefetchw instructions */ \ + decl(SSE, sse, 6) \ + decl(SSE2, sse2, 7) \ + decl(SSE3, sse3, 8) /* SSE3 comes from cpuid 1 (ECX) */ \ + decl(SSSE3, ssse3, 9) \ + decl(SSE4A, sse4a, 10) \ + decl(SSE4_1, sse4.1, 11) \ + decl(SSE4_2, sse4.2, 12) \ + decl(POPCNT, popcnt, 13) \ + decl(LZCNT, lzcnt, 14) \ + decl(TSC, tsc, 15) \ + decl(TSCINV_BIT, tscinvbit, 16) \ + decl(TSCINV, tscinv, 17) \ + decl(AVX, avx, 18) \ + decl(AVX2, avx2, 19) \ + decl(AES, aes, 20) \ + decl(ERMS, erms, 21) /* enhanced 'rep movsb/stosb' instructions */ \ + decl(CLMUL, clmul, 22) /* carryless multiply for CRC */ \ + decl(BMI1, bmi1, 23) \ + decl(BMI2, bmi2, 24) \ + decl(RTM, rtm, 25) /* Restricted Transactional Memory instructions */ \ + decl(ADX, adx, 26) \ + decl(AVX512F, avx512f, 27) /* AVX 512bit foundation instructions */ \ + decl(AVX512DQ, avx512dq, 28) \ + decl(AVX512PF, avx512pf, 29) \ + decl(AVX512ER, avx512er, 30) \ + decl(AVX512CD, avx512cd, 31) \ + decl(AVX512BW, avx512bw, 32) /* Byte and word vector instructions */ \ + decl(AVX512VL, avx512vl, 33) /* EVEX instructions with smaller vector length */ \ + decl(SHA, sha, 34) /* SHA instructions */ \ + decl(FMA, fma, 35) /* FMA instructions */ \ + decl(VZEROUPPER, vzeroupper, 36) /* Vzeroupper instruction */ \ + decl(AVX512_VPOPCNTDQ, avx512_vpopcntdq, 37) /* Vector popcount */ \ + decl(AVX512_VPCLMULQDQ, avx512_vpclmulqdq, 38) /* Vector carryless multiplication */ \ + decl(AVX512_VAES, avx512_vaes, 39) /* Vector AES instruction */ \ + decl(AVX512_VNNI, avx512_vnni, 40) /* Vector Neural Network Instructions */ \ + decl(FLUSH_UNUSED, clflush, 41) /* flush instruction */ \ + decl(FLUSHOPT, clflushopt, 42) /* flusopth instruction */ \ + decl(CLWB, clwb, 43) /* clwb instruction */ \ + decl(AVX512_VBMI2, avx512_vbmi2, 44) /* VBMI2 shift left double instructions */ \ + decl(AVX512_VBMI, avx512_vbmi, 45) /* Vector BMI instructions */ \ + decl(HV, hv, 46) /* Hypervisor instructions */ \ + decl(SERIALIZE, serialize, 47) /* CPU SERIALIZE */ \ + decl(RDTSCP, rdtscp, 48) /* RDTSCP instruction */ \ + decl(RDPID, rdpid, 49) /* RDPID instruction */ \ + decl(FSRM, fsrm, 50) /* Fast Short REP MOV */ \ + decl(GFNI, gfni, 51) /* Vector GFNI instructions */ \ + decl(AVX512_BITALG, avx512_bitalg, 52) /* Vector sub-word popcount and bit gather instructions */\ + decl(F16C, f16c, 53) /* Half-precision and single precision FP conversion instructions*/ \ + decl(PKU, pku, 54) /* Protection keys for user-mode pages */ \ + decl(OSPKE, ospke, 55) /* OS enables protection keys */ \ + decl(CET_IBT, cet_ibt, 56) /* Control Flow Enforcement - Indirect Branch Tracking */ \ + decl(CET_SS, cet_ss, 57) /* Control Flow Enforcement - Shadow Stack */ \ + decl(AVX512_IFMA, avx512_ifma, 58) /* Integer Vector FMA instructions*/ \ + decl(AVX_IFMA, avx_ifma, 59) /* 256-bit VEX-coded variant of AVX512-IFMA*/ \ + decl(APX_F, apx_f, 60) /* Intel Advanced Performance Extensions*/ \ + decl(SHA512, sha512, 61) /* SHA512 instructions*/ \ + decl(AVX512_FP16, avx512_fp16, 62) /* AVX512 FP16 ISA support*/ \ + decl(AVX10_1, avx10_1, 63) /* AVX10 512 bit vector ISA Version 1 support*/ \ + decl(AVX10_2, avx10_2, 64) /* AVX10 512 bit vector ISA Version 2 support*/ \ + decl(HYBRID, hybrid, 65) /* Hybrid architecture */ \ + /* These features are added for CRaC for GLIBC_TUNABLES=glibc.cpu.hwcaps . */ \ + decl(FMA4, fma4, 117) \ + decl(MOVBE, movbe, 118) \ + decl(OSXSAVE, osxsave, 119) \ + decl(IBT, ibt, 120) \ + decl(SHSTK, shstk, 121) /* Also known as cet_ss */ \ + decl(XSAVE, xsave, 122) \ + decl(CMPXCHG16, cmpxchg16, 123) /* Also known in cpuinfo as cx16 and in glibc as cmpxchg16b */ \ + decl(LAHFSAHF, lahfsahf, 124) /* Also known in cpuinfo as lahf_lm and in glibc as lahf64_sahf64 */ \ + decl(HTT, htt, 125) /* hotspot calls it 'ht' but that is affected by threads_per_core() */ \ + decl(XSAVEC, xsavec, 126) \ + decl(AVX_Fast_Unaligned_Load, avx_fast_unaligned_load, 127) \ + /**/ + +#define DECLARE_CPU_FEATURE_FLAG(id, name, bit) CPU_##id = (bit), CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_FLAG) #undef DECLARE_CPU_FEATURE_FLAG - MAX_CPU_FEATURES + MAX_CPU_FEATURES, + // Define a window of unused features so that adding new CPU_* upstream does not shift the GLIBC features. + LAST_CPU_FEATURE = CPU_HYBRID, + FIRST_GLIBC_FEATURE = CPU_FMA4 }; }; @@ -492,7 +501,7 @@ class VM_Version : public Abstract_VM_Version, protected VM_Feature_Flag { // Original CPU feature flags vector, not affected by VM settings. static VM_Features _cpu_features; - static const char* _features_names[]; + static const VM_Features::FeaturesNames _features_names; static void clear_feature(Feature_Flag feature) { _features.clear_feature(feature); diff --git a/src/hotspot/os_cpu/linux_aarch64/vm_version_linux_aarch64.cpp b/src/hotspot/os_cpu/linux_aarch64/vm_version_linux_aarch64.cpp index cf43222a4af..3f935146084 100644 --- a/src/hotspot/os_cpu/linux_aarch64/vm_version_linux_aarch64.cpp +++ b/src/hotspot/os_cpu/linux_aarch64/vm_version_linux_aarch64.cpp @@ -28,6 +28,7 @@ #include "runtime/os.hpp" #include "runtime/os.inline.hpp" #include "runtime/vm_version.hpp" +#include "utilities/formatBuffer.hpp" #include #include @@ -216,18 +217,14 @@ void VM_Version::check_os_cpu_info() { paca.set_feature(CPU_PACA); VM_Features notpaca; notpaca.set_feature(CPU_NOTPACA); - stringStream ss; - ss.print_cr("For -XX:CPUFeatures, exactly one of the bits PACA (%s) and NOTPACA (%s) must be set.", paca.print_numbers(), notpaca.print_numbers()); - vm_exit_during_initialization(ss.base()); + vm_exit_during_initialization(err_msg("For -XX:CPUFeatures, exactly one of the bits PACA (%s) and NOTPACA (%s) must be set.", paca.print_numbers(), notpaca.print_numbers())); } if (_cpu_features.supports_feature(CPU_LSE) && !supports_lse()) { ResourceMark rm; VM_Features lse; lse.set_feature(VM_Feature_Flag::CPU_LSE); - stringStream ss; // GLIBC_TUNABLES=glibc.cpu.hwcaps is unsupported on aarch64 - ss.print_cr("LSE (%s) cannot be disabled via -XX:CPUFeatures on aarch64.", lse.print_numbers()); - vm_exit_during_initialization(ss.base()); + vm_exit_during_initialization(err_msg("LSE (%s) cannot be disabled via -XX:CPUFeatures on aarch64.", lse.print_numbers())); } } diff --git a/src/hotspot/share/runtime/abstract_vm_version.inline.hpp b/src/hotspot/share/runtime/abstract_vm_version.inline.hpp index c5c8a740c14..8f710ef642d 100644 --- a/src/hotspot/share/runtime/abstract_vm_version.inline.hpp +++ b/src/hotspot/share/runtime/abstract_vm_version.inline.hpp @@ -29,6 +29,7 @@ #include "logging/log.hpp" #include "logging/logStream.hpp" #include "memory/resourceArea.hpp" +#include "runtime/perfMemory.hpp" VM_Features VM_Version::CPUFeatures_parse(const char *str) { if (str == nullptr || strcmp(str, "native") == 0) { @@ -182,6 +183,10 @@ void VM_Version::glibc_reexec() { argv[argv_used] = nullptr; #undef CMDLINE + // Delete the hsperfdata file as the new JVM will have the same PID. + // CPUFeaturesAWS.sh would fail with: Could not find any processes matching : 'CPUFeaturesAWS' + perfMemory_exit(); + #define EXEC "/proc/self/exe" execv(EXEC, argv); vm_exit_during_initialization(err_msg("Cannot re-execute " EXEC ": %m")); @@ -258,6 +263,12 @@ bool VM_Version::glibc_not_using() { VM_Features all_features; all_features.set_all_features(); + for (VM_Feature_Flag::Feature_Flag gapix = static_cast(static_cast(LAST_CPU_FEATURE) + 1); + gapix < FIRST_GLIBC_FEATURE; + gapix = static_cast(static_cast(gapix) + 1)) { + assert(!handled.supports_feature(gapix), "wrongly set CPUFeatures gap"); + all_features.clear_feature(gapix); + } if (handled != all_features) { stringStream ss; ss.print_raw("internal error: Unsupported disabling of some CPU_* "); @@ -278,6 +289,16 @@ bool VM_Version::glibc_not_using() { #undef REEXEC_NAME #endif // LINUX +void VM_Version::print_using_features_cr() { + if (_ignore_glibc_not_using) { + tty->print_raw_cr("CPU features are being kept intact as requested by -XX:CPUFeatures=ignore"); + } else { + tty->print_raw("CPU features being used are: -XX:CPUFeatures="); + _features.aot_code_cache_features().print_numbers(*tty); + tty->cr(); + } +} + void VM_Version::cpu_features_init() { assert(!CPUFeatures == FLAG_IS_DEFAULT(CPUFeatures), "CPUFeatures parsing"); assert((CPUFeatures_mandatory() & ~_features).empty(), "machine is missing mandatory features"); diff --git a/src/hotspot/share/runtime/vm_features.inline.hpp b/src/hotspot/share/runtime/vm_features.inline.hpp index 38754771d54..8fe9ca2894b 100644 --- a/src/hotspot/share/runtime/vm_features.inline.hpp +++ b/src/hotspot/share/runtime/vm_features.inline.hpp @@ -24,8 +24,17 @@ #ifndef SHARE_RUNTIME_VM_FEATURES_INLINE_HPP #define SHARE_RUNTIME_VM_FEATURES_INLINE_HPP +// No vm_features.hpp - this depends on arch-specific VM_Feature_Flag. + +#include "memory/allocation.hpp" +#include "utilities/debug.hpp" +#include "utilities/globalDefinitions.hpp" +#include "utilities/macros.hpp" #include "utilities/ostream.hpp" +#include +#include + class VM_Features : protected VM_Feature_Flag { friend class VMStructs; @@ -204,6 +213,33 @@ class VM_Features : protected VM_Feature_Flag { print_numbers(ss); return buf; } + + struct FeaturesNames { + const char *names[MAX_CPU_FEATURES]; + + constexpr const char *operator[](size_t i) const { + const char *retval = names[i]; + assert(i < MAX_CPU_FEATURES, "Too big CPUFeature index"); + return retval ? retval : "?"; + } + }; + + static constexpr const char *make_features_names_name(size_t i) { + switch (i) { +#define DECLARE_CPU_FEATURE_NAME(id, name, bit) case bit: return STR(name); + CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_NAME) +#undef DECLARE_CPU_FEATURE_NAME + default: + return nullptr; + } + } + template + static constexpr FeaturesNames make_features_names(std::index_sequence) { + return {{ make_features_names_name(I)... }}; + } + static constexpr FeaturesNames make_features_names() { + return make_features_names(std::make_index_sequence{}); + } }; #endif // SHARE_RUNTIME_VM_FEATURES_INLINE_HPP diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbLongConstant.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbLongConstant.java index e0fed251f73..7fd3eb23d02 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbLongConstant.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbLongConstant.java @@ -107,7 +107,7 @@ private static void checkForTruncation(String longConstantOutput) throws Excepti // Expected value obtained from the CPU_SHA definition in vm_version_x86.hpp checkLongValue("VM_Version::CPU_SHA ", longConstantOutput, - 33L); + 34L); } } diff --git a/test/jdk/jdk/crac/CPUFeatures/CPUFeaturesAWS.java b/test/jdk/jdk/crac/CPUFeatures/CPUFeaturesAWS.java index 6ba02b52409..e0b3e2c9c97 100644 --- a/test/jdk/jdk/crac/CPUFeatures/CPUFeaturesAWS.java +++ b/test/jdk/jdk/crac/CPUFeatures/CPUFeaturesAWS.java @@ -23,7 +23,7 @@ public class CPUFeaturesAWS { public static void main(String[] args) { - for (int i = 0;; ++i) { + for (int i = 0; i < 60; ++i) { System.out.println("CPUFeaturesCheck " + i); try { Thread.sleep(1000); diff --git a/test/jdk/jdk/crac/CPUFeatures/CPUFeaturesAWS.sh b/test/jdk/jdk/crac/CPUFeatures/CPUFeaturesAWS.sh index f5ad1ab339c..720ff3950b6 100755 --- a/test/jdk/jdk/crac/CPUFeatures/CPUFeaturesAWS.sh +++ b/test/jdk/jdk/crac/CPUFeatures/CPUFeaturesAWS.sh @@ -180,7 +180,7 @@ setup() { fi getipaddr if [ -z "$(ipaddr $kind)" ];then - aws ec2 run-instances --no-cli-pager --profile $profile --region us-west-2 --image-id $debianami --instance-type $kind --key-name $AWS_KEY_NAME --subnet-id subnet-0a6fd4c98705a4c63 --security-group-ids sg-0081bc08de42b1086 --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=$awstagname-$kind}]" --instance-initiated-shutdown-behavior terminate --user-data $'#!/bin/bash\nshutdown -P +'$awstimeout + aws ec2 run-instances --no-cli-pager --profile $profile --region us-west-2 --image-id $debianami --instance-type $kind --key-name $AWS_KEY_NAME --subnet-id subnet-0a6fd4c98705a4c63 --security-group-ids sg-0081bc08de42b1086 --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=$awstagname-$kind}]" --instance-initiated-shutdown-behavior terminate --user-data $'#!/bin/bash\nfor i in $(seq 1 '$awstimeout');do sleep 1m;done;shutdown -P now' for i in `seq 1 60`;do getipaddr if [ -n "$(ipaddr $kind)" ];then @@ -246,16 +246,16 @@ checkpoint_restore_one() { kind=$kind_checkpoint setup snapshot="$(runssh "./CPUFeaturesAWS.sh internal_checkpoint $enginecmdline $checkpoint_args" 2>&1|tee /proc/self/fd/2)" + local r="$engine" if [ "$expectrc" = -1 ] && echo "$snapshot"|grep "$expect_error";then r="$r-PASS" else if [ $kind_restore != $kind_checkpoint ];then kind=$kind_restore setup - runssh "rm -rf cr;ssh -o 'UserKnownHostsFile /dev/null' -o 'StrictHostKeyChecking no' -i key $(ipaddr $kind_checkpoint) tar cf - cr|tar xf -" + runssh "rm -rf cr;ssh -o 'UserKnownHostsFile /dev/null' -o 'StrictHostKeyChecking no' -i key $(ipaddr $kind_checkpoint) tar cf - cr|sudo tar xf -" fi restore="$(runssh "./CPUFeaturesAWS.sh internal_restore $enginecmdline $restore_args" 2>&1|tee /proc/self/fd/2)" - local r="$engine" if echo "$restore"|grep -w RC=$expectrc && echo "$restore"|grep "$expect_error";then r="$r-PASS" else @@ -287,23 +287,29 @@ if echo "$arch"|grep -q ', x86-64, ';then # Exception in thread "main" java.lang.OutOfMemoryError: Java heap space # at CPUFeaturesAWS.(CPUFeaturesAWS.java:32) -# ZULU-84672: CPUFeatures: Intel/AMD image portability problem; non-contained intersection; a!=(a&b)!=b -checkpoint_restore "$LINENO" t3a.micro t3.micro "1:Restore failed due to incompatible or missing CPU features, try using -XX:CPUFeatures=0x8510c02eefdf7,0x3f3 on checkpoint." "" "" +# Test 2 issues: +# 1: ZULU-84672: CPUFeatures: Intel/AMD image portability problem; non-contained intersection; a!=(a&b)!=b +# 2: CheckCPUFeatures=skip is not inherited from snapshot to restore. +checkpoint_restore "$LINENO" t3a.micro t3.micro "1:Restore failed due to incompatible or missing CPU features, try using -XX:CPUFeatures=0x21461805ddfbf7,0xfcc0000000000000 on checkpoint." \ + "-XX:+UnlockExperimentalVMOptions -XX:CheckCPUFeatures=skip" "" + +# CheckCPUFeatures=skip at restore skips verification of the machine features; restore succeeds just due to a luck here. +checkpoint_restore "$LINENO" t3a.micro t3.micro "" "" "-XX:+UnlockExperimentalVMOptions -XX:CheckCPUFeatures=skip" # Test the current state of things, it may be fixed in the future. checkpoint_restore "$LINENO" t3a.micro t3.micro "1:VM option .*CPUFeatures.* is not restore-settable and is not available on restore." \ "" "-XX:CPUFeatures=ignore" -# Test printing during snapshot: "CPU features are being kept intact as requested by -XX:CPUFeatures=ignore" -checkpoint_restore "$LINENO" t3a.micro t3.micro "" "-XX:CPUFeatures=ignore" "" +# It should also print during snapshot: "CPU features are being kept intact as requested by -XX:CPUFeatures=ignore" +checkpoint_restore "$LINENO" t3a.micro t3.micro "1:Restore failed due to wrong or missing CPU architecture (current architecture is amd64)" "-XX:CPUFeatures=ignore" "" -checkpoint_restore "$LINENO" t3a.micro t3.micro "" "-XX:CPUFeatures=0x8510c02eefdf7,0x3f3" -checkpoint_restore "$LINENO" t3.micro t3a.micro "" "-XX:CPUFeatures=0x8510c02eefdf7,0x3f3" +checkpoint_restore "$LINENO" t3a.micro t3.micro "" "-XX:CPUFeatures=0x21461805ddfbf7,0xfcc0000000000000" +checkpoint_restore "$LINENO" t3.micro t3a.micro "" "-XX:CPUFeatures=0x21461805ddfbf7,0xfcc0000000000000" checkpoint_restore "$LINENO" m1.small t3.micro # criu FAIL: JDK-8373027: [CRaC] [CRIU] x86: FPU xsave area present, but host cpu doesn't support it -checkpoint_restore "$LINENO" t3.micro m1.small "" "-XX:CPUFeatures=0x500000385de7,0xe0" "" +checkpoint_restore "$LINENO" t3.micro m1.small "" "-XX:CPUFeatures=0x142000070bbd7,0x3800000000000000" "" checkpoint_restore "$LINENO" t3.micro t3.micro "" "-XX:CPUFeatures=native" "" @@ -314,7 +320,7 @@ checkpoint_restore "$LINENO" t3.micro t3.micro "" "-XX:CPUFeatures=generic" "" # Currently the most modern x86_64 CPU in AWS. # criu FAIL: ZULU-84505: [CRaC] [CRIU] Fix a failure for checkpoint on AWS m8i-flex.large -checkpoint_restore "$LINENO" m8i-flex.large m1.small "" "-XX:CPUFeatures=0x500000385de7,0xe0" "" +checkpoint_restore "$LINENO" m8i-flex.large m1.small "" "-XX:CPUFeatures=0x142000070bbd7,0x3800000000000000" "" # 8374491: CPUFeatures: check performance regression of AVX_Fast_Unaligned_Load lastline="$LINENO" @@ -336,14 +342,14 @@ elif echo "$arch"|grep -q ', ARM aarch64, ';then checkpoint_restore "$LINENO" a1.medium a1.medium checkpoint_restore "$LINENO" t4g.micro t4g.micro checkpoint_restore "$LINENO" a1.medium t4g.micro -checkpoint_restore "$LINENO" t4g.micro a1.medium "1:Restore failed due to incompatible or missing CPU features, try using -XX:CPUFeatures=0x4000ff on checkpoint." -checkpoint_restore "$LINENO" t4g.micro a1.medium "-1:LSE (0x100) cannot be disabled via -XX:CPUFeatures on aarch64." "-XX:CPUFeatures=0x4000ff" "" +checkpoint_restore "$LINENO" t4g.micro a1.medium "1:Restore failed due to incompatible or missing CPU features, try using -XX:CPUFeatures=0x80000000000000ff on checkpoint." +checkpoint_restore "$LINENO" t4g.micro a1.medium "-1:LSE (0x100) cannot be disabled via -XX:CPUFeatures on aarch64." "-XX:CPUFeatures=0x80000000000000ff" "" -checkpoint_restore "$LINENO" c7g.medium c7g.medium -checkpoint_restore "$LINENO" c8g.medium c8g.medium +# JDK-8385359: checkpoint_restore "$LINENO" c7g.medium c7g.medium +# JDK-8385359: checkpoint_restore "$LINENO" c8g.medium c8g.medium # JDK-8385359: checkpoint_restore "$LINENO" c7g.medium c8g.medium checkpoint_restore "$LINENO" c8g.medium c7g.medium "1:Restore failed due to incompatible or missing CPU features, try using -XX:CPUFeatures=0x17fff on checkpoint." -checkpoint_restore "$LINENO" c8g.medium c7g.medium "" "-XX:CPUFeatures=0x17fff" "" +# JDK-8385359: checkpoint_restore "$LINENO" c8g.medium c7g.medium "" "-XX:CPUFeatures=0x17fff" "" checkpoint_restore "$LINENO" t4g.micro c8g.medium "1:Restore failed due to incompatible aarch64 CPU feature PACA (0x10000); these CPUs each require a separate image." checkpoint_restore "$LINENO" c8g.medium t4g.micro "1:Restore failed due to incompatible aarch64 CPU feature PACA (0x10000); these CPUs each require a separate image." diff --git a/test/jdk/jdk/crac/CPUFeatures/SimpleCPUFeaturesTest.java b/test/jdk/jdk/crac/CPUFeatures/SimpleCPUFeaturesTest.java index 05439831c3c..a84f0de5aca 100644 --- a/test/jdk/jdk/crac/CPUFeatures/SimpleCPUFeaturesTest.java +++ b/test/jdk/jdk/crac/CPUFeatures/SimpleCPUFeaturesTest.java @@ -28,9 +28,15 @@ * @library /test/lib * @build SimpleCPUFeaturesTest * @run driver jdk.test.lib.crac.CracTest native - * @run driver jdk.test.lib.crac.CracTest generic * @run driver jdk.test.lib.crac.CracTest ignore */ +/* + * @test id=NAMED-GENERIC + * @requires os.arch!="aarch64" + * @library /test/lib + * @build SimpleCPUFeaturesTest + * @run driver jdk.test.lib.crac.CracTest generic + */ /* * @test id=TUNABLES * @requires os.family == "linux" @@ -52,7 +58,7 @@ * @library /test/lib * @build SimpleCPUFeaturesTest * @comment FLUSH and SSE2 must be present - * @run driver jdk.test.lib.crac.CracTest 0x60,0x0 + * @run driver jdk.test.lib.crac.CracTest 0x200000080d7,0x0 * @run driver jdk.test.lib.crac.CracTest foobar -- INVALID_FORMAT2 * @run driver jdk.test.lib.crac.CracTest 0xfffff,0x0 -- MISSING_FEATURES_ON_MACHINE * @run driver jdk.test.lib.crac.CracTest 0x60,0xfff -- MISSING_FEATURES_ON_MACHINE @@ -64,8 +70,8 @@ * @requires os.family != "linux" * @library /test/lib * @build SimpleCPUFeaturesTest - * @run driver jdk.test.lib.crac.CracTest foobar -- OS_DOES_NOT_SUPPORT - * @run driver jdk.test.lib.crac.CracTest 0x60,0x0 -- OS_DOES_NOT_SUPPORT + * @run driver jdk.test.lib.crac.CracTest foobar -- OS_DOES_NOT_SUPPORT + * @run driver jdk.test.lib.crac.CracTest 0x20000000080,0x0 -- OS_DOES_NOT_SUPPORT */ /* * @test id=AARCH64-LINUX @@ -73,7 +79,7 @@ * @requires os.arch=="aarch64" * @library /test/lib * @build SimpleCPUFeaturesTest - * @run driver jdk.test.lib.crac.CracTest 0x0 + * @run driver jdk.test.lib.crac.CracTest 0x0 -- INVALID_PACA * @run driver jdk.test.lib.crac.CracTest 0x0,0x0 -- INVALID_FORMAT1 * @run driver jdk.test.lib.crac.CracTest foobar -- INVALID_FORMAT1 */ @@ -93,6 +99,7 @@ public class SimpleCPUFeaturesTest implements CracTest { private enum ErrorMsg { INVALID_FORMAT1("must be of the form: 0xNUM"), INVALID_FORMAT2("must be of the form: 0xNUM,0xNUM"), + INVALID_PACA("For -XX:CPUFeatures, exactly one of the bits PACA (0x10000) and NOTPACA (0x8000000000000000) must be set."), MISSING_FEATURES_ON_MACHINE("missing the following features required by -XX:CPUFeatures"), MISSING_FEATURES_IN_INPUT("-XX:CPUFeatures is missing mandatory features"), ARCH_DOES_NOT_SUPPORT("This architecture does not support any arch-specific"), diff --git a/test/jdk/jdk/crac/engine/CheckCPUFeaturesMessageTest.java b/test/jdk/jdk/crac/engine/CheckCPUFeaturesMessageTest.java index eb4b7efc784..c658ed48b82 100644 --- a/test/jdk/jdk/crac/engine/CheckCPUFeaturesMessageTest.java +++ b/test/jdk/jdk/crac/engine/CheckCPUFeaturesMessageTest.java @@ -39,7 +39,7 @@ * @run driver jdk.test.lib.crac.CracTest */ public class CheckCPUFeaturesMessageTest implements CracTest { - private static final String GENERIC_FEATURES_X86 = "0x4067,0x0"; + private static final String GENERIC_FEATURES_X86 = "0x200000080d7,0x0"; private void testDefault(CracBuilder builder) throws Exception { builder.doRestoreToAnalyze() diff --git a/test/jdk/jdk/crac/engine/CheckCPUFeaturesTest.java b/test/jdk/jdk/crac/engine/CheckCPUFeaturesTest.java index 8a9e4fbbf23..c60ed7a2527 100644 --- a/test/jdk/jdk/crac/engine/CheckCPUFeaturesTest.java +++ b/test/jdk/jdk/crac/engine/CheckCPUFeaturesTest.java @@ -42,11 +42,11 @@ * @run driver jdk.test.lib.crac.CracTest native skip fail * @run driver jdk.test.lib.crac.CracTest native skip-experimental pass * @run driver jdk.test.lib.crac.CracTest generic compatible pass - * @run driver jdk.test.lib.crac.CracTest generic exact fail-x86 + * @run driver jdk.test.lib.crac.CracTest generic exact fail-x86aarch64 * @run driver jdk.test.lib.crac.CracTest generic skip fail * @run driver jdk.test.lib.crac.CracTest generic skip-experimental pass - * @run driver jdk.test.lib.crac.CracTest ignore compatible fail-x86 - * @run driver jdk.test.lib.crac.CracTest ignore exact fail-x86 + * @run driver jdk.test.lib.crac.CracTest ignore compatible fail-x86aarch64 + * @run driver jdk.test.lib.crac.CracTest ignore exact fail-x86aarch64 * @run driver jdk.test.lib.crac.CracTest ignore skip fail * @run driver jdk.test.lib.crac.CracTest ignore skip-experimental pass */ @@ -63,8 +63,8 @@ public class CheckCPUFeaturesTest implements CracTest { @Override public void test() throws Exception { boolean success = "pass".equals(result); - if (!Platform.isX86() && !Platform.isX64()) { - success = success || "fail-x86".equals(result); + if (!Platform.isX86() && !Platform.isX64() && !Platform.isAArch64()) { + success = success || "fail-x86aarch64".equals(result); } CracBuilder builder = new CracBuilder().engine(CracEngine.SIMULATE).engineOptions("pause=true"); @@ -73,7 +73,12 @@ public void test() throws Exception { } try (var checkpoint = builder.vmOption("-XX:CPUFeatures=" + features).startCheckpoint()) { - checkpoint.waitForPausePid(); + if (Platform.isAArch64() && "generic".equals(features)) { + assertEquals(1, checkpoint.waitFor()); + return; + } else { + checkpoint.waitForPausePid(); + } builder.clearVmOptions(); if ("skip-experimental".equals(check)) { diff --git a/test/jdk/jdk/crac/ignoreRestore/MissingMetadataTest.java b/test/jdk/jdk/crac/ignoreRestore/MissingMetadataTest.java index fd8c5fdb515..c25a5d3128b 100644 --- a/test/jdk/jdk/crac/ignoreRestore/MissingMetadataTest.java +++ b/test/jdk/jdk/crac/ignoreRestore/MissingMetadataTest.java @@ -43,7 +43,7 @@ public class MissingMetadataTest { public static void main(String[] args) throws Exception { test("criuengine", null, "Cannot open file cr/engine"); test("criuengine", "badengine", "Image format does not match"); - if (Platform.isX64()) { // Requires a platform supporting CPU features + if (Platform.isX64() || Platform.isAArch64()) { // Requires a platform supporting CPU features test("criuengine", "criuengine", "cannot open cr/tags in mode r"); } }