rpms/xen/FC-5 xen-3.0.4-vncpassword-pvfb-backport.patch, NONE, 1.1 xen-console.patch, NONE, 1.1 xen-pvfb-compat.patch, NONE, 1.1 xen-pvfb-fixes.patch, NONE, 1.1 xen-pvfb.patch, 1.1, 1.2 xen.spec, 1.120, 1.121 xen-pvfb-nocursor.patch, 1.1, NONE xen-pvfb-sigpipe.patch, 1.1, NONE xen-vnclisten-pvfb.patch, 1.1, NONE xen-vncpassword-pvfb-2.patch, 1.1, NONE

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Tue Jan 30 19:13:29 UTC 2007


Author: armbru

Update of /cvs/dist/rpms/xen/FC-5
In directory cvs.devel.redhat.com:/tmp/cvs-serv12439

Modified Files:
	xen-pvfb.patch xen.spec 
Added Files:
	xen-3.0.4-vncpassword-pvfb-backport.patch xen-console.patch 
	xen-pvfb-compat.patch xen-pvfb-fixes.patch 
Removed Files:
	xen-pvfb-nocursor.patch xen-pvfb-sigpipe.patch 
	xen-vnclisten-pvfb.patch xen-vncpassword-pvfb-2.patch 
Log Message:
- Update Xen paravirt framebuffer patch to upstream xen-unstable
  changeset 13066.  This changes the protocol to the one accepted
  upstream.
- Add compatibility with guests running our initial protocol.

xen-3.0.4-vncpassword-pvfb-backport.patch:
 .hgignore                             |    1 
 tools/python/xen/xend/server/vfbif.py |   12 ++++
 tools/python/xen/xm/create.py         |    6 +-
 tools/xenfb/vncfb.c                   |   88 ++++++++++++++++++++++++++++++----
 4 files changed, 97 insertions(+), 10 deletions(-)

--- NEW FILE xen-3.0.4-vncpassword-pvfb-backport.patch ---
diff -ruNp xen-3.0.3_0-src.orig/.hgignore xen-3.0.3_0-src.new/.hgignore
--- xen-3.0.3_0-src.orig/.hgignore	2006-12-11 10:51:14.000000000 -0500
+++ xen-3.0.3_0-src.new/.hgignore	2006-12-11 10:43:32.000000000 -0500
@@ -212,3 +212,4 @@
 ^unmodified_drivers/linux-2.6/.*\.cmd$
 ^unmodified_drivers/linux-2.6/.*\.ko$
 ^unmodified_drivers/linux-2.6/.*\.mod\.c$
+^LibVNCServer.*
diff -ruNp xen-3.0.3_0-src.orig/tools/python/xen/xend/server/vfbif.py xen-3.0.3_0-src.new/tools/python/xen/xend/server/vfbif.py
--- xen-3.0.3_0-src.orig/tools/python/xen/xend/server/vfbif.py	2006-12-11 10:51:14.000000000 -0500
+++ xen-3.0.3_0-src.new/tools/python/xen/xend/server/vfbif.py	2006-12-11 11:08:10.000000000 -0500
@@ -1,4 +1,5 @@
 from xen.xend.server.DevController import DevController
+from xen.xend.XendLogging import log
 
 from xen.xend.XendError import VmError
 from xen.xend import sxp
@@ -79,6 +80,17 @@ class VfbifController(DevController):
                      "--title", self.vm.getName() ]
         t = sxp.child_value(config, "type")
         if t == "vnc":
+            passwd = None
+            if sxp.child_value(config, "vncpasswd") != None:
+                passwd = sxp.child_value(config, "vncpasswd")
+            else:
+                passwd = xen.xend.XendRoot.instance().get_vncpasswd_default()
+            if not(passwd is None or passwd == ""):
+                self.vm.storeVm("vncpasswd", passwd)
+                log.debug("Stored a VNC password for vfb access")
+            else:
+                log.debug("No VNC passwd configured for vfb access")
+
             # Try to start the vnc backend
             args = [xen.util.auxbin.pathTo("xen-vncfb")]
             if sxp.child_value(config, "vncunused") is not None:
diff -ruNp xen-3.0.3_0-src.orig/tools/python/xen/xm/create.py xen-3.0.3_0-src.new/tools/python/xen/xm/create.py
--- xen-3.0.3_0-src.orig/tools/python/xen/xm/create.py	2006-12-11 10:51:14.000000000 -0500
+++ xen-3.0.3_0-src.new/tools/python/xen/xm/create.py	2006-12-11 11:08:21.000000000 -0500
@@ -280,7 +280,7 @@ gopts.var('usbport', val='PATH',
           use="""Add a physical USB port to a domain, as specified by the path
           to that port.  This option may be repeated to add more than one port.""")
 
