[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-xen
mailing list