---
 hyperv.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 hyperv.h |    7 +++++++
 2 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/hyperv.c b/hyperv.c
index a17f879..57915b9 100644
--- a/hyperv.c
+++ b/hyperv.c
@@ -3,6 +3,10 @@
 #include "qemu-option.h"
 #include "qemu-config.h"
 
+static int hyperv_apic;
+static int hyperv_wd;
+static int hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
+
 void hyperv_init(void)
 {
     QemuOpts *opts = QTAILQ_FIRST(&qemu_hyperv_opts.head);
@@ -10,6 +14,46 @@ void hyperv_init(void)
     if (!opts) {
         return;
     }
+
+    hyperv_spinlock_attempts = qemu_opt_get_number(opts, "spinlock", 
+                                                   HYPERV_SPINLOCK_NEVER_RETRY
+                                                  );
+    hyperv_wd = qemu_opt_get_bool(opts, "wd", 0);
+    hyperv_apic = qemu_opt_get_bool(opts, "vapic", 0);
+
+}
+
+int hyperv_enabled(void)
+{
+    return hyperv_hypercall_available() | hyperv_relaxed_timing();
+}
+
+int hyperv_hypercall_available(void)
+{
+    if (hyperv_apic ||
+        (hyperv_spinlock_attempts != HYPERV_SPINLOCK_NEVER_RETRY)) {
+      return 1;
+    }
+    return 0;
+}
+
+int hyperv_relaxed_timing(void)
+{
+    return !hyperv_wd;
+}
+
+int hyperv_apic_recommended(void)
+{
+#ifdef KVM_CAP_IRQCHIP
+    return hyperv_apic;
+#else
+    return 0;
+#endif
+}
+
+int hyperv_spinlock_retries(void)
+{
+    return hyperv_spinlock_attempts;
 }
 
 static void hyperv_initialize(void)
diff --git a/hyperv.h b/hyperv.h
index eaf974a..27d2e6e 100644
--- a/hyperv.h
+++ b/hyperv.h
@@ -6,7 +6,14 @@
 
 #include <asm/hyperv.h>
 
+#define HYPERV_SPINLOCK_NEVER_RETRY             0xFFFFFFFF
+
 void hyperv_init(void);
+int hyperv_enabled(void);
+int hyperv_hypercall_available(void);
+int hyperv_relaxed_timing(void);
+int hyperv_apic_recommended(void);
+int hyperv_spinlock_retries(void);
 
 #endif /* QEMU_HW_HYPERV_H */
 
-- 
1.7.4.4

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to