@@ -2767,6 +2767,8 @@ int main(int argc, char *argv[])
lu_read_state();
#endif
+ stubdom_init();
+
check_store();
/* Get ready to listen to the tools. */
@@ -37,6 +37,10 @@
#include <xenctrl.h>
#include <xen/grant_table.h>
+#ifdef __MINIOS__
+#include <mini-os/xenbus.h>
+#endif
+
static xc_interface **xc_handle;
xengnttab_handle **xgt_handle;
static evtchn_port_t virq_port;
@@ -500,6 +504,11 @@ static void *map_interface(domid_t domid)
if (domid == xenbus_master_domid())
return xenbus_map();
+#ifdef __MINIOS__
+ if (domid == stub_domid)
+ return xenstore_buf;
+#endif
+
return xengnttab_map_grant_ref(*xgt_handle, domid,
GNTTAB_RESERVED_XENSTORE,
PROT_READ|PROT_WRITE);
@@ -509,7 +518,7 @@ static void unmap_interface(domid_t domid, void *interface)
{
if (domid == xenbus_master_domid())
unmap_xenbus(interface);
- else
+ else if (domid != stub_domid)
xengnttab_unmap(*xgt_handle, interface, 1);
}
@@ -1214,6 +1223,22 @@ void dom0_init(void)
xenevtchn_notify(xce_handle, dom0->port);
}
+void stubdom_init(void)
+{
+#ifdef __MINIOS__
+ struct domain *stubdom;
+
+ if (stub_domid < 0)
+ return;
+
+ stubdom = introduce_domain(NULL, stub_domid, xenbus_evtchn, false);
+ if (!stubdom)
+ barf_perror("Failed to initialize stubdom");
+
+ xenevtchn_notify(xce_handle, stubdom->port);
+#endif
+}
+
static unsigned int domhash_fn(const void *k)
{
return *(const unsigned int *)k;
@@ -85,6 +85,7 @@ int do_reset_watches(const void *ctx, struct connection *conn,
void domain_early_init(void);
void domain_init(int evtfd);
void dom0_init(void);
+void stubdom_init(void);
void domain_deinit(void);
void ignore_connection(struct connection *conn, unsigned int err);