[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] merge with xen-unstable.hg



# HG changeset patch
# User awilliam@xxxxxxxxxxxx
# Date 1173971063 21600
# Node ID 1584263f9fc50d16cfc5e060e996eb8025de3d31
# Parent  a230a1a167dc5e3a670cdaca0ca20c0ef91d244c
# Parent  809f36b1b68509a637b1fa75c596f1590dd9fbdf
merge with xen-unstable.hg
---
 xen/include/asm-x86/hvm/svm/vmmcall.h                      |   44 ---
 buildconfigs/conf.linux-native/00_xen_to_native            |    2 
 buildconfigs/linux-defconfig_xen0_ia64                     |    2 
 buildconfigs/linux-defconfig_xen0_x86_32                   |    2 
 buildconfigs/linux-defconfig_xen0_x86_64                   |    2 
 buildconfigs/linux-defconfig_xenU_ia64                     |    2 
 buildconfigs/linux-defconfig_xenU_x86_32                   |    2 
 buildconfigs/linux-defconfig_xenU_x86_64                   |    2 
 buildconfigs/linux-defconfig_xen_ia64                      |    2 
 buildconfigs/linux-defconfig_xen_x86_32                    |    2 
 buildconfigs/linux-defconfig_xen_x86_64                    |    2 
 docs/src/user.tex                                          |    5 
 docs/xen-api/todo.tex                                      |   11 
 docs/xen-api/xenapi-datamodel.tex                          |   67 -----
 linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c           |    2 
 linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c           |    4 
 linux-2.6-xen-sparse/drivers/xen/char/mem.c                |    6 
 linux-2.6-xen-sparse/drivers/xen/console/console.c         |    7 
 linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c     |   16 -
 linux-2.6-xen-sparse/drivers/xen/netback/netback.c         |    2 
 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pci.h   |    7 
 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pci.h |    7 
 linux-2.6-xen-sparse/kernel/kexec.c                        |   23 +
 patches/linux-2.6.18/crash-kernel-32-on-64.patch           |    9 
 patches/linux-2.6.18/series                                |    1 
 tools/firmware/Makefile                                    |    6 
 tools/firmware/hvmloader/32bitbios_support.c               |   13 -
 tools/firmware/hvmloader/acpi/acpi2_0.h                    |   60 ++++
 tools/firmware/hvmloader/acpi/build.c                      |   48 ++-
 tools/firmware/hvmloader/hvmloader.c                       |   77 +++--
 tools/firmware/rombios/32bit/tcgbios/tcgbios.c             |   64 +---
 tools/firmware/rombios/32bitgateway.c                      |   29 --
 tools/firmware/rombios/rombios.c                           |    5 
 tools/firmware/rombios/tcgbios.c                           |    6 
 tools/ioemu/hw/usb-hid.c                                   |   47 +++
 tools/ioemu/hw/usb-ohci.c                                  |    2 
 tools/ioemu/hw/usb-uhci.c                                  |   50 +++
 tools/ioemu/hw/usb.c                                       |   40 +++
 tools/ioemu/hw/usb.h                                       |    6 
 tools/ioemu/vl.c                                           |   19 +
 tools/libxc/xc_dom_x86.c                                   |    4 
 tools/libxc/xc_hvm_build.c                                 |    8 
 tools/libxc/xc_linux_restore.c                             |    5 
 tools/libxen/include/xen_vm.h                              |   15 -
 tools/libxen/src/xen_vm.c                                  |   37 --
 tools/libxen/test/test_bindings.c                          |    1 
 tools/python/xen/util/xmlrpclib2.py                        |   12 
 tools/python/xen/xend/XendAPI.py                           |  128 +++++++--
 tools/python/xen/xend/XendCheckpoint.py                    |   23 +
 tools/python/xen/xend/XendConfig.py                        |   11 
 tools/python/xen/xend/XendDomainInfo.py                    |   19 -
 tools/python/xen/xend/XendNode.py                          |   53 +++-
 tools/python/xen/xend/XendVMMetrics.py                     |   70 +++++
 tools/python/xen/xend/image.py                             |    2 
 tools/python/xen/xend/server/SrvDaemon.py                  |    9 
 tools/python/xen/xend/server/vfbif.py                      |    2 
 tools/python/xen/xm/XenAPI.py                              |    2 
 tools/python/xen/xm/addlabel.py                            |    2 
 tools/python/xen/xm/main.py                                |  168 ++++++++++---
 tools/python/xen/xm/shutdown.py                            |   37 ++
 tools/xm-test/tests/destroy/01_destroy_basic_pos.py        |    2 
 tools/xm-test/tests/vtpm/09_vtpm-xapi.py                   |    2 
 tools/xm-test/tests/vtpm/vtpm_utils.py                     |    3 
 xen/arch/ia64/xen/domain.c                                 |    8 
 xen/arch/powerpc/domain.c                                  |    5 
 xen/arch/powerpc/domain_build.c                            |    1 
 xen/arch/x86/domain.c                                      |   35 +-
 xen/arch/x86/domain_build.c                                |    1 
 xen/arch/x86/domctl.c                                      |    2 
 xen/arch/x86/gdbstub.c                                     |   28 --
 xen/arch/x86/hvm/svm/svm.c                                 |   71 -----
 xen/arch/x86/hvm/vlapic.c                                  |    5 
 xen/arch/x86/mm.c                                          |  109 ++++----
 xen/arch/x86/mm/shadow/common.c                            |    6 
 xen/arch/x86/mm/shadow/multi.c                             |    2 
 xen/arch/x86/traps.c                                       |    7 
 xen/arch/x86/x86_64/compat_kexec.S                         |   13 -
 xen/arch/x86/x86_emulate.c                                 |   74 ++++-
 xen/common/domain.c                                        |    2 
 xen/common/domctl.c                                        |   20 -
 xen/common/grant_table.c                                   |    6 
 xen/drivers/char/console.c                                 |   11 
 xen/include/asm-ia64/grant_table.h                         |    3 
 xen/include/asm-powerpc/grant_table.h                      |   13 +
 xen/include/asm-x86/domain.h                               |    3 
 xen/include/asm-x86/grant_table.h                          |   10 
 xen/include/public/arch-x86/xen.h                          |    2 
 xen/include/public/foreign/structs.py                      |    2 
 88 files changed, 1103 insertions(+), 654 deletions(-)

diff -r a230a1a167dc -r 1584263f9fc5 
buildconfigs/conf.linux-native/00_xen_to_native
--- a/buildconfigs/conf.linux-native/00_xen_to_native   Thu Mar 15 09:00:42 
2007 -0600
+++ b/buildconfigs/conf.linux-native/00_xen_to_native   Thu Mar 15 09:04:23 
2007 -0600
@@ -74,8 +74,10 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_XEN_DISABLE_SERIAL is not set
 # CONFIG_XEN_SYSFS is not set
 # CONFIG_XEN_COMPAT_030002_AND_LATER is not set
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 # CONFIG_XEN_COMPAT_030002 is not set
+# CONFIG_XEN_COMPAT_030004 is not set
 # CONFIG_HAVE_ARCH_ALLOC_SKB is not set
 # CONFIG_HAVE_ARCH_DEV_ALLOC_SKB is not set
 # CONFIG_NO_IDLE_HZ is not set
diff -r a230a1a167dc -r 1584263f9fc5 buildconfigs/linux-defconfig_xen0_ia64
--- a/buildconfigs/linux-defconfig_xen0_ia64    Thu Mar 15 09:00:42 2007 -0600
+++ b/buildconfigs/linux-defconfig_xen0_ia64    Thu Mar 15 09:04:23 2007 -0600
@@ -1647,8 +1647,10 @@ CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_SYSFS=y
 CONFIG_XEN_COMPAT_030002_AND_LATER=y
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 CONFIG_XEN_COMPAT_030002=y
+CONFIG_XEN_COMPAT_030004=y
 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
 CONFIG_NO_IDLE_HZ=y
 CONFIG_XEN_DEVMEM=y
diff -r a230a1a167dc -r 1584263f9fc5 buildconfigs/linux-defconfig_xen0_x86_32
--- a/buildconfigs/linux-defconfig_xen0_x86_32  Thu Mar 15 09:00:42 2007 -0600
+++ b/buildconfigs/linux-defconfig_xen0_x86_32  Thu Mar 15 09:04:23 2007 -0600
@@ -1411,8 +1411,10 @@ CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_SYSFS=y
 CONFIG_XEN_COMPAT_030002_AND_LATER=y
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 CONFIG_XEN_COMPAT_030002=y
+CONFIG_XEN_COMPAT_030004=y
 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
 CONFIG_NO_IDLE_HZ=y
 CONFIG_XEN_UTIL=y
diff -r a230a1a167dc -r 1584263f9fc5 buildconfigs/linux-defconfig_xen0_x86_64
--- a/buildconfigs/linux-defconfig_xen0_x86_64  Thu Mar 15 09:00:42 2007 -0600
+++ b/buildconfigs/linux-defconfig_xen0_x86_64  Thu Mar 15 09:04:23 2007 -0600
@@ -1361,8 +1361,10 @@ CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_SYSFS=y
 CONFIG_XEN_COMPAT_030002_AND_LATER=y
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 CONFIG_XEN_COMPAT_030002=y
+CONFIG_XEN_COMPAT_030004=y
 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
 CONFIG_NO_IDLE_HZ=y
 CONFIG_XEN_UTIL=y
diff -r a230a1a167dc -r 1584263f9fc5 buildconfigs/linux-defconfig_xenU_ia64
--- a/buildconfigs/linux-defconfig_xenU_ia64    Thu Mar 15 09:00:42 2007 -0600
+++ b/buildconfigs/linux-defconfig_xenU_ia64    Thu Mar 15 09:04:23 2007 -0600
@@ -1489,8 +1489,10 @@ CONFIG_XEN_KEYBOARD=y
 # CONFIG_XEN_DISABLE_SERIAL is not set
 CONFIG_XEN_SYSFS=y
 CONFIG_XEN_COMPAT_030002_AND_LATER=y
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 CONFIG_XEN_COMPAT_030002=y
+CONFIG_XEN_COMPAT_030004=y
 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
 CONFIG_NO_IDLE_HZ=y
 CONFIG_XEN_DEVMEM=y
diff -r a230a1a167dc -r 1584263f9fc5 buildconfigs/linux-defconfig_xenU_x86_32
--- a/buildconfigs/linux-defconfig_xenU_x86_32  Thu Mar 15 09:00:42 2007 -0600
+++ b/buildconfigs/linux-defconfig_xenU_x86_32  Thu Mar 15 09:04:23 2007 -0600
@@ -920,8 +920,10 @@ CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_SYSFS=y
 CONFIG_XEN_COMPAT_030002_AND_LATER=y
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 CONFIG_XEN_COMPAT_030002=y
+CONFIG_XEN_COMPAT_030004=y
 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
 CONFIG_NO_IDLE_HZ=y
 CONFIG_XEN_UTIL=y
diff -r a230a1a167dc -r 1584263f9fc5 buildconfigs/linux-defconfig_xenU_x86_64
--- a/buildconfigs/linux-defconfig_xenU_x86_64  Thu Mar 15 09:00:42 2007 -0600
+++ b/buildconfigs/linux-defconfig_xenU_x86_64  Thu Mar 15 09:04:23 2007 -0600
@@ -1216,8 +1216,10 @@ CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_SYSFS=y
 CONFIG_XEN_COMPAT_030002_AND_LATER=y
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 CONFIG_XEN_COMPAT_030002=y
+CONFIG_XEN_COMPAT_030004=y
 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
 CONFIG_NO_IDLE_HZ=y
 CONFIG_XEN_UTIL=y
diff -r a230a1a167dc -r 1584263f9fc5 buildconfigs/linux-defconfig_xen_ia64
--- a/buildconfigs/linux-defconfig_xen_ia64     Thu Mar 15 09:00:42 2007 -0600
+++ b/buildconfigs/linux-defconfig_xen_ia64     Thu Mar 15 09:04:23 2007 -0600
@@ -1648,8 +1648,10 @@ CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_SYSFS=y
 CONFIG_XEN_COMPAT_030002_AND_LATER=y
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 CONFIG_XEN_COMPAT_030002=y
+CONFIG_XEN_COMPAT_030004=y
 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
 CONFIG_NO_IDLE_HZ=y
 CONFIG_XEN_DEVMEM=y
diff -r a230a1a167dc -r 1584263f9fc5 buildconfigs/linux-defconfig_xen_x86_32
--- a/buildconfigs/linux-defconfig_xen_x86_32   Thu Mar 15 09:00:42 2007 -0600
+++ b/buildconfigs/linux-defconfig_xen_x86_32   Thu Mar 15 09:04:23 2007 -0600
@@ -3271,8 +3271,10 @@ CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_SYSFS=y
 CONFIG_XEN_COMPAT_030002_AND_LATER=y
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 CONFIG_XEN_COMPAT_030002=y
+CONFIG_XEN_COMPAT_030004=y
 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
 CONFIG_NO_IDLE_HZ=y
 CONFIG_XEN_UTIL=y
diff -r a230a1a167dc -r 1584263f9fc5 buildconfigs/linux-defconfig_xen_x86_64
--- a/buildconfigs/linux-defconfig_xen_x86_64   Thu Mar 15 09:00:42 2007 -0600
+++ b/buildconfigs/linux-defconfig_xen_x86_64   Thu Mar 15 09:04:23 2007 -0600
@@ -3101,8 +3101,10 @@ CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_DISABLE_SERIAL=y
 CONFIG_XEN_SYSFS=y
 CONFIG_XEN_COMPAT_030002_AND_LATER=y
+# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
 # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
 CONFIG_XEN_COMPAT_030002=y
+CONFIG_XEN_COMPAT_030004=y
 CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
 CONFIG_NO_IDLE_HZ=y
 CONFIG_XEN_UTIL=y
diff -r a230a1a167dc -r 1584263f9fc5 docs/src/user.tex
--- a/docs/src/user.tex Thu Mar 15 09:00:42 2007 -0600
+++ b/docs/src/user.tex Thu Mar 15 09:04:23 2007 -0600
@@ -3179,6 +3179,11 @@ editing \path{grub.conf}.
   one of 80x25, 80x28, 80x30, 80x34, 80x43, 80x50, 80x60.
   \item[ keep ] Keep the VGA console even after domain 0 boots.
   \end{description}
+\item [ console\_to\_ring ] Place guest console output into the
+  hypervisor console ring buffer. This is disabled by default.
+  When enabled, both hypervisor output and guest console output
+  is available from the ring buffer. This can be useful for logging
+  and/or remote presentation of console data.
 \item [ sync\_console ] Force synchronous console output. This is
   useful if you system fails unexpectedly before it has sent all
   available output to the console. In most cases Xen will
diff -r a230a1a167dc -r 1584263f9fc5 docs/xen-api/todo.tex
--- a/docs/xen-api/todo.tex     Thu Mar 15 09:00:42 2007 -0600
+++ b/docs/xen-api/todo.tex     Thu Mar 15 09:04:23 2007 -0600
@@ -91,17 +91,10 @@ same subnet.
 
 \end{itemize}
 
-\item TPM
+\item ACM
 \begin{itemize}
 
