]> xenbits.xensource.com Git - people/andrewcoop/xen.git/commitdiff
tools/xenstored: map stubdom interface
authorJuergen Gross <jgross@suse.com>
Mon, 5 Feb 2024 10:49:57 +0000 (11:49 +0100)
committerJulien Grall <jgrall@amazon.com>
Mon, 5 Feb 2024 19:26:32 +0000 (19:26 +0000)
When running as stubdom, map the stubdom's Xenstore ring page in order
to support using the 9pfs frontend.

Use the same pattern as in dom0_init() when running as daemon in dom0
(introduce the own domain, then send an event to the client side to
signal Xenstore is ready to communicate).

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Jason Andryuk <jandryuk@gmail.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
tools/xenstored/core.c
tools/xenstored/domain.c
tools/xenstored/domain.h

index 3bf2ec7734c81eea833e79ddf805a2374dfeedcb..48fc787ac176d5f380e303cfb2ea6ecf4ba1d106 100644 (file)
@@ -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. */
index 621b415088b4bb8757e0804147349c549d4bd0d2..1a7d5e9756883c3f4b9a5ba58cd320affa7a79af 100644 (file)
 #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;
index 224c4c23e2d3acf51432c9d4a7d0ee7293a74815..844ac11510c918764a69daab3e613d7b65fe5be7 100644 (file)
@@ -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);