x86: KVM: Advertise CPUIDs for new instructions in Clearwater Forest
authorTao Su <tao1.su@linux.intel.com>
Tue, 5 Nov 2024 05:48:25 +0000 (13:48 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 13 Nov 2024 19:40:40 +0000 (14:40 -0500)
Latest Intel platform Clearwater Forest has introduced new instructions
enumerated by CPUIDs of SHA512, SM3, SM4 and AVX-VNNI-INT16. Advertise
these CPUIDs to userspace so that guests can query them directly.

SHA512, SM3 and SM4 are on an expected-dense CPUID leaf and some other
bits on this leaf have kernel usages. Considering they have not truly
kernel usages, hide them in /proc/cpuinfo.

These new instructions only operate in xmm, ymm registers and have no new
VMX controls, so there is no additional host enabling required for guests
to use these instructions, i.e. advertising these CPUIDs to userspace is
safe.

Tested-by: Jiaan Lu <jiaan.lu@intel.com>
Tested-by: Xuelian Guo <xuelian.guo@intel.com>
Signed-off-by: Tao Su <tao1.su@linux.intel.com>
Message-ID: <20241105054825.870939-1-tao1.su@linux.intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/cpufeatures.h
arch/x86/kvm/cpuid.c
arch/x86/kvm/reverse_cpuid.h

index 913fd3a7bac6506141de65f33b9ee61c615c7d7d..d96277dceabfe9b07e1b8dbe308aa0fc85e28087 100644 (file)
 #define X86_FEATURE_ZEN1               (11*32+31) /* CPU based on Zen1 microarchitecture */
 
 /* Intel-defined CPU features, CPUID level 0x00000007:1 (EAX), word 12 */
+#define X86_FEATURE_SHA512             (12*32+ 0) /* SHA512 instructions */
+#define X86_FEATURE_SM3                        (12*32+ 1) /* SM3 instructions */
+#define X86_FEATURE_SM4                        (12*32+ 2) /* SM4 instructions */
 #define X86_FEATURE_AVX_VNNI           (12*32+ 4) /* "avx_vnni" AVX VNNI instructions */
 #define X86_FEATURE_AVX512_BF16                (12*32+ 5) /* "avx512_bf16" AVX512 BFLOAT16 instructions */
 #define X86_FEATURE_CMPCCXADD           (12*32+ 7) /* CMPccXADD instructions */
index d695e7bc41eda6ec8e4949ddc2e036974c5e31da..097bdc022d0f476cb9e1f4d149f9a5a082f90898 100644 (file)
@@ -700,14 +700,14 @@ void kvm_set_cpu_caps(void)
                kvm_cpu_cap_set(X86_FEATURE_SPEC_CTRL_SSBD);
 
        kvm_cpu_cap_mask(CPUID_7_1_EAX,
-               F(AVX_VNNI) | F(AVX512_BF16) | F(CMPCCXADD) |
-               F(FZRM) | F(FSRS) | F(FSRC) |
-               F(AMX_FP16) | F(AVX_IFMA) | F(LAM)
+               F(SHA512) | F(SM3) | F(SM4) | F(AVX_VNNI) | F(AVX512_BF16) |
+               F(CMPCCXADD) | F(FZRM) | F(FSRS) | F(FSRC) | F(AMX_FP16) |
+               F(AVX_IFMA) | F(LAM)
        );
 
        kvm_cpu_cap_init_kvm_defined(CPUID_7_1_EDX,
-               F(AVX_VNNI_INT8) | F(AVX_NE_CONVERT) | F(PREFETCHITI) |
-               F(AMX_COMPLEX) | F(AVX10)
+               F(AVX_VNNI_INT8) | F(AVX_NE_CONVERT) | F(AMX_COMPLEX) |
+               F(AVX_VNNI_INT16) | F(PREFETCHITI) | F(AVX10)
        );
 
        kvm_cpu_cap_init_kvm_defined(CPUID_7_2_EDX,
index 0d17d6b706396449b7412bf3e7a7509a9875f659..e46220ece83c60b986faee8e3e8421a82cb176ae 100644 (file)
@@ -46,6 +46,7 @@ enum kvm_only_cpuid_leafs {
 #define X86_FEATURE_AVX_VNNI_INT8       KVM_X86_FEATURE(CPUID_7_1_EDX, 4)
 #define X86_FEATURE_AVX_NE_CONVERT      KVM_X86_FEATURE(CPUID_7_1_EDX, 5)
 #define X86_FEATURE_AMX_COMPLEX         KVM_X86_FEATURE(CPUID_7_1_EDX, 8)
+#define X86_FEATURE_AVX_VNNI_INT16      KVM_X86_FEATURE(CPUID_7_1_EDX, 10)
 #define X86_FEATURE_PREFETCHITI         KVM_X86_FEATURE(CPUID_7_1_EDX, 14)
 #define X86_FEATURE_AVX10               KVM_X86_FEATURE(CPUID_7_1_EDX, 19)