WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [qemu patches] Update patches upto change

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [qemu patches] Update patches upto changeset 11870:29b02d929b7e.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 24 Oct 2006 15:00:47 +0000
Delivery-date: Tue, 24 Oct 2006 08:01:40 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
# Node ID 55ff34dceb0bfba8bcc648dd30a2b97d85f24b3c
# Parent  2c29a2e42937e7e57c1fa465298c32c1d5d39bd4
[qemu patches] Update patches upto changeset 11870:29b02d929b7e.

Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
---
 tools/ioemu/patches/domain-timeoffset             |    8 -
 tools/ioemu/patches/hypervisor-rtc                |   26 ++++
 tools/ioemu/patches/ide-cd-dma                    |   18 ++
 tools/ioemu/patches/qemu-bootorder                |   22 +--
 tools/ioemu/patches/qemu-cleanup                  |   33 ++++-
 tools/ioemu/patches/qemu-daemonize                |    4 
 tools/ioemu/patches/qemu-logging                  |    3 
 tools/ioemu/patches/qemu-target-i386-dm           |   18 --
 tools/ioemu/patches/serial-port-rate-limit        |   47 +++++++
 tools/ioemu/patches/series                        |    6 
 tools/ioemu/patches/vnc-access-monitor-vt         |    8 -
 tools/ioemu/patches/vnc-backoff-screen-scan       |   42 ++----
 tools/ioemu/patches/vnc-display-find-unused       |   15 +-
 tools/ioemu/patches/vnc-fixes                     |   17 +-
 tools/ioemu/patches/vnc-listen-specific-interface |  142 ++++++++++++++++++++++
 tools/ioemu/patches/vnc-password                  |  119 ++++++++++++++++++
 tools/ioemu/patches/vnc-protocol-fixes            |   46 +++++++
 tools/ioemu/patches/vnc-start-vncviewer           |    8 -
 tools/ioemu/patches/vnc-title-domain-name         |    8 -
 tools/ioemu/patches/xen-build                     |   13 --
 tools/ioemu/patches/xen-platform-device           |   12 -
 tools/ioemu/patches/xen-support-buffered-ioreqs   |    8 -
 tools/ioemu/patches/xenstore-block-device-config  |   47 +++----
 tools/ioemu/patches/xenstore-write-vnc-port       |   12 -
 24 files changed, 550 insertions(+), 132 deletions(-)

diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/domain-timeoffset
--- a/tools/ioemu/patches/domain-timeoffset     Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/domain-timeoffset     Tue Oct 24 14:48:06 2006 +0100
@@ -1,7 +1,7 @@ Index: ioemu/hw/mc146818rtc.c
 Index: ioemu/hw/mc146818rtc.c
 ===================================================================
---- ioemu.orig/hw/mc146818rtc.c        2006-09-21 19:33:25.000000000 +0100
-+++ ioemu/hw/mc146818rtc.c     2006-09-21 19:33:30.000000000 +0100
+--- ioemu.orig/hw/mc146818rtc.c        2006-10-24 14:45:21.000000000 +0100
++++ ioemu/hw/mc146818rtc.c     2006-10-24 14:45:39.000000000 +0100
 @@ -178,10 +178,27 @@
      }
  }
@@ -46,8 +46,8 @@ Index: ioemu/hw/mc146818rtc.c
  static void rtc_copy_date(RTCState *s)
 Index: ioemu/hw/pc.c
 ===================================================================
---- ioemu.orig/hw/pc.c 2006-09-21 19:33:30.000000000 +0100
-+++ ioemu/hw/pc.c      2006-09-21 19:33:30.000000000 +0100
+--- ioemu.orig/hw/pc.c 2006-10-24 14:45:38.000000000 +0100
++++ ioemu/hw/pc.c      2006-10-24 14:45:39.000000000 +0100
 @@ -159,7 +159,7 @@
  }
  
@@ -117,8 +117,8 @@ Index: ioemu/hw/pc.c
  QEMUMachine pc_machine = {
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:33:30.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:33:30.000000000 +0100
+--- ioemu.orig/vl.c    2006-10-24 14:45:38.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:45:39.000000000 +0100
 @@ -163,6 +163,8 @@
  
  int xc_handle;
@@ -174,8 +174,8 @@ Index: ioemu/vl.c
      if (usb_enabled) {
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 19:33:30.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 19:33:30.000000000 +0100
+--- ioemu.orig/vl.h    2006-10-24 14:45:38.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:45:39.000000000 +0100
 @@ -576,7 +576,7 @@
                                   int boot_device,
               DisplayState *ds, const char **fd_filename, int snapshot,
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/qemu-bootorder
--- a/tools/ioemu/patches/qemu-bootorder        Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/qemu-bootorder        Tue Oct 24 14:48:06 2006 +0100
@@ -1,9 +1,9 @@ Index: ioemu/vl.c
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:33:32.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:33:32.000000000 +0100
-@@ -124,7 +124,7 @@
- int vncunused;
+--- ioemu.orig/vl.c    2006-10-24 14:33:47.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:33:47.000000000 +0100
+@@ -125,7 +125,7 @@
+ struct sockaddr_in vnclisten_addr;
  const char* keyboard_layout = NULL;
  int64_t ticks_per_sec;
 -int boot_device = 'c';
@@ -11,7 +11,7 @@ Index: ioemu/vl.c
  uint64_t ram_size;
  int pit_min_timer_count = 0;
  int nb_nics;
-@@ -6063,14 +6063,14 @@
+@@ -6075,14 +6075,14 @@
                  break;
  #endif /* !CONFIG_DM */
              case QEMU_OPTION_boot:
@@ -32,7 +32,7 @@ Index: ioemu/vl.c
                      exit(1);
                  }
                  break;
-@@ -6334,6 +6334,7 @@
+@@ -6349,6 +6349,7 @@
          fd_filename[0] == '\0')
          help();
      
@@ -40,7 +40,7 @@ Index: ioemu/vl.c
      /* boot to cd by default if no hard disk */
      if (hd_filename[0] == '\0' && boot_device == 'c') {
          if (fd_filename[0] != '\0')
-@@ -6341,6 +6342,7 @@
+@@ -6356,6 +6357,7 @@
          else
              boot_device = 'd';
      }
@@ -48,7 +48,7 @@ Index: ioemu/vl.c
  #endif /* !CONFIG_DM */
  
      setvbuf(stdout, NULL, _IOLBF, 0);
-@@ -6599,6 +6601,7 @@
+@@ -6614,6 +6616,7 @@
                    ds, fd_filename, snapshot,
                    kernel_filename, kernel_cmdline, initrd_filename,
                    timeoffset);
@@ -58,9 +58,9 @@ Index: ioemu/vl.c
      if (usb_enabled) {
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 19:33:32.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 19:33:32.000000000 +0100
-@@ -576,7 +576,7 @@
+--- ioemu.orig/vl.h    2006-10-24 14:33:47.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:33:47.000000000 +0100
+@@ -578,7 +578,7 @@
  #ifndef QEMU_TOOL
  
  typedef void QEMUMachineInitFunc(uint64_t ram_size, int vga_ram_size, 
@@ -69,7 +69,7 @@ Index: ioemu/vl.h
               DisplayState *ds, const char **fd_filename, int snapshot,
               const char *kernel_filename, const char *kernel_cmdline,
               const char *initrd_filename, time_t timeoffset);
-@@ -1021,7 +1021,7 @@
+@@ -1023,7 +1023,7 @@
                      uint32_t start, uint32_t count);
  int PPC_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size,
                            const unsigned char *arch,
@@ -80,8 +80,8 @@ Index: ioemu/vl.h
                            uint32_t initrd_image, uint32_t initrd_size,
 Index: ioemu/hw/pc.c
 ===================================================================
---- ioemu.orig/hw/pc.c 2006-09-21 19:33:32.000000000 +0100
-+++ ioemu/hw/pc.c      2006-09-21 19:33:32.000000000 +0100
+--- ioemu.orig/hw/pc.c 2006-10-24 14:33:47.000000000 +0100
++++ ioemu/hw/pc.c      2006-10-24 14:33:47.000000000 +0100
 @@ -158,8 +158,23 @@
      rtc_set_memory(s, info_ofs + 8, sectors);
  }
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/qemu-cleanup
--- a/tools/ioemu/patches/qemu-cleanup  Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/qemu-cleanup  Tue Oct 24 14:48:06 2006 +0100
@@ -1,7 +1,7 @@ Index: ioemu/hw/vga.c
 Index: ioemu/hw/vga.c
 ===================================================================
---- ioemu.orig/hw/vga.c        2006-08-06 02:03:51.906765409 +0100
-+++ ioemu/hw/vga.c     2006-08-06 02:15:10.364150665 +0100
+--- ioemu.orig/hw/vga.c        2006-10-24 14:44:03.000000000 +0100
++++ ioemu/hw/vga.c     2006-10-24 14:45:22.000000000 +0100
 @@ -1622,7 +1622,9 @@
  static void vga_save(QEMUFile *f, void *opaque)
  {
@@ -26,8 +26,8 @@ Index: ioemu/hw/vga.c
          return -EINVAL;
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-08-06 02:15:01.774108287 +0100
-+++ ioemu/vl.c 2006-08-06 02:15:31.040845624 +0100
+--- ioemu.orig/vl.c    2006-10-24 14:44:08.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:45:29.000000000 +0100
 @@ -39,6 +39,7 @@
  #include <sys/ioctl.h>
  #include <sys/socket.h>
@@ -36,6 +36,24 @@ Index: ioemu/vl.c
  #include <dirent.h>
  #include <netdb.h>
  #ifdef _BSD
+@@ -2932,7 +2933,7 @@
+     }
+ 
+     /* XXX: better tmp dir construction */
+-    snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());
++    snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%ld", (long)getpid());
+     if (mkdir(smb_dir, 0700) < 0) {
+         fprintf(stderr, "qemu: could not create samba server dir '%s'\n", 
smb_dir);
+         exit(1);
+@@ -3893,7 +3894,7 @@
+                 perror("Opening pidfile");
+                 exit(1);
+             }
+-            fprintf(f, "%d\n", getpid());
++            fprintf(f, "%ld\n", (long)getpid());
+             fclose(f);
+             pid_filename = qemu_strdup(filename);
+             if (!pid_filename) {
 @@ -5308,7 +5309,9 @@
      QEMU_OPTION_d,
      QEMU_OPTION_hdachs,
@@ -70,8 +88,8 @@ Index: ioemu/vl.c
                      fprintf(stderr, "qemu: too many network clients\n");
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-08-06 02:15:01.775108175 +0100
-+++ ioemu/vl.h 2006-08-06 02:15:10.368150219 +0100
+--- ioemu.orig/vl.h    2006-10-24 14:44:08.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:45:22.000000000 +0100
 @@ -957,7 +957,7 @@
               unsigned long vram_offset, int vram_size, int width, int height);
  
@@ -81,3 +99,18 @@ Index: ioemu/vl.h
  void slavio_intctl_set_cpu(void *opaque, unsigned int cpu, CPUState *env);
  void slavio_pic_info(void *opaque);
  void slavio_irq_info(void *opaque);
+Index: ioemu/usb-linux.c
+===================================================================
+--- ioemu.orig/usb-linux.c     2006-10-24 14:44:03.000000000 +0100
++++ ioemu/usb-linux.c  2006-10-24 14:44:08.000000000 +0100
+@@ -26,7 +26,9 @@
+ #if defined(__linux__)
+ #include <dirent.h>
+ #include <sys/ioctl.h>
+-#include <linux/compiler.h>
++/* Some versions of usbdevice_fs.h need __user to be defined for them.   */
++/* This may (harmlessly) conflict with a definition in linux/compiler.h. */
++#define __user
+ #include <linux/usbdevice_fs.h>
+ #include <linux/version.h>
+ 
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/qemu-daemonize
--- a/tools/ioemu/patches/qemu-daemonize        Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/qemu-daemonize        Tue Oct 24 14:48:06 2006 +0100
@@ -2,9 +2,9 @@ Changes required because qemu-dm runs da
 
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:33:32.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:33:32.000000000 +0100
-@@ -6042,10 +6042,11 @@
+--- ioemu.orig/vl.c    2006-10-24 14:33:47.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:33:47.000000000 +0100
+@@ -6054,10 +6054,11 @@
                  }
                  break;
              case QEMU_OPTION_nographic:
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/qemu-logging
--- a/tools/ioemu/patches/qemu-logging  Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/qemu-logging  Tue Oct 24 14:48:06 2006 +0100
@@ -1,7 +1,7 @@ Index: ioemu/vl.c
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-08-06 02:15:48.550893605 +0100
-+++ ioemu/vl.c 2006-08-06 02:16:31.246133963 +0100
+--- ioemu.orig/vl.c    2006-10-24 14:36:58.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:37:03.000000000 +0100
 @@ -5234,7 +5234,7 @@
             "-S              freeze CPU at startup (use 'c' to start 
