• Tao Su's avatar
    KVM: x86: Advertise AVX10.1 CPUID to userspace · 1c450ffe
    Tao Su authored
    Advertise AVX10.1 related CPUIDs, i.e. report AVX10 support bit via
    CPUID.(EAX=07H, ECX=01H):EDX[bit 19] and new CPUID leaf 0x24H so that
    guest OS and applications can query the AVX10.1 CPUIDs directly. Intel
    AVX10 represents the first major new vector ISA since the introduction of
    Intel AVX512, which will establish a common, converged vector instruction
    set across all Intel architectures[1].
    
    AVX10.1 is an early version of AVX10, that enumerates the Intel AVX512
    instruction set at 128, 256, and 512 bits which is enabled on
    Granite Rapids. I.e., AVX10.1 is only a new CPUID enumeration with no
    new functionality.   New features, e.g. Embedded Rounding and Suppress
    All Exceptions (SAE) will be introduced in AVX10.2.
    
    Advertising AVX10.1 is safe because there is nothing to enable for AVX10.1,
    i.e. it's purely a new way to enumerate support, thus there will never be
    anything for the kernel to enable. Note just the CPUID checking is changed
    when using AVX512 related instructions, e.g. if using one AVX512
    instruction needs to check (AVX512 AND AVX512DQ), it can check
    ((AVX512 AND AVX512DQ) OR AVX10.1) after checking XCR0[7:5].
    
    The versions of AVX10 are expected to be inclusive, e.g. version N+1 is
    a superset of version N. Per the spec, the version can never be 0, just
    advertise AVX10.1 if it's supported in hardware. Moreover, advertising
    AVX10_{128,256,512} needs to land in the same commit as advertising basic
    AVX10.1 support, otherwise KVM would advertise an impossible CPU model.
    E.g. a CPU with AVX512 but not AVX10.1/512 is impossible per the SDM.
    
    As more and more AVX related CPUIDs are added (it would have resulted in
    around 40-50 CPUID flags when developing AVX10), the versioning approach
    is introduced. But incrementing version numbers are bad for virtualization.
    E.g. if AVX10.2 has a feature that shouldn't be enumerated to guests for
    whatever reason, then KVM can't enumerate any "later" features either,
    because the only way to hide the problematic AVX10.2 feature is to set the
    version to AVX10.1 or lower[2]. But most AVX features are just passed
    through and don't have virtualization controls, so AVX10 should not be
    problematic in practice, so long as Intel honors their promise that future
    versions will be supersets of past versions.
    
    [1] https://cdrdv2.intel.com/v1/dl/getContent/784267
    [2] https://lore.kernel.org/all/Zkz5Ak0PQlAN8DxK@google.com/Suggested-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarTao Su <tao1.su@linux.intel.com>
    Link: https://lore.kernel.org/r/20240819062327.3269720-1-tao1.su@linux.intel.com
    [sean: minor changelog tweaks]
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    1c450ffe
cpuid.h 4.17 KB