diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 9c1dccd156e158c36fcb25d4c6ea4acfe630f713..49303e21496e82fae5a6a2339b74cdf9d7cac5a1 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -847,6 +847,9 @@ void kvm_set_cpu_caps(void) kvm_cpu_cap_set(X86_FEATURE_NULL_SEL_CLR_BASE); kvm_cpu_cap_set(X86_FEATURE_NO_SMM_CTL_MSR); + kvm_cpu_cap_mask(CPUID_8C86_0000_EDX, + 0 | F(HYGON_SM3) | F(HYGON_SM4)); + kvm_cpu_cap_mask(CPUID_C000_0001_EDX, F(XSTORE) | F(XSTORE_EN) | F(XCRYPT) | F(XCRYPT_EN) | F(ACE2) | F(ACE2_EN) | F(PHE) | F(PHE_EN) | @@ -1416,6 +1419,10 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) entry->ebx = ebx.full; break; } + case 0x8C860000: + entry->eax = 0x8C860000; + cpuid_entry_override(entry, CPUID_8C86_0000_EDX); + break; /*Add support for Centaur's CPUID instruction*/ case 0xC0000000: /* Extended to 0xC0000006 */ @@ -1473,6 +1480,15 @@ static int get_cpuid_func(struct kvm_cpuid_array *array, u32 func, return r; limit = array->entries[array->nent - 1].eax; + + if ((func == 0x80000000) && + (boot_cpu_has(X86_FEATURE_HYGON_SM3) || + boot_cpu_has(X86_FEATURE_HYGON_SM4))) { + r = do_cpuid_func(array, 0x8C860000, type); + if (r) + return r; + } + for (func = func + 1; func <= limit; ++func) { r = do_cpuid_func(array, func, type); if (r) diff --git a/arch/x86/kvm/reverse_cpuid.h b/arch/x86/kvm/reverse_cpuid.h index 5fe7761bb97c0a06b537043df5cb4eea8ff06bbc..cb7f375027096b60fc06a141a8ece4505e7225d5 100644 --- a/arch/x86/kvm/reverse_cpuid.h +++ b/arch/x86/kvm/reverse_cpuid.h @@ -106,6 +106,7 @@ static const struct cpuid_reg reverse_cpuid[] = { [CPUID_7_2_EDX] = { 7, 2, CPUID_EDX}, [CPUID_24_0_EBX] = { 0x24, 0, CPUID_EBX}, [CPUID_8000_0021_ECX] = {0x80000021, 0, CPUID_ECX}, + [CPUID_8C86_0000_EDX] = {0x8c860000, 0, CPUID_EDX}, }; /*