Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Mar 2014 10:24:13 +0000 (UTC)
From:      Roger Pau Monné <royger@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r263010 - in head/sys: amd64/include/xen i386/i386 i386/include/xen x86/xen
Message-ID:  <201403111024.s2BAOD2c022929@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: royger
Date: Tue Mar 11 10:24:13 2014
New Revision: 263010
URL: http://svnweb.freebsd.org/changeset/base/263010

Log:
  xen: use the same hypercall mechanism for XEN and XENHVM
  
  Currently XEN (PV) and XENHVM (PVHVM) ports use different ways to
  issue hypercalls, unify this by filling the hypercall_page under HVM
  also.
  
  Approved by: gibbs
  Sponsored by: Citrix Systems R&D
  
  amd64/include/xen/hypercall.h:
   - Unify Xen hypercall code by always using the PV way.
  
  i386/i386/locore.s:
   - Define hypercall_page on i386 XENHVM.
  
  x86/xen/hvm.c:
   - Fill hypercall_page on XENHVM kernels using the HVM method (only
     when running as an HVM guest).

Modified:
  head/sys/amd64/include/xen/hypercall.h
  head/sys/i386/i386/locore.s
  head/sys/i386/include/xen/hypercall.h
  head/sys/x86/xen/hvm.c

Modified: head/sys/amd64/include/xen/hypercall.h
==============================================================================
--- head/sys/amd64/include/xen/hypercall.h	Tue Mar 11 10:23:03 2014	(r263009)
+++ head/sys/amd64/include/xen/hypercall.h	Tue Mar 11 10:24:13 2014	(r263010)
@@ -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)			\
 ({						\

Modified: head/sys/i386/i386/locore.s
==============================================================================
--- head/sys/i386/i386/locore.s	Tue Mar 11 10:23:03 2014	(r263009)
+++ head/sys/i386/i386/locore.s	Tue Mar 11 10:24:13 2014	(r263010)
@@ -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

Modified: head/sys/i386/include/xen/hypercall.h
==============================================================================
--- head/sys/i386/include/xen/hypercall.h	Tue Mar 11 10:23:03 2014	(r263009)
+++ head/sys/i386/include/xen/hypercall.h	Tue Mar 11 10:24:13 2014	(r263010)
@@ -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)                 \
 ({                                              \

Modified: head/sys/x86/xen/hvm.c
==============================================================================
--- head/sys/x86/xen/hvm.c	Tue Mar 11 10:23:03 2014	(r263009)
+++ head/sys/x86/xen/hvm.c	Tue Mar 11 10:24:13 2014	(r263010)
@@ -147,7 +147,7 @@ DPCPU_DEFINE(xen_intr_handle_t, ipi_hand
 
 /*------------------ 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;
 
@@ -386,16 +386,21 @@ 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;
 
+	if (xen_pv_domain()) {
+		/* hypercall page is already set in the PV case */
+		return (0);
+	}
+
 	base = xen_hvm_cpuid_base();
 	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);
@@ -405,18 +410,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);
 }
@@ -519,7 +515,7 @@ xen_hvm_init(enum xen_hvm_init_type init
 	if (init_type == XEN_HVM_INIT_CANCELLED_SUSPEND)
 		return;
 
-	error = xen_hvm_init_hypercall_stubs();
+	error = xen_hvm_init_hypercall_stubs(init_type);
 
 	switch (init_type) {
 	case XEN_HVM_INIT_COLD:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201403111024.s2BAOD2c022929>