[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xenfb: make restartable [Was: pv-grub doesn't run on rhel5]
Samuel Thibault, le Thu 14 Aug 2008 16:14:00 +0100, a écrit : > > Another pvgrub issue: Is booting guests with the framebuffer enabled > > supposed to work? > > Yes, but you have to not enable the framebuffer in the grub > configuration, because the framebuffer is currently not able to restart. Oh actually it was a lot easier than I thought, see patch below (which is actually partly bug fixes). xenfb: make restartable - Fix the pixel unmapping, which should happen during the Closing state. - Fix qemu segfault when a guest shuts its fb down. - Once connected, if frontend state goes from Closed to Initialized, restart the connection loop. Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx> diff -r 38783464a671 extras/mini-os/fbfront.c --- a/extras/mini-os/fbfront.c Thu Aug 14 16:16:44 2008 +0100 +++ b/extras/mini-os/fbfront.c Thu Aug 14 18:59:27 2008 +0100 @@ -226,8 +226,7 @@ void shutdown_kbdfront(struct kbdfront_d xenbus_wait_for_value(path, "6", &dev->events); err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1); - // does not work yet. - //xenbus_wait_for_value(path, "2", &dev->events); + xenbus_wait_for_value(path, "2", &dev->events); xenbus_unwatch_path(XBT_NIL, path); @@ -566,8 +565,7 @@ void shutdown_fbfront(struct fbfront_dev xenbus_wait_for_value(path, "6", &dev->events); err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1); - // does not work yet - //xenbus_wait_for_value(path, "2", &dev->events); + xenbus_wait_for_value(path, "2", &dev->events); xenbus_unwatch_path(XBT_NIL, path); diff -r 38783464a671 stubdom/README --- a/stubdom/README Thu Aug 14 16:16:44 2008 +0100 +++ b/stubdom/README Thu Aug 14 18:59:27 2008 +0100 @@ -126,9 +126,4 @@ Limitations =========== - You can not boot a 64bit kernel with a 32bit-compiled PV-GRUB and vice-versa. -To cross-compile a 32bit PV-GRUB, - -export XEN_TARGET_ARCH=x86_32 - -- bootsplash is supported, but the ioemu backend does not yet support restart -for use by the booted kernel. +You need to choose between pv-grub-x86_64.gz and pv-grub-x86_32.gz diff -r 38783464a671 tools/ioemu/hw/xenfb.c --- a/tools/ioemu/hw/xenfb.c Thu Aug 14 16:16:44 2008 +0100 +++ b/tools/ioemu/hw/xenfb.c Thu Aug 14 18:59:27 2008 +0100 @@ -445,6 +445,13 @@ static void xenfb_unbind(struct xenfb_de xc_evtchn_unbind(dev->xenfb->evt_xch, dev->port); dev->port = -1; } + + if (!strcmp(dev->devicetype, "vfb")) { + if (dev->xenfb->pixels) { + munmap(dev->xenfb->pixels, dev->xenfb->fb_len); + dev->xenfb->pixels = NULL; + } + } } @@ -452,10 +459,6 @@ static void xenfb_detach_dom(struct xenf { xenfb_unbind(&xenfb->fb); xenfb_unbind(&xenfb->kbd); - if (xenfb->pixels) { - munmap(xenfb->pixels, xenfb->fb_len); - xenfb->pixels = NULL; - } } /* Remove the backend area in xenbus since the framebuffer really is @@ -653,6 +656,16 @@ static int xenfb_on_state_change(struct not much point in us continuing. */ return -1; case XenbusStateInitialising: + if (dev->state != XenbusStateClosed) + /* Do not let a domain make us skip the closing state */ + return 0; + xenfb_switch_state(dev, XenbusStateInitWait); + xs_unwatch(dev->xenfb->xsh, dev->otherend, ""); + if (!strcmp(dev->devicetype, "vkbd")) { + fprintf(stderr, "FB: Waiting for KBD backend creation\n"); + xenfb_wait_for_frontend(&dev->xenfb->kbd, xenfb_frontend_initialized_kbd); + } + break; case XenbusStateInitWait: case XenbusStateInitialised: case XenbusStateConnected: @@ -1274,6 +1287,9 @@ static void xenfb_update(void *opaque) struct xenfb *xenfb = opaque; int period; + if (!xenfb->fb.page) + return; + if (xenfb_queue_full(xenfb)) return; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |