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