On Wed, Oct 19, 2022, Sean Christopherson wrote: > 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 Actually, there's no need for KVM_X86_FEATURE_AVX_VNNI_INT8 in this case, just #define X86_FEATURE_AVX_VNNI_INT8 directly. The KVM_ prefixed macro exists purely to redirect the non-KVM_ version, but that's unnecessary in this case. diff --git a/arch/x86/kvm/reverse_cpuid.h b/arch/x86/kvm/reverse_cpuid.h index a19d473d0184..38adafb03490 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,13 @@ 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) +/* + * Omit the KVM_ prefix 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 handling in __feature_translate() is needed. + */ +#define X86_FEATURE_AVX_VNNI_INT8 KVM_X86_FEATURE(CPUID_7_1_EDX, 4) + struct cpuid_reg { u32 function; u32 index; @@ -48,6 +56,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}, };