[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2 07/22] mini-os: support hvm_op hypercall



Support the HYPERVISOR_hvm_op() hypercall which is needed for HVMlite.
Add convenience functions hvm_get_parameter() and hvm_set_parameter().

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
---
 arch/arm/setup.c                      | 15 ---------------
 hypervisor.c                          | 27 +++++++++++++++++++++++++++
 include/hypervisor.h                  |  5 +++++
 include/x86/x86_32/hypercall-x86_32.h |  6 ++++++
 include/x86/x86_64/hypercall-x86_64.h |  6 ++++++
 5 files changed, 44 insertions(+), 15 deletions(-)

diff --git a/arch/arm/setup.c b/arch/arm/setup.c
index 06afe46..cbe67c6 100644
--- a/arch/arm/setup.c
+++ b/arch/arm/setup.c
@@ -25,21 +25,6 @@ extern char shared_info_page[PAGE_SIZE];
 
 void *device_tree;
 
-static int hvm_get_parameter(int idx, uint64_t *value)
-{
-    struct xen_hvm_param xhv;
-    int ret;
-
-    xhv.domid = DOMID_SELF;
-    xhv.index = idx;
-    ret = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv);
-    if (ret < 0) {
-        BUG();
-    }
-    *value = xhv.value;
-    return ret;
-}
-
 static void get_console(void)
 {
     uint64_t v = -1;
diff --git a/hypervisor.c b/hypervisor.c
index 1b61d9b..715cfe8 100644
--- a/hypervisor.c
+++ b/hypervisor.c
@@ -36,6 +36,33 @@
 
 int in_callback;
 
+#ifndef CONFIG_PARAVIRT
+int hvm_get_parameter(int idx, uint64_t *value)
+{
+    struct xen_hvm_param xhv;
+    int ret;
+
+    xhv.domid = DOMID_SELF;
+    xhv.index = idx;
+    ret = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv);
+    if ( ret < 0 )
+        BUG();
+
+    *value = xhv.value;
+    return ret;
+}
+
+int hvm_set_parameter(int idx, uint64_t value)
+{
+    struct xen_hvm_param xhv;
+
+    xhv.domid = DOMID_SELF;
+    xhv.index = idx;
+    xhv.value = value;
+    return HYPERVISOR_hvm_op(HVMOP_set_param, &xhv);
+}
+#endif
+
 void do_hypervisor_callback(struct pt_regs *regs)
 {
     unsigned long  l1, l2, l1i, l2i;
diff --git a/include/hypervisor.h b/include/hypervisor.h
index 21b3566..6e421b1 100644
--- a/include/hypervisor.h
+++ b/include/hypervisor.h
@@ -23,6 +23,7 @@
 #else
 #error "Unsupported architecture"
 #endif
+#include <xen/hvm/hvm_op.h>
 #include <mini-os/traps.h>
 
 /*
@@ -37,6 +38,10 @@ extern union start_info_union start_info_union;
 #define start_info (start_info_union.start_info)
 
 /* hypervisor.c */
+#ifndef CONFIG_PARAVIRT
+int hvm_get_parameter(int idx, uint64_t *value);
+int hvm_set_parameter(int idx, uint64_t value);
+#endif
 void force_evtchn_callback(void);
 void do_hypervisor_callback(struct pt_regs *regs);
 void mask_evtchn(uint32_t port);
diff --git a/include/x86/x86_32/hypercall-x86_32.h 
b/include/x86/x86_32/hypercall-x86_32.h
index 99a4ee3..5c93464 100644
--- a/include/x86/x86_32/hypercall-x86_32.h
+++ b/include/x86/x86_32/hypercall-x86_32.h
@@ -324,6 +324,12 @@ HYPERVISOR_domctl(
        return _hypercall1(int, domctl, op);
 }
 
+static inline unsigned long
+HYPERVISOR_hvm_op(int op, void *arg)
+{
+       return _hypercall2(unsigned long, hvm_op, op, arg);
+}
+
 #endif /* __HYPERCALL_X86_32_H__ */
 
 /*
diff --git a/include/x86/x86_64/hypercall-x86_64.h 
b/include/x86/x86_64/hypercall-x86_64.h
index e00b3bd..6171812 100644
--- a/include/x86/x86_64/hypercall-x86_64.h
+++ b/include/x86/x86_64/hypercall-x86_64.h
@@ -331,6 +331,12 @@ HYPERVISOR_domctl(
        return _hypercall1(int, domctl, op);
 }
 
+static inline unsigned long
+HYPERVISOR_hvm_op(int op, void *arg)
+{
+       return _hypercall2(unsigned long, hvm_op, op, arg);
+}
+
 #endif /* __HYPERCALL_X86_64_H__ */
 
 /*
-- 
2.6.6


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.