svn commit: r185393 - user/dfr/xenhvm/6/sys/xen/xenbus

Doug Rabson dfr at FreeBSD.org
Fri Nov 28 08:39:20 PST 2008


Author: dfr
Date: Fri Nov 28 16:39:20 2008
New Revision: 185393
URL: http://svn.freebsd.org/changeset/base/185393

Log:
  Add Xen HVM support.

Modified:
  user/dfr/xenhvm/6/sys/xen/xenbus/xenbus_comms.c
  user/dfr/xenhvm/6/sys/xen/xenbus/xenbus_xs.c

Modified: user/dfr/xenhvm/6/sys/xen/xenbus/xenbus_comms.c
==============================================================================
--- user/dfr/xenhvm/6/sys/xen/xenbus/xenbus_comms.c	Fri Nov 28 16:29:24 2008	(r185392)
+++ user/dfr/xenhvm/6/sys/xen/xenbus/xenbus_comms.c	Fri Nov 28 16:39:20 2008	(r185393)
@@ -58,7 +58,6 @@ extern int xenstored_ready; 
 static DECLARE_WORK(probe_work, xenbus_probe, NULL);
 #endif
 int xb_wait;
-extern char *xen_store;
 #define wake_up wakeup
 #define xb_waitq xb_wait
 #define pr_debug(a,b,c)
@@ -144,7 +143,7 @@ int xb_write(const void *tdata, unsigned
 				intf->req_prod += avail;
 
 				/* This implies mb() before other side sees interrupt. */
-				notify_remote_via_evtchn(xen_start_info->store_evtchn);
+				notify_remote_via_evtchn(xen_store_evtchn);
 		}
 
 		return 0;
@@ -205,7 +204,7 @@ int xb_read(void *tdata, unsigned len)
 				pr_debug("Finished read of %i bytes (%i to go)\n", avail, len);
 
 				/* Implies mb(): they will see new header. */
-				notify_remote_via_evtchn(xen_start_info->store_evtchn);
+				notify_remote_via_evtchn(xen_store_evtchn);
 		}
 
 		return 0;
@@ -228,7 +227,7 @@ int xb_init_comms(void)
 				unbind_from_irqhandler(xenbus_irq, &xb_waitq);
 
 		err = bind_caller_port_to_irqhandler(
-				xen_start_info->store_evtchn,
+				xen_store_evtchn,
 				"xenbus", wake_waiting, NULL, INTR_TYPE_NET, NULL);
 		if (err <= 0) {
 				log(LOG_WARNING, "XENBUS request irq failed %i\n", err);

Modified: user/dfr/xenhvm/6/sys/xen/xenbus/xenbus_xs.c
==============================================================================
--- user/dfr/xenhvm/6/sys/xen/xenbus/xenbus_xs.c	Fri Nov 28 16:29:24 2008	(r185392)
+++ user/dfr/xenhvm/6/sys/xen/xenbus/xenbus_xs.c	Fri Nov 28 16:39:20 2008	(r185393)
@@ -57,6 +57,8 @@ __FBSDID("$FreeBSD$");
 #include <machine/stdarg.h>
 
 #include <xen/xenbus/xenbus_comms.h>
+#include <xen/interface/hvm/params.h>
+
 static int xs_process_msg(enum xsd_sockmsg_type *type);
 
 #define kmalloc(size, unused) malloc(size, M_DEVBUF, M_WAITOK)
@@ -71,6 +73,7 @@ static int xs_process_msg(enum xsd_sockm
 #define streq(a, b) (strcmp((a), (b)) == 0)
 int xenwatch_running = 0;
 int xenbus_running = 0;
+int xen_store_evtchn;
 
 struct kvec {
 		const void *iov_base;
@@ -908,11 +911,43 @@ static void xenbus_thread(void *unused)
 		}
 }
 
+#ifdef XENHVM
+
+static unsigned long xen_store_mfn;
+char *xen_store;
+
+static inline unsigned long
+hvm_get_parameter(int index)
+{
+		struct xen_hvm_param xhv;
+		int error;
+	
+		xhv.domid = DOMID_SELF;
+		xhv.index = index;
+		error = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv);
+		if (error) {
+				printf("hvm_get_parameter: failed to get %d, error %d\n",
+					   index, error);
+				return (0);
+		}
+		return (xhv.value);
+}
+
+#endif
+
 int xs_init(void)
 {
 		int err;
 		struct proc *p;
 
+#ifdef XENHVM
+		xen_store_evtchn = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN);
+		xen_store_mfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
+		xen_store = pmap_mapdev(xen_store_mfn * PAGE_SIZE, PAGE_SIZE);
+#else
+		xen_store_evtchn = xen_start_info->store_evtchn;
+#endif
+
 		TAILQ_INIT(&xs_state.reply_list);
 		TAILQ_INIT(&watch_events);
 		sx_init(&xenwatch_mutex, "xenwatch");


More information about the svn-src-user mailing list