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
|