execution)\n"
             "-s              wait gdb connection to port %d\n"
@@ -43,7 +43,7 @@ Index: ioemu/vl.c
      /* default mac address of the first network interface */
      
 +    /* init debug */
-+    sprintf(qemu_dm_logfilename, "/var/log/xen/qemu-dm.%d.log", getpid());
++    sprintf(qemu_dm_logfilename, "/var/log/xen/qemu-dm.%ld.log", 
(long)getpid());
 +    cpu_set_log_filename(qemu_dm_logfilename);
 +    cpu_set_log(0);
 +    
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/qemu-target-i386-dm
--- a/tools/ioemu/patches/qemu-target-i386-dm   Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/qemu-target-i386-dm   Tue Oct 24 14:48:06 2006 +0100
@@ -1,7 +1,7 @@ Index: ioemu/Makefile.target
 Index: ioemu/Makefile.target
 ===================================================================
---- ioemu.orig/Makefile.target 2006-09-21 11:30:11.000000000 +0100
-+++ ioemu/Makefile.target      2006-09-21 18:54:22.000000000 +0100
+--- ioemu.orig/Makefile.target 2006-10-24 13:47:23.000000000 +0100
++++ ioemu/Makefile.target      2006-10-24 14:30:56.000000000 +0100
 @@ -62,6 +62,8 @@
  QEMU_SYSTEM=qemu-fast
  endif
@@ -32,8 +32,8 @@ Index: ioemu/Makefile.target
  DEFINES += -DHAS_AUDIO
 Index: ioemu/configure
 ===================================================================
---- ioemu.orig/configure       2006-09-21 11:30:11.000000000 +0100
-+++ ioemu/configure    2006-09-21 18:54:21.000000000 +0100
+--- ioemu.orig/configure       2006-10-24 13:47:23.000000000 +0100
++++ ioemu/configure    2006-10-24 14:29:34.000000000 +0100
 @@ -373,6 +373,8 @@
      if [ "$user" = "yes" ] ; then
          target_list="i386-user arm-user armeb-user sparc-user ppc-user 
mips-user mipsel-user $target_list"
@@ -45,8 +45,8 @@ Index: ioemu/configure
  fi
 Index: ioemu/monitor.c
 ===================================================================
---- ioemu.orig/monitor.c       2006-09-21 11:30:11.000000000 +0100
-+++ ioemu/monitor.c    2006-09-21 18:54:23.000000000 +0100
+--- ioemu.orig/monitor.c       2006-10-24 13:47:23.000000000 +0100
++++ ioemu/monitor.c    2006-10-24 14:30:56.000000000 +0100
 @@ -1262,6 +1262,10 @@
        "", "show profiling information", },
      { "capture", "", do_info_capture,
@@ -60,8 +60,8 @@ Index: ioemu/monitor.c
  
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 11:30:11.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 18:54:23.000000000 +0100
+--- ioemu.orig/vl.c    2006-10-24 13:47:23.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:30:56.000000000 +0100
 @@ -87,7 +87,7 @@
  
  #include "exec-all.h"
@@ -98,8 +98,8 @@ Index: ioemu/vl.c
  {
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 11:30:11.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 18:54:23.000000000 +0100
+--- ioemu.orig/vl.h    2006-10-24 13:47:23.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:30:56.000000000 +0100
 @@ -37,6 +37,8 @@
  #include <unistd.h>
  #include <fcntl.h>
@@ -132,7 +132,7 @@ Index: ioemu/target-i386-dm/cpu.h
 Index: ioemu/target-i386-dm/cpu.h
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/target-i386-dm/cpu.h 2006-09-21 18:54:22.000000000 +0100
++++ ioemu/target-i386-dm/cpu.h 2006-10-24 14:30:56.000000000 +0100
 @@ -0,0 +1,86 @@
 +/*
 + * i386 virtual CPU header
@@ -223,7 +223,7 @@ Index: ioemu/target-i386-dm/exec-dm.c
 Index: ioemu/target-i386-dm/exec-dm.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/target-i386-dm/exec-dm.c     2006-09-21 18:54:22.000000000 +0100
++++ ioemu/target-i386-dm/exec-dm.c     2006-10-24 14:30:56.000000000 +0100
 @@ -0,0 +1,516 @@
 +/*
 + *  virtual page mapping and translated block handling
@@ -744,7 +744,7 @@ Index: ioemu/target-i386-dm/helper2.c
 Index: ioemu/target-i386-dm/helper2.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/target-i386-dm/helper2.c     2006-09-21 18:55:31.000000000 +0100
++++ ioemu/target-i386-dm/helper2.c     2006-10-24 14:31:01.000000000 +0100
 @@ -0,0 +1,469 @@
 +/*
 + *  i386 helpers (without register variable usage)
@@ -1205,8 +1205,8 @@ Index: ioemu/target-i386-dm/helper2.c
 +                break;
 +        }
 +
-+        /* Wait up to 100 msec. */
-+        main_loop_wait(100);
++        /* Wait up to 10 msec. */
++        main_loop_wait(10);
 +
 +        if (env->send_event) {
 +            env->send_event = 0;
@@ -1218,7 +1218,7 @@ Index: ioemu/target-i386-dm/i8259-dm.c
 Index: ioemu/target-i386-dm/i8259-dm.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/target-i386-dm/i8259-dm.c    2006-09-21 11:30:11.000000000 +0100
++++ ioemu/target-i386-dm/i8259-dm.c    2006-10-24 13:47:23.000000000 +0100
 @@ -0,0 +1,107 @@
 +/* Xen 8259 stub for interrupt controller emulation
 + * 
@@ -1330,7 +1330,7 @@ Index: ioemu/target-i386-dm/qemu-dm.debu
 Index: ioemu/target-i386-dm/qemu-dm.debug
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/target-i386-dm/qemu-dm.debug 2006-09-21 11:30:11.000000000 +0100
++++ ioemu/target-i386-dm/qemu-dm.debug 2006-10-24 13:47:23.000000000 +0100
 @@ -0,0 +1,5 @@
 +#!/bin/sh
 +
@@ -1340,7 +1340,7 @@ Index: ioemu/target-i386-dm/qemu-ifup
 Index: ioemu/target-i386-dm/qemu-ifup
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/target-i386-dm/qemu-ifup     2006-09-21 11:30:11.000000000 +0100
++++ ioemu/target-i386-dm/qemu-ifup     2006-10-24 13:47:23.000000000 +0100
 @@ -0,0 +1,10 @@
 +#!/bin/sh
 +
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/series
--- a/tools/ioemu/patches/series        Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/series        Tue Oct 24 14:48:06 2006 +0100
@@ -32,10 +32,12 @@ fix-vga-scanning-code-overflow
 fix-vga-scanning-code-overflow
 vnc-cleanup
 vnc-fixes
+vnc-protocol-fixes
 vnc-start-vncviewer
 vnc-title-domain-name
 vnc-access-monitor-vt
 vnc-display-find-unused
+vnc-listen-specific-interface
 vnc-backoff-screen-scan
 xenstore-block-device-config
 xenstore-write-vnc-port
@@ -47,3 +49,7 @@ qemu-bootorder
 qemu-bootorder
 qemu-tunable-ide-write-cache
 qemu-pci 
+serial-port-rate-limit
+hypervisor-rtc
+ide-cd-dma
+vnc-password
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/vnc-access-monitor-vt
--- a/tools/ioemu/patches/vnc-access-monitor-vt Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/vnc-access-monitor-vt Tue Oct 24 14:48:06 2006 +0100
@@ -1,8 +1,8 @@ Index: ioemu/vnc.c
 Index: ioemu/vnc.c
 ===================================================================
---- ioemu.orig/vnc.c   2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/vnc.c        2006-09-21 19:33:31.000000000 +0100
-@@ -32,6 +32,10 @@
+--- ioemu.orig/vnc.c   2006-10-24 14:33:46.000000000 +0100
++++ ioemu/vnc.c        2006-10-24 14:33:46.000000000 +0100
+@@ -33,6 +33,10 @@
  #include "vnc_keysym.h"
  #include "keymaps.c"
  
@@ -13,7 +13,7 @@ Index: ioemu/vnc.c
  typedef struct Buffer
  {
      size_t capacity;
-@@ -95,6 +99,8 @@
+@@ -96,6 +100,8 @@
      int visible_h;
  
      int slow_client;
@@ -22,7 +22,7 @@ Index: ioemu/vnc.c
  };
  
  #define DIRTY_PIXEL_BITS 64
-@@ -791,16 +797,80 @@
+@@ -794,16 +800,80 @@
  
  static void do_key_event(VncState *vs, int down, uint32_t sym)
  {
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/vnc-backoff-screen-scan
--- a/tools/ioemu/patches/vnc-backoff-screen-scan       Tue Oct 24 14:47:41 
2006 +0100
+++ b/tools/ioemu/patches/vnc-backoff-screen-scan       Tue Oct 24 14:48:06 
2006 +0100
@@ -1,10 +1,10 @@ Index: ioemu/vnc.c
 Index: ioemu/vnc.c
 ===================================================================
---- ioemu.orig/vnc.c   2006-09-21 19:31:03.000000000 +0100
-+++ ioemu/vnc.c        2006-09-21 19:32:23.000000000 +0100
-@@ -27,7 +27,19 @@
- #include "vl.h"
+--- ioemu.orig/vnc.c   2006-10-24 14:33:17.000000000 +0100
++++ ioemu/vnc.c        2006-10-24 14:33:24.000000000 +0100
+@@ -28,7 +28,19 @@
  #include "qemu_socket.h"
+ #include <assert.h>
  
 -#define VNC_REFRESH_INTERVAL (1000 / 30)
 +/* The refresh interval starts at BASE.  If we scan the buffer and
@@ -23,7 +23,7 @@ Index: ioemu/vnc.c
  
  #include "vnc_keysym.h"
  #include "keymaps.c"
-@@ -64,10 +76,11 @@
+@@ -65,10 +77,11 @@
  struct VncState
  {
      QEMUTimer *timer;
@@ -36,7 +36,7 @@ Index: ioemu/vnc.c
      int width;
      int height;
      uint64_t *dirty_row;      /* screen regions which are possibly dirty */
-@@ -98,8 +111,6 @@
+@@ -99,8 +112,6 @@
      int visible_w;
      int visible_h;
  
@@ -45,7 +45,7 @@ Index: ioemu/vnc.c
      int ctl_keys;               /* Ctrl+Alt starts calibration */
  };
  
-@@ -380,7 +391,7 @@
+@@ -381,7 +392,7 @@
      int y = 0;
      int pitch = ds->linesize;
      VncState *vs = ds->opaque;
@@ -54,19 +54,19 @@ Index: ioemu/vnc.c
  
      if (src_x < vs->visible_x || src_y < vs->visible_y ||
        dst_x < vs->visible_x || dst_y < vs->visible_y ||
-@@ -390,11 +401,6 @@
+@@ -391,10 +402,8 @@
        (dst_y + h) > (vs->visible_y + vs->visible_h))
        updating_client = 0;
  
 -    if (updating_client) {
 -      vs->need_update = 1;
--      _vnc_update_client(vs);
++    if (updating_client)
+       _vnc_update_client(vs);
 -    }
--
+ 
      if (dst_y > src_y) {
        y = h - 1;
-       pitch = -pitch;
-@@ -445,110 +451,145 @@
+@@ -446,110 +455,149 @@
  static void _vnc_update_client(void *opaque)
  {
      VncState *vs = opaque;
@@ -279,12 +279,16 @@ Index: ioemu/vnc.c
 +             interested (e.g. minimised) it'll ignore this, and we
 +             can stop scanning the buffer until it sends another
 +             update request. */
-+          /* Note that there are bugs in xvncviewer which prevent
-+             this from actually working.  Leave the code in place
-+             for correct clients. */
++          /* It turns out that there's a bug in realvncviewer 4.1.2
++             which means that if you send a proper null update (with
++             no update rectangles), it gets a bit out of sync and
++             never sends any further requests, regardless of whether
++             it needs one or not.  Fix this by sending a single 1x1
++             update rectangle instead. */
 +          vnc_write_u8(vs, 0);
 +          vnc_write_u8(vs, 0);
-+          vnc_write_u16(vs, 0);
++          vnc_write_u16(vs, 1);
++          send_framebuffer_update(vs, 0, 0, 1, 1);
 +          vnc_flush(vs);
 +          vs->last_update_time = now;
 +          return;
@@ -295,7 +299,7 @@ Index: ioemu/vnc.c
  }
  
  static void vnc_update_client(void *opaque)
-@@ -561,8 +602,10 @@
+@@ -562,8 +610,10 @@
  
  static void vnc_timer_init(VncState *vs)
  {
@@ -307,7 +311,7 @@ Index: ioemu/vnc.c
  }
  
  static void vnc_dpy_refresh(DisplayState *ds)
-@@ -622,7 +665,6 @@
+@@ -623,7 +673,6 @@
        vs->csock = -1;
        buffer_reset(&vs->input);
        buffer_reset(&vs->output);
@@ -315,7 +319,7 @@ Index: ioemu/vnc.c
        return 0;
      }
      return ret;
-@@ -892,7 +934,6 @@
+@@ -895,7 +944,6 @@
                                       int x_position, int y_position,
                                       int w, int h)
  {
@@ -323,7 +327,7 @@ Index: ioemu/vnc.c
      if (!incremental)
        framebuffer_set_updated(vs, x_position, y_position, w, h);
      vs->visible_x = x_position;
-@@ -1015,6 +1056,7 @@
+@@ -1018,6 +1066,7 @@
  {
      int i;
      uint16_t limit;
@@ -331,7 +335,7 @@ Index: ioemu/vnc.c
  
      switch (data[0]) {
      case 0:
-@@ -1054,12 +1096,18 @@
+@@ -1061,12 +1110,18 @@
        if (len == 1)
            return 8;
  
@@ -352,15 +356,15 @@ Index: ioemu/vnc.c
      case 6:
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:31:03.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:32:23.000000000 +0100
-@@ -725,6 +725,12 @@
+--- ioemu.orig/vl.c    2006-10-24 14:33:17.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:33:24.000000000 +0100
+@@ -726,6 +726,12 @@
      }
  }
  
 +void qemu_advance_timer(QEMUTimer *ts, int64_t expire_time)
 +{
-+    if (ts->expire_time > expire_time)
++    if (ts->expire_time > expire_time || !qemu_timer_pending(ts))
 +      qemu_mod_timer(ts, expire_time);
 +}
 +
@@ -369,9 +373,9 @@ Index: ioemu/vl.c
  void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 19:31:03.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 19:32:23.000000000 +0100
-@@ -405,6 +405,7 @@
+--- ioemu.orig/vl.h    2006-10-24 14:33:17.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:33:24.000000000 +0100
+@@ -407,6 +407,7 @@
  void qemu_free_timer(QEMUTimer *ts);
  void qemu_del_timer(QEMUTimer *ts);
  void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time);
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/vnc-display-find-unused
--- a/tools/ioemu/patches/vnc-display-find-unused       Tue Oct 24 14:47:41 
2006 +0100
+++ b/tools/ioemu/patches/vnc-display-find-unused       Tue Oct 24 14:48:06 
2006 +0100
@@ -1,8 +1,8 @@ Index: ioemu/vnc.c
 Index: ioemu/vnc.c
 ===================================================================
---- ioemu.orig/vnc.c   2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/vnc.c        2006-09-21 19:33:31.000000000 +0100
-@@ -1182,7 +1182,7 @@
+--- ioemu.orig/vnc.c   2006-10-24 14:31:09.000000000 +0100
++++ ioemu/vnc.c        2006-10-24 14:31:36.000000000 +0100
+@@ -1195,7 +1195,7 @@
      }
  }
  
