From d797a5a0c64482a53b2179a465bd36dd5afeb3ef Mon Sep 17 00:00:00 2001 From: Daniel P. Berrange Date: Sep 24 2007 23:09:22 +0000 Subject: Make 32-bit FC6 guests work on 64-bit host --- diff --git a/xen-pvfb-04-compat.patch b/xen-pvfb-04-compat.patch index 1c96b03..a4a5c96 100644 --- a/xen-pvfb-04-compat.patch +++ b/xen-pvfb-04-compat.patch @@ -1,7 +1,7 @@ -diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.c xen-3.1.0-src.new/tools/ioemu/hw/oldxenfb.c +diff -ruNp xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.c xen-3.1.0-src.new/tools/ioemu/hw/oldxenfb.c --- xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.c 1969-12-31 19:00:00.000000000 -0500 -+++ xen-3.1.0-src.new/tools/ioemu/hw/oldxenfb.c 2007-09-24 13:46:13.000000000 -0400 -@@ -0,0 +1,569 @@ ++++ xen-3.1.0-src.new/tools/ioemu/hw/oldxenfb.c 2007-09-24 18:51:06.000000000 -0400 +@@ -0,0 +1,610 @@ +#include +#include +#include @@ -9,6 +9,7 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.c xen-3.1.0-src.new/tools/ +#include +#include +#include ++#include +#include +#include +#include @@ -49,6 +50,7 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.c xen-3.1.0-src.new/tools/ + struct xs_handle *xsh; /* xs daemon handle */ + struct xenfb_device fb, kbd; + size_t fb_len; /* size of framebuffer */ ++ char protocol[64]; /* frontend protocol */ +}; + +static void oldxenfb_detach_dom(struct xenfb_private *); @@ -179,37 +181,72 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.c xen-3.1.0-src.new/tools/ + return 0; +} + ++static void oldxenfb_copy_mfns(int mode, int count, unsigned long *dst, void *src) ++{ ++ uint32_t *src32 = src; ++ uint64_t *src64 = src; ++ int i; ++ ++ for (i = 0; i < count; i++) ++ dst[i] = (mode == 32) ? src32[i] : src64[i]; ++} + +static int oldxenfb_map_fb(struct xenfb_private *xenfb, int domid) +{ + struct xenfb_page *page = xenfb->fb.page; + int n_fbmfns; + int n_fbdirs; -+ unsigned long *fbmfns; ++ unsigned long *pgmfns = NULL; ++ unsigned long *fbmfns = NULL; ++ void *map; ++ int mode, ret = -1; ++ ++ if (0 == strcmp(xenfb->protocol, XEN_IO_PROTO_ABI_NATIVE)) ++ mode = sizeof(unsigned long) * 8; ++ else if (0 == strcmp(xenfb->protocol, XEN_IO_PROTO_ABI_X86_32)) ++ mode = 32; ++ else if (0 == strcmp(xenfb->protocol, XEN_IO_PROTO_ABI_X86_64)) ++ mode = 64; ++ else ++ return -1; + + n_fbmfns = (xenfb->fb_len + (XC_PAGE_SIZE - 1)) / XC_PAGE_SIZE; -+ n_fbdirs = n_fbmfns * sizeof(unsigned long); ++ n_fbdirs = n_fbmfns * mode / 8; + n_fbdirs = (n_fbdirs + (XC_PAGE_SIZE - 1)) / XC_PAGE_SIZE; + ++ pgmfns = malloc(sizeof(unsigned long) * n_fbdirs); ++ fbmfns = malloc(sizeof(unsigned long) * n_fbmfns); ++ if (!pgmfns || !fbmfns) ++ goto out; ++ + /* + * 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; ++ oldxenfb_copy_mfns(mode, n_fbdirs, pgmfns, page->pd); ++ map = xc_map_foreign_batch(xenfb->xc, domid, ++ PROT_READ, pgmfns, n_fbdirs); ++ if (map == NULL) ++ goto out; ++ oldxenfb_copy_mfns(mode, n_fbmfns, fbmfns, map); ++ munmap(map, n_fbdirs * XC_PAGE_SIZE); + + 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; ++ goto out; + } + -+ return munmap(fbmfns, n_fbdirs * XC_PAGE_SIZE); ++ ret = 0; /* all is fine */ ++ ++ out: ++ if (pgmfns) ++ free(pgmfns); ++ if (fbmfns) ++ free(fbmfns); ++ return ret; +} + +static int oldxenfb_bind(struct xenfb_device *dev) @@ -319,6 +356,10 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.c xen-3.1.0-src.new/tools/ + if (oldxenfb_bind(&xenfb->kbd) < 0) + goto error; + ++ if (oldxenfb_xs_scanf1(xsh, xenfb->fb.otherend, "protocol", "%63s", ++ xenfb->protocol) < 0) ++ xenfb->protocol[0] = '\0'; ++ + /* TODO check for permitted ranges */ + fb_page = xenfb->fb.page; + xenfb->pub.depth = fb_page->depth; @@ -571,9 +612,9 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.c xen-3.1.0-src.new/tools/ + xs_unwatch(xsh, p, ""); + return ret; +} -diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.h xen-3.1.0-src.new/tools/ioemu/hw/oldxenfb.h +diff -ruNp xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.h xen-3.1.0-src.new/tools/ioemu/hw/oldxenfb.h --- xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.h 1969-12-31 19:00:00.000000000 -0500 -+++ xen-3.1.0-src.new/tools/ioemu/hw/oldxenfb.h 2007-09-24 13:47:01.000000000 -0400 ++++ xen-3.1.0-src.new/tools/ioemu/hw/oldxenfb.h 2007-09-24 18:50:44.000000000 -0400 @@ -0,0 +1,106 @@ +/* + * linux/include/linux/xenfb.h -- Xen virtual frame buffer device @@ -681,9 +722,9 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenfb.h xen-3.1.0-src.new/tools/ +}; + +#endif -diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenkbd.h xen-3.1.0-src.new/tools/ioemu/hw/oldxenkbd.h +diff -ruNp xen-3.1.0-src.orig/tools/ioemu/hw/oldxenkbd.h xen-3.1.0-src.new/tools/ioemu/hw/oldxenkbd.h --- xen-3.1.0-src.orig/tools/ioemu/hw/oldxenkbd.h 1969-12-31 19:00:00.000000000 -0500 -+++ xen-3.1.0-src.new/tools/ioemu/hw/oldxenkbd.h 2007-09-24 13:47:01.000000000 -0400 ++++ xen-3.1.0-src.new/tools/ioemu/hw/oldxenkbd.h 2007-09-24 18:50:44.000000000 -0400 @@ -0,0 +1,92 @@ +/* + * linux/include/linux/xenkbd.h -- Xen virtual keyboard/mouse @@ -777,9 +818,9 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/oldxenkbd.h xen-3.1.0-src.new/tools +void xenkbd_resume(void); + +#endif -diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.c xen-3.1.0-src.new/tools/ioemu/hw/xenfb.c ---- xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.c 2007-09-24 13:42:20.000000000 -0400 -+++ xen-3.1.0-src.new/tools/ioemu/hw/xenfb.c 2007-09-24 13:44:38.000000000 -0400 +diff -ruNp xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.c xen-3.1.0-src.new/tools/ioemu/hw/xenfb.c +--- xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.c 2007-09-24 18:42:25.000000000 -0400 ++++ xen-3.1.0-src.new/tools/ioemu/hw/xenfb.c 2007-09-24 18:50:44.000000000 -0400 @@ -41,6 +41,7 @@ struct xenfb_private { struct xenfb_device fb, kbd; size_t fb_len; /* size of framebuffer */ @@ -855,9 +896,9 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.c xen-3.1.0-src.new/tools/ioe memset(&event, 0, XENKBD_IN_EVENT_SIZE); event.type = XENKBD_TYPE_POS; event.pos.abs_x = abs_x; -diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.h xen-3.1.0-src.new/tools/ioemu/hw/xenfb.h ---- xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.h 2007-09-24 13:42:20.000000000 -0400 -+++ xen-3.1.0-src.new/tools/ioemu/hw/xenfb.h 2007-09-24 13:47:37.000000000 -0400 +diff -ruNp xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.h xen-3.1.0-src.new/tools/ioemu/hw/xenfb.h +--- xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.h 2007-09-24 18:42:25.000000000 -0400 ++++ xen-3.1.0-src.new/tools/ioemu/hw/xenfb.h 2007-09-24 18:50:44.000000000 -0400 @@ -36,4 +36,18 @@ int xenfb_send_key(struct xenfb *xenfb, 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); @@ -877,10 +918,10 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/hw/xenfb.h xen-3.1.0-src.new/tools/ioe + + #endif -diff -rupN xen-3.1.0-src.orig/tools/ioemu/Makefile.target xen-3.1.0-src.new/tools/ioemu/Makefile.target ---- xen-3.1.0-src.orig/tools/ioemu/Makefile.target 2007-09-24 13:42:20.000000000 -0400 -+++ xen-3.1.0-src.new/tools/ioemu/Makefile.target 2007-09-24 13:48:04.000000000 -0400 -@@ -371,7 +376,7 @@ VL_OBJS+= xenstore.o +diff -ruNp xen-3.1.0-src.orig/tools/ioemu/Makefile.target xen-3.1.0-src.new/tools/ioemu/Makefile.target +--- xen-3.1.0-src.orig/tools/ioemu/Makefile.target 2007-09-24 18:42:25.000000000 -0400 ++++ xen-3.1.0-src.new/tools/ioemu/Makefile.target 2007-09-24 18:50:44.000000000 -0400 +@@ -371,7 +371,7 @@ VL_OBJS+= xenstore.o VL_OBJS+= xen_platform.o VL_OBJS+= xen_machine_fv.o VL_OBJS+= xen_machine_pv.o @@ -889,10 +930,10 @@ diff -rupN xen-3.1.0-src.orig/tools/ioemu/Makefile.target xen-3.1.0-src.new/tool VL_OBJS+= tpm_tis.o DEFINES += -DHAS_AUDIO endif -diff -rupN xen-3.1.0-src.orig/tools/python/xen/xend/server/vfbif.py xen-3.1.0-src.new/tools/python/xen/xend/server/vfbif.py ---- xen-3.1.0-src.orig/tools/python/xen/xend/server/vfbif.py 2007-09-24 13:42:20.000000000 -0400 -+++ xen-3.1.0-src.new/tools/python/xen/xend/server/vfbif.py 2007-09-24 13:48:59.000000000 -0400 -@@ -53,7 +53,11 @@ class VfbifController(DevController): +diff -ruNp xen-3.1.0-src.orig/tools/python/xen/xend/server/vfbif.py xen-3.1.0-src.new/tools/python/xen/xend/server/vfbif.py +--- xen-3.1.0-src.orig/tools/python/xen/xend/server/vfbif.py 2007-09-24 18:42:25.000000000 -0400 ++++ xen-3.1.0-src.new/tools/python/xen/xend/server/vfbif.py 2007-09-24 18:50:44.000000000 -0400 +@@ -50,7 +50,11 @@ class VfbifController(DevController): if self.vm.info.is_hvm(): # is HVM, so qemu-dm will handle the vfb. return @@ -905,10 +946,10 @@ diff -rupN xen-3.1.0-src.orig/tools/python/xen/xend/server/vfbif.py xen-3.1.0-sr args = [ xen.util.auxbin.pathTo("qemu-dm"), "-M", "xenpv", "-d", "%d" % self.vm.getDomid(), -diff -rupN xen-3.1.0-src.orig/tools/python/xen/xend/XendConfig.py xen-3.1.0-src.new/tools/python/xen/xend/XendConfig.py ---- xen-3.1.0-src.orig/tools/python/xen/xend/XendConfig.py 2007-09-24 13:42:20.000000000 -0400 -+++ xen-3.1.0-src.new/tools/python/xen/xend/XendConfig.py 2007-09-24 13:49:27.000000000 -0400 -@@ -690,7 +690,7 @@ class XendConfig(dict): +diff -ruNp xen-3.1.0-src.orig/tools/python/xen/xend/XendConfig.py xen-3.1.0-src.new/tools/python/xen/xend/XendConfig.py +--- xen-3.1.0-src.orig/tools/python/xen/xend/XendConfig.py 2007-05-18 10:45:21.000000000 -0400 ++++ xen-3.1.0-src.new/tools/python/xen/xend/XendConfig.py 2007-09-24 18:50:44.000000000 -0400 +@@ -689,7 +689,7 @@ class XendConfig(dict): self['vtpm_refs'] = cfg.get('vtpm_refs', []) # coalesce hvm vnc frame buffer with vfb config @@ -917,7 +958,7 @@ diff -rupN xen-3.1.0-src.orig/tools/python/xen/xend/XendConfig.py xen-3.1.0-src. # add vfb device if it isn't there already has_rfb = False for console_uuid in self['console_refs']: -@@ -705,7 +705,7 @@ class XendConfig(dict): +@@ -704,7 +704,7 @@ class XendConfig(dict): dev_config = ['vfb'] # copy VNC related params from platform config to vfb dev conf for key in ['vncpasswd', 'vncunused', 'vncdisplay', @@ -926,9 +967,9 @@ diff -rupN xen-3.1.0-src.orig/tools/python/xen/xend/XendConfig.py xen-3.1.0-src. if key in self['platform']: dev_config.append([key, self['platform'][key]]) -diff -rupN xen-3.1.0-src.orig/tools/python/xen/xm/create.py xen-3.1.0-src.new/tools/python/xen/xm/create.py +diff -ruNp xen-3.1.0-src.orig/tools/python/xen/xm/create.py xen-3.1.0-src.new/tools/python/xen/xm/create.py --- xen-3.1.0-src.orig/tools/python/xen/xm/create.py 2007-05-18 10:45:21.000000000 -0400 -+++ xen-3.1.0-src.new/tools/python/xen/xm/create.py 2007-09-24 13:49:55.000000000 -0400 ++++ xen-3.1.0-src.new/tools/python/xen/xm/create.py 2007-09-24 18:50:44.000000000 -0400 @@ -610,7 +610,7 @@ def configure_vfbs(config_devs, vals): d['type'] = 'sdl' for (k,v) in d.iteritems(): diff --git a/xen.spec b/xen.spec index 7e781a4..d6c7d08 100644 --- a/xen.spec +++ b/xen.spec @@ -3,7 +3,7 @@ Summary: Xen is a virtual machine monitor Name: xen Version: 3.1.0 -Release: 7%{?dist} +Release: 8%{?dist} Group: Development/Libraries License: GPL URL: http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index.html @@ -276,6 +276,9 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/*.a %changelog +* Mon Sep 24 2007 Daniel P. Berrange - 3.1.0-8.fc8 +- Make 32-bit FC-6 guest PVFB work on x86_64 host + * Mon Sep 24 2007 Daniel P. Berrange - 3.1.0-7.fc8 - Re-add support for back-compat FC6 PVFB support - Fix handling of explicit port numbers (rhbz #279581)