On Wed, Oct 19, 2022, Borislav Petkov wrote: > On Wed, Oct 19, 2022 at 04:47:32PM +0800, Jiaxi Chen wrote: > > AVX-VNNI-INT8 is a new set of instructions in the latest Intel platform > > Sierra Forest. It multiplies the individual bytes of two unsigned or > > unsigned source operands, then add and accumulate the results into the > > destination dword element size operand. This instruction allows for the > > platform to have superior AI capabilities. > > > > The bit definition: > > CPUID.(EAX=7,ECX=1):EDX[bit 4] > > For this particular one, use scattered.c instead of adding a new leaf. Unless the kernel wants to use X86_FEATURE_AVX_VNNI_INT8, which seems unlikely, there's no need to create a scattered entry. This can be handled in KVM by adding a KVM-only leaf entry (which will be needed no matter what), plus a #define for X86_FEATURE_AVX_VNNI_INT8 to direct it to the KVM entry. E.g. diff --git a/arch/x86/kvm/reverse_cpuid.h b/arch/x86/kvm/reverse_cpuid.h index a19d473d0184..25e7bfc61607 100644 --- a/arch/x86/kvm/reverse_cpuid.h +++ b/arch/x86/kvm/reverse_cpuid.h @@ -13,6 +13,7 @@ */ enum kvm_only_cpuid_leafs { CPUID_12_EAX = NCAPINTS, + CPUID_7_1_EDX, NR_KVM_CPU_CAPS, NKVMCAPINTS = NR_KVM_CPU_CAPS - NCAPINTS, @@ -24,6 +25,16 @@ enum kvm_only_cpuid_leafs { #define KVM_X86_FEATURE_SGX1 KVM_X86_FEATURE(CPUID_12_EAX, 0) #define KVM_X86_FEATURE_SGX2 KVM_X86_FEATURE(CPUID_12_EAX, 1) +#define KVM_X86_FEATURE_AVX_VNNI_INT8 KVM_X86_FEATURE(CPUID_7_1_EDX, 4) + +/* + * Alias X86_FEATURE_* to the KVM variant for features in KVM-only leafs that + * aren't scattered by cpufeatures.h so that X86_FEATURE_* can be used in KVM, + * e.g. to query guest CPUID. As a bonus, no translation is needed for these + * features in __feature_translate(). + */ +#define X86_FEATURE_AVX_VNNI_INT8 KVM_X86_FEATURE_AVX_VNNI_INT8 + struct cpuid_reg { u32 function; u32 index; @@ -48,6 +59,7 @@ static const struct cpuid_reg reverse_cpuid[] = { [CPUID_7_1_EAX] = { 7, 1, CPUID_EAX}, [CPUID_12_EAX] = {0x00000012, 0, CPUID_EAX}, [CPUID_8000_001F_EAX] = {0x8000001f, 0, CPUID_EAX}, + [CPUID_7_1_EDX] = { 7, 1, CPUID_EDX}, }; /*