@@ -11,7 +11,7 @@ Index: ioemu/vnc.c
  {
      struct sockaddr_in addr;
      int reuse_addr, ret;
-@@ -1213,10 +1213,6 @@
+@@ -1226,10 +1226,6 @@
        exit(1);
      }
  
@@ -22,7 +22,7 @@ Index: ioemu/vnc.c
      reuse_addr = 1;
      ret = setsockopt(vs->lsock, SOL_SOCKET, SO_REUSEADDR,
                     (const char *)&reuse_addr, sizeof(reuse_addr));
-@@ -1225,7 +1221,16 @@
+@@ -1238,7 +1234,16 @@
        exit(1);
      }
  
@@ -39,7 +39,7 @@ Index: ioemu/vnc.c
        fprintf(stderr, "bind() failed\n");
        exit(1);
      }
-@@ -1246,6 +1251,8 @@
+@@ -1259,6 +1264,8 @@
      vs->ds->dpy_refresh = vnc_dpy_refresh;
  
      vnc_dpy_resize(vs->ds, 640, 400);
@@ -50,8 +50,8 @@ Index: ioemu/vnc.c
  int vnc_start_viewer(int port)
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:33:31.000000000 +0100
+--- ioemu.orig/vl.c    2006-10-24 14:31:09.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:31:41.000000000 +0100
 @@ -121,6 +121,7 @@
  static DisplayState display_state;
  int nographic;
@@ -99,7 +99,7 @@ Index: ioemu/vl.c
 +            case QEMU_OPTION_vncunused:
 +                vncunused++;
 +                if (vnc_display == -1)
-+                    vnc_display = -2;
++                    vnc_display = 0;
 +                break;
              }
          }
@@ -115,8 +115,8 @@ Index: ioemu/vl.c
      } else {
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 19:33:31.000000000 +0100
+--- ioemu.orig/vl.h    2006-10-24 14:31:09.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:31:36.000000000 +0100
 @@ -785,7 +785,7 @@
  void cocoa_display_init(DisplayState *ds, int full_screen);
  
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/vnc-fixes
--- a/tools/ioemu/patches/vnc-fixes     Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/vnc-fixes     Tue Oct 24 14:48:06 2006 +0100
@@ -1,7 +1,7 @@ Index: ioemu/vl.c
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:08:18.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:26:24.000000000 +0100
+--- ioemu.orig/vl.c    2006-10-24 13:47:23.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:19:36.000000000 +0100
 @@ -6534,8 +6534,10 @@
          }
      }
@@ -17,8 +17,8 @@ Index: ioemu/vl.c
      if (use_gdbstub) {
 Index: ioemu/vnc.c
 ===================================================================
---- ioemu.orig/vnc.c   2006-09-21 19:08:18.000000000 +0100
-+++ ioemu/vnc.c        2006-09-21 19:26:38.000000000 +0100
+--- ioemu.orig/vnc.c   2006-10-24 13:47:23.000000000 +0100
++++ ioemu/vnc.c        2006-10-24 14:20:00.000000000 +0100
 @@ -3,6 +3,7 @@
   * 
   * Copyright (C) 2006 Anthony Liguori <anthony@xxxxxxxxxxxxx>
@@ -483,7 +483,16 @@ Index: ioemu/vnc.c
  
      vga_hw_invalidate();
      vga_hw_update();
-@@ -1010,11 +1101,11 @@
+@@ -924,6 +1015,8 @@
+ {
+     char pad[3] = { 0, 0, 0 };
+ 
++    vga_hw_update();
++
+     vs->width = vs->ds->width;
+     vs->height = vs->ds->height;
+     vnc_write_u16(vs, vs->ds->width);
+@@ -1010,11 +1103,11 @@
        vnc_write(vs, "RFB 003.003\n", 12);
        vnc_flush(vs);
        vnc_read_when(vs, protocol_version, 12);
@@ -497,7 +506,7 @@ Index: ioemu/vnc.c
      }
  }
  
-@@ -1071,17 +1162,15 @@
+@@ -1071,17 +1164,15 @@
        exit(1);
      }
  
@@ -520,8 +529,8 @@ Index: ioemu/vnc.c
  }
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 19:00:48.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 19:26:24.000000000 +0100
+--- ioemu.orig/vl.h    2006-10-24 13:47:23.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:19:36.000000000 +0100
 @@ -319,6 +319,7 @@
  int is_graphic_console(void);
  CharDriverState *text_console_init(DisplayState *ds);
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/vnc-start-vncviewer
--- a/tools/ioemu/patches/vnc-start-vncviewer   Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/vnc-start-vncviewer   Tue Oct 24 14:48:06 2006 +0100
@@ -1,8 +1,8 @@ Index: ioemu/vnc.c
 Index: ioemu/vnc.c
 ===================================================================
---- ioemu.orig/vnc.c   2006-09-21 19:26:38.000000000 +0100
-+++ ioemu/vnc.c        2006-09-21 19:29:58.000000000 +0100
-@@ -1174,3 +1174,25 @@
+--- ioemu.orig/vnc.c   2006-10-24 14:33:46.000000000 +0100
++++ ioemu/vnc.c        2006-10-24 14:33:46.000000000 +0100
+@@ -1187,3 +1187,25 @@
  
      vnc_dpy_resize(vs->ds, 640, 400);
  }
@@ -30,8 +30,8 @@ Index: ioemu/vnc.c
 +}
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:26:24.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:29:50.000000000 +0100
+--- ioemu.orig/vl.c    2006-10-24 14:33:46.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:33:46.000000000 +0100
 @@ -120,6 +120,7 @@
  int bios_size;
  static DisplayState display_state;
@@ -93,8 +93,8 @@ Index: ioemu/vl.c
          sdl_display_init(ds, full_screen);
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 19:26:24.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 19:29:50.000000000 +0100
+--- ioemu.orig/vl.h    2006-10-24 14:33:46.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:33:46.000000000 +0100
 @@ -786,6 +786,7 @@
  
  /* vnc.c */
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/vnc-title-domain-name
--- a/tools/ioemu/patches/vnc-title-domain-name Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/vnc-title-domain-name Tue Oct 24 14:48:06 2006 +0100
@@ -1,16 +1,16 @@ Index: ioemu/vnc.c
 Index: ioemu/vnc.c
 ===================================================================
---- ioemu.orig/vnc.c   2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/vnc.c        2006-09-21 19:33:31.000000000 +0100
-@@ -1013,6 +1013,7 @@
+--- ioemu.orig/vnc.c   2006-10-24 14:33:46.000000000 +0100
++++ ioemu/vnc.c        2006-10-24 14:33:46.000000000 +0100
+@@ -1024,6 +1024,7 @@
  
  static int protocol_client_init(VncState *vs, char *data, size_t len)
  {
 +    size_t l;
      char pad[3] = { 0, 0, 0 };
  
-     vs->width = vs->ds->width;
-@@ -1058,8 +1059,10 @@
+     vga_hw_update();
+@@ -1071,8 +1072,10 @@
        
      vnc_write(vs, pad, 3);           /* padding */
  
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/xen-build
--- a/tools/ioemu/patches/xen-build     Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/xen-build     Tue Oct 24 14:48:06 2006 +0100
@@ -1,7 +1,7 @@ Index: ioemu/Makefile
 Index: ioemu/Makefile
 ===================================================================
---- ioemu.orig/Makefile        2006-08-28 20:19:23.000000000 +0100
-+++ ioemu/Makefile     2006-08-28 20:20:08.000000000 +0100
+--- ioemu.orig/Makefile        2006-10-24 14:37:25.000000000 +0100
++++ ioemu/Makefile     2006-10-24 14:37:28.000000000 +0100
 @@ -1,11 +1,14 @@
  # Makefile for QEMU.
  
@@ -85,8 +85,8 @@ Index: ioemu/Makefile
  info: qemu-doc.info qemu-tech.info
 Index: ioemu/Makefile.target
 ===================================================================
---- ioemu.orig/Makefile.target 2006-08-28 20:19:23.000000000 +0100
-+++ ioemu/Makefile.target      2006-08-28 20:19:47.000000000 +0100
+--- ioemu.orig/Makefile.target 2006-10-24 14:37:25.000000000 +0100
++++ ioemu/Makefile.target      2006-10-24 14:40:25.000000000 +0100
 @@ -1,5 +1,8 @@
  include config.mak
  
@@ -112,7 +112,7 @@ Index: ioemu/Makefile.target
  endif
 -CFLAGS=-Wall -O2 -g -fno-strict-aliasing
 +CFLAGS+=-Wall -O2 -g -fno-strict-aliasing
-+SSE2 := $(call test-gcc-flag,$(CC),-msse2)
++SSE2 := $(call cc-option,$(CC),-msse2,)
 +ifeq ($(SSE2),-msse2)
 +CFLAGS += -DUSE_SSE2=1 -msse2
 +endif
@@ -149,17 +149,18 @@ Index: ioemu/Makefile.target
  install: all 
 +      mkdir -p "$(DESTDIR)$(bindir)" "$(DESTDIR)$(configdir)"
  ifneq ($(PROGS),)
-       $(INSTALL) -m 755 -s $(PROGS) "$(DESTDIR)$(bindir)"
- endif
-+      install -m 755 $(TARGET_PATH)/qemu-dm.debug "$(DESTDIR)$(bindir)"
-+      install -m 755 $(TARGET_PATH)/qemu-ifup "$(DESTDIR)$(configdir)"
+-      $(INSTALL) -m 755 -s $(PROGS) "$(DESTDIR)$(bindir)"
++      $(INSTALL_PROG) $(PROGS) "$(DESTDIR)$(bindir)"
+ endif
++      $(INSTALL_PROG) $(TARGET_PATH)/qemu-dm.debug "$(DESTDIR)$(bindir)"
++      $(INSTALL_PROG) $(TARGET_PATH)/qemu-ifup "$(DESTDIR)$(configdir)"
  
  ifneq ($(wildcard .depend),)
  include .depend
 Index: ioemu/configure
 ===================================================================
---- ioemu.orig/configure       2006-08-28 20:19:23.000000000 +0100
-+++ ioemu/configure    2006-08-28 20:19:47.000000000 +0100
+--- ioemu.orig/configure       2006-10-24 14:37:25.000000000 +0100
++++ ioemu/configure    2006-10-24 14:40:20.000000000 +0100
 @@ -18,8 +18,8 @@
  
  # default parameters
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/xen-platform-device
--- a/tools/ioemu/patches/xen-platform-device   Tue Oct 24 14:47:41 2006 +0100
+++ b/tools/ioemu/patches/xen-platform-device   Tue Oct 24 14:48:06 2006 +0100
@@ -3,8 +3,8 @@ will come later.
 
 Index: ioemu/Makefile.target
 ===================================================================
---- ioemu.orig/Makefile.target 2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/Makefile.target      2006-09-21 19:33:32.000000000 +0100
+--- ioemu.orig/Makefile.target 2006-10-24 14:41:01.000000000 +0100
++++ ioemu/Makefile.target      2006-10-24 14:41:01.000000000 +0100
 @@ -359,6 +359,7 @@
  VL_OBJS+= usb-uhci.o
  VL_OBJS+= piix4acpi.o
@@ -15,8 +15,8 @@ Index: ioemu/Makefile.target
  ifeq ($(TARGET_BASE_ARCH), ppc)
 Index: ioemu/hw/pc.c
 ===================================================================
---- ioemu.orig/hw/pc.c 2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/hw/pc.c      2006-09-21 19:33:32.000000000 +0100
+--- ioemu.orig/hw/pc.c 2006-10-24 14:41:00.000000000 +0100
++++ ioemu/hw/pc.c      2006-10-24 14:41:01.000000000 +0100
 @@ -823,6 +823,9 @@
      }
  #endif /* !CONFIG_DM */
