[v7,06/17] target-i386: Add cpu object access routines for Hypervisor features.

Message ID 1350071782-23078-7-git-send-email-Don@CloudSwitch.com
State New
Headers show

Commit Message

Don Slutz Oct. 12, 2012, 7:56 p.m.
Part of "target-i386: Add way to expose VMWare CPUID"

Also known as kvm festures or Hypervisor vendor-neutral interface identification.
This is just the EAX value for 0x40000001.

QEMU knows this is KVM_CPUID_FEATURES (0x40000001) in some builds.

When exposing VMWare CPUID this needs to be set to zero.

This is based on:

Microsoft Hypervisor CPUID Leaves:

Linux kernel change starts with:

VMware documention on CPUIDs (Mechanisms to determine if software is
running in a VMware virtual machine):

Signed-off-by: Don Slutz <Don@CloudSwitch.com>
 target-i386/cpu.c |   26 ++++++++++++++++++++++++++
 1 files changed, 26 insertions(+), 0 deletions(-)


diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index a87527c..b335a1e 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1229,6 +1229,29 @@  static void x86_cpuid_set_hv_vendor(Object *obj, const char *value,
     env->cpuid_hv_vendor_set = true;
+static void x86_cpuid_get_hv_features(Object *obj, Visitor *v, void *opaque,
+                                const char *name, Error **errp)
+    X86CPU *cpu = X86_CPU(obj);
+    visit_type_uint32(v, &cpu->env.cpuid_hv_features, name, errp);
+static void x86_cpuid_set_hv_features(Object *obj, Visitor *v, void *opaque,
+                                const char *name, Error **errp)
+    X86CPU *cpu = X86_CPU(obj);
+    uint32_t value;
+    visit_type_uint32(v, &value, name, errp);
+    if (error_is_set(errp)) {
+        return;
+    }
+    cpu->env.cpuid_hv_features = value;
+    cpu->env.cpuid_hv_features_set = true;
 #if !defined(CONFIG_USER_ONLY)
 static void x86_get_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
                                  const char *name, Error **errp)
@@ -2126,6 +2149,9 @@  static void x86_cpu_initfn(Object *obj)
     object_property_add_str(obj, "hypervisor-vendor",
                             x86_cpuid_set_hv_vendor, NULL);
+    object_property_add(obj, "hypervisor-features", "int",
+                        x86_cpuid_get_hv_features,
+                        x86_cpuid_set_hv_features, NULL, NULL, NULL);
 #if !defined(CONFIG_USER_ONLY)
     object_property_add(obj, "hv_spinlocks", "int",