x86/kvm: Add Hygon Dhyana support to KVM
authorPu Wen <puwen@hygon.cn>
Sun, 23 Sep 2018 09:36:31 +0000 (17:36 +0800)
committerBorislav Petkov <bp@suse.de>
Thu, 27 Sep 2018 16:28:59 +0000 (18:28 +0200)
The Hygon Dhyana CPU has the SVM feature as AMD family 17h does.
So enable the KVM infrastructure support to it.

Signed-off-by: Pu Wen <puwen@hygon.cn>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Borislav Petkov <bp@suse.de>
Cc: pbonzini@redhat.com
Cc: rkrcmar@redhat.com
Cc: tglx@linutronix.de
Cc: mingo@redhat.com
Cc: hpa@zytor.com
Cc: x86@kernel.org
Cc: thomas.lendacky@amd.com
Cc: kvm@vger.kernel.org
Link: https://lkml.kernel.org/r/654dd12876149fba9561698eaf9fc15d030301f8.1537533369.git.puwen@hygon.cn
arch/x86/include/asm/kvm_emulate.h
arch/x86/include/asm/virtext.h
arch/x86/kvm/emulate.c

index 0f82cd9..93c4bf5 100644 (file)
@@ -364,6 +364,10 @@ struct x86_emulate_ctxt {
 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574
 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273
 
+#define X86EMUL_CPUID_VENDOR_HygonGenuine_ebx 0x6f677948
+#define X86EMUL_CPUID_VENDOR_HygonGenuine_ecx 0x656e6975
+#define X86EMUL_CPUID_VENDOR_HygonGenuine_edx 0x6e65476e
+
 #define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547
 #define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e
 #define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69
index 0116b2e..e05e0d3 100644 (file)
@@ -83,9 +83,10 @@ static inline void cpu_emergency_vmxoff(void)
  */
 static inline int cpu_has_svm(const char **msg)
 {
-       if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) {
+       if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD &&
+           boot_cpu_data.x86_vendor != X86_VENDOR_HYGON) {
                if (msg)
-                       *msg = "not amd";
+                       *msg = "not amd or hygon";
                return 0;
        }
 
index 106482d..34edf19 100644 (file)
@@ -2711,7 +2711,16 @@ static bool em_syscall_is_enabled(struct x86_emulate_ctxt *ctxt)
            edx == X86EMUL_CPUID_VENDOR_AMDisbetterI_edx)
                return true;
 
-       /* default: (not Intel, not AMD), apply Intel's stricter rules... */
+       /* Hygon ("HygonGenuine") */
+       if (ebx == X86EMUL_CPUID_VENDOR_HygonGenuine_ebx &&
+           ecx == X86EMUL_CPUID_VENDOR_HygonGenuine_ecx &&
+           edx == X86EMUL_CPUID_VENDOR_HygonGenuine_edx)
+               return true;
+
+       /*
+        * default: (not Intel, not AMD, not Hygon), apply Intel's
+        * stricter rules...
+        */
        return false;
 }