-gopts.var('vfb', val="type={vnc,sdl},vncunused=1,vncdisplay=N,vnclisten=ADDR,display=DISPLAY,xauthority=XAUTHORITY",
+gopts.var('vfb', val="type={vnc,sdl},vncunused=1,vncdisplay=N,vnclisten=ADDR,display=DISPLAY,xauthority=XAUTHORITY,vncpasswd=PASSWORD",
           fn=append_value, default=[],
           use="""Make the domain a framebuffer backend.
           The backend type should be either sdl or vnc.
@@ -563,6 +563,8 @@ def configure_vfbs(config_devs, vals):
                 cfg += ',vncunused=%s' % vals.vncunused
             if vals.vnclisten:
                 cfg += ',vnclisten=%s' % vals.vnclisten
+            if vals.vncpasswd:
+                cfg += ',vncpasswd=%s' % vals.vncpasswd
         else:
             cfg = 'type=sdl'
         if vals.xauthority:
@@ -578,7 +580,7 @@ def configure_vfbs(config_devs, vals):
             d['type'] = 'sdl'
         for (k,v) in d.iteritems():
             if not k in [ 'vnclisten', 'vncunused', 'vncdisplay', 'display',
-                          'xauthority', 'type' ]:
+                          'xauthority', 'type', 'vncpasswd' ]:
                 err("configuration option %s unknown to vfbs" % k)
             config.append([k,v])
         if not d.has_key("display") and os.environ.has_key("DISPLAY"):
diff -ruNp xen-3.0.3_0-src.orig/tools/xenfb/vncfb.c xen-3.0.3_0-src.new/tools/xenfb/vncfb.c
--- xen-3.0.3_0-src.orig/tools/xenfb/vncfb.c	2006-12-11 10:51:14.000000000 -0500
+++ xen-3.0.3_0-src.new/tools/xenfb/vncfb.c	2006-12-11 11:48:19.000000000 -0500
@@ -205,15 +205,10 @@ static void on_ptr_event(int buttonMask,
 	last_y = y;
 }
 
-static void xenstore_write_vncport(int port, int domid)
+static void xenstore_write_vncport(struct xs_handle *xsh, int port, int domid)
 {
-	char *buf = NULL, *path;
+	char *buf, *path;
 	char portstr[10];
-	struct xs_handle *xsh = NULL;
-
-	xsh = xs_daemon_open();
-	if (xsh == NULL)
-		return;
 
 	path = xs_get_domain_path(xsh, domid);
 	if (path == NULL) {
@@ -241,6 +236,54 @@ static void xenstore_write_vncport(int p
 }
 
 
+static int xenstore_read_vncpasswd(struct xs_handle *xsh, int domid, char *pwbuf, int pwbuflen)
+{
+	char buf[256], *path, *uuid = NULL, *passwd = NULL;
+	unsigned int len, rc = 0;
+
+	if (xsh == NULL) {
+		return -1;
+	}
+
+	path = xs_get_domain_path(xsh, domid);
+	if (path == NULL) {
+		fprintf(stderr, "xs_get_domain_path() error\n");
+		return -1;
+	}
+
+	snprintf(buf, sizeof(buf), "%s/vm", path);
+	uuid = xs_read(xsh, XBT_NULL, buf, &len);
+	if (uuid == NULL) {
+		fprintf(stderr, "xs_read(): uuid get error\n");
+		free(path);
+		return -1;
+	}
+
+	snprintf(buf, sizeof(buf), "%s/vncpasswd", uuid);
+	passwd = xs_read(xsh, XBT_NULL, buf, &len);
+	if (passwd == NULL) {
+		free(uuid);
+		free(path);
+		return rc;
+	}
+
+	strncpy(pwbuf, passwd, pwbuflen-1);
+	pwbuf[pwbuflen-1] = '\0';
+
+	passwd[0] = '\0';
+	snprintf(buf, sizeof(buf), "%s/vncpasswd", uuid);
+	if (xs_write(xsh, XBT_NULL, buf, passwd, len) == 0) {
+		fprintf(stderr, "xs_write() vncpasswd failed\n");
+		rc = -1;
+	}
+
+	free(passwd);
+	free(uuid);
+	free(path);
+
+	return rc;
+}
+
 static void vnc_update(struct xenfb *xenfb, int x, int y, int w, int h)
 {
 	rfbScreenInfoPtr server = xenfb->user_data;
@@ -275,6 +318,10 @@ int main(int argc, char **argv)
 	char portstr[10];
 	char *endp;
 	int r;
+	struct xs_handle *xsh;
+	char vncpasswd[1024];
+
+	vncpasswd[0] = '\0';
 
 	while ((opt = getopt_long(argc, argv, "d:p:t:u", options,
 				  NULL)) != -1) {
@@ -355,6 +402,19 @@ int main(int argc, char **argv)
 		}
 	}
 
+	xsh = xs_daemon_open();
+	if (xsh == NULL) {
+	        fprintf(stderr, "cannot open connection to xenstore\n");
+		exit(1);
+	}
+
+
+	if (xenstore_read_vncpasswd(xsh, domid, vncpasswd, sizeof(vncpasswd)) < 0) {
+		fprintf(stderr, "cannot read VNC password from xenstore\n");
+		exit(1);
+	}
+	  
+
 	server = rfbGetScreen(&fake_argc, fake_argv, 
 			      xenfb->width, xenfb->height,
 			      8, 3, xenfb->depth / 8);
@@ -369,6 +429,18 @@ int main(int argc, char **argv)
         if (unused)
 		server->autoPort = true;
 
+	if (vncpasswd[0]) {
+		char **passwds = malloc(sizeof(char**)*2);
+		if (!passwds) {
+			fprintf(stderr, "cannot allocate memory (%s)\n", strerror(errno));
+			exit(1);
+		}
+		passwds[0] = vncpasswd;
+		passwds[1] = NULL;
+
+		server->authPasswdData = passwds;
+		server->passwordCheck = rfbCheckPasswordByList;
+	}
 	server->serverFormat.redShift = 16;
 	server->serverFormat.greenShift = 8;
 	server->serverFormat.blueShift = 0;
@@ -381,7 +453,7 @@ int main(int argc, char **argv)
 
 	rfbRunEventLoop(server, -1, true);
 
-        xenstore_write_vncport(server->port, domid);
+        xenstore_write_vncport(xsh, server->port, domid);
 
 	for (;;) {
 		FD_ZERO(&readfds);

xen-console.patch:
 console.c |   70 ++++++++++++++++++++++++++++++++++++++------------------------
 1 files changed, 44 insertions(+), 26 deletions(-)

--- NEW FILE xen-console.patch ---
# HG changeset patch
# User kfraser at localhost.localdomain
# Date 1164800279 0
# Node ID 8832712b0b3740daf9c2d5993fcc1d640ff1564e
# Parent  15e80a946a6a7b8f865416e0c9c707d3ce413e3d
[LINUX] console: Add option to use /dev/xvc0, major=204, minor=191.

The major/minor has now been allocated to us by lanana.org.

This is based on previous patches from:
 Jeremy Katz <katzj at redhat.com>
 Amos Waterland <apw at us.ibm.com>

Signed-off-by: Keir Fraser <keir at xensource.com>

diff -r 15e80a946a6a -r 8832712b0b37 linux-2.6-xen-sparse/drivers/xen/console/console.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/console.c	Wed Nov 29 11:07:51 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c	Wed Nov 29 11:37:59 2006 +0000
@@ -64,13 +64,20 @@
  *  'xencons=off'  [XC_OFF]:     Console is disabled.
  *  'xencons=tty'  [XC_TTY]:     Console attached to '/dev/tty[0-9]+'.
  *  'xencons=ttyS' [XC_SERIAL]:  Console attached to '/dev/ttyS[0-9]+'.
+ *  'xencons=xvc'  [XC_SERIAL]:  Console attached to '/dev/xvc0'.
  *                 [XC_DEFAULT]: DOM0 -> XC_SERIAL ; all others -> XC_TTY.
  * 
  * NB. In mode XC_TTY, we create dummy consoles for tty2-63. This suppresses
  * warnings from standard distro startup scripts.
  */
-static enum { XC_OFF, XC_DEFAULT, XC_TTY, XC_SERIAL } xc_mode = XC_DEFAULT;
+static enum {
+	XC_OFF, XC_DEFAULT, XC_TTY, XC_SERIAL, XC_XVC
+} xc_mode = XC_DEFAULT;
 static int xc_num = -1;
+
+/* /dev/xvc0 device number allocated by lanana.org. */
+#define XEN_XVC_MAJOR 204
+#define XEN_XVC_MINOR 191
 
 #ifdef CONFIG_MAGIC_SYSRQ
 static unsigned long sysrq_requested;
@@ -82,27 +89,23 @@ static int __init xencons_setup(char *st
 	char *q;
 	int n;
 
-	if (!strncmp(str, "ttyS", 4))
+	if (!strncmp(str, "ttyS", 4)) {
 		xc_mode = XC_SERIAL;
-	else if (!strncmp(str, "tty", 3))
+		str += 4;
+	} else if (!strncmp(str, "tty", 3)) {
 		xc_mode = XC_TTY;
-	else if (!strncmp(str, "off", 3))
+		str += 3;
+	} else if (!strncmp(str, "xvc", 3)) {
+		xc_mode = XC_XVC;
+		str += 3;
+	} else if (!strncmp(str, "off", 3)) {
 		xc_mode = XC_OFF;
-
-	switch (xc_mode) {
-	case XC_SERIAL:
-		n = simple_strtol(str+4, &q, 10);
-		if (q > (str + 4))
-			xc_num = n;
-		break;
-	case XC_TTY:
-		n = simple_strtol(str+3, &q, 10);
-		if (q > (str + 3))
-			xc_num = n;
-		break;
-	default:
-		break;
-	}
+		str += 3;
+	}
+
+	n = simple_strtol(str, &q, 10);
+	if (q != str)
+		xc_num = n;
 
 	return 1;
 }
@@ -201,6 +204,12 @@ static int __init xen_console_init(void)
 	}
 
 	switch (xc_mode) {
+	case XC_XVC:
+		strcpy(kcons_info.name, "xvc");
+		if (xc_num == -1)
+			xc_num = 0;
+		break;
+
 	case XC_SERIAL:
 		strcpy(kcons_info.name, "ttyS");
 		if (xc_num == -1)
@@ -305,7 +314,7 @@ void dom0_init_screen_info(const struct 
 /******************** User-space console driver (/dev/console) ************/
 
 #define DRV(_d)         (_d)
-#define DUMMY_TTY(_tty) ((xc_mode != XC_SERIAL) &&		\
+#define DUMMY_TTY(_tty) ((xc_mode == XC_TTY) &&		\
 			 ((_tty)->index != (xc_num - 1)))
 
 static struct termios *xencons_termios[MAX_NR_CONSOLES];
@@ -628,8 +637,8 @@ static int __init xencons_init(void)
 			return rc;
 	}
 
-	xencons_driver = alloc_tty_driver((xc_mode == XC_SERIAL) ?
-					  1 : MAX_NR_CONSOLES);
+	xencons_driver = alloc_tty_driver((xc_mode == XC_TTY) ?
+					  MAX_NR_CONSOLES : 1);
 	if (xencons_driver == NULL)
 		return -ENOMEM;
 
@@ -644,14 +653,23 @@ static int __init xencons_init(void)
 	DRV(xencons_driver)->termios         = xencons_termios;
 	DRV(xencons_driver)->termios_locked  = xencons_termios_locked;
 
-	if (xc_mode == XC_SERIAL) {
+	switch (xc_mode) {
+	case XC_XVC:
+		DRV(xencons_driver)->name        = "xvc";
+		DRV(xencons_driver)->major       = XEN_XVC_MAJOR;
+		DRV(xencons_driver)->minor_start = XEN_XVC_MINOR;
+		DRV(xencons_driver)->name_base   = xc_num;
+		break;
+	case XC_SERIAL:
 		DRV(xencons_driver)->name        = "ttyS";
 		DRV(xencons_driver)->minor_start = 64 + xc_num;
-		DRV(xencons_driver)->name_base   = 0 + xc_num;
-	} else {
+		DRV(xencons_driver)->name_base   = xc_num;
+		break;
+	default:
 		DRV(xencons_driver)->name        = "tty";
 		DRV(xencons_driver)->minor_start = 1;
 		DRV(xencons_driver)->name_base   = 1;
+		break;
 	}
 
 	tty_set_operations(xencons_driver, &xencons_ops);
# HG changeset patch
# User kfraser at localhost.localdomain
# Date 1164801889 0
# Node ID f32abd365ae006e4dfda7ec206a9955b3cd57da2
# Parent  4876e7ebca6eff15ea297d762400dd17d5d693b1
[LINUX] console: Fix comment.
Signed-off-by: Keir Fraser <keir at xensource.com>

diff -r 4876e7ebca6e -r f32abd365ae0 linux-2.6-xen-sparse/drivers/xen/console/console.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/console.c	Wed Nov 29 11:40:10 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c	Wed Nov 29 12:04:49 2006 +0000
@@ -64,7 +64,7 @@
  *  'xencons=off'  [XC_OFF]:     Console is disabled.
  *  'xencons=tty'  [XC_TTY]:     Console attached to '/dev/tty[0-9]+'.
  *  'xencons=ttyS' [XC_SERIAL]:  Console attached to '/dev/ttyS[0-9]+'.
- *  'xencons=xvc'  [XC_SERIAL]:  Console attached to '/dev/xvc0'.
+ *  'xencons=xvc'  [XC_XVC]:     Console attached to '/dev/xvc0'.
  *                 [XC_DEFAULT]: DOM0 -> XC_SERIAL ; all others -> XC_TTY.
  * 
  * NB. In mode XC_TTY, we create dummy consoles for tty2-63. This suppresses

xen-pvfb-compat.patch:
 b/tools/xenfb/oldxenfb.c              |  611 ++++++++++++++++++++++++++++++++++
 b/tools/xenfb/oldxenfb.h              |  108 ++++++
 b/tools/xenfb/oldxenkbd.h             |   92 +++++
 tools/python/xen/xend/server/vfbif.py |    3 
 tools/python/xen/xm/create.py         |   18 +
 tools/xenfb/Makefile                  |   15 
 tools/xenfb/sdlfb.c                   |   11 
 tools/xenfb/vncfb.c                   |   11 
 tools/xenfb/xenfb.c                   |   57 +++
 tools/xenfb/xenfb.h                   |    2 
 10 files changed, 925 insertions(+), 3 deletions(-)

--- NEW FILE xen-pvfb-compat.patch ---
diff -r a2618d3912e7 tools/python/xen/xend/server/vfbif.py
--- a/tools/python/xen/xend/server/vfbif.py	Mon Dec 04 19:13:55 2006 +0000
+++ b/tools/python/xen/xend/server/vfbif.py	Tue Dec 05 10:29:17 2006 +0100
@@ -37,5 +37,8 @@ class VfbifController(DevController):
     def createDevice(self, config):
         DevController.createDevice(self, config)
+        # old frontend compatibility
+        self.vm.writeDom("console/use_graphics", "1")
+        # /old
         std_args = [ "--domid", "%d" % self.vm.getDomid(),
                      "--title", self.vm.getName() ]
         t = config.get("type", None)
diff -r 7df4d8cfba3b tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py	Tue Dec 05 12:42:29 2006 +0000
+++ b/tools/python/xen/xm/create.py	Thu Dec 07 15:50:07 2006 +0100
@@ -577,6 +577,24 @@ def configure_usb(config_devs, vals):
         config_devs.append(['device', config_usb])
 
 def configure_vfbs(config_devs, vals):
+    # old config compatibility
+    if vals.vfb == [] and (vals.sdl or vals.vnc) and vals.builder != 'hvm':
+        if vals.vnc:
+            cfg = 'type=vnc'
+            if vals.vncdisplay:
+                cfg += ',vncdisplay=%s' % vals.vncdisplay
+            if vals.vncunused:
+                cfg += ',vncunused=%s' % vals.vncunused
+            if vals.vnclisten:
+                cfg += ',vnclisten=%s' % vals.vnclisten
+        else:
+            cfg = 'type=sdl'
+        if vals.xauthority:
+            cfg += ',xauthority=%s' % vals.xauthority
+        if vals.display:
+            cfg += ',display=%s' % vals.display
+        vals.vfb = [ cfg, ]
+    # /old
     for f in vals.vfb:
         d = comma_sep_kv_to_dict(f)
         config = ['vfb']
diff -r a2618d3912e7 tools/xenfb/Makefile
--- a/tools/xenfb/Makefile	Mon Dec 04 19:13:55 2006 +0000
+++ b/tools/xenfb/Makefile	Tue Dec 05 10:26:52 2006 +0100
@@ -13,12 +17,14 @@ all: build
 
 .PHONY: build
 build: mk-symlinks
-	$(MAKE) vncfb sdlfb
+	$(MAKE) vncfb sdlfb vncfbo sdlfbo
 
 install: all
 	$(INSTALL_DIR) -p $(DESTDIR)/usr/$(LIBDIR)/xen/bin
 	$(INSTALL_PROG) vncfb $(DESTDIR)/usr/$(LIBDIR)/xen/bin/xen-vncfb
 	$(INSTALL_PROG) sdlfb $(DESTDIR)/usr/$(LIBDIR)/xen/bin/xen-sdlfb
+	$(INSTALL_PROG) vncfbo $(DESTDIR)/usr/$(LIBDIR)/xen/bin/xen-vncfbo
+	$(INSTALL_PROG) sdlfbo $(DESTDIR)/usr/$(LIBDIR)/xen/bin/xen-sdlfbo
 
 sdlfb: sdlfb.o xenfb.o
 
@@ -33,3 +39,14 @@ vncfb: LDLIBS += $(shell libvncserver-co
 vncfb: LDLIBS += $(shell libvncserver-config --libs) -lxenctrl -lxenstore
 
 sdlfb.o xenfb.o vncfb.o: xenfb.h
+
+sdlfbo vncfbo:
+	$(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) $(LDLIBS)
+
+sdlfbo: sdlfb.o oldxenfb.o
+sdlfbo: LDLIBS += $(shell sdl-config --libs) -lxenctrl -lxenstore
+
+vncfbo: vncfb.o oldxenfb.o
+vncfbo: LDLIBS += $(shell libvncserver-config --libs) -lxenctrl -lxenstore
+
+oldxenfb.o: xenfb.h oldxenfb.h oldxenkbd.h
diff -r a2618d3912e7 tools/xenfb/sdlfb.c
--- a/tools/xenfb/sdlfb.c	Tue Dec 05 12:42:29 2006 +0000
+++ b/tools/xenfb/sdlfb.c	Thu Dec 07 19:45:51 2006 +0100
@@ -212,6 +212,7 @@ int main(int argc, char **argv)
 	struct xenfb *xenfb;
 	int domid = -1;
         char * title = NULL;
+	int ret;
 	fd_set readfds;
 	int nfds;
 	struct SDLFBData data;
@@ -256,11 +257,19 @@ int main(int argc, char **argv)
 		exit(1);
         }
 
-	if (xenfb_attach_dom(xenfb, domid) < 0) {
+	ret = xenfb_attach_dom(xenfb, domid);
+	if (ret < 0) {
 		fprintf(stderr, "Could not connect to domain (%s)\n",
 			strerror(errno));
 		exit(1);
         }
+	if (ret > 0) {
+		if (xenfb_switch_to_old_protocol(argv) < 0) {
+			fprintf(stderr, "Could not switch to old protocol (%s)\n",
+				strerror(errno));
+			exit(1);
+		}
+	}
 
 	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
 		fprintf(stderr, "Could not initialize SDL\n");
diff -r a2618d3912e7 tools/xenfb/vncfb.c
--- a/tools/xenfb/vncfb.c	Mon Dec 04 19:13:55 2006 +0000
+++ b/tools/xenfb/vncfb.c	Tue Dec 05 10:26:52 2006 +0100
@@ -269,6 +269,7 @@ int main(int argc, char **argv)
 	bool unused = false;
 	int opt;
 	struct xenfb *xenfb;
+	int ret;
 	fd_set readfds;
 	int nfds;
 	char portstr[10];
@@ -340,10 +341,18 @@ int main(int argc, char **argv)
 		exit(1);
 	}
 
-	if (xenfb_attach_dom(xenfb, domid) < 0) {
+	ret = xenfb_attach_dom(xenfb, domid);
+	if (ret < 0) {
 		fprintf(stderr, "Could not connect to domain (%s)\n",
 			strerror(errno));
 		exit(1);
+	}
+	if (ret > 0) {
+		if (xenfb_switch_to_old_protocol(argv) < 0) {
+			fprintf(stderr, "Could not switch to old protocol (%s)\n",
+				strerror(errno));
+			exit(1);
+		}
 	}
 
 	server = rfbGetScreen(&fake_argc, fake_argv, 
diff -r a2618d3912e7 tools/xenfb/xenfb.c
--- a/tools/xenfb/xenfb.c	Mon Dec 04 19:13:55 2006 +0000
+++ b/tools/xenfb/xenfb.c	Tue Dec 05 10:26:52 2006 +0100
@@ -290,6 +301,60 @@ static int xenfb_hotplug(struct xenfb_de
 	return 0;
 }
 
+static int xenfb_using_old_protocol(struct xenfb_private *xenfb)
+{
+	struct xs_handle *xsh = xenfb->xsh;
+	char buf[64];
+	char *p, *v, **vec;
+	enum xenbus_state state;
+	unsigned dummy;
+	int ret;
+
+	p = xenfb_path_in_dom(xsh, buf, sizeof(buf),
+			      xenfb->fb.otherend_id, "vfb/page-ref");
+	if (!xs_watch(xsh, p, ""))
+		return -1;
+
+	for (;;) {
+		state = xenfb_read_state(xsh, xenfb->fb.otherend);
+		if (state > XenbusStateInitialising) {
+			ret = 0; /* frontend talks xenbus protocol */
+			break;
+		}
+
+		v = xs_read(xsh, XBT_NULL, p, NULL);
+		free(v);
+		if (v) {
+			ret = 1; /* frontend talks old protocol */
+			break;
+		}
+
+		vec = xs_read_watch(xsh, &dummy);
+		if (!vec) {
+			ret = -1;
+			break;
+		}
+		free(vec);
+	}
+
+	xs_unwatch(xsh, p, "");
+	return ret;
+}
+
+int xenfb_switch_to_old_protocol(char **argv)
+{
+	size_t len = strlen(argv[0]);
+	char *prog;
+
+	prog = malloc(len + 2);
+	if (!prog)
+		return -1;
+	strcpy(prog, argv[0]);
+	strcpy(prog + len, "o");
+	argv[0] = prog;
+	return execv(prog, argv);
+}
+
 static int xenfb_wait_for_frontend_initialised(struct xenfb_device *dev)
 {
 	switch (xenfb_wait_for_state(dev->xenfb->xsh, dev->otherend,
@@ -473,6 +534,9 @@ int xenfb_attach_dom(struct xenfb *xenfb
 		goto error;
 	if (!xs_watch(xsh, xenfb->kbd.otherend, ""))
 		goto error;
+
+	if (xenfb_using_old_protocol(xenfb))
+		return 1;
 
 	if (xenfb_wait_for_frontend_initialised(&xenfb->fb) < 0)
 		goto error;
diff -r a2618d3912e7 tools/xenfb/xenfb.h
--- a/tools/xenfb/xenfb.h	Mon Dec 04 19:13:55 2006 +0000
+++ b/tools/xenfb/xenfb.h	Tue Dec 05 10:26:52 2006 +0100
@@ -32,4 +32,6 @@ int xenfb_send_motion(struct xenfb *xenf
 int xenfb_send_motion(struct xenfb *xenfb, int rel_x, int rel_y);
 int xenfb_send_position(struct xenfb *xenfb, int abs_x, int abs_y);
 
+int xenfb_switch_to_old_protocol(char **);
+
 #endif
diff -r 3f0ca90351e2 tools/xenfb/oldxenfb.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/xenfb/oldxenfb.c	Fri Dec 08 16:31:34 2006 +0100
@@ -0,0 +1,611 @@
+#include <stdarg.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <xenctrl.h>
+#include <xen/io/xenbus.h>
+#include "oldxenfb.h"
+#include "oldxenkbd.h"
+#include <sys/select.h>
+#include <stdbool.h>
+#include <xen/linux/evtchn.h>
+#include <xen/event_channel.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <xs.h>
+
+#include "xenfb.h"
+
+// FIXME defend against malicious frontend?
+
+struct xenfb_device {
+	const char *devicetype;
+	char nodename[64];	/* backend xenstore dir */
+	char otherend[64];	/* frontend xenstore dir */
+	int otherend_id;	/* frontend domid */
+	enum xenbus_state state; /* backend state */
+	void *page;		/* shared page */
+	evtchn_port_t port;
+	struct xenfb_private *xenfb;
+};
+
+struct xenfb_private {
+	struct xenfb pub;
+	int evt_xch;		/* event channel driver handle */
+	int xc;			/* hypervisor interface handle */
+	struct xs_handle *xsh;	/* xs daemon handle */
+	struct xenfb_device fb, kbd;
+	size_t fb_len;		/* size of framebuffer */
+};
+
+static void xenfb_detach_dom(struct xenfb_private *);
+static int xenfb_fb_event(struct xenfb_private *, union xenfb_in_event *);
+
+static char *xenfb_path_in_dom(struct xs_handle *xsh,
+			       char *buf, size_t size,
+			       unsigned domid, const char *fmt, ...)
+{
+	va_list ap;
+	char *domp = xs_get_domain_path(xsh, domid);
+	int n;
+
+        if (domp == NULL)
+		return NULL;
+
+	n = snprintf(buf, size, "%s/", domp);
+	free(domp);
+	if (n >= size)
+		return NULL;
+
+	va_start(ap, fmt);
+	n += vsnprintf(buf + n, size - n, fmt, ap);
+	va_end(ap);
+	if (n >= size)
+		return NULL;
+
+	return buf;
+}
+
+static int xenfb_xs_scanf1(struct xs_handle *xsh,
+			   const char *dir, const char *node,
+			   const char *fmt, void *dest)
+{
+	char buf[1024];
+	char *p;
+	int ret;
+
+	if (snprintf(buf, sizeof(buf), "%s/%s", dir, node) >= sizeof(buf)) {
+		errno = ENOENT;
+		return -1;
+        }
+	p = xs_read(xsh, XBT_NULL, buf, NULL);
+	if (!p) {
+		errno = ENOENT;
+		return -1;
+        }
+	ret = sscanf(p, fmt, dest);
+	free(p);
+	if (ret != 1) {
+		errno = EDOM;
+		return -1;
+        }
+	return ret;
+}
+
+static int xenfb_xs_printf(struct xs_handle *xsh,
+			   const char *dir, const char *node, char *fmt, ...)
+{
+	va_list ap;
+	char key[1024];
+	char val[1024];
+	int n;
+
+	if (snprintf(key, sizeof(key), "%s/%s", dir, node) >= sizeof(key)) {
+		errno = ENOENT;
+		return -1;
+        }
+
+	va_start(ap, fmt);
+	n = vsnprintf(val, sizeof(val), fmt, ap);
+	va_end(ap);
+	if (n >= sizeof(val)) {
+		errno = ENOSPC; /* close enough */
+		return -1;
+	}
+
+	if (!xs_write(xsh, XBT_NULL, key, val, n))
+		return -1;
+	return 0;
+}
+
+static void xenfb_device_init(struct xenfb_device *dev,
+			      const char *type,
+			      struct xenfb_private *xenfb)
+{
+	dev->devicetype = type;
+	dev->otherend_id = -1;
+	dev->port = -1;
+	dev->xenfb = xenfb;
+}
+
+int xenfb_device_set_domain(struct xenfb_device *dev, int domid)
+{
+	struct xenfb_private *xenfb = dev->xenfb;
+
+	dev->otherend_id = domid;
+
+	if (!xenfb_path_in_dom(xenfb->xsh,
+			       dev->otherend, sizeof(dev->otherend),
+			       domid, "device/%s/0", dev->devicetype)) {
+		errno = ENOENT;
+		return -1;
+	}
+	if (!xenfb_path_in_dom(xenfb->xsh,
+			       dev->nodename, sizeof(dev->nodename),
+			       0, "backend/%s/%d/0", dev->devicetype, domid)) {
+		errno = ENOENT;
+		return -1;
+	}
+
+	return 0;
+}
+
+struct xenfb *xenfb_new(void)
+{
+	struct xenfb_private *xenfb = malloc(sizeof(*xenfb));
+	int serrno;
+
+	if (xenfb == NULL)
+		return NULL;
+
+	memset(xenfb, 0, sizeof(*xenfb));
+	xenfb->evt_xch = xenfb->xc = -1;
+	xenfb_device_init(&xenfb->fb, "vfb", xenfb);
+	xenfb_device_init(&xenfb->kbd, "vkbd", xenfb);
+
+	xenfb->evt_xch = xc_evtchn_open();
+	if (xenfb->evt_xch == -1)
+		goto fail;
+
+	xenfb->xc = xc_interface_open();
+	if (xenfb->xc == -1)
+		goto fail;
+
+	xenfb->xsh = xs_daemon_open();
+	if (!xenfb->xsh)
+		goto fail;
+
+	return &xenfb->pub;
+
+ fail:
+	serrno = errno;
+	xenfb_delete(&xenfb->pub);
+	errno = serrno;
+	return NULL;
+}
+
+/* Remove the backend area in xenbus since the framebuffer really is
+   going away. */
+void xenfb_teardown(struct xenfb *xenfb_pub)
+{
+       struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
+
+       xs_rm(xenfb->xsh, XBT_NULL, xenfb->fb.nodename);
+       xs_rm(xenfb->xsh, XBT_NULL, xenfb->kbd.nodename);
+}
+
+
+void xenfb_delete(struct xenfb *xenfb_pub)
+{
+	struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
+
+	xenfb_detach_dom(xenfb);
+	if (xenfb->xc >= 0)
+		xc_interface_close(xenfb->xc);
+	if (xenfb->evt_xch >= 0)
+		xc_evtchn_close(xenfb->evt_xch);
+	if (xenfb->xsh)
+		xs_daemon_close(xenfb->xsh);
+	free(xenfb);
+}
+
+static enum xenbus_state xenfb_read_state(struct xs_handle *xsh,
+					  const char *dir)
+{
+	int ret, state;
+
+	ret = xenfb_xs_scanf1(xsh, dir, "state", "%d", &state);
+	if (ret < 0)
+		return XenbusStateUnknown;
+
+	if ((unsigned)state > XenbusStateClosed)
+		state = XenbusStateUnknown;
+	return state;
+}
+
+static int xenfb_switch_state(struct xenfb_device *dev,
+			      enum xenbus_state state)
+{
+	struct xs_handle *xsh = dev->xenfb->xsh;
+
+	if (xenfb_xs_printf(xsh, dev->nodename, "state", "%d", state) < 0)
+		return -1;
+	dev->state = state;
+	return 0;
+}
+
+int xenfb_switch_to_old_protocol(char **argv)
+{
+	abort();
+}
+
+static int xenfb_map_fb(struct xenfb_private *xenfb, int domid)
+{
+	struct xenfb_page *page = xenfb->fb.page;
+	int n_fbmfns;
+	int n_fbdirs;
+	unsigned long *fbmfns;
+
+	n_fbmfns = (xenfb->fb_len + (XC_PAGE_SIZE - 1)) / XC_PAGE_SIZE;
+	n_fbdirs = n_fbmfns * sizeof(unsigned long);
+	n_fbdirs = (n_fbdirs + (XC_PAGE_SIZE - 1)) / XC_PAGE_SIZE;
+
+	/*
+	 * Bug alert: xc_map_foreign_batch() can fail partly and
+	 * return a non-null value.  This is a design flaw.  When it
+	 * happens, we happily continue here, and later crash on
+	 * access.
+	 */
+	fbmfns = xc_map_foreign_batch(xenfb->xc, domid,
+			PROT_READ, page->pd, n_fbdirs);
+	if (fbmfns == NULL)
+		return -1;
+
+	xenfb->pub.pixels = xc_map_foreign_batch(xenfb->xc, domid,
+				PROT_READ | PROT_WRITE, fbmfns, n_fbmfns);
+	if (xenfb->pub.pixels == NULL) {
+		munmap(fbmfns, n_fbdirs * XC_PAGE_SIZE);
+		return -1;
+	}
+
+	return munmap(fbmfns, n_fbdirs * XC_PAGE_SIZE);
+}
+
+static int xenfb_bind(struct xenfb_device *dev)
+{
+	struct xenfb_private *xenfb = dev->xenfb;
+	unsigned long mfn;
+	evtchn_port_t evtchn;
+	char buf[64];
+	char *p, **vec;
+	unsigned dummy;
+
+	p = xenfb_path_in_dom(xenfb->xsh, buf, sizeof(buf),
+			      dev->otherend_id, dev->devicetype);
+	if (!xs_watch(xenfb->xsh, p, ""))
+		return -1;
+	for (;;) {
+		if (xenfb_xs_scanf1(xenfb->xsh, p, "page-ref", "%lu",
+				    &mfn) < 0) {
+			if (errno == ENOENT || errno == EAGAIN)
+				goto wait;
+			return -1;
+		}
+		if (xenfb_xs_scanf1(xenfb->xsh, p, "event-channel", "%u",
+				    &evtchn) < 0) {
+			if (errno == ENOENT || errno == EAGAIN)
+				goto wait;
+			return -1;
+		}
+		break;
+
+	wait:
+		printf("Waiting...\n");
+		vec = xs_read_watch(xenfb->xsh, &dummy);
+		if (!vec)
+			return -1;
+		free(vec);
+	}
+
+	dev->port = xc_evtchn_bind_interdomain(xenfb->evt_xch,
+					       dev->otherend_id, evtchn);
+	if (dev->port == -1)
+		return -1;
+
+	dev->page = xc_map_foreign_range(xenfb->xc, dev->otherend_id,
+			XC_PAGE_SIZE, PROT_READ | PROT_WRITE, mfn);
+	if (dev->page == NULL)
+		return -1;
+
+	return 0;
+}
+
+static void xenfb_unbind(struct xenfb_device *dev)
+{
+	if (dev->page) {
+		munmap(dev->page, XC_PAGE_SIZE);
+		dev->page = NULL;
+	}
+        if (dev->port >= 0) {
+		xc_evtchn_unbind(dev->xenfb->evt_xch, dev->port);
+		dev->port = -1;
+	}
+}
+
+static void xenfb_dev_fatal(struct xenfb_device *dev, int err,
+			    const char *fmt, ...)
+{
+	struct xs_handle *xsh = dev->xenfb->xsh;
+	va_list ap;
+	char errdir[80];
+	char buf[1024];
+	int n;
+
+	fprintf(stderr, "%s ", dev->nodename); /* somewhat crude */
+	va_start(ap, fmt);
+	vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (err)
+		fprintf(stderr, " (%s)", strerror(err));
+	putc('\n', stderr);
+
+	if (!xenfb_path_in_dom(xsh, errdir, sizeof(errdir), 0,
+			       "error/%s", dev->nodename))
+		goto out;	/* FIXME complain */
+
+	va_start(ap, fmt);
+	n = snprintf(buf, sizeof(buf), "%d ", err);
+	snprintf(buf + n, sizeof(buf) - n, fmt, ap);
+	va_end(ap);
+
+	if (xenfb_xs_printf(xsh, buf, "error", "%s", buf) < 0)
+		goto out;	/* FIXME complain */
+
+ out:
+	xenfb_switch_state(dev, XenbusStateClosing);
+}
+
+int xenfb_attach_dom(struct xenfb *xenfb_pub, int domid)
+{
+	struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
+	struct xs_handle *xsh = xenfb->xsh;
+	int val, serrno;
+	struct xenfb_page *fb_page;
+	union xenfb_in_event event;
+
+	xenfb_detach_dom(xenfb);
+
+	xenfb_device_set_domain(&xenfb->fb, domid);
+	xenfb_device_set_domain(&xenfb->kbd, domid);
+
+	if (!xs_watch(xsh, xenfb->fb.otherend, ""))
+		goto error;
+	if (!xs_watch(xsh, xenfb->kbd.otherend, ""))
+		goto error;
+
+	if (xenfb_bind(&xenfb->fb) < 0)
+		goto error;
+	if (xenfb_bind(&xenfb->kbd) < 0)
+		goto error;
+
+	/* TODO check for permitted ranges */
+	fb_page = xenfb->fb.page;
+	xenfb->pub.depth = fb_page->depth;
+	xenfb->pub.width = fb_page->width;
+	xenfb->pub.height = fb_page->height;
+	/* TODO check for consistency with the above */
+	xenfb->fb_len = fb_page->mem_length;
+	xenfb->pub.row_stride = fb_page->line_length;
+
+	if (xenfb_map_fb(xenfb, domid) < 0)
+		goto error;
+
+	event.type = XENFB_TYPE_SET_EVENTS;
+	event.set_events.flags = XENFB_FLAG_UPDATE;
+	if (xenfb_fb_event(xenfb, &event))
+		goto error;
+
+	return 0;
+
+ error:
+	serrno = errno;
+	xenfb_detach_dom(xenfb);
+	xenfb_dev_fatal(&xenfb->fb, serrno, "on fire");
+	xenfb_dev_fatal(&xenfb->kbd, serrno, "on fire");
+        errno = serrno;
+        return -1;
+}
+
+static void xenfb_detach_dom(struct xenfb_private *xenfb)
+{
+	xenfb_unbind(&xenfb->fb);
+	xenfb_unbind(&xenfb->kbd);
+	if (xenfb->pub.pixels) {
+		munmap(xenfb->pub.pixels, xenfb->fb_len);
+		xenfb->pub.pixels = NULL;
+	}
+}
+
+static void xenfb_on_fb_event(struct xenfb_private *xenfb)
+{
+	uint32_t prod, cons;
+	struct xenfb_page *page = xenfb->fb.page;
+
+	prod = page->out_prod;
+	if (prod == page->out_cons)
+		return;
+	rmb();			/* ensure we see ring contents up to prod */
+	for (cons = page->out_cons; cons != prod; cons++) {
+		union xenfb_out_event *event = &XENFB_OUT_RING_REF(page, cons);
+
+		switch (event->type) {
+		case XENFB_TYPE_UPDATE:
+                    if (xenfb->pub.update)
+			xenfb->pub.update(&xenfb->pub,
+					  event->update.x, event->update.y,
+					  event->update.width, event->update.height);
+                    break;
+		}
+	}
+	mb();			/* ensure we're done with ring contents */
+	page->out_cons = cons;
+	xc_evtchn_notify(xenfb->evt_xch, xenfb->fb.port);
+}
+
+static void xenfb_on_kbd_event(struct xenfb_private *xenfb)
+{
+	struct xenkbd_info *page = xenfb->kbd.page;
+
+	/* We don't understand any keyboard events, so just ignore them. */
+	if (page->out_prod == page->out_cons)
+		return;
+	page->out_cons = page->out_prod;
+	xc_evtchn_notify(xenfb->evt_xch, xenfb->kbd.port);
+}
+
+static int xenfb_on_state_change(struct xenfb_device *dev)
+{
+	enum xenbus_state state;
+
+	state = xenfb_read_state(dev->xenfb->xsh, dev->otherend);
+
+	switch (state) {
+	case XenbusStateUnknown:
+		/* There was an error reading the frontend state.  The
+		   domain has probably gone away; in any case, there's
+		   not much point in us continuing. */
+		return -1;
+	case XenbusStateInitialising:
+	case XenbusStateInitWait:
+	case XenbusStateInitialised:
+	case XenbusStateConnected:
+		break;
+	case XenbusStateClosing:
+		xenfb_unbind(dev);
+		xenfb_switch_state(dev, state);
+		break;
+	case XenbusStateClosed:
+		xenfb_switch_state(dev, state);
+	}
+	return 0;
+}
+
+/* Returns 0 normally, -1 on error, or -2 if the domain went away. */
+int xenfb_poll(struct xenfb *xenfb_pub, fd_set *readfds)
+{
+	struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
+	evtchn_port_t port;
+	unsigned dummy;
+	char **vec;
+	int r;
+
+	if (FD_ISSET(xc_evtchn_fd(xenfb->evt_xch), readfds)) {
+		port = xc_evtchn_pending(xenfb->evt_xch);
+		if (port == -1)
+			return -1;
+
+		if (port == xenfb->fb.port)
+			xenfb_on_fb_event(xenfb);
+		else if (port == xenfb->kbd.port)
+			xenfb_on_kbd_event(xenfb);
+
+		if (xc_evtchn_unmask(xenfb->evt_xch, port) == -1)
+			return -1;
+	}
+
+	if (FD_ISSET(xs_fileno(xenfb->xsh), readfds)) {
+		vec = xs_read_watch(xenfb->xsh, &dummy);
+		free(vec);
+		r = xenfb_on_state_change(&xenfb->fb);
+		if (r == 0)
+			r = xenfb_on_state_change(&xenfb->kbd);
+		if (r == -1)
+			return -2;
+	}
+
+	return 0;
+}
+
+int xenfb_select_fds(struct xenfb *xenfb_pub, fd_set *readfds)
+{
+	struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
+	int fd1 = xc_evtchn_fd(xenfb->evt_xch);
+	int fd2 = xs_fileno(xenfb->xsh);
+
+	FD_SET(fd1, readfds);
+	FD_SET(fd2, readfds);
+	return fd1 > fd2 ? fd1 + 1 : fd2 + 1;
+}
+
+static int xenfb_fb_event(struct xenfb_private *xenfb,
+			  union xenfb_in_event *event)
+{
+	uint32_t prod;
+	struct xenfb_page *page = xenfb->fb.page;
+
+	prod = page->in_prod;
+	if (prod - page->in_cons == XENFB_IN_RING_LEN) {
+		errno = EAGAIN;
+		return -1;
+	}
+
+	mb();			/* ensure ring space available */
+	XENFB_IN_RING_REF(page, prod) = *event;
+	wmb();			/* ensure ring contents visible */
+	page->in_prod = prod + 1;
+	return xc_evtchn_notify(xenfb->evt_xch, xenfb->fb.port);
+}
+
+static int xenfb_kbd_event(struct xenfb_private *xenfb,
+			   union xenkbd_in_event *event)
+{
+	uint32_t prod;
+	struct xenkbd_info *page = xenfb->kbd.page;
+
+	prod = page->in_prod;
+	if (prod - page->in_cons == XENKBD_IN_RING_LEN) {
+		errno = EAGAIN;
+		return -1;
+	}
+
+	mb();			/* ensure ring space available */
+	XENKBD_IN_RING_REF(page, prod) = *event;
+	wmb();			/* ensure ring contents visible */
+	page->in_prod = prod + 1;
+	return xc_evtchn_notify(xenfb->evt_xch, xenfb->kbd.port);
+}
+
+int xenfb_send_key(struct xenfb *xenfb_pub, bool down, int keycode)
+{
+	struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
+	union xenkbd_in_event event;
+
+	memset(&event, 0, XENKBD_IN_EVENT_SIZE);
+	event.type = XENKBD_TYPE_KEY;
+	event.key.pressed = down ? 1 : 0;
+	event.key.keycode = keycode;
+
+	return xenfb_kbd_event(xenfb, &event);
+}
+
+int xenfb_send_motion(struct xenfb *xenfb_pub, int rel_x, int rel_y)
+{
+	struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
+	union xenkbd_in_event event;
+
+	memset(&event, 0, XENKBD_IN_EVENT_SIZE);
+	event.type = XENKBD_TYPE_MOTION;
+	event.motion.rel_x = rel_x;
+	event.motion.rel_y = rel_y;
+
+	return xenfb_kbd_event(xenfb, &event);
+}
+
+int xenfb_send_position(struct xenfb *xenfb_pub, int abs_x, int abs_y)
+{
+	abort();
+}
diff -r 7df4d8cfba3b tools/xenfb/oldxenfb.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/xenfb/oldxenfb.h	Tue Dec 05 10:26:52 2006 +0100
@@ -0,0 +1,108 @@
+/*
+ * linux/include/linux/xenfb.h -- Xen virtual frame buffer device
+ *
+ * Copyright (C) 2005
+ *
+ *      Anthony Liguori <aliguori at us.ibm.com>
+ *
+ *  This file is subject to the terms and conditions of the GNU General Public
+ *  License. See the file COPYING in the main directory of this archive for
+ *  more details.
+ */
+
+#ifndef _LINUX_XENFB_H
+#define _LINUX_XENFB_H
+
+#include <asm/types.h>
+
+/* out events */
+
+#define XENFB_OUT_EVENT_SIZE 40
+
+#define XENFB_TYPE_MOTION 1
+#define XENFB_TYPE_UPDATE 2
+
+struct xenfb_motion	    /* currently unused */
+{
+	__u8 type;          /* XENFB_TYPE_MOTION */
+	__u16 x;            /* The new x coordinate */
+	__u16 y;            /* The new y coordinate */
+};
+
+struct xenfb_update
+{
+	__u8 type;          /* XENFB_TYPE_UPDATE */
+	__u16 x;            /* source x */
+	__u16 y;            /* source y */
+	__u16 width;        /* rect width */
+	__u16 height;       /* rect height */
+};
+
+union xenfb_out_event
+{
+	__u8 type;
+	struct xenfb_motion motion;
+	struct xenfb_update update;
+	char _[XENFB_OUT_EVENT_SIZE];
+};
+
+/* in events */
+
+#define XENFB_IN_EVENT_SIZE 40
+
+#define XENFB_TYPE_SET_EVENTS 1
+
+#define XENFB_FLAG_MOTION 1
+#define XENFB_FLAG_UPDATE 2
+#define XENFB_FLAG_COPY 4
+#define XENFB_FLAG_FILL 8
+
+struct xenfb_set_events
+{
+	__u8 type;          /* XENFB_TYPE_SET_EVENTS */
+	__u32 flags;        /* combination of XENFB_FLAG_* */
+};
+
+union xenfb_in_event
+{
+	__u8 type;
+	struct xenfb_set_events set_events;
+	char _[XENFB_OUT_EVENT_SIZE];
+};
+
+/* shared page */
+
+#define XENFB_IN_RING_SIZE 1024
+#define XENFB_IN_RING_LEN (XENFB_IN_RING_SIZE / XENFB_IN_EVENT_SIZE)
+#define XENFB_IN_RING_OFFS 1024
+#define XENFB_IN_RING(page) \
+    ((union xenfb_in_event *)((char *)(page) + XENFB_IN_RING_OFFS))
+#define XENFB_IN_RING_REF(page, idx) \
+    (XENFB_IN_RING((page))[(idx) % XENFB_IN_RING_LEN])
+
+#define XENFB_OUT_RING_SIZE 2048
+#define XENFB_OUT_RING_LEN (XENFB_OUT_RING_SIZE / XENFB_OUT_EVENT_SIZE)
+#define XENFB_OUT_RING_OFFS (XENFB_IN_RING_OFFS + XENFB_IN_RING_SIZE)
+#define XENFB_OUT_RING(page) \
+    ((union xenfb_out_event *)((char *)(page) + XENFB_OUT_RING_OFFS))
+#define XENFB_OUT_RING_REF(page, idx) \
+    (XENFB_OUT_RING((page))[(idx) % XENFB_OUT_RING_LEN])
+
+struct xenfb_page
+{
+	__u16 width;         /* the width of the framebuffer (in pixels) */
+	__u16 height;        /* the height of the framebuffer (in pixels) */
+	__u32 line_length;   /* the length of a row of pixels (in bytes) */
+	__u32 mem_length;    /* the length of the framebuffer (in bytes) */
+	__u8 depth;          /* the depth of a pixel (in bits) */
+
+	unsigned long pd[2];	/* FIXME rename to pgdir? */
+	/* FIXME pd[1] unused at this time, shrink? */
+
+	__u32 in_cons, in_prod;
+	__u32 out_cons, out_prod;
+};
+
+void xenfb_resume(void);
+
+#endif
diff -r 7df4d8cfba3b tools/xenfb/oldxenkbd.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/xenfb/oldxenkbd.h	Tue Dec 05 10:26:52 2006 +0100
@@ -0,0 +1,92 @@
+/*
+ * linux/include/linux/xenkbd.h -- Xen virtual keyboard/mouse
+ *
+ * Copyright (C) 2005
+ *
+ *      Anthony Liguori <aliguori at us.ibm.com>
+ *
+ *  This file is subject to the terms and conditions of the GNU General Public
+ *  License. See the file COPYING in the main directory of this archive for
+ *  more details.
+ */
+
+#ifndef _LINUX_XENKBD_H
+#define _LINUX_XENKBD_H
+
+#include <asm/types.h>
+
+/* in events */
+
+#define XENKBD_IN_EVENT_SIZE 40
+
+#define XENKBD_TYPE_MOTION  1     /* mouse movement event */
+#define XENKBD_TYPE_BUTTON  2     /* mouse button event */
+#define XENKBD_TYPE_KEY     3     /* keyboard event */
+
+struct xenkbd_motion
+{
+	__u8 type;         /* XENKBD_TYPE_MOTION */
+	__s16 rel_x;       /* relative X motion */
+	__s16 rel_y;       /* relative Y motion */
+};
+
+struct xenkbd_button
+{
+	__u8 type;         /* XENKBD_TYPE_BUTTON */
+	__u8 pressed;      /* 1 if pressed; 0 otherwise */
+	__u8 button;       /* the button (0, 1, 2 is right, middle, left) */
+};
+
+struct xenkbd_key
+{
+	__u8 type;         /* XENKBD_TYPE_KEY */
+	__u8 pressed;      /* 1 if pressed; 0 otherwise */
+	__u16 keycode;     /* KEY_* from linux/input.h */
+};
+
+union xenkbd_in_event
+{
+	__u8 type;
+	struct xenkbd_motion motion;
+	struct xenkbd_button button;
+	struct xenkbd_key key;
+	char _[XENKBD_IN_EVENT_SIZE];
+};
+
+/* out events */
+
+#define XENKBD_OUT_EVENT_SIZE 40
+
+union xenkbd_out_event
+{
+	__u8 type;
+	char _[XENKBD_OUT_EVENT_SIZE];
+};
+
+/* shared page */
+
+#define XENKBD_IN_RING_SIZE 2048
+#define XENKBD_IN_RING_LEN (XENKBD_IN_RING_SIZE / XENKBD_IN_EVENT_SIZE)
+#define XENKBD_IN_RING_OFFS 1024
+#define XENKBD_IN_RING(page) \
+    ((union xenkbd_in_event *)((char *)(page) + XENKBD_IN_RING_OFFS))
+#define XENKBD_IN_RING_REF(page, idx) \
+    (XENKBD_IN_RING((page))[(idx) % XENKBD_IN_RING_LEN])
+
+#define XENKBD_OUT_RING_SIZE 1024
+#define XENKBD_OUT_RING_LEN (XENKBD_OUT_RING_SIZE / XENKBD_OUT_EVENT_SIZE)
+#define XENKBD_OUT_RING_OFFS (XENKBD_IN_RING_OFFS + XENKBD_IN_RING_SIZE)
+#define XENKBD_OUT_RING(page) \
+    ((union xenkbd_out_event *)((char *)(page) + XENKBD_OUT_RING_OFFS))
+#define XENKBD_OUT_RING_REF(page, idx) \
+    (XENKBD_OUT_RING((page))[(idx) % XENKBD_OUT_RING_LEN])
+
+struct xenkbd_info
+{
+	__u32 in_cons, in_prod;
+	__u32 out_cons, out_prod;
+};
+
+void xenkbd_resume(void);
+
+#endif

xen-pvfb-fixes.patch:
 xenfb.c |   54 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 45 insertions(+), 9 deletions(-)

--- NEW FILE xen-pvfb-fixes.patch ---
diff -rup a/tools/xenfb/xenfb.c b/tools/xenfb/xenfb.c
--- a/tools/xenfb/xenfb.c	2006-12-19 19:40:21.000000000 +0100
+++ b/tools/xenfb/xenfb.c	2006-12-19 19:37:53.000000000 +0100
@@ -378,6 +378,48 @@ static int xenfb_wait_for_frontend_initi
 	return 0;
 }
 
+static void *xenfb_map_foreign_range(int xc_handle, uint32_t dom,
+				     int size, int prot,
+				     unsigned long mfn)
+{
+	int rc;
+
+	rc = xc_domain_translate_gpfn_list(xc_handle, dom, 1, &mfn, &mfn);
+	if (rc < 0 && errno != EINVAL)
+		return NULL;
+	return xc_map_foreign_range(xc_handle, dom, size, prot, mfn);
+}
+
+static void *xenfb_map_foreign_batch(int xc_handle, uint32_t dom, int prot,
+				     xen_pfn_t *arr, int num)
+{
+	xen_pfn_t *buf;
+	int rc;
+	void *ret;
+
+	/* make a copy to avoid clobbering arr[] */
+	buf = malloc(num * sizeof(*buf));
+	if (!buf)
+		return NULL;
+	memcpy(buf, arr, num * sizeof(*buf));
+
+	rc = xc_domain_translate_gpfn_list(xc_handle, dom, num, buf, buf);
+	if (rc < 0 && errno != EINVAL) {
+		free(buf);
+		return NULL;
+	}
+
+	/*
+	 * Bug alert: xc_map_foreign_batch() can fail partly and
+	 * return a non-null value.  This is a design flaw.  When it
+	 * happens, we happily continue here, and later crash on
+	 * access.
+	 */
+	ret = xc_map_foreign_batch(xc_handle, dom, prot, buf, num);
+	free(buf);
+	return ret;
+}
+
 static int xenfb_map_fb(struct xenfb_private *xenfb, int domid)
 {
 	struct xenfb_page *page = xenfb->fb.page;
@@ -389,18 +431,12 @@ static int xenfb_map_fb(struct xenfb_pri
 	n_fbdirs = n_fbmfns * sizeof(unsigned long);
 	n_fbdirs = (n_fbdirs + (XC_PAGE_SIZE - 1)) / XC_PAGE_SIZE;
 
-	/*
-	 * Bug alert: xc_map_foreign_batch() can fail partly and
-	 * return a non-null value.  This is a design flaw.  When it
-	 * happens, we happily continue here, and later crash on
-	 * access.
-	 */
-	fbmfns = xc_map_foreign_batch(xenfb->xc, domid,
+	fbmfns = xenfb_map_foreign_batch(xenfb->xc, domid,
 			PROT_READ, page->pd, n_fbdirs);
 	if (fbmfns == NULL)
 		return -1;
 
-	xenfb->pub.pixels = xc_map_foreign_batch(xenfb->xc, domid,
+	xenfb->pub.pixels = xenfb_map_foreign_batch(xenfb->xc, domid,
 				PROT_READ | PROT_WRITE, fbmfns, n_fbmfns);
 	if (xenfb->pub.pixels == NULL) {
 		munmap(fbmfns, n_fbdirs * XC_PAGE_SIZE);
@@ -428,7 +464,7 @@ static int xenfb_bind(struct xenfb_devic
 	if (dev->port == -1)
 		return -1;
 
-	dev->page = xc_map_foreign_range(xenfb->xc, dev->otherend_id,
+	dev->page = xenfb_map_foreign_range(xenfb->xc, dev->otherend_id,
 			XC_PAGE_SIZE, PROT_READ | PROT_WRITE, mfn);
 	if (dev->page == NULL)
 		return -1;

xen-pvfb.patch:
 Config.mk                                           |    2 
 a/linux-2.6-xen-sparse/drivers/char/tty_io.c        | 3264 --------------------
 b/linux-2.6-xen-sparse/drivers/xen/fbfront/Makefile |    2 
 b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c  |  682 ++++
 b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c |  300 +
 b/tools/check/check_libvncserver                    |   21 
 b/tools/check/check_sdl                             |   21 
 b/tools/python/xen/xend/server/vfbif.py             |   29 
 b/tools/xenfb/Makefile                              |   35 
 b/tools/xenfb/sdlfb.c                               |  334 ++
 b/tools/xenfb/vncfb.c                               |  393 ++
 b/tools/xenfb/xenfb.c                               |  691 ++++
 b/tools/xenfb/xenfb.h                               |   34 
 b/xen/include/public/io/fbif.h                      |  116 
 b/xen/include/public/io/kbdif.h                     |  108 
 buildconfigs/linux-defconfig_xen_ia64               |    2 
 buildconfigs/linux-defconfig_xen_x86_32             |    2 
 buildconfigs/linux-defconfig_xen_x86_64             |    2 
 linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c   |    5 
 linux-2.6-xen-sparse/arch/ia64/kernel/setup.c       |    4 
 linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c |    7 
 linux-2.6-xen-sparse/drivers/xen/Kconfig            |   23 
 linux-2.6-xen-sparse/drivers/xen/Makefile           |    2 
 linux-2.6-xen-sparse/drivers/xen/console/console.c  |   10 
 tools/Makefile                                      |    3 
 tools/check/Makefile                                |    6 
 tools/check/check_libvncserver                      |    6 
 tools/check/check_sdl                               |    6 
 tools/python/xen/xend/XendDomainInfo.py             |   42 
 tools/python/xen/xend/image.py                      |  148 
 tools/python/xen/xend/server/vfbif.py               |  130 
 tools/python/xen/xm/create.py                       |   88 
 tools/xenfb/sdlfb.c                                 |   10 
 tools/xenfb/vncfb.c                                 |   21 
 tools/xenfb/xenfb.c                                 |   32 
 tools/xenfb/xenfb.h                                 |    1 
 36 files changed, 3149 insertions(+), 3433 deletions(-)

View full diff with command:
/usr/bin/cvs -f diff  -kk -u -N -r 1.1 -r 1.2 xen-pvfb.patch
Index: xen-pvfb.patch
===================================================================
RCS file: /cvs/dist/rpms/xen/FC-5/xen-pvfb.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- xen-pvfb.patch	30 Oct 2006 23:48:17 -0000	1.1
+++ xen-pvfb.patch	30 Jan 2007 19:13:26 -0000	1.2
@@ -1,22 +1,69 @@
-diff -r ec03b24a2d83 -r 6ca424e1867e linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
---- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c	Tue Aug 15 19:53:55 2006 +0100
-+++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c	Fri Aug 18 16:17:58 2006 -0400
-@@ -1871,8 +1871,12 @@ void __init setup_arch(char **cmdline_p)
+Derived from:
+# HG changeset patch
+# User Steven Smith <ssmith at xensource.com>
+# Date 1164966512 0
+# Node ID 260426e3924f922719b392d1f2a7e9776dc7a15f
+# Parent  697b0203e68fd5b54944ba947c3e3b8d78fae88d
+This is Anthony Liguori's virtual framebuffer forward ported and
+extensively hacked based on feedback from xen-devel.
+
+Its architecture is comparable to the common split device driver
+architecture: xenfb and xenkbd modules serve as frontend in domU, and
+the user space vncfb or sdlfb process serves as backend in dom0.
+
+Signed-off-by: Markus Armbruster <armbru at redhat.com>
+Signed-off-by: Anthony Liguori <aliguori at us.ibm.com>
+
+diff -r 2773c39df9a6 linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
+--- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c	Wed Nov 29 12:16:19 2006 +0000
++++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c	Thu Nov 30 15:13:53 2006 +0100
+@@ -1850,8 +1850,9 @@ void __init setup_arch(char **cmdline_p)
  #endif
  #endif
  	} else {
+-		extern int console_use_vt;
+-		console_use_vt = 0;
 +#if defined(CONFIG_VT) && defined(CONFIG_DUMMY_CONSOLE)
 +		conswitchp = &dummy_con;
-+#else
- 		extern int console_use_vt;
- 		console_use_vt = 0;
 +#endif
  	}
  }
  
-diff -r ec03b24a2d83 -r 6ca424e1867e linux-2.6-xen-sparse/drivers/xen/Kconfig
---- a/linux-2.6-xen-sparse/drivers/xen/Kconfig	Tue Aug 15 19:53:55 2006 +0100
-+++ b/linux-2.6-xen-sparse/drivers/xen/Kconfig	Fri Aug 18 16:17:58 2006 -0400
+diff -r 2773c39df9a6 linux-2.6-xen-sparse/arch/ia64/kernel/setup.c
+--- a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c	Wed Nov 29 12:16:19 2006 +0000
++++ b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c	Thu Nov 30 15:13:53 2006 +0100
+@@ -550,9 +550,9 @@ setup_arch (char **cmdline_p)
+ 		       xen_start_info->nr_pages, xen_start_info->flags);
+ 
+ 		if (!is_initial_xendomain()) {
+-			extern int console_use_vt;
++#if !defined(CONFIG_VT) || !defined(CONFIG_DUMMY_CONSOLE)
+ 			conswitchp = NULL;
+-			console_use_vt = 0;
++#endif
+ 		}
+ 	}
+ #endif
+diff -r 2773c39df9a6 linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c
+--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c	Wed Nov 29 12:16:19 2006 +0000
++++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c	Thu Nov 30 15:13:53 2006 +0100
+@@ -970,9 +970,10 @@ void __init setup_arch(char **cmdline_p)
+ #endif
+ #endif
+ 		} else {
+-			extern int console_use_vt;
+-			console_use_vt = 0;
+-		}
++#if defined(CONFIG_VT) && defined(CONFIG_DUMMY_CONSOLE)
++                    conswitchp = &dummy_con;
++#endif
++                }
+ 	}
+ #else	/* CONFIG_XEN */
+ 
+diff -r 2773c39df9a6 linux-2.6-xen-sparse/drivers/xen/Kconfig
+--- a/linux-2.6-xen-sparse/drivers/xen/Kconfig	Wed Nov 29 12:16:19 2006 +0000
++++ b/linux-2.6-xen-sparse/drivers/xen/Kconfig	Thu Nov 30 15:13:53 2006 +0100
 @@ -172,6 +172,29 @@ config XEN_NETDEV_FRONTEND
  	  dedicated device-driver domain, or your master control domain
  	  (domain 0), then you almost certainly want to say Y here.
@@ -36,7 +83,7 @@
 +
 +config XEN_KEYBOARD
 +	tristate "Keyboard-device frontend driver"
-+	depends on XEN
++	depends on XEN && XEN_FRAMEBUFFER && INPUT
 +	default y
 +	help
 +	  The keyboard-device frontend driver allows the kernel to create a
@@ -47,41 +94,285 @@
  config XEN_SCRUB_PAGES
  	bool "Scrub memory before freeing it to Xen"
  	default y
-diff -r ec03b24a2d83 -r 6ca424e1867e linux-2.6-xen-sparse/drivers/xen/Makefile
---- a/linux-2.6-xen-sparse/drivers/xen/Makefile	Tue Aug 15 19:53:55 2006 +0100
-+++ b/linux-2.6-xen-sparse/drivers/xen/Makefile	Fri Aug 18 16:17:58 2006 -0400
+diff -r 2773c39df9a6 linux-2.6-xen-sparse/drivers/xen/Makefile
+--- a/linux-2.6-xen-sparse/drivers/xen/Makefile	Wed Nov 29 12:16:19 2006 +0000
++++ b/linux-2.6-xen-sparse/drivers/xen/Makefile	Thu Nov 30 15:13:53 2006 +0100
 @@ -15,3 +15,5 @@ obj-$(CONFIG_XEN_NETDEV_FRONTEND)	+= net
  obj-$(CONFIG_XEN_NETDEV_FRONTEND)	+= netfront/
  obj-$(CONFIG_XEN_PCIDEV_BACKEND)	+= pciback/
  obj-$(CONFIG_XEN_PCIDEV_FRONTEND)	+= pcifront/
-+obj-$(CONFIG_XEN_FRAMEBUFFER)		+= xenfb/
-+obj-$(CONFIG_XEN_KEYBOARD)		+= xenkbd/
-diff -r ec03b24a2d83 -r 6ca424e1867e linux-2.6-xen-sparse/mm/memory.c
---- a/linux-2.6-xen-sparse/mm/memory.c	Tue Aug 15 19:53:55 2006 +0100
-+++ b/linux-2.6-xen-sparse/mm/memory.c	Fri Aug 18 16:17:58 2006 -0400
-@@ -881,6 +881,7 @@ unsigned long zap_page_range(struct vm_a
- 		tlb_finish_mmu(tlb, address, end);
- 	return end;
- }
-+EXPORT_SYMBOL(zap_page_range);
++obj-$(CONFIG_XEN_FRAMEBUFFER)		+= fbfront/
++obj-$(CONFIG_XEN_KEYBOARD)		+= fbfront/
+diff -r 2773c39df9a6 linux-2.6-xen-sparse/drivers/xen/console/console.c
+--- a/linux-2.6-xen-sparse/drivers/xen/console/console.c	Wed Nov 29 12:16:19 2006 +0000
++++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c	Thu Nov 30 15:13:53 2006 +0100
+@@ -57,6 +57,7 @@
+ #include <xen/interface/event_channel.h>
+ #include <asm/hypervisor.h>
+ #include <xen/evtchn.h>
++#include <xen/xenbus.h>
+ #include <xen/xencons.h>
  
  /*
-  * Do a quick page-table lookup for a single page.
-diff -r ec03b24a2d83 -r 6ca424e1867e linux-2.6-xen-sparse/drivers/xen/xenfb/Makefile
+@@ -698,6 +699,15 @@ static int __init xencons_init(void)
+ 	printk("Xen virtual console successfully installed as %s%d\n",
+ 	       DRV(xencons_driver)->name, xc_num);
+ 
++        /* Check about framebuffer messing up the console */
++        if (!is_initial_xendomain() &&
++	    !xenbus_exists(XBT_NIL, "device", "vfb")) {
++		/* FIXME: this is ugly */
++		unregister_console(&kcons_info);
++		kcons_info.flags |= CON_CONSDEV;
++		register_console(&kcons_info);
++	}
++
+ 	return 0;
+ }
+ 
+diff -r 2773c39df9a6 tools/Makefile
+--- a/tools/Makefile	Wed Nov 29 12:16:19 2006 +0000
++++ b/tools/Makefile	Wed Nov 29 13:56:23 2006 +0100
+@@ -19,4 +19,5 @@ SUBDIRS-y += libaio
+ SUBDIRS-y += libaio
+ SUBDIRS-y += blktap
++SUBDIRS-y += xenfb
+ 
+ # These don't cross-compile
+diff -r 2773c39df9a6 tools/python/xen/xend/XendDomainInfo.py
+--- a/tools/python/xen/xend/XendDomainInfo.py	Wed Nov 29 12:16:19 2006 +0000
++++ b/tools/python/xen/xend/XendDomainInfo.py	Wed Nov 29 13:56:25 2006 +0100
+@@ -458,7 +458,7 @@ class XendDomainInfo:
+     try:
+         vm.construct()
+         vm.storeVmDetails()
+-        vm.createDevices()
++        vm.restoreDomain()
+         vm.createChannels()
+         vm.storeDomDetails()
+         vm.endRestore()
+@@ -1330,6 +1330,23 @@ class XendDomainInfo:
+
+    ## public:
+ 
++
++    def restoreDomain(self):
++        log.debug('XendDomainInfo.restoreDomain: %s %s',
++                  self.domid,
++                  self.info['cpu_weight'])
++
++        if not self.infoIsSet('image'):
++            raise VmError('Missing image in configuration')
++
++        try:
++            self.image = image.create(self,
++                                      self.info['image'],
++                                      self.info['device'])
++
++            self._createDevices()
++        except RuntimeError, exn:
++            raise VmError(str(exn))
+ 
+     def cleanupDomain(self):
+         """Cleanup domain resources; release devices.  Idempotent.  Nothrow
+@@ -1796,7 +1796,7 @@ def addControllerClass(device_class, cls
+     controllerClasses[device_class] = cls
+ 
[...9416 lines suppressed...]
+--- a/buildconfigs/linux-defconfig_xen_ia64	Mon Dec 04 09:20:12 2006 +0000
++++ b/buildconfigs/linux-defconfig_xen_ia64	Mon Dec 04 09:21:10 2006 +0000
+@@ -1548,6 +1548,8 @@ CONFIG_XEN_PCIDEV_BACKEND_SLOT=y
+ # CONFIG_XEN_TPMDEV_BACKEND is not set
+ CONFIG_XEN_BLKDEV_FRONTEND=y
+ CONFIG_XEN_NETDEV_FRONTEND=y
++CONFIG_XEN_FRAMEBUFFER=y
++CONFIG_XEN_KEYBOARD=y
+ # CONFIG_XEN_SCRUB_PAGES is not set
+ CONFIG_XEN_DISABLE_SERIAL=y
+ CONFIG_XEN_SYSFS=y
+diff -r 275a8f9a0710 -r d8befb109c39 buildconfigs/linux-defconfig_xen_x86_32
+--- a/buildconfigs/linux-defconfig_xen_x86_32	Mon Dec 04 09:20:12 2006 +0000
++++ b/buildconfigs/linux-defconfig_xen_x86_32	Mon Dec 04 09:21:10 2006 +0000
+@@ -3034,6 +3034,8 @@ CONFIG_XEN_NETDEV_LOOPBACK=y
+ # CONFIG_XEN_TPMDEV_BACKEND is not set
+ CONFIG_XEN_BLKDEV_FRONTEND=y
+ CONFIG_XEN_NETDEV_FRONTEND=y
++CONFIG_XEN_FRAMEBUFFER=y
++CONFIG_XEN_KEYBOARD=y
+ CONFIG_XEN_SCRUB_PAGES=y
+ CONFIG_XEN_DISABLE_SERIAL=y
+ CONFIG_XEN_SYSFS=y
+diff -r 275a8f9a0710 -r d8befb109c39 buildconfigs/linux-defconfig_xen_x86_64
+--- a/buildconfigs/linux-defconfig_xen_x86_64	Mon Dec 04 09:20:12 2006 +0000
++++ b/buildconfigs/linux-defconfig_xen_x86_64	Mon Dec 04 09:21:10 2006 +0000
+@@ -2866,6 +2866,8 @@ CONFIG_XEN_TPMDEV_BACKEND=m
+ # CONFIG_XEN_TPMDEV_CLOSE_IF_VTPM_FAILS is not set
+ CONFIG_XEN_BLKDEV_FRONTEND=y
+ CONFIG_XEN_NETDEV_FRONTEND=y
++CONFIG_XEN_FRAMEBUFFER=y
++CONFIG_XEN_KEYBOARD=y
+ CONFIG_XEN_SCRUB_PAGES=y
+ CONFIG_XEN_DISABLE_SERIAL=y
+ CONFIG_XEN_SYSFS=y
+Backport of upstream's changes to 3.0.3:
+--- a/tools/python/xen/xend/server/vfbif.py	2006-12-05 16:03:11.000000000 +0100
++++ b/tools/python/xen/xend/server/vfbif.py	2006-12-05 16:33:45.000000000 +0100
+@@ -1,6 +1,7 @@
+ from xen.xend.server.DevController import DevController
  
+ from xen.xend.XendError import VmError
++from xen.xend import sxp
+ import xen.xend
+ import os
+ 
+@@ -19,45 +20,79 @@ class VfbifController(DevController):
+ 
+     def __init__(self, vm):
+         DevController.__init__(self, vm)
+-        self.config = {}
+-        
++
+     def getDeviceDetails(self, config):
+         """@see DevController.getDeviceDetails"""
++        type       = sxp.child_value(config, 'type')
++        vncunused  = sxp.child_value(config, 'vncunused')
++        vncdisplay = sxp.child_value(config, 'vncdisplay')
++        vnclisten  = sxp.child_value(config, 'vnclisten')
++        display    = sxp.child_value(config, 'display')
++        xauthority = sxp.child_value(config, 'xauthority')
++
+         devid = 0
+-        back = {}
++
++        if type not in ('sdl', 'vnc'):
++            raise VmError('Unknown vfb type %s (%s)' % (type, repr(config)))
++
+         front = {}
++
++        back = { 'type' : type }
++        if vncunused:
++            back['vncunused'] = vncunused
++        if vncdisplay:
++            back['vncdisplay'] = vncdisplay
++        if vnclisten:
++            back['vnclisten'] = vnclisten
++        if display:
++            back['display'] = display
++        if xauthority:
++            back['xauthority'] = xauthority
++
+         return (devid, back, front)
+ 
+-    def getDeviceConfiguration(self, devid):
+-        r = DevController.getDeviceConfiguration(self, devid)
+-        for (k,v) in self.config.iteritems():
+-            r[k] = v
++    def configuration(self, devid):
++        r = DevController.configuration(self, devid)
++        (type, vncunused, vncdisplay, vnclisten, display, xauthority) \
++               = self.readBackend(devid, 'type', 'vncunused', 'vncdisplay',
++                                  'vnclisten', 'display', 'xauthority')
++        if type:
++            r.append(['type', type]),
++        if vncunused:
++            r.append(['vncunused', vncunused])
++        if vncdisplay:
++            r.append(['vncdisplay', vncdisplay])
++        if vnclisten:
++            r.append(['vnclisten', vnclisten])
++        if display:
++            r.append(['display', display])
++        if xauthority:
++            r.append(['xauthority', xauthority])
+         return r
+-    
++        
+     def createDevice(self, config):
+         DevController.createDevice(self, config)
+-        self.config = config
+         std_args = [ "--domid", "%d" % self.vm.getDomid(),
+                      "--title", self.vm.getName() ]
+-        t = config.get("type", None)
++        t = sxp.child_value(config, "type")
+         if t == "vnc":
+             # Try to start the vnc backend
+             args = [xen.util.auxbin.pathTo("xen-vncfb")]
+-            if config.has_key("vncunused"):
++            if sxp.child_value(config, "vncunused") is not None:
+                 args += ["--unused"]
+-            elif config.has_key("vncdisplay"):
+-                args += ["--vncport", "%d" % (5900 + config["vncdisplay"])]
+-            vnclisten = config.get("vnclisten",
+-                                   xen.xend.XendRoot.instance().get_vnclisten_address())
++            elif sxp.child_value(config, "vncdisplay") is not None:
++                args += ["--vncport", "%d" % (5900 + sxp.child_value(config, "vncdisplay"))]
++            vnclisten = sxp.child_value(config, 'vnclisten',
++                                        xen.xend.XendRoot.instance().get_vnclisten_address())
+             args += [ "--listen", vnclisten ]
+             spawn_detached(args[0], args + std_args, os.environ)
+         elif t == "sdl":
+             args = [xen.util.auxbin.pathTo("xen-sdlfb")]
+             env = dict(os.environ)
+-            if config.has_key("display"):
+-                env['DISPLAY'] = config["display"]
+-            if config.has_key("xauthority"):
+-                env['XAUTHORITY'] = config["xauthority"]
++            if sxp.child_value(config, "display") is not None:
++                env['DISPLAY'] = sxp.child_value(config, "display")
++            if sxp.child_value(config, "xauthority") is not None:
++                env['XAUTHORITY'] = sxp.child_value(config, "xauthority")
+             spawn_detached(args[0], args + std_args, env)
+         else:
+             raise VmError('Unknown vfb type %s (%s)' % (t, repr(config)))
+# HG changeset patch
+# User kfraser at localhost.localdomain
+# Date 1166203851 0
+# Node ID 96b047d22ad5866d66508e64aac22b99b3a5dcd2
+# Parent  1b6354023e64af6d02909ac81dfe4b5f4e930dda
+Fix pointer encoding in vncfb (middle and right button were swapped).
+
+Signed-off-by: Markus Armbruster <armbru at redhat.com>
+
+diff -r 1b6354023e64 -r 96b047d22ad5 tools/xenfb/vncfb.c
+--- a/tools/xenfb/vncfb.c	Fri Dec 15 17:29:25 2006 +0000
++++ b/tools/xenfb/vncfb.c	Fri Dec 15 17:30:51 2006 +0000
+@@ -148,6 +148,10 @@ static int xk2linux[0x10000] = {
+ 	[XK_plus] = KEY_EQUAL,
+ };
  
-+def configure_graphics(config_image, vals):
-+    """Create the config for graphic consoles.
-+    """
-+    args = [ 'vnc', 'vncdisplay', 'vncconsole', 'vncunused',
-+             'sdl', 'display', 'xauthority', 'vnclisten' ]
-+    for a in args:
-+        if (vals.__dict__[a]):
-+            config_image.append([a, vals.__dict__[a]])
++static int btnmap[] = {
++	BTN_LEFT, BTN_MIDDLE, BTN_RIGHT, BTN_FORWARD, BTN_BACK
++};
 +
- def configure_hvm(config_image, vals):
-     """Create the config for HVM devices.
-     """
-     args = [ 'device_model', 'pae', 'vcpus', 'boot', 'fda', 'fdb',
-              'localtime', 'serial', 'stdvga', 'isa', 'nographic', 'soundhw',
--             'vnc', 'vncdisplay', 'vncunused', 'vncconsole', 'vnclisten',
--             'sdl', 'display', 'xauthority',
-              'acpi', 'apic', 'usb', 'usbdevice' ]
-     for a in args:
-         if (vals.__dict__[a]):
+ static void on_kbd_event(rfbBool down, rfbKeySym keycode, rfbClientPtr cl)
+ {
+ 	/*
+@@ -184,8 +188,11 @@ static void on_ptr_event(int buttonMask,
+ 		down = buttonMask & (1 << i);
+ 		if (down == last_down)
+ 			continue;
+-		/* FIXME this assumes buttons are numbered the same; verify they are */
+-		if (xenfb_send_key(xenfb, down != 0, BTN_MOUSE + i) < 0)
++		if (i >= sizeof(btnmap) / sizeof(*btnmap))
++			break;
++		if (btnmap[i] == 0)
++			break;
++		if (xenfb_send_key(xenfb, down != 0, btnmap[i]) < 0)
+ 			fprintf(stderr, "Button %d %s lost (%s)\n",
+ 				i, down ? "down" : "up", strerror(errno));
+ 	}


Index: xen.spec
===================================================================
RCS file: /cvs/dist/rpms/xen/FC-5/xen.spec,v
retrieving revision 1.120
retrieving revision 1.121
diff -u -r1.120 -r1.121
--- xen.spec	11 Jan 2007 18:28:14 -0000	1.120
+++ xen.spec	30 Jan 2007 19:13:26 -0000	1.121
@@ -52,15 +52,15 @@
 Patch102: xen-3.0.2-config-allow-unix-server.patch
 Patch103: xen-3.0.2-config-disable-reloc.patch
 
-# patches going upstream (pv framebuffer)
-Patch200: xen-pvfb.patch
-Patch201: xen-pvfb-nocursor.patch
-Patch202: xen-pvfb-sigpipe.patch
+# pv framebuffer patches
+Patch200: xen-console.patch
+Patch201: xen-pvfb.patch
+Patch202: xen-pvfb-compat.patch
+Patch203: xen-pvfb-fixes.patch
 
 # patches to make VNC only listen on localhost by default / use passwords
-Patch221: xen-vnclisten-pvfb.patch
+Patch220: xen-3.0.4-vncpassword-pvfb-backport.patch
 Patch222: xen-vncpassword-5.patch
-Patch223: xen-vncpassword-pvfb-2.patch
 
 Patch251: pygrub-manykernels.patch
 Patch252: pygrub-cosmetics.patch
@@ -173,11 +173,11 @@
 %patch200 -p1
 %patch201 -p1
 %patch202 -p1
+%patch203 -p1
 
 # vnclisten/password patches
-%patch221 -p1
+%patch220 -p1
 %patch222 -p1
-%patch223 -p1
 
 # upstream patches
 %patch251 -p1
@@ -200,11 +200,11 @@
 popd
 sed -i -e "s;libvncserver-config;${vncdir}/libvncserver-config;" tools/xenfb/Makefile
 
-CFLAGS="$RPM_OPT_FLAGS" %{__make} XEN_PYTHON_NATIVE_INSTALL=1 DESTDIR=%{buildroot} tools docs
+CFLAGS="$RPM_OPT_FLAGS" %{__make} XENFB_TOOLS=y XEN_PYTHON_NATIVE_INSTALL=1 DESTDIR=%{buildroot} tools docs
 
 %install
 rm -rf %{buildroot}
-make XEN_PYTHON_NATIVE_INSTALL=1 DESTDIR=%{buildroot} prefix=/usr install-tools install-docs
+make XENFB_TOOLS=y XEN_PYTHON_NATIVE_INSTALL=1 DESTDIR=%{buildroot} prefix=/usr install-tools install-docs
 mkdir -p %{buildroot}%{_localstatedir}/lib/%{name}/xend-db/domain
 mkdir -p %{buildroot}%{_localstatedir}/lib/%{name}/xend-db/vnet
 mkdir -p %{buildroot}%{_localstatedir}/lib/%{name}/xend-db/migrate
@@ -286,6 +286,12 @@
 %dir %attr(0700,root,root) /var/log/xen
 
 %changelog
+* Tue Jan 30 2007 Markus Armbruster <armbru at redhat.com>
+- Update Xen paravirt framebuffer patch to upstream xen-unstable
+  changeset 13066.  This changes the protocol to the one accepted
+  upstream.
+- Add compatibility with guests running our initial protocol.
+
 * Tue Jan  9 2007 Daniel P. Berrange <berrange at redhat.com> - 3.0.3-3.fc5
 - fix core dumps of 32 bit guests >2GB RAM (bz 215796)
 - write the /local/domain/vm node early in the startup process (bz 215269)


--- xen-pvfb-nocursor.patch DELETED ---


--- xen-pvfb-sigpipe.patch DELETED ---


--- xen-vnclisten-pvfb.patch DELETED ---


--- xen-vncpassword-pvfb-2.patch DELETED ---




More information about the fedora-cvs-commits mailing list