diff mbox

[2/2] QEMU-KVM: Ask kernel about supported svm features

Message ID 1267643742-616-3-git-send-email-joerg.roedel@amd.com (mailing list archive)
State New, archived
Headers show

Commit Message

Joerg Roedel March 3, 2010, 7:15 p.m. UTC
None
diff mbox

Patch

diff --git a/kvm/include/linux/kvm.h b/kvm/include/linux/kvm.h
index 6485981..aeb2c9b 100644
--- a/kvm/include/linux/kvm.h
+++ b/kvm/include/linux/kvm.h
@@ -500,6 +500,8 @@  struct kvm_ioeventfd {
 
 #define KVM_CAP_PCI_SEGMENT 47
 
+#define KVM_CAP_SVM_CPUID_FIXED 52
+
 #ifdef KVM_CAP_IRQ_ROUTING
 
 struct kvm_irq_routing_irqchip {
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 7a5925a..60e6d26 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -1291,8 +1291,19 @@  int kvm_arch_init_vcpu(CPUState *cenv)
     qemu_kvm_cpuid_on_env(&copy);
     limit = copy.regs[R_EAX];
 
-    for (i = 0x80000000; i <= limit; ++i)
-	do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, 0, &copy);
+    for (i = 0x80000000; i <= limit; ++i) {
+	do_cpuid_ent(&cpuid_ent[cpuid_nent], i, 0, &copy);
+	switch (i) {
+	case 0x8000000a:
+		if (!kvm_check_extension(kvm_state, KVM_CAP_SVM_CPUID_FIXED))
+			break;
+		cpuid_ent[cpuid_nent].eax = kvm_arch_get_supported_cpuid(cenv, 0x8000000a, R_EAX);
+		cpuid_ent[cpuid_nent].ebx = kvm_arch_get_supported_cpuid(cenv, 0x8000000a, R_EBX);
+		cpuid_ent[cpuid_nent].edx = kvm_arch_get_supported_cpuid(cenv, 0x8000000a, R_EDX);
+		break;
+	}
+	cpuid_nent += 1;
+    }
 
     kvm_setup_cpuid2(cenv, cpuid_nent, cpuid_ent);
 
diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index b64bd02..adcc19f 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -421,6 +421,8 @@ 
 #define CPUID_EXT3_IBS     (1 << 10)
 #define CPUID_EXT3_SKINIT  (1 << 12)
 
+#define CPUID_SVM_NPT      (1 << 0)
+
 #define CPUID_VENDOR_INTEL_1 0x756e6547 /* "Genu" */
 #define CPUID_VENDOR_INTEL_2 0x49656e69 /* "ineI" */
 #define CPUID_VENDOR_INTEL_3 0x6c65746e /* "ntel" */
diff --git a/target-i386/helper.c b/target-i386/helper.c
index 73d8389..109f656 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -2220,7 +2220,7 @@  void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
         *eax = 0x00000001; /* SVM Revision */
         *ebx = 0x00000010; /* nr of ASIDs */
         *ecx = 0;
-        *edx = 0; /* optional features */
+        *edx = 0;
         break;
     default:
         /* reserved values: zero */