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