]> xenbits.xensource.com Git - qemu-xen-4.0-testing.git/commitdiff
fix xenfb frontend and backend
authorIan Jackson <ian.jackson@eu.citrix.com>
Tue, 10 Mar 2009 18:16:52 +0000 (18:16 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Tue, 10 Mar 2009 18:16:52 +0000 (18:16 +0000)
Due to the DisplayState changes the initialization order is changed
as well.

Now graphic devices are the first to be initialized and only after them
any display frontend is initialized.

Obviously this change has a direct consequence on the xenfb backend and
frontend and this patch takes care of adapting them to the new
initialization order.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
hw/vga.c
hw/xen_backend.h
hw/xen_machine_pv.c
hw/xenfb.c
qemu-xen.h
xenfbfront.c

index 3399e62f1295c8db98b40444f47e4d2a46b79382..0d5dff4b9e017476d22f4a3b06ceabd35d8c27f0 100644 (file)
--- a/hw/vga.c
+++ b/hw/vga.c
@@ -2497,7 +2497,7 @@ void xen_vga_vram_map(uint64_t vram_addr, uint32_t vga_ram_size)
 
     xen_vga_state->vram_ptr = vram;
 #ifdef CONFIG_STUBDOM
-    xenfb_pv_display_start(vram);
+    xenfb_pv_display_vram(vram);
 #endif
 }
 