-\item Would it not be better to have a class TPM and a member TPMs ((TPM ref)
-Set) containing an array of zero or one references to TPMs? I assume that
-an empty array would make it clear that no TPM is associated with the VM
-instead of encoding its existence into TPM/instance or TPM/backend
-somehow. The current members instance and backend could then be moved into
-the TPM class.
-
-\item Also a Xen system can be running an access control policy where each
+\item A Xen system can be running an access control policy where each
 VM's run-time access to resources is restricted by the label it has been given
 compared to those of the resources. Currently a VM's configuration file may
 contain a line like access\_control[policy='$<$name of the system's
diff -r a230a1a167dc -r 1584263f9fc5 docs/xen-api/xenapi-datamodel.tex
--- a/docs/xen-api/xenapi-datamodel.tex Thu Mar 15 09:00:42 2007 -0600
+++ b/docs/xen-api/xenapi-datamodel.tex Thu Mar 15 09:04:23 2007 -0600
@@ -1039,7 +1039,6 @@ Quals & Field & Type & Description \\
 $\mathit{RW}$ &  {\tt memory/dynamic\_max} & int & Dynamic maximum (bytes) \\
 $\mathit{RW}$ &  {\tt memory/dynamic\_min} & int & Dynamic minimum (bytes) \\
 $\mathit{RW}$ &  {\tt memory/static\_min} & int & Statically-set (i.e. 
absolute) mininum (bytes) \\
-$\mathit{RW}$ &  {\tt VCPUs/policy} & string & the name of the VCPU scheduling 
policy to be applied \\
 $\mathit{RW}$ &  {\tt VCPUs/params} & (string $\rightarrow$ string) Map & 
configuration parameters for the selected VCPU policy \\
 $\mathit{RW}$ &  {\tt VCPUs/max} & int & Max number of VCPUs \\
 $\mathit{RW}$ &  {\tt VCPUs/at\_startup} & int & Boot number of VCPUs \\
@@ -2163,72 +2162,6 @@ Set the memory/static\_min field of the 
 {\tt VM ref } & self & reference to the object \\ \hline 
 
 {\tt int } & value & New value to set \\ \hline 
-
-\end{tabular}
-
-\vspace{0.3cm}
-
- \noindent {\bf Return Type:} 
-{\tt 
-void
-}
-
-
-
-\vspace{0.3cm}
-\vspace{0.3cm}
-\vspace{0.3cm}
-\subsubsection{RPC name:~get\_VCPUs\_policy}
-
-{\bf Overview:} 
-Get the VCPUs/policy field of the given VM.
-
- \noindent {\bf Signature:} 
-\begin{verbatim} string get_VCPUs_policy (session_id s, VM ref 
self)\end{verbatim}
-
-
-\noindent{\bf Arguments:}
-
- 
-\vspace{0.3cm}
-\begin{tabular}{|c|c|p{7cm}|}
- \hline
-{\bf type} & {\bf name} & {\bf description} \\ \hline
-{\tt VM ref } & self & reference to the object \\ \hline 
-
-\end{tabular}
-
-\vspace{0.3cm}
-
- \noindent {\bf Return Type:} 
-{\tt 
-string
-}
-
-
-value of the field
-\vspace{0.3cm}
-\vspace{0.3cm}
-\vspace{0.3cm}
-\subsubsection{RPC name:~set\_VCPUs\_policy}
-
-{\bf Overview:} 
-Set the VCPUs/policy field of the given VM.
-
- \noindent {\bf Signature:} 
-\begin{verbatim} void set_VCPUs_policy (session_id s, VM ref self, string 
value)\end{verbatim}
-
-
-\noindent{\bf Arguments:}
-
- 
-\vspace{0.3cm}
-\begin{tabular}{|c|c|p{7cm}|}
- \hline
-{\bf type} & {\bf name} & {\bf description} \\ \hline
-{\tt VM ref } & self & reference to the object \\ \hline 
-
-{\tt string } & value & New value to set \\ \hline 
 
 \end{tabular}
 
diff -r a230a1a167dc -r 1584263f9fc5 
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c  Thu Mar 15 09:00:42 
2007 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c  Thu Mar 15 09:04:23 
2007 -0600
@@ -1010,7 +1010,7 @@ static void stop_hz_timer(void)
        singleshot.timeout_abs_ns = jiffies_to_st(j);
        singleshot.flags = 0;
        rc = HYPERVISOR_vcpu_op(VCPUOP_set_singleshot_timer, cpu, &singleshot);
-#ifdef XEN_COMPAT_030004
+#ifdef CONFIG_XEN_COMPAT_030004
        if (rc) {
                BUG_ON(rc != -ENOSYS);
                rc = HYPERVISOR_set_timer_op(singleshot.timeout_abs_ns);
diff -r a230a1a167dc -r 1584263f9fc5 
linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c  Thu Mar 15 09:00:42 
2007 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c  Thu Mar 15 09:04:23 
2007 -0600
@@ -299,7 +299,9 @@ static void tap_backend_changed(struct x
         * and disk info to xenstore
         */
        err = xenbus_gather(XBT_NIL, dev->nodename, "info", "%lu", &info, 
-                           NULL);      
+                           NULL);
+       if (XENBUS_EXIST_ERR(err))
+               return;
        if (err) {
                xenbus_dev_error(dev, err, "getting info");
                return;
diff -r a230a1a167dc -r 1584263f9fc5 linux-2.6-xen-sparse/drivers/xen/char/mem.c
--- a/linux-2.6-xen-sparse/drivers/xen/char/mem.c       Thu Mar 15 09:00:42 
2007 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/char/mem.c       Thu Mar 15 09:04:23 
2007 -0600
@@ -27,7 +27,7 @@
 #include <asm/hypervisor.h>
 
 #ifndef ARCH_HAS_VALID_PHYS_ADDR_RANGE
-static inline int valid_phys_addr_range(unsigned long addr, size_t *count)
+static inline int valid_phys_addr_range(unsigned long addr, size_t count)
 {
        return 1;
 }
@@ -44,7 +44,7 @@ static ssize_t read_mem(struct file * fi
        ssize_t read = 0, sz;
        void __iomem *v;
 
-       if (!valid_phys_addr_range(p, &count))
+       if (!valid_phys_addr_range(p, count))
                return -EFAULT;
 
        while (count > 0) {
@@ -95,7 +95,7 @@ static ssize_t write_mem(struct file * f
        ssize_t written = 0, sz;
        void __iomem *v;
 
-       if (!valid_phys_addr_range(p, &count))
+       if (!valid_phys_addr_range(p, count))
                return -EFAULT;
 
        while (count > 0) {
diff -r a230a1a167dc -r 1584263f9fc5 
linux-2.6-xen-sparse/drivers/xen/console/console.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/console.c        Thu Mar 15 
09:00:42 2007 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c        Thu Mar 15 
09:04:23 2007 -0600
@@ -348,8 +348,11 @@ void xencons_rx(char *buf, unsigned len,
 #ifdef CONFIG_MAGIC_SYSRQ
                if (sysrq_enabled) {
                        if (buf[i] == '\x0f') { /* ^O */
-                               sysrq_requested = jiffies;
-                               continue; /* don't print the sysrq key */
+                               if (!sysrq_requested) {
+                                       sysrq_requested = jiffies;
+                                       continue; /* don't print sysrq key */
+                               }
+                               sysrq_requested = 0;
                        } else if (sysrq_requested) {
                                unsigned long sysrq_timeout =
                                        sysrq_requested + HZ*2;
diff -r a230a1a167dc -r 1584263f9fc5 
linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c    Thu Mar 15 
09:00:42 2007 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c    Thu Mar 15 
09:04:23 2007 -0600
@@ -84,7 +84,7 @@ static void post_suspend(int suspend_can
                        pfn_to_mfn(xen_start_info->console.domU.mfn);
        } else {
 #ifdef CONFIG_SMP
-               cpu_initialized_map = cpumask_of_cpu(0);
+               cpu_initialized_map = cpu_online_map;
 #endif
        }
 
@@ -180,20 +180,6 @@ static int take_machine_down(void *p_fas
        time_resume();
        local_irq_enable();
 
-       if (fast_suspend && !suspend_cancelled) {
-               /*
-                * In fast-suspend mode the APs may not be brought back online
-                * when we resume. In that case we do it here.
-                */
-               for_each_online_cpu(cpu) {
-                       if (cpu == 0)
-                               continue;
-                       cpu_set_initialized(cpu);
-                       err = HYPERVISOR_vcpu_op(VCPUOP_up, cpu, NULL);
-                       BUG_ON(err);
-               }
-       }
-
        return suspend_cancelled;
 }
 
diff -r a230a1a167dc -r 1584263f9fc5 
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c        Thu Mar 15 
09:00:42 2007 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c        Thu Mar 15 
09:04:23 2007 -0600
@@ -110,6 +110,7 @@ static unsigned int alloc_index = 0;
 
 static inline unsigned long alloc_mfn(void)
 {
+       BUG_ON(alloc_index == 0);
        return mfn_list[--alloc_index];
 }
 
@@ -552,6 +553,7 @@ static void net_rx_action(unsigned long 
                *(int *)skb->cb = nr_frags;
 
                if (!xen_feature(XENFEAT_auto_translated_physmap) &&
+                   !((netif_t *)netdev_priv(skb->dev))->copying_receiver &&
                    check_mfn(nr_frags + 1)) {
                        /* Memory squeeze? Back off for an arbitrary while. */
                        if ( net_ratelimit() )
diff -r a230a1a167dc -r 1584263f9fc5 
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pci.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pci.h  Thu Mar 15 
09:00:42 2007 -0600
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pci.h  Thu Mar 15 
09:04:23 2007 -0600
@@ -143,11 +143,4 @@ static inline void pci_dma_burst_advice(
 /* generic pci stuff */
 #include <asm-generic/pci.h>
 
-/* On Xen we have to scan all functions since Xen hides bridges from
- * us.  If a bridge is at fn=0 and that slot has a multifunction
- * device, we won't find the additional devices without scanning all
- * functions. */
-#undef pcibios_scan_all_fns
-#define pcibios_scan_all_fns(a, b)     1
-
 #endif /* __i386_PCI_H */
diff -r a230a1a167dc -r 1584263f9fc5 
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pci.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pci.h        Thu Mar 
15 09:00:42 2007 -0600
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pci.h        Thu Mar 
15 09:04:23 2007 -0600
@@ -163,11 +163,4 @@ static inline void pcibios_add_platform_
 #include <asm-generic/pci.h>
 #endif
 
-/* On Xen we have to scan all functions since Xen hides bridges from
- * us.  If a bridge is at fn=0 and that slot has a multifunction
- * device, we won't find the additional devices without scanning all
- * functions. */
-#undef pcibios_scan_all_fns
-#define pcibios_scan_all_fns(a, b)     1
-
 #endif /* __x8664_PCI_H */
diff -r a230a1a167dc -r 1584263f9fc5 linux-2.6-xen-sparse/kernel/kexec.c
--- a/linux-2.6-xen-sparse/kernel/kexec.c       Thu Mar 15 09:00:42 2007 -0600
+++ b/linux-2.6-xen-sparse/kernel/kexec.c       Thu Mar 15 09:04:23 2007 -0600
@@ -330,13 +330,27 @@ static int kimage_is_destination_range(s
        return 0;
 }
 
-static struct page *kimage_alloc_pages(gfp_t gfp_mask, unsigned int order)
+static struct page *kimage_alloc_pages(gfp_t gfp_mask, unsigned int order, 
unsigned long limit)
 {
        struct page *pages;
 
        pages = alloc_pages(gfp_mask, order);
        if (pages) {
                unsigned int count, i;
+#ifdef CONFIG_XEN
+               int address_bits;
+
+               if (limit == ~0UL)
+                       address_bits = BITS_PER_LONG;
+               else
+                       address_bits = long_log2(limit);
+
+               if (xen_create_contiguous_region((unsigned 
long)page_address(pages),
+                                                order, address_bits) < 0) {
+                       __free_pages(pages, order);
+                       return NULL;
+               }
+#endif
                pages->mapping = NULL;
                set_page_private(pages, order);
                count = 1 << order;
@@ -355,6 +369,9 @@ static void kimage_free_pages(struct pag
        count = 1 << order;
        for (i = 0; i < count; i++)
                ClearPageReserved(page + i);
+#ifdef CONFIG_XEN
+       xen_destroy_contiguous_region((unsigned long)page_address(page), order);
+#endif
        __free_pages(page, order);
 }
 
@@ -400,7 +417,7 @@ static struct page *kimage_alloc_normal_
        do {
                unsigned long pfn, epfn, addr, eaddr;
 
-               pages = kimage_alloc_pages(GFP_KERNEL, order);
+               pages = kimage_alloc_pages(GFP_KERNEL, order, 
KEXEC_CONTROL_MEMORY_LIMIT);
                if (!pages)
                        break;
                pfn   = kexec_page_to_pfn(pages);
@@ -709,7 +726,7 @@ static struct page *kimage_alloc_page(st
                kimage_entry_t *old;
 
                /* Allocate a page, if we run out of memory give up */
-               page = kimage_alloc_pages(gfp_mask, 0);
+               page = kimage_alloc_pages(gfp_mask, 0, 
KEXEC_SOURCE_MEMORY_LIMIT);
                if (!page)
                        return NULL;
                /* If the page cannot be used file it away */
diff -r a230a1a167dc -r 1584263f9fc5 
patches/linux-2.6.18/crash-kernel-32-on-64.patch
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/linux-2.6.18/crash-kernel-32-on-64.patch  Thu Mar 15 09:04:23 
2007 -0600
@@ -0,0 +1,11 @@
+--- pristine-linux-2.6.18/include/asm-i386/elf.h       2006-09-20 
04:42:06.000000000 +0100
++++ linux-2.6.18-xen/include/asm-i386/elf.h    2007-03-14 16:42:30.000000000 
+0000
+@@ -36,7 +36,7 @@
+  * This is used to ensure we don't load something for the wrong architecture.
+  */
+ #define elf_check_arch(x) \
+-      (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))
++      (((x)->e_machine == EM_386) || ((x)->e_machine == EM_486) || 
((x)->e_machine == EM_X86_64))
+ 
+ /*
+  * These are used to set parameters in the core dumps.
diff -r a230a1a167dc -r 1584263f9fc5 patches/linux-2.6.18/series
--- a/patches/linux-2.6.18/series       Thu Mar 15 09:00:42 2007 -0600
+++ b/patches/linux-2.6.18/series       Thu Mar 15 09:04:23 2007 -0600
@@ -19,3 +19,4 @@ fixaddr-top.patch
 fixaddr-top.patch
 git-c06cb8b1c4d25e5b4d7a2d7c2462619de1e0dbc4.patch
 softlockup-no-idle-hz.patch
+crash-kernel-32-on-64.patch
diff -r a230a1a167dc -r 1584263f9fc5 tools/firmware/Makefile
--- a/tools/firmware/Makefile   Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/firmware/Makefile   Thu Mar 15 09:04:23 2007 -0600
@@ -14,10 +14,10 @@ SUBDIRS += hvmloader
 
 .PHONY: all
 all:
-       @set -e; if ! `which bcc 1>/dev/null 2>/dev/null`; then \
+       @set -e; if [ $$((`bcc -v 2>&1 | grep version | cut -d' ' -f 3 | awk 
-F. '{ printf "0x%02x%02x%02x", $$1, $$2, $$3}'`)) -lt $$((0x00100e)) ] ; then \
        echo "***********************************************************"; \
-       echo "WARNING: Install dev86 package to build firmware!"; \
-       echo "         (http://www.cix.co.uk/~mayday)"; \
+       echo "Require dev86 package version >= 0.16.14 to build firmware!"; \
+       echo "(visit http://www.cix.co.uk/~mayday for more information)"; \
        echo "***********************************************************"; \
        else \
        for subdir in $(SUBDIRS); do \
diff -r a230a1a167dc -r 1584263f9fc5 
tools/firmware/hvmloader/32bitbios_support.c
--- a/tools/firmware/hvmloader/32bitbios_support.c      Thu Mar 15 09:00:42 
2007 -0600
+++ b/tools/firmware/hvmloader/32bitbios_support.c      Thu Mar 15 09:04:23 
2007 -0600
@@ -45,22 +45,21 @@ static int relocate_elf(unsigned char *e
         return -1;
     }
 
-    for (i = 0; i < ehdr->e_shnum; i++) {
-        if (!(shdr[i]).sh_flags & SHF_ALLOC) {
-            shdr[i].sh_addr = 0;
-            continue;
-        }
+    for (i = 0; i < ehdr->e_shnum; i++)
         shdr[i].sh_addr = (Elf32_Addr)&elfarray[shdr[i].sh_offset];
-    }
 
     for (i = 0; i < ehdr->e_shnum; i++) {
-        if (shdr[i].sh_type == SHT_REL && shdr[i].sh_addr != 0) {
+        if (shdr[i].sh_type == SHT_REL) {
             Elf32_Shdr *targetsec = (Elf32_Shdr *)&(shdr[shdr[i].sh_info]);
             Elf32_Shdr *symtabsec = (Elf32_Shdr *)&(shdr[shdr[i].sh_link]);
             Elf32_Sym  *syms      = (Elf32_Sym *)symtabsec->sh_addr;
             Elf32_Rel  *rels      = (Elf32_Rel *)shdr[i].sh_addr;
             unsigned char *code   = (unsigned char *)targetsec->sh_addr;
             int j;
+
+            /* must not have been stripped */
+            if (shdr[i].sh_size == 0)
+                return -6;
 
             for (j = 0; j < shdr[i].sh_size / sizeof(Elf32_Rel); j++) {
                 int idx           = ELF32_R_SYM(rels[j].r_info);
diff -r a230a1a167dc -r 1584263f9fc5 tools/firmware/hvmloader/acpi/acpi2_0.h
--- a/tools/firmware/hvmloader/acpi/acpi2_0.h   Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/firmware/hvmloader/acpi/acpi2_0.h   Thu Mar 15 09:04:23 2007 -0600
@@ -49,8 +49,8 @@ struct acpi_header {
     uint32_t length;
     uint8_t  revision;
     uint8_t  checksum;
-    uint8_t  oem_id[6];
-    uint8_t  oem_table_id[8];
+    char     oem_id[6];
+    char     oem_table_id[8];
     uint32_t oem_revision;
     uint32_t creator_id;
     uint32_t creator_revision;
@@ -90,7 +90,7 @@ struct acpi_10_rsdp {
 struct acpi_10_rsdp {
     uint64_t signature;
     uint8_t  checksum;
-    uint8_t  oem_id[6];
+    char     oem_id[6];
     uint8_t  reserved;
     uint32_t rsdt_address;
 };
@@ -101,7 +101,7 @@ struct acpi_20_rsdp {
 struct acpi_20_rsdp {
     uint64_t signature;
     uint8_t  checksum;
-    uint8_t  oem_id[6];
+    char     oem_id[6];
     uint8_t  revision;
     uint32_t rsdt_address;
     uint32_t length;
@@ -143,9 +143,9 @@ struct acpi_20_tcpa {
 #define ACPI_2_0_TCPA_LAML_SIZE (64*1024)
 
 /*
- * Fixed ACPI Description Table Structure (FADT).
- */
-struct acpi_20_fadt {
+ * Fixed ACPI Description Table Structure (FADT) in ACPI 1.0.
+ */
+struct acpi_10_fadt {
     struct acpi_header header;
     uint32_t firmware_ctrl;
     uint32_t dsdt;
@@ -185,6 +185,51 @@ struct acpi_20_fadt {
     uint16_t iapc_boot_arch;
     uint8_t  reserved1;
     uint32_t flags;
+};
+
+/*
+ * Fixed ACPI Description Table Structure (FADT).
+ */
+struct acpi_20_fadt {
+    struct acpi_header header;
+    uint32_t firmware_ctrl;
+    uint32_t dsdt;
+    uint8_t  reserved0;
+    uint8_t  preferred_pm_profile;
+    uint16_t sci_int;
+    uint32_t smi_cmd;
+    uint8_t  acpi_enable;
+    uint8_t  acpi_disable;
+    uint8_t  s4bios_req;
+    uint8_t  pstate_cnt;
+    uint32_t pm1a_evt_blk;
+    uint32_t pm1b_evt_blk;
+    uint32_t pm1a_cnt_blk;
+    uint32_t pm1b_cnt_blk;
+    uint32_t pm2_cnt_blk;
+    uint32_t pm_tmr_blk;
+    uint32_t gpe0_blk;
+    uint32_t gpe1_blk;
+    uint8_t  pm1_evt_len;
+    uint8_t  pm1_cnt_len;
+    uint8_t  pm2_cnt_len;
+    uint8_t  pm_tmr_len;
+    uint8_t  gpe0_blk_len;
+    uint8_t  gpe1_blk_len;
+    uint8_t  gpe1_base;
+    uint8_t  cst_cnt;
+    uint16_t p_lvl2_lat;
+    uint16_t p_lvl3_lat;
+    uint16_t flush_size;
+    uint16_t flush_stride;
+    uint8_t  duty_offset;
+    uint8_t  duty_width;
+    uint8_t  day_alrm;
+    uint8_t  mon_alrm;
+    uint8_t  century;
+    uint16_t iapc_boot_arch;
+    uint8_t  reserved1;
+    uint32_t flags;
     struct acpi_20_generic_address reset_reg;
     uint8_t  reset_value;
     uint8_t  reserved2[3];
@@ -345,6 +390,7 @@ struct acpi_20_madt_intsrcovr {
 #define ACPI_2_0_XSDT_REVISION 0x01
 #define ACPI_2_0_TCPA_REVISION 0x02
 #define ACPI_2_0_HPET_REVISION 0x01
+#define ACPI_1_0_FADT_REVISION 0x01
 
 #pragma pack ()
 
diff -r a230a1a167dc -r 1584263f9fc5 tools/firmware/hvmloader/acpi/build.c
--- a/tools/firmware/hvmloader/acpi/build.c     Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/firmware/hvmloader/acpi/build.c     Thu Mar 15 09:04:23 2007 -0600
@@ -22,7 +22,8 @@
 #include "../util.h"
 #include <xen/hvm/e820.h>
 
-#define align16(sz) (((sz) + 15) & ~15)
+#define align16(sz)        (((sz) + 15) & ~15)
+#define fixed_strcpy(d, s) strncpy((d), (s), sizeof(d))
 
 extern struct acpi_20_rsdp Rsdp;
 extern struct acpi_20_rsdt Rsdt;
@@ -57,8 +58,8 @@ int construct_madt(struct acpi_20_madt *
     memset(madt, 0, sizeof(*madt));
     madt->header.signature    = ACPI_2_0_MADT_SIGNATURE;
     madt->header.revision     = ACPI_2_0_MADT_REVISION;
-    strncpy(madt->header.oem_id, ACPI_OEM_ID, 6);
-    strncpy(madt->header.oem_table_id, ACPI_OEM_TABLE_ID, 8);
+    fixed_strcpy(madt->header.oem_id, ACPI_OEM_ID);
+    fixed_strcpy(madt->header.oem_table_id, ACPI_OEM_TABLE_ID);
     madt->header.oem_revision = ACPI_OEM_REVISION;
     madt->header.creator_id   = ACPI_CREATOR_ID;
     madt->header.creator_revision = ACPI_CREATOR_REVISION;
@@ -131,8 +132,8 @@ int construct_hpet(struct acpi_20_hpet *
     memset(hpet, 0, sizeof(*hpet));
     hpet->header.signature    = ACPI_2_0_HPET_SIGNATURE;
     hpet->header.revision     = ACPI_2_0_HPET_REVISION;
-    strncpy(hpet->header.oem_id, ACPI_OEM_ID, 6);
-    strncpy(hpet->header.oem_table_id, ACPI_OEM_TABLE_ID, 8);
+    fixed_strcpy(hpet->header.oem_id, ACPI_OEM_ID);
+    fixed_strcpy(hpet->header.oem_table_id, ACPI_OEM_TABLE_ID);
     hpet->header.oem_revision = ACPI_OEM_REVISION;
     hpet->header.creator_id   = ACPI_CREATOR_ID;
     hpet->header.creator_revision = ACPI_CREATOR_REVISION;
@@ -150,6 +151,7 @@ int construct_processor_objects(uint8_t 
 {
     static const char pdat[13] = { 0x5b, 0x83, 0x0b, 0x50, 0x52 };
     static const char hex[] = "0123456789ABCDEF";
+    static const char pr_scope[] = "\\_PR_";
     unsigned int i, length, nr_cpus = get_vcpu_nr();
     struct acpi_header *hdr;
     uint8_t *p = buf;
@@ -161,8 +163,8 @@ int construct_processor_objects(uint8_t 
     hdr = (struct acpi_header *)p;
     hdr->signature = ASCII32('S','S','D','T');
     hdr->revision  = 2;
-    strncpy(hdr->oem_id, ACPI_OEM_ID, 6);
-    strncpy(hdr->oem_table_id, ACPI_OEM_TABLE_ID, 8);
+    fixed_strcpy(hdr->oem_id, ACPI_OEM_ID);
+    fixed_strcpy(hdr->oem_table_id, ACPI_OEM_TABLE_ID);
     hdr->oem_revision = ACPI_OEM_REVISION;
     hdr->creator_id = ACPI_CREATOR_ID;
     hdr->creator_revision = ACPI_CREATOR_REVISION;
@@ -176,7 +178,7 @@ int construct_processor_objects(uint8_t 
     *p++ = 0x10;
 
     /* PkgLength (includes length bytes!). */
-    length = 1 + 5 + (nr_cpus * sizeof(pdat));
+    length = 1 + strlen(pr_scope) + (nr_cpus * sizeof(pdat));
     if ( length <= 0x3f )
     {
         *p++ = length;
@@ -195,8 +197,8 @@ int construct_processor_objects(uint8_t 
     }
 
     /* NameString */
-    strncpy(p, "\\_PR_", 5);
-    p += 5;
+    strncpy(p, pr_scope, strlen(pr_scope));
+    p += strlen(pr_scope);
 
     /*
      * 3. Processor Objects.
@@ -263,8 +265,8 @@ int construct_secondary_tables(uint8_t *
         tcpa->header.signature = ACPI_2_0_TCPA_SIGNATURE;
         tcpa->header.length    = sizeof(*tcpa);
         tcpa->header.revision  = ACPI_2_0_TCPA_REVISION;
-        strncpy(tcpa->header.oem_id, ACPI_OEM_ID, 6);
-        strncpy(tcpa->header.oem_table_id, ACPI_OEM_TABLE_ID, 8);
+        fixed_strcpy(tcpa->header.oem_id, ACPI_OEM_ID);
+        fixed_strcpy(tcpa->header.oem_table_id, ACPI_OEM_TABLE_ID);
         tcpa->header.oem_revision = ACPI_OEM_REVISION;
         tcpa->header.creator_id   = ACPI_CREATOR_ID;
         tcpa->header.creator_revision = ACPI_CREATOR_REVISION;
@@ -291,6 +293,7 @@ int acpi_build_tables(uint8_t *buf)
     struct acpi_20_rsdt *rsdt;
     struct acpi_20_xsdt *xsdt;
     struct acpi_20_fadt *fadt;
+    struct acpi_10_fadt *fadt_10;
     struct acpi_20_facs *facs;
     unsigned char       *dsdt;
     unsigned long        secondary_tables[16];
@@ -303,6 +306,25 @@ int acpi_build_tables(uint8_t *buf)
     dsdt = (unsigned char *)&buf[offset];
     memcpy(dsdt, &AmlCode, DsdtLen);
     offset += align16(DsdtLen);
+
+    /*
+     * N.B. ACPI 1.0 operating systems may not handle FADT with revision 2
+     * or above properly, notably Windows 2000, which tries to copy FADT
+     * into a 116 bytes buffer thus causing an overflow. The solution is to
+     * link the higher revision FADT with the XSDT only and introduce a
+     * compatible revision 1 FADT that is linked with the RSDT. Refer to:
+     *     http://www.acpi.info/presentations/S01USMOBS169_OS%20new.ppt
+     */
+    fadt_10 = (struct acpi_10_fadt *)&buf[offset];
+    memcpy(fadt_10, &Fadt, sizeof(struct acpi_10_fadt));
+    offset += align16(sizeof(struct acpi_10_fadt));
+    fadt_10->header.length = sizeof(struct acpi_10_fadt);
+    fadt_10->header.revision = ACPI_1_0_FADT_REVISION;
+    fadt_10->dsdt          = (unsigned long)dsdt;
+    fadt_10->firmware_ctrl = (unsigned long)facs;
+    set_checksum(fadt_10,
+                 offsetof(struct acpi_header, checksum),
+                 sizeof(struct acpi_10_fadt));
 
     fadt = (struct acpi_20_fadt *)&buf[offset];
     memcpy(fadt, &Fadt, sizeof(struct acpi_20_fadt));
@@ -330,7 +352,7 @@ int acpi_build_tables(uint8_t *buf)
 
     rsdt = (struct acpi_20_rsdt *)&buf[offset];
     memcpy(rsdt, &Rsdt, sizeof(struct acpi_header));
-    rsdt->entry[0] = (unsigned long)fadt;
+    rsdt->entry[0] = (unsigned long)fadt_10;
     for ( i = 0; secondary_tables[i]; i++ )
         rsdt->entry[i+1] = secondary_tables[i];
     rsdt->header.length = sizeof(struct acpi_header) + (i+1)*sizeof(uint32_t);
diff -r a230a1a167dc -r 1584263f9fc5 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c      Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/firmware/hvmloader/hvmloader.c      Thu Mar 15 09:04:23 2007 -0600
@@ -38,23 +38,53 @@
 #define VMXASSIST_PHYSICAL_ADDRESS    0x000D0000
 #define ROMBIOS_PHYSICAL_ADDRESS      0x000F0000
 
-/* invoke SVM's paged realmode support */
-#define SVM_VMMCALL_RESET_TO_REALMODE 0x80000001
-
-/*
- * C runtime start off
- */
 asm(
     "    .text                       \n"
     "    .globl _start               \n"
     "_start:                         \n"
+    /* C runtime kickoff. */
     "    cld                         \n"
     "    cli                         \n"
+    "    movl $stack_top,%esp        \n"
+    "    movl %esp,%ebp              \n"
+    "    call main                   \n"
+    /* Relocate real-mode trampoline to 0x0. */
+    "    mov  $trampoline_start,%esi \n"
+    "    xor  %edi,%edi              \n"
+    "    mov  $trampoline_end,%ecx   \n"
+    "    sub  %esi,%ecx              \n"
+    "    rep  movsb                  \n"
+    /* Load real-mode compatible segment state (base 0x0000, limit 0xffff). */
     "    lgdt gdt_desr               \n"
-    "    movl $stack_top, %esp       \n"
-    "    movl %esp, %ebp             \n"
-    "    call main                   \n"
-    "    ud2                         \n"
+    "    mov  $0x0010,%ax            \n"
+    "    mov  %ax,%ds                \n"
+    "    mov  %ax,%es                \n"
+    "    mov  %ax,%fs                \n"
+    "    mov  %ax,%gs                \n"
+    "    mov  %ax,%ss                \n"
+    /* Initialise all 32-bit GPRs to zero. */
+    "    xor  %eax,%eax              \n"
+    "    xor  %ebx,%ebx              \n"
+    "    xor  %ecx,%ecx              \n"
+    "    xor  %edx,%edx              \n"
+    "    xor  %esp,%esp              \n"
+    "    xor  %ebp,%ebp              \n"
+    "    xor  %esi,%esi              \n"
+    "    xor  %edi,%edi              \n"
+    /* Enter real mode, reload all segment registers and IDT. */
+    "    ljmp $0x8,$0x0              \n"
+    "trampoline_start: .code16       \n"
+    "    mov  %eax,%cr0              \n"
+    "    ljmp $0,$1f-trampoline_start\n"
+    "1:  mov  %ax,%ds                \n"
+    "    mov  %ax,%es                \n"
+    "    mov  %ax,%fs                \n"
+    "    mov  %ax,%gs                \n"
+    "    mov  %ax,%ss                \n"
+    "    lidt 1f-trampoline_start    \n"
+    "    ljmp $0xf000,$0xfff0        \n"
+    "1:  .word 0x3ff,0,0             \n"
+    "trampoline_end:   .code32       \n"
     "                                \n"
     "gdt_desr:                       \n"
     "    .word gdt_end - gdt - 1     \n"
@@ -63,8 +93,8 @@ asm(
     "    .align 8                    \n"
     "gdt:                            \n"
     "    .quad 0x0000000000000000    \n"
-    "    .quad 0x00CF92000000FFFF    \n"
-    "    .quad 0x00CF9A000000FFFF    \n"
+    "    .quad 0x00009a000000ffff    \n" /* Ring 0 code, base 0 limit 0xffff */
+    "    .quad 0x000092000000ffff    \n" /* Ring 0 data, base 0 limit 0xffff */
     "gdt_end:                        \n"
     "                                \n"
     "    .bss                        \n"
@@ -81,19 +111,6 @@ cirrus_check(void)
 {
     outw(0x3C4, 0x9206);
     return inb(0x3C5) == 0x12;
-}
-
-static int
-vmmcall(int function, int edi, int esi, int edx, int ecx, int ebx)
-{
-    int eax;
-
-    __asm__ __volatile__ (
-        ".byte 0x0F,0x01,0xD9"
-        : "=a" (eax)
-        : "a"(function),
-        "b"(ebx), "c"(ecx), "d"(edx), "D"(edi), "S"(esi) );
-    return eax;
 }
 
 static int
@@ -349,13 +366,7 @@ int main(void)
         ASSERT((ACPI_PHYSICAL_ADDRESS + acpi_sz) <= 0xF0000);
     }
 
-    if ( check_amd() )
-    {
-        /* AMD implies this is SVM */
-        printf("SVM go ...\n");
-        vmmcall(SVM_VMMCALL_RESET_TO_REALMODE, 0, 0, 0, 0, 0);
-    }
-    else
+    if ( !check_amd() )
     {
         printf("Loading VMXAssist ...\n");
         memcpy((void *)VMXASSIST_PHYSICAL_ADDRESS,
@@ -368,7 +379,7 @@ int main(void)
             );
     }
 
-    printf("Failed to invoke ROMBIOS\n");
+    printf("Invoking ROMBIOS ...\n");
     return 0;
 }
 
diff -r a230a1a167dc -r 1584263f9fc5 
tools/firmware/rombios/32bit/tcgbios/tcgbios.c
--- a/tools/firmware/rombios/32bit/tcgbios/tcgbios.c    Thu Mar 15 09:00:42 
2007 -0600
+++ b/tools/firmware/rombios/32bit/tcgbios/tcgbios.c    Thu Mar 15 09:04:23 
2007 -0600
@@ -95,13 +95,15 @@ struct ptti_cust *TCG_CommandList[] = {
 };
 
 /* local function prototypes */
-static void sha1(const unsigned char *data, uint32_t length, unsigned char 
*hash);
+static void sha1(const unsigned char *data, uint32_t length,
+                 unsigned char *hash);
 static uint32_t TCG_ShutdownPreBootInterface(uint32_t ebx);
 static uint32_t HashAll32(struct hai *hai, unsigned char *hash,
                           uint32_t magic, uint32_t ecx, uint32_t edx);
 static uint32_t HashLogExtendEvent32(struct hleei_short *hleei_s,
                                      struct hleeo *hleeo,
-                                     uint32_t magic, uint32_t ecx, uint32_t 
edx);
+                                     uint32_t magic, uint32_t ecx,
+                                     uint32_t edx);
 static uint32_t HashLogEvent32(struct hlei *hlei, struct hleo *hleo,
                                uint32_t ebx, uint32_t ecx, uint32_t edx);
 static uint32_t PassThroughToTPM32(struct pttti *pttti, struct pttto *pttto,
@@ -181,8 +183,7 @@ uint32_t MA_InitTPM(uint16_t startupcode
 }
 
 static
-uint32_t MA_Transmit(unsigned char *cmdbuffer,
-                     unsigned char *respbuffer,
+uint32_t MA_Transmit(unsigned char *cmdbuffer, unsigned char *respbuffer,
                      uint32_t respbufferlen)
 {
        uint32_t rc = 0;
@@ -289,15 +290,14 @@ void tcpa_acpi_init(void)
                uint32_t ctr = 0;
                /* get RSDT from RSDP */
                rsdt   = (struct acpi_20_rsdt *)rsdp->rsdt_address;
-               /* rsdt may be anywhere in 32bit space */
                length = rsdt->header.length;
                off = 36;
                while ((off + 3) < length) {
                        /* try all pointers to structures */
                        tcpa = (struct acpi_20_tcpa *)rsdt->entry[ctr];
                        /* valid TCPA ACPI table ? */
-                       if (ACPI_2_0_TCPA_SIGNATURE == tcpa->header.signature &&
-                           acpi_validate_entry(&tcpa->header) == 0) {
+                       if (ACPI_2_0_TCPA_SIGNATURE == tcpa->header.signature
+                           && acpi_validate_entry(&tcpa->header) == 0) {
                                found = 1;
                                break;
                        }
@@ -311,7 +311,6 @@ void tcpa_acpi_init(void)
                tcpa = 0;
        }
 
-       /* initialize the TCPA part of the EBDA with our data */
        tcpa_acpi.tcpa_ptr = tcpa;
        tcpa_acpi.lasa_last_ptr = 0;
        tcpa_acpi.entry_count = 0;
@@ -748,9 +747,7 @@ void tcpa_measure_post(Bit32u from, Bit3
 }
 
 static
-uint32_t SendCommand32(uint32_t idx,
-                     struct pttto *pttto,
-                     uint32_t size_ptto)
+uint32_t SendCommand32(uint32_t idx, struct pttto *pttto, uint32_t size_ptto)
 {
        uint32_t rc = 0;
        struct pttti *pttti = (struct pttti *)TCG_CommandList[idx];
@@ -796,7 +793,8 @@ uint32_t tcpa_initialize_tpm(uint32_t ph
        uint32_t pttto_size = sizeof(_pttto);
 
        if (rc == 0) {
-               rc = SendCommand32(IDX_CMD_TPM_Startup_0x01, pttto, pttto_size);
+               rc = SendCommand32(IDX_CMD_TPM_Startup_0x01, pttto,
+                                  pttto_size);
        }
 
        if (rc == 0 && physpres != 0) {
@@ -884,11 +882,8 @@ uint32_t _TCG_TPM_Extend(unsigned char *
 
 
 static
-uint32_t HashLogExtendEvent32(struct hleei_short *hleei_s,
-                            struct hleeo *hleeo,
-                            uint32_t magic,
-                            uint32_t ecx,
-                            uint32_t edx)
+uint32_t HashLogExtendEvent32(struct hleei_short *hleei_s, struct hleeo *hleeo,
+                              uint32_t magic, uint32_t ecx, uint32_t edx)
 {
        uint32_t rc = 0;
        uint16_t size;
@@ -978,11 +973,8 @@ uint32_t HashLogExtendEvent32(struct hle
 
 
 static
-uint32_t PassThroughToTPM32(struct pttti *pttti,
-                          struct pttto *pttto,
-                          uint32_t magic,
-                          uint32_t ecx,
-                          uint32_t edx)
+uint32_t PassThroughToTPM32(struct pttti *pttti, struct pttto *pttto,
+                            uint32_t magic, uint32_t ecx, uint32_t edx)
 {
        uint32_t rc = 0;
        uint8_t *cmd32;
@@ -1047,9 +1039,7 @@ uint32_t TCG_ShutdownPreBootInterface(ui
 
 static
 uint32_t HashLogEvent32(struct hlei *hlei, struct hleo *hleo,
-                      uint32_t ebx,
-                      uint32_t ecx,
-                      uint32_t edx)
+                        uint32_t ebx, uint32_t ecx, uint32_t edx)
 {
        uint32_t rc = 0;
        uint16_t size;
@@ -1144,9 +1134,7 @@ uint32_t HashLogEvent32(struct hlei *hle
 
 static
 uint32_t HashAll32(struct hai *hai, unsigned char *hash,
-                 uint32_t magic,
-                 uint32_t ecx,
-                 uint32_t edx)
+                   uint32_t magic, uint32_t ecx, uint32_t edx)
 {
        uint32_t rc = 0;
 
@@ -1187,9 +1175,7 @@ uint32_t HashAll32(struct hai *hai, unsi
 
 static
 uint32_t TSS32(struct ti *ti, struct to *to,
-             uint32_t ebx,
-             uint32_t ecx,
-             uint32_t edx)
+               uint32_t ebx, uint32_t ecx, uint32_t edx)
 {
        uint32_t rc = 0;
        if (TCG_IsShutdownPreBootInterface() == 0) {
@@ -1209,11 +1195,11 @@ uint32_t TSS32(struct ti *ti, struct to 
 
 static
 uint32_t CompactHashLogExtendEvent32(unsigned char *buffer,
-                                   uint32_t info,
-                                   uint32_t magic,
-                                   uint32_t length,
-                                   uint32_t pcrindex,
-                                   uint32_t *edx_ptr)
+                                     uint32_t info,
+                                     uint32_t magic,
+                                     uint32_t length,
+                                     uint32_t pcrindex,
+                                     uint32_t *edx_ptr)
 {
        uint32_t rc = 0;
        struct hleeo hleeo;
@@ -1356,9 +1342,7 @@ void sha1_do(sha1_ctx *ctx, const unsign
 
        /* treat data in 64-byte chunks */
        for (offset = 0; length - offset >= 64; offset += 64) {
-               /* copy into the 'w' array */
                memcpy(w, data32 + offset, 64);
-               /* hash the block in the 'w' array */
                sha1_block((uint32_t *)w, ctx);
                bits += (64 * 8);
        }
@@ -1408,7 +1392,8 @@ void sha1(const unsigned char *data, uin
 }
 
 
-uint32_t TCGInterruptHandler(pushad_regs_t *regs, uint32_t esds, uint32_t 
flags_ptr)
+uint32_t TCGInterruptHandler(pushad_regs_t *regs, uint32_t esds,
+                             uint32_t flags_ptr)
 {
        uint16_t DS = esds >> 16;
        uint16_t ES = esds & 0xffff;
@@ -1435,7 +1420,6 @@ uint32_t TCGInterruptHandler(pushad_regs
                        }
                }
                break;
-
        case 0x01:
                regs->u.r32.eax =
                        HashLogExtendEvent32((struct hleei_short*)
diff -r a230a1a167dc -r 1584263f9fc5 tools/firmware/rombios/32bitgateway.c
--- a/tools/firmware/rombios/32bitgateway.c     Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/firmware/rombios/32bitgateway.c     Thu Mar 15 09:04:23 2007 -0600
@@ -153,26 +153,17 @@ realmode_gdtdesc:                         ;to be used in 
real
 
 switch_to_realmode:
     ; Implementation of switching from protected mode to real mode
-    ; restores all registers and prepares cs, es, ds, ss to be used
-    ; in real mode
+    ; prepares cs, es, ds, ss to be used in real mode
+    ; spills   eax
     START_PM_CODE
 
     ; need to fix up the stack to return in 16 bit mode
     ; currently the 32 bit return address is on the stack
-    push bp                                    ;pop@A1
-    mov bp, sp
-    push eax                                   ;pop@X
-
-    mov eax, [bp]                              ; return address low 16bits
-                                               ; and 'bp' are being moved
-    mov 2[bp], eax
-
-    pop eax                                    ;@X
-    add sp, #2                                 ; adjust stack for 'lost' bytes
-
-    push eax                                   ;pop@1
-    push bx                                    ;pop@2
-    push si                                    ;pop@3
+    pop eax
+    push ax
+
+    push bx                                    ;pop@1
+    push si                                    ;pop@2
 
     call _ebda_ss_offset32                     ; get the offset of the ss
     mov bx, ax                                 ; entry within the ebda.
@@ -229,10 +220,8 @@ switch_to_realmode_goon_2:
 
     sti                                                ; allow interrupts
 
-    pop si                                     ;@3
-    pop bx                                     ;@2
-    pop eax                                    ;@1
-    pop bp                                     ;@A1
+    pop si                                     ;@2
+    pop bx                                     ;@1
 
     ret
 
diff -r a230a1a167dc -r 1584263f9fc5 tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c  Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/firmware/rombios/rombios.c  Thu Mar 15 09:04:23 2007 -0600
@@ -7792,10 +7792,11 @@ ASM_END
 
     bootdrv = (Bit8u)(status>>8);
     bootseg = read_word(ebda_seg,&EbdaData->cdemu.load_segment);
-    /* Canonicalize bootseg:bootip */
 #if BX_TCGBIOS
     tcpa_add_bootdevice((Bit32u)1L, (Bit32u)0L);
 #endif
+
+    /* Canonicalize bootseg:bootip */
     bootip = (bootseg & 0x0fff) << 4;
     bootseg &= 0xf000;
     break;
@@ -7812,8 +7813,6 @@ ASM_END
 #if BX_TCGBIOS
   tcpa_ipl((Bit32u)bootseg);               /* specs: 8.2.3 steps 4 and 5 */
 #endif
-  /* Debugging info */
-  printf("Booting from %x:%x\n", bootseg, bootip);
   
   /* Jump to the boot vector */
 ASM_START
diff -r a230a1a167dc -r 1584263f9fc5 tools/firmware/rombios/tcgbios.c
--- a/tools/firmware/rombios/tcgbios.c  Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/firmware/rombios/tcgbios.c  Thu Mar 15 09:04:23 2007 -0600
@@ -227,6 +227,8 @@ int1a_function32(regs, ES, DS, FLAGS)
   Bit16u ES, DS, FLAGS;
 {
        Bit16u rc;
+
+       BX_DEBUG_INT1A("int1a_32: AX=%04x\n", regs.u.r16.ax);
 
        switch (regs.u.r8.ah) {
        case 0xbb:
@@ -256,8 +258,10 @@ int1a_function32(regs, ES, DS, FLAGS)
                default:
                        SET_CF();
                }
+               break;
        default:
                SET_CF();
                break;
        }
-}
+       BX_DEBUG_INT1A("int1a_32: FLAGS=%04x\n", FLAGS);
+}
diff -r a230a1a167dc -r 1584263f9fc5 tools/ioemu/hw/usb-hid.c
--- a/tools/ioemu/hw/usb-hid.c  Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/ioemu/hw/usb-hid.c  Thu Mar 15 09:04:23 2007 -0600
@@ -517,6 +517,49 @@ static void usb_mouse_handle_destroy(USB
     qemu_free(s);
 }
 
+void usb_mouse_save(QEMUFile *f, void *opaque)
+{
+    USBMouseState *s = (USBMouseState*)opaque;
+
+    qemu_put_be32s(f, &s->dx);
+    qemu_put_be32s(f, &s->dy);
+    qemu_put_be32s(f, &s->dz);
+    qemu_put_be32s(f, &s->buttons_state);
+    qemu_put_be32s(f, &s->x);
+    qemu_put_be32s(f, &s->y);
+    qemu_put_be32s(f, &s->kind);
+    qemu_put_be32s(f, &s->mouse_grabbed);
+    qemu_put_be32s(f, &s->status_changed);
+
+}
+
+int usb_mouse_load(QEMUFile *f, void *opaque, int version_id)
+{
+    USBMouseState *s = (USBMouseState*)opaque;
+
+    if (version_id != 1)
+        return -EINVAL;
+
+    qemu_get_be32s(f, &s->dx);
+    qemu_get_be32s(f, &s->dy);
+    qemu_get_be32s(f, &s->dz);
+    qemu_get_be32s(f, &s->buttons_state);
+    qemu_get_be32s(f, &s->x);
+    qemu_get_be32s(f, &s->y);
+    qemu_get_be32s(f, &s->kind);
+    qemu_get_be32s(f, &s->mouse_grabbed);
+    qemu_get_be32s(f, &s->status_changed);
+
+    if ( s->kind == USB_TABLET) {
+        fprintf(logfile, "usb_mouse_load:add usb_tablet_event.\n");
+        qemu_add_mouse_event_handler(usb_tablet_event, s, 1);
+    } else if ( s->kind == USB_MOUSE) {
+        fprintf(logfile, "usb_mouse_load:add usb_mouse_event.\n");
+        qemu_add_mouse_event_handler(usb_mouse_event, s, 0);
+    }
+}
+
+
 USBDevice *usb_tablet_init(void)
 {
     USBMouseState *s;
@@ -536,6 +579,8 @@ USBDevice *usb_tablet_init(void)
 
     pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet");
 
+    register_savevm("USB tablet dev", 0, 1, usb_mouse_save, usb_mouse_load, s);
+
     return (USBDevice *)s;
 }
 
@@ -558,5 +603,7 @@ USBDevice *usb_mouse_init(void)
 
     pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse");
 
+    register_savevm("USB mouse dev", 0, 1, usb_mouse_save, usb_mouse_load, s);
+
     return (USBDevice *)s;
 }
diff -r a230a1a167dc -r 1584263f9fc5 tools/ioemu/hw/usb-ohci.c
--- a/tools/ioemu/hw/usb-ohci.c Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/ioemu/hw/usb-ohci.c Thu Mar 15 09:04:23 2007 -0600
@@ -1186,5 +1186,7 @@ void usb_ohci_init(struct PCIBus *bus, i
         qemu_register_usb_port(&ohci->rhport[i].port, ohci, i, ohci_attach);
     }
 
+    register_savevm("OHCI USB", 0, 1, generic_pci_save, generic_pci_load, 
ohci);
+
     ohci_reset(ohci);
 }
diff -r a230a1a167dc -r 1584263f9fc5 tools/ioemu/hw/usb-uhci.c
--- a/tools/ioemu/hw/usb-uhci.c Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/ioemu/hw/usb-uhci.c Thu Mar 15 09:04:23 2007 -0600
@@ -658,6 +658,50 @@ static void uhci_map(PCIDevice *pci_dev,
     register_ioport_read(addr, 32, 1, uhci_ioport_readb, s);
 }
 
+void uhci_usb_save(QEMUFile *f, void *opaque)
+{
+    int i;
+    UHCIState *s = (UHCIState*)opaque;
+
+    qemu_put_be16s(f, &s->cmd);
+    qemu_put_be16s(f, &s->status);
+    qemu_put_be16s(f, &s->intr);
+    qemu_put_be16s(f, &s->frnum);
+    qemu_put_be32s(f, &s->fl_base_addr);
+    qemu_put_8s(f, &s->sof_timing);
+    qemu_put_8s(f, &s->status2);
+
+    for(i = 0; i < NB_PORTS; i++) {
+        qemu_put_be16s(f, &s->ports[i].ctrl);
+    }
+
+    qemu_put_timer(f, s->frame_timer);
+}
+
+int uhci_usb_load(QEMUFile *f, void *opaque, int version_id)
+{
+    int i;
+    UHCIState *s = (UHCIState*)opaque;
+
+    if (version_id != 1)
+        return -EINVAL;
+
+    qemu_get_be16s(f, &s->cmd);
+    qemu_get_be16s(f, &s->status);
+    qemu_get_be16s(f, &s->intr);
+    qemu_get_be16s(f, &s->frnum);
+    qemu_get_be32s(f, &s->fl_base_addr);
+    qemu_get_8s(f, &s->sof_timing);
+    qemu_get_8s(f, &s->status2);
+
+    for(i = 0; i < NB_PORTS; i++) {
+        qemu_get_be16s(f, &s->ports[i].ctrl);
+    }
+
+    qemu_get_timer(f, s->frame_timer);
+
+}
+
 void usb_uhci_init(PCIBus *bus, int devfn)
 {
     UHCIState *s;
@@ -693,4 +737,8 @@ void usb_uhci_init(PCIBus *bus, int devf
        to rely on this.  */
     pci_register_io_region(&s->dev, 4, 0x20, 
                            PCI_ADDRESS_SPACE_IO, uhci_map);
-}
+
+    register_savevm("UHCI_usb_pci", 0, 1, generic_pci_save, generic_pci_load, 
s);
+
+    register_savevm("UHCI usb controller", 0, 1, uhci_usb_save, uhci_usb_load, 
s);
+}
diff -r a230a1a167dc -r 1584263f9fc5 tools/ioemu/hw/usb.c
--- a/tools/ioemu/hw/usb.c      Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/ioemu/hw/usb.c      Thu Mar 15 09:04:23 2007 -0600
@@ -191,3 +191,43 @@ int set_usb_string(uint8_t *buf, const c
     }
     return q - buf;
 }
+
+void generic_usb_save(QEMUFile* f, void *opaque)
+{
+    USBDevice *s = (USBDevice*)opaque;
+
+    qemu_put_be32s(f, &s->speed);
+    qemu_put_8s(f, &s->addr);
+    qemu_put_be32s(f, &s->state);
+
+    qemu_put_buffer(f, s->setup_buf, 8);
+    qemu_put_buffer(f, s->data_buf, 1024);
+
+    qemu_put_be32s(f, &s->remote_wakeup);
+    qemu_put_be32s(f, &s->setup_state);
+    qemu_put_be32s(f, &s->setup_len);
+    qemu_put_be32s(f, &s->setup_index);
+
+}
+
+int generic_usb_load(QEMUFile* f, void *opaque, int version_id)
+{
+    USBDevice *s = (USBDevice*)opaque;
+
+    if (version_id != 1)
+        return -EINVAL;
+
+    qemu_get_be32s(f, &s->speed);
+    qemu_get_8s(f, &s->addr);
+    qemu_get_be32s(f, &s->state);
+
+    qemu_get_buffer(f, s->setup_buf, 8);
+    qemu_get_buffer(f, s->data_buf, 1024);
+
+    qemu_get_be32s(f, &s->remote_wakeup);
+    qemu_get_be32s(f, &s->setup_state);
+    qemu_get_be32s(f, &s->setup_len);
+    qemu_get_be32s(f, &s->setup_index);
+
+    return 0;
+}
diff -r a230a1a167dc -r 1584263f9fc5 tools/ioemu/hw/usb.h
--- a/tools/ioemu/hw/usb.h      Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/ioemu/hw/usb.h      Thu Mar 15 09:04:23 2007 -0600
@@ -176,3 +176,9 @@ USBDevice *usb_tablet_init(void);
 
 /* usb-msd.c */
 USBDevice *usb_msd_init(const char *filename);
+
+/* usb.c */
+void generic_usb_save(QEMUFile* f, void *opaque);
+int generic_usb_load(QEMUFile* f, void *opaque, int version_id);
+
+
diff -r a230a1a167dc -r 1584263f9fc5 tools/ioemu/vl.c
--- a/tools/ioemu/vl.c  Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/ioemu/vl.c  Thu Mar 15 09:04:23 2007 -0600
@@ -841,10 +841,22 @@ void qemu_get_timer(QEMUFile *f, QEMUTim
 #ifdef CONFIG_DM
 static void timer_save(QEMUFile *f, void *opaque)
 {
+    /* need timer for save/restoe qemu_timer in usb_uhci */
+    if (cpu_ticks_enabled) {
+        hw_error("cannot save state if virtual timers are running");
+    }
+    qemu_put_be64s(f, &cpu_clock_offset);
 }
 
 static int timer_load(QEMUFile *f, void *opaque, int version_id)
 {
+    if (version_id != 1)
+        return -EINVAL;
+    if (cpu_ticks_enabled) {
+        return -EINVAL;
+    }
+
+    qemu_get_be64s(f, &cpu_clock_offset);
     return 0;
 }
 #else  /* !CONFIG_DM */
@@ -3900,6 +3912,7 @@ static int usb_device_add(const char *de
     const char *p;
     USBDevice *dev;
     USBPort *port;
+    char usb_name[256] = "USB ";
 
     if (!free_usb_ports)
         return -1;
@@ -3936,6 +3949,12 @@ static int usb_device_add(const char *de
     free_usb_ports = port->next;
     port->next = used_usb_ports;
     used_usb_ports = port;
+
+    pstrcpy(usb_name + strlen(usb_name), 
+            sizeof(usb_name) - strlen(usb_name), 
+            devname);
+    register_savevm(usb_name, 0, 1, generic_usb_save, generic_usb_load, dev);
+    
     usb_attach(port, dev);
     return 0;
 }
diff -r a230a1a167dc -r 1584263f9fc5 tools/libxc/xc_dom_x86.c
--- a/tools/libxc/xc_dom_x86.c  Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/libxc/xc_dom_x86.c  Thu Mar 15 09:04:23 2007 -0600
@@ -455,7 +455,7 @@ static int vcpu_x86_32(struct xc_dom_ima
     ctxt->kernel_ss = ctxt->user_regs.ss;
     ctxt->kernel_sp = ctxt->user_regs.esp;
 
-    ctxt->flags = VGCF_in_kernel_X86_32;
+    ctxt->flags = VGCF_in_kernel_X86_32 | VGCF_online_X86_32;
     if ( dom->parms.pae == 2 /* extended_cr3 */ ||
          dom->parms.pae == 3 /* bimodal */ )
         ctxt->vm_assist |= (1UL << VMASST_TYPE_pae_extended_cr3);
@@ -494,7 +494,7 @@ static int vcpu_x86_64(struct xc_dom_ima
     ctxt->kernel_ss = ctxt->user_regs.ss;
     ctxt->kernel_sp = ctxt->user_regs.esp;
 
-    ctxt->flags = VGCF_in_kernel_X86_64;
+    ctxt->flags = VGCF_in_kernel_X86_64 | VGCF_online_X86_64;
     cr3_pfn = xc_dom_p2m_guest(dom, dom->pgtables_seg.pfn);
     ctxt->ctrlreg[3] = xen_pfn_to_cr3_x86_64(cr3_pfn);
     xc_dom_printf("%s: cr3: pfn 0x%" PRIpfn " mfn 0x%" PRIpfn "\n",
diff -r a230a1a167dc -r 1584263f9fc5 tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c        Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/libxc/xc_hvm_build.c        Thu Mar 15 09:04:23 2007 -0600
@@ -302,9 +302,15 @@ static int setup_guest(int xc_handle,
 
     /* Set [er]ip in the way that's right for Xen */
     if ( strstr(caps, "x86_64") )
+    {
         ctxt->c64.user_regs.rip = elf_uval(&elf, elf.ehdr, e_entry); 
+        ctxt->c64.flags = VGCF_online;
+    }
     else
+    {
         ctxt->c32.user_regs.eip = elf_uval(&elf, elf.ehdr, e_entry);
+        ctxt->c32.flags = VGCF_online;
+    }
 
     return 0;
 
@@ -344,7 +350,7 @@ static int xc_hvm_build_internal(int xc_
 
     memset(&launch_domctl, 0, sizeof(launch_domctl));
     launch_domctl.domain = (domid_t)domid;
-    launch_domctl.u.vcpucontext.vcpu   = 0;
+    launch_domctl.u.vcpucontext.vcpu = 0;
     set_xen_guest_handle(launch_domctl.u.vcpucontext.ctxt, &ctxt.c);
     launch_domctl.cmd = XEN_DOMCTL_setvcpucontext;
     rc = xc_domctl(xc_handle, &launch_domctl);
diff -r a230a1a167dc -r 1584263f9fc5 tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c    Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/libxc/xc_linux_restore.c    Thu Mar 15 09:04:23 2007 -0600
@@ -189,6 +189,7 @@ int xc_linux_restore(int xc_handle, int 
 
     uint64_t vcpumap = 1ULL;
     unsigned int max_vcpu_id = 0;
+    int new_ctxt_format = 0;
 
     max_pfn = nr_pfns;
 
@@ -372,6 +373,7 @@ int xc_linux_restore(int xc_handle, int 
         }
 
         if (j == -2) {
+            new_ctxt_format = 1;
             if (!read_exact(io_fd, &max_vcpu_id, sizeof(int)) ||
                 (max_vcpu_id >= 64) ||
                 !read_exact(io_fd, &vcpumap, sizeof(uint64_t))) {
@@ -797,6 +799,9 @@ int xc_linux_restore(int xc_handle, int 
             goto out;
         }
 
+        if ( !new_ctxt_format )
+            ctxt.flags |= VGCF_online;
+
         if (i == 0) {
             /*
              * Uncanonicalise the suspend-record frame number and poke
diff -r a230a1a167dc -r 1584263f9fc5 tools/libxen/include/xen_vm.h
--- a/tools/libxen/include/xen_vm.h     Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/libxen/include/xen_vm.h     Thu Mar 15 09:04:23 2007 -0600
@@ -87,7 +87,6 @@ typedef struct xen_vm_record
     int64_t memory_dynamic_max;
     int64_t memory_dynamic_min;
     int64_t memory_static_min;
-    char *vcpus_policy;
     xen_string_string_map *vcpus_params;
     int64_t vcpus_max;
     int64_t vcpus_at_startup;
@@ -323,13 +322,6 @@ xen_vm_get_memory_static_min(xen_session
 
 
 /**
- * Get the VCPUs/policy field of the given VM.
- */
-extern bool
-xen_vm_get_vcpus_policy(xen_session *session, char **result, xen_vm vm);
-
-
-/**
  * Get the VCPUs/params field of the given VM.
  */
 extern bool
@@ -565,13 +557,6 @@ xen_vm_set_memory_dynamic_min(xen_sessio
  */
 extern bool
 xen_vm_set_memory_static_min(xen_session *session, xen_vm vm, int64_t 
static_min);
-
-
-/**
- * Set the VCPUs/policy field of the given VM.
- */
-extern bool
-xen_vm_set_vcpus_policy(xen_session *session, xen_vm vm, char *policy);
 
 
 /**
diff -r a230a1a167dc -r 1584263f9fc5 tools/libxen/src/xen_vm.c
--- a/tools/libxen/src/xen_vm.c Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/libxen/src/xen_vm.c Thu Mar 15 09:04:23 2007 -0600
@@ -88,9 +88,6 @@ static const struct_member xen_vm_record
         { .key = "memory_static_min",
           .type = &abstract_type_int,
           .offset = offsetof(xen_vm_record, memory_static_min) },
-        { .key = "VCPUs_policy",
-          .type = &abstract_type_string,
-          .offset = offsetof(xen_vm_record, vcpus_policy) },
         { .key = "VCPUs_params",
           .type = &abstract_type_string_string_map,
           .offset = offsetof(xen_vm_record, vcpus_params) },
@@ -191,7 +188,6 @@ xen_vm_record_free(xen_vm_record *record
     free(record->name_description);
     xen_vdi_record_opt_free(record->suspend_vdi);
     xen_host_record_opt_free(record->resident_on);
-    free(record->vcpus_policy);
     xen_string_string_map_free(record->vcpus_params);
     xen_console_record_opt_set_free(record->consoles);
     xen_vif_record_opt_set_free(record->vifs);
@@ -498,23 +494,6 @@ xen_vm_get_memory_static_min(xen_session
 
 
 bool
-xen_vm_get_vcpus_policy(xen_session *session, char **result, xen_vm vm)
-{
-    abstract_value param_values[] =
-        {
-            { .type = &abstract_type_string,
-              .u.string_val = vm }
-        };
-
-    abstract_type result_type = abstract_type_string;
-
-    *result = NULL;
-    XEN_CALL_("VM.get_VCPUs_policy");
-    return session->ok;
-}
-
-
-bool
 xen_vm_get_vcpus_params(xen_session *session, xen_string_string_map **result, 
xen_vm vm)
 {
     abstract_value param_values[] =
@@ -1074,22 +1053,6 @@ xen_vm_set_memory_static_min(xen_session
 
 
 bool
-xen_vm_set_vcpus_policy(xen_session *session, xen_vm vm, char *policy)
-{
-    abstract_value param_values[] =
-        {
-            { .type = &abstract_type_string,
-              .u.string_val = vm },
-            { .type = &abstract_type_string,
-              .u.string_val = policy }
-        };
-
-    xen_call_(session, "VM.set_VCPUs_policy", param_values, 2, NULL, NULL);
-    return session->ok;
-}
-
-
-bool
 xen_vm_set_vcpus_params(xen_session *session, xen_vm vm, xen_string_string_map 
*params)
 {
     abstract_value param_values[] =
diff -r a230a1a167dc -r 1584263f9fc5 tools/libxen/test/test_bindings.c
--- a/tools/libxen/test/test_bindings.c Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/libxen/test/test_bindings.c Thu Mar 15 09:04:23 2007 -0600
@@ -373,7 +373,6 @@ static xen_vm create_new_vm(xen_session 
             .memory_dynamic_max = 256,
             .memory_dynamic_min = 128,
             .memory_static_min = 128,
-            .vcpus_policy = "credit",
             .vcpus_params = vcpus_params,
             .vcpus_max = 4,
             .vcpus_at_startup = 2,
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/util/xmlrpclib2.py
--- a/tools/python/xen/util/xmlrpclib2.py       Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/util/xmlrpclib2.py       Thu Mar 15 09:04:23 2007 -0600
@@ -199,6 +199,18 @@ class TCPXMLRPCServer(SocketServer.Threa
                 response = dispatch_method(method, params)
             else:
                 response = self._dispatch(method, params)
+
+            if self.xenapi and \
+               (response is None or
+                not isinstance(response, dict) or
+                'Status' not in response):
+                log.exception('Internal error handling %s: Invalid result %s',
+                              method, response)
+                response = { "Status": "Failure",
+                             "ErrorDescription":
+                             ['INTERNAL_ERROR',
+                              'Invalid result %s handling %s' %
+                              (response, method)]}
 
             # With either Unicode or normal strings, we can only transmit
             # \t, \n, \r, \u0020-\ud7ff, \ue000-\ufffd, and \u10000-\u10ffff
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xend/XendAPI.py
--- a/tools/python/xen/xend/XendAPI.py  Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xend/XendAPI.py  Thu Mar 15 09:04:23 2007 -0600
@@ -31,6 +31,7 @@ from xen.xend.XendClient import ERROR_IN
 from xen.xend.XendClient import ERROR_INVALID_DOMAIN
 from xen.xend.XendLogging import log
 from xen.xend.XendTask import XendTask
+from xen.xend.XendVMMetrics import XendVMMetrics
 
 from xen.xend.XendAPIConstants import *
 from xen.util.xmlrpclib2 import stringify
@@ -192,6 +193,16 @@ def valid_vm(func):
            _check_ref(XendDomain.instance().is_valid_vm,
                       'VM', func, *args, **kwargs)
 
+def valid_vm_metrics(func):
+    """Decorator to verify if vm_metrics_ref is valid before calling method.
+
+    @param func: function with params: (self, session, vm_metrics_ref, ...)
+    @rtype: callable object
+    """    
+    return lambda *args, **kwargs: \
+           _check_ref(XendVMMetrics.is_valid_vm_metrics,
+                      'VM_metrics', func, *args, **kwargs)
+
 def valid_network(func):
     """Decorator to verify if network_ref is valid before calling method.
 
@@ -400,6 +411,7 @@ class XendAPI(object):
             'host_metrics' : valid_host_metrics,
             'network'      : valid_network,
             'VM'           : valid_vm,
+            'VM_metrics'   : valid_vm_metrics,
             'VBD'          : valid_vbd,
             'VBD_metrics'  : valid_vbd_metrics,
             'VIF'          : valid_vif,
@@ -629,6 +641,7 @@ class XendAPI(object):
     host_attr_ro = ['software_version',
                     'resident_VMs',
                     'host_CPUs',
+                    'cpu_configuration',
                     'metrics',
                     'capabilities',
                     'supported_bootloaders',
@@ -638,6 +651,7 @@ class XendAPI(object):
                     'API_version_vendor_implementation']
     
     host_attr_rw = ['name_label',
+                    'sched_policy',
                     'name_description',
                     'other_config']
 
@@ -647,7 +661,8 @@ class XendAPI(object):
                     ('shutdown', None),
                     ('add_to_other_config', None),
                     ('remove_from_other_config', None),
-                    ('dmesg', 'String')]
+                    ('dmesg', 'String'),
+                    ('get_log', 'String')]
     
     host_funcs = [('get_by_name_label', 'Set(host)')]
 
@@ -700,7 +715,13 @@ class XendAPI(object):
         return xen_api_success(XendNode.instance().get_capabilities())
     def host_get_supported_bootloaders(self, session, host_ref):
         return xen_api_success(['pygrub'])
-
+    def host_get_sched_policy(self, _, host_ref):
+        return xen_api_success(XendNode.instance().get_vcpus_policy())
+    def host_set_sched_policy(self, _, host_ref, policy):
+        return xen_api_todo()
+    def host_get_cpu_configuration(self, _, host_ref):
+        return xen_api_success(XendNode.instance().get_cpu_configuration())
+    
     # object methods
     def host_disable(self, session, host_ref):
         XendDomain.instance().set_allow_new_domains(False)
@@ -717,8 +738,16 @@ class XendAPI(object):
             return xen_api_error(XEND_ERROR_HOST_RUNNING)
         return xen_api_error(XEND_ERROR_UNSUPPORTED)        
 
-    def host_dmesg(self, session, host_ref):
-        return xen_api_success(XendDmesg.instance().info())
+    def host_dmesg(self, session, host_ref, clear):
+        if clear:
+            return xen_api_success(XendDmesg.instance().clear())
+        else:
+            return xen_api_success(XendDmesg.instance().info())
+
+    def host_get_log(self, session, host_ref):
+        log_file = open(XendLogging.getLogFilename())
+        log_buffer = log_file.read()
+        return xen_api_success(log_buffer)
 
     def host_get_record(self, session, host_ref):
         node = XendNode.instance()
@@ -735,9 +764,11 @@ class XendAPI(object):
                   'other_config': node.other_config,
                   'resident_VMs': dom.get_domain_refs(),
                   'host_CPUs': node.get_host_cpu_refs(),
+                  'cpu_configuration': node.get_cpu_configuration(),
                   'metrics': node.host_metrics_uuid,
                   'capabilities': node.get_capabilities(),
-                  'supported_bootloaders': 'pygrub'}
+                  'supported_bootloaders': 'pygrub',
+                  'sched_policy': node.get_vcpus_policy()}
         return xen_api_success(record)
 
     # class methods
@@ -759,7 +790,8 @@ class XendAPI(object):
                         'modelname',
                         'stepping',
                         'flags',
-                        'utilisation']
+                        'utilisation',
+                        'features']
 
     # attributes
     def _host_cpu_get(self, ref, field):
@@ -768,6 +800,8 @@ class XendAPI(object):
 
     def host_cpu_get_host(self, _, ref):
         return xen_api_success(XendNode.instance().uuid)
+    def host_cpu_get_features(self, _, ref):
+        return self._host_cpu_get(ref, 'features')
     def host_cpu_get_number(self, _, ref):
         return self._host_cpu_get(ref, 'number')
     def host_cpu_get_vendor(self, _, ref):
@@ -990,11 +1024,9 @@ class XendAPI(object):
 
     VM_attr_ro = ['power_state',
                   'resident_on',
-                  'memory_actual',
                   'memory_static_max',                  
                   'memory_static_min',
                   'VCPUs_number',
-                  'VCPUs_utilisation',
                   'consoles',
                   'VIFs',
                   'VBDs',
@@ -1002,6 +1034,7 @@ class XendAPI(object):
                   'tools_version',
                   'domid',
                   'is_control_domain',
+                  'metrics'
                   ]
                   
     VM_attr_rw = ['name_label',
@@ -1011,7 +1044,6 @@ class XendAPI(object):
                   'auto_power_on',
                   'memory_dynamic_max',
                   'memory_dynamic_min',
-                  'VCPUs_policy',
                   'VCPUs_params',
                   'actions_after_shutdown',
                   'actions_after_reboot',
@@ -1040,6 +1072,8 @@ class XendAPI(object):
                   ('resume', None),
                   ('add_to_HVM_boot_params', None),
                   ('remove_from_HVM_boot_params', None),
+                  ('add_to_VCPUs_params', None),
+                  ('remove_from_VCPUs_params', None),
                   ('add_to_platform', None),
                   ('remove_from_platform', None),
                   ('add_to_other_config', None),
@@ -1058,7 +1092,6 @@ class XendAPI(object):
         'memory_dynamic_max',
         'memory_dynamic_min',
         'memory_static_min',
-        'VCPUs_policy',
         'VCPUs_params',
         'actions_after_shutdown',
         'actions_after_reboot',
@@ -1096,11 +1129,7 @@ class XendAPI(object):
     
     def VM_get_resident_on(self, session, vm_ref):
         return xen_api_success(XendNode.instance().uuid)
-    
-    def VM_get_memory_actual(self, session, vm_ref):
-        dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
-        return xen_api_todo() # unsupported by xc
-    
+       
     def VM_get_memory_static_max(self, session, vm_ref):
         dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
         return xen_api_success(dom.get_memory_static_max())
@@ -1113,10 +1142,6 @@ class XendAPI(object):
         dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
         return xen_api_success(dom.getVCpuCount())
     
-    def VM_get_VCPUs_utilisation(self, session, vm_ref):
-        dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
-        return xen_api_success(dom.get_vcpus_util())
-    
     def VM_get_VIFs(self, session, vm_ref):
         dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
         return xen_api_success(dom.get_vifs())
@@ -1136,6 +1161,10 @@ class XendAPI(object):
     def VM_get_tools_version(self, session, vm_ref):
         dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
         return dom.get_tools_version()
+
+    def VM_get_metrics(self, _, vm_ref):
+        dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
+        return xen_api_success(dom.get_metrics())
 
     # attributes (rw)
     def VM_get_name_label(self, session, vm_ref):
@@ -1160,11 +1189,7 @@ class XendAPI(object):
 
     def VM_get_memory_dynamic_min(self, session, vm_ref):
         dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
-        return xen_api_success(dom.get_memory_dynamic_min())        
-    
-    def VM_get_VCPUs_policy(self, session, vm_ref):
-        dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
-        return xen_api_success(dom.get_vcpus_policy())
+        return xen_api_success(dom.get_memory_dynamic_min())
     
     def VM_get_VCPUs_params(self, session, vm_ref):
         dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
@@ -1255,13 +1280,24 @@ class XendAPI(object):
         dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
         return xen_api_todo()
     
-    def VM_set_VCPUs_policy(self, session, vm_ref, policy):
-        dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
-        return xen_api_todo()
-    
-    def VM_set_VCPUs_params(self, session, vm_ref, params):
-        dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
-        return xen_api_todo()
+    def VM_set_VCPUs_params(self, session, vm_ref, value):
+        return self.VM_set('vcpus_params', session, vm_ref, value)
+
+    def VM_add_to_VCPUs_params(self, session, vm_ref, key, value):
+        dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
+        if 'vcpus_params' not in dom.info:
+            dom.info['vcpus_params'] = {}
+        dom.info['vcpus_params'][key] = value
+        return self._VM_save(dom)
+
+    def VM_remove_from_VCPUs_params(self, session, vm_ref, key):
+        dom = XendDomain.instance().get_vm_by_uuid(vm_ref)
+        if 'vcpus_params' in dom.info \
+               and key in dom.info['vcpus_params']:
+            del dom.info['vcpus_params'][key]
+            return self._VM_save(dom)
+        else:
+            return xen_api_success_void()
     
     def VM_set_actions_after_shutdown(self, session, vm_ref, action):
         if action not in XEN_API_ON_NORMAL_EXIT:
@@ -1401,11 +1437,8 @@ class XendAPI(object):
             'memory_static_max': xeninfo.get_memory_static_max(),
             'memory_dynamic_min': xeninfo.get_memory_dynamic_min(),
             'memory_dynamic_max': xeninfo.get_memory_dynamic_max(),
-            'memory_actual': xeninfo.get_memory_static_min(),
-            'VCPUs_policy': xeninfo.get_vcpus_policy(),
             'VCPUs_params': xeninfo.get_vcpus_params(),
             'VCPUs_number': xeninfo.getVCpuCount(),
-            'VCPUs_utilisation': xeninfo.get_vcpus_util(),
             'actions_after_shutdown': xeninfo.get_on_shutdown(),
             'actions_after_reboot': xeninfo.get_on_reboot(),
             'actions_after_suspend': xeninfo.get_on_suspend(),
@@ -1480,6 +1513,33 @@ class XendAPI(object):
         return XendTask.log_progress(0, 100, do_vm_func,
                                      "domain_unpause", vm_ref)
 
+    # Xen API: Class VM_metrics
+    # ----------------------------------------------------------------
+
+    VM_metrics_attr_ro = ['memory_actual',
+                           'vcpus_number',
+                           'vcpus_utilisation']
+    VM_metrics_attr_rw = []
+    VM_metrics_methods = []
+
+    def _VM_metrics_get(self, ref):
+        return XendVMMetrics.get_by_uuid(ref)
+
+    def VM_metrics_get_all(self, _):
+        return xen_api_success(XendVMMetrics.get_all())
+
+    def VM_metrics_get_record(self, _, ref):
+        return xen_api_success(self._VM_metrics_get(ref).get_record())
+
+    def VM_metrics_get_memory_actual(self, _, ref):
+        return xen_api_success(self._VM_metrics_get(ref).get_memory_actual())
+
+    def VM_metrics_get_vcpus_number(self, _, ref):
+        return xen_api_success(self._VM_metrics_get(ref).get_vcpus_number())
+
+    def VM_metrics_get_vcpus_utilisation(self, _, ref):
+        return 
xen_api_success(self._VM_metrics_get(ref).get_metrics_get_vcpus_utilisation())
+
     # Xen API: Class VBD
     # ----------------------------------------------------------------
 
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py   Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xend/XendCheckpoint.py   Thu Mar 15 09:04:23 2007 -0600
@@ -9,6 +9,7 @@ import re
 import re
 import string
 import threading
+import fcntl
 from struct import pack, unpack, calcsize
 
 from xen.util.xpopen import xPopen3
@@ -73,13 +74,14 @@ def save(fd, dominfo, network, live, dst
         write_exact(fd, config, "could not write guest state file: config")
 
         image_cfg = dominfo.info.get('image', {})
-        hvm = image_cfg.has_key('hvm')
+        hvm = dominfo.info.is_hvm()
         stdvga = 0
 
         if hvm:
             log.info("save hvm domain")
-            if image_cfg['hvm']['devices']['stdvga'] == 1:
-                stdvga = 1
+            if dominfo.info['platform'].has_key('stdvga'):
+                if dominfo.info['platform']['stdvga'] == 1:
+                    stdvga = 1
 
         # xc_save takes three customization parameters: maxit, max_f, and
         # flags the last controls whether or not save is 'live', while the
@@ -188,11 +190,11 @@ def restore(xd, fd, dominfo = None, paus
 
     # if hvm, pass mem size to calculate the store_mfn
     image_cfg = dominfo.info.get('image', {})
-    is_hvm  = image_cfg.has_key('hvm')
+    is_hvm = dominfo.info.is_hvm()
     if is_hvm:
         hvm  = dominfo.info['memory_static_min']
-        apic = dominfo.info['image']['hvm'].get('apic', 0)
-        pae  = dominfo.info['image']['hvm'].get('pae',  0)
+        apic = dominfo.info['platform'].get('apic', 0)
+        pae  = dominfo.info['platform'].get('pae',  0)
         log.info("restore hvm domain %d, mem=%d, apic=%d, pae=%d",
                  dominfo.domid, hvm, apic, pae)
     else:
@@ -228,6 +230,15 @@ def restore(xd, fd, dominfo = None, paus
         handler = RestoreInputHandler()
 
         forkHelper(cmd, fd, handler.handler, True)
+
+        # We don't want to pass this fd to any other children -- we 
+        # might need to recover ths disk space that backs it.
+        try:
+            flags = fcntl.fcntl(fd, fcntl.F_GETFD)
+            flags |= fcntl.FD_CLOEXEC
+            fcntl.fcntl(fd, fcntl.F_SETFD, flags)
+        except:
+            pass
 
         if handler.store_mfn is None:
             raise XendError('Could not read store MFN')
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xend/XendConfig.py
--- a/tools/python/xen/xend/XendConfig.py       Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xend/XendConfig.py       Thu Mar 15 09:04:23 2007 -0600
@@ -118,11 +118,12 @@ LEGACY_CFG_TO_XENAPI_CFG = reverse_dict(
 LEGACY_CFG_TO_XENAPI_CFG = reverse_dict(XENAPI_CFG_TO_LEGACY_CFG)
 
 # Platform configuration keys.
-XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'device_model', 'display', 'fda',
-                        'fdb', 'keymap', 'isa', 'localtime', 'nographic',
-                        'pae', 'serial', 'sdl', 'soundhw','stdvga', 'usb',
-                        'usbdevice', 'vnc', 'vncconsole', 'vncdisplay',
-                        'vnclisten', 'vncpasswd', 'vncunused', 'xauthority']
+XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'boot', 'device_model', 'display', 
+                        'fda', 'fdb', 'keymap', 'isa', 'localtime',
+                        'nographic', 'pae', 'serial', 'sdl',
+                        'soundhw','stdvga', 'usb', 'usbdevice', 'vnc',
+                        'vncconsole', 'vncdisplay', 'vnclisten',
+                        'vncpasswd', 'vncunused', 'xauthority']
 
 # List of XendConfig configuration keys that have no direct equivalent
 # in the old world.
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xend/XendDomainInfo.py   Thu Mar 15 09:04:23 2007 -0600
@@ -50,6 +50,8 @@ from xen.xend.xenstore.xswatch import xs
 from xen.xend.xenstore.xswatch import xswatch
 from xen.xend.XendConstants import *
 from xen.xend.XendAPIConstants import *
+
+from xen.xend.XendVMMetrics import XendVMMetrics
 
 MIGRATE_TIMEOUT = 30.0
 BOOTLOADER_LOOPBACK_DEVICE = '/dev/xvdp'
@@ -369,6 +371,8 @@ class XendDomainInfo:
             self._augmentInfo(priv)
 
         self._checkName(self.info['name_label'])
+
+        self.metrics = XendVMMetrics(uuid.createString(), self)
             
 
     #
@@ -626,6 +630,10 @@ class XendDomainInfo:
 
         except RuntimeError, exn:
             raise XendError(str(exn))
+
+
+    def getDomInfo(self):
+        return dom_get(self.domid)
 
     #
     # internal functions ... TODO: re-categorised
@@ -2037,15 +2045,6 @@ class XendDomainInfo:
         return self.info.get('memory_dynamic_max', 0)
     def get_memory_dynamic_min(self):
         return self.info.get('memory_dynamic_min', 0)
-
-    def get_vcpus_policy(self):
-        sched_id = xc.sched_id_get()
-        if sched_id == xen.lowlevel.xc.XEN_SCHEDULER_SEDF:
-            return 'sedf'
-        elif sched_id == xen.lowlevel.xc.XEN_SCHEDULER_CREDIT:
-            return 'credit'
-        else:
-            return 'unknown'
     def get_vcpus_params(self):
         if self.getDomid() is None:
             return self.info['vcpus_params']
@@ -2060,6 +2059,8 @@ class XendDomainInfo:
         return self.info.get('pci_bus', '')
     def get_tools_version(self):
         return self.info.get('tools_version', {})
+    def get_metrics(self):
+        return self.metrics.get_uuid();
     
     def get_on_shutdown(self):
         after_shutdown = self.info.get('actions_after_shutdown')
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xend/XendNode.py
--- a/tools/python/xen/xend/XendNode.py Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xend/XendNode.py Thu Mar 15 09:04:23 2007 -0600
@@ -75,6 +75,11 @@ class XendNode:
             self.other_config = {}
             self.cpus = {}
             self.host_metrics_uuid = uuid.createString()
+
+        # put some arbitrary params in other_config as this
+        # is directly exposed via XenAPI
+        self.other_config["xen_pagesize"] = self.xeninfo_dict()["xen_pagesize"]
+        self.other_config["platform_params"] = 
self.xeninfo_dict()["platform_params"]
             
         # load CPU UUIDs
         saved_cpus = self.state_store.load_state('cpu')
@@ -353,13 +358,36 @@ class XendNode:
 
     def xen_version(self):
         info = self.xc.xeninfo()
+
         try:
             from xen import VERSION
-            return {'Xen': '%(xen_major)d.%(xen_minor)d' % info,
+            info = {'Xen': '%(xen_major)d.%(xen_minor)d' % info,
                     'Xend': VERSION}
         except (ImportError, AttributeError):
-            return {'Xen': '%(xen_major)d.%(xen_minor)d' % info,
+            info = {'Xen': '%(xen_major)d.%(xen_minor)d' % info,
                     'Xend': '3.0.3'}
+
+        # Add xend_config_format
+        info.update(self.xendinfo_dict())
+
+        # Add version info about machine
+        info.update(self.nodeinfo_dict())
+
+        # Add specific xen version info
+        xeninfo_dict = self.xeninfo_dict()
+
+        info.update({
+            "xen_major":         xeninfo_dict["xen_major"],
+            "xen_minor":         xeninfo_dict["xen_minor"],
+            "xen_extra":         xeninfo_dict["xen_extra"],
+            "cc_compiler":       xeninfo_dict["cc_compiler"],
+            "cc_compile_by":     xeninfo_dict["cc_compile_by"],
+            "cc_compile_domain": xeninfo_dict["cc_compile_domain"],
+            "cc_compile_date":   xeninfo_dict["cc_compile_date"],
+            "xen_changeset":     xeninfo_dict["xen_changeset"]
+            })
+        
+        return info
 
     def get_name(self):
         return self.name
@@ -415,6 +443,27 @@ class XendNode:
 
         return 0.0
 
+    def get_vcpus_policy(self):
+        sched_id = self.xc.sched_id_get()
+        if sched_id == xen.lowlevel.xc.XEN_SCHEDULER_SEDF:
+            return 'sedf'
+        elif sched_id == xen.lowlevel.xc.XEN_SCHEDULER_CREDIT:
+            return 'credit'
+        else:
+            return 'unknown'
+
+    def get_cpu_configuration(self):
+        phys_info = self.physinfo_dict()
+
+        cpu_info = {
+            "nr_nodes":         phys_info["nr_nodes"],
+            "sockets_per_node": phys_info["sockets_per_node"],
+            "cores_per_socket": phys_info["cores_per_socket"],
+            "threads_per_core": phys_info["threads_per_core"]
+            }
+
+        return cpu_info
+    
     #
     # Network Functions
     #
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xend/XendVMMetrics.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/xend/XendVMMetrics.py    Thu Mar 15 09:04:23 2007 -0600
@@ -0,0 +1,70 @@
+#============================================================================
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#============================================================================
+# Copyright (c) 2006-2007 Xensource Inc.
+#============================================================================
+
+from xen.xend.XendLogging import log
+
+instances = {}
+
+class XendVMMetrics:
+    """VM Metrics."""
+
+    def get_by_uuid(_, uuid):
+        return instances[uuid]
+
+    get_by_uuid = classmethod(get_by_uuid)
+
+    def is_valid_vm_metrics(_, uuid):
+        return uuid in instances
+
+    is_valid_vm_metrics = classmethod(is_valid_vm_metrics)
+
+    def get_all(_):
+        return instances.keys()
+
+    get_all = classmethod(get_all)
+   
+    def __init__(self, uuid, xend_domain_instance):
+        self.uuid = uuid
+        self.xend_domain_instance = xend_domain_instance
+        instances[uuid] = self
+
+    def get_uuid(self):
+        return self.uuid
+
+    def get_memory_actual(self):
+        return self.get_record()["memory_actual"]
+
+    def get_vcpus_number(self):
+        return self.get_record()["vcpus_number"]
+    
+    def get_vcpus_utilisation(self):
+        return self.xend_domain_instance.get_vcpus_util()
+
+    def get_record(self):
+        domInfo = self.xend_domain_instance.getDomInfo()
+        if domInfo:
+            return { 'uuid'              : self.uuid,
+                     'memory_actual'     : domInfo["mem_kb"] * 1024,
+                     'vcpus_number'      : domInfo["online_vcpus"],
+                     'vcpus_utilisation' : self.get_vcpus_utilisation()
+                   }
+        else:
+            return { 'uuid'              : self.uuid,
+                     'memory_actual'     : 0,
+                     'vcpus_number'      : 0,
+                     'vcpus_utilisation' : {}
+                   }
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xend/image.py    Thu Mar 15 09:04:23 2007 -0600
@@ -392,7 +392,7 @@ class HVMImageHandler(ImageHandler):
         # Find RFB console device, and if it exists, make QEMU enable
         # the VNC console.
         #
-        if vmConfig['platform'].get('nographic'):
+        if int(vmConfig['platform'].get('nographic', 0)) != 0:
             # skip vnc init if nographic is set
             ret.append('-nographic')
             return ret
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xend/server/SrvDaemon.py
--- a/tools/python/xen/xend/server/SrvDaemon.py Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xend/server/SrvDaemon.py Thu Mar 15 09:04:23 2007 -0600
@@ -276,9 +276,12 @@ class Daemon:
             if not m:
                 return None
             modulename = m.group(1)
-            if re.search('sxp.py', modulename):
-                return None
-            if re.search('SrvServer.py', modulename):
+            if modulename.endswith('.pyc'):
+                modulename = modulename[:-1]
+            if modulename == 'sxp.py' or \
+               modulename == 'XendLogging.py' or \
+               modulename == 'XendMonitor.py' or \
+               modulename == 'server/SrvServer.py':
                 return None
             self.traceindent += 1
             self.print_trace("> %s:%s\n"
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xend/server/vfbif.py
--- a/tools/python/xen/xend/server/vfbif.py     Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xend/server/vfbif.py     Thu Mar 15 09:04:23 2007 -0600
@@ -46,7 +46,7 @@ class VfbifController(DevController):
 
     def createDevice(self, config):
         DevController.createDevice(self, config)
-        if self.vm.info.get('HVM_boot_policy'):
+        if self.vm.info.is_hvm():
             # is HVM, so qemu-dm will handle the vfb.
             return
         
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xm/XenAPI.py
--- a/tools/python/xen/xm/XenAPI.py     Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xm/XenAPI.py     Thu Mar 15 09:04:23 2007 -0600
@@ -155,7 +155,7 @@ class Session(xen.util.xmlrpclib2.Server
 
 def _parse_result(result):
     if type(result) != dict or 'Status' not in result:
-        raise xmlrpclib.Fault(500, 'Missing Status in response from server' + 
result)
+        raise xmlrpclib.Fault(500, 'Missing Status in response from server: ' 
+ str(result))
     if result['Status'] == 'Success':
         if 'Value' in result:
             return result['Value']
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xm/addlabel.py
--- a/tools/python/xen/xm/addlabel.py   Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xm/addlabel.py   Thu Mar 15 09:04:23 2007 -0600
@@ -17,7 +17,7 @@
 # Author: Bryan D. Payne <bdpayne@xxxxxxxxxx>
 #============================================================================
 
-"""Labeling a domain configuration file or a resoruce.
+"""Labeling a domain configuration file or a resource.
 """
 import os
 import sys
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xm/main.py       Thu Mar 15 09:04:23 2007 -0600
@@ -139,7 +139,7 @@ SUBCOMMAND_HELP = {
                      'Send a trigger to a domain.'),
     'vcpu-list'   : ('[<Domain>]',
                      'List the VCPUs for a domain or all domains.'),
-    'vcpu-pin'    : ('<Domain> <VCPU> <CPUs>',
+    'vcpu-pin'    : ('<Domain> <VCPU> <CPUs|all>',
                      'Set which CPUs a VCPU can use.'),
     'vcpu-set'    : ('<Domain> <vCPUs>',
                      'Set the number of active VCPUs for allowed for the'
@@ -557,7 +557,7 @@ class Shell(cmd.Cmd):
         if serverType == SERVER_XEN_API:
             res = server.xenapi._UNSUPPORTED_list_all_methods()
             for f in res:
-                setattr(Shell, 'do_' + f, self.default)
+                setattr(Shell, 'do_' + f + ' ', self.default)
 
     def preloop(self):
         cmd.Cmd.preloop(self)
@@ -750,11 +750,14 @@ def parse_doms_info(info):
         }
 
 def check_sched_type(sched):
-    current = 'unknown'
-    for x in server.xend.node.info()[1:]:
-        if len(x) > 1 and x[0] == 'xen_scheduler':
-            current = x[1]
-            break
+    if serverType == SERVER_XEN_API:
+        current = 
server.xenapi.host.get_sched_policy(server.xenapi.session.get_this_host())
+    else:
+        current = 'unknown'
+        for x in server.xend.node.info()[1:]:
+            if len(x) > 1 and x[0] == 'xen_scheduler':
+                current = x[1]
+                break
     if sched != current:
         err("Xen is running with the %s scheduler" % current)
         sys.exit(1)
@@ -1084,7 +1087,10 @@ def xm_vcpu_pin(args):
 
     dom  = args[0]
     vcpu = args[1]
-    cpumap = cpu_make_map(args[2])
+    if args[2] == 'all':
+        cpumap = cpu_make_map('0-63')
+    else:
+        cpumap = cpu_make_map(args[2])
     
     server.xend.domain.pincpu(dom, vcpu, cpumap)
 
@@ -1092,49 +1098,69 @@ def xm_mem_max(args):
     arg_check(args, "mem-max", 2)
 
     dom = args[0]
-    mem = int_unit(args[1], 'm')
-
-    server.xend.domain.maxmem_set(dom, mem)
+
+    if serverType == SERVER_XEN_API:
+        mem = int_unit(args[1], 'k') * 1024
+        server.xenapi.VM.set_memory_static_max(get_single_vm(dom), mem)
+    else:
+        mem = int_unit(args[1], 'm')
+        server.xend.domain.maxmem_set(dom, mem)
     
 def xm_mem_set(args):
     arg_check(args, "mem-set", 2)
 
     dom = args[0]
-    mem_target = int_unit(args[1], 'm')
-
-    server.xend.domain.setMemoryTarget(dom, mem_target)
+
+    if serverType == SERVER_XEN_API:
+        mem_target = int_unit(args[1], 'k') * 1024
+        server.xenapi.VM.set_memory_dynamic_max(get_single_vm(dom), mem_target)
+        server.xenapi.VM.set_memory_dynamic_min(get_single_vm(dom), mem_target)
+    else:
+        mem_target = int_unit(args[1], 'm')
+        server.xend.domain.setMemoryTarget(dom, mem_target)
     
 def xm_vcpu_set(args):
     arg_check(args, "vcpu-set", 2)
-    
-    server.xend.domain.setVCpuCount(args[0], int(args[1]))
-
+
+    dom = args[0]
+    vcpus = int(args[1])
+
+    if serverType == SERVER_XEN_API:
+        server.xenapi.VM.set_vcpus_live(get_single_vm(dom), vcpus)
+    else:
+        server.xend.domain.setVCpuCount(dom, vcpus)
 
 def xm_destroy(args):
     arg_check(args, "destroy", 1)
 
     dom = args[0]
+    
     if serverType == SERVER_XEN_API:
         server.xenapi.VM.hard_shutdown(get_single_vm(dom))
     else:
         server.xend.domain.destroy(dom)
 
-
 def xm_domid(args):
     arg_check(args, "domid", 1)
 
     name = args[0]
 
-    dom = server.xend.domain(name)
-    print sxp.child_value(dom, 'domid')
+    if serverType == SERVER_XEN_API:
+        print server.xenapi.VM.get_domid(get_single_vm(name))
+    else:
+        dom = server.xend.domain(name)
+        print sxp.child_value(dom, 'domid')
     
 def xm_domname(args):
     arg_check(args, "domname", 1)
 
     name = args[0]
-
-    dom = server.xend.domain(name)
-    print sxp.child_value(dom, 'name')
+    
+    if serverType == SERVER_XEN_API:
+        print server.xenapi.VM.get_name_label(get_single_vm(name))
+    else:
+        dom = server.xend.domain(name)
+        print sxp.child_value(dom, 'name')
 
 def xm_sched_sedf(args):
     def ns_to_ms(val):
@@ -1282,13 +1308,59 @@ def xm_info(args):
 def xm_info(args):
     arg_check(args, "info", 0)
 
-    info = server.xend.node.info()
-    
-    for x in info[1:]:
-        if len(x) < 2: 
-            print "%-23s: (none)" % x[0]
-        else: 
-            print "%-23s:" % x[0], x[1]
+    if serverType == SERVER_XEN_API:
+
+        # Need to fake out old style xm info as people rely on parsing it
+        
+        host_record = server.xenapi.host.get_record(
+            server.xenapi.session.get_this_host())        
+
+        host_cpu_records = map(server.xenapi.host_cpu.get_record, 
host_record["host_CPUs"])
+
+        host_metrics_record = 
server.xenapi.host_metrics.get_record(host_record["metrics"])
+
+        info = {
+            "host":              host_record["name_label"],
+            "release":           host_record["software_version"]["release"],
+            "version":           host_record["software_version"]["version"],
+            "machine":           host_record["software_version"]["machine"],
+            "nr_cpus":           len(host_record["host_CPUs"]),
+            "nr_nodes":          host_record["cpu_configuration"]["nr_nodes"],
+            "sockets_per_node":  
host_record["cpu_configuration"]["sockets_per_node"],
+            "cores_per_socket":  
host_record["cpu_configuration"]["cores_per_socket"],
+            "threads_per_core":  
host_record["cpu_configuration"]["threads_per_core"],
+            "cpu_mhz":           sum([int(host_cpu_record["speed"]) for 
host_cpu_record in host_cpu_records])
+                                   / len(host_cpu_records),
+            "hw_caps":           host_cpu_records[0]["features"],
+            "total_memory":      
int(host_metrics_record["memory_total"])/1024/1024,
+            "free_memory":       
int(host_metrics_record["memory_free"])/1024/1024,
+            "xen_major":         host_record["software_version"]["xen_major"],
+            "xen_minor":         host_record["software_version"]["xen_minor"],
+            "xen_extra":         host_record["software_version"]["xen_extra"],
+            "xen_caps":          " ".join(host_record["capabilities"]),
+            "xen_scheduler":     host_record["sched_policy"],
+            "xen_pagesize":      host_record["other_config"]["xen_pagesize"],
+            "platform_params":   
host_record["other_config"]["platform_params"],
+            "xen_changeset":     
host_record["software_version"]["xen_changeset"],
+            "cc_compiler":       
host_record["software_version"]["cc_compiler"],
+            "cc_compile_by":     
host_record["software_version"]["cc_compile_by"],
+            "cc_compile_domain": 
host_record["software_version"]["cc_compile_domain"],
+            "cc_compile_date":   
host_record["software_version"]["cc_compile_date"],
+            
"xend_config_format":host_record["software_version"]["xend_config_format"]      
                          
+        }
+
+        sorted = info.items()
+        sorted.sort(lambda (x1,y1), (x2,y2): -cmp(x1,x2))
+        
+        for (k, v) in sorted:
+           print "%-23s:" % k, v 
+    else:
+        info = server.xend.node.info()
+        for x in info[1:]:
+            if len(x) < 2: 
+                print "%-23s: (none)" % x[0]
+            else: 
+                print "%-23s:" % x[0], x[1]
 
 def xm_console(args):
     arg_check(args, "console", 1, 2)
@@ -1314,13 +1386,17 @@ def xm_console(args):
     dom = params[0]
 
     try:
-        info = server.xend.domain(dom)
+        if serverType == SERVER_XEN_API:
+            domid = int(server.xenapi.VM.get_domid(get_single_vm(dom)))
+        else:
+            info = server.xend.domain(dom)
+            domid = int(sxp.child_value(info, 'domid', '-1'))
     except:
         if quiet:
             sys.exit(1)
         else:
             raise
-    domid = int(sxp.child_value(info, 'domid', '-1'))
+        
     if domid == -1:
         if quiet:
             sys.exit(1)
@@ -1428,17 +1504,33 @@ def xm_dmesg(args):
         err("No parameter required")
         usage('dmesg')
 
-    if not use_clear:
-        print server.xend.node.dmesg.info()
-    else:
-        server.xend.node.dmesg.clear()
+    if serverType == SERVER_XEN_API:
+        if not use_clear:
+            print server.xenapi.host.dmesg(
+                server.xenapi.session.get_this_host(),0)
+        else:
+            server.xenapi.host.dmesg(
+                server.xenapi.session.get_this_host(),1)
+    else:
+        if not use_clear:
+            print server.xend.node.dmesg.info()
+        else:
+            server.xend.node.dmesg.clear()
 
 def xm_log(args):
     arg_check(args, "log", 0)
-    
-    print server.xend.node.log()
+
+    if serverType == SERVER_XEN_API:
+        print server.xenapi.host.get_log(
+            server.xenapi.session.get_this_host())
+    else:
+        print server.xend.node.log()
 
 def xm_serve(args):
+    if serverType == SERVER_XEN_API:
+        print "Not supported with XenAPI"
+        sys.exit(-1)
+
     arg_check(args, "serve", 0)
 
     from fcntl import fcntl, F_SETFL
diff -r a230a1a167dc -r 1584263f9fc5 tools/python/xen/xm/shutdown.py
--- a/tools/python/xen/xm/shutdown.py   Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/python/xen/xm/shutdown.py   Thu Mar 15 09:04:23 2007 -0600
@@ -21,7 +21,8 @@ import time
 
 from xen.xend import sxp
 from opts import *
-from main import server
+from main import server, serverType, SERVER_XEN_API, get_single_vm
+from xen.xend.XendAPIConstants import *
 
 gopts = Opts(use="""[options] [DOM]
 
@@ -49,6 +50,9 @@ gopts.opt('reboot', short='R',
           use='Shutdown and reboot.')
 
 def wait_reboot(opts, doms, rcs):
+    if serverType == SERVER_XEN_API:
+           opts.err("Cannot wait for reboot w/ XenAPI (yet)")
+
     while doms:
         alive = server.xend.domains(0)
         reboot = []
@@ -68,7 +72,12 @@ def wait_reboot(opts, doms, rcs):
 
 def wait_shutdown(opts, doms):
     while doms:
-        alive = server.xend.domains(0)
+        if serverType == SERVER_XEN_API:
+                   alive = [dom for dom in server.xenapi.VM.get_all()
+                     if server.xenapi.VM.get_power_state(dom) ==
+                     XEN_API_VM_POWER_STATE[XEN_API_VM_POWER_STATE_RUNNING]]
+        else:
+            alive = server.xend.domains(0)
         dead = []
         for d in doms:
             if d in alive: continue
@@ -82,8 +91,16 @@ def shutdown(opts, doms, mode, wait):
 def shutdown(opts, doms, mode, wait):
     rcs = {}
     for d in doms:
-        rcs[d] = server.xend.domain.getRestartCount(d)
-        server.xend.domain.shutdown(d, mode)
+               if serverType == SERVER_XEN_API:
+                       if mode == 'halt':
+                               server.xenapi.VM.clean_shutdown(d)
+                       if mode == 'reboot':
+                               server.xenapi.VM.clean_reboot(d)
+                       if mode == 'poweroff':
+                               server.xenapi.VM.clean_shutdown(d)              
                
+               else:
+                       rcs[d] = server.xend.domain.getRestartCount(d)
+                       server.xend.domain.shutdown(d, mode)
 
     if wait:
         if mode == 'reboot':
@@ -103,9 +120,13 @@ def shutdown_mode(opts):
         return 'poweroff'
 
 def main_all(opts, args):
-    doms = server.xend.domains(0)
-    dom0_name = sxp.child_value(server.xend.domain(0), 'name')
-    doms.remove(dom0_name)
+    if serverType == SERVER_XEN_API:
+        doms = [dom for dom in server.xenapi.VM.get_all()
+                if not server.xenapi.VM.get_is_control_domain(dom)]
+    else:
+        doms = server.xend.domains(0)
+        dom0_name = sxp.child_value(server.xend.domain(0), 'name')
+        doms.remove(dom0_name)
     mode = shutdown_mode(opts)  
     shutdown(opts, doms, mode, opts.vals.wait)
 
@@ -113,6 +134,8 @@ def main_dom(opts, args):
     if len(args) == 0: opts.err('No domain parameter given')
     if len(args) >  1: opts.err('No multiple domain parameters allowed')
     dom = args[0]
+    if serverType == SERVER_XEN_API:
+               dom = get_single_vm(dom)
     mode = shutdown_mode(opts)  
     shutdown(opts, [ dom ], mode, opts.vals.wait)
     
diff -r a230a1a167dc -r 1584263f9fc5 
tools/xm-test/tests/destroy/01_destroy_basic_pos.py
--- a/tools/xm-test/tests/destroy/01_destroy_basic_pos.py       Thu Mar 15 
09:00:42 2007 -0600
+++ b/tools/xm-test/tests/destroy/01_destroy_basic_pos.py       Thu Mar 15 
09:04:23 2007 -0600
@@ -37,4 +37,4 @@ if not re.search("proc", run["output"]):
 # destroy domain - positive test
 status, output = traceCommand("xm destroy %s" % domain.getName())
 if status != 0:
-    FAIL("xm destroy returned invalud %i != 0" % status)
+    FAIL("xm destroy returned invalid %i != 0" % status)
diff -r a230a1a167dc -r 1584263f9fc5 tools/xm-test/tests/vtpm/09_vtpm-xapi.py
--- a/tools/xm-test/tests/vtpm/09_vtpm-xapi.py  Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/xm-test/tests/vtpm/09_vtpm-xapi.py  Thu Mar 15 09:04:23 2007 -0600
@@ -91,7 +91,7 @@ try:
 try:
     console = domain.start()
 except DomainError, e:
-    FAIL("Unable to create domain (%s)" % domName)
+    FAIL("Unable to create domain (%s)")
 
 try:
     console.sendInput("input")
diff -r a230a1a167dc -r 1584263f9fc5 tools/xm-test/tests/vtpm/vtpm_utils.py
--- a/tools/xm-test/tests/vtpm/vtpm_utils.py    Thu Mar 15 09:00:42 2007 -0600
+++ b/tools/xm-test/tests/vtpm/vtpm_utils.py    Thu Mar 15 09:04:23 2007 -0600
@@ -8,7 +8,8 @@ if ENABLE_HVM_SUPPORT:
 if ENABLE_HVM_SUPPORT:
     SKIP("vtpm tests not supported for HVM domains")
 
-status, output = traceCommand("ps aux | grep vtpm_manager | grep -v grep")
+status, output = traceCommand("COLUMNS=200 ; "
+                              "ps aux | grep vtpm_manager | grep -v grep")
 if output == "":
     SKIP("virtual TPM manager must be started to run this test; might "
          "need /dev/tpm0")
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/ia64/xen/domain.c        Thu Mar 15 09:04:23 2007 -0600
@@ -676,8 +676,11 @@ int arch_set_info_guest(struct vcpu *v, 
        /* This overrides some registers. */
        vcpu_init_regs(v);
 
-       /* Don't redo final setup */
-       set_bit(_VCPUF_initialised, &v->vcpu_flags);
+       /* Don't redo final setup. Auto-online VCPU0. */
+       if (!test_and_set_bit(_VCPUF_initialised, &v->vcpu_flags) &&
+           (v->vcpu_id == 0))
+               clear_bit(_VCPUF_down, &v->vcpu_flags);
+
        return 0;
 }
 
@@ -1186,6 +1189,7 @@ int construct_dom0(struct domain *d,
        printk("Dom0: 0x%lx\n", (u64)dom0);
 
        set_bit(_VCPUF_initialised, &v->vcpu_flags);
+       clear_bit(_VCPUF_down, &v->vcpu_flags);
 
        /* Build firmware.
           Note: Linux kernel reserve memory used by start_info, so there is
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/powerpc/domain.c
--- a/xen/arch/powerpc/domain.c Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/powerpc/domain.c Thu Mar 15 09:04:23 2007 -0600
@@ -168,7 +168,10 @@ int arch_set_info_guest(struct vcpu *v, 
     d->shared_info->wc_nsec = dom0->shared_info->wc_nsec;
     d->shared_info->arch.boot_timebase = dom0->shared_info->arch.boot_timebase;
 
-    set_bit(_VCPUF_initialised, &v->vcpu_flags);
+    /* Auto-online VCPU0 when it is initialised. */
+    if ( !test_and_set_bit(_VCPUF_initialised, &v->vcpu_flags) &&
+         (v->vcpu_id == 0) )
+        clear_bit(_VCPUF_down, &v->vcpu_flags);
 
     cpu_init_vcpu(v);
 
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/powerpc/domain_build.c
--- a/xen/arch/powerpc/domain_build.c   Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/powerpc/domain_build.c   Thu Mar 15 09:04:23 2007 -0600
@@ -274,6 +274,7 @@ int construct_dom0(struct domain *d,
     ofd_dom0_fixup(d, *ofh_tree + rma, cmdline, shared_info_addr);
 
     set_bit(_VCPUF_initialised, &v->vcpu_flags);
+    clear_bit(_VCPUF_down, &v->vcpu_flags);
 
     rc = 0;
 
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/domain.c     Thu Mar 15 09:04:23 2007 -0600
@@ -601,7 +601,7 @@ int arch_set_info_guest(
     }
 
     if ( test_bit(_VCPUF_initialised, &v->vcpu_flags) )
-        return 0;
+        goto out;
 
     memset(v->arch.guest_context.debugreg, 0,
            sizeof(v->arch.guest_context.debugreg));
@@ -706,6 +706,11 @@ int arch_set_info_guest(
 
     update_cr3(v);
 
+ out:
+    if ( flags & VGCF_online )
+        clear_bit(_VCPUF_down, &v->vcpu_flags);
+    else
+        set_bit(_VCPUF_down, &v->vcpu_flags);
     return 0;
 #undef c
 }
@@ -1381,7 +1386,8 @@ int hypercall_xlat_continuation(unsigned
 }
 #endif
 
-static void relinquish_memory(struct domain *d, struct list_head *list)
+static void relinquish_memory(struct domain *d, struct list_head *list,
+                              unsigned long type)
 {
     struct list_head *ent;
     struct page_info  *page;
@@ -1410,23 +1416,24 @@ static void relinquish_memory(struct dom
             put_page(page);
 
         /*
-         * Forcibly invalidate base page tables at this point to break circular
-         * 'linear page table' references. This is okay because MMU structures
-         * are not shared across domains and this domain is now dead. Thus base
-         * tables are not in use so a non-zero count means circular reference.
+         * Forcibly invalidate top-most, still valid page tables at this point
+         * to break circular 'linear page table' references. This is okay
+         * because MMU structures are not shared across domains and this domain
+         * is now dead. Thus top-most valid tables are not in use so a non-zero
+         * count means circular reference.
          */
         y = page->u.inuse.type_info;
         for ( ; ; )
         {
             x = y;
             if ( likely((x & (PGT_type_mask|PGT_validated)) !=
-                        (PGT_base_page_table|PGT_validated)) )
+                        (type|PGT_validated)) )
                 break;
 
             y = cmpxchg(&page->u.inuse.type_info, x, x & ~PGT_validated);
             if ( likely(y == x) )
             {
-                free_page_type(page, PGT_base_page_table);
+                free_page_type(page, type);
                 break;
             }
         }
@@ -1524,8 +1531,16 @@ void domain_relinquish_resources(struct 
         destroy_gdt(v);
 
     /* Relinquish every page of memory. */
-    relinquish_memory(d, &d->xenpage_list);
-    relinquish_memory(d, &d->page_list);
+#if CONFIG_PAGING_LEVELS >= 4
+    relinquish_memory(d, &d->xenpage_list, PGT_l4_page_table);
+    relinquish_memory(d, &d->page_list, PGT_l4_page_table);
+#endif
+#if CONFIG_PAGING_LEVELS >= 3
+    relinquish_memory(d, &d->xenpage_list, PGT_l3_page_table);
+    relinquish_memory(d, &d->page_list, PGT_l3_page_table);
+#endif
+    relinquish_memory(d, &d->xenpage_list, PGT_l2_page_table);
+    relinquish_memory(d, &d->page_list, PGT_l2_page_table);
 
     /* Free page used by xen oprofile buffer */
     free_xenoprof_pages(d);
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/domain_build.c
--- a/xen/arch/x86/domain_build.c       Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/domain_build.c       Thu Mar 15 09:04:23 2007 -0600
@@ -902,6 +902,7 @@ int construct_dom0(struct domain *d,
     update_domain_wallclock_time(d);
 
     set_bit(_VCPUF_initialised, &v->vcpu_flags);
+    clear_bit(_VCPUF_down, &v->vcpu_flags);
 
     /*
      * Initial register values:
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c     Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/domctl.c     Thu Mar 15 09:04:23 2007 -0600
@@ -450,6 +450,8 @@ void arch_get_info_guest(struct vcpu *v,
     c(flags &= ~(VGCF_i387_valid|VGCF_in_kernel));
     if ( test_bit(_VCPUF_fpu_initialised, &v->vcpu_flags) )
         c(flags |= VGCF_i387_valid);
+    if ( !test_bit(_VCPUF_down, &v->vcpu_flags) )
+        c(flags |= VGCF_online);
 
     if ( is_hvm_vcpu(v) )
     {
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/gdbstub.c
--- a/xen/arch/x86/gdbstub.c    Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/gdbstub.c    Thu Mar 15 09:04:23 2007 -0600
@@ -73,38 +73,16 @@ gdb_arch_read_reg(unsigned long regnum, 
 
 /* Like copy_from_user, but safe to call with interrupts disabled.
    Trust me, and don't look behind the curtain. */
-unsigned 
+unsigned int
 gdb_arch_copy_from_user(void *dest, const void *src, unsigned len)
 {
-    int __d0, __d1, __d2;
-    ASSERT(!local_irq_is_enabled());
-    __asm__ __volatile__(
-        "1: rep; movsb\n"
-        "2:\n"
-        ".section .fixup,\"ax\"\n"
-        "3:     addl $4, %%esp\n"
-        "       jmp 2b\n"
-        ".previous\n"
-        ".section __pre_ex_table,\"a\"\n"
-        "   "__FIXUP_ALIGN"\n"
-        "   "__FIXUP_WORD" 1b,3b\n"
-        ".previous\n"
-        ".section __ex_table,\"a\"\n"
-        "   "__FIXUP_ALIGN"\n"
-        "   "__FIXUP_WORD" 1b,2b\n"
-        ".previous\n"
-        : "=c"(__d2), "=D" (__d0), "=S" (__d1)
-        : "0"(len), "1"(dest), "2"(src)
-        : "memory");
-    ASSERT(!local_irq_is_enabled());
-    return __d2;
+    return copy_from_user(dest, src, len);
 }
 
 unsigned int 
 gdb_arch_copy_to_user(void *dest, const void *src, unsigned len)
 {
-    /* XXX  */
-    return len;
+    return copy_to_user(dest, src, len);
 }
 
 void 
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/hvm/svm/svm.c        Thu Mar 15 09:04:23 2007 -0600
@@ -43,7 +43,6 @@
 #include <asm/hvm/svm/svm.h>
 #include <asm/hvm/svm/vmcb.h>
 #include <asm/hvm/svm/emulate.h>
-#include <asm/hvm/svm/vmmcall.h>
 #include <asm/hvm/svm/intr.h>
 #include <asm/x86_emulate.h>
 #include <public/sched.h>
@@ -2587,65 +2586,6 @@ static int svm_do_vmmcall_reset_to_realm
     vmcb->rax = 0;
     vmcb->rsp = 0;
 
-    return 0;
-}
-
-
-/*
- * svm_do_vmmcall - SVM VMMCALL handler
- *
- * returns 0 on success, non-zero otherwise
- */
-static int svm_do_vmmcall(struct vcpu *v, struct cpu_user_regs *regs)
-{
-    struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
-    int inst_len;
-
-    ASSERT(vmcb);
-    ASSERT(regs);
-
-    inst_len = __get_instruction_length(v, INSTR_VMCALL, NULL);
-    ASSERT(inst_len > 0);
-
-    HVMTRACE_1D(VMMCALL, v, regs->eax);
-
-    if ( regs->eax & 0x80000000 )
-    {
-        /* VMMCALL sanity check */
-        if ( vmcb->cpl > get_vmmcall_cpl(regs->edi) )
-        {
-            printk("VMMCALL CPL check failed\n");
-            return -1;
-        }
-
-        /* handle the request */
-        switch ( regs->eax )
-        {
-        case VMMCALL_RESET_TO_REALMODE:
-            if ( svm_do_vmmcall_reset_to_realmode(v, regs) )
-            {
-                printk("svm_do_vmmcall_reset_to_realmode() failed\n");
-                return -1;
-            }
-            /* since we just reset the VMCB, return without adjusting
-             * the eip */
-            return 0;
-
-        case VMMCALL_DEBUG:
-            printk("DEBUG features not implemented yet\n");
-            break;
-        default:
-            break;
-        }
-
-        hvm_print_line(v, regs->eax); /* provides the current domain */
-    }
-    else
-    {
-        hvm_do_hypercall(regs);
-    }
-
-    __update_guest_eip(vmcb, inst_len);
     return 0;
 }
 
@@ -3152,9 +3092,14 @@ asmlinkage void svm_vmexit_handler(struc
         svm_handle_invlpg(1, regs);
         break;
 
-    case VMEXIT_VMMCALL:
-        svm_do_vmmcall(v, regs);
-        break;
+    case VMEXIT_VMMCALL: {
+        int inst_len = __get_instruction_length(v, INSTR_VMCALL, NULL);
+        ASSERT(inst_len > 0);
+        HVMTRACE_1D(VMMCALL, v, regs->eax);
+        __update_guest_eip(vmcb, inst_len);
+        hvm_do_hypercall(regs);
+        break;
+    }
 
     case VMEXIT_CR0_READ:
         svm_cr_access(v, 0, TYPE_MOV_FROM_CR, regs);
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/hvm/vlapic.c
--- a/xen/arch/x86/hvm/vlapic.c Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/hvm/vlapic.c Thu Mar 15 09:04:23 2007 -0600
@@ -195,8 +195,9 @@ int vlapic_match_logical_addr(struct vla
             result = 1;
         break;
     default:
-        gdprintk(XENLOG_WARNING, "Bad DFR value for lapic of vcpu %d\n",
-                 vlapic_vcpu(vlapic)->vcpu_id);
+        gdprintk(XENLOG_WARNING, "Bad DFR value for lapic of vcpu %d: %08x\n",
+                 vlapic_vcpu(vlapic)->vcpu_id,
+                 vlapic_get_reg(vlapic, APIC_DFR));
         break;
     }
 
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/mm.c Thu Mar 15 09:04:23 2007 -0600
@@ -517,7 +517,6 @@ static int get_page_and_type_from_pagenr
     return 1;
 }
 
-#ifndef CONFIG_X86_PAE /* We do not support guest linear mappings on PAE. */
 /*
  * We allow root tables to map each other (a.k.a. linear page tables). It
  * needs some special care with reference counts and access permissions:
@@ -530,48 +529,48 @@ static int get_page_and_type_from_pagenr
  *     frame if it is mapped by a different root table. This is sufficient and
  *     also necessary to allow validation of a root table mapping itself.
  */
-static int 
-get_linear_pagetable(
-    root_pgentry_t re, unsigned long re_pfn, struct domain *d)
-{
-    unsigned long x, y;
-    struct page_info *page;
-    unsigned long pfn;
-
-    if ( (root_get_flags(re) & _PAGE_RW) )
-    {
-        MEM_LOG("Attempt to create linear p.t. with write perms");
-        return 0;
-    }
-
-    if ( (pfn = root_get_pfn(re)) != re_pfn )
-    {
-        /* Make sure the mapped frame belongs to the correct domain. */
-        if ( unlikely(!get_page_from_pagenr(pfn, d)) )
-            return 0;
-
-        /*
-         * Make sure that the mapped frame is an already-validated L2 table. 
-         * If so, atomically increment the count (checking for overflow).
-         */
-        page = mfn_to_page(pfn);
-        y = page->u.inuse.type_info;
-        do {
-            x = y;
-            if ( unlikely((x & PGT_count_mask) == PGT_count_mask) ||
-                 unlikely((x & (PGT_type_mask|PGT_validated)) != 
-                          (PGT_root_page_table|PGT_validated)) )
-            {
-                put_page(page);
-                return 0;
-            }
-        }
-        while ( (y = cmpxchg(&page->u.inuse.type_info, x, x + 1)) != x );
-    }
-
-    return 1;
-}
-#endif /* !CONFIG_X86_PAE */
+#define define_get_linear_pagetable(level)                                  \
+static int                                                                  \
+get_##level##_linear_pagetable(                                             \
+    level##_pgentry_t pde, unsigned long pde_pfn, struct domain *d)         \
+{                                                                           \
+    unsigned long x, y;                                                     \
+    struct page_info *page;                                                 \
+    unsigned long pfn;                                                      \
+                                                                            \
+    if ( (level##e_get_flags(pde) & _PAGE_RW) )                             \
+    {                                                                       \
+        MEM_LOG("Attempt to create linear p.t. with write perms");          \
+        return 0;                                                           \
+    }                                                                       \
+                                                                            \
+    if ( (pfn = level##e_get_pfn(pde)) != pde_pfn )                         \
+    {                                                                       \
+        /* Make sure the mapped frame belongs to the correct domain. */     \
+        if ( unlikely(!get_page_from_pagenr(pfn, d)) )                      \
+            return 0;                                                       \
+                                                                            \
+        /*                                                                  \
+         * Ensure that the mapped frame is an already-validated page table. \
+         * If so, atomically increment the count (checking for overflow).   \
+         */                                                                 \
+        page = mfn_to_page(pfn);                                            \
+        y = page->u.inuse.type_info;                                        \
+        do {                                                                \
+            x = y;                                                          \
+            if ( unlikely((x & PGT_count_mask) == PGT_count_mask) ||        \
+                 unlikely((x & (PGT_type_mask|PGT_validated)) !=            \
+                          (PGT_##level##_page_table|PGT_validated)) )       \
+            {                                                               \
+                put_page(page);                                             \
+                return 0;                                                   \
+            }                                                               \
+        }                                                                   \
+        while ( (y = cmpxchg(&page->u.inuse.type_info, x, x + 1)) != x );   \
+    }                                                                       \
+                                                                            \
+    return 1;                                                               \
+}
 
 int
 get_page_from_l1e(
@@ -633,7 +632,8 @@ get_page_from_l1e(
 
 
 /* NB. Virtual address 'l2e' maps to a machine address within frame 'pfn'. */
-static int 
+define_get_linear_pagetable(l2);
+static int
 get_page_from_l2e(
     l2_pgentry_t l2e, unsigned long pfn, struct domain *d)
 {
@@ -649,16 +649,16 @@ get_page_from_l2e(
     }
 
     rc = get_page_and_type_from_pagenr(l2e_get_pfn(l2e), PGT_l1_page_table, d);
-#if CONFIG_PAGING_LEVELS == 2
     if ( unlikely(!rc) )
-        rc = get_linear_pagetable(l2e, pfn, d);
-#endif
+        rc = get_l2_linear_pagetable(l2e, pfn, d);
+
     return rc;
 }
 
 
 #if CONFIG_PAGING_LEVELS >= 3
-static int 
+define_get_linear_pagetable(l3);
+static int
 get_page_from_l3e(
     l3_pgentry_t l3e, unsigned long pfn, struct domain *d)
 {
@@ -674,12 +674,16 @@ get_page_from_l3e(
     }
 
     rc = get_page_and_type_from_pagenr(l3e_get_pfn(l3e), PGT_l2_page_table, d);
+    if ( unlikely(!rc) )
+        rc = get_l3_linear_pagetable(l3e, pfn, d);
+
     return rc;
 }
 #endif /* 3 level */
 
 #if CONFIG_PAGING_LEVELS >= 4
-static int 
+define_get_linear_pagetable(l4);
+static int
 get_page_from_l4e(
     l4_pgentry_t l4e, unsigned long pfn, struct domain *d)
 {
@@ -695,9 +699,8 @@ get_page_from_l4e(
     }
 
     rc = get_page_and_type_from_pagenr(l4e_get_pfn(l4e), PGT_l3_page_table, d);
-
     if ( unlikely(!rc) )
-        rc = get_linear_pagetable(l4e, pfn, d);
+        rc = get_l4_linear_pagetable(l4e, pfn, d);
 
     return rc;
 }
@@ -2765,7 +2768,9 @@ int do_update_va_mapping(unsigned long v
             flush_tlb_one_mask(d->domain_dirty_cpumask, va);
             break;
         default:
-            if ( unlikely(get_user(vmask, (unsigned long *)bmap_ptr)) )
+            if ( unlikely(!IS_COMPAT(d) ?
+                          get_user(vmask, (unsigned long *)bmap_ptr) :
+                          get_user(vmask, (unsigned int *)bmap_ptr)) )
                 rc = -EFAULT;
             pmask = vcpumask_to_pcpumask(d, vmask);
             flush_tlb_one_mask(pmask, va);
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c   Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/mm/shadow/common.c   Thu Mar 15 09:04:23 2007 -0600
@@ -2813,7 +2813,11 @@ shadow_write_p2m_entry(struct vcpu *v, u
        This is pretty heavy handed, but this is a rare operation
        (it might happen a dozen times during boot and then never
        again), so it doesn't matter too much. */
-    shadow_blow_tables(d);
+    if ( d->arch.paging.shadow.has_fast_mmio_entries )
+    {
+        shadow_blow_tables(d);
+        d->arch.paging.shadow.has_fast_mmio_entries = 0;
+    }
 #endif
 
     shadow_unlock(d);
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/mm/shadow/multi.c    Thu Mar 15 09:04:23 2007 -0600
@@ -660,6 +660,8 @@ _sh_propagate(struct vcpu *v,
     {
         /* Guest l1e maps MMIO space */
         *sp = sh_l1e_mmio(guest_l1e_get_gfn(*gp), gflags);
+        if ( !d->arch.paging.shadow.has_fast_mmio_entries )
+            d->arch.paging.shadow.has_fast_mmio_entries = 1;
         goto done;
     }
 
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/traps.c      Thu Mar 15 09:04:23 2007 -0600
@@ -905,6 +905,10 @@ static int fixup_page_fault(unsigned lon
     struct vcpu   *v = current;
     struct domain *d = v->domain;
 
+    /* No fixups in interrupt context or when interrupts are disabled. */
+    if ( in_irq() || !(regs->eflags & X86_EFLAGS_IF) )
+        return 0;
+
     if ( unlikely(IN_HYPERVISOR_RANGE(addr)) )
     {
         if ( paging_mode_external(d) && guest_mode(regs) )
@@ -914,9 +918,6 @@ static int fixup_page_fault(unsigned lon
                 addr - GDT_LDT_VIRT_START, regs);
         return 0;
     }
-
-    ASSERT(!in_irq());
-    ASSERT(regs->eflags & X86_EFLAGS_IF);
 
     if ( VM_ASSIST(d, VMASST_TYPE_writable_pagetables) &&
          guest_kernel_mode(v, regs) &&
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/x86_64/compat_kexec.S
--- a/xen/arch/x86/x86_64/compat_kexec.S        Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/x86_64/compat_kexec.S        Thu Mar 15 09:04:23 2007 -0600
@@ -103,13 +103,13 @@ compat_page_list:
 
         /*
          * These compat page tables contain an identity mapping of the
-         * first 1G of the physical address space.
+         * first 4G of the physical address space.
          */
 compat_pg_table:
         .long compat_pg_table_l2 + 0*PAGE_SIZE + 0x01 - __PAGE_OFFSET, 0
-        .long 0, 0
-        .long 0, 0
-        .long 0, 0
+        .long compat_pg_table_l2 + 1*PAGE_SIZE + 0x01 - __PAGE_OFFSET, 0
+        .long compat_pg_table_l2 + 2*PAGE_SIZE + 0x01 - __PAGE_OFFSET, 0
+        .long compat_pg_table_l2 + 3*PAGE_SIZE + 0x01 - __PAGE_OFFSET, 0
 
         .align 4096,0
 
@@ -123,4 +123,7 @@ compat_pg_table_l2:
         .endif
         .endm
 
-        identmap
+        identmap 0x00000000
+        identmap 0x40000000
+        identmap 0x80000000
+        identmap 0xc0000000
diff -r a230a1a167dc -r 1584263f9fc5 xen/arch/x86/x86_emulate.c
--- a/xen/arch/x86/x86_emulate.c        Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/arch/x86/x86_emulate.c        Thu Mar 15 09:04:23 2007 -0600
@@ -726,7 +726,7 @@ x86_emulate(
     uint8_t modrm, modrm_mod = 0, modrm_reg = 0, modrm_rm = 0;
     unsigned int op_bytes, def_op_bytes, ad_bytes, def_ad_bytes;
     unsigned int lock_prefix = 0, rep_prefix = 0;
-    int rc = X86EMUL_OKAY;
+    int override_seg = -1, rc = X86EMUL_OKAY;
     struct operand src, dst;
 
     /* Data operand effective address (usually computed from ModRM). */
@@ -758,22 +758,22 @@ x86_emulate(
             ad_bytes = def_ad_bytes ^ (mode_64bit() ? 12 : 6);
             break;
         case 0x2e: /* CS override */
-            ea.mem.seg = x86_seg_cs;
+            override_seg = x86_seg_cs;
             break;
         case 0x3e: /* DS override */
-            ea.mem.seg = x86_seg_ds;
+            override_seg = x86_seg_ds;
             break;
         case 0x26: /* ES override */
-            ea.mem.seg = x86_seg_es;
+            override_seg = x86_seg_es;
             break;
         case 0x64: /* FS override */
-            ea.mem.seg = x86_seg_fs;
+            override_seg = x86_seg_fs;
             break;
         case 0x65: /* GS override */
-            ea.mem.seg = x86_seg_gs;
+            override_seg = x86_seg_gs;
             break;
         case 0x36: /* SS override */
-            ea.mem.seg = x86_seg_ss;
+            override_seg = x86_seg_ss;
             break;
         case 0xf0: /* LOCK */
             lock_prefix = 1;
@@ -839,14 +839,35 @@ x86_emulate(
             /* 16-bit ModR/M decode. */
             switch ( modrm_rm )
             {
-            case 0: ea.mem.off = _regs.ebx + _regs.esi; break;
-            case 1: ea.mem.off = _regs.ebx + _regs.edi; break;
-            case 2: ea.mem.off = _regs.ebp + _regs.esi; break;
-            case 3: ea.mem.off = _regs.ebp + _regs.edi; break;
-            case 4: ea.mem.off = _regs.esi; break;
-            case 5: ea.mem.off = _regs.edi; break;
-            case 6: ea.mem.off = _regs.ebp; break;
-            case 7: ea.mem.off = _regs.ebx; break;
+            case 0:
+                ea.mem.off = _regs.ebx + _regs.esi;
+                break;
+            case 1:
+                ea.mem.off = _regs.ebx + _regs.edi;
+                break;
+            case 2:
+                ea.mem.seg = x86_seg_ss;
+                ea.mem.off = _regs.ebp + _regs.esi;
+                break;
+            case 3:
+                ea.mem.seg = x86_seg_ss;
+                ea.mem.off = _regs.ebp + _regs.edi;
+                break;
+            case 4:
+                ea.mem.off = _regs.esi;
+                break;
+            case 5:
+                ea.mem.off = _regs.edi;
+                break;
+            case 6:
+                if ( modrm_mod == 0 )
+                    break;
+                ea.mem.seg = x86_seg_ss;
+                ea.mem.off = _regs.ebp;
+                break;
+            case 7:
+                ea.mem.off = _regs.ebx;
+                break;
             }
             switch ( modrm_mod )
             {
@@ -876,10 +897,20 @@ x86_emulate(
                 ea.mem.off <<= (sib >> 6) & 3;
                 if ( (modrm_mod == 0) && ((sib_base & 7) == 5) )
                     ea.mem.off += insn_fetch_type(int32_t);
-                else if ( (sib_base == 4) && !twobyte && (b == 0x8f) )
-                    /* POP <rm> must have its EA calculated post increment. */
-                    ea.mem.off += _regs.esp +
-                        ((mode_64bit() && (op_bytes == 4)) ? 8 : op_bytes);
+                else if ( sib_base == 4 )
+                {
+                    ea.mem.seg  = x86_seg_ss;
+                    ea.mem.off += _regs.esp;
+                    if ( !twobyte && (b == 0x8f) )
+                        /* POP <rm> computes its EA post increment. */
+                        ea.mem.off += ((mode_64bit() && (op_bytes == 4))
+                                       ? 8 : op_bytes);
+                }
+                else if ( sib_base == 5 )
+                {
+                    ea.mem.seg  = x86_seg_ss;
+                    ea.mem.off += _regs.ebp;
+                }
                 else
                     ea.mem.off += *(long*)decode_register(sib_base, &_regs, 0);
             }
@@ -887,6 +918,8 @@ x86_emulate(
             {
                 modrm_rm |= (rex_prefix & 1) << 3;
                 ea.mem.off = *(long *)decode_register(modrm_rm, &_regs, 0);
+                if ( (modrm_rm == 5) && (modrm_mod != 0) )
+                    ea.mem.seg = x86_seg_ss;
             }
             switch ( modrm_mod )
             {
@@ -919,6 +952,9 @@ x86_emulate(
             ea.mem.off = truncate_ea(ea.mem.off);
         }
     }
+
+    if ( override_seg != -1 )
+        ea.mem.seg = override_seg;
 
     /* Special instructions do their own operand decoding. */
     if ( (d & DstMask) == ImplicitOps )
diff -r a230a1a167dc -r 1584263f9fc5 xen/common/domain.c
--- a/xen/common/domain.c       Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/common/domain.c       Thu Mar 15 09:04:23 2007 -0600
@@ -102,7 +102,7 @@ struct vcpu *alloc_vcpu(
     v->runstate.state = is_idle_vcpu(v) ? RUNSTATE_running : RUNSTATE_offline;
     v->runstate.state_entry_time = NOW();
 
-    if ( (vcpu_id != 0) && !is_idle_domain(d) )
+    if ( !is_idle_domain(d) )
         set_bit(_VCPUF_down, &v->vcpu_flags);
 
     if ( sched_init_vcpu(v, cpu_id) != 0 )
diff -r a230a1a167dc -r 1584263f9fc5 xen/common/domctl.c
--- a/xen/common/domctl.c       Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/common/domctl.c       Thu Mar 15 09:04:23 2007 -0600
@@ -268,18 +268,14 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
     case XEN_DOMCTL_unpausedomain:
     {
         struct domain *d = rcu_lock_domain_by_id(op->domain);
-        ret = -ESRCH;
-        if ( d != NULL )
-        {
-            ret = -EINVAL;
-            if ( (d != current->domain) && (d->vcpu[0] != NULL) &&
-                 test_bit(_VCPUF_initialised, &d->vcpu[0]->vcpu_flags) )
-            {
-                domain_unpause_by_systemcontroller(d);
-                ret = 0;
-            }
-            rcu_unlock_domain(d);
-        }
+
+        ret = -ESRCH;
+        if ( d == NULL )
+            break;
+
+        domain_unpause_by_systemcontroller(d);
+        rcu_unlock_domain(d);
+        ret = 0;
     }
     break;
 
diff -r a230a1a167dc -r 1584263f9fc5 xen/common/grant_table.c
--- a/xen/common/grant_table.c  Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/common/grant_table.c  Thu Mar 15 09:04:23 2007 -0600
@@ -1392,8 +1392,7 @@ gnttab_release_mappings(
             {
                 BUG_ON(!(act->pin & GNTPIN_hstr_mask));
                 act->pin -= GNTPIN_hstr_inc;
-                /* Done implicitly when page tables are destroyed. */
-                /* put_page(mfn_to_page(act->frame)); */
+                gnttab_release_put_page(mfn_to_page(act->frame));
             }
         }
         else
@@ -1409,8 +1408,7 @@ gnttab_release_mappings(
             {
                 BUG_ON(!(act->pin & GNTPIN_hstw_mask));
                 act->pin -= GNTPIN_hstw_inc;
-                /* Done implicitly when page tables are destroyed. */
-                /* put_page_and_type(mfn_to_page(act->frame)); */
+                gnttab_release_put_page_and_type(mfn_to_page(act->frame));
             }
 
             if ( (act->pin & (GNTPIN_devw_mask|GNTPIN_hstw_mask)) == 0 )
diff -r a230a1a167dc -r 1584263f9fc5 xen/drivers/char/console.c
--- a/xen/drivers/char/console.c        Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/drivers/char/console.c        Thu Mar 15 09:04:23 2007 -0600
@@ -48,6 +48,10 @@ static int opt_sync_console;
 static int opt_sync_console;
 boolean_param("sync_console", opt_sync_console);
 
+/* console_to_ring: send guest (incl. dom 0) console data to console ring. */
+static int opt_console_to_ring;
+boolean_param("console_to_ring", opt_console_to_ring);
+
 #define CONRING_SIZE 16384
 #define CONRING_IDX_MASK(i) ((i)&(CONRING_SIZE-1))
 static char conring[CONRING_SIZE];
@@ -329,7 +333,14 @@ static long guest_console_write(XEN_GUES
         sercon_puts(kbuf);
 
         for ( kptr = kbuf; *kptr != '\0'; kptr++ )
+        {
             vga_putchar(*kptr);
+            if ( opt_console_to_ring )
+                putchar_console_ring(*kptr);
+        }
+
+        if ( opt_console_to_ring )
+            send_guest_global_virq(dom0, VIRQ_CON_RING);
 
         guest_handle_add_offset(buffer, kcount);
         count -= kcount;
diff -r a230a1a167dc -r 1584263f9fc5 xen/include/asm-ia64/grant_table.h
--- a/xen/include/asm-ia64/grant_table.h        Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/include/asm-ia64/grant_table.h        Thu Mar 15 09:04:23 2007 -0600
@@ -64,4 +64,7 @@ static inline void gnttab_clear_flag(uns
        clear_bit(nr, addr);
 }
 
+#define gnttab_release_put_page(page)           put_page((page))
+#define gnttab_release_put_page_and_type(page)  put_page_and_type((page))
+
 #endif /* __ASM_GRANT_TABLE_H__ */
diff -r a230a1a167dc -r 1584263f9fc5 xen/include/asm-powerpc/grant_table.h
--- a/xen/include/asm-powerpc/grant_table.h     Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/include/asm-powerpc/grant_table.h     Thu Mar 15 09:04:23 2007 -0600
@@ -69,4 +69,17 @@ static inline uint cpu_foreign_map_order
     /* 16 GiB */
     return 34 - PAGE_SHIFT;
 }
+
+#if 0
+/*
+ * without put_page()/put_page_and_type() page might be leaked.
+ * with put_page()/put_page_and_type() freed page might be accessed.
+ */
+#define gnttab_release_put_page(page)           put_page((page))
+#define gnttab_release_put_page_and_type(page)  put_page_and_type((page))
+#else
+#define gnttab_release_put_page(page)           do { } while (0)
+#define gnttab_release_put_page_and_type(page)  do { } while (0)
+#endif
+
 #endif  /* __ASM_PPC_GRANT_TABLE_H__ */
diff -r a230a1a167dc -r 1584263f9fc5 xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h      Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/include/asm-x86/domain.h      Thu Mar 15 09:04:23 2007 -0600
@@ -78,6 +78,9 @@ struct shadow_domain {
     /* Shadow hashtable */
     struct shadow_page_info **hash_table;
     int hash_walking;  /* Some function is walking the hash table */
+
+    /* Fast MMIO path heuristic */
+    int has_fast_mmio_entries;
 
     /* Shadow log-dirty bitmap */
     unsigned long *dirty_bitmap;
diff -r a230a1a167dc -r 1584263f9fc5 xen/include/asm-x86/grant_table.h
--- a/xen/include/asm-x86/grant_table.h Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/include/asm-x86/grant_table.h Thu Mar 15 09:04:23 2007 -0600
@@ -38,4 +38,14 @@ static inline void gnttab_clear_flag(uns
     clear_bit(nr, addr);
 }
 
+#define gnttab_release_put_page(page)                           \
+    do {                                                        \
+        /* Done implicitly when page tables are destroyed. */   \
+    } while (0)
+
+#define gnttab_release_put_page_and_type(page)                  \
+    do {                                                        \
+        /* Done implicitly when page tables are destroyed. */   \
+    } while (0)
+
 #endif /* __ASM_GRANT_TABLE_H__ */
diff -r a230a1a167dc -r 1584263f9fc5 xen/include/asm-x86/hvm/svm/vmmcall.h
--- a/xen/include/asm-x86/hvm/svm/vmmcall.h     Thu Mar 15 09:00:42 2007 -0600
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * vmmcall.h: VMMCALL instruction support
- *
- * Travis Betak, travis.betak@xxxxxxx
- * Copyright (c) 2005, AMD Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place - Suite 330, Boston, MA 02111-1307 USA.
- *
- */
-
-#ifndef __ASM_X86_HVM_SVM_VMMCALL_H__
-#define __ASM_X86_HVM_SVM_VMMCALL_H__
-
-/* VMMCALL command fields */
-#define VMMCALL_CODE_CPL_MASK     0x60000000
-#define VMMCALL_CODE_MBZ_MASK     0x1FFF0000
-#define VMMCALL_CODE_COMMAND_MASK 0x0000FFFF
-
-#define MAKE_VMMCALL_CODE(cpl,func) ((cpl << 29) | (func) | 0x80000000)
-
-/* CPL=0 VMMCALL Requests */
-#define VMMCALL_RESET_TO_REALMODE   MAKE_VMMCALL_CODE(0,1)
-
-/* CPL=3 VMMCALL Requests */
-#define VMMCALL_DEBUG           MAKE_VMMCALL_CODE(3,1)
-
-/* return the cpl required for the vmmcall cmd */
-static inline int get_vmmcall_cpl(int cmd)
-{
-    return (cmd & VMMCALL_CODE_CPL_MASK) >> 29;
-}
-
-#endif /* __ASM_X86_HVM_SVM_VMMCALL_H__ */
diff -r a230a1a167dc -r 1584263f9fc5 xen/include/public/arch-x86/xen.h
--- a/xen/include/public/arch-x86/xen.h Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/include/public/arch-x86/xen.h Thu Mar 15 09:04:23 2007 -0600
@@ -126,6 +126,8 @@ struct vcpu_guest_context {
 #define VGCF_failsafe_disables_events  (1<<_VGCF_failsafe_disables_events)
 #define _VGCF_syscall_disables_events  4
 #define VGCF_syscall_disables_events   (1<<_VGCF_syscall_disables_events)
+#define _VGCF_online                   5
+#define VGCF_online                    (1<<_VGCF_online)
     unsigned long flags;                    /* VGCF_* flags                 */
     struct cpu_user_regs user_regs;         /* User-level CPU registers     */
     struct trap_info trap_ctxt[256];        /* Virtual IDT                  */
diff -r a230a1a167dc -r 1584263f9fc5 xen/include/public/foreign/structs.py
--- a/xen/include/public/foreign/structs.py     Thu Mar 15 09:00:42 2007 -0600
+++ b/xen/include/public/foreign/structs.py     Thu Mar 15 09:04:23 2007 -0600
@@ -41,6 +41,8 @@ defines = [ "__i386__",
             "VGCF_failsafe_disables_events",
             "_VGCF_syscall_disables_events",
             "VGCF_syscall_disables_events",
+            "_VGCF_online",
+            "VGCF_online",
 
             # ia64
             "VGCF_EXTRA_REGS",

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.