@@ -30,8 +30,8 @@ Index: ioemu/hw/xen_platform.c
 Index: ioemu/hw/xen_platform.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/hw/xen_platform.c    2006-09-21 19:33:32.000000000 +0100
-@@ -0,0 +1,138 @@
++++ ioemu/hw/xen_platform.c    2006-10-24 14:41:04.000000000 +0100
+@@ -0,0 +1,144 @@
 +/*
 + * XEN platform fake pci device, formerly known as the event channel device
 + * 
@@ -131,7 +131,8 @@ Index: ioemu/hw/xen_platform.c
 +    uint8_t  bist; /* Built in self test */
 +    uint32_t base_address_regs[6];
 +    uint32_t reserved1;
-+    uint32_t reserved2;
++    uint16_t subsystem_vendor_id;
++    uint16_t subsystem_id;
 +    uint32_t rom_addr;
 +    uint32_t reserved3;
 +    uint32_t reserved4;
@@ -160,6 +161,11 @@ Index: ioemu/hw/xen_platform.c
 +    pch->header_type = 0;
 +    pch->interrupt_pin = 1;
 +
++    /* Microsoft WHQL requires non-zero subsystem IDs. */
++    /* http://www.pcisig.com/reflector/msg02205.html.  */
++    pch->subsystem_vendor_id = pch->vendor_id; /* Duplicate vendor id.  */
++    pch->subsystem_id        = 0x0001;         /* Hardcode sub-id as 1. */
++
 +    pci_register_io_region(d, 0, 0x100, PCI_ADDRESS_SPACE_IO,
 +                           platform_ioport_map);
 +
@@ -172,9 +178,9 @@ Index: ioemu/hw/xen_platform.c
 +}
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 19:33:32.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 19:33:32.000000000 +0100
-@@ -1210,6 +1210,9 @@
+--- ioemu.orig/vl.h    2006-10-24 14:41:01.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:41:01.000000000 +0100
+@@ -1212,6 +1212,9 @@
  void xenstore_check_new_media_present(int timeout);
  void xenstore_write_vncport(int vnc_display);
  
diff -r 2c29a2e42937 -r 55ff34dceb0b 
tools/ioemu/patches/xen-support-buffered-ioreqs
--- a/tools/ioemu/patches/xen-support-buffered-ioreqs   Tue Oct 24 14:47:41 
2006 +0100
+++ b/tools/ioemu/patches/xen-support-buffered-ioreqs   Tue Oct 24 14:48:06 
2006 +0100
@@ -1,8 +1,8 @@ Index: ioemu/vl.c
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:33:32.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:33:32.000000000 +0100
-@@ -5844,6 +5844,7 @@
+--- ioemu.orig/vl.c    2006-10-24 14:33:47.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:33:47.000000000 +0100
+@@ -5854,6 +5854,7 @@
      unsigned long nr_pages, tmp_nr_pages, shared_page_nr;
      xen_pfn_t *page_array;
      extern void *shared_page;
@@ -10,7 +10,7 @@ Index: ioemu/vl.c
  
      char qemu_dm_logfilename[64];
  
-@@ -6425,6 +6426,18 @@
+@@ -6440,6 +6441,18 @@
      fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n",
              shared_page_nr, (uint64_t)(page_array[shared_page_nr]));
  
@@ -31,8 +31,8 @@ Index: ioemu/vl.c
  #elif defined(__ia64__)
 Index: ioemu/target-i386-dm/helper2.c
 ===================================================================
---- ioemu.orig/target-i386-dm/helper2.c        2006-09-21 19:33:30.000000000 
+0100
-+++ ioemu/target-i386-dm/helper2.c     2006-09-21 19:33:32.000000000 +0100
+--- ioemu.orig/target-i386-dm/helper2.c        2006-10-24 14:33:45.000000000 
+0100
++++ ioemu/target-i386-dm/helper2.c     2006-10-24 14:33:47.000000000 +0100
 @@ -76,6 +76,10 @@
  
  shared_iopage_t *shared_page = NULL;
diff -r 2c29a2e42937 -r 55ff34dceb0b 
tools/ioemu/patches/xenstore-block-device-config
--- a/tools/ioemu/patches/xenstore-block-device-config  Tue Oct 24 14:47:41 
2006 +0100
+++ b/tools/ioemu/patches/xenstore-block-device-config  Tue Oct 24 14:48:06 
2006 +0100
@@ -1,7 +1,7 @@ Index: ioemu/Makefile.target
 Index: ioemu/Makefile.target
 ===================================================================
---- ioemu.orig/Makefile.target 2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/Makefile.target      2006-09-21 19:33:31.000000000 +0100
+--- ioemu.orig/Makefile.target 2006-10-24 14:31:36.000000000 +0100
++++ ioemu/Makefile.target      2006-10-24 14:33:28.000000000 +0100
 @@ -358,6 +358,7 @@
  VL_OBJS+= cirrus_vga.o mixeng.o parallel.o acpi.o piix_pci.o
  VL_OBJS+= usb-uhci.o
@@ -13,7 +13,7 @@ Index: ioemu/xenstore.c
 Index: ioemu/xenstore.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/xenstore.c   2006-09-21 19:33:31.000000000 +0100
++++ ioemu/xenstore.c   2006-10-24 14:33:28.000000000 +0100
 @@ -0,0 +1,187 @@
 +/*
 + * This file is subject to the terms and conditions of the GNU General
@@ -204,9 +204,9 @@ Index: ioemu/xenstore.c
 +}
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:33:31.000000000 +0100
-@@ -5249,9 +5249,11 @@
+--- ioemu.orig/vl.c    2006-10-24 14:33:24.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:33:28.000000000 +0100
+@@ -5256,9 +5256,11 @@
             "Standard options:\n"
             "-M machine      select emulated machine (-M ? for list)\n"
             "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n"
@@ -218,7 +218,7 @@ Index: ioemu/vl.c
             "-boot [a|c|d]   boot on floppy (a), hard disk (c) or CD-ROM (d)\n"
           "-snapshot       write to temporary files instead of disk image 
files\n"
  #ifdef TARGET_I386
-@@ -5378,11 +5380,13 @@
+@@ -5386,11 +5388,13 @@
      QEMU_OPTION_M,
      QEMU_OPTION_fda,
      QEMU_OPTION_fdb,
@@ -232,7 +232,7 @@ Index: ioemu/vl.c
      QEMU_OPTION_boot,
      QEMU_OPTION_snapshot,
  #ifdef TARGET_I386
-@@ -5454,11 +5458,13 @@
+@@ -5463,11 +5467,13 @@
      { "M", HAS_ARG, QEMU_OPTION_M },
      { "fda", HAS_ARG, QEMU_OPTION_fda },
      { "fdb", HAS_ARG, QEMU_OPTION_fdb },
@@ -246,7 +246,7 @@ Index: ioemu/vl.c
      { "boot", HAS_ARG, QEMU_OPTION_boot },
      { "snapshot", 0, QEMU_OPTION_snapshot },
  #ifdef TARGET_I386
-@@ -5807,10 +5813,16 @@
+@@ -5817,10 +5823,16 @@
  #ifdef CONFIG_GDBSTUB
      int use_gdbstub, gdbstub_port;
  #endif
@@ -265,7 +265,7 @@ Index: ioemu/vl.c
      const char *kernel_filename, *kernel_cmdline;
      DisplayState *ds = &display_state;
      int cyls, heads, secs, translation;
-@@ -5871,8 +5883,10 @@
+@@ -5881,8 +5893,10 @@
      initrd_filename = NULL;
      for(i = 0; i < MAX_FD; i++)
          fd_filename[i] = NULL;
@@ -276,7 +276,7 @@ Index: ioemu/vl.c
      ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
      vga_ram_size = VGA_RAM_SIZE;
      bios_size = BIOS_SIZE;
-@@ -5886,11 +5900,13 @@
+@@ -5896,11 +5910,13 @@
      vncunused = 0;
      kernel_filename = NULL;
      kernel_cmdline = "";
@@ -290,7 +290,7 @@ Index: ioemu/vl.c
      cyls = heads = secs = 0;
      translation = BIOS_ATA_TRANSLATION_AUTO;
      pstrcpy(monitor_device, sizeof(monitor_device), "vc");
-@@ -5923,7 +5939,11 @@
+@@ -5935,7 +5951,11 @@
              break;
          r = argv[optind];
          if (r[0] != '-') {
@@ -302,7 +302,7 @@ Index: ioemu/vl.c
          } else {
              const QEMUOption *popt;
  
-@@ -5967,6 +5987,7 @@
+@@ -5979,6 +5999,7 @@
              case QEMU_OPTION_initrd:
                  initrd_filename = optarg;
                  break;
@@ -310,7 +310,7 @@ Index: ioemu/vl.c
              case QEMU_OPTION_hda:
              case QEMU_OPTION_hdb:
              case QEMU_OPTION_hdc:
-@@ -5979,6 +6000,7 @@
+@@ -5991,6 +6012,7 @@
                          cdrom_index = -1;
                  }
                  break;
@@ -318,7 +318,7 @@ Index: ioemu/vl.c
              case QEMU_OPTION_snapshot:
                  snapshot = 1;
                  break;
-@@ -6031,11 +6053,13 @@
+@@ -6043,11 +6065,13 @@
              case QEMU_OPTION_append:
                  kernel_cmdline = optarg;
                  break;
@@ -332,7 +332,7 @@ Index: ioemu/vl.c
              case QEMU_OPTION_boot:
                  boot_device = optarg[0];
                  if (boot_device != 'a' && 
-@@ -6290,12 +6314,18 @@
+@@ -6305,12 +6329,18 @@
          }
      }
  
@@ -351,7 +351,7 @@ Index: ioemu/vl.c
      if (!linux_boot && 
          hd_filename[0] == '\0' && 
          (cdrom_index >= 0 && hd_filename[cdrom_index] == '\0') &&
-@@ -6309,6 +6339,7 @@
+@@ -6324,6 +6354,7 @@
          else
              boot_device = 'd';
      }
@@ -359,7 +359,7 @@ Index: ioemu/vl.c
  
      setvbuf(stdout, NULL, _IOLBF, 0);
      
-@@ -6441,6 +6472,7 @@
+@@ -6456,6 +6487,7 @@
  
  #endif /* !CONFIG_DM */
  
@@ -367,7 +367,7 @@ Index: ioemu/vl.c
      /* we always create the cdrom drive, even if no disk is there */
      bdrv_init();
      if (cdrom_index >= 0) {
-@@ -6467,6 +6499,7 @@
+@@ -6482,6 +6514,7 @@
              }
          }
      }
@@ -375,7 +375,7 @@ Index: ioemu/vl.c
  
      /* we always create at least one floppy disk */
      fd_table[0] = bdrv_new("fda");
-@@ -6545,6 +6578,8 @@
+@@ -6560,6 +6593,8 @@
          }
      }
  
@@ -386,8 +386,8 @@ Index: ioemu/vl.c
                    kernel_filename, kernel_cmdline, initrd_filename,
 Index: ioemu/monitor.c
 ===================================================================
---- ioemu.orig/monitor.c       2006-09-21 19:33:30.000000000 +0100
-+++ ioemu/monitor.c    2006-09-21 19:33:31.000000000 +0100
+--- ioemu.orig/monitor.c       2006-10-24 14:31:36.000000000 +0100
++++ ioemu/monitor.c    2006-10-24 14:33:28.000000000 +0100
 @@ -24,6 +24,7 @@
  #include "vl.h"
  #include "disas.h"
@@ -416,8 +416,8 @@ Index: ioemu/monitor.c
      int i;
 Index: ioemu/block.c
 ===================================================================
---- ioemu.orig/block.c 2006-09-21 19:33:25.000000000 +0100
-+++ ioemu/block.c      2006-09-21 19:33:31.000000000 +0100
+--- ioemu.orig/block.c 2006-10-24 14:31:36.000000000 +0100
++++ ioemu/block.c      2006-10-24 14:33:28.000000000 +0100
 @@ -758,6 +758,7 @@
  static void raw_close(BlockDriverState *bs)
  {
@@ -428,9 +428,9 @@ Index: ioemu/block.c
  
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 19:33:31.000000000 +0100
-@@ -1189,6 +1189,8 @@
+--- ioemu.orig/vl.h    2006-10-24 14:33:24.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:33:28.000000000 +0100
+@@ -1191,6 +1191,8 @@
  void term_print_help(void);
  void monitor_readline(const char *prompt, int is_password,
                        char *buf, int buf_size);
@@ -439,7 +439,7 @@ Index: ioemu/vl.h
  
  /* readline.c */
  typedef void ReadLineFunc(void *opaque, const char *str);
-@@ -1201,6 +1203,13 @@
+@@ -1203,6 +1205,13 @@
  void readline_start(const char *prompt, int is_password,
                      ReadLineFunc *readline_func, void *opaque);
  
@@ -455,8 +455,8 @@ Index: ioemu/vl.h
  extern char domain_name[];
 Index: ioemu/hw/ide.c
 ===================================================================
---- ioemu.orig/hw/ide.c        2006-09-21 19:33:30.000000000 +0100
-+++ ioemu/hw/ide.c     2006-09-21 19:33:31.000000000 +0100
+--- ioemu.orig/hw/ide.c        2006-10-24 14:31:36.000000000 +0100
++++ ioemu/hw/ide.c     2006-10-24 14:33:28.000000000 +0100
 @@ -1158,6 +1158,7 @@
          } else {
              ide_atapi_cmd_error(s, SENSE_NOT_READY, 
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/xenstore-write-vnc-port
--- a/tools/ioemu/patches/xenstore-write-vnc-port       Tue Oct 24 14:47:41 
2006 +0100
+++ b/tools/ioemu/patches/xenstore-write-vnc-port       Tue Oct 24 14:48:06 
2006 +0100
@@ -1,7 +1,7 @@ Index: ioemu/xenstore.c
 Index: ioemu/xenstore.c
 ===================================================================
---- ioemu.orig/xenstore.c      2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/xenstore.c   2006-09-21 19:33:32.000000000 +0100
+--- ioemu.orig/xenstore.c      2006-10-24 14:33:47.000000000 +0100
++++ ioemu/xenstore.c   2006-10-24 14:33:47.000000000 +0100
 @@ -185,3 +185,31 @@
      free(image);
      free(vec);
@@ -36,10 +36,10 @@ Index: ioemu/xenstore.c
 +}
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/vl.c 2006-09-21 19:33:32.000000000 +0100
-@@ -6535,6 +6535,7 @@
-       vnc_display = vnc_display_init(ds, vnc_display, vncunused);
+--- ioemu.orig/vl.c    2006-10-24 14:33:47.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:33:47.000000000 +0100
+@@ -6550,6 +6550,7 @@
+       vnc_display = vnc_display_init(ds, vnc_display, vncunused, 
&vnclisten_addr);
        if (vncviewer)
            vnc_start_viewer(vnc_display);
 +      xenstore_write_vncport(vnc_display);
@@ -48,9 +48,9 @@ Index: ioemu/vl.c
          sdl_display_init(ds, full_screen);
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-09-21 19:33:31.000000000 +0100
-+++ ioemu/vl.h 2006-09-21 19:33:32.000000000 +0100
-@@ -1208,6 +1208,7 @@
+--- ioemu.orig/vl.h    2006-10-24 14:33:47.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:33:47.000000000 +0100
+@@ -1210,6 +1210,7 @@
  int xenstore_fd(void);
  void xenstore_process_event(void *opaque);
  void xenstore_check_new_media_present(int timeout);
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/hypervisor-rtc
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/hypervisor-rtc        Tue Oct 24 14:48:06 2006 +0100
@@ -0,0 +1,143 @@
+# HG changeset patch
+# User kfraser@xxxxxxxxxxxxxxxxxxxxx
+# Node ID 71e2a165aa7f81602c569430b18ba1ea705f0b70
+# Parent  da66691687dfd90c55420cfdf27f55d18cca7810
+[HVM] Move RTC emulation into the hypervisor.
+Signed-off-by: Xiaowei Yang <xiaowei.yang@xxxxxxxxx>
+
+--- ioemu/Makefile.target      Wed Oct 18 18:13:57 2006 +0100
++++ ioemu/Makefile.target      Wed Oct 18 18:35:21 2006 +0100
+@@ -294,7 +294,11 @@ endif
+ endif
+ 
+ # qemu-dm objects
++ifeq ($(ARCH),ia64)
+ LIBOBJS=helper2.o exec-dm.o i8259-dm.o
++else
++LIBOBJS=helper2.o exec-dm.o i8259-dm.o rtc-dm.o
++endif
+ 
+ all: $(PROGS)
+ 
+@@ -354,7 +358,11 @@ ifeq ($(TARGET_BASE_ARCH), i386)
+ ifeq ($(TARGET_BASE_ARCH), i386)
+ # Hardware support
+ VL_OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o $(AUDIODRV)
++ifeq ($(ARCH),ia64)
+ VL_OBJS+= fdc.o mc146818rtc.o serial.o pc.o
++else
++VL_OBJS+= fdc.o serial.o pc.o
++endif
+ VL_OBJS+= cirrus_vga.o mixeng.o parallel.o acpi.o piix_pci.o
+ VL_OBJS+= usb-uhci.o
+ VL_OBJS+= piix4acpi.o
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ ioemu/target-i386-dm/rtc-dm.c      Wed Oct 18 18:35:21 2006 +0100
+@@ -0,0 +1,107 @@
++/*
++ * QEMU MC146818 RTC emulation
++ * 
++ * Copyright (c) 2003-2004 Fabrice Bellard
++ * 
++ * Permission is hereby granted, free of charge, to any person obtaining a 
copy
++ * of this software and associated documentation files (the "Software"), to 
deal
++ * in the Software without restriction, including without limitation the 
rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#include "vl.h"
++
++//#define DEBUG_CMOS
++
++struct RTCState {
++    uint8_t cmos_data[128];
++    uint8_t cmos_index;
++};
++
++void rtc_set_memory(RTCState *s, int addr, int val)
++{
++    if (addr >= 0 && addr <= 127)
++        s->cmos_data[addr] = val;
++}
++
++static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data)
++{
++    RTCState *s = opaque;
++
++    if ((addr & 1) == 0) {
++        s->cmos_index = data & 0x7f;
++    } else {
++#ifdef DEBUG_CMOS
++        printf("cmos: write index=0x%02x val=0x%02x\n",
++               s->cmos_index, data);
++#endif        
++        s->cmos_data[s->cmos_index] = data;
++    }
++}
++
++static uint32_t cmos_ioport_read(void *opaque, uint32_t addr)
++{
++    RTCState *s = opaque;
++    int ret;
++    if ((addr & 1) == 0) {
++        return 0xff;
++    } else {
++        ret = s->cmos_data[s->cmos_index];
++#ifdef DEBUG_CMOS
++        printf("cmos: read index=0x%02x val=0x%02x\n",
++               s->cmos_index, ret);
++#endif
++        return ret;
++    }
++}
++
++static void rtc_save(QEMUFile *f, void *opaque)
++{
++    RTCState *s = opaque;
++
++    qemu_put_buffer(f, s->cmos_data, 128);
++    qemu_put_8s(f, &s->cmos_index);
++}
++
++static int rtc_load(QEMUFile *f, void *opaque, int version_id)
++{
++    RTCState *s = opaque;
++
++    if (version_id != 1)
++        return -EINVAL;
++
++    qemu_get_buffer(f, s->cmos_data, 128);
++    qemu_get_8s(f, &s->cmos_index);
++
++    return 0;
++}
++
++RTCState *rtc_init(int base, int irq)
++{
++    RTCState *s;
++
++    s = qemu_mallocz(sizeof(RTCState));
++    if (!s)
++        return NULL;
++
++    register_ioport_write(base, 2, 1, cmos_ioport_write, s);
++    register_ioport_read(base, 2, 1, cmos_ioport_read, s);
++
++    register_savevm("mc146818rtc", base, 1, rtc_save, rtc_load, s);
++    return s;
++}
++
++void rtc_set_date(RTCState *s, const struct tm *tm) {}
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/ide-cd-dma
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/ide-cd-dma    Tue Oct 24 14:48:06 2006 +0100
@@ -0,0 +1,21 @@
+# HG changeset patch
+# User kfraser@xxxxxxxxxxxxxxxxxxxxx
+# Node ID 1e8ba8d2117548d4f13b7b438d1e992b1815f580
+# Parent  f247e0b52dda257c0000c9da5a0cdff507b3ced8
+[HVM] Enable DMA mode for CD-ROM IDE ATAPI interface.
+Signed-off-by: Winston Wang <winston.l.wang@xxxxxxxxx
+
+--- ioemu/hw/ide.c     Wed Oct 18 18:37:18 2006 +0100
++++ ioemu/hw/ide.c     Wed Oct 18 18:41:47 2006 +0100
+@@ -557,9 +557,9 @@ static void ide_atapi_identify(IDEState 
+     padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
+     padstr((uint8_t *)(p + 27), "QEMU CD-ROM", 40); /* model */
+     put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
+-    put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
++    put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA 
supported */
+     put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
+-    put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
++    put_le16(p + 63, 0x07); /* mdma0-2 supported */
+     put_le16(p + 64, 1); /* PIO modes */
+     put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
+     put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/serial-port-rate-limit
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/serial-port-rate-limit        Tue Oct 24 14:48:06 
2006 +0100
@@ -0,0 +1,116 @@
+# HG changeset patch
+# User Steven Smith <ssmith@xxxxxxxxxxxxx>
+# Node ID 1d3f52eb256e3522edc12daca91039b319dbbbe5
+# Parent  b7b653e36d20811831f26bb951ea66dca5854b17
+[HVM] Rate limit guest accesses to the qemu virtual serial port.  This stops
+grub's boot menu from hammering dom0.
+
+Signed-off-by: Steven Smith <sos22@xxxxxxxxx>
+
+--- ioemu/hw/serial.c  Mon Sep 25 16:31:02 2006 +0100
++++ ioemu/hw/serial.c  Mon Sep 25 17:27:18 2006 +0100
+@@ -22,6 +22,9 @@
+  * THE SOFTWARE.
+  */
+ #include "vl.h"
++#include <sys/time.h>
++#include <time.h>
++#include <assert.h>
+ 
+ //#define DEBUG_SERIAL
+ 
+@@ -138,6 +141,67 @@ static void serial_update_parameters(Ser
+     printf("speed=%d parity=%c data=%d stop=%d\n", 
+            speed, parity, data_bits, stop_bits);
+ #endif
++}
++
++/* Rate limit serial requests so that e.g. grub on a serial console
++   doesn't kill dom0.  Simple token bucket.  If we get some actual
++   data from the user, instantly refil the bucket. */
++
++/* How long it takes to generate a token, in microseconds. */
++#define TOKEN_PERIOD 1000
++/* Maximum and initial size of token bucket */
++#define TOKENS_MAX 100000
++
++static int tokens_avail;
++
++static void serial_get_token(void)
++{
++    static struct timeval last_refil_time;
++    static int started;
++
++    assert(tokens_avail >= 0);
++    if (!tokens_avail) {
++      struct timeval delta, now;
++      int generated;
++
++      if (!started) {
++          gettimeofday(&last_refil_time, NULL);
++          tokens_avail = TOKENS_MAX;
++          started = 1;
++          return;
++      }
++    retry:
++      gettimeofday(&now, NULL);
++      delta.tv_sec = now.tv_sec - last_refil_time.tv_sec;
++      delta.tv_usec = now.tv_usec - last_refil_time.tv_usec;
++      if (delta.tv_usec < 0) {
++          delta.tv_usec += 1000000;
++          delta.tv_sec--;
++      }
++      assert(delta.tv_usec >= 0 && delta.tv_sec >= 0);
++      if (delta.tv_usec < TOKEN_PERIOD) {
++          struct timespec ts;
++          /* Wait until at least one token is available. */
++          ts.tv_sec = TOKEN_PERIOD / 1000000;
++          ts.tv_nsec = (TOKEN_PERIOD % 1000000) * 1000;
++          while (nanosleep(&ts, &ts) < 0 && errno == EINTR)
++              ;
++          goto retry;
++      }
++      generated = (delta.tv_sec * 1000000) / TOKEN_PERIOD;
++      generated +=
++          ((delta.tv_sec * 1000000) % TOKEN_PERIOD + delta.tv_usec) / 
TOKEN_PERIOD;
++      assert(generated > 0);
++
++      last_refil_time.tv_usec += (generated * TOKEN_PERIOD) % 1000000;
++      last_refil_time.tv_sec  += last_refil_time.tv_usec / 1000000;
++      last_refil_time.tv_usec %= 1000000;
++      last_refil_time.tv_sec  += (generated * TOKEN_PERIOD) / 1000000;
++      if (generated > TOKENS_MAX)
++          generated = TOKENS_MAX;
++      tokens_avail = generated;
++    }
++    tokens_avail--;
+ }
+ 
+ static void serial_ioport_write(void *opaque, uint32_t addr, uint32_t val)
+@@ -245,9 +309,11 @@ static uint32_t serial_ioport_read(void 
+         ret = s->mcr;
+         break;
+     case 5:
++      serial_get_token();
+         ret = s->lsr;
+         break;
+     case 6:
++      serial_get_token();
+         if (s->mcr & UART_MCR_LOOP) {
+             /* in loopback, the modem output pins are connected to the
+                inputs */
+@@ -296,12 +362,14 @@ static void serial_receive1(void *opaque
+ static void serial_receive1(void *opaque, const uint8_t *buf, int size)
+ {
+     SerialState *s = opaque;
++    tokens_avail = TOKENS_MAX;
+     serial_receive_byte(s, buf[0]);
+ }
+ 
+ static void serial_event(void *opaque, int event)
+ {
+     SerialState *s = opaque;
++    tokens_avail = TOKENS_MAX;
+     if (event == CHR_EVENT_BREAK)
+         serial_receive_break(s);
+ }
diff -r 2c29a2e42937 -r 55ff34dceb0b 
tools/ioemu/patches/vnc-listen-specific-interface
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/vnc-listen-specific-interface Tue Oct 24 14:48:06 
2006 +0100
@@ -0,0 +1,177 @@
+# HG changeset patch
+# User Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
+# Node ID a95dfbc8dca8ecddcb9be51d78f446b0fa461892
+# Parent  8959876abbe319963974fab21dda7185e0ad84e6
+[HVM/vncserver] Implement a 'vnclisten' option to limit the interface
+that the VNC server from qemu listens on. 
+
+Defaults to only listen on 127.0.0.1
+
+The old behaviour (listen on all interfaces) can be restored, by
+- changing the system-wide default in /etc/xen/xend-config.sxp by adding:
+(vnc-listen '0.0.0.0')
+- changing individual domain config files by adding:
+vnclisten="0.0.0.0"
+
+Also allows specifying the hostname associated with an interface to limit
+to that interface.
+
+Signed-off-by:  Daniel P. Berrange <berrange@xxxxxxxxxx>
+
+Index: ioemu/vl.c
+===================================================================
+--- ioemu.orig/vl.c    2006-10-24 14:33:46.000000000 +0100
++++ ioemu/vl.c 2006-10-24 14:34:28.000000000 +0100
+@@ -122,6 +122,7 @@
+ int nographic;
+ int vncviewer;
+ int vncunused;
++struct sockaddr_in vnclisten_addr;
+ const char* keyboard_layout = NULL;
+ int64_t ticks_per_sec;
+ int boot_device = 'c';
+@@ -2777,10 +2778,22 @@
+     return -1;
+ }
+ 
++int parse_host(struct sockaddr_in *saddr, const char *buf)
++{
++    struct hostent *he;
++
++    if ((he = gethostbyname(buf)) != NULL) {
++        saddr->sin_addr = *(struct in_addr *)he->h_addr;
++    } else {
++        if (!inet_aton(buf, &saddr->sin_addr))
++            return -1;
++    }
++    return 0;
++}
++
+ int parse_host_port(struct sockaddr_in *saddr, const char *str)
+ {
+     char buf[512];
+-    struct hostent *he;
+     const char *p, *r;
+     int port;
+ 
+@@ -2791,14 +2804,8 @@
+     if (buf[0] == '\0') {
+         saddr->sin_addr.s_addr = 0;
+     } else {
+-        if (isdigit(buf[0])) {
+-            if (!inet_aton(buf, &saddr->sin_addr))
+-                return -1;
+-        } else {
+-            if ((he = gethostbyname(buf)) == NULL)
+-                return - 1;
+-            saddr->sin_addr = *(struct in_addr *)he->h_addr;
+-        }
++        if (parse_host(saddr, buf) == -1)
++            return -1;
+     }
+     port = strtol(p, (char **)&r, 0);
+     if (r == p)
+@@ -5344,6 +5351,7 @@
+          "-vnc display    start a VNC server on display\n"
+            "-vncviewer      start a vncviewer process for this domain\n"
+            "-vncunused      bind the VNC server to an unused port\n"
++           "-vnclisten      bind the VNC server to this address\n"
+            "-timeoffset     time offset (in seconds) from local time\n"
+            "-acpi           disable or enable ACPI of HVM domain \n"
+            "\n"
+@@ -5434,6 +5442,7 @@
+     QEMU_OPTION_acpi,
+     QEMU_OPTION_vncviewer,
+     QEMU_OPTION_vncunused,
++    QEMU_OPTION_vnclisten,
+ };
+ 
+ typedef struct QEMUOption {
+@@ -5510,6 +5519,7 @@
+     { "vnc", HAS_ARG, QEMU_OPTION_vnc },
+     { "vncviewer", 0, QEMU_OPTION_vncviewer },
+     { "vncunused", 0, QEMU_OPTION_vncunused },
++    { "vnclisten", HAS_ARG, QEMU_OPTION_vnclisten },
+     
+     /* temporary options */
+     { "usb", 0, QEMU_OPTION_usb },
+@@ -5905,6 +5915,8 @@
+ 
+     nb_nics = 0;
+     /* default mac address of the first network interface */
++
++    memset(&vnclisten_addr.sin_addr, 0, sizeof(vnclisten_addr.sin_addr));
+     
+     /* init debug */
+     sprintf(qemu_dm_logfilename, "/var/log/xen/qemu-dm.%d.log", getpid());
+@@ -6280,6 +6292,9 @@
+                 if (vnc_display == -1)
+                     vnc_display = 0;
+                 break;
++            case QEMU_OPTION_vnclisten:
++                parse_host(&vnclisten_addr, optarg);
++                break;
+             }
+         }
+     }
+@@ -6493,7 +6508,7 @@
+     if (nographic) {
+         dumb_display_init(ds);
+     } else if (vnc_display != -1) {
+-      vnc_display = vnc_display_init(ds, vnc_display, vncunused);
++      vnc_display = vnc_display_init(ds, vnc_display, vncunused, 
&vnclisten_addr);
+       if (vncviewer)
+           vnc_start_viewer(vnc_display);
+     } else {
+Index: ioemu/vl.h
+===================================================================
+--- ioemu.orig/vl.h    2006-10-24 14:33:46.000000000 +0100
++++ ioemu/vl.h 2006-10-24 14:34:22.000000000 +0100
+@@ -37,6 +37,8 @@
+ #include <unistd.h>
+ #include <fcntl.h>
+ #include <sys/stat.h>
++#include <sys/socket.h>
++#include <sys/types.h>
+ #include "xenctrl.h"
+ #include "xs.h"
+ #include <xen/hvm/e820.h>
+@@ -785,7 +787,7 @@
+ void cocoa_display_init(DisplayState *ds, int full_screen);
+ 
+ /* vnc.c */
+-int vnc_display_init(DisplayState *ds, int display, int find_unused);
++int vnc_display_init(DisplayState *ds, int display, int find_unused, struct 
sockaddr_in *addr);
+ int vnc_start_viewer(int port);
+ 
+ /* ide.c */
+Index: ioemu/vnc.c
+===================================================================
+--- ioemu.orig/vnc.c   2006-10-24 14:33:46.000000000 +0100
++++ ioemu/vnc.c        2006-10-24 14:34:22.000000000 +0100
+@@ -1195,9 +1195,8 @@
+     }
+ }
+ 
+-int vnc_display_init(DisplayState *ds, int display, int find_unused)
++int vnc_display_init(DisplayState *ds, int display, int find_unused, struct 
sockaddr_in *addr)
+ {
+-    struct sockaddr_in addr;
+     int reuse_addr, ret;
+     VncState *vs;
+ 
+@@ -1235,11 +1234,10 @@
+     }
+ 
+  retry:
+-    addr.sin_family = AF_INET;
+-    addr.sin_port = htons(5900 + display);
+-    memset(&addr.sin_addr, 0, sizeof(addr.sin_addr));
++    addr->sin_family = AF_INET;
++    addr->sin_port = htons(5900 + display);
+ 
+-    if (bind(vs->lsock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
++    if (bind(vs->lsock, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) 
== -1) {
+       if (find_unused && errno == EADDRINUSE) {
+           display++;
+           goto retry;
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/vnc-password
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/vnc-password  Tue Oct 24 14:48:06 2006 +0100
@@ -0,0 +1,785 @@
+# HG changeset patch
+# User kfraser@xxxxxxxxxxxxxxxxxxxxx
+# Node ID 02506a7443155611d6bbf03e49fbf193e96d24db
+# Parent  328606e0705f0341bebda14cdd17962e463868e8
+[HVM] Implement password authentication of VNC connections.
+
+The specification is as mentioned at
+http://lists.xensource.com/archives/html/xen-devel/2006-09/msg00666.html
+(However, password came to describe plain text)
+
+The difference is follows.
+- protocol_authtype() without the necessity was deleted.
+- The check on the protocol version was added.
+- And, some small modification.
+
+Signed-off-by: Masami Watanabe <masami.watanabe@xxxxxxxxxxxxxx>
+
+--- ioemu/Makefile.target      Fri Oct 20 09:32:16 2006 +0100
++++ ioemu/Makefile.target      Fri Oct 20 09:50:09 2006 +0100
+@@ -406,6 +406,7 @@ VL_OBJS+=sdl.o
+ VL_OBJS+=sdl.o
+ endif
+ VL_OBJS+=vnc.o
++VL_OBJS+=d3des.o
+ ifdef CONFIG_COCOA
+ VL_OBJS+=cocoa.o
+ COCOA_LIBS=-F/System/Library/Frameworks -framework Cocoa -framework IOKit
+@@ -464,6 +465,9 @@ sdl.o: sdl.c keymaps.c sdl_keysym.h
+       $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $<
+ 
+ vnc.o: vnc.c keymaps.c sdl_keysym.h vnchextile.h
++      $(CC) $(CFLAGS) $(DEFINES) -c -o $@ $<
++
++d3des.o: d3des.c d3des.h
+       $(CC) $(CFLAGS) $(DEFINES) -c -o $@ $<
+ 
+ sdlaudio.o: sdlaudio.c
+--- ioemu/vl.c Fri Oct 20 09:32:16 2006 +0100
++++ ioemu/vl.c Fri Oct 20 09:50:09 2006 +0100
+@@ -170,6 +170,9 @@ time_t timeoffset = 0;
+ 
+ char domain_name[1024] = { 'H','V', 'M', 'X', 'E', 'N', '-'};
+ extern int domid;
++
++char vncpasswd[64];
++unsigned char challenge[AUTHCHALLENGESIZE];
+ 
+ /***********************************************************/
+ /* x86 ISA bus support */
+@@ -5911,6 +5914,7 @@ int main(int argc, char **argv)
+     vncunused = 0;
+     kernel_filename = NULL;
+     kernel_cmdline = "";
++    *vncpasswd = '\0';
+ #ifndef CONFIG_DM
+ #ifdef TARGET_PPC
+     cdrom_index = 1;
+@@ -6559,6 +6563,10 @@ int main(int argc, char **argv)
+ 
+     init_ioports();
+ 
++    /* read vncpasswd from xenstore */
++    if (0 > xenstore_read_vncpasswd(domid))
++        exit(1);
++
+     /* terminal init */
+     if (nographic) {
+         dumb_display_init(ds);
+--- ioemu/vl.h Fri Oct 20 09:32:16 2006 +0100
++++ ioemu/vl.h Fri Oct 20 09:50:09 2006 +0100
+@@ -1211,6 +1211,7 @@ void xenstore_process_event(void *opaque
+ void xenstore_process_event(void *opaque);
+ void xenstore_check_new_media_present(int timeout);
+ void xenstore_write_vncport(int vnc_display);
++int xenstore_read_vncpasswd(int domid);
+ 
+ /* xen_platform.c */
+ void pci_xen_platform_init(PCIBus *bus);
+@@ -1222,4 +1223,7 @@ extern char domain_name[];
+ 
+ void destroy_hvm_domain(void);
+ 
++/* VNC Authentication */
++#define AUTHCHALLENGESIZE 16
++
+ #endif /* VL_H */
+--- ioemu/vnc.c        Fri Oct 20 09:32:16 2006 +0100
++++ ioemu/vnc.c        Fri Oct 20 09:50:09 2006 +0100
+@@ -44,6 +44,7 @@
+ 
+ #include "vnc_keysym.h"
+ #include "keymaps.c"
++#include "d3des.h"
+ 
+ #define XK_MISCELLANY
+ #define XK_LATIN1
+@@ -137,6 +138,9 @@ static void vnc_update_client(void *opaq
+ static void vnc_update_client(void *opaque);
+ static void vnc_client_read(void *opaque);
+ static void framebuffer_set_updated(VncState *vs, int x, int y, int w, int h);
++static int make_challenge(char *random, int size);
++static void set_seed(unsigned int *seedp);
++static void get_random(int len, unsigned char *buf);
+ 
+ #if 0
+ static inline void vnc_set_bit(uint32_t *d, int k)
+@@ -1208,23 +1212,92 @@ static int protocol_client_init(VncState
+     return 0;
+ }
+ 
++static int protocol_response(VncState *vs, char *client_response, size_t len)
++{
++    extern char vncpasswd[64];
++    extern unsigned char challenge[AUTHCHALLENGESIZE];
++    unsigned char cryptchallenge[AUTHCHALLENGESIZE];
++    unsigned char key[8];
++    int passwdlen, i, j;
++
++    memcpy(cryptchallenge, challenge, AUTHCHALLENGESIZE);
++
++    /* Calculate the sent challenge */
++    passwdlen = strlen(vncpasswd);
++    for (i=0; i<8; i++)
++      key[i] = i<passwdlen ? vncpasswd[i] : 0;
++    deskey(key, EN0);
++    for (j = 0; j < AUTHCHALLENGESIZE; j += 8)
++      des(cryptchallenge+j, cryptchallenge+j);
++
++    /* Check the actual response */
++    if (memcmp(cryptchallenge, client_response, AUTHCHALLENGESIZE) != 0) {
++      /* password error */
++      vnc_write_u32(vs, 1);
++      vnc_write_u32(vs, 22);
++      vnc_write(vs, "Authentication failure", 22);
++      vnc_flush(vs);
++      fprintf(stderr, "VNC Password error.\n");
++      vnc_client_error(vs);
++      return 0;
++    }
++
++    vnc_write_u32(vs, 0);
++    vnc_flush(vs);
++
++    vnc_read_when(vs, protocol_client_init, 1);
++
++    return 0;
++}
++
+ static int protocol_version(VncState *vs, char *version, size_t len)
+ {
++    extern char vncpasswd[64];
++    extern unsigned char challenge[AUTHCHALLENGESIZE];
+     char local[13];
+-    int maj, min;
++    int  support, maj, min;
+ 
+     memcpy(local, version, 12);
+     local[12] = 0;
+ 
++    /* protocol version check */
+     if (sscanf(local, "RFB %03d.%03d\n", &maj, &min) != 2) {
++      fprintf(stderr, "Protocol version error.\n");
+       vnc_client_error(vs);
+       return 0;
+     }
+ 
+-    vnc_write_u32(vs, 1); /* None */
+-    vnc_flush(vs);
+-
+-    vnc_read_when(vs, protocol_client_init, 1);
++
++    support = 0;
++    if (maj = 3) {
++      if (min == 3 || min ==4) {
++          support = 1;
++      }
++    }
++
++    if (! support) {
++      fprintf(stderr, "Client uses unsupported protocol version %d.%d.\n",
++              maj, min);
++      vnc_client_error(vs);
++      return 0;
++    }
++
++    if (*vncpasswd == '\0') {
++      /* AuthType is None */
++      vnc_write_u32(vs, 1);
++      vnc_flush(vs);
++      vnc_read_when(vs, protocol_client_init, 1);
++    } else {
++      /* AuthType is VncAuth */
++      vnc_write_u32(vs, 2);
++
++      /* Challenge-Responce authentication */
++      /* Send Challenge */
++      make_challenge(challenge, AUTHCHALLENGESIZE);
++      vnc_write(vs, challenge, AUTHCHALLENGESIZE);
++      vnc_flush(vs);
++      vnc_read_when(vs, protocol_response, AUTHCHALLENGESIZE);
++    }
+ 
+     return 0;
+ }
+@@ -1342,3 +1415,32 @@ int vnc_start_viewer(int port)
+       return pid;
+     }
+ }
++
++unsigned int seed;
++
++static int make_challenge(char *random, int size)
++{
++ 
++    set_seed(&seed);
++    get_random(size, random);
++
++    return 0;
++}
++
++static void set_seed(unsigned int *seedp)
++{
++    *seedp += (unsigned int)(time(NULL)+getpid()+getpid()*987654+rand());
++    srand(*seedp);
++
++    return;
++}
++
++static void get_random(int len, unsigned char *buf)
++{
++    int i;
++
++    for (i=0; i<len; i++)
++      buf[i] = (int) (256.0*rand()/(RAND_MAX+1.0));
++
++    return;
++}
+--- ioemu/xenstore.c   Fri Oct 20 09:32:16 2006 +0100
++++ ioemu/xenstore.c   Fri Oct 20 09:50:09 2006 +0100
+@@ -213,3 +213,54 @@ void xenstore_write_vncport(int display)
+     free(portstr);
+     free(buf);
+ }
++
++int xenstore_read_vncpasswd(int domid)
++{
++    extern char vncpasswd[64];
++    char *buf = NULL, *path, *uuid = NULL, *passwd = NULL;
++    unsigned int i, len, rc = 0;
++
++    if (xsh == NULL) {
++      return -1;
++    }
++
++    path = xs_get_domain_path(xsh, domid);
++    if (path == NULL) {
++      fprintf(logfile, "xs_get_domain_path() error. domid %d.\n", domid);
++      return -1;
++    }
++
++    pasprintf(&buf, "%s/vm", path);
++    uuid = xs_read(xsh, XBT_NULL, buf, &len);
++    if (uuid == NULL) {
++      fprintf(logfile, "xs_read(): uuid get error. %s.\n", buf);
++      free(path);
++      return -1;
++    }
++
++    pasprintf(&buf, "%s/vncpasswd", uuid);
++    passwd = xs_read(xsh, XBT_NULL, buf, &len);
++    if (passwd == NULL) {
++      fprintf(logfile, "xs_read(): vncpasswd get error. %s.\n", buf);
++      free(uuid);
++      free(path);
++      return rc;
++    }
++
++    for (i=0; i<len && i<63; i++) {
++      vncpasswd[i] = passwd[i];
++      passwd[i] = '\0';
++    }
++    vncpasswd[len] = '\0';
++    pasprintf(&buf, "%s/vncpasswd", uuid);
++    if (xs_write(xsh, XBT_NULL, buf, passwd, len) == 0) {
++      fprintf(logfile, "xs_write() vncpasswd failed.\n");
++      rc = -1;
++    }
++
++    free(passwd);
++    free(uuid);
++    free(path);
++
++    return rc;
++}
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ ioemu/d3des.c      Fri Oct 20 09:50:09 2006 +0100
+@@ -0,0 +1,434 @@
++/*
++ * This is D3DES (V5.09) by Richard Outerbridge with the double and
++ * triple-length support removed for use in VNC.  Also the bytebit[] array
++ * has been reversed so that the most significant bit in each byte of the
++ * key is ignored, not the least significant.
++ *
++ * These changes are:
++ *  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved.
++ *
++ * This software is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
++ */
++
++/* D3DES (V5.09) -
++ *
++ * A portable, public domain, version of the Data Encryption Standard.
++ *
++ * Written with Symantec's THINK (Lightspeed) C by Richard Outerbridge.
++ * Thanks to: Dan Hoey for his excellent Initial and Inverse permutation
++ * code;  Jim Gillogly & Phil Karn for the DES key schedule code; Dennis
++ * Ferguson, Eric Young and Dana How for comparing notes; and Ray Lau,
++ * for humouring me on.
++ *
++ * Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge.
++ * (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992.
++ */
++
++#include "d3des.h"
++
++static void scrunch(unsigned char *, unsigned long *);
++static void unscrun(unsigned long *, unsigned char *);
++static void desfunc(unsigned long *, unsigned long *);
++static void cookey(unsigned long *);
++
++static unsigned long KnL[32] = { 0L };
++
++static unsigned short bytebit[8]      = {
++      01, 02, 04, 010, 020, 040, 0100, 0200 };
++
++static unsigned long bigbyte[24] = {
++      0x800000L,      0x400000L,      0x200000L,      0x100000L,
++      0x80000L,       0x40000L,       0x20000L,       0x10000L,
++      0x8000L,        0x4000L,        0x2000L,        0x1000L,
++      0x800L,         0x400L,         0x200L,         0x100L,
++      0x80L,          0x40L,          0x20L,          0x10L,
++      0x8L,           0x4L,           0x2L,           0x1L    };
++
++/* Use the key schedule specified in the Standard (ANSI X3.92-1981). */
++
++static unsigned char pc1[56] = {
++      56, 48, 40, 32, 24, 16,  8,      0, 57, 49, 41, 33, 25, 17,
++       9,  1, 58, 50, 42, 34, 26,     18, 10,  2, 59, 51, 43, 35,
++      62, 54, 46, 38, 30, 22, 14,      6, 61, 53, 45, 37, 29, 21,
++      13,  5, 60, 52, 44, 36, 28,     20, 12,  4, 27, 19, 11,  3 };
++
++static unsigned char totrot[16] = {
++      1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 };
++
++static unsigned char pc2[48] = {
++      13, 16, 10, 23,  0,  4,  2, 27, 14,  5, 20,  9,
++      22, 18, 11,  3, 25,  7, 15,  6, 26, 19, 12,  1,
++      40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
++      43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
++
++void deskey(key, edf) /* Thanks to James Gillogly & Phil Karn! */
++unsigned char *key;
++int edf;
++{
++      register int i, j, l, m, n;
++      unsigned char pc1m[56], pcr[56];
++      unsigned long kn[32];
++
++      for ( j = 0; j < 56; j++ ) {
++              l = pc1[j];
++              m = l & 07;
++              pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;
++              }
++      for( i = 0; i < 16; i++ ) {
++              if( edf == DE1 ) m = (15 - i) << 1;
++              else m = i << 1;
++              n = m + 1;
++              kn[m] = kn[n] = 0L;
++              for( j = 0; j < 28; j++ ) {
++                      l = j + totrot[i];
++                      if( l < 28 ) pcr[j] = pc1m[l];
++                      else pcr[j] = pc1m[l - 28];
++                      }
++              for( j = 28; j < 56; j++ ) {
++                  l = j + totrot[i];
++                  if( l < 56 ) pcr[j] = pc1m[l];
++                  else pcr[j] = pc1m[l - 28];
++                  }
++              for( j = 0; j < 24; j++ ) {
++                      if( pcr[pc2[j]] ) kn[m] |= bigbyte[j];
++                      if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j];
++                      }
++              }
++      cookey(kn);
++      return;
++      }
++
++static void cookey(raw1)
++register unsigned long *raw1;
++{
++      register unsigned long *cook, *raw0;
++      unsigned long dough[32];
++      register int i;
++
++      cook = dough;
++      for( i = 0; i < 16; i++, raw1++ ) {
++              raw0 = raw1++;
++              *cook    = (*raw0 & 0x00fc0000L) << 6;
++              *cook   |= (*raw0 & 0x00000fc0L) << 10;
++              *cook   |= (*raw1 & 0x00fc0000L) >> 10;
++              *cook++ |= (*raw1 & 0x00000fc0L) >> 6;
++              *cook    = (*raw0 & 0x0003f000L) << 12;
++              *cook   |= (*raw0 & 0x0000003fL) << 16;
++              *cook   |= (*raw1 & 0x0003f000L) >> 4;
++              *cook++ |= (*raw1 & 0x0000003fL);
++              }
++      usekey(dough);
++      return;
++      }
++
++void cpkey(into)
++register unsigned long *into;
++{
++      register unsigned long *from, *endp;
++
++      from = KnL, endp = &KnL[32];
++      while( from < endp ) *into++ = *from++;
++      return;
++      }
++
++void usekey(from)
++register unsigned long *from;
++{
++      register unsigned long *to, *endp;
++
++      to = KnL, endp = &KnL[32];
++      while( to < endp ) *to++ = *from++;
++      return;
++      }
++
++void des(inblock, outblock)
++unsigned char *inblock, *outblock;
++{
++      unsigned long work[2];
++
++      scrunch(inblock, work);
++      desfunc(work, KnL);
++      unscrun(work, outblock);
++      return;
++      }
++
++static void scrunch(outof, into)
++register unsigned char *outof;
++register unsigned long *into;
++{
++      *into    = (*outof++ & 0xffL) << 24;
++      *into   |= (*outof++ & 0xffL) << 16;
++      *into   |= (*outof++ & 0xffL) << 8;
++      *into++ |= (*outof++ & 0xffL);
++      *into    = (*outof++ & 0xffL) << 24;
++      *into   |= (*outof++ & 0xffL) << 16;
++      *into   |= (*outof++ & 0xffL) << 8;
++      *into   |= (*outof   & 0xffL);
++      return;
++      }
++
++static void unscrun(outof, into)
++register unsigned long *outof;
++register unsigned char *into;
++{
++      *into++ = (unsigned char)((*outof >> 24) & 0xffL);
++      *into++ = (unsigned char)((*outof >> 16) & 0xffL);
++      *into++ = (unsigned char)((*outof >>  8) & 0xffL);
++      *into++ = (unsigned char)(*outof++       & 0xffL);
++      *into++ = (unsigned char)((*outof >> 24) & 0xffL);
++      *into++ = (unsigned char)((*outof >> 16) & 0xffL);
++      *into++ = (unsigned char)((*outof >>  8) & 0xffL);
++      *into   =  (unsigned char)(*outof        & 0xffL);
++      return;
++      }
++
++static unsigned long SP1[64] = {
++      0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
++      0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
++      0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
++      0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
++      0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
++      0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
++      0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
++      0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
++      0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
++      0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
++      0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
++      0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
++      0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
++      0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
++      0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,
++      0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L };
++
++static unsigned long SP2[64] = {
++      0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L,
++      0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L,
++      0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L,
++      0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L,
++      0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L,
++      0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L,
++      0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L,
++      0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L,
++      0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L,
++      0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L,
++      0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L,
++      0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L,
++      0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L,
++      0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L,
++      0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L,
++      0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L };
++
++static unsigned long SP3[64] = {
++      0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L,
++      0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L,
++      0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L,
++      0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L,
++      0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L,
++      0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L,
++      0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L,
++      0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L,
++      0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L,
++      0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L,
++      0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L,
++      0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L,
++      0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L,
++      0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L,
++      0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L,
++      0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L };
++
++static unsigned long SP4[64] = {
++      0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
++      0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L,
++      0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L,
++      0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L,
++      0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L,
++      0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L,
++      0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L,
++      0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L,
++      0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L,
++      0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L,
++      0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
++      0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
++      0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
++      0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
++      0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
++      0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L };
++
++static unsigned long SP5[64] = {
++      0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
++      0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
++      0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
++      0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
++      0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
++      0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
++      0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
++      0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
++      0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
++      0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
++      0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
++      0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
++      0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
++      0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
++      0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
++      0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L };
++
++static unsigned long SP6[64] = {
++      0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
++      0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
++      0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
++      0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
++      0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
++      0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
++      0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
++      0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
++      0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
++      0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
++      0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
++      0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L,
++      0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
++      0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
++      0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
++      0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L };
++
++static unsigned long SP7[64] = {
++      0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
++      0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
++      0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
++      0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
++      0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
++      0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
++      0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
++      0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
++      0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
++      0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
++      0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
++      0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
++      0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
++      0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
++      0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
++      0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L };
++
++static unsigned long SP8[64] = {
++      0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
++      0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
++      0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
++      0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
++      0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
++      0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
++      0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
++      0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
++      0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
++      0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
++      0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
++      0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
++      0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
++      0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
++      0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
++      0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L };
++
++static void desfunc(block, keys)
++register unsigned long *block, *keys;
++{
++      register unsigned long fval, work, right, leftt;
++      register int round;
++
++      leftt = block[0];
++      right = block[1];
++      work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;
++      right ^= work;
++      leftt ^= (work << 4);
++      work = ((leftt >> 16) ^ right) & 0x0000ffffL;
++      right ^= work;
++      leftt ^= (work << 16);
++      work = ((right >> 2) ^ leftt) & 0x33333333L;
++      leftt ^= work;
++      right ^= (work << 2);
++      work = ((right >> 8) ^ leftt) & 0x00ff00ffL;
++      leftt ^= work;
++      right ^= (work << 8);
++      right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;
++      work = (leftt ^ right) & 0xaaaaaaaaL;
++      leftt ^= work;
++      right ^= work;
++      leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;
++
++      for( round = 0; round < 8; round++ ) {
++              work  = (right << 28) | (right >> 4);
++              work ^= *keys++;
++              fval  = SP7[ work                & 0x3fL];
++              fval |= SP5[(work >>  8) & 0x3fL];
++              fval |= SP3[(work >> 16) & 0x3fL];
++              fval |= SP1[(work >> 24) & 0x3fL];
++              work  = right ^ *keys++;
++              fval |= SP8[ work                & 0x3fL];
++              fval |= SP6[(work >>  8) & 0x3fL];
++              fval |= SP4[(work >> 16) & 0x3fL];
++              fval |= SP2[(work >> 24) & 0x3fL];
++              leftt ^= fval;
++              work  = (leftt << 28) | (leftt >> 4);
++              work ^= *keys++;
++              fval  = SP7[ work                & 0x3fL];
++              fval |= SP5[(work >>  8) & 0x3fL];
++              fval |= SP3[(work >> 16) & 0x3fL];
++              fval |= SP1[(work >> 24) & 0x3fL];
++              work  = leftt ^ *keys++;
++              fval |= SP8[ work                & 0x3fL];
++              fval |= SP6[(work >>  8) & 0x3fL];
++              fval |= SP4[(work >> 16) & 0x3fL];
++              fval |= SP2[(work >> 24) & 0x3fL];
++              right ^= fval;
++              }
++
++      right = (right << 31) | (right >> 1);
++      work = (leftt ^ right) & 0xaaaaaaaaL;
++      leftt ^= work;
++      right ^= work;
++      leftt = (leftt << 31) | (leftt >> 1);
++      work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
++      right ^= work;
++      leftt ^= (work << 8);
++      work = ((leftt >> 2) ^ right) & 0x33333333L;
++      right ^= work;
++      leftt ^= (work << 2);
++      work = ((right >> 16) ^ leftt) & 0x0000ffffL;
++      leftt ^= work;
++      right ^= (work << 16);
++      work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
++      leftt ^= work;
++      right ^= (work << 4);
++      *block++ = right;
++      *block = leftt;
++      return;
++      }
++
++/* Validation sets:
++ *
++ * Single-length key, single-length plaintext -
++ * Key          : 0123 4567 89ab cdef
++ * Plain  : 0123 4567 89ab cde7
++ * Cipher : c957 4425 6a5e d31d
++ *
++ * Double-length key, single-length plaintext -
++ * Key          : 0123 4567 89ab cdef fedc ba98 7654 3210
++ * Plain  : 0123 4567 89ab cde7
++ * Cipher : 7f1d 0a77 826b 8aff
++ *
++ * Double-length key, double-length plaintext -
++ * Key          : 0123 4567 89ab cdef fedc ba98 7654 3210
++ * Plain  : 0123 4567 89ab cdef 0123 4567 89ab cdff
++ * Cipher : 27a0 8440 406a df60 278f 47cf 42d6 15d7
++ *
++ * Triple-length key, single-length plaintext -
++ * Key          : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
++ * Plain  : 0123 4567 89ab cde7
++ * Cipher : de0b 7c06 ae5e 0ed5
++ *
++ * Triple-length key, double-length plaintext -
++ * Key          : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
++ * Plain  : 0123 4567 89ab cdef 0123 4567 89ab cdff
++ * Cipher : ad0d 1b30 ac17 cf07 0ed1 1c63 81e4 4de5
++ *
++ * d3des V5.0a rwo 9208.07 18:44 Graven Imagery
++ **********************************************************************/
+--- /dev/null  Thu Jan 01 00:00:00 1970 +0000
++++ ioemu/d3des.h      Fri Oct 20 09:50:09 2006 +0100
+@@ -0,0 +1,51 @@
++/*
++ * This is D3DES (V5.09) by Richard Outerbridge with the double and
++ * triple-length support removed for use in VNC.
++ *
++ * These changes are:
++ *  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved.
++ *
++ * This software is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
++ */
++
++/* d3des.h -
++ *
++ *    Headers and defines for d3des.c
++ *    Graven Imagery, 1992.
++ *
++ * Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge
++ *    (GEnie : OUTER; CIS : [71755,204])
++ */
++
++#define EN0   0       /* MODE == encrypt */
++#define DE1   1       /* MODE == decrypt */
++
++extern void deskey(unsigned char *, int);
++/*                  hexkey[8]     MODE
++ * Sets the internal key register according to the hexadecimal
++ * key contained in the 8 bytes of hexkey, according to the DES,
++ * for encryption or decryption according to MODE.
++ */
++
++extern void usekey(unsigned long *);
++/*                cookedkey[32]
++ * Loads the internal key register with the data in cookedkey.
++ */
++
++extern void cpkey(unsigned long *);
++/*               cookedkey[32]
++ * Copies the contents of the internal key register into the storage
++ * located at &cookedkey[0].
++ */
++
++extern void des(unsigned char *, unsigned char *);
++/*                from[8]           to[8]
++ * Encrypts/Decrypts (according to the key currently loaded in the
++ * internal key register) one block of eight bytes at address 'from'
++ * into the block at address 'to'.  They can be the same.
++ */
++
++/* d3des.h V5.09 rwo 9208.04 15:06 Graven Imagery
++ ********************************************************************/
diff -r 2c29a2e42937 -r 55ff34dceb0b tools/ioemu/patches/vnc-protocol-fixes
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/vnc-protocol-fixes    Tue Oct 24 14:48:06 2006 +0100
@@ -0,0 +1,63 @@
+# HG changeset patch
+# User Steven Smith <ssmith@xxxxxxxxxxxxx>
+# Node ID ca3abb3804f4400b24037a4366cb2ca5e51ed742
+# Parent  7fca81d456b2cb40d4effe2492f7ed1aafd32f52
+[HVM][VNC] Make sure that qemu doesn't go into an infinite loop when
+it receives certain invalid requests from the viewer.
+
+Signed-off-by: Steven Smith <sos22@xxxxxxxxx>
+
+Index: ioemu/vnc.c
+===================================================================
+--- ioemu.orig/vnc.c   2006-10-24 14:28:05.000000000 +0100
++++ ioemu/vnc.c        2006-10-24 14:30:11.000000000 +0100
+@@ -26,6 +26,7 @@
+ 
+ #include "vl.h"
+ #include "qemu_socket.h"
++#include <assert.h>
+ 
+ #define VNC_REFRESH_INTERVAL (1000 / 30)
+ 
+@@ -677,8 +678,10 @@
+           memmove(vs->input.buffer, vs->input.buffer + len,
+                   vs->input.offset - len);
+           vs->input.offset -= len;
+-      } else
++      } else {
++          assert(ret > vs->read_handler_expect);
+           vs->read_handler_expect = ret;
++      }
+     }
+ }
+ 
+@@ -961,8 +964,12 @@
+       if (len == 1)
+           return 4;
+ 
+-      if (len == 4)
+-          return 4 + (read_u16(data, 2) * 4);
++      if (len == 4) {
++          uint16_t v;
++          v = read_u16(data, 2);
++          if (v)
++              return 4 + v * 4;
++      }
+ 
+       limit = read_u16(data, 2);
+       for (i = 0; i < limit; i++) {
+@@ -996,8 +1003,12 @@
+       if (len == 1)
+           return 8;
+ 
+-      if (len == 8)
+-          return 8 + read_u32(data, 4);
++      if (len == 8) {
++          uint32_t v;
++          v = read_u32(data, 4);
++          if (v)
++              return 8 + v;
++      }
+ 
+       client_cut_text(vs, read_u32(data, 4), data + 8);
+       break;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [qemu patches] Update patches upto changeset 11870:29b02d929b7e., Xen patchbot-unstable <=