[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |