From da32db7c92d67a5435beab0ec3a787ca09d1c68b Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 1 Apr 2026 17:10:45 +0800 Subject: [PATCH] KVM: x86: Add support for CPUID leaf 0x8C860000 CPUID leaf 0x8C860000 on Hygon processors advertises support for the SM3 and SM4 cryptographic algorithms. Expose this leaf to KVM guests to allow the guest OS to detect these features and enable hardware-accelerated SM3/SM4 operations. Hygon-SIG: commit none hygon KVM: x86: Add support for CPUID leaf 0x8C860000 Signed-off-by: Wei Wang Tested-by: Yabin Li Tested-by: Liyang Han Tested-by: Yongwei Xu Reviewed-by: Bin Guo --- arch/x86/kvm/cpuid.c | 16 ++++++++++++++++ arch/x86/kvm/reverse_cpuid.h | 1 + 2 files changed, 17 insertions(+) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 9c1dccd156e1..49303e21496e 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 5fe7761bb97c..cb7f37502709 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}, }; /* -- Gitee