@@ -2539,14 +2539,14 @@ void vga_common_init(VGAState *s, uint8_t *vga_ram_base,
     s->get_offsets = vga_get_offsets;
     s->get_resolution = vga_get_resolution;
 
+    s->ds = graphic_console_init(vga_update_display, vga_invalidate_display,
+                                 vga_screen_dump, vga_update_text, s);
+
     if (!restore) {
         xen_vga_populate_vram(VRAM_RESERVED_ADDRESS, s->vram_size);
         s->vram_gmfn = VRAM_RESERVED_ADDRESS;
     }
 
-    s->ds = graphic_console_init(vga_update_display, vga_invalidate_display,
-                                 vga_screen_dump, vga_update_text, s);
-
     vga_bios_init(s);
     switch (vga_retrace_method) {
     case VGA_RETRACE_DUMB:
index 4df0cffd2322510aca5038e707e23de04a0f926e..9aa8d13c1b492d5869e05bbcaa576d610e7381aa 100644 (file)
@@ -89,6 +89,6 @@ extern struct XenDevOps xen_console_ops;      /* xen_console.c     */
 extern struct XenDevOps xen_kbdmouse_ops;     /* xen_framebuffer.c */
 extern struct XenDevOps xen_framebuffer_ops;  /* xen_framebuffer.c */
 
-void xen_set_display(int domid, DisplayState *ds);
+void xen_set_display(int domid);
 
 #endif /* QEMU_HW_XEN_BACKEND_H */
index 1dcfa31fa8011379b89c9bac518823e9d1dfcdea..dbc4688dc27161ea059eb1ed5468fd2c8ae2785b 100644 (file)
@@ -68,7 +68,7 @@ static void xen_init_pv(ram_addr_t ram_size, int vga_ram_size,
     xen_be_register("vfb", &xen_framebuffer_ops);
 
     /* setup framebuffer */
-    xen_set_display(xen_domid, ds);
+    xen_set_display(xen_domid);
 }
 
 QEMUMachine xenpv_machine = {
index fe035b73eb02e8663049e02d6c71500aaf4ec971..4496465359b26a6a30acecffafff0e0d4ef7aec9 100644 (file)
@@ -86,7 +86,6 @@ struct XenFB {
     int               feature_update;
     int               refresh_period;
     int               bug_trigger;
-    int               have_console;
 
     struct {
        int x,y,w,h;
@@ -347,12 +346,6 @@ static int input_init(struct XenDevice *xendev)
 {
     struct XenInput *in = container_of(xendev, struct XenInput, c.xendev);
 
-    if (!in->c.ds) {
-        /* xen_set_display() below will set that and trigger us again */
-        xen_be_printf(xendev, 1, "ds not set (yet)\n");
-       return -1;
-    }
-
     xenstore_write_be_int(xendev, "feature-abs-pointer", 1);
     return 0;
 }
@@ -702,6 +695,9 @@ static void xenfb_update(void *opaque)
     int i;
     struct DisplayChangeListener *l;
 
+    if (!xenfb->width || !xenfb->height)
+        return;
+
     if (xenfb->feature_update) {
 #ifdef XENFB_TYPE_REFRESH_PERIOD
         int period = 99999999;
@@ -841,12 +837,6 @@ static int fb_init(struct XenDevice *xendev)
 {
     struct XenFB *fb = container_of(xendev, struct XenFB, c.xendev);
 
-    if (!fb->c.ds) {
-        /* xen_set_display() below will set that and trigger us again */
-       xen_be_printf(xendev, 1, "ds not set (yet)\n");
-       return -1;
-    }
-
     fb->refresh_period = -1;
 
 #ifdef XENFB_TYPE_RESIZE
@@ -880,15 +870,6 @@ static int fb_connect(struct XenDevice *xendev)
     if (0 != rc)
        return rc;
 
-    if (!fb->have_console) {
-        fb->c.ds = graphic_console_init(xenfb_update,
-                                        xenfb_invalidate,
-                                        NULL,
-                                        NULL,
-                                        fb);
-        fb->have_console = 1;
-    }
-
     if (-1 == xenstore_read_fe_int(xendev, "feature-update", &fb->feature_update))
        fb->feature_update = 0;
     if (fb->feature_update)
@@ -977,8 +958,16 @@ static void xen_set_display_type(int domid, const char *type, DisplayState *ds)
     xen_be_check_state(xendev);
 }
 
-void xen_set_display(int domid, DisplayState *ds)
+void xen_set_display(int domid)
 {
+    struct XenDevice *xendev = xen_be_find_xendev("vfb", domid, 0);
+    struct XenFB *fb = container_of(xendev, struct XenFB, c.xendev);
+    DisplayState *ds = graphic_console_init(xenfb_update,
+            xenfb_invalidate,
+            NULL,
+            NULL,
+            fb);
+
     xen_set_display_type(domid, "vkbd", ds);
     xen_set_display_type(domid, "vfb", ds);
 }
index 3c8bd1310091052e09db7e68ae102009d83311fd..e3f29f71e9a310e7ed5af451beda0086b102fa75 100644 (file)
@@ -101,7 +101,7 @@ int xenstore_pv_driver_build_blacklisted(uint16_t product_number,
 
 /* xenfbfront.c */
 int xenfb_pv_display_init(DisplayState *ds);
-int xenfb_pv_display_start(void *vram_start);
+int xenfb_pv_display_vram(void *vram_start);
 int xenfb_connect_vkbd(const char *path);
 int xenfb_connect_vfb(const char *path);
 
index 35ccfa016518e2729939c6e175df868ca7d4e1d9..491bc421bd068c7f66c8e78c88a1c1b319df3477 100644 (file)
@@ -14,13 +14,14 @@ typedef struct XenFBState {
     struct semaphore kbd_sem;
     struct kbdfront_dev *kbd_dev;
     struct fbfront_dev *fb_dev;
-    void *vga_vram, *nonshared_vram;
+    void *nonshared_vram;
     DisplayState *ds;
 } XenFBState;
 
 XenFBState *xs;
 
 static char *kbd_path, *fb_path;
+static void *vga_vram;
 
 static unsigned char linux2scancode[KEY_MAX + 1];
 static DisplayChangeListener *dcl;
@@ -58,7 +59,7 @@ static void xenfb_pv_resize(DisplayState *ds)
     if (!fb_dev)
         return;
     if (!(ds->surface->flags & QEMU_ALLOCATED_FLAG))
-        offset = ((void *) ds_get_data(ds)) - xs->vga_vram;
+        offset = ((void *) ds_get_data(ds)) - vga_vram;
     else
         offset = vga_ram_size;
     fbfront_resize(fb_dev, ds_get_width(ds), ds_get_height(ds), ds_get_linesize(ds), ds_get_bits_per_pixel(ds), offset);
@@ -68,7 +69,7 @@ static void xenfb_pv_setdata(DisplayState *ds)
 {
     XenFBState *xs = ds->opaque;
     struct fbfront_dev *fb_dev = xs->fb_dev;
-    int offset = ((void *) ds_get_data(ds)) - xs->vga_vram;
+    int offset = ((void *) ds_get_data(ds)) - vga_vram;
     if (!fb_dev)
         return;
     fbfront_resize(fb_dev, ds_get_width(ds), ds_get_height(ds), ds_get_linesize(ds), ds_get_bits_per_pixel(ds), offset);
@@ -216,6 +217,13 @@ static void kbdfront_thread(void *p)
 
 int xenfb_pv_display_init(DisplayState *ds)
 {
+    struct fbfront_dev *fb_dev;
+    int kbd_fd, fb_fd;
+    unsigned long *mfns;
+    int offset = 0;
+    int i;
+    int n = vga_ram_size / PAGE_SIZE;
+
     if (!fb_path || !kbd_path)
         return -1;
 
@@ -238,27 +246,10 @@ int xenfb_pv_display_init(DisplayState *ds)
     dcl->dpy_setdata = xenfb_pv_setdata;
     dcl->dpy_refresh = xenfb_pv_refresh;
     register_displaychangelistener(ds, dcl);
-    return 0;
-}
-
-int xenfb_pv_display_start(void *data)
-{
-    DisplayState *ds;
-    struct fbfront_dev *fb_dev;
-    int kbd_fd, fb_fd;
-    int offset = 0;
-    unsigned long *mfns;
-    int n = vga_ram_size / PAGE_SIZE;
-    int i;
 
-    if (!fb_path || !kbd_path)
-        return 0;
-
-    ds = xs->ds;
-    xs->vga_vram = data;
     mfns = malloc(2 * n * sizeof(*mfns));
     for (i = 0; i < n; i++)
-        mfns[i] = virtual_to_mfn(xs->vga_vram + i * PAGE_SIZE);
+        mfns[i] = virtual_to_mfn(vga_vram + i * PAGE_SIZE);
     for (i = 0; i < n; i++)
         mfns[n + i] = virtual_to_mfn(xs->nonshared_vram + i * PAGE_SIZE);
 
@@ -271,7 +262,7 @@ int xenfb_pv_display_start(void *data)
     free(fb_path);
 
     if (!(ds->surface->flags & QEMU_ALLOCATED_FLAG)) {
-        offset = (void*) ds_get_data(ds) - xs->vga_vram;
+        offset = (void*) ds_get_data(ds) - vga_vram;
     } else {
         offset = vga_ram_size;
     }
@@ -290,3 +281,9 @@ int xenfb_pv_display_start(void *data)
     xs->fb_dev = fb_dev;
     return 0;
 }
+
+int xenfb_pv_display_vram(void *data)
+{
+    vga_vram = data;
+}
+