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

[Xen-devel] [PATCH v7 08/19] xen: use the same hypercall mechanism for XEN and XENHVM



---
 sys/amd64/include/xen/hypercall.h |    7 -------
 sys/i386/i386/locore.s            |    9 +++++++++
 sys/i386/include/xen/hypercall.h  |    8 --------
 sys/x86/xen/hvm.c                 |   24 ++++++++++--------------
 4 files changed, 19 insertions(+), 29 deletions(-)

diff --git a/sys/amd64/include/xen/hypercall.h 
b/sys/amd64/include/xen/hypercall.h
index a1b2a5c..499fb4d 100644
--- a/sys/amd64/include/xen/hypercall.h
+++ b/sys/amd64/include/xen/hypercall.h
@@ -51,15 +51,8 @@
 #define CONFIG_XEN_COMPAT      0x030002
 #define __must_check
 
-#ifdef XEN
 #define HYPERCALL_STR(name)                                    \
        "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"
-#else
-#define HYPERCALL_STR(name)                                    \
-       "mov $("STR(__HYPERVISOR_##name)" * 32),%%eax; "\
-       "add hypercall_stubs(%%rip),%%rax; "                    \
-       "call *%%rax"
-#endif
 
 #define _hypercall0(type, name)                        \
 ({                                             \
diff --git a/sys/i386/i386/locore.s b/sys/i386/i386/locore.s
index 68cb430..bd136b1 100644
--- a/sys/i386/i386/locore.s
+++ b/sys/i386/i386/locore.s
@@ -898,3 +898,12 @@ done_pde:
 #endif
 
        ret
+
+#ifdef XENHVM
+/* Xen Hypercall page */
+       .text
+.p2align PAGE_SHIFT, 0x90      /* Hypercall_page needs to be PAGE aligned */
+
+NON_GPROF_ENTRY(hypercall_page)
+       .skip   0x1000, 0x90    /* Fill with "nop"s */
+#endif
diff --git a/sys/i386/include/xen/hypercall.h b/sys/i386/include/xen/hypercall.h
index edc13f4..16b5ee2 100644
--- a/sys/i386/include/xen/hypercall.h
+++ b/sys/i386/include/xen/hypercall.h
@@ -39,16 +39,8 @@
 #define        ENOXENSYS       38
 #define CONFIG_XEN_COMPAT      0x030002
 
-
-#if defined(XEN)
 #define HYPERCALL_STR(name)                                     \
         "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)"
-#else
-#define HYPERCALL_STR(name)                                     \
-        "mov hypercall_stubs,%%eax; "                           \
-        "add $("STR(__HYPERVISOR_##name)" * 32),%%eax; "        \
-        "call *%%eax"
-#endif
 
 #define _hypercall0(type, name)                 \
 ({                                              \
diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c
index b397721..9a0411e 100644
--- a/sys/x86/xen/hvm.c
+++ b/sys/x86/xen/hvm.c
@@ -157,7 +157,7 @@ DPCPU_DEFINE(xen_intr_handle_t, 
ipi_handle[nitems(xen_ipis)]);
 
 /*------------------ Hypervisor Access Shared Memory Regions 
-----------------*/
 /** Hypercall table accessed via HYPERVISOR_*_op() methods. */
-char *hypercall_stubs;
+extern char *hypercall_page;
 shared_info_t *HYPERVISOR_shared_info;
 start_info_t *HYPERVISOR_start_info;
 
@@ -559,7 +559,7 @@ xen_hvm_cpuid_base(void)
  * Allocate and fill in the hypcall page.
  */
 static int
-xen_hvm_init_hypercall_stubs(void)
+xen_hvm_init_hypercall_stubs(enum xen_hvm_init_type init_type)
 {
        uint32_t base, regs[4];
        int i;
@@ -568,7 +568,7 @@ xen_hvm_init_hypercall_stubs(void)
        if (base == 0)
                return (ENXIO);
 
-       if (hypercall_stubs == NULL) {
+       if (init_type == XEN_HVM_INIT_COLD) {
                do_cpuid(base + 1, regs);
                printf("XEN: Hypervisor version %d.%d detected.\n",
                    regs[0] >> 16, regs[0] & 0xffff);
@@ -578,18 +578,9 @@ xen_hvm_init_hypercall_stubs(void)
         * Find the hypercall pages.
         */
        do_cpuid(base + 2, regs);
-       
-       if (hypercall_stubs == NULL) {
-               size_t call_region_size;
-
-               call_region_size = regs[0] * PAGE_SIZE;
-               hypercall_stubs = malloc(call_region_size, M_XENHVM, M_NOWAIT);
-               if (hypercall_stubs == NULL)
-                       panic("Unable to allocate Xen hypercall region");
-       }
 
        for (i = 0; i < regs[0]; i++)
-               wrmsr(regs[1], vtophys(hypercall_stubs + i * PAGE_SIZE) + i);
+               wrmsr(regs[1], vtophys(&hypercall_page + i * PAGE_SIZE) + i);
 
        return (0);
 }
@@ -692,7 +683,12 @@ xen_hvm_init(enum xen_hvm_init_type init_type)
        if (init_type == XEN_HVM_INIT_CANCELLED_SUSPEND)
                return;
 
-       error = xen_hvm_init_hypercall_stubs();
+       if (xen_pv_domain()) {
+               /* hypercall page is already set in the PV case */
+               error = 0;
+       } else {
+               error = xen_hvm_init_hypercall_stubs(init_type);
+       }
 
        switch (init_type) {
        case XEN_HVM_INIT_COLD:
-- 
1.7.7.5 (Apple Git-26)


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


 


Rackspace

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