diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 9c28cc22dae0ef9f04498f28a5477d2d11dda4a2..541b1d2c29feac331d6482c14062380594c0c94d 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -374,7 +374,7 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index) const u32 kvm_cpuid_7_0_edx_x86_features = F(AVX512_4VNNIW) | F(AVX512_4FMAPS) | F(SPEC_CTRL) | F(SPEC_CTRL_SSBD) | F(ARCH_CAPABILITIES) | F(INTEL_STIBP) | - F(MD_CLEAR); + F(MD_CLEAR) | F(AVX512_VP2INTERSECT); /* cpuid 7.1.eax */ const u32 kvm_cpuid_7_1_eax_x86_features = @@ -798,6 +798,13 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function, break; case 0x8000001e: break; + case 0x8C860000: + entry->eax = 0x8C860000; + if (boot_cpu_has(X86_FEATURE_HYGON_SM3)) + entry->edx |= F(HYGON_SM3); + if (boot_cpu_has(X86_FEATURE_HYGON_SM3)) + entry->edx |= F(HYGON_SM4); + break; /*Add support for Centaur's CPUID instruction*/ case 0xC0000000: /*Just support up to 0xC0000004 now*/ @@ -913,6 +920,20 @@ int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid, if (ent->qualifier && !ent->qualifier(ent)) continue; + /* + * 0x8C860000 is a Hygon‑specific CPUID leaf that exceeds the + ` * extended CPUID limit reported by 0x80000000, so it must be + * handled as a special case. + */ + if ((ent->func == 0x80000000) && + (boot_cpu_has(X86_FEATURE_HYGON_SM3) || + boot_cpu_has(X86_FEATURE_HYGON_SM4))) { + r = do_cpuid_func(&cpuid_entries[nent], 0x8C860000, + &nent, cpuid->nent, type); + if (r) + goto out_free; + } + r = do_cpuid_func(&cpuid_entries[nent], ent->func, &nent, cpuid->nent, type);