From: Ian Jackson Date: Tue, 10 Mar 2009 18:16:52 +0000 (+0000) Subject: fix xenfb frontend and backend X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=c01ebe554ef5486311b21015313316c2deadd85c;p=xenclient%2Fioemu.git fix xenfb frontend and backend 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 --- diff --git a/hw/vga.c b/hw/vga.c index 3399e62f..0d5dff4b 100644 --- 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: diff --git a/hw/xen_backend.h b/hw/xen_backend.h index 4df0cffd..9aa8d13c 100644 --- a/hw/xen_backend.h +++ b/hw/xen_backend.h @@ -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 */ diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c index 1dcfa31f..dbc4688d 100644 --- a/hw/xen_machine_pv.c +++ b/hw/xen_machine_pv.c @@ -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 = { diff --git a/hw/xenfb.c b/hw/xenfb.c index fe035b73..44964653 100644 --- a/hw/xenfb.c +++ b/hw/xenfb.c @@ -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); } diff --git a/qemu-xen.h b/qemu-xen.h index 3c8bd131..e3f29f71 100644 --- a/qemu-xen.h +++ b/qemu-xen.h @@ -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); diff --git a/xenfbfront.c b/xenfbfront.c index 35ccfa01..491bc421 100644 --- a/xenfbfront.c +++ b/xenfbfront.c @@ -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; +} +