[PATCH RFC 13/13] xenstore: changes needed to boot in Dom0 mode

Roger Pau Monne roger.pau at citrix.com
Tue Dec 24 11:25:29 UTC 2013


This patch includes changes to xenstore in order to boot as Dom0. This
is different from booting as a guest, since when booted as Dom0
xenstore is not available. This patch sets up a memory page, an
event channel for xenstore and disables xenbus device probing at boot.
It contains a workaround for xs_watch, that should be fixed when we
are able to start xenstored from Dom0.
---
 sys/xen/xenbus/xenbusb.c    |    6 ++++--
 sys/xen/xenstore/xenstore.c |   22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/sys/xen/xenbus/xenbusb.c b/sys/xen/xenbus/xenbusb.c
index 1f84795..11be0f5 100644
--- a/sys/xen/xenbus/xenbusb.c
+++ b/sys/xen/xenbus/xenbusb.c
@@ -760,8 +760,10 @@ xenbusb_attach(device_t dev, char *bus_node, u_int id_components)
 	 * bus when they are dynamically attached to us
 	 * by a Xen management action.
 	 */
-	(void)xenbusb_enumerate_bus(xbs);
-	xenbusb_probe_children(dev);
+	if (!xen_initial_domain()) {
+		(void)xenbusb_enumerate_bus(xbs);
+		xenbusb_probe_children(dev);
+	}
 
 	xbs->xbs_device_watch.node = bus_node;
 	xbs->xbs_device_watch.callback = xenbusb_devices_changed;
diff --git a/sys/xen/xenstore/xenstore.c b/sys/xen/xenstore/xenstore.c
index 2893c84..bde3f5d 100644
--- a/sys/xen/xenstore/xenstore.c
+++ b/sys/xen/xenstore/xenstore.c
@@ -1144,6 +1144,24 @@ xs_attach(device_t dev)
 		xs.gpfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
 		xen_store = pmap_mapdev(xs.gpfn * PAGE_SIZE, PAGE_SIZE);
 	} else if (xen_pv_domain()) {
+		if (!HYPERVISOR_start_info->store_evtchn) {
+			struct evtchn_alloc_unbound alloc_unbound;
+
+			/* Allocate a local event channel for xenstore */
+			alloc_unbound.dom        = DOMID_SELF;
+			alloc_unbound.remote_dom = DOMID_SELF;
+			error = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
+			                                    &alloc_unbound);
+			if (error)
+				panic("unable to alloc event channel for Dom0: %d",
+				      error);
+
+			HYPERVISOR_start_info->store_evtchn = alloc_unbound.port;
+
+			/* Allocate memory for the xs shared ring */
+			xen_store = malloc(PAGE_SIZE, M_XENSTORE,
+			                   M_WAITOK | M_ZERO);
+		}
 		xs.evtchn = HYPERVISOR_start_info->store_evtchn;
 	} else {
 		panic("Unknown domain type, cannot initialize xenstore\n");
@@ -1579,6 +1597,10 @@ xs_register_watch(struct xs_watch *watch)
 	char token[sizeof(watch) * 2 + 1];
 	int error;
 
+	/* XXX: this is a hack until we get xenstored working */
+	if (xen_initial_domain())
+		return (0);
+
 	sprintf(token, "%lX", (long)watch);
 
 	sx_slock(&xs.suspend_mutex);
-- 
1.7.7.5 (Apple Git-26)



More information about the freebsd-current mailing list