]> xenbits.xensource.com Git - qemu-xen-4.1-testing.git/commitdiff
qemu-xen: support qdisk with stubdoms
authorIan Jackson <ian.jackson@eu.citrix.com>
Tue, 23 Nov 2010 17:57:17 +0000 (17:57 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Tue, 23 Nov 2010 18:00:57 +0000 (18:00 +0000)
In the qemu used as backend provider for stubdoms, register two qdisk
backends: one for the stubdom and one for the guest.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
hw/xen_backend.c
hw/xen_backend.h
hw/xen_machine_pv.c
qemu-xen.h
xenstore.c

index afd0bf2a11db8927dad1b5422328d2389774c4ba..537e21f8ecf59b28f4bfe04ee0a603f00fd18eb0 100644 (file)
@@ -526,7 +526,7 @@ void xen_be_check_state(struct XenDevice *xendev)
 
 /* ------------------------------------------------------------- */
 
-static int xenstore_scan(const char *type, int dom, struct XenDevOps *ops)
+int xenstore_scan(const char *type, int dom, struct XenDevOps *ops)
 {
     struct XenDevice *xendev;
     char path[XEN_BUFSIZE], token[XEN_BUFSIZE];
index c48c593bc1c66160df776ca207c3caa756b91bba..28e77ac5cbac74fe5fedc4fa4b6dd22710995fa9 100644 (file)
@@ -78,6 +78,7 @@ void xen_be_check_state(struct XenDevice *xendev);
 /* xen backend driver bits */
 int xen_be_init(void);
 int xen_be_register(const char *type, struct XenDevOps *ops);
+int xenstore_scan(const char *type, int dom, struct XenDevOps *ops);
 int xen_be_set_state(struct XenDevice *xendev, enum xenbus_state state);
 int xen_be_bind_evtchn(struct XenDevice *xendev);
 void xen_be_unbind_evtchn(struct XenDevice *xendev);
index b2475ba31d9e4ddd78ad298830d61a8eab0dd4bf..724317465325534eed024b2cf4c1e9802d625b1c 100644 (file)
@@ -27,6 +27,7 @@
 #include "sysemu.h"
 #include "boards.h"
 #include "xen_backend.h"
+#include "qemu-xen.h"
 
 #ifndef CONFIG_STUBDOM
 #include <hw/xen_blktap.h>
@@ -44,6 +45,7 @@ static void xen_init_pv(ram_addr_t ram_size, int vga_ram_size,
                        const char *direct_pci)
 {
     CPUState *env;
+    uint32_t domid_target;
 
 #ifndef CONFIG_STUBDOM
     /* Initialize tapdisk client */
@@ -70,6 +72,9 @@ static void xen_init_pv(ram_addr_t ram_size, int vga_ram_size,
     xen_be_register("vkbd", &xen_kbdmouse_ops);
     xen_be_register("vfb", &xen_framebuffer_ops);
     xen_be_register("qdisk", &xen_blkdev_ops);
+    domid_target = xenstore_read_target();
+    if (domid_target)
+        xenstore_scan("qdisk", domid_target, &xen_blkdev_ops);
 
     /* setup framebuffer */
     xen_init_display(xen_domid);
index 7821b5494835c2dd2c2ebf8bf28463a1292ab3c2..0e70dbe343508ee9fb3a27fc073e6c0f8adb1c70 100644 (file)
@@ -63,6 +63,7 @@ void handle_buffered_pio(void);
 
 /* xenstore.c */
 void xenstore_init(void);
+uint32_t xenstore_read_target(void);
 void xenstore_parse_domain_config(int domid);
 int xenstore_parse_disable_pf_config(void);
 int xenstore_fd(void);
index b7e7c28e111974d62c066e8ab3660ea91c94e7b2..d364a5e2674e8d04c38aa3e76cc06b56d8651c96 100644 (file)
@@ -391,6 +391,42 @@ static const char *xenstore_get_guest_uuid(void)
     return already_computed;
 }
 
+uint32_t xenstore_read_target(void)
+{
+    char *domain_path = NULL, *target_path = NULL, *target_value = NULL, *p = NULL;
+    unsigned int len;
+    uint32_t target_domid = 0;
+
+    if (xsh == NULL)
+        return 0;
+
+    domain_path = xs_get_domain_path(xsh, domid);
+    if (domain_path == NULL) {
+        fprintf(logfile, "xs_get_domain_path() error. domid %d.\n", domid);
+        goto out;
+    }
+
+    if (pasprintf(&target_path, "%s/target", domain_path) == -1) {
+        fprintf(logfile, "xenstore_get_guest_uuid(): out of memory.\n");
+        goto out;
+    }
+    target_value = xs_read(xsh, XBT_NULL, target_path, &len);
+    if (target_value == NULL) {
+        fprintf(logfile, "xs_read(): target get error. %s.\n", target_path);
+        goto out;
+    }
+
+    fprintf(logfile, "target = %s\n", target_value);
+    target_domid = strtoul(target_value, NULL, 10);
+
+ out:
+    free(domain_path);
+    free(target_path);
+    free(target_value);
+
+    return target_domid;
+}
+
 #define PT_PCI_MSITRANSLATE_DEFAULT 1
 #define PT_PCI_POWER_MANAGEMENT_DEFAULT 0
 int direct_pci_msitranslate;