[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 1168443647 25200 # Node ID 58633caeece9df2d36c395c9c926521bcbd6fcd8 # Parent 42babffffba5b0ec0a9e6dd2501a8fc65c8c9b84 # Parent 0b679a6d8ad083022d2a0463ff3a5fa5a852c7c4 merge with xen-unstable.hg --- .hgignore | 2 .hgtags | 1 Config.mk | 2 buildconfigs/mk.linux-2.6-xen | 31 config/StdGNU.mk | 2 config/SunOS.mk | 2 config/x86_64.mk | 1 docs/xen-api/wire-protocol.tex | 83 docs/xen-api/xenapi-datamodel.tex | 1234 +++++----- linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c | 5 linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c | 46 linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c | 20 linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c | 5 linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c | 49 linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c | 28 linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c | 6 linux-2.6-xen-sparse/drivers/xen/blkback/common.h | 1 linux-2.6-xen-sparse/drivers/xen/blkback/interface.c | 21 linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c | 19 linux-2.6-xen-sparse/drivers/xen/blkfront/block.h | 2 linux-2.6-xen-sparse/drivers/xen/blktap/Makefile | 4 linux-2.6-xen-sparse/drivers/xen/blktap/common.h | 1 linux-2.6-xen-sparse/drivers/xen/blktap/interface.c | 21 linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c | 2 linux-2.6-xen-sparse/drivers/xen/core/evtchn.c | 196 + linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c | 4 linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c | 18 linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c | 16 linux-2.6-xen-sparse/drivers/xen/netback/common.h | 1 linux-2.6-xen-sparse/drivers/xen/netback/interface.c | 17 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c | 124 - linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c | 10 linux-2.6-xen-sparse/drivers/xen/tpmback/common.h | 1 linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c | 21 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c | 22 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c | 2 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/swiotlb.h | 2 linux-2.6-xen-sparse/include/asm-ia64/swiotlb.h | 45 linux-2.6-xen-sparse/include/xen/evtchn.h | 43 linux-2.6-xen-sparse/include/xen/xenbus.h | 8 linux-2.6-xen-sparse/kernel/kexec.c | 8 linux-2.6-xen-sparse/net/core/dev.c | 3 patches/linux-2.6.16.33/vsnprintf.patch | 1 tools/Rules.mk | 2 tools/blktap/drivers/block-qcow.c | 133 - tools/blktap/drivers/qcow-create.c | 26 tools/examples/Makefile | 1 tools/examples/blktap | 2 tools/examples/block | 2 tools/examples/block-enbd | 2 tools/examples/block-nbd | 2 tools/examples/external-device-migrate | 2 tools/examples/network-bridge | 2 tools/examples/network-nat | 2 tools/examples/network-route | 2 tools/examples/vif-bridge | 2 tools/examples/vif-common.sh | 8 tools/examples/vif-nat | 2 tools/examples/vif-route | 2 tools/examples/vtpm | 2 tools/examples/vtpm-delete | 2 tools/examples/xen-backend.agent | 2 tools/examples/xen-hotplug-cleanup | 2 tools/examples/xm-config.xml | 2 tools/examples/xmexample.hvm | 4 tools/firmware/etherboot/README | 7 tools/firmware/hvmloader/Makefile | 3 tools/firmware/hvmloader/acpi/Makefile | 2 tools/firmware/hvmloader/acpi/acpi2_0.h | 44 tools/firmware/hvmloader/acpi/build.c | 69 tools/firmware/hvmloader/acpi/dsdt.asl | 18 tools/firmware/hvmloader/acpi/dsdt.c | 648 ++--- tools/firmware/hvmloader/acpi/ssdt_tpm.asl | 4 tools/firmware/hvmloader/acpi/ssdt_tpm.h | 10 tools/firmware/hvmloader/acpi/static_tables.c | 4 tools/firmware/hvmloader/config.h | 3 tools/firmware/hvmloader/hvmloader.c | 29 tools/firmware/hvmloader/mp_tables.c | 4 tools/firmware/rombios/rombios.c | 482 ++- tools/firmware/vmxassist/vm86.c | 24 tools/ioemu/hw/pc.c | 2 tools/ioemu/hw/vga.c | 11 tools/ioemu/hw/vga_int.h | 1 tools/ioemu/patches/domain-timeoffset | 10 tools/ioemu/patches/fix-interrupt-routing | 17 tools/ioemu/patches/ioemu-ia64 | 38 tools/ioemu/patches/qemu-bootorder | 26 tools/ioemu/patches/series | 2 tools/ioemu/patches/tpm-tis-device | 9 tools/ioemu/patches/vnc-display-find-unused | 8 tools/ioemu/patches/vnc-fixes | 8 tools/ioemu/patches/vnc-listen-specific-interface | 8 tools/ioemu/patches/vnc-password | 14 tools/ioemu/patches/vnc-start-vncviewer | 8 tools/ioemu/patches/xen-mapcache | 285 -- tools/ioemu/patches/xen-support-buffered-ioreqs | 6 tools/ioemu/patches/xenstore-block-device-config | 19 tools/ioemu/patches/xenstore-write-vnc-port | 8 tools/ioemu/target-i386-dm/exec-dm.c | 1 tools/ioemu/target-i386-dm/helper2.c | 21 tools/ioemu/vl.c | 2 tools/ioemu/vnc.c | 51 tools/ioemu/vnchextile.h | 4 tools/libxc/xc_hvm_build.c | 3 tools/libxc/xc_linux_build.c | 4 tools/libxc/xc_linux_restore.c | 2 tools/libxc/xc_linux_save.c | 64 tools/libxc/xc_load_bin.c | 26 tools/libxc/xc_load_elf.c | 91 tools/libxc/xg_private.h | 6 tools/libxc/xg_save_restore.h | 15 tools/libxen/include/xen_cpu_feature.h | 4 tools/libxen/src/xen_common.c | 48 tools/libxen/src/xen_cpu_feature.c | 4 tools/pygrub/src/pygrub | 232 + tools/python/Makefile | 18 tools/python/scripts/xapi.py | 95 tools/python/xen/lowlevel/acm/acm.c | 33 tools/python/xen/util/Brctl.py | 25 tools/python/xen/util/security.py | 12 tools/python/xen/util/xmlrpclib2.py | 46 tools/python/xen/xend/XendAPI.py | 1015 ++++---- tools/python/xen/xend/XendAPIConstants.py | 3 tools/python/xen/xend/XendAuthSessions.py | 13 tools/python/xen/xend/XendBootloader.py | 6 tools/python/xen/xend/XendConfig.py | 90 tools/python/xen/xend/XendConstants.py | 1 tools/python/xen/xend/XendDomain.py | 51 tools/python/xen/xend/XendDomainInfo.py | 84 tools/python/xen/xend/XendError.py | 11 tools/python/xen/xend/XendLogging.py | 23 tools/python/xen/xend/XendNetwork.py | 112 tools/python/xen/xend/XendNode.py | 234 + tools/python/xen/xend/XendPIF.py | 198 + tools/python/xen/xend/XendRoot.py | 8 tools/python/xen/xend/XendStateStore.py | 210 + tools/python/xen/xend/XendStorageRepository.py | 184 - tools/python/xen/xend/XendVDI.py | 15 tools/python/xen/xend/image.py | 18 tools/python/xen/xend/osdep.py | 5 tools/python/xen/xend/server/SrvDaemon.py | 2 tools/python/xen/xend/server/SrvServer.py | 16 tools/python/xen/xend/server/XMLRPCServer.py | 15 tools/python/xen/xend/server/netif.py | 8 tools/python/xen/xend/server/vfbif.py | 2 tools/python/xen/xm/XenAPI.py | 75 tools/python/xen/xm/create.py | 22 tools/python/xen/xm/main.py | 49 tools/python/xen/xm/messages/en/xen-xm.po | 72 tools/python/xen/xm/migrate.py | 1 tools/python/xen/xm/opts.py | 8 tools/python/xen/xm/shutdown.py | 1 tools/tests/test_x86_emulator.c | 180 + tools/xenstat/xentop/Makefile | 1 tools/xenstat/xentop/xentop.c | 11 tools/xenstore/Makefile | 2 tools/xenstore/list.h | 2 tools/xm-test/lib/XmTestLib/DomainTracking.py | 43 tools/xm-test/lib/XmTestLib/XenDomain.py | 28 tools/xm-test/ramdisk/Makefile.am | 13 tools/xm-test/ramdisk/skel/etc/init.d/rcS | 11 tools/xm-test/tests/block-destroy/06_block-destroy_check_list_pos.py | 8 tools/xm-test/tests/sched-credit/01_sched_credit_weight_cap_pos.py | 33 unmodified_drivers/linux-2.6/platform-pci/evtchn.c | 75 xen/Makefile | 18 xen/Rules.mk | 1 xen/arch/ia64/xen/domain.c | 22 xen/arch/ia64/xen/xenmisc.c | 20 xen/arch/powerpc/domain.c | 4 xen/arch/powerpc/domain_build.c | 2 xen/arch/powerpc/domctl.c | 6 xen/arch/powerpc/setup.c | 13 xen/arch/powerpc/xen.lds.S | 4 xen/arch/x86/boot/x86_32.S | 2 xen/arch/x86/boot/x86_64.S | 29 xen/arch/x86/compat.c | 14 xen/arch/x86/crash.c | 3 xen/arch/x86/domain.c | 711 ++++- xen/arch/x86/domain_build.c | 236 + xen/arch/x86/domctl.c | 113 xen/arch/x86/e820.c | 35 xen/arch/x86/hvm/Makefile | 2 xen/arch/x86/hvm/hpet.c | 409 +++ xen/arch/x86/hvm/hvm.c | 119 xen/arch/x86/hvm/i8254.c | 59 xen/arch/x86/hvm/instrlen.c | 32 xen/arch/x86/hvm/intercept.c | 98 xen/arch/x86/hvm/io.c | 33 xen/arch/x86/hvm/irq.c | 65 xen/arch/x86/hvm/platform.c | 24 xen/arch/x86/hvm/pmtimer.c | 8 xen/arch/x86/hvm/rtc.c | 80 xen/arch/x86/hvm/svm/intr.c | 47 xen/arch/x86/hvm/svm/svm.c | 182 - xen/arch/x86/hvm/vioapic.c | 4 xen/arch/x86/hvm/vlapic.c | 228 - xen/arch/x86/hvm/vmx/intr.c | 12 xen/arch/x86/hvm/vmx/vmx.c | 132 - xen/arch/x86/hvm/vpic.c | 16 xen/arch/x86/hvm/vpt.c | 234 + xen/arch/x86/irq.c | 12 xen/arch/x86/mm.c | 458 ++- xen/arch/x86/mm/shadow/common.c | 401 +-- xen/arch/x86/mm/shadow/multi.c | 214 + xen/arch/x86/mm/shadow/multi.h | 4 xen/arch/x86/mm/shadow/private.h | 164 + xen/arch/x86/mm/shadow/types.h | 4 xen/arch/x86/physdev.c | 13 xen/arch/x86/platform_hypercall.c | 19 xen/arch/x86/setup.c | 16 xen/arch/x86/sysctl.c | 8 xen/arch/x86/time.c | 16 xen/arch/x86/traps.c | 342 ++ xen/arch/x86/x86_32/mm.c | 12 xen/arch/x86/x86_32/seg_fixup.c | 5 xen/arch/x86/x86_32/traps.c | 6 xen/arch/x86/x86_32/xen.lds.S | 17 xen/arch/x86/x86_64/Makefile | 19 xen/arch/x86/x86_64/asm-offsets.c | 39 xen/arch/x86/x86_64/compat.c | 30 xen/arch/x86/x86_64/compat/entry.S | 365 ++ xen/arch/x86/x86_64/compat/mm.c | 329 ++ xen/arch/x86/x86_64/compat/traps.c | 338 ++ xen/arch/x86/x86_64/domain.c | 68 xen/arch/x86/x86_64/domctl.c | 111 xen/arch/x86/x86_64/entry.S | 29 xen/arch/x86/x86_64/mm.c | 93 xen/arch/x86/x86_64/physdev.c | 48 xen/arch/x86/x86_64/platform_hypercall.c | 29 xen/arch/x86/x86_64/sysctl.c | 33 xen/arch/x86/x86_64/traps.c | 19 xen/arch/x86/x86_64/xen.lds.S | 17 xen/arch/x86/x86_emulate.c | 843 ++++-- xen/common/Makefile | 12 xen/common/acm_ops.c | 21 xen/common/compat/Makefile | 13 xen/common/compat/acm_ops.c | 47 xen/common/compat/domain.c | 91 xen/common/compat/domctl.c | 137 + xen/common/compat/grant_table.c | 218 + xen/common/compat/kernel.c | 59 xen/common/compat/kexec.c | 33 xen/common/compat/memory.c | 364 ++ xen/common/compat/multicall.c | 31 xen/common/compat/schedule.c | 51 xen/common/compat/sysctl.c | 95 xen/common/compat/xenoprof.c | 40 xen/common/compat/xlat.c | 73 xen/common/domain.c | 53 xen/common/domctl.c | 98 xen/common/elf.c | 65 xen/common/elf32.c | 19 xen/common/event_channel.c | 21 xen/common/gdbstub.c | 2 xen/common/grant_table.c | 4 xen/common/kernel.c | 31 xen/common/kexec.c | 166 - xen/common/keyhandler.c | 13 xen/common/lib.c | 17 xen/common/memory.c | 22 xen/common/multicall.c | 5 xen/common/page_alloc.c | 2 xen/common/schedule.c | 38 xen/common/symbols.c | 9 xen/common/sysctl.c | 18 xen/common/time.c | 4 xen/common/trace.c | 78 xen/common/vsprintf.c | 18 xen/common/xenoprof.c | 70 xen/common/xmalloc.c | 4 xen/drivers/char/ns16550.c | 2 xen/include/Makefile | 69 xen/include/asm-ia64/init.h | 25 xen/include/asm-ia64/shared.h | 4 xen/include/asm-powerpc/init.h | 19 xen/include/asm-powerpc/shared.h | 4 xen/include/asm-x86/bitops.h | 11 xen/include/asm-x86/compat.h | 8 xen/include/asm-x86/config.h | 63 xen/include/asm-x86/desc.h | 99 xen/include/asm-x86/domain.h | 5 xen/include/asm-x86/event.h | 14 xen/include/asm-x86/hvm/hvm.h | 6 xen/include/asm-x86/hvm/io.h | 2 xen/include/asm-x86/hvm/irq.h | 10 xen/include/asm-x86/hvm/support.h | 1 xen/include/asm-x86/hvm/svm/vmcb.h | 1 xen/include/asm-x86/hvm/vcpu.h | 1 xen/include/asm-x86/hvm/vlapic.h | 26 xen/include/asm-x86/hvm/vmx/cpu.h | 13 xen/include/asm-x86/hvm/vpt.h | 135 - xen/include/asm-x86/hypercall.h | 20 xen/include/asm-x86/init.h | 25 xen/include/asm-x86/ldt.h | 3 xen/include/asm-x86/mm.h | 28 xen/include/asm-x86/multicall.h | 25 xen/include/asm-x86/page.h | 5 xen/include/asm-x86/processor.h | 6 xen/include/asm-x86/regs.h | 3 xen/include/asm-x86/shadow.h | 503 +--- xen/include/asm-x86/shared.h | 78 xen/include/asm-x86/system.h | 2 xen/include/asm-x86/uaccess.h | 10 xen/include/asm-x86/x86_32/kexec.h | 1 xen/include/asm-x86/x86_32/page-2level.h | 2 xen/include/asm-x86/x86_32/page-3level.h | 2 xen/include/asm-x86/x86_32/regs.h | 2 xen/include/asm-x86/x86_32/uaccess.h | 2 xen/include/asm-x86/x86_64/kexec.h | 1 xen/include/asm-x86/x86_64/page.h | 7 xen/include/asm-x86/x86_64/regs.h | 7 xen/include/asm-x86/x86_64/uaccess.h | 15 xen/include/asm-x86/x86_emulate.h | 24 xen/include/public/arch-x86/xen-x86_32.h | 151 + xen/include/public/arch-x86/xen-x86_64.h | 211 + xen/include/public/arch-x86/xen.h | 200 + xen/include/public/arch-x86_32.h | 247 -- xen/include/public/arch-x86_64.h | 316 -- xen/include/public/domctl.h | 5 xen/include/public/hvm/ioreq.h | 5 xen/include/public/xen.h | 10 xen/include/public/xenoprof.h | 2 xen/include/xen/compat.h | 180 + xen/include/xen/domain.h | 17 xen/include/xen/elf.h | 11 xen/include/xen/elfcore.h | 57 xen/include/xen/hypercall.h | 19 xen/include/xen/init.h | 19 xen/include/xen/kernel.h | 31 xen/include/xen/lib.h | 10 xen/include/xen/multicall.h | 10 xen/include/xen/perfc.h | 3 xen/include/xen/sched.h | 47 xen/include/xen/shared.h | 54 xen/include/xen/symbols.h | 5 xen/include/xen/xenoprof.h | 26 xen/include/xen/xmalloc.h | 2 xen/include/xlat.lst | 52 xen/tools/get-fields.sh | 425 +++ xen/tools/symbols.c | 479 +-- firmware/etherboot/eb-rtl8139.zrom | 0 341 files changed, 14517 insertions(+), 6479 deletions(-) diff -r 42babffffba5 -r 58633caeece9 .hgignore --- a/.hgignore Wed Jan 10 08:00:50 2007 -0700 +++ b/.hgignore Wed Jan 10 08:40:47 2007 -0700 @@ -20,6 +20,7 @@ ^\.config$ ^TAGS$ ^tags$ +^build.*$ ^dist/.*$ ^docs/.*\.aux$ ^docs/.*\.dvi$ @@ -205,6 +206,7 @@ ^xen/ddb/.*$ ^xen/include/asm$ ^xen/include/asm-.*/asm-offsets\.h$ +^xen/include/compat/.*$ ^xen/include/hypervisor-ifs/arch$ ^xen/include/public/public$ ^xen/include/xen/.*\.new$ diff -r 42babffffba5 -r 58633caeece9 .hgtags --- a/.hgtags Wed Jan 10 08:00:50 2007 -0700 +++ b/.hgtags Wed Jan 10 08:40:47 2007 -0700 @@ -16,3 +16,4 @@ af0573e9e5258db0a9d28aa954dd302ddd2c2d23 af0573e9e5258db0a9d28aa954dd302ddd2c2d23 3.0.2-rc d0d3fef37685be264a7f52201f8ef44c030daad3 3.0.2-branched 6ed4368b4a9e1924c983774c4b1a2b6baf8e98a6 3.0.3-branched +057f7c4dbed1c75a3fbe446d346cee04cff31497 3.0.4-branched diff -r 42babffffba5 -r 58633caeece9 Config.mk --- a/Config.mk Wed Jan 10 08:00:50 2007 -0700 +++ b/Config.mk Wed Jan 10 08:40:47 2007 -0700 @@ -10,6 +10,8 @@ XEN_OS ?= $(shell uname -s) XEN_OS ?= $(shell uname -s) CONFIG_$(XEN_OS) := y + +SHELL ?= /bin/sh # Tools to run on system hosting the build HOSTCC = gcc diff -r 42babffffba5 -r 58633caeece9 buildconfigs/mk.linux-2.6-xen --- a/buildconfigs/mk.linux-2.6-xen Wed Jan 10 08:00:50 2007 -0700 +++ b/buildconfigs/mk.linux-2.6-xen Wed Jan 10 08:40:47 2007 -0700 @@ -3,7 +3,8 @@ LINUX_VER = 2.6.16.33 EXTRAVERSION ?= xen -LINUX_DIR = linux-$(LINUX_VER)-$(EXTRAVERSION) +LINUX_SRCDIR = linux-$(LINUX_VER)-xen +LINUX_DIR = build-linux-$(LINUX_VER)-$(EXTRAVERSION)_$(XEN_TARGET_ARCH) IMAGE_TARGET ?= vmlinuz INSTALL_BOOT_PATH ?= $(DESTDIR) @@ -23,24 +24,31 @@ build: $(LINUX_DIR)/include/linux/autoco mkdir -p $(INSTALL_BOOT_PATH) $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_PATH=$(INSTALL_BOOT_PATH) install -$(LINUX_DIR)/include/linux/autoconf.h: ref-linux-$(LINUX_VER)/.valid-ref - rm -rf $(LINUX_DIR) - cp -al $(<D) $(LINUX_DIR) +$(LINUX_SRCDIR)/.valid-src: ref-linux-$(LINUX_VER)/.valid-ref + rm -rf $(LINUX_SRCDIR) + cp -al $(<D) $(LINUX_SRCDIR) # Apply arch-xen patches ( cd linux-$(LINUX_SERIES)-xen-sparse && \ - LINUX_ARCH=$(LINUX_ARCH) bash ./mkbuildtree ../$(LINUX_DIR) ) + LINUX_ARCH=$(LINUX_ARCH) bash ./mkbuildtree ../$(LINUX_SRCDIR) ) + # Patch kernel Makefile to set EXTRAVERSION + ( cd $(LINUX_SRCDIR) ; \ + sed -e 's,^EXTRAVERSION.*,&$$(XENGUEST),' \ + -e 's,^KERNELRELEASE,XENGUEST := $$(shell [ -r $$(objtree)/.xenguest ] \&\& cat $$(objtree)/.xenguest)\n&,' Makefile >Mk.tmp ; \ + rm -f Makefile ; mv Mk.tmp Makefile ) + touch $@ + +$(LINUX_DIR)/include/linux/autoconf.h: $(LINUX_SRCDIR)/.valid-src + rm -rf $(LINUX_DIR) + mkdir -p $(LINUX_DIR) # Re-use config from install dir if one exits else use default config - CONFIG_VERSION=$$(sed -ne 's/^EXTRAVERSION = //p' $(LINUX_DIR)/Makefile); \ + CONFIG_VERSION=$$(sed -ne 's/$$(XENGUEST)//; s/^EXTRAVERSION = //p' $(LINUX_SRCDIR)/Makefile); \ [ -r $(DESTDIR)/boot/config-$(LINUX_VER3)$$CONFIG_VERSION-$(EXTRAVERSION) ] && \ cp $(DESTDIR)/boot/config-$(LINUX_VER3)$$CONFIG_VERSION-$(EXTRAVERSION) $(LINUX_DIR)/.config \ || sh buildconfigs/create_config.sh $(LINUX_DIR)/.config $(EXTRAVERSION) $(XEN_TARGET_ARCH) $(XEN_SYSTYPE) # See if we need to munge config to enable PAE $(MAKE) CONFIG_FILE=$(LINUX_DIR)/.config -f buildconfigs/Rules.mk config-update-pae - # Patch kernel Makefile to set EXTRAVERSION - ( cd $(LINUX_DIR) ; \ - sed -e 's/^EXTRAVERSION.*/&$$(XENGUEST)\nXENGUEST = -$(EXTRAVERSION)/' Makefile >Mk.tmp ; \ - rm -f Makefile ; mv Mk.tmp Makefile ) - $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) oldconfig + echo "-$(EXTRAVERSION)" >$(LINUX_DIR)/.xenguest + $(MAKE) -C $(LINUX_SRCDIR) ARCH=$(LINUX_ARCH) oldconfig O=$$(/bin/pwd)/$(LINUX_DIR) .PHONY: prep prep: $(LINUX_DIR)/include/linux/autoconf.h @@ -62,4 +70,5 @@ delete: .PHONY: mrpropper mrpropper: + rm -rf $(LINUX_SRCDIR) rm -f linux-$(LINUX_VER).tar.bz2 diff -r 42babffffba5 -r 58633caeece9 config/StdGNU.mk --- a/config/StdGNU.mk Wed Jan 10 08:00:50 2007 -0700 +++ b/config/StdGNU.mk Wed Jan 10 08:40:47 2007 -0700 @@ -8,6 +8,8 @@ STRIP = $(CROSS_COMPILE)strip STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump + +MSGFMT = msgfmt INSTALL = install INSTALL_DIR = $(INSTALL) -d -m0755 diff -r 42babffffba5 -r 58633caeece9 config/SunOS.mk --- a/config/SunOS.mk Wed Jan 10 08:00:50 2007 -0700 +++ b/config/SunOS.mk Wed Jan 10 08:40:47 2007 -0700 @@ -8,6 +8,8 @@ STRIP = $(CROSS_COMPILE)gstrip STRIP = $(CROSS_COMPILE)gstrip OBJCOPY = $(CROSS_COMPILE)gobjcopy OBJDUMP = $(CROSS_COMPILE)gobjdump + +MSGFMT = gmsgfmt SHELL = bash diff -r 42babffffba5 -r 58633caeece9 config/x86_64.mk --- a/config/x86_64.mk Wed Jan 10 08:00:50 2007 -0700 +++ b/config/x86_64.mk Wed Jan 10 08:40:47 2007 -0700 @@ -2,6 +2,7 @@ CONFIG_X86_64 := y CONFIG_X86_64 := y CONFIG_X86_$(XEN_OS) := y +CONFIG_COMPAT := y CONFIG_HVM := y CONFIG_MIGRATE := y CONFIG_XCUTILS := y diff -r 42babffffba5 -r 58633caeece9 docs/xen-api/wire-protocol.tex --- a/docs/xen-api/wire-protocol.tex Wed Jan 10 08:00:50 2007 -0700 +++ b/docs/xen-api/wire-protocol.tex Wed Jan 10 08:40:47 2007 -0700 @@ -105,11 +105,13 @@ the struct contains a second element nam the struct contains a second element named {\tt ErrorDescription}: \begin{itemize} \item The element of the struct named {\tt ErrorDescription} contains -an array of string values. The first element of the array is an XML-RPC 32-bit {\tt i4} and represents an error code; -the remainder of the array are strings representing error parameters relating to that code. -\end{itemize} - -For example, an XML-RPC return value from the {\tt Host.ListAllVMs} function above +an array of string values. The first element of the array is an error code; +the remainder of the array are strings representing error parameters relating +to that code. +\end{itemize} + +For example, an XML-RPC return value from the {\tt host.get\_resident\_VMs} +function above may look like this: \begin{verbatim} <struct> @@ -122,9 +124,9 @@ may look like this: <value> <array> <data> - <value>vm-id-1</value> - <value>vm-id-2</value> - <value>vm-id-3</value> + <value>81547a35-205c-a551-c577-00b982c5fe00</value> + <value>61c85a22-05da-b8a2-2e55-06b0847da503</value> + <value>1d401ec4-3c17-35a6-fc79-cee6bd9811fe</value> </data> </array> </value> @@ -147,16 +149,16 @@ The XML-RPC interface is session-based; The XML-RPC interface is session-based; before you can make arbitrary RPC calls you must login and initiate a session. For example: \begin{verbatim} - session_id Session.login_with_password(string uname, string pwd) + session_id session.login_with_password(string uname, string pwd) \end{verbatim} Where {\tt uname} and {\tt password} refer to your username and password respectively, as defined by the Xen administrator. -The {\tt session\_id} returned by {\tt Session.Login} is passed to subequent -RPC calls as an authentication token. - -A session can be terminated with the {\tt Session.Logout} function: -\begin{verbatim} - void Session.Logout(session_id session) +The {\tt session\_id} returned by {\tt session.login_with_password} is passed +to subequent RPC calls as an authentication token. + +A session can be terminated with the {\tt session.logout} function: +\begin{verbatim} + void session.logout(session_id session) \end{verbatim} \subsection{Synchronous and Asynchronous invocation} @@ -214,10 +216,12 @@ Create a python object referencing the r >>> xen = xmlrpclib.Server("http://test:4464") \end{verbatim} -Acquire a session token by logging in with a username and password (error-handling ommitted for brevity; the session token is pointed to by the key {\tt 'Value'} in the returned dictionary) - -\begin{verbatim} ->>> session = xen.Session.do_login_with_password("user", "passwd")['Value'] +Acquire a session token by logging in with a username and password +(error-handling ommitted for brevity; the session token is pointed to by the +key {\tt 'Value'} in the returned dictionary) + +\begin{verbatim} +>>> session = session.login_with_password("user", "passwd")['Value'] \end{verbatim} When serialised, this call looks like the following: @@ -225,7 +229,7 @@ When serialised, this call looks like th \begin{verbatim} <?xml version='1.0'?> <methodCall> - <methodName>Session.do_login_with_password</methodName> + <methodName>session.login_with_password</methodName> <params> <param> <value><string>user</string></value> @@ -237,27 +241,34 @@ When serialised, this call looks like th </methodCall> \end{verbatim} -Next, the user may acquire a list of all the VMs known to the host: (Note the call takes the session token as the only parameter) - -\begin{verbatim} ->>> all_vms = xen.VM.do_list(session)['Value'] +Next, the user may acquire a list of all the VMs known to the host: (Note the +call takes the session token as the only parameter) + +\begin{verbatim} +>>> all_vms = host.get_resident_VMs(session)['Value'] >>> all_vms ['b7b92d9e-d442-4710-92a5-ab039fd7d89b', '23e1e837-abbf-4675-b077-d4007989b0cc', '2045dbc0-0734-4eea-9cb2-b8218c6b5bf2', '3202ae18-a046-4c32-9fda-e32e9631866e'] \end{verbatim} -Note the VM references are internally UUIDs. Once a reference to a VM has been acquired a lifecycle operation may be invoked: - -\begin{verbatim} ->>> xen.VM.do_start(session, all_vms[3], False) -{'Status': 'Failure', 'ErrorDescription': 'Operation not implemented'} -\end{verbatim} - -In this case the {\tt start} message has not been implemented and an error response has been returned. Currently these high-level errors are returned as structured data (rather than as XMLRPC faults), allowing for internationalised errors in future. Finally, here are some examples of using accessors for object fields: - -\begin{verbatim} ->>> xen.VM.getname_label(session, all_vms[3])['Value'] +The VM references here are UUIDs, though they may not be that simple in the +future, and you should treat them as opaque strings. Once a reference to a VM +has been acquired a lifecycle operation may be invoked: + +\begin{verbatim} +>>> xen.VM.start(session, all_vms[3], False) +{'Status': 'Failure', 'ErrorDescription': ['VM_BAD_POWER_STATE', 'Halted', 'Running']} +\end{verbatim} + +In this case the {\tt start} message has been rejected, because the VM is +already running, and so an error response has been returned. These high-level +errors are returned as structured data (rather than as XML-RPC faults), +allowing them to be internationalised. Finally, here are some examples of +using accessors for object fields: + +\begin{verbatim} +>>> xen.VM.get_name_label(session, all_vms[3])['Value'] 'SMP' ->>> xen.VM.getname_description(session, all_vms[3])['Value'] +>>> xen.VM.get_name_description(session, all_vms[3])['Value'] 'Debian for Xen' \end{verbatim} diff -r 42babffffba5 -r 58633caeece9 docs/xen-api/xenapi-datamodel.tex --- a/docs/xen-api/xenapi-datamodel.tex Wed Jan 10 08:00:50 2007 -0700 +++ b/docs/xen-api/xenapi-datamodel.tex Wed Jan 10 08:40:47 2007 -0700 @@ -184,8 +184,8 @@ The following enumeration types are used \hspace{0.5cm}{\tt NX} & Execute Disable \\ \hspace{0.5cm}{\tt MMXEXT} & AMD MMX extensions \\ \hspace{0.5cm}{\tt LM} & Long Mode (x86-64) \\ -\hspace{0.5cm}{\tt 3DNOWEXT} & AMD 3DNow! extensions \\ -\hspace{0.5cm}{\tt 3DNOW} & 3DNow! \\ +\hspace{0.5cm}{\tt THREEDNOWEXT} & AMD 3DNow! extensions \\ +\hspace{0.5cm}{\tt THREEDNOW} & 3DNow! \\ \hspace{0.5cm}{\tt RECOVERY} & CPU in recovery mode \\ \hspace{0.5cm}{\tt LONGRUN} & Longrun power control \\ \hspace{0.5cm}{\tt LRTI} & LongRun table interface \\ @@ -244,18 +244,6 @@ The following enumeration types are used \vspace{1cm} \begin{longtable}{|ll|} \hline -{\tt enum boot\_type} & \\ -\hline -\hspace{0.5cm}{\tt bios} & boot an HVM guest using an emulated BIOS \\ -\hspace{0.5cm}{\tt grub} & boot from inside the machine using grub \\ -\hspace{0.5cm}{\tt kernel\_external} & boot from an external kernel \\ -\hspace{0.5cm}{\tt kernel\_internal} & boot from a kernel inside the guest filesystem \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline {\tt enum vbd\_mode} & \\ \hline \hspace{0.5cm}{\tt RO} & disk is mounted read-only \\ @@ -298,6 +286,7 @@ Quals & Field & Type & Description \\ $\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ $\mathit{RO}_\mathit{ins}$ & {\tt this\_host} & host ref & Currently connected host \\ $\mathit{RO}_\mathit{ins}$ & {\tt this\_user} & user ref & Currently connected user \\ +$\mathit{RO}_\mathit{run}$ & {\tt last\_active} & int & Timestamp for last time session was active \\ \hline \end{longtable} \subsection{Additional RPCs associated with class: session} @@ -452,45 +441,13 @@ value of the field \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new session instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (session ref) create (session_id s, session record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt session record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -session ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified session instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, session ref self)\end{verbatim} +\subsubsection{RPC name:~get\_last\_active} + +{\bf Overview:} +Get the last\_active field of the given session. + + \noindent {\bf Signature:} +\begin{verbatim} int get_last_active (session_id s, session ref self)\end{verbatim} \noindent{\bf Arguments:} @@ -508,11 +465,11 @@ Destroy the specified session instance. \noindent {\bf Return Type:} {\tt -void -} - - - +int +} + + +value of the field \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} @@ -608,7 +565,7 @@ Quals & Field & Type & Description \\ \subsubsection{RPC name:~get\_all} {\bf Overview:} -Return a list of all the tasks known to the system +Return a list of all the tasks known to the system. \noindent {\bf Signature:} \begin{verbatim} ((task ref) Set) get_all (session_id s)\end{verbatim} @@ -1011,70 +968,6 @@ string Set value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new task instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (task ref) create (session_id s, task record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -task ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified task instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, task 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 task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} @@ -1182,7 +1075,34 @@ references to objects with match names \begin{longtable}{|lllp{0.38\textwidth}|} \hline \multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VM} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A virtual machine (or 'guest')}} \\ +\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A virtual machine (or 'guest'). + +VM booting is controlled by setting one of the two mutually exclusive +groups: "PV", and "HVM". If HVM.boot is the empty string, then paravirtual +domain building and booting will be used; otherwise the VM will be loaded +as an HVM domain, and booted using an emulated BIOS. + +When paravirtual booting is in use, the PV/bootloader field indicates the +bootloader to use. It may be "pygrub", in which case the platform's +default installation of pygrub will be used, or a full path within the +control domain to some other bootloader. The other fields, PV/kernel, +PV/ramdisk, PV/args and PV/bootloader\_args will be passed to the +bootloader unmodified, and interpretation of those fields is then specific +to the bootloader itself, including the possibility that the bootloader +will ignore some or all of those given values. + +If the bootloader is pygrub, then the menu.lst is parsed if present in the +guest's filesystem, otherwise the specified kernel and ramdisk are used, or +an autodetected kernel is used if nothing is specified and autodetection is +possible. PV/args is appended to the kernel command line, no matter which +mechanism is used for finding the kernel. + +If PV/bootloader is empty but PV/kernel is specified, then the kernel and +ramdisk values will be treated as paths within the control domain. If both +PV/bootloader and PV/kernel are empty, then the behaviour is as if +PV/bootloader was specified as "pygrub". + +When using HVM booting, HVM/boot specifies the order of the boot devices}} \\ \hline Quals & Field & Type & Description \\ \hline @@ -1215,18 +1135,17 @@ Quals & Field & Type & Description \\ $\mathit{RO}_\mathit{run}$ & {\tt VIFs} & (VIF ref) Set & virtual network interfaces \\ $\mathit{RO}_\mathit{run}$ & {\tt VBDs} & (VBD ref) Set & virtual block devices \\ $\mathit{RO}_\mathit{run}$ & {\tt VTPMs} & (VTPM ref) Set & virtual TPMs \\ -$\mathit{RW}$ & {\tt bios/boot} & string & device to boot the guest from \\ +$\mathit{RW}$ & {\tt PV/bootloader} & string & name of or path to bootloader \\ +$\mathit{RW}$ & {\tt PV/kernel} & string & path to the kernel \\ +$\mathit{RW}$ & {\tt PV/ramdisk} & string & path to the initrd \\ +$\mathit{RW}$ & {\tt PV/args} & string & kernel command-line arguments \\ +$\mathit{RW}$ & {\tt PV/bootloader\_args} & string & miscellaneous arguments for the bootloader \\ +$\mathit{RW}$ & {\tt HVM/boot} & string & device boot order \\ $\mathit{RW}$ & {\tt platform/std\_VGA} & bool & emulate standard VGA instead of cirrus logic \\ $\mathit{RW}$ & {\tt platform/serial} & string & redirect serial port to pty \\ $\mathit{RW}$ & {\tt platform/localtime} & bool & set RTC to local time \\ $\mathit{RW}$ & {\tt platform/clock\_offset} & bool & timeshift applied to guest's clock \\ $\mathit{RW}$ & {\tt platform/enable\_audio} & bool & emulate audio \\ -$\mathit{RW}$ & {\tt builder} & string & domain builder to use \\ -$\mathit{RW}$ & {\tt boot\_method} & boot\_type & select how this machine should boot \\ -$\mathit{RW}$ & {\tt kernel/kernel} & string & path to kernel e.g. /boot/vmlinuz \\ -$\mathit{RW}$ & {\tt kernel/initrd} & string & path to the initrd e.g. /boot/initrd.img \\ -$\mathit{RW}$ & {\tt kernel/args} & string & extra kernel command-line arguments \\ -$\mathit{RW}$ & {\tt grub/cmdline} & string & grub command-line \\ $\mathit{RO}_\mathit{ins}$ & {\tt PCI\_bus} & string & PCI bus path for pass-through devices \\ $\mathit{RO}_\mathit{run}$ & {\tt tools\_version} & (string $\rightarrow$ string) Map & versions of installed paravirtualised drivers \\ $\mathit{RW}$ & {\tt otherConfig} & (string $\rightarrow$ string) Map & additional configuration \\ @@ -1265,8 +1184,10 @@ VM ref The ID of the newly created VM. \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} + +\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} + +\vspace{0.6cm} \subsubsection{RPC name:~start} {\bf Overview:} @@ -1299,8 +1220,10 @@ void \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} + +\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} + +\vspace{0.6cm} \subsubsection{RPC name:~pause} {\bf Overview:} @@ -1331,8 +1254,10 @@ void \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} + +\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} + +\vspace{0.6cm} \subsubsection{RPC name:~unpause} {\bf Overview:} @@ -1349,7 +1274,7 @@ Resume the specified VM. This can only b \begin{tabular}{|c|c|p{7cm}|} \hline {\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to pause \\ \hline +{\tt VM ref } & vm & The VM to unpause \\ \hline \end{tabular} @@ -1363,8 +1288,10 @@ void \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} + +\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} + +\vspace{0.6cm} \subsubsection{RPC name:~clean\_shutdown} {\bf Overview:} @@ -1372,6 +1299,8 @@ Attempt to cleanly shutdown the specifie Once shutdown has been completed perform poweroff action specified in guest configuration. +This can only be called when the specified VM is in the Running state. + \noindent {\bf Signature:} \begin{verbatim} void clean_shutdown (session_id s, VM ref vm)\end{verbatim} @@ -1397,8 +1326,10 @@ void \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} + +\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} + +\vspace{0.6cm} \subsubsection{RPC name:~clean\_reboot} {\bf Overview:} @@ -1406,6 +1337,8 @@ Attempt to cleanly shutdown the specifie Once shutdown has been completed perform reboot action specified in guest configuration. +This can only be called when the specified VM is in the Running state. + \noindent {\bf Signature:} \begin{verbatim} void clean_reboot (session_id s, VM ref vm)\end{verbatim} @@ -1431,8 +1364,10 @@ void \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} + +\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} + +\vspace{0.6cm} \subsubsection{RPC name:~hard\_shutdown} {\bf Overview:} @@ -1500,7 +1435,7 @@ void \subsubsection{RPC name:~suspend} {\bf Overview:} -Suspend the specified VM to disk. +Suspend the specified VM to disk. This can only be called when the specified VM is in the Running state. \noindent {\bf Signature:} \begin{verbatim} void suspend (session_id s, VM ref vm)\end{verbatim} @@ -1527,12 +1462,14 @@ void \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} + +\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} + +\vspace{0.6cm} \subsubsection{RPC name:~resume} {\bf Overview:} -Awaken the specified VM and resume it. +Awaken the specified VM and resume it. This can only be called when the specified VM is in the Suspended state. \noindent {\bf Signature:} \begin{verbatim} void resume (session_id s, VM ref vm, bool start_paused)\end{verbatim} @@ -1561,8 +1498,10 @@ void \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} + +\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} + +\vspace{0.6cm} \subsubsection{RPC name:~get\_all} {\bf Overview:} @@ -2601,7 +2540,7 @@ void \subsubsection{RPC name:~add\_VCPUs\_features\_force\_on} {\bf Overview:} -set add message derived from field VCPUs/features/force\_on of object VM +Add the given value to the VCPUs/features/force\_on field of the given VM. If the value is already in that Set, then do nothing. \noindent {\bf Signature:} \begin{verbatim} void add_VCPUs_features_force_on (session_id s, VM ref self, cpu_feature value)\end{verbatim} @@ -2635,7 +2574,7 @@ void \subsubsection{RPC name:~remove\_VCPUs\_features\_force\_on} {\bf Overview:} -set remove message derived from field VCPUs/features/force\_on of object VM +Remove the given value from the VCPUs/features/force\_on field of the given VM. If the value is not in that Set, then do nothing. \noindent {\bf Signature:} \begin{verbatim} void remove_VCPUs_features_force_on (session_id s, VM ref self, cpu_feature value)\end{verbatim} @@ -2735,7 +2674,7 @@ void \subsubsection{RPC name:~add\_VCPUs\_features\_force\_off} {\bf Overview:} -set add message derived from field VCPUs/features/force\_off of object VM +Add the given value to the VCPUs/features/force\_off field of the given VM. If the value is already in that Set, then do nothing. \noindent {\bf Signature:} \begin{verbatim} void add_VCPUs_features_force_off (session_id s, VM ref self, cpu_feature value)\end{verbatim} @@ -2769,7 +2708,7 @@ void \subsubsection{RPC name:~remove\_VCPUs\_features\_force\_off} {\bf Overview:} -set remove message derived from field VCPUs/features/force\_off of object VM +Remove the given value from the VCPUs/features/force\_off field of the given VM. If the value is not in that Set, then do nothing. \noindent {\bf Signature:} \begin{verbatim} void remove_VCPUs_features_force_off (session_id s, VM ref self, cpu_feature value)\end{verbatim} @@ -3192,13 +3131,13 @@ value of the field \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} -\subsubsection{RPC name:~get\_bios\_boot} - -{\bf Overview:} -Get the bios/boot field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_bios_boot (session_id s, VM ref self)\end{verbatim} +\subsubsection{RPC name:~get\_PV\_bootloader} + +{\bf Overview:} +Get the PV/bootloader field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} string get_PV_bootloader (session_id s, VM ref self)\end{verbatim} \noindent{\bf Arguments:} @@ -3224,13 +3163,13 @@ value of the field \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} -\subsubsection{RPC name:~set\_bios\_boot} - -{\bf Overview:} -Set the bios/boot field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_bios_boot (session_id s, VM ref self, string value)\end{verbatim} +\subsubsection{RPC name:~set\_PV\_bootloader} + +{\bf Overview:} +Set the PV/bootloader field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} void set_PV_bootloader (session_id s, VM ref self, string value)\end{verbatim} \noindent{\bf Arguments:} @@ -3258,6 +3197,336 @@ void \vspace{0.3cm} \vspace{0.3cm} \vspace{0.3cm} +\subsubsection{RPC name:~get\_PV\_kernel} + +{\bf Overview:} +Get the PV/kernel field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} string get_PV_kernel (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\_PV\_kernel} + +{\bf Overview:} +Set the PV/kernel field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} void set_PV_kernel (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} + +\vspace{0.3cm} + + \noindent {\bf Return Type:} +{\tt +void +} + + + +\vspace{0.3cm} +\vspace{0.3cm} +\vspace{0.3cm} +\subsubsection{RPC name:~get\_PV\_ramdisk} + +{\bf Overview:} +Get the PV/ramdisk field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} string get_PV_ramdisk (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\_PV\_ramdisk} + +{\bf Overview:} +Set the PV/ramdisk field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} void set_PV_ramdisk (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} + +\vspace{0.3cm} + + \noindent {\bf Return Type:} +{\tt +void +} + + + +\vspace{0.3cm} +\vspace{0.3cm} +\vspace{0.3cm} +\subsubsection{RPC name:~get\_PV\_args} + +{\bf Overview:} +Get the PV/args field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} string get_PV_args (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\_PV\_args} + +{\bf Overview:} +Set the PV/args field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} void set_PV_args (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} + +\vspace{0.3cm} + + \noindent {\bf Return Type:} +{\tt +void +} + + + +\vspace{0.3cm} +\vspace{0.3cm} +\vspace{0.3cm} +\subsubsection{RPC name:~get\_PV\_bootloader\_args} + +{\bf Overview:} +Get the PV/bootloader\_args field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} string get_PV_bootloader_args (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\_PV\_bootloader\_args} + +{\bf Overview:} +Set the PV/bootloader\_args field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} void set_PV_bootloader_args (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} + +\vspace{0.3cm} + + \noindent {\bf Return Type:} +{\tt +void +} + + + +\vspace{0.3cm} +\vspace{0.3cm} +\vspace{0.3cm} +\subsubsection{RPC name:~get\_HVM\_boot} + +{\bf Overview:} +Get the HVM/boot field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} string get_HVM_boot (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\_HVM\_boot} + +{\bf Overview:} +Set the HVM/boot field of the given VM. + + \noindent {\bf Signature:} +\begin{verbatim} void set_HVM_boot (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} + +\vspace{0.3cm} + + \noindent {\bf Return Type:} +{\tt +void +} + + + +\vspace{0.3cm} +\vspace{0.3cm} +\vspace{0.3cm} \subsubsection{RPC name:~get\_platform\_std\_VGA} {\bf Overview:} @@ -3573,402 +3842,6 @@ Set the platform/enable\_audio field of {\tt VM ref } & self & reference to the object \\ \hline {\tt bool } & 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\_builder} - -{\bf Overview:} -Get the builder field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_builder (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\_builder} - -{\bf Overview:} -Set the builder field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_builder (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} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_boot\_method} - -{\bf Overview:} -Get the boot\_method field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (boot_type) get_boot_method (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 -boot\_type -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_boot\_method} - -{\bf Overview:} -Set the boot\_method field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_boot_method (session_id s, VM ref self, boot_type 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 boot\_type } & 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\_kernel\_kernel} - -{\bf Overview:} -Get the kernel/kernel field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_kernel_kernel (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\_kernel\_kernel} - -{\bf Overview:} -Set the kernel/kernel field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_kernel_kernel (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} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_kernel\_initrd} - -{\bf Overview:} -Get the kernel/initrd field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_kernel_initrd (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\_kernel\_initrd} - -{\bf Overview:} -Set the kernel/initrd field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_kernel_initrd (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} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_kernel\_args} - -{\bf Overview:} -Get the kernel/args field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_kernel_args (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\_kernel\_args} - -{\bf Overview:} -Set the kernel/args field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_kernel_args (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} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_grub\_cmdline} - -{\bf Overview:} -Get the grub/cmdline field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_grub_cmdline (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\_grub\_cmdline} - -{\bf Overview:} -Set the grub/cmdline field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_grub_cmdline (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} @@ -10480,6 +10353,239 @@ all fields from the object \vspace{0.3cm} \vspace{1cm} +\newpage +\section{Error Handling} +When a low-level transport error occurs, or a request is malformed at the HTTP +or XML-RPC level, the server may send an XML-RPC Fault response, or the client +may simulate the same. The client must be prepared to handle these errors, +though they may be treated as fatal. On the wire, these are transmitted in a +form similar to this: + +\begin{verbatim} + <methodResponse> + <fault> + <value> + <struct> + <member> + <name>faultCode</name> + <value><int>-1</int></value> + </member> + <member> + <name>faultString</name> + <value><string>Malformed request</string></value> + </member> + </struct> + </value> + </fault> + </methodResponse> +\end{verbatim} + +All other failures are reported with a more structured error response, to +allow better automatic response to failures, proper internationalisation of +any error message, and easier debugging. On the wire, these are transmitted +like this: + +\begin{verbatim} + <struct> + <member> + <name>Status</name> + <value>Failure</value> + </member> + <member> + <name>ErrorDescription</name> + <value> + <array> + <data> + <value>MAP_DUPLICATE_KEY</value> + <value>Customer</value> + <value>eSpeil Inc.</value> + <value>eSpeil Incorporated</value> + </data> + </array> + </value> + </member> + </struct> +\end{verbatim} + +Note that {\tt ErrorDescription} value is an array of string values. The +first element of the array is an error code; the remainder of the array are +strings representing error parameters relating to that code. In this case, +the client has attempted to add the mapping {\tt Customer $\rightarrow$ +eSpiel Incorporated} to a Map, but it already contains the mapping +{\tt Customer $\rightarrow$ eSpiel Inc.}, and so the request has failed. + +Each possible error code is documented in the following section. + +\subsection{Error Codes} + +\subsubsection{HOST\_CPU\_HANDLE\_INVALID} + +You gave an invalid host\_cpu handle. The host\_cpu may have recently been +deleted. The handle parameter echoes the bad value given. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}HOST_CPU_HANDLE_INVALID(handle)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{HOST\_HANDLE\_INVALID} + +You gave an invalid host handle. The host may have recently been deleted. +The handle parameter echoes the bad value given. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}HOST_HANDLE_INVALID(handle)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{INTERNAL\_ERROR} + +The server failed to handle your request, due to an internal error. The +given message may give details useful for debugging the problem. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}INTERNAL_ERROR(message)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{MAP\_DUPLICATE\_KEY} + +You tried to add a key-value pair to a map, but that key is already there. +The key, current value, and the new value that you tried to set are all +echoed. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}MAP_DUPLICATE_KEY(key, current value, new value)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{MESSAGE\_METHOD\_UNKNOWN} + +You tried to call a method that does not exist. The method name that you +used is echoed. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}MESSAGE_METHOD_UNKNOWN(method)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{MESSAGE\_PARAMETER\_COUNT\_MISMATCH} + +You tried to call a method with the incorrect number of parameters. The +fully-qualified method name that you used, and the number of received and +expected parameters are returned. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}MESSAGE_PARAMETER_COUNT_MISMATCH(method, expected, received)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{NETWORK\_ALREADY\_CONNECTED} + +You tried to create a PIF, but the network you tried to attach it to is +already attached to some other PIF, and so the creation failed. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}NETWORK_ALREADY_CONNECTED(network, connected PIF)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{SESSION\_AUTHENTICATION\_FAILED} + +The credentials given by the user are incorrect, so access has been denied, +and you have not been issued a session handle. + +\vspace{0.3cm} +No parameters. +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{SESSION\_INVALID} + +You gave an invalid session handle. It may have been invalidated by a +server restart, or timed out. You should get a new session handle, using +one of the session.login\_ calls. This error does not invalidate the +current connection. The handle parameter echoes the bad value given. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}SESSION_INVALID(handle)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{SR\_HANDLE\_INVALID} + +You gave an invalid SR handle. The SR may have recently been deleted. The +handle parameter echoes the bad value given. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}SR_HANDLE_INVALID(handle)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{VBD\_HANDLE\_INVALID} + +You gave an invalid VBD handle. The VBD may have recently been deleted. +The handle parameter echoes the bad value given. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}VBD_HANDLE_INVALID(handle)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{VDI\_HANDLE\_INVALID} + +You gave an invalid VDI handle. The VDI may have recently been deleted. +The handle parameter echoes the bad value given. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}VDI_HANDLE_INVALID(handle)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{VIF\_HANDLE\_INVALID} + +You gave an invalid VIF handle. The VIF may have recently been deleted. +The handle parameter echoes the bad value given. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}VIF_HANDLE_INVALID(handle)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{VM\_BAD\_POWER\_STATE} + +You attempted an operation on a VM that was not in an appropriate power +state at the time; for example, you attempted to start a VM that was +already running. The parameters returned are the VM's UUID, and the +expected and actual VM state at the time of the call. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}VM_BAD_POWER_STATE(vm, expected, actual)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{VM\_HANDLE\_INVALID} + +You gave an invalid VM handle. The VM may have recently been deleted. The +handle parameter echoes the bad value given. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}VM_HANDLE_INVALID(handle)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + +\subsubsection{VTPM\_HANDLE\_INVALID} + +You gave an invalid VTPM handle. The VTPM may have recently been deleted. +The handle parameter echoes the bad value given. + +\vspace{0.3cm} +{\bf Signature:} +\begin{verbatim}VTPM_HANDLE_INVALID(handle)\end{verbatim} +\begin{center}\rule{10em}{0.1pt}\end{center} + + + +\newpage \section{DTD} General notes: \begin{itemize} diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/pci-dma-xen.c Wed Jan 10 08:40:47 2007 -0700 @@ -15,6 +15,7 @@ #include <linux/version.h> #include <asm/io.h> #include <xen/balloon.h> +#include <asm/swiotlb.h> #include <asm/tlbflush.h> #include <asm-i386/mach-xen/asm/swiotlb.h> #include <asm/bug.h> @@ -183,8 +184,8 @@ void *dma_alloc_coherent(struct device * ret = (void *)vstart; if (ret != NULL) { - /* NB. Hardcode 31 address bits for now: aacraid limitation. */ - if (xen_create_contiguous_region(vstart, order, 31) != 0) { + if (xen_create_contiguous_region(vstart, order, + dma_bits) != 0) { free_pages(vstart, order); return NULL; } diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/process-xen.c Wed Jan 10 08:40:47 2007 -0700 @@ -101,8 +101,24 @@ void enable_hlt(void) EXPORT_SYMBOL(enable_hlt); -/* XXX XEN doesn't use default_idle(), poll_idle(). Use xen_idle() instead. */ -void xen_idle(void) +/* + * On SMP it's slightly faster (but much more power-consuming!) + * to poll the ->work.need_resched flag instead of waiting for the + * cross-CPU IPI to arrive. Use this option with caution. + */ +static void poll_idle(void) +{ + local_irq_enable(); + + asm volatile( + "2:" + "testl %0, %1;" + "rep; nop;" + "je 2b;" + : : "i"(_TIF_NEED_RESCHED), "m" (current_thread_info()->flags)); +} + +static void xen_idle(void) { local_irq_disable(); @@ -152,17 +168,22 @@ void cpu_idle(void) /* endless idle loop with no priority at all */ while (1) { while (!need_resched()) { + void (*idle)(void); if (__get_cpu_var(cpu_idle_state)) __get_cpu_var(cpu_idle_state) = 0; rmb(); + idle = pm_idle; + + if (!idle) + idle = xen_idle; if (cpu_is_offline(cpu)) play_dead(); __get_cpu_var(irq_stat).idle_timestamp = jiffies; - xen_idle(); + idle(); } preempt_enable_no_resched(); schedule(); @@ -198,9 +219,22 @@ void cpu_idle_wait(void) } EXPORT_SYMBOL_GPL(cpu_idle_wait); -/* XXX XEN doesn't use mwait_idle(), select_idle_routine(), idle_setup(). */ -/* Always use xen_idle() instead. */ -void __devinit select_idle_routine(const struct cpuinfo_x86 *c) {} +void __devinit select_idle_routine(const struct cpuinfo_x86 *c) +{ +} + +static int __init idle_setup (char *str) +{ + if (!strncmp(str, "poll", 4)) { + printk("using polling idle threads.\n"); + pm_idle = poll_idle; + } + + boot_option_idle_override = 1; + return 1; +} + +__setup("idle=", idle_setup); void show_regs(struct pt_regs * regs) { diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Wed Jan 10 08:40:47 2007 -0700 @@ -47,8 +47,8 @@ EXPORT_SYMBOL(swiotlb); */ #define IO_TLB_SHIFT 11 -/* Width of DMA addresses in the IO TLB. 30 bits is a b44 limitation. */ -#define DEFAULT_IO_TLB_DMA_BITS 30 +/* Width of DMA addresses. 30 bits is a b44 limitation. */ +#define DEFAULT_DMA_BITS 30 static int swiotlb_force; static char *iotlb_virt_start; @@ -98,14 +98,14 @@ static struct phys_addr { */ static DEFINE_SPINLOCK(io_tlb_lock); -static unsigned int io_tlb_dma_bits = DEFAULT_IO_TLB_DMA_BITS; +unsigned int dma_bits = DEFAULT_DMA_BITS; static int __init -setup_io_tlb_bits(char *str) -{ - io_tlb_dma_bits = simple_strtoul(str, NULL, 0); +setup_dma_bits(char *str) +{ + dma_bits = simple_strtoul(str, NULL, 0); return 0; } -__setup("swiotlb_bits=", setup_io_tlb_bits); +__setup("dma_bits=", setup_dma_bits); static int __init setup_io_tlb_npages(char *str) @@ -167,7 +167,7 @@ swiotlb_init_with_default_size (size_t d int rc = xen_create_contiguous_region( (unsigned long)iotlb_virt_start + (i << IO_TLB_SHIFT), get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT), - io_tlb_dma_bits); + dma_bits); BUG_ON(rc); } @@ -197,7 +197,7 @@ swiotlb_init_with_default_size (size_t d bytes >> 20, (unsigned long)iotlb_virt_start, (unsigned long)iotlb_virt_start + bytes, - io_tlb_dma_bits); + dma_bits); } void @@ -665,7 +665,7 @@ int int swiotlb_dma_supported (struct device *hwdev, u64 mask) { - return (mask >= ((1UL << io_tlb_dma_bits) - 1)); + return (mask >= ((1UL << dma_bits) - 1)); } EXPORT_SYMBOL(swiotlb_init); diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c --- a/linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/arch/i386/pci/irq-xen.c Wed Jan 10 08:40:47 2007 -0700 @@ -110,7 +110,6 @@ static struct irq_routing_table * __init if (rt) return rt; } - return NULL; } @@ -261,13 +260,13 @@ static int pirq_via_set(struct pci_dev * */ static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq) { - static unsigned int pirqmap[4] = { 3, 2, 5, 1 }; + static unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; return read_config_nybble(router, 0x55, pirqmap[pirq-1]); } static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) { - static unsigned int pirqmap[4] = { 3, 2, 5, 1 }; + static unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; write_config_nybble(router, 0x55, pirqmap[pirq-1], irq); return 1; } diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c Wed Jan 10 08:40:47 2007 -0700 @@ -119,8 +119,26 @@ void exit_idle(void) __exit_idle(); } -/* XXX XEN doesn't use default_idle(), poll_idle(). Use xen_idle() instead. */ -void xen_idle(void) +/* + * On SMP it's slightly faster (but much more power-consuming!) + * to poll the ->need_resched flag instead of waiting for the + * cross-CPU IPI to arrive. Use this option with caution. + */ +static void poll_idle(void) +{ + local_irq_enable(); + + asm volatile( + "2:" + "testl %0,%1;" + "rep; nop;" + "je 2b;" + : : + "i" (_TIF_NEED_RESCHED), + "m" (current_thread_info()->flags)); +} + +static void xen_idle(void) { local_irq_disable(); @@ -164,14 +182,18 @@ void cpu_idle (void) /* endless idle loop with no priority at all */ while (1) { while (!need_resched()) { + void (*idle)(void); + if (__get_cpu_var(cpu_idle_state)) __get_cpu_var(cpu_idle_state) = 0; rmb(); - + idle = pm_idle; + if (!idle) + idle = xen_idle; if (cpu_is_offline(smp_processor_id())) play_dead(); enter_idle(); - xen_idle(); + idle(); __exit_idle(); } @@ -210,9 +232,22 @@ void cpu_idle_wait(void) } EXPORT_SYMBOL_GPL(cpu_idle_wait); -/* XXX XEN doesn't use mwait_idle(), select_idle_routine(), idle_setup(). */ -/* Always use xen_idle() instead. */ -void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) {} +void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) +{ +} + +static int __init idle_setup (char *str) +{ + if (!strncmp(str, "poll", 4)) { + printk("using polling idle threads.\n"); + pm_idle = poll_idle; + } + + boot_option_idle_override = 1; + return 1; +} + +__setup("idle=", idle_setup); /* Prints also some state that isn't saved in the pt_regs */ void __show_regs(struct pt_regs * regs) diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c --- a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c Wed Jan 10 08:40:47 2007 -0700 @@ -54,7 +54,6 @@ struct tpm_private { tpmif_tx_interface_t *tx; atomic_t refcnt; - unsigned int evtchn; unsigned int irq; u8 is_connected; u8 is_suspended; @@ -271,7 +270,7 @@ static void destroy_tpmring(struct tpm_p if (tp->irq) unbind_from_irqhandler(tp->irq, tp); - tp->evtchn = tp->irq = 0; + tp->irq = 0; } @@ -302,8 +301,8 @@ again: goto abort_transaction; } - err = xenbus_printf(xbt, dev->nodename, - "event-channel", "%u", tp->evtchn); + err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u", + irq_to_evtchn_port(tp->irq)); if (err) { message = "writing event-channel"; goto abort_transaction; @@ -459,19 +458,15 @@ static int tpmif_connect(struct xenbus_d tp->backend_id = domid; - err = xenbus_alloc_evtchn(dev, &tp->evtchn); - if (err) + err = bind_listening_port_to_irqhandler( + domid, tpmif_int, SA_SAMPLE_RANDOM, "tpmif", tp); + if (err <= 0) { + WPRINTK("bind_listening_port_to_irqhandler failed " + "(err=%d)\n", err); return err; - - err = bind_evtchn_to_irqhandler(tp->evtchn, - tpmif_int, SA_SAMPLE_RANDOM, "tpmif", - tp); - if (err <= 0) { - WPRINTK("bind_evtchn_to_irqhandler failed (err=%d)\n", err); - return err; - } - + } tp->irq = err; + return 0; } @@ -656,9 +651,6 @@ static int tpm_xmit(struct tpm_private * mb(); - DPRINTK("Notifying backend via event channel %d\n", - tp->evtchn); - notify_remote_via_irq(tp->irq); spin_unlock_irq(&tp->tx_lock); diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c --- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Wed Jan 10 08:40:47 2007 -0700 @@ -446,8 +446,10 @@ static struct notifier_block xenstore_no static int __init balloon_init(void) { +#ifdef CONFIG_X86 unsigned long pfn; struct page *page; +#endif if (!is_running_on_xen()) return -ENODEV; @@ -476,13 +478,15 @@ static int __init balloon_init(void) balloon_pde->write_proc = balloon_write; #endif balloon_sysfs_init(); - + +#ifdef CONFIG_X86 /* Initialise the balloon with excess memory space. */ for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) { page = pfn_to_page(pfn); if (!PageReserved(page)) balloon_append(page); } +#endif target_watch.callback = watch_target; xenstore_notifier.notifier_call = balloon_init_watcher; diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/blkback/common.h --- a/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/common.h Wed Jan 10 08:40:47 2007 -0700 @@ -65,7 +65,6 @@ typedef struct blkif_st { domid_t domid; unsigned int handle; /* Physical parameters of the comms window. */ - unsigned int evtchn; unsigned int irq; /* Comms information. */ blkif_back_ring_t blk_ring; diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/blkback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Wed Jan 10 08:40:47 2007 -0700 @@ -97,7 +97,6 @@ int blkif_map(blkif_t *blkif, unsigned l { blkif_sring_t *sring; int err; - struct evtchn_bind_interdomain bind_interdomain; /* Already connected through? */ if (blkif->irq) @@ -112,24 +111,18 @@ int blkif_map(blkif_t *blkif, unsigned l return err; } - bind_interdomain.remote_dom = blkif->domid; - bind_interdomain.remote_port = evtchn; + sring = (blkif_sring_t *)blkif->blk_ring_area->addr; + BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE); - err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, - &bind_interdomain); - if (err) { + err = bind_interdomain_evtchn_to_irqhandler( + blkif->domid, evtchn, blkif_be_int, 0, "blkif-backend", blkif); + if (err < 0) + { unmap_frontend_page(blkif); free_vm_area(blkif->blk_ring_area); return err; } - - blkif->evtchn = bind_interdomain.local_port; - - sring = (blkif_sring_t *)blkif->blk_ring_area->addr; - BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE); - - blkif->irq = bind_evtchn_to_irqhandler( - blkif->evtchn, blkif_be_int, 0, "blkif-backend", blkif); + blkif->irq = err; return 0; } diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c --- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Wed Jan 10 08:40:47 2007 -0700 @@ -174,8 +174,8 @@ again: message = "writing ring-ref"; goto abort_transaction; } - err = xenbus_printf(xbt, dev->nodename, - "event-channel", "%u", info->evtchn); + err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u", + irq_to_evtchn_port(info->irq)); if (err) { message = "writing event-channel"; goto abort_transaction; @@ -228,15 +228,11 @@ static int setup_blkring(struct xenbus_d } info->ring_ref = err; - err = xenbus_alloc_evtchn(dev, &info->evtchn); - if (err) - goto fail; - - err = bind_evtchn_to_irqhandler( - info->evtchn, blkif_int, SA_SAMPLE_RANDOM, "blkif", info); + err = bind_listening_port_to_irqhandler( + dev->otherend_id, blkif_int, SA_SAMPLE_RANDOM, "blkif", info); if (err <= 0) { xenbus_dev_fatal(dev, err, - "bind_evtchn_to_irqhandler failed"); + "bind_listening_port_to_irqhandler"); goto fail; } info->irq = err; @@ -310,7 +306,7 @@ static void connect(struct blkfront_info DPRINTK("blkfront.c:connect:%s.\n", info->xbdev->otherend); err = xenbus_gather(XBT_NIL, info->xbdev->otherend, - "sectors", "%llu", §ors, + "sectors", "%Lu", §ors, "info", "%u", &binfo, "sector-size", "%lu", §or_size, NULL); @@ -775,8 +771,7 @@ static void blkif_free(struct blkfront_i } if (info->irq) unbind_from_irqhandler(info->irq, info); - info->evtchn = info->irq = 0; - + info->irq = 0; } static void blkif_completion(struct blk_shadow *s) diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/blkfront/block.h --- a/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Wed Jan 10 08:40:47 2007 -0700 @@ -119,7 +119,7 @@ struct blkfront_info int connected; int ring_ref; blkif_front_ring_t ring; - unsigned int evtchn, irq; + unsigned int irq; struct xlbd_major_info *mi; request_queue_t *rq; struct work_struct work; diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/blktap/Makefile --- a/linux-2.6-xen-sparse/drivers/xen/blktap/Makefile Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/Makefile Wed Jan 10 08:40:47 2007 -0700 @@ -1,3 +1,5 @@ LINUXINCLUDE += -I../xen/include/public/ LINUXINCLUDE += -I../xen/include/public/io -obj-y := xenbus.o interface.o blktap.o +obj-$(CONFIG_XEN_BLKDEV_TAP) := xenblktap.o + +xenblktap-y := xenbus.o interface.o blktap.o diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/blktap/common.h --- a/linux-2.6-xen-sparse/drivers/xen/blktap/common.h Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/common.h Wed Jan 10 08:40:47 2007 -0700 @@ -56,7 +56,6 @@ typedef struct blkif_st { domid_t domid; unsigned int handle; /* Physical parameters of the comms window. */ - unsigned int evtchn; unsigned int irq; /* Comms information. */ blkif_back_ring_t blk_ring; diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/blktap/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c Wed Jan 10 08:40:47 2007 -0700 @@ -98,7 +98,6 @@ int tap_blkif_map(blkif_t *blkif, unsign { blkif_sring_t *sring; int err; - struct evtchn_bind_interdomain bind_interdomain; /* Already connected through? */ if (blkif->irq) @@ -113,24 +112,18 @@ int tap_blkif_map(blkif_t *blkif, unsign return err; } - bind_interdomain.remote_dom = blkif->domid; - bind_interdomain.remote_port = evtchn; + sring = (blkif_sring_t *)blkif->blk_ring_area->addr; + BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE); - err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, - &bind_interdomain); - if (err) { + err = bind_interdomain_evtchn_to_irqhandler( + blkif->domid, evtchn, tap_blkif_be_int, + 0, "blkif-backend", blkif); + if (err < 0) { unmap_frontend_page(blkif); free_vm_area(blkif->blk_ring_area); return err; } - - blkif->evtchn = bind_interdomain.local_port; - - sring = (blkif_sring_t *)blkif->blk_ring_area->addr; - BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE); - - blkif->irq = bind_evtchn_to_irqhandler( - blkif->evtchn, tap_blkif_be_int, 0, "blkif-backend", blkif); + blkif->irq = err; return 0; } diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c --- a/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c Wed Jan 10 08:40:47 2007 -0700 @@ -121,7 +121,7 @@ int xencons_ring_init(void) !xen_start_info->console.domU.evtchn) return -ENODEV; - irq = bind_evtchn_to_irqhandler( + irq = bind_caller_port_to_irqhandler( xen_start_info->console.domU.evtchn, handle_input, 0, "xencons", NULL); if (irq < 0) { diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/core/evtchn.c --- a/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c Wed Jan 10 08:40:47 2007 -0700 @@ -61,7 +61,14 @@ static u32 irq_info[NR_IRQS]; static u32 irq_info[NR_IRQS]; /* Binding types. */ -enum { IRQT_UNBOUND, IRQT_PIRQ, IRQT_VIRQ, IRQT_IPI, IRQT_EVTCHN }; +enum { + IRQT_UNBOUND, + IRQT_PIRQ, + IRQT_VIRQ, + IRQT_IPI, + IRQT_LOCAL_PORT, + IRQT_CALLER_PORT +}; /* Constructor for packed IRQ information. */ static inline u32 mk_irq_info(u32 type, u32 index, u32 evtchn) @@ -208,38 +215,51 @@ void force_evtchn_callback(void) /* Not a GPL symbol: used in ubiquitous macros, so too restrictive. */ EXPORT_SYMBOL(force_evtchn_callback); +static DEFINE_PER_CPU(unsigned int, upcall_count) = { 0 }; + /* NB. Interrupts are disabled on entry. */ asmlinkage void evtchn_do_upcall(struct pt_regs *regs) { unsigned long l1, l2; - unsigned int l1i, l2i, port; + unsigned int l1i, l2i, port, count; int irq, cpu = smp_processor_id(); shared_info_t *s = HYPERVISOR_shared_info; vcpu_info_t *vcpu_info = &s->vcpu_info[cpu]; - vcpu_info->evtchn_upcall_pending = 0; + do { + /* Avoid a callback storm when we reenable delivery. */ + vcpu_info->evtchn_upcall_pending = 0; + + /* Nested invocations bail immediately. */ + if (unlikely(per_cpu(upcall_count, cpu)++)) + return; #ifndef CONFIG_X86 /* No need for a barrier -- XCHG is a barrier on x86. */ - /* Clear master pending flag /before/ clearing selector flag. */ - rmb(); + /* Clear master flag /before/ clearing selector flag. */ + rmb(); #endif - l1 = xchg(&vcpu_info->evtchn_pending_sel, 0); - while (l1 != 0) { - l1i = __ffs(l1); - l1 &= ~(1UL << l1i); - - while ((l2 = active_evtchns(cpu, s, l1i)) != 0) { - l2i = __ffs(l2); - - port = (l1i * BITS_PER_LONG) + l2i; - if ((irq = evtchn_to_irq[port]) != -1) - do_IRQ(irq, regs); - else { - exit_idle(); - evtchn_device_upcall(port); + l1 = xchg(&vcpu_info->evtchn_pending_sel, 0); + while (l1 != 0) { + l1i = __ffs(l1); + l1 &= ~(1UL << l1i); + + while ((l2 = active_evtchns(cpu, s, l1i)) != 0) { + l2i = __ffs(l2); + + port = (l1i * BITS_PER_LONG) + l2i; + if ((irq = evtchn_to_irq[port]) != -1) + do_IRQ(irq, regs); + else { + exit_idle(); + evtchn_device_upcall(port); + } } } - } + + /* If there were nested callbacks then we have more to do. */ + count = per_cpu(upcall_count, cpu); + per_cpu(upcall_count, cpu) = 0; + } while (unlikely(count != 1)); } static int find_unbound_irq(void) @@ -262,18 +282,18 @@ static int find_unbound_irq(void) return -ENOSPC; } -static int bind_evtchn_to_irq(unsigned int evtchn) +static int bind_caller_port_to_irq(unsigned int caller_port) { int irq; spin_lock(&irq_mapping_update_lock); - if ((irq = evtchn_to_irq[evtchn]) == -1) { + if ((irq = evtchn_to_irq[caller_port]) == -1) { if ((irq = find_unbound_irq()) < 0) goto out; - evtchn_to_irq[evtchn] = irq; - irq_info[irq] = mk_irq_info(IRQT_EVTCHN, 0, evtchn); + evtchn_to_irq[caller_port] = irq; + irq_info[irq] = mk_irq_info(IRQT_CALLER_PORT, 0, caller_port); } irq_bindcount[irq]++; @@ -281,6 +301,59 @@ static int bind_evtchn_to_irq(unsigned i out: spin_unlock(&irq_mapping_update_lock); return irq; +} + +static int bind_local_port_to_irq(unsigned int local_port) +{ + int irq; + + spin_lock(&irq_mapping_update_lock); + + BUG_ON(evtchn_to_irq[local_port] != -1); + + if ((irq = find_unbound_irq()) < 0) { + struct evtchn_close close = { .port = local_port }; + if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close)) + BUG(); + goto out; + } + + evtchn_to_irq[local_port] = irq; + irq_info[irq] = mk_irq_info(IRQT_LOCAL_PORT, 0, local_port); + irq_bindcount[irq]++; + + out: + spin_unlock(&irq_mapping_update_lock); + return irq; +} + +static int bind_listening_port_to_irq(unsigned int remote_domain) +{ + struct evtchn_alloc_unbound alloc_unbound; + int err; + + alloc_unbound.dom = DOMID_SELF; + alloc_unbound.remote_dom = remote_domain; + + err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, + &alloc_unbound); + + return err ? : bind_local_port_to_irq(alloc_unbound.port); +} + +static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain, + unsigned int remote_port) +{ + struct evtchn_bind_interdomain bind_interdomain; + int err; + + bind_interdomain.remote_dom = remote_domain; + bind_interdomain.remote_port = remote_port; + + err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, + &bind_interdomain); + + return err ? : bind_local_port_to_irq(bind_interdomain.local_port); } static int bind_virq_to_irq(unsigned int virq, unsigned int cpu) @@ -357,7 +430,8 @@ static void unbind_from_irq(unsigned int if ((--irq_bindcount[irq] == 0) && VALID_EVTCHN(evtchn)) { close.port = evtchn; - if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0) + if ((type_from_irq(irq) != IRQT_CALLER_PORT) && + HYPERVISOR_event_channel_op(EVTCHNOP_close, &close)) BUG(); switch (type_from_irq(irq)) { @@ -383,17 +457,16 @@ static void unbind_from_irq(unsigned int spin_unlock(&irq_mapping_update_lock); } -int bind_evtchn_to_irqhandler( - unsigned int evtchn, +int bind_caller_port_to_irqhandler( + unsigned int caller_port, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char *devname, void *dev_id) { - unsigned int irq; - int retval; - - irq = bind_evtchn_to_irq(evtchn); + int irq, retval; + + irq = bind_caller_port_to_irq(caller_port); if (irq < 0) return irq; @@ -405,7 +478,54 @@ int bind_evtchn_to_irqhandler( return irq; } -EXPORT_SYMBOL_GPL(bind_evtchn_to_irqhandler); +EXPORT_SYMBOL_GPL(bind_caller_port_to_irqhandler); + +int bind_listening_port_to_irqhandler( + unsigned int remote_domain, + irqreturn_t (*handler)(int, void *, struct pt_regs *), + unsigned long irqflags, + const char *devname, + void *dev_id) +{ + int irq, retval; + + irq = bind_listening_port_to_irq(remote_domain); + if (irq < 0) + return irq; + + retval = request_irq(irq, handler, irqflags, devname, dev_id); + if (retval != 0) { + unbind_from_irq(irq); + return retval; + } + + return irq; +} +EXPORT_SYMBOL_GPL(bind_listening_port_to_irqhandler); + +int bind_interdomain_evtchn_to_irqhandler( + unsigned int remote_domain, + unsigned int remote_port, + irqreturn_t (*handler)(int, void *, struct pt_regs *), + unsigned long irqflags, + const char *devname, + void *dev_id) +{ + int irq, retval; + + irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port); + if (irq < 0) + return irq; + + retval = request_irq(irq, handler, irqflags, devname, dev_id); + if (retval != 0) { + unbind_from_irq(irq); + return retval; + } + + return irq; +} +EXPORT_SYMBOL_GPL(bind_interdomain_evtchn_to_irqhandler); int bind_virq_to_irqhandler( unsigned int virq, @@ -415,8 +535,7 @@ int bind_virq_to_irqhandler( const char *devname, void *dev_id) { - unsigned int irq; - int retval; + int irq, retval; irq = bind_virq_to_irq(virq, cpu); if (irq < 0) @@ -440,8 +559,7 @@ int bind_ipi_to_irqhandler( const char *devname, void *dev_id) { - unsigned int irq; - int retval; + int irq, retval; irq = bind_ipi_to_irq(ipi, cpu); if (irq < 0) @@ -716,6 +834,12 @@ void notify_remote_via_irq(int irq) } EXPORT_SYMBOL_GPL(notify_remote_via_irq); +int irq_to_evtchn_port(int irq) +{ + return evtchn_from_irq(irq); +} +EXPORT_SYMBOL_GPL(irq_to_evtchn_port); + void mask_evtchn(int port) { shared_info_t *s = HYPERVISOR_shared_info; diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c --- a/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c Wed Jan 10 08:40:47 2007 -0700 @@ -98,8 +98,8 @@ void xen_machine_kexec_setup_resources(v err: /* * It isn't possible to free xen_phys_cpus this early in the - * boot. Since failure at this stage is unexpected and the - * amount is small we leak the memory. + * boot. Failure at this stage is unexpected and the amount of + * memory is small therefore we tolerate the potential leak. */ xen_max_nr_phys_cpus = 0; return; diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c --- a/linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenfb.c Wed Jan 10 08:40:47 2007 -0700 @@ -56,7 +56,6 @@ struct xenfb_info struct page **pages; struct list_head mappings; /* protected by mm_lock */ - unsigned evtchn; int irq; struct xenfb_page *page; unsigned long *mfns; @@ -156,7 +155,7 @@ static void xenfb_do_update(struct xenfb wmb(); /* ensure ring contents visible */ info->page->out_prod = prod + 1; - notify_remote_via_evtchn(info->evtchn); + notify_remote_via_irq(info->irq); } static int xenfb_queue_full(struct xenfb_info *info) @@ -429,7 +428,7 @@ static irqreturn_t xenfb_event_handler(i if (page->in_cons != page->in_prod) { info->page->in_cons = info->page->in_prod; - notify_remote_via_evtchn(info->evtchn); + notify_remote_via_irq(info->irq); } return IRQ_HANDLED; } @@ -618,14 +617,11 @@ static int xenfb_connect_backend(struct int ret; struct xenbus_transaction xbt; - ret = xenbus_alloc_evtchn(dev, &info->evtchn); - if (ret) - return ret; - ret = bind_evtchn_to_irqhandler(info->evtchn, xenfb_event_handler, - 0, "xenfb", info); + ret = bind_listening_port_to_irqhandler( + dev->otherend_id, xenfb_event_handler, 0, "xenfb", info); if (ret < 0) { - xenbus_free_evtchn(dev, info->evtchn); - xenbus_dev_fatal(dev, ret, "bind_evtchn_to_irqhandler"); + xenbus_dev_fatal(dev, ret, + "bind_listening_port_to_irqhandler"); return ret; } info->irq = ret; @@ -641,7 +637,7 @@ static int xenfb_connect_backend(struct if (ret) goto error_xenbus; ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u", - info->evtchn); + irq_to_evtchn_port(info->irq)); if (ret) goto error_xenbus; ret = xenbus_printf(xbt, dev->nodename, "feature-update", "1"); diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c --- a/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/fbfront/xenkbd.c Wed Jan 10 08:40:47 2007 -0700 @@ -31,7 +31,6 @@ struct xenkbd_info { struct input_dev *dev; struct xenkbd_page *page; - unsigned evtchn; int irq; struct xenbus_device *xbdev; }; @@ -76,7 +75,7 @@ static irqreturn_t input_handler(int rq, input_sync(info->dev); mb(); /* ensure we got ring contents */ page->in_cons = cons; - notify_remote_via_evtchn(info->evtchn); + notify_remote_via_irq(info->irq); return IRQ_HANDLED; } @@ -168,14 +167,11 @@ static int xenkbd_connect_backend(struct int ret; struct xenbus_transaction xbt; - ret = xenbus_alloc_evtchn(dev, &info->evtchn); - if (ret) - return ret; - ret = bind_evtchn_to_irqhandler(info->evtchn, input_handler, 0, - "xenkbd", info); + ret = bind_listening_port_to_irqhandler( + dev->otherend_id, input_handler, 0, "xenkbd", info); if (ret < 0) { - xenbus_free_evtchn(dev, info->evtchn); - xenbus_dev_fatal(dev, ret, "bind_evtchn_to_irqhandler"); + xenbus_dev_fatal(dev, ret, + "bind_listening_port_to_irqhandler"); return ret; } info->irq = ret; @@ -191,7 +187,7 @@ static int xenkbd_connect_backend(struct if (ret) goto error_xenbus; ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u", - info->evtchn); + irq_to_evtchn_port(info->irq)); if (ret) goto error_xenbus; ret = xenbus_transaction_end(xbt, 0); diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/netback/common.h --- a/linux-2.6-xen-sparse/drivers/xen/netback/common.h Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/common.h Wed Jan 10 08:40:47 2007 -0700 @@ -67,7 +67,6 @@ typedef struct netif_st { grant_ref_t tx_shmem_ref; grant_handle_t rx_shmem_handle; grant_ref_t rx_shmem_ref; - unsigned int evtchn; unsigned int irq; /* The shared rings and indexes. */ diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/netback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Wed Jan 10 08:40:47 2007 -0700 @@ -259,7 +259,6 @@ int netif_map(netif_t *netif, unsigned l int err = -ENOMEM; netif_tx_sring_t *txs; netif_rx_sring_t *rxs; - struct evtchn_bind_interdomain bind_interdomain; /* Already connected through? */ if (netif->irq) @@ -276,18 +275,12 @@ int netif_map(netif_t *netif, unsigned l if (err) goto err_map; - bind_interdomain.remote_dom = netif->domid; - bind_interdomain.remote_port = evtchn; - - err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, - &bind_interdomain); - if (err) + err = bind_interdomain_evtchn_to_irqhandler( + netif->domid, evtchn, netif_be_int, 0, + netif->dev->name, netif); + if (err < 0) goto err_hypervisor; - - netif->evtchn = bind_interdomain.local_port; - - netif->irq = bind_evtchn_to_irqhandler( - netif->evtchn, netif_be_int, 0, netif->dev->name, netif); + netif->irq = err; disable_irq(netif->irq); txs = (netif_tx_sring_t *)netif->tx_comms_area->addr; diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Jan 10 08:40:47 2007 -0700 @@ -153,7 +153,7 @@ struct netfront_info { spinlock_t tx_lock; spinlock_t rx_lock; - unsigned int evtchn, irq; + unsigned int irq; unsigned int copying_receiver; /* Receive-ring batched refills. */ @@ -244,12 +244,8 @@ static int setup_device(struct xenbus_de static int setup_device(struct xenbus_device *, struct netfront_info *); static struct net_device *create_netdev(struct xenbus_device *); -static void netfront_closing(struct xenbus_device *); - static void end_access(int, void *); static void netif_disconnect_backend(struct netfront_info *); -static int open_netdev(struct netfront_info *); -static void close_netdev(struct netfront_info *); static int network_connect(struct net_device *); static void network_tx_buf_gc(struct net_device *); @@ -293,9 +289,20 @@ static int __devinit netfront_probe(stru info = netdev_priv(netdev); dev->dev.driver_data = info; - err = open_netdev(info); - if (err) + err = register_netdev(info->netdev); + if (err) { + printk(KERN_WARNING "%s: register_netdev err=%d\n", + __FUNCTION__, err); goto fail; + } + + err = xennet_sysfs_addif(info->netdev); + if (err) { + unregister_netdev(info->netdev); + printk(KERN_WARNING "%s: add sysfs failed err=%d\n", + __FUNCTION__, err); + goto fail; + } return 0; @@ -305,6 +312,24 @@ static int __devinit netfront_probe(stru return err; } +static int __devexit netfront_remove(struct xenbus_device *dev) +{ + struct netfront_info *info = dev->dev.driver_data; + + DPRINTK("%s\n", dev->nodename); + + netif_disconnect_backend(info); + + del_timer_sync(&info->rx_refill_timer); + + xennet_sysfs_delif(info->netdev); + + unregister_netdev(info->netdev); + + free_netdev(info->netdev); + + return 0; +} /** * We are reconnecting to the backend, due to a suspend/resume, or a backend @@ -383,7 +408,8 @@ again: goto abort_transaction; } err = xenbus_printf(xbt, dev->nodename, - "event-channel", "%u", info->evtchn); + "event-channel", "%u", + irq_to_evtchn_port(info->irq)); if (err) { message = "writing event-channel"; goto abort_transaction; @@ -488,17 +514,15 @@ static int setup_device(struct xenbus_de } info->rx_ring_ref = err; - err = xenbus_alloc_evtchn(dev, &info->evtchn); - if (err) - goto fail; - memcpy(netdev->dev_addr, info->mac, ETH_ALEN); - err = bind_evtchn_to_irqhandler(info->evtchn, netif_int, - SA_SAMPLE_RANDOM, netdev->name, - netdev); + + err = bind_listening_port_to_irqhandler( + dev->otherend_id, netif_int, SA_SAMPLE_RANDOM, netdev->name, + netdev); if (err < 0) goto fail; info->irq = err; + return 0; fail: @@ -534,9 +558,7 @@ static void backend_changed(struct xenbu break; case XenbusStateClosing: - if (dev->state == XenbusStateClosed) - break; - netfront_closing(dev); + xenbus_frontend_closed(dev); break; } } @@ -1995,70 +2017,6 @@ inetdev_notify(struct notifier_block *th } -/* ** Close down ** */ - - -/** - * Handle the change of state of the backend to Closing. We must delete our - * device-layer structures now, to ensure that writes are flushed through to - * the backend. Once is this done, we can switch to Closed in - * acknowledgement. - */ -static void netfront_closing(struct xenbus_device *dev) -{ - struct netfront_info *info = dev->dev.driver_data; - - DPRINTK("%s\n", dev->nodename); - - close_netdev(info); - xenbus_frontend_closed(dev); -} - - -static int __devexit netfront_remove(struct xenbus_device *dev) -{ - struct netfront_info *info = dev->dev.driver_data; - - DPRINTK("%s\n", dev->nodename); - - netif_disconnect_backend(info); - free_netdev(info->netdev); - - return 0; -} - - -static int open_netdev(struct netfront_info *info) -{ - int err; - - err = register_netdev(info->netdev); - if (err) { - printk(KERN_WARNING "%s: register_netdev err=%d\n", - __FUNCTION__, err); - return err; - } - - err = xennet_sysfs_addif(info->netdev); - if (err) { - unregister_netdev(info->netdev); - printk(KERN_WARNING "%s: add sysfs failed err=%d\n", - __FUNCTION__, err); - return err; - } - - return 0; -} - -static void close_netdev(struct netfront_info *info) -{ - del_timer_sync(&info->rx_refill_timer); - - xennet_sysfs_delif(info->netdev); - unregister_netdev(info->netdev); -} - - static void netif_disconnect_backend(struct netfront_info *info) { /* Stop old i/f to prevent errors whilst we rebuild the state. */ @@ -2070,7 +2028,7 @@ static void netif_disconnect_backend(str if (info->irq) unbind_from_irqhandler(info->irq, info->netdev); - info->evtchn = info->irq = 0; + info->irq = 0; end_access(info->tx_ring_ref, info->tx.sring); end_access(info->rx_ring_ref, info->rx.sring); diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c --- a/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Wed Jan 10 08:40:47 2007 -0700 @@ -71,7 +71,6 @@ static int pciback_do_attach(struct pcib int remote_evtchn) { int err = 0; - int evtchn; struct vm_struct *area; dev_dbg(&pdev->xdev->dev, @@ -86,12 +85,9 @@ static int pciback_do_attach(struct pcib pdev->sh_area = area; pdev->sh_info = area->addr; - err = xenbus_bind_evtchn(pdev->xdev, remote_evtchn, &evtchn); - if (err) - goto out; - - err = bind_evtchn_to_irqhandler(evtchn, pciback_handle_event, - SA_SAMPLE_RANDOM, "pciback", pdev); + err = bind_interdomain_evtchn_to_irqhandler( + pdev->xdev->otherend_id, remote_evtchn, pciback_handle_event, + SA_SAMPLE_RANDOM, "pciback", pdev); if (err < 0) { xenbus_dev_fatal(pdev->xdev, err, "Error binding event channel to IRQ"); diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/tpmback/common.h --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h Wed Jan 10 08:40:47 2007 -0700 @@ -30,7 +30,6 @@ typedef struct tpmif_st { unsigned int handle; /* Physical parameters of the comms window. */ - unsigned int evtchn; unsigned int irq; /* The shared rings and indexes. */ diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Wed Jan 10 08:40:47 2007 -0700 @@ -118,11 +118,9 @@ int tpmif_map(tpmif_t *tpmif, unsigned l int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn) { int err; - struct evtchn_bind_interdomain bind_interdomain; - if (tpmif->irq) { + if (tpmif->irq) return 0; - } if ((tpmif->tx_area = alloc_vm_area(PAGE_SIZE)) == NULL) return -ENOMEM; @@ -133,24 +131,17 @@ int tpmif_map(tpmif_t *tpmif, unsigned l return err; } + tpmif->tx = (tpmif_tx_interface_t *)tpmif->tx_area->addr; - bind_interdomain.remote_dom = tpmif->domid; - bind_interdomain.remote_port = evtchn; - - err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, - &bind_interdomain); - if (err) { + err = bind_interdomain_evtchn_to_irqhandler( + tpmif->domid, evtchn, tpmif_be_int, 0, tpmif->devname, tpmif); + if (err < 0) { unmap_frontend_page(tpmif); free_vm_area(tpmif->tx_area); return err; } + tpmif->irq = err; - tpmif->evtchn = bind_interdomain.local_port; - - tpmif->tx = (tpmif_tx_interface_t *)tpmif->tx_area->addr; - - tpmif->irq = bind_evtchn_to_irqhandler( - tpmif->evtchn, tpmif_be_int, 0, tpmif->devname, tpmif); tpmif->shmem_ref = shared_page; tpmif->active = 1; diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Wed Jan 10 08:40:47 2007 -0700 @@ -254,28 +254,6 @@ EXPORT_SYMBOL_GPL(xenbus_alloc_evtchn); EXPORT_SYMBOL_GPL(xenbus_alloc_evtchn); -int xenbus_bind_evtchn(struct xenbus_device *dev, int remote_port, int *port) -{ - struct evtchn_bind_interdomain bind_interdomain; - int err; - - bind_interdomain.remote_dom = dev->otherend_id; - bind_interdomain.remote_port = remote_port, - - err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, - &bind_interdomain); - if (err) - xenbus_dev_fatal(dev, err, - "binding to event channel %d from domain %d", - remote_port, dev->otherend_id); - else - *port = bind_interdomain.local_port; - - return err; -} -EXPORT_SYMBOL_GPL(xenbus_bind_evtchn); - - int xenbus_free_evtchn(struct xenbus_device *dev, int port) { struct evtchn_close close; diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c Wed Jan 10 08:40:47 2007 -0700 @@ -196,7 +196,7 @@ int xb_init_comms(void) if (xenbus_irq) unbind_from_irqhandler(xenbus_irq, &xb_waitq); - err = bind_evtchn_to_irqhandler( + err = bind_caller_port_to_irqhandler( xen_store_evtchn, wake_waiting, 0, "xenbus", &xb_waitq); if (err <= 0) { diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/swiotlb.h --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/swiotlb.h Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/swiotlb.h Wed Jan 10 08:40:47 2007 -0700 @@ -34,6 +34,8 @@ extern int swiotlb_dma_supported(struct extern int swiotlb_dma_supported(struct device *hwdev, u64 mask); extern void swiotlb_init(void); +extern unsigned int dma_bits; + #ifdef CONFIG_SWIOTLB extern int swiotlb; #else diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/include/asm-ia64/swiotlb.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linux-2.6-xen-sparse/include/asm-ia64/swiotlb.h Wed Jan 10 08:40:47 2007 -0700 @@ -0,0 +1,45 @@ +#ifndef _ASM_SWIOTLB_H +#define _ASM_SWIOTLB_H 1 + +#include <linux/config.h> + +/* SWIOTLB interface */ + +extern dma_addr_t swiotlb_map_single(struct device *hwdev, void *ptr, size_t size, + int dir); +extern void swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr, + size_t size, int dir); +extern void swiotlb_sync_single_for_cpu(struct device *hwdev, + dma_addr_t dev_addr, + size_t size, int dir); +extern void swiotlb_sync_single_for_device(struct device *hwdev, + dma_addr_t dev_addr, + size_t size, int dir); +extern void swiotlb_sync_sg_for_cpu(struct device *hwdev, + struct scatterlist *sg, int nelems, + int dir); +extern void swiotlb_sync_sg_for_device(struct device *hwdev, + struct scatterlist *sg, int nelems, + int dir); +extern int swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, + int nents, int direction); +extern void swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, + int nents, int direction); +extern int swiotlb_dma_mapping_error(dma_addr_t dma_addr); +extern dma_addr_t swiotlb_map_page(struct device *hwdev, struct page *page, + unsigned long offset, size_t size, + enum dma_data_direction direction); +extern void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dma_address, + size_t size, enum dma_data_direction direction); +extern int swiotlb_dma_supported(struct device *hwdev, u64 mask); +extern void swiotlb_init(void); + +extern unsigned int dma_bits; + +#ifdef CONFIG_SWIOTLB +extern int swiotlb; +#else +#define swiotlb 0 +#endif + +#endif diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/include/xen/evtchn.h --- a/linux-2.6-xen-sparse/include/xen/evtchn.h Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/include/xen/evtchn.h Wed Jan 10 08:40:47 2007 -0700 @@ -52,22 +52,34 @@ * The IRQ argument passed to the callback handler is the same as returned * from the bind call. It may not correspond to a Linux IRQ number. * Returns IRQ or negative errno. - * UNBIND: Takes IRQ to unbind from; automatically closes the event channel. */ -extern int bind_evtchn_to_irqhandler( - unsigned int evtchn, +int bind_caller_port_to_irqhandler( + unsigned int caller_port, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char *devname, void *dev_id); -extern int bind_virq_to_irqhandler( +int bind_listening_port_to_irqhandler( + unsigned int remote_domain, + irqreturn_t (*handler)(int, void *, struct pt_regs *), + unsigned long irqflags, + const char *devname, + void *dev_id); +int bind_interdomain_evtchn_to_irqhandler( + unsigned int remote_domain, + unsigned int remote_port, + irqreturn_t (*handler)(int, void *, struct pt_regs *), + unsigned long irqflags, + const char *devname, + void *dev_id); +int bind_virq_to_irqhandler( unsigned int virq, unsigned int cpu, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char *devname, void *dev_id); -extern int bind_ipi_to_irqhandler( +int bind_ipi_to_irqhandler( unsigned int ipi, unsigned int cpu, irqreturn_t (*handler)(int, void *, struct pt_regs *), @@ -77,21 +89,21 @@ extern int bind_ipi_to_irqhandler( /* * Common unbind function for all event sources. Takes IRQ to unbind from. - * Automatically closes the underlying event channel (even for bindings - * made with bind_evtchn_to_irqhandler()). + * Automatically closes the underlying event channel (except for bindings + * made with bind_caller_port_to_irqhandler()). */ -extern void unbind_from_irqhandler(unsigned int irq, void *dev_id); +void unbind_from_irqhandler(unsigned int irq, void *dev_id); -extern void irq_resume(void); +void irq_resume(void); /* Entry point for notifications into Linux subsystems. */ asmlinkage void evtchn_do_upcall(struct pt_regs *regs); /* Entry point for notifications into the userland character device. */ -extern void evtchn_device_upcall(int port); +void evtchn_device_upcall(int port); -extern void mask_evtchn(int port); -extern void unmask_evtchn(int port); +void mask_evtchn(int port); +void unmask_evtchn(int port); static inline void clear_evtchn(int port) { @@ -106,9 +118,10 @@ static inline void notify_remote_via_evt } /* - * Unlike notify_remote_via_evtchn(), this is safe to use across - * save/restore. Notifications on a broken connection are silently dropped. + * Use these to access the event channel underlying the IRQ handle returned + * by bind_*_to_irqhandler(). */ -extern void notify_remote_via_irq(int irq); +void notify_remote_via_irq(int irq); +int irq_to_evtchn_port(int irq); #endif /* __ASM_EVTCHN_H__ */ diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/include/xen/xenbus.h --- a/linux-2.6-xen-sparse/include/xen/xenbus.h Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/include/xen/xenbus.h Wed Jan 10 08:40:47 2007 -0700 @@ -262,14 +262,6 @@ int xenbus_alloc_evtchn(struct xenbus_de /** - * Bind to an existing interdomain event channel in another domain. Returns 0 - * on success and stores the local port in *port. On error, returns -errno, - * switches the device to XenbusStateClosing, and saves the error in XenStore. - */ -int xenbus_bind_evtchn(struct xenbus_device *dev, int remote_port, int *port); - - -/** * Free an existing event channel. Returns 0 on success or -errno on error. */ int xenbus_free_evtchn(struct xenbus_device *dev, int port); diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/kernel/kexec.c --- a/linux-2.6-xen-sparse/kernel/kexec.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/kernel/kexec.c Wed Jan 10 08:40:47 2007 -0700 @@ -1012,9 +1012,11 @@ asmlinkage long sys_kexec_load(unsigned goto out; } #ifdef CONFIG_XEN - result = xen_machine_kexec_load(image); - if (result) - goto out; + if (image) { + result = xen_machine_kexec_load(image); + if (result) + goto out; + } #endif /* Install the new kernel, and Uninstall the old */ image = xchg(dest_image, image); diff -r 42babffffba5 -r 58633caeece9 linux-2.6-xen-sparse/net/core/dev.c --- a/linux-2.6-xen-sparse/net/core/dev.c Wed Jan 10 08:00:50 2007 -0700 +++ b/linux-2.6-xen-sparse/net/core/dev.c Wed Jan 10 08:40:47 2007 -0700 @@ -1248,14 +1248,13 @@ static int dev_gso_segment(struct sk_buf /* Verifying header integrity only. */ if (!segs) return 0; - + if (unlikely(IS_ERR(segs))) return PTR_ERR(segs); skb->next = segs; DEV_GSO_CB(skb)->destructor = skb->destructor; skb->destructor = dev_gso_skb_destructor; - return 0; } diff -r 42babffffba5 -r 58633caeece9 patches/linux-2.6.16.33/vsnprintf.patch --- a/patches/linux-2.6.16.33/vsnprintf.patch Wed Jan 10 08:00:50 2007 -0700 +++ b/patches/linux-2.6.16.33/vsnprintf.patch Wed Jan 10 08:40:47 2007 -0700 @@ -203,7 +203,7 @@ index b07db5c..f595947 100644 + if (str < end) + *str = '\0'; + else -+ *end = '\0'; ++ end[-1] = '\0'; + } + /* the trailing null byte doesn't count towards the total */ return str-buf; diff -r 42babffffba5 -r 58633caeece9 tools/Rules.mk --- a/tools/Rules.mk Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/Rules.mk Wed Jan 10 08:40:47 2007 -0700 @@ -50,5 +50,7 @@ mk-symlinks-xen: ( cd xen/hvm && ln -sf ../../$(XEN_ROOT)/xen/include/public/hvm/*.h . ) mkdir -p xen/io ( cd xen/io && ln -sf ../../$(XEN_ROOT)/xen/include/public/io/*.h . ) + mkdir -p xen/arch-x86 + ( cd xen/arch-x86 && ln -sf ../../$(XEN_ROOT)/xen/include/public/arch-x86/*.h . ) mk-symlinks: mk-symlinks-xen mk-symlinks-$(XEN_OS) diff -r 42babffffba5 -r 58633caeece9 tools/blktap/drivers/block-qcow.c --- a/tools/blktap/drivers/block-qcow.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/blktap/drivers/block-qcow.c Wed Jan 10 08:40:47 2007 -0700 @@ -47,6 +47,11 @@ #define ASSERT(_p) ((void)0) #endif +#define ROUNDUP(l, s) \ +({ \ + (uint64_t)( \ + (l + (s - 1)) - ((l + (s - 1)) % s)); \ +}) /******AIO DEFINES******/ #define REQUEST_ASYNC_FD 1 @@ -76,9 +81,9 @@ struct pending_aio { #define QCOW_CRYPT_NONE 0x00 #define QCOW_CRYPT_AES 0x01 -#define QCOW_SPARSE_FILE 0x02 #define QCOW_OFLAG_COMPRESSED (1LL << 63) +#define SPARSE_FILE 0x01 #ifndef O_BINARY #define O_BINARY 0 @@ -418,8 +423,9 @@ static void encrypt_sectors(struct tdqco static int qtruncate(int fd, off_t length, int sparse) { - int current, ret, i; - int sectors = length/DEFAULT_SECTOR_SIZE; + int ret, i; + int current = 0, rem = 0; + int sectors = (length + DEFAULT_SECTOR_SIZE - 1)/DEFAULT_SECTOR_SIZE; struct stat st; char buf[DEFAULT_SECTOR_SIZE]; @@ -429,22 +435,45 @@ static int qtruncate(int fd, off_t lengt */ memset(buf, 0x00, DEFAULT_SECTOR_SIZE); ret = fstat(fd, &st); - if((ret == -1) || S_ISBLK(st.st_mode)) + if (ret == -1) return -1; - - if(st.st_size < length) { + if (S_ISBLK(st.st_mode)) + return 0; + + current = (st.st_size + DEFAULT_SECTOR_SIZE - 1)/DEFAULT_SECTOR_SIZE; + rem = st.st_size % DEFAULT_SECTOR_SIZE; + + /* If we are extending this file, we write zeros to the end -- + * this tries to ensure that the extents allocated wind up being + * contiguous on disk. + */ + if(st.st_size < sectors * DEFAULT_SECTOR_SIZE) { /*We are extending the file*/ - lseek(fd, 0, SEEK_END); - for (i = 0; i < sectors; i++ ) { + if (lseek(fd, 0, SEEK_END)==-1) { + fprintf(stderr, + "Lseek EOF failed (%d), internal error\n", + errno); + return -1; + } + if (rem) { + ret = write(fd, buf, rem); + if (ret != rem) + return -1; + } + for (i = current; i < sectors; i++ ) { ret = write(fd, buf, DEFAULT_SECTOR_SIZE); if (ret != DEFAULT_SECTOR_SIZE) return -1; } - } else if(sparse && (st.st_size > length)) - ftruncate(fd, length); - - return 1; + } else if(sparse && (st.st_size > sectors * DEFAULT_SECTOR_SIZE)) + if (ftruncate(fd, sectors * DEFAULT_SECTOR_SIZE)==-1) { + fprintf(stderr, + "Ftruncate failed (%d), internal error\n", + errno); + return -1; + } + return 0; } @@ -497,7 +526,12 @@ static uint64_t get_cluster_offset(struc /*Truncate file for L2 table *(initialised to zero in case we crash)*/ - qtruncate(s->fd, l2_offset + (s->l2_size * sizeof(uint64_t)), s->sparse); + if (qtruncate(s->fd, + l2_offset + (s->l2_size * sizeof(uint64_t)), + s->sparse) != 0) { + DPRINTF("ERROR truncating file\n"); + return 0; + } s->fd_end = l2_offset + (s->l2_size * sizeof(uint64_t)); /*Update the L1 table entry on disk @@ -564,8 +598,12 @@ cache_miss: (s->l2_size * sizeof(uint64_t)); cluster_offset = (cluster_offset + s->cluster_size - 1) & ~(s->cluster_size - 1); - qtruncate(s->fd, cluster_offset + - (s->cluster_size * s->l2_size), s->sparse); + if (qtruncate(s->fd, cluster_offset + + (s->cluster_size * s->l2_size), + s->sparse) != 0) { + DPRINTF("ERROR truncating file\n"); + return 0; + } s->fd_end = cluster_offset + (s->cluster_size * s->l2_size); for (i = 0; i < s->l2_size; i++) { @@ -623,8 +661,11 @@ found: cluster_offset = (cluster_offset + s->cluster_size - 1) & ~(s->cluster_size - 1); - qtruncate(s->fd, cluster_offset + - s->cluster_size, s->sparse); + if (qtruncate(s->fd, cluster_offset + + s->cluster_size, s->sparse)!=0) { + DPRINTF("ERROR truncating file\n"); + return 0; + } s->fd_end = (cluster_offset + s->cluster_size); /* if encrypted, we must initialize the cluster content which won't be written */ @@ -909,15 +950,14 @@ int tdqcow_open (struct td_state *bs, co /*Finally check the L1 table cksum*/ be32_to_cpus(&exthdr->cksum); - cksum = gen_cksum((char *)s->l1_table, s->l1_size * sizeof(uint64_t)); - if(exthdr->cksum != cksum) { + cksum = gen_cksum((char *)s->l1_table, + s->l1_size * sizeof(uint64_t)); + if(exthdr->cksum != cksum) goto end_xenhdr; - } be32_to_cpus(&exthdr->min_cluster_alloc); be32_to_cpus(&exthdr->flags); - if (exthdr->flags & QCOW_SPARSE_FILE) - s->sparse = 1; + s->sparse = (exthdr->flags & SPARSE_FILE); s->min_cluster_alloc = exthdr->min_cluster_alloc; } @@ -1210,10 +1250,10 @@ int tdqcow_do_callbacks(struct td_state } int qcow_create(const char *filename, uint64_t total_size, - const char *backing_file, int flags) + const char *backing_file, int sparse) { int fd, header_size, backing_filename_len, l1_size, i; - int shift, length, adjust, ret = 0; + int shift, length, adjust, flags = 0, ret = 0; QCowHeader header; QCowHeader_ext exthdr; char backing_filename[1024], *ptr; @@ -1305,41 +1345,41 @@ int qcow_create(const char *filename, ui DPRINTF("L1 Table offset: %d, size %d\n", header_size, (int)(l1_size * sizeof(uint64_t))); - if (flags & QCOW_CRYPT_AES) { - header.crypt_method = cpu_to_be32(QCOW_CRYPT_AES); - } else { - header.crypt_method = cpu_to_be32(QCOW_CRYPT_NONE); - } + header.crypt_method = cpu_to_be32(QCOW_CRYPT_NONE); ptr = calloc(1, l1_size * sizeof(uint64_t)); exthdr.cksum = cpu_to_be32(gen_cksum(ptr, l1_size * sizeof(uint64_t))); printf("Created cksum: %d\n",exthdr.cksum); free(ptr); - /*adjust file length to 4 KByte boundary*/ - length = header_size + l1_size * sizeof(uint64_t); - if (length % 4096 > 0) { - length = ((length >> 12) + 1) << 12; - qtruncate(fd, length, 0); - DPRINTF("Adjusted filelength to %d for 4 " - "Kbyte alignment\n",length); - } - - if (!(flags & QCOW_SPARSE_FILE)) { - /*Filesize is length + l1_size * (1 << s->l2_bits) + (size*512)*/ + /*adjust file length to system page size boundary*/ + length = ROUNDUP(header_size + (l1_size * sizeof(uint64_t)), + getpagesize()); + if (qtruncate(fd, length, 0)!=0) { + DPRINTF("ERROR truncating file\n"); + return -1; + } + + if (sparse == 0) { + /*Filesize is length+l1_size*(1 << s->l2_bits)+(size*512)*/ total_length = length + (l1_size * (1 << 9)) + (size * 512); - qtruncate(fd, total_length, 0); + if (qtruncate(fd, total_length, 0)!=0) { + DPRINTF("ERROR truncating file\n"); + return -1; + } printf("File truncated to length %"PRIu64"\n",total_length); - } + } else + flags = SPARSE_FILE; + exthdr.flags = cpu_to_be32(flags); /* write all the data */ lseek(fd, 0, SEEK_SET); ret += write(fd, &header, sizeof(header)); ret += write(fd, &exthdr, sizeof(exthdr)); - if (backing_file) { + if (backing_file) ret += write(fd, backing_filename, backing_filename_len); - } + lseek(fd, header_size, SEEK_SET); tmp = 0; for (i = 0;i < l1_size; i++) { @@ -1360,7 +1400,10 @@ int qcow_make_empty(struct td_state *bs) lseek(s->fd, s->l1_table_offset, SEEK_SET); if (write(s->fd, s->l1_table, l1_length) < 0) return -1; - qtruncate(s->fd, s->l1_table_offset + l1_length, s->sparse); + if (qtruncate(s->fd, s->l1_table_offset + l1_length, s->sparse)!=0) { + DPRINTF("ERROR truncating file\n"); + return -1; + } memset(s->l2_cache, 0, s->l2_size * L2_CACHE_SIZE * sizeof(uint64_t)); memset(s->l2_cache_offsets, 0, L2_CACHE_SIZE * sizeof(uint64_t)); diff -r 42babffffba5 -r 58633caeece9 tools/blktap/drivers/qcow-create.c --- a/tools/blktap/drivers/qcow-create.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/blktap/drivers/qcow-create.c Wed Jan 10 08:40:47 2007 -0700 @@ -47,15 +47,13 @@ #define DFPRINTF(_f, _a...) ((void)0) #endif -#define QCOW_NONSPARSE_FILE 0x00 -#define QCOW_SPARSE_FILE 0x02 #define MAX_NAME_LEN 1000 void help(void) { fprintf(stderr, "Qcow-utils: v1.0.0\n"); fprintf(stderr, - "usage: qcow-create [-h help] [-p reserve] <SIZE(MB)> <FILENAME> " + "usage: qcow-create [-h help] [-r reserve] <SIZE(MB)> <FILENAME> " "[<BACKING_FILENAME>]\n"); exit(-1); } @@ -63,12 +61,12 @@ int main(int argc, char *argv[]) int main(int argc, char *argv[]) { int ret = -1, c, backed = 0; - int flags = QCOW_SPARSE_FILE; + int sparse = 1; uint64_t size; char filename[MAX_NAME_LEN], bfilename[MAX_NAME_LEN]; for(;;) { - c = getopt(argc, argv, "hp"); + c = getopt(argc, argv, "hr"); if (c == -1) break; switch(c) { @@ -76,9 +74,12 @@ int main(int argc, char *argv[]) help(); exit(0); break; - case 'p': - flags = QCOW_NONSPARSE_FILE; + case 'r': + sparse = 0; break; + default: + fprintf(stderr, "Unknown option\n"); + help(); } } @@ -96,6 +97,7 @@ int main(int argc, char *argv[]) } if (optind != argc) { + /*Backing file argument*/ backed = 1; if (snprintf(bfilename, MAX_NAME_LEN, "%s",argv[optind++]) >= MAX_NAME_LEN) { @@ -106,12 +108,14 @@ int main(int argc, char *argv[]) DFPRINTF("Creating file size %llu, name %s\n",(long long unsigned)size, filename); if (!backed) - ret = qcow_create(filename,size,NULL,flags); + ret = qcow_create(filename,size,NULL,sparse); else - ret = qcow_create(filename,size,bfilename,flags); + ret = qcow_create(filename,size,bfilename,sparse); - if (ret < 0) DPRINTF("Unable to create QCOW file\n"); - else DPRINTF("QCOW file successfully created\n"); + if (ret < 0) + DPRINTF("Unable to create QCOW file\n"); + else + DPRINTF("QCOW file successfully created\n"); return 0; } diff -r 42babffffba5 -r 58633caeece9 tools/examples/Makefile --- a/tools/examples/Makefile Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/Makefile Wed Jan 10 08:40:47 2007 -0700 @@ -9,6 +9,7 @@ XENDOMAINS_SYSCONFIG = init.d/sysconfig. # Xen configuration dir and configs to go there. XEN_CONFIG_DIR = /etc/xen XEN_CONFIGS = xend-config.sxp +XEN_CONFIGS += xm-config.xml XEN_CONFIGS += xmexample1 XEN_CONFIGS += xmexample2 XEN_CONFIGS += xmexample.hvm diff -r 42babffffba5 -r 58633caeece9 tools/examples/blktap --- a/tools/examples/blktap Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/blktap Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # Copyright (c) 2005, XenSource Ltd. diff -r 42babffffba5 -r 58633caeece9 tools/examples/block --- a/tools/examples/block Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/block Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash dir=$(dirname "$0") . "$dir/block-common.sh" diff -r 42babffffba5 -r 58633caeece9 tools/examples/block-enbd --- a/tools/examples/block-enbd Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/block-enbd Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # Usage: block-enbd [bind server ctl_port |unbind node] # diff -r 42babffffba5 -r 58633caeece9 tools/examples/block-nbd --- a/tools/examples/block-nbd Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/block-nbd Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # Usage: block-nbd [bind server ctl_port |unbind node] # diff -r 42babffffba5 -r 58633caeece9 tools/examples/external-device-migrate --- a/tools/examples/external-device-migrate Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/external-device-migrate Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # Copyright (c) 2005 IBM Corporation # diff -r 42babffffba5 -r 58633caeece9 tools/examples/network-bridge --- a/tools/examples/network-bridge Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/network-bridge Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash #============================================================================ # Default Xen network start/stop script. # Xend calls a network script when it starts. diff -r 42babffffba5 -r 58633caeece9 tools/examples/network-nat --- a/tools/examples/network-nat Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/network-nat Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash #============================================================================ # Default Xen network start/stop script when using NAT. # Xend calls a network script when it starts. diff -r 42babffffba5 -r 58633caeece9 tools/examples/network-route --- a/tools/examples/network-route Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/network-route Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash #============================================================================ # Default Xen network start/stop script. # Xend calls a network script when it starts. diff -r 42babffffba5 -r 58633caeece9 tools/examples/vif-bridge --- a/tools/examples/vif-bridge Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/vif-bridge Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash #============================================================================ # /etc/xen/vif-bridge # diff -r 42babffffba5 -r 58633caeece9 tools/examples/vif-common.sh --- a/tools/examples/vif-common.sh Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/vif-common.sh Wed Jan 10 08:40:47 2007 -0700 @@ -64,7 +64,7 @@ fi fi -function frob_iptable() +frob_iptable() { if [ "$command" == "online" ] then @@ -89,7 +89,7 @@ If you are using iptables, this may affe # to those coming from the specified networks, though we allow DHCP requests # as well. # -function handle_iptable() +handle_iptable() { # Check for a working iptables installation. Checking for the iptables # binary is not sufficient, because the user may not have the appropriate @@ -123,7 +123,7 @@ function handle_iptable() # Print the IP address currently in use at the given interface, or nothing if # the interface is not up. # -function ip_of() +ip_of() { ip addr show "$1" | awk "/^.*inet.*$1\$/{print \$2}" | sed -n '1 s,/.*,,p' } @@ -137,7 +137,7 @@ function ip_of() # to these scripts, or eth0 by default. This function will call fatal if no # such interface could be found. # -function dom0_ip() +dom0_ip() { local nd=${netdev:-eth0} local result=$(ip_of "$nd") diff -r 42babffffba5 -r 58633caeece9 tools/examples/vif-nat --- a/tools/examples/vif-nat Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/vif-nat Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash #============================================================================ # /etc/xen/vif-nat # diff -r 42babffffba5 -r 58633caeece9 tools/examples/vif-route --- a/tools/examples/vif-route Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/vif-route Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash #============================================================================ # /etc/xen/vif-route # diff -r 42babffffba5 -r 58633caeece9 tools/examples/vtpm --- a/tools/examples/vtpm Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/vtpm Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash dir=$(dirname "$0") . "$dir/vtpm-hotplug-common.sh" diff -r 42babffffba5 -r 58633caeece9 tools/examples/vtpm-delete --- a/tools/examples/vtpm-delete Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/vtpm-delete Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # This scripts must be called the following way: # vtpm-delete <domain name> diff -r 42babffffba5 -r 58633caeece9 tools/examples/xen-backend.agent --- a/tools/examples/xen-backend.agent Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/xen-backend.agent Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash PATH=/etc/xen/scripts:$PATH diff -r 42babffffba5 -r 58633caeece9 tools/examples/xen-hotplug-cleanup --- a/tools/examples/xen-hotplug-cleanup Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/xen-hotplug-cleanup Wed Jan 10 08:40:47 2007 -0700 @@ -1,4 +1,4 @@ -#! /bin/sh +#! /bin/bash dir=$(dirname "$0") . "$dir/xen-hotplug-common.sh" diff -r 42babffffba5 -r 58633caeece9 tools/examples/xm-config.xml --- a/tools/examples/xm-config.xml Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/xm-config.xml Wed Jan 10 08:40:47 2007 -0700 @@ -36,8 +36,10 @@ most useful for experimenting with the X The username and password attributes will be used to log in if Xen-API is being used. --> + <!-- <server type='Xen-API' uri='http://localhost:9363/' username='me' password='mypassword' /> + --> </xm> diff -r 42babffffba5 -r 58633caeece9 tools/examples/xmexample.hvm --- a/tools/examples/xmexample.hvm Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/examples/xmexample.hvm Wed Jan 10 08:40:47 2007 -0700 @@ -29,7 +29,7 @@ memory = 128 # Shadow pagetable memory for the domain, in MB. # Should be at least 2KB per MB of domain memory, plus a few MB per vcpu. -shadow_memory = 8 +# shadow_memory = 8 # A name for your domain. All domains must have different names. name = "ExampleHVMDomain" @@ -116,7 +116,7 @@ device_model = '/usr/' + arch_libdir + ' device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm' #----------------------------------------------------------------------------- -# boot on floppy (a), hard disk (c) or CD-ROM (d) +# boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d) # default: hard disk, cd-rom, floppy #boot="cda" diff -r 42babffffba5 -r 58633caeece9 tools/firmware/etherboot/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/firmware/etherboot/README Wed Jan 10 08:40:47 2007 -0700 @@ -0,0 +1,7 @@ + +This is an Etherboot option ROM for the rtl8139 NIC. It has a few +non-standard settings, just to do with timeouts and when to give up. + +Rom-o-matic.net will provide this image at the following URL: + +http://rom-o-matic.net/5.4.2/build.php?version=5.4.2&F=ignore&nic=rtl8139%3Artl8139+--+%5B0x10ec%2C0x8139%5D&ofmt=Binary+ROM+Image%28.zrom%29&arch=i386&ASK_BOOT=-1&BOOT_FIRST=BOOT_NIC&BOOT_SECOND=BOOT_NOTHING&BOOT_THIRD=BOOT_NOTHING&BOOT_INDEX=0&STATIC_CLIENT_IP=&STATIC_SUBNET_MASK=&STATIC_SERVER_IP=&STATIC_GATEWAY_IP=&STATIC_BOOTFILE=&EXIT_ON_FILE_LOAD_ERROR=on&DHCP_CLIENT_ID=&DHCP_CLIENT_ID_LEN=&DHCP_CLIENT_ID_TYPE=&DHCP_USER_CLASS=&DHCP_USER_CLASS_LEN=&ALLOW_ONLY_ENCAPSULATED=on&DEFAULT_BOOTFILE=&CONGESTED=on&BACKOFF_LIMIT=7&TIMEOUT=180&TRY_FLOPPY_FIRST=0&EXIT_IF_NO_OFFER=on&TAGGED_IMAGE=on&ELF_IMAGE=on&PXE_IMAGE=on&DOWNLOAD_PROTO_TFTP=on&COMCONSOLE=0x3F8&CONSPEED=9600&COMPARM=0x03&PXE_EXPORT=on&CONFIG_PCI=on&CONFIG_ISA=on&BUILD_ID=&PCBIOS=on&A=Get+ROM diff -r 42babffffba5 -r 58633caeece9 tools/firmware/etherboot/eb-rtl8139.zrom Binary file tools/firmware/etherboot/eb-rtl8139.zrom has changed diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/Makefile --- a/tools/firmware/hvmloader/Makefile Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/Makefile Wed Jan 10 08:40:47 2007 -0700 @@ -51,11 +51,12 @@ acpi/acpi.a: acpi/acpi.a: $(MAKE) -C acpi -roms.h: ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin +roms.h: ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin ../etherboot/eb-rtl8139.zrom sh ./mkhex rombios ../rombios/BIOS-bochs-latest > roms.h sh ./mkhex vgabios_stdvga ../vgabios/VGABIOS-lgpl-latest.bin >> roms.h sh ./mkhex vgabios_cirrusvga ../vgabios/VGABIOS-lgpl-latest.cirrus.bin >> roms.h sh ./mkhex vmxassist ../vmxassist/vmxassist.bin >> roms.h + sh ./mkhex etherboot ../etherboot/eb-rtl8139.zrom >> roms.h .PHONY: clean clean: diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/acpi/Makefile --- a/tools/firmware/hvmloader/acpi/Makefile Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/acpi/Makefile Wed Jan 10 08:40:47 2007 -0700 @@ -24,7 +24,7 @@ H_SRC = $(wildcard *.h) H_SRC = $(wildcard *.h) OBJS = $(patsubst %.c,%.o,$(C_SRC)) -IASL_VER = acpica-unix-20050513 +IASL_VER = acpica-unix-20060707 IASL_URL = http://developer.intel.com/technology/iapc/acpi/downloads/$(IASL_VER).tar.gz # Disable PIE/SSP if GCC supports them. They can break us. diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/acpi/acpi2_0.h --- a/tools/firmware/hvmloader/acpi/acpi2_0.h Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/acpi/acpi2_0.h Wed Jan 10 08:40:47 2007 -0700 @@ -50,17 +50,18 @@ struct acpi_header { uint8_t revision; uint8_t checksum; uint8_t oem_id[6]; - uint64_t oem_table_id; + uint8_t oem_table_id[8]; uint32_t oem_revision; uint32_t creator_id; uint32_t creator_revision; }; -#define ACPI_OEM_ID {'I','N','T','E','L',' '} -#define ACPI_OEM_TABLE_ID ASCII32(' ','T','B','D') -#define ACPI_OEM_REVISION 0x00000002 -#define ACPI_CREATOR_ID 0x00 /* TBD */ -#define ACPI_CREATOR_REVISION 0x00000002 +#define ACPI_OEM_ID "Xen" +#define ACPI_OEM_TABLE_ID "HVM" +#define ACPI_OEM_REVISION 0 + +#define ACPI_CREATOR_ID ASCII32('H','V','M','L') /* HVMLoader */ +#define ACPI_CREATOR_REVISION 0 /* * ACPI 2.0 Generic Address Space definition. @@ -121,7 +122,6 @@ struct acpi_20_rsdt { struct acpi_header header; uint32_t entry[1]; }; -#define ACPI_2_0_RSDT_REVISION 0x01 /* * Extended System Description Table (XSDT). @@ -130,7 +130,6 @@ struct acpi_20_xsdt { struct acpi_header header; uint64_t entry[1]; }; -#define ACPI_2_0_XSDT_REVISION 0x01 /* * TCG Hardware Interface Table (TCPA) @@ -141,8 +140,6 @@ struct acpi_20_tcpa { uint32_t laml; uint64_t lasa; }; - -#define ACPI_2_0_TCPA_REVISION 0x02 #define ACPI_2_0_TCPA_LAML_SIZE (64*1024) /* @@ -202,7 +199,6 @@ struct acpi_20_fadt { struct acpi_20_generic_address x_gpe0_blk; struct acpi_20_generic_address x_gpe1_blk; }; -#define ACPI_2_0_FADT_REVISION 0x03 /* * FADT Boot Architecture Flags. @@ -254,7 +250,19 @@ struct acpi_20_madt { uint32_t flags; }; -#define ACPI_2_0_MADT_REVISION 0x01 + +/* + * HPET Description Table + */ +struct acpi_20_hpet { + struct acpi_header header; + uint32_t timer_block_id; + struct acpi_20_generic_address addr; + uint8_t hpet_number; + uint16_t min_tick; + uint8_t page_protect; +}; +#define ACPI_HPET_ADDRESS 0xFED00000UL /* * Multiple APIC Flags. @@ -325,6 +333,18 @@ struct acpi_20_madt_intsrcovr { #define ACPI_2_0_RSDT_SIGNATURE ASCII32('R','S','D','T') #define ACPI_2_0_XSDT_SIGNATURE ASCII32('X','S','D','T') #define ACPI_2_0_TCPA_SIGNATURE ASCII32('T','C','P','A') +#define ACPI_2_0_HPET_SIGNATURE ASCII32('H','P','E','T') + +/* + * Table revision numbers. + */ +#define ACPI_2_0_RSDP_REVISION 0x02 +#define ACPI_2_0_FADT_REVISION 0x04 +#define ACPI_2_0_MADT_REVISION 0x02 +#define ACPI_2_0_RSDT_REVISION 0x01 +#define ACPI_2_0_XSDT_REVISION 0x01 +#define ACPI_2_0_TCPA_REVISION 0x02 +#define ACPI_2_0_HPET_REVISION 0x01 #pragma pack () diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/acpi/build.c --- a/tools/firmware/hvmloader/acpi/build.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/acpi/build.c Wed Jan 10 08:40:47 2007 -0700 @@ -57,8 +57,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, "INTEL ", 6); - madt->header.oem_table_id = ACPI_OEM_TABLE_ID; + strncpy(madt->header.oem_id, ACPI_OEM_ID, 6); + strncpy(madt->header.oem_table_id, ACPI_OEM_TABLE_ID, 8); madt->header.oem_revision = ACPI_OEM_REVISION; madt->header.creator_id = ACPI_CREATOR_ID; madt->header.creator_revision = ACPI_CREATOR_REVISION; @@ -69,16 +69,28 @@ int construct_madt(struct acpi_20_madt * intsrcovr = (struct acpi_20_madt_intsrcovr *)(madt + 1); for ( i = 0; i < 16; i++ ) { - if ( !(PCI_ISA_IRQ_MASK & (1U << i)) ) - continue; - - /* PCI: active-low level-triggered */ memset(intsrcovr, 0, sizeof(*intsrcovr)); intsrcovr->type = ACPI_INTERRUPT_SOURCE_OVERRIDE; intsrcovr->length = sizeof(*intsrcovr); intsrcovr->source = i; - intsrcovr->gsi = i; - intsrcovr->flags = 0xf; + + if ( i == 0 ) + { + /* ISA IRQ0 routed to IOAPIC GSI 2. */ + intsrcovr->gsi = 2; + intsrcovr->flags = 0x0; + } + else if ( PCI_ISA_IRQ_MASK & (1U << i) ) + { + /* PCI: active-low level-triggered. */ + intsrcovr->gsi = i; + intsrcovr->flags = 0xf; + } + else + { + /* No need for a INT source override structure. */ + continue; + } offset += sizeof(*intsrcovr); intsrcovr++; @@ -98,7 +110,7 @@ int construct_madt(struct acpi_20_madt * memset(lapic, 0, sizeof(*lapic)); lapic->type = ACPI_PROCESSOR_LOCAL_APIC; lapic->length = sizeof(*lapic); - lapic->acpi_processor_id = lapic->apic_id = i + 1; + lapic->acpi_processor_id = lapic->apic_id = LAPIC_ID(i); lapic->flags = ACPI_LOCAL_APIC_ENABLED; offset += sizeof(*lapic); lapic++; @@ -110,10 +122,33 @@ int construct_madt(struct acpi_20_madt * return align16(offset); } +int construct_hpet(struct acpi_20_hpet *hpet) +{ + int offset; + + 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); + hpet->header.oem_revision = ACPI_OEM_REVISION; + hpet->header.creator_id = ACPI_CREATOR_ID; + hpet->header.creator_revision = ACPI_CREATOR_REVISION; + hpet->timer_block_id = 0x8086a201; + hpet->addr.address = ACPI_HPET_ADDRESS; + offset = sizeof(*hpet); + + hpet->header.length = offset; + set_checksum(hpet, offsetof(struct acpi_header, checksum), offset); + + return offset; +} + int construct_secondary_tables(uint8_t *buf, unsigned long *table_ptrs) { int offset = 0, nr_tables = 0; struct acpi_20_madt *madt; + struct acpi_20_hpet *hpet; struct acpi_20_tcpa *tcpa; static const uint16_t tis_signature[] = {0x0001, 0x0001, 0x0001}; uint16_t *tis_hdr; @@ -125,6 +160,11 @@ int construct_secondary_tables(uint8_t * offset += construct_madt(madt); table_ptrs[nr_tables++] = (unsigned long)madt; } + + /* HPET. */ + hpet = (struct acpi_20_hpet *)&buf[offset]; + offset += construct_hpet(hpet); + table_ptrs[nr_tables++] = (unsigned long)hpet; /* TPM TCPA and SSDT. */ tis_hdr = (uint16_t *)0xFED40F00; @@ -144,12 +184,11 @@ 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, "IBM ", 6); - tcpa->header.oem_table_id = ASCII64(' ', ' ', ' ', ' ', - ' ', 'x', 'e', 'n'); - tcpa->header.oem_revision = 1; - tcpa->header.creator_id = ASCII32('I', 'B', 'M', ' '); - tcpa->header.creator_revision = 1; + strncpy(tcpa->header.oem_id, ACPI_OEM_ID, 6); + strncpy(tcpa->header.oem_table_id, ACPI_OEM_TABLE_ID, 8); + tcpa->header.oem_revision = ACPI_OEM_REVISION; + tcpa->header.creator_id = ACPI_CREATOR_ID; + tcpa->header.creator_revision = ACPI_CREATOR_REVISION; tcpa->lasa = e820_malloc( ACPI_2_0_TCPA_LAML_SIZE, E820_RESERVED, (uint32_t)~0); if ( tcpa->lasa ) diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/acpi/dsdt.asl --- a/tools/firmware/hvmloader/acpi/dsdt.asl Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/acpi/dsdt.asl Wed Jan 10 08:40:47 2007 -0700 @@ -17,7 +17,7 @@ * Place - Suite 330, Boston, MA 02111-1307 USA. */ -DefinitionBlock ("DSDT.aml", "DSDT", 1, "INTEL","int-xen", 2006) +DefinitionBlock ("DSDT.aml", "DSDT", 2, "Xen", "HVM", 0) { Name (\PMBS, 0x0C00) Name (\PMLN, 0x08) @@ -278,6 +278,22 @@ DefinitionBlock ("DSDT.aml", "DSDT", 1, Decrement(Local0) Store(Local0, PIRD) } + } + + Device(HPET) { + Name(_HID, EISAID("PNP0103")) + Name(_UID, 0) + Name(_CRS, ResourceTemplate() { + DWordMemory( + ResourceConsumer, PosDecode, MinFixed, MaxFixed, + NonCacheable, ReadWrite, + 0x00000000, + 0xFED00000, + 0xFED003FF, + 0x00000000, + 0x00000400 /* 1K memory: FED00000 - FED003FF */ + ) + }) } Method(_PRT,0) { diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/acpi/dsdt.c --- a/tools/firmware/hvmloader/acpi/dsdt.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/acpi/dsdt.c Wed Jan 10 08:40:47 2007 -0700 @@ -1,22 +1,22 @@ /* * * Intel ACPI Component Architecture - * ASL Optimizing Compiler / AML Disassembler version 20050513 [Nov 16 2006] - * Copyright (C) 2000 - 2005 Intel Corporation - * Supports ACPI Specification Revision 3.0 + * ASL Optimizing Compiler version 20060707 [Dec 30 2006] + * Copyright (C) 2000 - 2006 Intel Corporation + * Supports ACPI Specification Revision 3.0a * - * Compilation of "dsdt.asl" - Wed Nov 22 18:26:19 2006 + * Compilation of "dsdt.asl" - Sat Dec 30 15:31:23 2006 * * C source code output * */ -unsigned char AmlCode[] = +unsigned char AmlCode[] = { - 0x44,0x53,0x44,0x54,0x9D,0x0D,0x00,0x00, /* 00000000 "DSDT...." */ - 0x01,0x83,0x49,0x4E,0x54,0x45,0x4C,0x00, /* 00000008 "..INTEL." */ - 0x69,0x6E,0x74,0x2D,0x78,0x65,0x6E,0x00, /* 00000010 "int-xen." */ - 0xD6,0x07,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ - 0x13,0x05,0x05,0x20,0x08,0x50,0x4D,0x42, /* 00000020 "... .PMB" */ + 0x44,0x53,0x44,0x54,0xD9,0x0D,0x00,0x00, /* 00000000 "DSDT...." */ + 0x02,0xFB,0x58,0x65,0x6E,0x00,0x00,0x00, /* 00000008 "..Xen..." */ + 0x48,0x56,0x4D,0x00,0x00,0x00,0x00,0x00, /* 00000010 "HVM....." */ + 0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ + 0x07,0x07,0x06,0x20,0x08,0x50,0x4D,0x42, /* 00000020 "... .PMB" */ 0x53,0x0B,0x00,0x0C,0x08,0x50,0x4D,0x4C, /* 00000028 "S....PML" */ 0x4E,0x0A,0x08,0x08,0x49,0x4F,0x42,0x31, /* 00000030 "N...IOB1" */ 0x00,0x08,0x49,0x4F,0x4C,0x31,0x00,0x08, /* 00000038 "..IOL1.." */ @@ -34,7 +34,7 @@ unsigned char AmlCode[] = 0x12,0x08,0x04,0x0A,0x07,0x0A,0x07,0x00, /* 00000098 "........" */ 0x00,0x08,0x50,0x49,0x43,0x44,0x00,0x14, /* 000000A0 "..PICD.." */ 0x0C,0x5F,0x50,0x49,0x43,0x01,0x70,0x68, /* 000000A8 "._PIC.ph" */ - 0x50,0x49,0x43,0x44,0x10,0x48,0xCE,0x5F, /* 000000B0 "PICD.H._" */ + 0x50,0x49,0x43,0x44,0x10,0x44,0xD2,0x5F, /* 000000B0 "PICD.D._" */ 0x53,0x42,0x5F,0x5B,0x82,0x49,0x04,0x4D, /* 000000B8 "SB_[.I.M" */ 0x45,0x4D,0x30,0x08,0x5F,0x48,0x49,0x44, /* 000000C0 "EM0._HID" */ 0x0C,0x41,0xD0,0x0C,0x02,0x08,0x5F,0x43, /* 000000C8 ".A...._C" */ @@ -45,7 +45,7 @@ unsigned char AmlCode[] = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 000000F0 "........" */ 0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00, /* 000000F8 "........" */ 0x00,0x00,0x00,0x00,0x79,0x00,0x5B,0x82, /* 00000100 "....y.[." */ - 0x45,0xC9,0x50,0x43,0x49,0x30,0x08,0x5F, /* 00000108 "E.PCI0._" */ + 0x41,0xCD,0x50,0x43,0x49,0x30,0x08,0x5F, /* 00000108 "A.PCI0._" */ 0x48,0x49,0x44,0x0C,0x41,0xD0,0x0A,0x03, /* 00000110 "HID.A..." */ 0x08,0x5F,0x55,0x49,0x44,0x00,0x08,0x5F, /* 00000118 "._UID.._" */ 0x41,0x44,0x52,0x00,0x08,0x5F,0x42,0x42, /* 00000120 "ADR.._BB" */ @@ -140,313 +140,321 @@ unsigned char AmlCode[] = 0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,0x01, /* 000003E8 "_SRS..h." */ 0x49,0x52,0x51,0x31,0x82,0x49,0x52,0x51, /* 000003F0 "IRQ1.IRQ" */ 0x31,0x60,0x76,0x60,0x70,0x60,0x50,0x49, /* 000003F8 "1`v`p`PI" */ - 0x52,0x44,0x14,0x16,0x5F,0x50,0x52,0x54, /* 00000400 "RD.._PRT" */ - 0x00,0xA0,0x0A,0x50,0x49,0x43,0x44,0xA4, /* 00000408 "...PICD." */ - 0x50,0x52,0x54,0x41,0xA4,0x50,0x52,0x54, /* 00000410 "PRTA.PRT" */ - 0x50,0x08,0x50,0x52,0x54,0x50,0x12,0x49, /* 00000418 "P.PRTP.I" */ - 0x36,0x3C,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 00000420 "6<......" */ - 0x01,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00, /* 00000428 "...LNKB." */ - 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x01,0x00, /* 00000430 "........" */ - 0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E, /* 00000438 ".LNKC..." */ - 0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x02, /* 00000440 "........" */ - 0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04, /* 00000448 "LNKD...." */ - 0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x03,0x4C, /* 00000450 ".......L" */ - 0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C, /* 00000458 "NKA....." */ - 0xFF,0xFF,0x02,0x00,0x00,0x4C,0x4E,0x4B, /* 00000460 ".....LNK" */ - 0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 00000468 "C......." */ - 0x02,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00, /* 00000470 "...LNKD." */ - 0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x02,0x00, /* 00000478 "........" */ - 0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12, /* 00000480 "..LNKA.." */ - 0x0E,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A, /* 00000488 "........" */ - 0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D, /* 00000490 ".LNKB..." */ - 0x04,0x0C,0xFF,0xFF,0x03,0x00,0x00,0x4C, /* 00000498 ".......L" */ - 0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C, /* 000004A0 "NKD....." */ - 0xFF,0xFF,0x03,0x00,0x01,0x4C,0x4E,0x4B, /* 000004A8 ".....LNK" */ - 0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF, /* 000004B0 "A......." */ - 0x03,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42, /* 000004B8 "....LNKB" */ - 0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x03, /* 000004C0 "........" */ - 0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00, /* 000004C8 "...LNKC." */ - 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x04,0x00, /* 000004D0 "........" */ - 0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D, /* 000004D8 ".LNKA..." */ - 0x04,0x0C,0xFF,0xFF,0x04,0x00,0x01,0x4C, /* 000004E0 ".......L" */ - 0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C, /* 000004E8 "NKB....." */ - 0xFF,0xFF,0x04,0x00,0x0A,0x02,0x4C,0x4E, /* 000004F0 "......LN" */ - 0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF, /* 000004F8 "KC......" */ - 0xFF,0x04,0x00,0x0A,0x03,0x4C,0x4E,0x4B, /* 00000500 ".....LNK" */ - 0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 00000508 "D......." */ - 0x05,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00, /* 00000510 "...LNKB." */ - 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x05,0x00, /* 00000518 "........" */ - 0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E, /* 00000520 ".LNKC..." */ - 0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x02, /* 00000528 "........" */ - 0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04, /* 00000530 "LNKD...." */ - 0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x03,0x4C, /* 00000538 ".......L" */ - 0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C, /* 00000540 "NKA....." */ - 0xFF,0xFF,0x06,0x00,0x00,0x4C,0x4E,0x4B, /* 00000548 ".....LNK" */ - 0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 00000550 "C......." */ - 0x06,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00, /* 00000558 "...LNKD." */ - 0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x06,0x00, /* 00000560 "........" */ - 0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12, /* 00000568 "..LNKA.." */ - 0x0E,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A, /* 00000570 "........" */ - 0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D, /* 00000578 ".LNKB..." */ - 0x04,0x0C,0xFF,0xFF,0x07,0x00,0x00,0x4C, /* 00000580 ".......L" */ - 0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C, /* 00000588 "NKD....." */ - 0xFF,0xFF,0x07,0x00,0x01,0x4C,0x4E,0x4B, /* 00000590 ".....LNK" */ - 0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF, /* 00000598 "A......." */ - 0x07,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42, /* 000005A0 "....LNKB" */ - 0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x07, /* 000005A8 "........" */ - 0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00, /* 000005B0 "...LNKC." */ - 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x08,0x00, /* 000005B8 "........" */ - 0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D, /* 000005C0 ".LNKA..." */ - 0x04,0x0C,0xFF,0xFF,0x08,0x00,0x01,0x4C, /* 000005C8 ".......L" */ - 0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C, /* 000005D0 "NKB....." */ - 0xFF,0xFF,0x08,0x00,0x0A,0x02,0x4C,0x4E, /* 000005D8 "......LN" */ - 0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF, /* 000005E0 "KC......" */ - 0xFF,0x08,0x00,0x0A,0x03,0x4C,0x4E,0x4B, /* 000005E8 ".....LNK" */ - 0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 000005F0 "D......." */ - 0x09,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00, /* 000005F8 "...LNKB." */ - 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x09,0x00, /* 00000600 "........" */ - 0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E, /* 00000608 ".LNKC..." */ - 0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x02, /* 00000610 "........" */ - 0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04, /* 00000618 "LNKD...." */ - 0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x03,0x4C, /* 00000620 ".......L" */ - 0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C, /* 00000628 "NKA....." */ - 0xFF,0xFF,0x0A,0x00,0x00,0x4C,0x4E,0x4B, /* 00000630 ".....LNK" */ - 0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 00000638 "C......." */ - 0x0A,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00, /* 00000640 "...LNKD." */ - 0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0A,0x00, /* 00000648 "........" */ - 0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12, /* 00000650 "..LNKA.." */ - 0x0E,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A, /* 00000658 "........" */ - 0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D, /* 00000660 ".LNKB..." */ - 0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x00,0x4C, /* 00000668 ".......L" */ - 0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C, /* 00000670 "NKD....." */ - 0xFF,0xFF,0x0B,0x00,0x01,0x4C,0x4E,0x4B, /* 00000678 ".....LNK" */ - 0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF, /* 00000680 "A......." */ - 0x0B,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42, /* 00000688 "....LNKB" */ - 0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0B, /* 00000690 "........" */ - 0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00, /* 00000698 "...LNKC." */ - 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0C,0x00, /* 000006A0 "........" */ - 0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D, /* 000006A8 ".LNKA..." */ - 0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x01,0x4C, /* 000006B0 ".......L" */ - 0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C, /* 000006B8 "NKB....." */ - 0xFF,0xFF,0x0C,0x00,0x0A,0x02,0x4C,0x4E, /* 000006C0 "......LN" */ - 0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF, /* 000006C8 "KC......" */ - 0xFF,0x0C,0x00,0x0A,0x03,0x4C,0x4E,0x4B, /* 000006D0 ".....LNK" */ - 0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 000006D8 "D......." */ - 0x0D,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00, /* 000006E0 "...LNKB." */ - 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0D,0x00, /* 000006E8 "........" */ - 0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E, /* 000006F0 ".LNKC..." */ - 0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x02, /* 000006F8 "........" */ - 0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04, /* 00000700 "LNKD...." */ - 0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x03,0x4C, /* 00000708 ".......L" */ - 0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C, /* 00000710 "NKA....." */ - 0xFF,0xFF,0x0E,0x00,0x00,0x4C,0x4E,0x4B, /* 00000718 ".....LNK" */ - 0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 00000720 "C......." */ - 0x0E,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00, /* 00000728 "...LNKD." */ - 0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0E,0x00, /* 00000730 "........" */ - 0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12, /* 00000738 "..LNKA.." */ - 0x0E,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A, /* 00000740 "........" */ - 0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D, /* 00000748 ".LNKB..." */ - 0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x00,0x4C, /* 00000750 ".......L" */ - 0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C, /* 00000758 "NKD....." */ - 0xFF,0xFF,0x0F,0x00,0x01,0x4C,0x4E,0x4B, /* 00000760 ".....LNK" */ - 0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF, /* 00000768 "A......." */ - 0x0F,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42, /* 00000770 "....LNKB" */ - 0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0F, /* 00000778 "........" */ - 0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00, /* 00000780 "...LNKC." */ - 0x08,0x50,0x52,0x54,0x41,0x12,0x41,0x2F, /* 00000788 ".PRTA.A/" */ - 0x3C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x01, /* 00000790 "<......." */ - 0x00,0x00,0x00,0x0A,0x14,0x12,0x0B,0x04, /* 00000798 "........" */ - 0x0C,0xFF,0xFF,0x01,0x00,0x01,0x00,0x0A, /* 000007A0 "........" */ - 0x15,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x01, /* 000007A8 "........" */ - 0x00,0x0A,0x02,0x00,0x0A,0x16,0x12,0x0C, /* 000007B0 "........" */ - 0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x03, /* 000007B8 "........" */ - 0x00,0x0A,0x17,0x12,0x0B,0x04,0x0C,0xFF, /* 000007C0 "........" */ - 0xFF,0x02,0x00,0x00,0x00,0x0A,0x18,0x12, /* 000007C8 "........" */ - 0x0B,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x01, /* 000007D0 "........" */ - 0x00,0x0A,0x19,0x12,0x0C,0x04,0x0C,0xFF, /* 000007D8 "........" */ - 0xFF,0x02,0x00,0x0A,0x02,0x00,0x0A,0x1A, /* 000007E0 "........" */ - 0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x02,0x00, /* 000007E8 "........" */ - 0x0A,0x03,0x00,0x0A,0x1B,0x12,0x0B,0x04, /* 000007F0 "........" */ - 0x0C,0xFF,0xFF,0x03,0x00,0x00,0x00,0x0A, /* 000007F8 "........" */ - 0x1C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x03, /* 00000800 "........" */ - 0x00,0x01,0x00,0x0A,0x1D,0x12,0x0C,0x04, /* 00000808 "........" */ - 0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x02,0x00, /* 00000810 "........" */ - 0x0A,0x1E,0x12,0x0C,0x04,0x0C,0xFF,0xFF, /* 00000818 "........" */ - 0x03,0x00,0x0A,0x03,0x00,0x0A,0x1F,0x12, /* 00000820 "........" */ - 0x0B,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x00, /* 00000828 "........" */ - 0x00,0x0A,0x20,0x12,0x0B,0x04,0x0C,0xFF, /* 00000830 ".. ....." */ - 0xFF,0x04,0x00,0x01,0x00,0x0A,0x21,0x12, /* 00000838 "......!." */ - 0x0C,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A, /* 00000840 "........" */ - 0x02,0x00,0x0A,0x22,0x12,0x0C,0x04,0x0C, /* 00000848 "..."...." */ - 0xFF,0xFF,0x04,0x00,0x0A,0x03,0x00,0x0A, /* 00000850 "........" */ - 0x23,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x05, /* 00000858 "#......." */ - 0x00,0x00,0x00,0x0A,0x24,0x12,0x0B,0x04, /* 00000860 "....$..." */ - 0x0C,0xFF,0xFF,0x05,0x00,0x01,0x00,0x0A, /* 00000868 "........" */ - 0x25,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x05, /* 00000870 "%......." */ - 0x00,0x0A,0x02,0x00,0x0A,0x26,0x12,0x0C, /* 00000878 ".....&.." */ - 0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x03, /* 00000880 "........" */ - 0x00,0x0A,0x27,0x12,0x0B,0x04,0x0C,0xFF, /* 00000888 "..'....." */ - 0xFF,0x06,0x00,0x00,0x00,0x0A,0x28,0x12, /* 00000890 "......(." */ - 0x0B,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x01, /* 00000898 "........" */ - 0x00,0x0A,0x29,0x12,0x0C,0x04,0x0C,0xFF, /* 000008A0 "..)....." */ - 0xFF,0x06,0x00,0x0A,0x02,0x00,0x0A,0x2A, /* 000008A8 ".......*" */ - 0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x06,0x00, /* 000008B0 "........" */ - 0x0A,0x03,0x00,0x0A,0x2B,0x12,0x0B,0x04, /* 000008B8 "....+..." */ - 0x0C,0xFF,0xFF,0x07,0x00,0x00,0x00,0x0A, /* 000008C0 "........" */ - 0x2C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x07, /* 000008C8 ",......." */ - 0x00,0x01,0x00,0x0A,0x2D,0x12,0x0C,0x04, /* 000008D0 "....-..." */ - 0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x02,0x00, /* 000008D8 "........" */ - 0x0A,0x2E,0x12,0x0C,0x04,0x0C,0xFF,0xFF, /* 000008E0 "........" */ - 0x07,0x00,0x0A,0x03,0x00,0x0A,0x2F,0x12, /* 000008E8 "....../." */ - 0x0B,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x00, /* 000008F0 "........" */ - 0x00,0x0A,0x11,0x12,0x0B,0x04,0x0C,0xFF, /* 000008F8 "........" */ - 0xFF,0x08,0x00,0x01,0x00,0x0A,0x12,0x12, /* 00000900 "........" */ - 0x0C,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A, /* 00000908 "........" */ - 0x02,0x00,0x0A,0x13,0x12,0x0C,0x04,0x0C, /* 00000910 "........" */ - 0xFF,0xFF,0x08,0x00,0x0A,0x03,0x00,0x0A, /* 00000918 "........" */ - 0x14,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x09, /* 00000920 "........" */ - 0x00,0x00,0x00,0x0A,0x15,0x12,0x0B,0x04, /* 00000928 "........" */ - 0x0C,0xFF,0xFF,0x09,0x00,0x01,0x00,0x0A, /* 00000930 "........" */ - 0x16,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x09, /* 00000938 "........" */ - 0x00,0x0A,0x02,0x00,0x0A,0x17,0x12,0x0C, /* 00000940 "........" */ - 0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x03, /* 00000948 "........" */ - 0x00,0x0A,0x18,0x12,0x0B,0x04,0x0C,0xFF, /* 00000950 "........" */ - 0xFF,0x0A,0x00,0x00,0x00,0x0A,0x19,0x12, /* 00000958 "........" */ - 0x0B,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x01, /* 00000960 "........" */ - 0x00,0x0A,0x1A,0x12,0x0C,0x04,0x0C,0xFF, /* 00000968 "........" */ - 0xFF,0x0A,0x00,0x0A,0x02,0x00,0x0A,0x1B, /* 00000970 "........" */ - 0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0A,0x00, /* 00000978 "........" */ - 0x0A,0x03,0x00,0x0A,0x1C,0x12,0x0B,0x04, /* 00000980 "........" */ - 0x0C,0xFF,0xFF,0x0B,0x00,0x00,0x00,0x0A, /* 00000988 "........" */ - 0x1D,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0B, /* 00000990 "........" */ - 0x00,0x01,0x00,0x0A,0x1E,0x12,0x0C,0x04, /* 00000998 "........" */ - 0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x02,0x00, /* 000009A0 "........" */ - 0x0A,0x1F,0x12,0x0C,0x04,0x0C,0xFF,0xFF, /* 000009A8 "........" */ - 0x0B,0x00,0x0A,0x03,0x00,0x0A,0x20,0x12, /* 000009B0 "...... ." */ - 0x0B,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x00, /* 000009B8 "........" */ - 0x00,0x0A,0x21,0x12,0x0B,0x04,0x0C,0xFF, /* 000009C0 "..!....." */ - 0xFF,0x0C,0x00,0x01,0x00,0x0A,0x22,0x12, /* 000009C8 "......"." */ - 0x0C,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A, /* 000009D0 "........" */ - 0x02,0x00,0x0A,0x23,0x12,0x0C,0x04,0x0C, /* 000009D8 "...#...." */ - 0xFF,0xFF,0x0C,0x00,0x0A,0x03,0x00,0x0A, /* 000009E0 "........" */ - 0x24,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0D, /* 000009E8 "$......." */ - 0x00,0x00,0x00,0x0A,0x25,0x12,0x0B,0x04, /* 000009F0 "....%..." */ - 0x0C,0xFF,0xFF,0x0D,0x00,0x01,0x00,0x0A, /* 000009F8 "........" */ - 0x26,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0D, /* 00000A00 "&......." */ - 0x00,0x0A,0x02,0x00,0x0A,0x27,0x12,0x0C, /* 00000A08 ".....'.." */ - 0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x03, /* 00000A10 "........" */ - 0x00,0x0A,0x28,0x12,0x0B,0x04,0x0C,0xFF, /* 00000A18 "..(....." */ - 0xFF,0x0E,0x00,0x00,0x00,0x0A,0x29,0x12, /* 00000A20 "......)." */ - 0x0B,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x01, /* 00000A28 "........" */ - 0x00,0x0A,0x2A,0x12,0x0C,0x04,0x0C,0xFF, /* 00000A30 "..*....." */ - 0xFF,0x0E,0x00,0x0A,0x02,0x00,0x0A,0x2B, /* 00000A38 ".......+" */ - 0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0E,0x00, /* 00000A40 "........" */ - 0x0A,0x03,0x00,0x0A,0x2C,0x12,0x0B,0x04, /* 00000A48 "....,..." */ - 0x0C,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x0A, /* 00000A50 "........" */ - 0x2D,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0F, /* 00000A58 "-......." */ - 0x00,0x01,0x00,0x0A,0x2E,0x12,0x0C,0x04, /* 00000A60 "........" */ - 0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x02,0x00, /* 00000A68 "........" */ - 0x0A,0x2F,0x12,0x0C,0x04,0x0C,0xFF,0xFF, /* 00000A70 "./......" */ - 0x0F,0x00,0x0A,0x03,0x00,0x0A,0x10,0x5B, /* 00000A78 ".......[" */ - 0x82,0x4C,0x31,0x49,0x53,0x41,0x5F,0x08, /* 00000A80 ".L1ISA_." */ - 0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,0x01, /* 00000A88 "_ADR...." */ - 0x00,0x5B,0x80,0x50,0x49,0x52,0x51,0x02, /* 00000A90 ".[.PIRQ." */ - 0x0A,0x60,0x0A,0x04,0x10,0x2E,0x5C,0x00, /* 00000A98 ".`....\." */ - 0x5B,0x81,0x29,0x5C,0x2F,0x04,0x5F,0x53, /* 00000AA0 "[.)\/._S" */ - 0x42,0x5F,0x50,0x43,0x49,0x30,0x49,0x53, /* 00000AA8 "B_PCI0IS" */ - 0x41,0x5F,0x50,0x49,0x52,0x51,0x01,0x50, /* 00000AB0 "A_PIRQ.P" */ - 0x49,0x52,0x41,0x08,0x50,0x49,0x52,0x42, /* 00000AB8 "IRA.PIRB" */ - 0x08,0x50,0x49,0x52,0x43,0x08,0x50,0x49, /* 00000AC0 ".PIRC.PI" */ - 0x52,0x44,0x08,0x5B,0x82,0x46,0x0B,0x53, /* 00000AC8 "RD.[.F.S" */ - 0x59,0x53,0x52,0x08,0x5F,0x48,0x49,0x44, /* 00000AD0 "YSR._HID" */ - 0x0C,0x41,0xD0,0x0C,0x02,0x08,0x5F,0x55, /* 00000AD8 ".A...._U" */ - 0x49,0x44,0x01,0x08,0x43,0x52,0x53,0x5F, /* 00000AE0 "ID..CRS_" */ - 0x11,0x4E,0x08,0x0A,0x8A,0x47,0x01,0x10, /* 00000AE8 ".N...G.." */ - 0x00,0x10,0x00,0x00,0x10,0x47,0x01,0x22, /* 00000AF0 ".....G."" */ - 0x00,0x22,0x00,0x00,0x0C,0x47,0x01,0x30, /* 00000AF8 "."...G.0" */ - 0x00,0x30,0x00,0x00,0x10,0x47,0x01,0x44, /* 00000B00 ".0...G.D" */ - 0x00,0x44,0x00,0x00,0x1C,0x47,0x01,0x62, /* 00000B08 ".D...G.b" */ - 0x00,0x62,0x00,0x00,0x02,0x47,0x01,0x65, /* 00000B10 ".b...G.e" */ - 0x00,0x65,0x00,0x00,0x0B,0x47,0x01,0x72, /* 00000B18 ".e...G.r" */ - 0x00,0x72,0x00,0x00,0x0E,0x47,0x01,0x80, /* 00000B20 ".r...G.." */ - 0x00,0x80,0x00,0x00,0x01,0x47,0x01,0x84, /* 00000B28 ".....G.." */ - 0x00,0x84,0x00,0x00,0x03,0x47,0x01,0x88, /* 00000B30 ".....G.." */ - 0x00,0x88,0x00,0x00,0x01,0x47,0x01,0x8C, /* 00000B38 ".....G.." */ - 0x00,0x8C,0x00,0x00,0x03,0x47,0x01,0x90, /* 00000B40 ".....G.." */ - 0x00,0x90,0x00,0x00,0x10,0x47,0x01,0xA2, /* 00000B48 ".....G.." */ - 0x00,0xA2,0x00,0x00,0x1C,0x47,0x01,0xE0, /* 00000B50 ".....G.." */ - 0x00,0xE0,0x00,0x00,0x10,0x47,0x01,0xA0, /* 00000B58 ".....G.." */ - 0x08,0xA0,0x08,0x00,0x04,0x47,0x01,0xC0, /* 00000B60 ".....G.." */ - 0x0C,0xC0,0x0C,0x00,0x10,0x47,0x01,0xD0, /* 00000B68 ".....G.." */ - 0x04,0xD0,0x04,0x00,0x02,0x79,0x00,0x14, /* 00000B70 ".....y.." */ - 0x0B,0x5F,0x43,0x52,0x53,0x00,0xA4,0x43, /* 00000B78 "._CRS..C" */ - 0x52,0x53,0x5F,0x5B,0x82,0x2B,0x50,0x49, /* 00000B80 "RS_[.+PI" */ - 0x43,0x5F,0x08,0x5F,0x48,0x49,0x44,0x0B, /* 00000B88 "C_._HID." */ - 0x41,0xD0,0x08,0x5F,0x43,0x52,0x53,0x11, /* 00000B90 "A.._CRS." */ - 0x18,0x0A,0x15,0x47,0x01,0x20,0x00,0x20, /* 00000B98 "...G. . " */ - 0x00,0x01,0x02,0x47,0x01,0xA0,0x00,0xA0, /* 00000BA0 "...G...." */ - 0x00,0x01,0x02,0x22,0x04,0x00,0x79,0x00, /* 00000BA8 "..."..y." */ - 0x5B,0x82,0x47,0x05,0x44,0x4D,0x41,0x30, /* 00000BB0 "[.G.DMA0" */ - 0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0, /* 00000BB8 "._HID.A." */ - 0x02,0x00,0x08,0x5F,0x43,0x52,0x53,0x11, /* 00000BC0 "..._CRS." */ - 0x41,0x04,0x0A,0x3D,0x2A,0x10,0x04,0x47, /* 00000BC8 "A..=*..G" */ - 0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x47, /* 00000BD0 ".......G" */ - 0x01,0x81,0x00,0x81,0x00,0x00,0x03,0x47, /* 00000BD8 ".......G" */ - 0x01,0x87,0x00,0x87,0x00,0x00,0x01,0x47, /* 00000BE0 ".......G" */ - 0x01,0x89,0x00,0x89,0x00,0x00,0x03,0x47, /* 00000BE8 ".......G" */ - 0x01,0x8F,0x00,0x8F,0x00,0x00,0x01,0x47, /* 00000BF0 ".......G" */ - 0x01,0xC0,0x00,0xC0,0x00,0x00,0x20,0x47, /* 00000BF8 "...... G" */ - 0x01,0x80,0x04,0x80,0x04,0x00,0x10,0x79, /* 00000C00 ".......y" */ - 0x00,0x5B,0x82,0x25,0x54,0x4D,0x52,0x5F, /* 00000C08 ".[.%TMR_" */ - 0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0, /* 00000C10 "._HID.A." */ - 0x01,0x00,0x08,0x5F,0x43,0x52,0x53,0x11, /* 00000C18 "..._CRS." */ - 0x10,0x0A,0x0D,0x47,0x01,0x40,0x00,0x40, /* 00000C20 "...G.@.@" */ - 0x00,0x00,0x04,0x22,0x01,0x00,0x79,0x00, /* 00000C28 "..."..y." */ - 0x5B,0x82,0x25,0x52,0x54,0x43,0x5F,0x08, /* 00000C30 "[.%RTC_." */ - 0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0B, /* 00000C38 "_HID.A.." */ - 0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x10, /* 00000C40 ".._CRS.." */ - 0x0A,0x0D,0x47,0x01,0x70,0x00,0x70,0x00, /* 00000C48 "..G.p.p." */ - 0x00,0x02,0x22,0x00,0x01,0x79,0x00,0x5B, /* 00000C50 ".."..y.[" */ - 0x82,0x22,0x53,0x50,0x4B,0x52,0x08,0x5F, /* 00000C58 "."SPKR._" */ - 0x48,0x49,0x44,0x0C,0x41,0xD0,0x08,0x00, /* 00000C60 "HID.A..." */ - 0x08,0x5F,0x43,0x52,0x53,0x11,0x0D,0x0A, /* 00000C68 "._CRS..." */ - 0x0A,0x47,0x01,0x61,0x00,0x61,0x00,0x00, /* 00000C70 ".G.a.a.." */ - 0x01,0x79,0x00,0x5B,0x82,0x31,0x50,0x53, /* 00000C78 ".y.[.1PS" */ - 0x32,0x4D,0x08,0x5F,0x48,0x49,0x44,0x0C, /* 00000C80 "2M._HID." */ - 0x41,0xD0,0x0F,0x13,0x08,0x5F,0x43,0x49, /* 00000C88 "A...._CI" */ - 0x44,0x0C,0x41,0xD0,0x0F,0x13,0x14,0x09, /* 00000C90 "D.A....." */ - 0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F, /* 00000C98 "_STA...." */ - 0x08,0x5F,0x43,0x52,0x53,0x11,0x08,0x0A, /* 00000CA0 "._CRS..." */ - 0x05,0x22,0x00,0x10,0x79,0x00,0x5B,0x82, /* 00000CA8 "."..y.[." */ - 0x42,0x04,0x50,0x53,0x32,0x4B,0x08,0x5F, /* 00000CB0 "B.PS2K._" */ - 0x48,0x49,0x44,0x0C,0x41,0xD0,0x03,0x03, /* 00000CB8 "HID.A..." */ - 0x08,0x5F,0x43,0x49,0x44,0x0C,0x41,0xD0, /* 00000CC0 "._CID.A." */ - 0x03,0x0B,0x14,0x09,0x5F,0x53,0x54,0x41, /* 00000CC8 "...._STA" */ - 0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52, /* 00000CD0 "....._CR" */ - 0x53,0x11,0x18,0x0A,0x15,0x47,0x01,0x60, /* 00000CD8 "S....G.`" */ - 0x00,0x60,0x00,0x00,0x01,0x47,0x01,0x64, /* 00000CE0 ".`...G.d" */ - 0x00,0x64,0x00,0x00,0x01,0x22,0x02,0x00, /* 00000CE8 ".d...".." */ - 0x79,0x00,0x5B,0x82,0x3A,0x46,0x44,0x43, /* 00000CF0 "y.[.:FDC" */ - 0x30,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41, /* 00000CF8 "0._HID.A" */ - 0xD0,0x07,0x00,0x14,0x09,0x5F,0x53,0x54, /* 00000D00 "....._ST" */ - 0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43, /* 00000D08 "A....._C" */ - 0x52,0x53,0x11,0x1B,0x0A,0x18,0x47,0x01, /* 00000D10 "RS....G." */ - 0xF0,0x03,0xF0,0x03,0x01,0x06,0x47,0x01, /* 00000D18 "......G." */ - 0xF7,0x03,0xF7,0x03,0x01,0x01,0x22,0x40, /* 00000D20 "......"@" */ - 0x00,0x2A,0x04,0x00,0x79,0x00,0x5B,0x82, /* 00000D28 ".*..y.[." */ - 0x35,0x55,0x41,0x52,0x31,0x08,0x5F,0x48, /* 00000D30 "5UAR1._H" */ - 0x49,0x44,0x0C,0x41,0xD0,0x05,0x01,0x08, /* 00000D38 "ID.A...." */ - 0x5F,0x55,0x49,0x44,0x01,0x14,0x09,0x5F, /* 00000D40 "_UID..._" */ - 0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08, /* 00000D48 "STA....." */ - 0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,0x0D, /* 00000D50 "_CRS...." */ - 0x47,0x01,0xF8,0x03,0xF8,0x03,0x01,0x08, /* 00000D58 "G......." */ - 0x22,0x10,0x00,0x79,0x00,0x5B,0x82,0x36, /* 00000D60 ""..y.[.6" */ - 0x4C,0x54,0x50,0x31,0x08,0x5F,0x48,0x49, /* 00000D68 "LTP1._HI" */ - 0x44,0x0C,0x41,0xD0,0x04,0x00,0x08,0x5F, /* 00000D70 "D.A...._" */ - 0x55,0x49,0x44,0x0A,0x02,0x14,0x09,0x5F, /* 00000D78 "UID...._" */ - 0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08, /* 00000D80 "STA....." */ - 0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,0x0D, /* 00000D88 "_CRS...." */ - 0x47,0x01,0x78,0x03,0x78,0x03,0x08,0x08, /* 00000D90 "G.x.x..." */ - 0x22,0x80,0x00,0x79,0x00, + 0x52,0x44,0x5B,0x82,0x3A,0x48,0x50,0x45, /* 00000400 "RD[.:HPE" */ + 0x54,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41, /* 00000408 "T._HID.A" */ + 0xD0,0x01,0x03,0x08,0x5F,0x55,0x49,0x44, /* 00000410 "...._UID" */ + 0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x1F, /* 00000418 ".._CRS.." */ + 0x0A,0x1C,0x87,0x17,0x00,0x00,0x0D,0x01, /* 00000420 "........" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0xFE, /* 00000428 "........" */ + 0xFF,0x03,0xD0,0xFE,0x00,0x00,0x00,0x00, /* 00000430 "........" */ + 0x00,0x04,0x00,0x00,0x79,0x00,0x14,0x16, /* 00000438 "....y..." */ + 0x5F,0x50,0x52,0x54,0x00,0xA0,0x0A,0x50, /* 00000440 "_PRT...P" */ + 0x49,0x43,0x44,0xA4,0x50,0x52,0x54,0x41, /* 00000448 "ICD.PRTA" */ + 0xA4,0x50,0x52,0x54,0x50,0x08,0x50,0x52, /* 00000450 ".PRTP.PR" */ + 0x54,0x50,0x12,0x49,0x36,0x3C,0x12,0x0D, /* 00000458 "TP.I6<.." */ + 0x04,0x0C,0xFF,0xFF,0x01,0x00,0x00,0x4C, /* 00000460 ".......L" */ + 0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C, /* 00000468 "NKB....." */ + 0xFF,0xFF,0x01,0x00,0x01,0x4C,0x4E,0x4B, /* 00000470 ".....LNK" */ + 0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF, /* 00000478 "C......." */ + 0x01,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44, /* 00000480 "....LNKD" */ + 0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x01, /* 00000488 "........" */ + 0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00, /* 00000490 "...LNKA." */ + 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x02,0x00, /* 00000498 "........" */ + 0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D, /* 000004A0 ".LNKC..." */ + 0x04,0x0C,0xFF,0xFF,0x02,0x00,0x01,0x4C, /* 000004A8 ".......L" */ + 0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C, /* 000004B0 "NKD....." */ + 0xFF,0xFF,0x02,0x00,0x0A,0x02,0x4C,0x4E, /* 000004B8 "......LN" */ + 0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF, /* 000004C0 "KA......" */ + 0xFF,0x02,0x00,0x0A,0x03,0x4C,0x4E,0x4B, /* 000004C8 ".....LNK" */ + 0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 000004D0 "B......." */ + 0x03,0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00, /* 000004D8 "...LNKD." */ + 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x03,0x00, /* 000004E0 "........" */ + 0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E, /* 000004E8 ".LNKA..." */ + 0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x02, /* 000004F0 "........" */ + 0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04, /* 000004F8 "LNKB...." */ + 0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x03,0x4C, /* 00000500 ".......L" */ + 0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C, /* 00000508 "NKC....." */ + 0xFF,0xFF,0x04,0x00,0x00,0x4C,0x4E,0x4B, /* 00000510 ".....LNK" */ + 0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 00000518 "A......." */ + 0x04,0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00, /* 00000520 "...LNKB." */ + 0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x04,0x00, /* 00000528 "........" */ + 0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12, /* 00000530 "..LNKC.." */ + 0x0E,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A, /* 00000538 "........" */ + 0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D, /* 00000540 ".LNKD..." */ + 0x04,0x0C,0xFF,0xFF,0x05,0x00,0x00,0x4C, /* 00000548 ".......L" */ + 0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C, /* 00000550 "NKB....." */ + 0xFF,0xFF,0x05,0x00,0x01,0x4C,0x4E,0x4B, /* 00000558 ".....LNK" */ + 0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF, /* 00000560 "C......." */ + 0x05,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44, /* 00000568 "....LNKD" */ + 0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x05, /* 00000570 "........" */ + 0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00, /* 00000578 "...LNKA." */ + 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x06,0x00, /* 00000580 "........" */ + 0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D, /* 00000588 ".LNKC..." */ + 0x04,0x0C,0xFF,0xFF,0x06,0x00,0x01,0x4C, /* 00000590 ".......L" */ + 0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C, /* 00000598 "NKD....." */ + 0xFF,0xFF,0x06,0x00,0x0A,0x02,0x4C,0x4E, /* 000005A0 "......LN" */ + 0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF, /* 000005A8 "KA......" */ + 0xFF,0x06,0x00,0x0A,0x03,0x4C,0x4E,0x4B, /* 000005B0 ".....LNK" */ + 0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 000005B8 "B......." */ + 0x07,0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00, /* 000005C0 "...LNKD." */ + 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x07,0x00, /* 000005C8 "........" */ + 0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E, /* 000005D0 ".LNKA..." */ + 0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x02, /* 000005D8 "........" */ + 0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04, /* 000005E0 "LNKB...." */ + 0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x03,0x4C, /* 000005E8 ".......L" */ + 0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C, /* 000005F0 "NKC....." */ + 0xFF,0xFF,0x08,0x00,0x00,0x4C,0x4E,0x4B, /* 000005F8 ".....LNK" */ + 0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 00000600 "A......." */ + 0x08,0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00, /* 00000608 "...LNKB." */ + 0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x08,0x00, /* 00000610 "........" */ + 0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12, /* 00000618 "..LNKC.." */ + 0x0E,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A, /* 00000620 "........" */ + 0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D, /* 00000628 ".LNKD..." */ + 0x04,0x0C,0xFF,0xFF,0x09,0x00,0x00,0x4C, /* 00000630 ".......L" */ + 0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C, /* 00000638 "NKB....." */ + 0xFF,0xFF,0x09,0x00,0x01,0x4C,0x4E,0x4B, /* 00000640 ".....LNK" */ + 0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF, /* 00000648 "C......." */ + 0x09,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44, /* 00000650 "....LNKD" */ + 0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x09, /* 00000658 "........" */ + 0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00, /* 00000660 "...LNKA." */ + 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0A,0x00, /* 00000668 "........" */ + 0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D, /* 00000670 ".LNKC..." */ + 0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x01,0x4C, /* 00000678 ".......L" */ + 0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C, /* 00000680 "NKD....." */ + 0xFF,0xFF,0x0A,0x00,0x0A,0x02,0x4C,0x4E, /* 00000688 "......LN" */ + 0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF, /* 00000690 "KA......" */ + 0xFF,0x0A,0x00,0x0A,0x03,0x4C,0x4E,0x4B, /* 00000698 ".....LNK" */ + 0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 000006A0 "B......." */ + 0x0B,0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00, /* 000006A8 "...LNKD." */ + 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0B,0x00, /* 000006B0 "........" */ + 0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E, /* 000006B8 ".LNKA..." */ + 0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x02, /* 000006C0 "........" */ + 0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04, /* 000006C8 "LNKB...." */ + 0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x03,0x4C, /* 000006D0 ".......L" */ + 0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C, /* 000006D8 "NKC....." */ + 0xFF,0xFF,0x0C,0x00,0x00,0x4C,0x4E,0x4B, /* 000006E0 ".....LNK" */ + 0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 000006E8 "A......." */ + 0x0C,0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00, /* 000006F0 "...LNKB." */ + 0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0C,0x00, /* 000006F8 "........" */ + 0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12, /* 00000700 "..LNKC.." */ + 0x0E,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A, /* 00000708 "........" */ + 0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D, /* 00000710 ".LNKD..." */ + 0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x00,0x4C, /* 00000718 ".......L" */ + 0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C, /* 00000720 "NKB....." */ + 0xFF,0xFF,0x0D,0x00,0x01,0x4C,0x4E,0x4B, /* 00000728 ".....LNK" */ + 0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF, /* 00000730 "C......." */ + 0x0D,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44, /* 00000738 "....LNKD" */ + 0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0D, /* 00000740 "........" */ + 0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00, /* 00000748 "...LNKA." */ + 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0E,0x00, /* 00000750 "........" */ + 0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D, /* 00000758 ".LNKC..." */ + 0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x01,0x4C, /* 00000760 ".......L" */ + 0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C, /* 00000768 "NKD....." */ + 0xFF,0xFF,0x0E,0x00,0x0A,0x02,0x4C,0x4E, /* 00000770 "......LN" */ + 0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF, /* 00000778 "KA......" */ + 0xFF,0x0E,0x00,0x0A,0x03,0x4C,0x4E,0x4B, /* 00000780 ".....LNK" */ + 0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF, /* 00000788 "B......." */ + 0x0F,0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00, /* 00000790 "...LNKD." */ + 0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0F,0x00, /* 00000798 "........" */ + 0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E, /* 000007A0 ".LNKA..." */ + 0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x02, /* 000007A8 "........" */ + 0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04, /* 000007B0 "LNKB...." */ + 0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x03,0x4C, /* 000007B8 ".......L" */ + 0x4E,0x4B,0x43,0x00,0x08,0x50,0x52,0x54, /* 000007C0 "NKC..PRT" */ + 0x41,0x12,0x41,0x2F,0x3C,0x12,0x0B,0x04, /* 000007C8 "A.A/<..." */ + 0x0C,0xFF,0xFF,0x01,0x00,0x00,0x00,0x0A, /* 000007D0 "........" */ + 0x14,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x01, /* 000007D8 "........" */ + 0x00,0x01,0x00,0x0A,0x15,0x12,0x0C,0x04, /* 000007E0 "........" */ + 0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x02,0x00, /* 000007E8 "........" */ + 0x0A,0x16,0x12,0x0C,0x04,0x0C,0xFF,0xFF, /* 000007F0 "........" */ + 0x01,0x00,0x0A,0x03,0x00,0x0A,0x17,0x12, /* 000007F8 "........" */ + 0x0B,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x00, /* 00000800 "........" */ + 0x00,0x0A,0x18,0x12,0x0B,0x04,0x0C,0xFF, /* 00000808 "........" */ + 0xFF,0x02,0x00,0x01,0x00,0x0A,0x19,0x12, /* 00000810 "........" */ + 0x0C,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A, /* 00000818 "........" */ + 0x02,0x00,0x0A,0x1A,0x12,0x0C,0x04,0x0C, /* 00000820 "........" */ + 0xFF,0xFF,0x02,0x00,0x0A,0x03,0x00,0x0A, /* 00000828 "........" */ + 0x1B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x03, /* 00000830 "........" */ + 0x00,0x00,0x00,0x0A,0x1C,0x12,0x0B,0x04, /* 00000838 "........" */ + 0x0C,0xFF,0xFF,0x03,0x00,0x01,0x00,0x0A, /* 00000840 "........" */ + 0x1D,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x03, /* 00000848 "........" */ + 0x00,0x0A,0x02,0x00,0x0A,0x1E,0x12,0x0C, /* 00000850 "........" */ + 0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x03, /* 00000858 "........" */ + 0x00,0x0A,0x1F,0x12,0x0B,0x04,0x0C,0xFF, /* 00000860 "........" */ + 0xFF,0x04,0x00,0x00,0x00,0x0A,0x20,0x12, /* 00000868 "...... ." */ + 0x0B,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x01, /* 00000870 "........" */ + 0x00,0x0A,0x21,0x12,0x0C,0x04,0x0C,0xFF, /* 00000878 "..!....." */ + 0xFF,0x04,0x00,0x0A,0x02,0x00,0x0A,0x22, /* 00000880 "......."" */ + 0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x04,0x00, /* 00000888 "........" */ + 0x0A,0x03,0x00,0x0A,0x23,0x12,0x0B,0x04, /* 00000890 "....#..." */ + 0x0C,0xFF,0xFF,0x05,0x00,0x00,0x00,0x0A, /* 00000898 "........" */ + 0x24,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x05, /* 000008A0 "$......." */ + 0x00,0x01,0x00,0x0A,0x25,0x12,0x0C,0x04, /* 000008A8 "....%..." */ + 0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x02,0x00, /* 000008B0 "........" */ + 0x0A,0x26,0x12,0x0C,0x04,0x0C,0xFF,0xFF, /* 000008B8 ".&......" */ + 0x05,0x00,0x0A,0x03,0x00,0x0A,0x27,0x12, /* 000008C0 "......'." */ + 0x0B,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x00, /* 000008C8 "........" */ + 0x00,0x0A,0x28,0x12,0x0B,0x04,0x0C,0xFF, /* 000008D0 "..(....." */ + 0xFF,0x06,0x00,0x01,0x00,0x0A,0x29,0x12, /* 000008D8 "......)." */ + 0x0C,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A, /* 000008E0 "........" */ + 0x02,0x00,0x0A,0x2A,0x12,0x0C,0x04,0x0C, /* 000008E8 "...*...." */ + 0xFF,0xFF,0x06,0x00,0x0A,0x03,0x00,0x0A, /* 000008F0 "........" */ + 0x2B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x07, /* 000008F8 "+......." */ + 0x00,0x00,0x00,0x0A,0x2C,0x12,0x0B,0x04, /* 00000900 "....,..." */ + 0x0C,0xFF,0xFF,0x07,0x00,0x01,0x00,0x0A, /* 00000908 "........" */ + 0x2D,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x07, /* 00000910 "-......." */ + 0x00,0x0A,0x02,0x00,0x0A,0x2E,0x12,0x0C, /* 00000918 "........" */ + 0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x03, /* 00000920 "........" */ + 0x00,0x0A,0x2F,0x12,0x0B,0x04,0x0C,0xFF, /* 00000928 "../....." */ + 0xFF,0x08,0x00,0x00,0x00,0x0A,0x11,0x12, /* 00000930 "........" */ + 0x0B,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x01, /* 00000938 "........" */ + 0x00,0x0A,0x12,0x12,0x0C,0x04,0x0C,0xFF, /* 00000940 "........" */ + 0xFF,0x08,0x00,0x0A,0x02,0x00,0x0A,0x13, /* 00000948 "........" */ + 0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x08,0x00, /* 00000950 "........" */ + 0x0A,0x03,0x00,0x0A,0x14,0x12,0x0B,0x04, /* 00000958 "........" */ + 0x0C,0xFF,0xFF,0x09,0x00,0x00,0x00,0x0A, /* 00000960 "........" */ + 0x15,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x09, /* 00000968 "........" */ + 0x00,0x01,0x00,0x0A,0x16,0x12,0x0C,0x04, /* 00000970 "........" */ + 0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x02,0x00, /* 00000978 "........" */ + 0x0A,0x17,0x12,0x0C,0x04,0x0C,0xFF,0xFF, /* 00000980 "........" */ + 0x09,0x00,0x0A,0x03,0x00,0x0A,0x18,0x12, /* 00000988 "........" */ + 0x0B,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x00, /* 00000990 "........" */ + 0x00,0x0A,0x19,0x12,0x0B,0x04,0x0C,0xFF, /* 00000998 "........" */ + 0xFF,0x0A,0x00,0x01,0x00,0x0A,0x1A,0x12, /* 000009A0 "........" */ + 0x0C,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A, /* 000009A8 "........" */ + 0x02,0x00,0x0A,0x1B,0x12,0x0C,0x04,0x0C, /* 000009B0 "........" */ + 0xFF,0xFF,0x0A,0x00,0x0A,0x03,0x00,0x0A, /* 000009B8 "........" */ + 0x1C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0B, /* 000009C0 "........" */ + 0x00,0x00,0x00,0x0A,0x1D,0x12,0x0B,0x04, /* 000009C8 "........" */ + 0x0C,0xFF,0xFF,0x0B,0x00,0x01,0x00,0x0A, /* 000009D0 "........" */ + 0x1E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0B, /* 000009D8 "........" */ + 0x00,0x0A,0x02,0x00,0x0A,0x1F,0x12,0x0C, /* 000009E0 "........" */ + 0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x03, /* 000009E8 "........" */ + 0x00,0x0A,0x20,0x12,0x0B,0x04,0x0C,0xFF, /* 000009F0 ".. ....." */ + 0xFF,0x0C,0x00,0x00,0x00,0x0A,0x21,0x12, /* 000009F8 "......!." */ + 0x0B,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x01, /* 00000A00 "........" */ + 0x00,0x0A,0x22,0x12,0x0C,0x04,0x0C,0xFF, /* 00000A08 ".."....." */ + 0xFF,0x0C,0x00,0x0A,0x02,0x00,0x0A,0x23, /* 00000A10 ".......#" */ + 0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0C,0x00, /* 00000A18 "........" */ + 0x0A,0x03,0x00,0x0A,0x24,0x12,0x0B,0x04, /* 00000A20 "....$..." */ + 0x0C,0xFF,0xFF,0x0D,0x00,0x00,0x00,0x0A, /* 00000A28 "........" */ + 0x25,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0D, /* 00000A30 "%......." */ + 0x00,0x01,0x00,0x0A,0x26,0x12,0x0C,0x04, /* 00000A38 "....&..." */ + 0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x02,0x00, /* 00000A40 "........" */ + 0x0A,0x27,0x12,0x0C,0x04,0x0C,0xFF,0xFF, /* 00000A48 ".'......" */ + 0x0D,0x00,0x0A,0x03,0x00,0x0A,0x28,0x12, /* 00000A50 "......(." */ + 0x0B,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x00, /* 00000A58 "........" */ + 0x00,0x0A,0x29,0x12,0x0B,0x04,0x0C,0xFF, /* 00000A60 "..)....." */ + 0xFF,0x0E,0x00,0x01,0x00,0x0A,0x2A,0x12, /* 00000A68 "......*." */ + 0x0C,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A, /* 00000A70 "........" */ + 0x02,0x00,0x0A,0x2B,0x12,0x0C,0x04,0x0C, /* 00000A78 "...+...." */ + 0xFF,0xFF,0x0E,0x00,0x0A,0x03,0x00,0x0A, /* 00000A80 "........" */ + 0x2C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0F, /* 00000A88 ",......." */ + 0x00,0x00,0x00,0x0A,0x2D,0x12,0x0B,0x04, /* 00000A90 "....-..." */ + 0x0C,0xFF,0xFF,0x0F,0x00,0x01,0x00,0x0A, /* 00000A98 "........" */ + 0x2E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0F, /* 00000AA0 "........" */ + 0x00,0x0A,0x02,0x00,0x0A,0x2F,0x12,0x0C, /* 00000AA8 "...../.." */ + 0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x03, /* 00000AB0 "........" */ + 0x00,0x0A,0x10,0x5B,0x82,0x4C,0x31,0x49, /* 00000AB8 "...[.L1I" */ + 0x53,0x41,0x5F,0x08,0x5F,0x41,0x44,0x52, /* 00000AC0 "SA_._ADR" */ + 0x0C,0x00,0x00,0x01,0x00,0x5B,0x80,0x50, /* 00000AC8 ".....[.P" */ + 0x49,0x52,0x51,0x02,0x0A,0x60,0x0A,0x04, /* 00000AD0 "IRQ..`.." */ + 0x10,0x2E,0x5C,0x00,0x5B,0x81,0x29,0x5C, /* 00000AD8 "..\.[.)\" */ + 0x2F,0x04,0x5F,0x53,0x42,0x5F,0x50,0x43, /* 00000AE0 "/._SB_PC" */ + 0x49,0x30,0x49,0x53,0x41,0x5F,0x50,0x49, /* 00000AE8 "I0ISA_PI" */ + 0x52,0x51,0x01,0x50,0x49,0x52,0x41,0x08, /* 00000AF0 "RQ.PIRA." */ + 0x50,0x49,0x52,0x42,0x08,0x50,0x49,0x52, /* 00000AF8 "PIRB.PIR" */ + 0x43,0x08,0x50,0x49,0x52,0x44,0x08,0x5B, /* 00000B00 "C.PIRD.[" */ + 0x82,0x46,0x0B,0x53,0x59,0x53,0x52,0x08, /* 00000B08 ".F.SYSR." */ + 0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C, /* 00000B10 "_HID.A.." */ + 0x02,0x08,0x5F,0x55,0x49,0x44,0x01,0x08, /* 00000B18 ".._UID.." */ + 0x43,0x52,0x53,0x5F,0x11,0x4E,0x08,0x0A, /* 00000B20 "CRS_.N.." */ + 0x8A,0x47,0x01,0x10,0x00,0x10,0x00,0x00, /* 00000B28 ".G......" */ + 0x10,0x47,0x01,0x22,0x00,0x22,0x00,0x00, /* 00000B30 ".G.".".." */ + 0x0C,0x47,0x01,0x30,0x00,0x30,0x00,0x00, /* 00000B38 ".G.0.0.." */ + 0x10,0x47,0x01,0x44,0x00,0x44,0x00,0x00, /* 00000B40 ".G.D.D.." */ + 0x1C,0x47,0x01,0x62,0x00,0x62,0x00,0x00, /* 00000B48 ".G.b.b.." */ + 0x02,0x47,0x01,0x65,0x00,0x65,0x00,0x00, /* 00000B50 ".G.e.e.." */ + 0x0B,0x47,0x01,0x72,0x00,0x72,0x00,0x00, /* 00000B58 ".G.r.r.." */ + 0x0E,0x47,0x01,0x80,0x00,0x80,0x00,0x00, /* 00000B60 ".G......" */ + 0x01,0x47,0x01,0x84,0x00,0x84,0x00,0x00, /* 00000B68 ".G......" */ + 0x03,0x47,0x01,0x88,0x00,0x88,0x00,0x00, /* 00000B70 ".G......" */ + 0x01,0x47,0x01,0x8C,0x00,0x8C,0x00,0x00, /* 00000B78 ".G......" */ + 0x03,0x47,0x01,0x90,0x00,0x90,0x00,0x00, /* 00000B80 ".G......" */ + 0x10,0x47,0x01,0xA2,0x00,0xA2,0x00,0x00, /* 00000B88 ".G......" */ + 0x1C,0x47,0x01,0xE0,0x00,0xE0,0x00,0x00, /* 00000B90 ".G......" */ + 0x10,0x47,0x01,0xA0,0x08,0xA0,0x08,0x00, /* 00000B98 ".G......" */ + 0x04,0x47,0x01,0xC0,0x0C,0xC0,0x0C,0x00, /* 00000BA0 ".G......" */ + 0x10,0x47,0x01,0xD0,0x04,0xD0,0x04,0x00, /* 00000BA8 ".G......" */ + 0x02,0x79,0x00,0x14,0x0B,0x5F,0x43,0x52, /* 00000BB0 ".y..._CR" */ + 0x53,0x00,0xA4,0x43,0x52,0x53,0x5F,0x5B, /* 00000BB8 "S..CRS_[" */ + 0x82,0x2B,0x50,0x49,0x43,0x5F,0x08,0x5F, /* 00000BC0 ".+PIC_._" */ + 0x48,0x49,0x44,0x0B,0x41,0xD0,0x08,0x5F, /* 00000BC8 "HID.A.._" */ + 0x43,0x52,0x53,0x11,0x18,0x0A,0x15,0x47, /* 00000BD0 "CRS....G" */ + 0x01,0x20,0x00,0x20,0x00,0x01,0x02,0x47, /* 00000BD8 ". . ...G" */ + 0x01,0xA0,0x00,0xA0,0x00,0x01,0x02,0x22, /* 00000BE0 "......."" */ + 0x04,0x00,0x79,0x00,0x5B,0x82,0x47,0x05, /* 00000BE8 "..y.[.G." */ + 0x44,0x4D,0x41,0x30,0x08,0x5F,0x48,0x49, /* 00000BF0 "DMA0._HI" */ + 0x44,0x0C,0x41,0xD0,0x02,0x00,0x08,0x5F, /* 00000BF8 "D.A...._" */ + 0x43,0x52,0x53,0x11,0x41,0x04,0x0A,0x3D, /* 00000C00 "CRS.A..=" */ + 0x2A,0x10,0x04,0x47,0x01,0x00,0x00,0x00, /* 00000C08 "*..G...." */ + 0x00,0x00,0x10,0x47,0x01,0x81,0x00,0x81, /* 00000C10 "...G...." */ + 0x00,0x00,0x03,0x47,0x01,0x87,0x00,0x87, /* 00000C18 "...G...." */ + 0x00,0x00,0x01,0x47,0x01,0x89,0x00,0x89, /* 00000C20 "...G...." */ + 0x00,0x00,0x03,0x47,0x01,0x8F,0x00,0x8F, /* 00000C28 "...G...." */ + 0x00,0x00,0x01,0x47,0x01,0xC0,0x00,0xC0, /* 00000C30 "...G...." */ + 0x00,0x00,0x20,0x47,0x01,0x80,0x04,0x80, /* 00000C38 ".. G...." */ + 0x04,0x00,0x10,0x79,0x00,0x5B,0x82,0x25, /* 00000C40 "...y.[.%" */ + 0x54,0x4D,0x52,0x5F,0x08,0x5F,0x48,0x49, /* 00000C48 "TMR_._HI" */ + 0x44,0x0C,0x41,0xD0,0x01,0x00,0x08,0x5F, /* 00000C50 "D.A...._" */ + 0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,0x47, /* 00000C58 "CRS....G" */ + 0x01,0x40,0x00,0x40,0x00,0x00,0x04,0x22, /* 00000C60 ".@.@..."" */ + 0x01,0x00,0x79,0x00,0x5B,0x82,0x25,0x52, /* 00000C68 "..y.[.%R" */ + 0x54,0x43,0x5F,0x08,0x5F,0x48,0x49,0x44, /* 00000C70 "TC_._HID" */ + 0x0C,0x41,0xD0,0x0B,0x00,0x08,0x5F,0x43, /* 00000C78 ".A...._C" */ + 0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,0x01, /* 00000C80 "RS....G." */ + 0x70,0x00,0x70,0x00,0x00,0x02,0x22,0x00, /* 00000C88 "p.p..."." */ + 0x01,0x79,0x00,0x5B,0x82,0x22,0x53,0x50, /* 00000C90 ".y.[."SP" */ + 0x4B,0x52,0x08,0x5F,0x48,0x49,0x44,0x0C, /* 00000C98 "KR._HID." */ + 0x41,0xD0,0x08,0x00,0x08,0x5F,0x43,0x52, /* 00000CA0 "A...._CR" */ + 0x53,0x11,0x0D,0x0A,0x0A,0x47,0x01,0x61, /* 00000CA8 "S....G.a" */ + 0x00,0x61,0x00,0x00,0x01,0x79,0x00,0x5B, /* 00000CB0 ".a...y.[" */ + 0x82,0x31,0x50,0x53,0x32,0x4D,0x08,0x5F, /* 00000CB8 ".1PS2M._" */ + 0x48,0x49,0x44,0x0C,0x41,0xD0,0x0F,0x13, /* 00000CC0 "HID.A..." */ + 0x08,0x5F,0x43,0x49,0x44,0x0C,0x41,0xD0, /* 00000CC8 "._CID.A." */ + 0x0F,0x13,0x14,0x09,0x5F,0x53,0x54,0x41, /* 00000CD0 "...._STA" */ + 0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52, /* 00000CD8 "....._CR" */ + 0x53,0x11,0x08,0x0A,0x05,0x22,0x00,0x10, /* 00000CE0 "S....".." */ + 0x79,0x00,0x5B,0x82,0x42,0x04,0x50,0x53, /* 00000CE8 "y.[.B.PS" */ + 0x32,0x4B,0x08,0x5F,0x48,0x49,0x44,0x0C, /* 00000CF0 "2K._HID." */ + 0x41,0xD0,0x03,0x03,0x08,0x5F,0x43,0x49, /* 00000CF8 "A...._CI" */ + 0x44,0x0C,0x41,0xD0,0x03,0x0B,0x14,0x09, /* 00000D00 "D.A....." */ + 0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F, /* 00000D08 "_STA...." */ + 0x08,0x5F,0x43,0x52,0x53,0x11,0x18,0x0A, /* 00000D10 "._CRS..." */ + 0x15,0x47,0x01,0x60,0x00,0x60,0x00,0x00, /* 00000D18 ".G.`.`.." */ + 0x01,0x47,0x01,0x64,0x00,0x64,0x00,0x00, /* 00000D20 ".G.d.d.." */ + 0x01,0x22,0x02,0x00,0x79,0x00,0x5B,0x82, /* 00000D28 "."..y.[." */ + 0x3A,0x46,0x44,0x43,0x30,0x08,0x5F,0x48, /* 00000D30 ":FDC0._H" */ + 0x49,0x44,0x0C,0x41,0xD0,0x07,0x00,0x14, /* 00000D38 "ID.A...." */ + 0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A, /* 00000D40 "._STA..." */ + 0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,0x1B, /* 00000D48 ".._CRS.." */ + 0x0A,0x18,0x47,0x01,0xF0,0x03,0xF0,0x03, /* 00000D50 "..G....." */ + 0x01,0x06,0x47,0x01,0xF7,0x03,0xF7,0x03, /* 00000D58 "..G....." */ + 0x01,0x01,0x22,0x40,0x00,0x2A,0x04,0x00, /* 00000D60 ".."@.*.." */ + 0x79,0x00,0x5B,0x82,0x35,0x55,0x41,0x52, /* 00000D68 "y.[.5UAR" */ + 0x31,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41, /* 00000D70 "1._HID.A" */ + 0xD0,0x05,0x01,0x08,0x5F,0x55,0x49,0x44, /* 00000D78 "...._UID" */ + 0x01,0x14,0x09,0x5F,0x53,0x54,0x41,0x00, /* 00000D80 "..._STA." */ + 0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53, /* 00000D88 "...._CRS" */ + 0x11,0x10,0x0A,0x0D,0x47,0x01,0xF8,0x03, /* 00000D90 "....G..." */ + 0xF8,0x03,0x01,0x08,0x22,0x10,0x00,0x79, /* 00000D98 "...."..y" */ + 0x00,0x5B,0x82,0x36,0x4C,0x54,0x50,0x31, /* 00000DA0 ".[.6LTP1" */ + 0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0, /* 00000DA8 "._HID.A." */ + 0x04,0x00,0x08,0x5F,0x55,0x49,0x44,0x0A, /* 00000DB0 "..._UID." */ + 0x02,0x14,0x09,0x5F,0x53,0x54,0x41,0x00, /* 00000DB8 "..._STA." */ + 0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53, /* 00000DC0 "...._CRS" */ + 0x11,0x10,0x0A,0x0D,0x47,0x01,0x78,0x03, /* 00000DC8 "....G.x." */ + 0x78,0x03,0x08,0x08,0x22,0x80,0x00,0x79, /* 00000DD0 "x..."..y" */ + 0x00, }; int DsdtLen=sizeof(AmlCode); diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/acpi/ssdt_tpm.asl --- a/tools/firmware/hvmloader/acpi/ssdt_tpm.asl Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/acpi/ssdt_tpm.asl Wed Jan 10 08:40:47 2007 -0700 @@ -17,7 +17,7 @@ //* SSDT for TPM TIS Interface for Xen with Qemu device model -DefinitionBlock ("SSDT_TPM.aml", "SSDT", 1, "IBM","xen", 2006) +DefinitionBlock ("SSDT_TPM.aml", "SSDT", 2, "Xen", "HVM", 0) { Device (TPM) { Name (_HID, EisaId ("PNP0C31")) @@ -26,4 +26,4 @@ DefinitionBlock ("SSDT_TPM.aml", "SSDT", Memory32Fixed (ReadWrite, 0xFED40000, 0x5000,) }) } -} \ No newline at end of file +} diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/acpi/ssdt_tpm.h --- a/tools/firmware/hvmloader/acpi/ssdt_tpm.h Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/acpi/ssdt_tpm.h Wed Jan 10 08:40:47 2007 -0700 @@ -1,11 +1,11 @@ /* * * Intel ACPI Component Architecture - * ASL Optimizing Compiler version 20060707 [Sep 11 2006] + * ASL Optimizing Compiler version 20060707 [Dec 30 2006] * Copyright (C) 2000 - 2006 Intel Corporation * Supports ACPI Specification Revision 3.0a * - * Compilation of "acpi_ssdt_tpm.asl" - Mon Oct 30 11:28:27 2006 + * Compilation of "ssdt_tpm.asl" - Sat Dec 30 15:31:27 2006 * * C source code output * @@ -13,9 +13,9 @@ unsigned char AmlCode_TPM[] = unsigned char AmlCode_TPM[] = { 0x53,0x53,0x44,0x54,0x4C,0x00,0x00,0x00, /* 00000000 "SSDTL..." */ - 0x01,0x6D,0x49,0x42,0x4D,0x00,0x00,0x00, /* 00000008 ".mIBM..." */ - 0x78,0x65,0x6E,0x00,0x00,0x00,0x00,0x00, /* 00000010 "xen....." */ - 0xD6,0x07,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ + 0x02,0x56,0x58,0x65,0x6E,0x00,0x00,0x00, /* 00000008 ".VXen..." */ + 0x48,0x56,0x4D,0x00,0x00,0x00,0x00,0x00, /* 00000010 "HVM....." */ + 0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ 0x07,0x07,0x06,0x20,0x5B,0x82,0x26,0x54, /* 00000020 "... [.&T" */ 0x50,0x4D,0x5F,0x08,0x5F,0x48,0x49,0x44, /* 00000028 "PM_._HID" */ 0x0C,0x41,0xD0,0x0C,0x31,0x08,0x5F,0x43, /* 00000030 ".A..1._C" */ diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/acpi/static_tables.c --- a/tools/firmware/hvmloader/acpi/static_tables.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/acpi/static_tables.c Wed Jan 10 08:40:47 2007 -0700 @@ -118,7 +118,7 @@ struct acpi_20_xsdt Xsdt = { .signature = ACPI_2_0_XSDT_SIGNATURE, .length = sizeof(struct acpi_header), .revision = ACPI_2_0_XSDT_REVISION, - .oem_id = ACPI_OEM_ID, + .oem_id = ACPI_OEM_ID, .oem_table_id = ACPI_OEM_TABLE_ID, .oem_revision = ACPI_OEM_REVISION, .creator_id = ACPI_CREATOR_ID, @@ -130,7 +130,7 @@ struct acpi_20_rsdp Rsdp = { struct acpi_20_rsdp Rsdp = { .signature = ACPI_2_0_RSDP_SIGNATURE, .oem_id = ACPI_OEM_ID, - .revision = ACPI_OEM_REVISION, + .revision = ACPI_2_0_RSDP_REVISION, .length = sizeof(struct acpi_20_rsdp) }; diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/config.h --- a/tools/firmware/hvmloader/config.h Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/config.h Wed Jan 10 08:40:47 2007 -0700 @@ -2,10 +2,11 @@ #define __HVMLOADER_CONFIG_H__ #define IOAPIC_BASE_ADDRESS 0xfec00000 -#define IOAPIC_ID 0x00 +#define IOAPIC_ID 0x01 #define IOAPIC_VERSION 0x11 #define LAPIC_BASE_ADDRESS 0xfee00000 +#define LAPIC_ID(vcpu_id) ((vcpu_id) * 2) #define PCI_ISA_DEVFN 0x08 /* dev 1, fn 0 */ #define PCI_ISA_IRQ_MASK 0x0c60U /* ISA IRQs 5,6,10,11 are PCI connected */ diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/hvmloader.c --- a/tools/firmware/hvmloader/hvmloader.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/hvmloader.c Wed Jan 10 08:40:47 2007 -0700 @@ -34,6 +34,7 @@ /* memory map */ #define HYPERCALL_PHYSICAL_ADDRESS 0x00080000 #define VGABIOS_PHYSICAL_ADDRESS 0x000C0000 +#define ETHERBOOT_PHYSICAL_ADDRESS 0x000C8000 #define VMXASSIST_PHYSICAL_ADDRESS 0x000D0000 #define ROMBIOS_PHYSICAL_ADDRESS 0x000F0000 @@ -279,6 +280,27 @@ static void pci_setup(void) } } +static +int must_load_nic(void) +{ + /* If the network card is in the boot order, load the Etherboot + * option ROM. Read the boot order bytes from CMOS and check + * if any of them are 0x4. */ + uint8_t boot_order; + + /* Read CMOS register 0x3d (boot choices 0 and 1) */ + outb(0x70, 0x3d); + boot_order = inb(0x71); + if ( (boot_order & 0xf) == 0x4 || (boot_order & 0xf0) == 0x40 ) + return 1; + /* Read CMOS register 0x38 (boot choice 2 and FDD test flag) */ + outb(0x70, 0x38); + boot_order = inb(0x71); + if ( (boot_order & 0xf0) == 0x40 ) + return 1; + return 0; +} + int main(void) { int acpi_sz; @@ -310,6 +332,13 @@ int main(void) printf("Loading Standard VGABIOS ...\n"); memcpy((void *)VGABIOS_PHYSICAL_ADDRESS, vgabios_stdvga, sizeof(vgabios_stdvga)); + } + + if ( must_load_nic() ) + { + printf("Loading ETHERBOOT ...\n"); + memcpy((void *)ETHERBOOT_PHYSICAL_ADDRESS, + etherboot, sizeof(etherboot)); } if ( get_acpi_enabled() != 0 ) diff -r 42babffffba5 -r 58633caeece9 tools/firmware/hvmloader/mp_tables.c --- a/tools/firmware/hvmloader/mp_tables.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/hvmloader/mp_tables.c Wed Jan 10 08:40:47 2007 -0700 @@ -222,7 +222,7 @@ void fill_mp_proc_entry(struct mp_proc_e void fill_mp_proc_entry(struct mp_proc_entry *mppe, int vcpu_id) { mppe->type = ENTRY_TYPE_PROCESSOR; - mppe->lapic_id = vcpu_id + 1; + mppe->lapic_id = LAPIC_ID(vcpu_id); mppe->lapic_version = 0x11; mppe->cpu_flags = CPU_FLAG_ENABLED; if ( vcpu_id == 0 ) @@ -373,7 +373,7 @@ void create_mp_tables(void) { if ( i == 2 ) continue; /* skip the slave PIC connection */ fill_mp_io_intr_entry((struct mp_io_intr_entry *)p, - BUS_ID_ISA, i, IOAPIC_ID, i); + BUS_ID_ISA, i, IOAPIC_ID, (i == 0) ? 2 : i); p += sizeof(struct mp_io_intr_entry); } diff -r 42babffffba5 -r 58633caeece9 tools/firmware/rombios/rombios.c --- a/tools/firmware/rombios/rombios.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/rombios/rombios.c Wed Jan 10 08:40:47 2007 -0700 @@ -278,7 +278,6 @@ typedef unsigned short bx_bool; typedef unsigned short bx_bool; typedef unsigned long Bit32u; -#if BX_USE_ATADRV void memsetb(seg,offset,value,count); void memcpyb(dseg,doffset,sseg,soffset,count); @@ -418,7 +417,6 @@ typedef unsigned long Bit32u; ASM_END } #endif -#endif //BX_USE_ATADRV // read_dword and write_dword functions static Bit32u read_dword(); @@ -728,6 +726,8 @@ typedef struct { // The EBDA structure should conform to // http://www.cybertrails.com/~fys/rombios.htm document // I made the ata and cdemu structs begin at 0x121 in the EBDA seg + // EBDA must be at most 768 bytes; it lives at 0x9fc00, and the boot + // device tables are at 0x9ff00 -- 0x9ffff typedef struct { unsigned char filler1[0x3D]; @@ -885,7 +885,7 @@ static void int15_function(); static void int15_function(); static void int16_function(); static void int17_function(); -static Bit32u int19_function(); +static void int19_function(); static void int1a_function(); static void int70_function(); static void int74_function(); @@ -1435,10 +1435,17 @@ copy_e820_table() copy_e820_table() { Bit8u nr_entries = read_byte(0x9000, 0x1e8); + Bit32u base_mem; if (nr_entries > 32) nr_entries = 32; write_word(0xe000, 0x8, nr_entries); memcpyb(0xe000, 0x10, 0x9000, 0x2d0, nr_entries * 0x14); + /* Report the proper base memory size at address 0x0413: otherwise + * non-e820 code will clobber things if BASE_MEM_IN_K is bigger than + * the first e820 entry. Get the size by reading the second 64bit + * field of the first e820 slot. */ + base_mem = read_dword(0x9000, 0x2d0 + 8); + write_word(0x40, 0x13, base_mem >> 10); } #endif /* HVMASSIST */ @@ -1847,28 +1854,100 @@ print_bios_banner() printf("\n"); } + +//-------------------------------------------------------------------------- +// BIOS Boot Specification 1.0.1 compatibility +// +// Very basic support for the BIOS Boot Specification, which allows expansion +// ROMs to register themselves as boot devices, instead of just stealing the +// INT 19h boot vector. +// +// This is a hack: to do it properly requires a proper PnP BIOS and we aren't +// one; we just lie to the option ROMs to make them behave correctly. +// We also don't support letting option ROMs register as bootable disk +// drives (BCVs), only as bootable devices (BEVs). +// +// http://www.phoenix.com/en/Customer+Services/White+Papers-Specs/pc+industry+specifications.htm +//-------------------------------------------------------------------------- + +/* 256 bytes at 0x9ff00 -- 0x9ffff is used for the IPL boot table. */ +#define IPL_SEG 0x9ff0 +#define IPL_TABLE_OFFSET 0x0000 +#define IPL_TABLE_ENTRIES 8 +#define IPL_COUNT_OFFSET 0x0080 /* u16: number of valid table entries */ +#define IPL_SEQUENCE_OFFSET 0x0082 /* u16: next boot device */ + +struct ipl_entry { + Bit16u type; + Bit16u flags; + Bit32u vector; + Bit32u description; + Bit32u reserved; +}; + +static void +init_boot_vectors() +{ + struct ipl_entry e; + Bit16u count = 0; + Bit16u ss = get_SS(); + + /* Clear out the IPL table. */ + memsetb(IPL_SEG, IPL_TABLE_OFFSET, 0, 0xff); + + /* Floppy drive */ + e.type = 1; e.flags = 0; e.vector = 0; e.description = 0; e.reserved = 0; + memcpyb(IPL_SEG, IPL_TABLE_OFFSET + count * sizeof (e), ss, &e, sizeof (e)); + count++; + + /* First HDD */ + e.type = 2; e.flags = 0; e.vector = 0; e.description = 0; e.reserved = 0; + memcpyb(IPL_SEG, IPL_TABLE_OFFSET + count * sizeof (e), ss, &e, sizeof (e)); + count++; + +#if BX_ELTORITO_BOOT + /* CDROM */ + e.type = 3; e.flags = 0; e.vector = 0; e.description = 0; e.reserved = 0; + memcpyb(IPL_SEG, IPL_TABLE_OFFSET + count * sizeof (e), ss, &e, sizeof (e)); + count++; +#endif + + /* Remember how many devices we have */ + write_word(IPL_SEG, IPL_COUNT_OFFSET, count); + /* Not tried booting anything yet */ + write_word(IPL_SEG, IPL_SEQUENCE_OFFSET, 0xffff); +} + +static Bit8u +get_boot_vector(i, e) +Bit16u i; struct ipl_entry *e; +{ + Bit16u count; + Bit16u ss = get_SS(); + /* Get the count of boot devices, and refuse to overrun the array */ + count = read_word(IPL_SEG, IPL_COUNT_OFFSET); + if (i >= count) return 0; + /* OK to read this device */ + memcpyb(ss, e, IPL_SEG, IPL_TABLE_OFFSET + i * sizeof (*e), sizeof (*e)); + return 1; +} + + //-------------------------------------------------------------------------- // print_boot_device // displays the boot device //-------------------------------------------------------------------------- -static char drivetypes[][10]={"Floppy","Hard Disk","CD-Rom"}; +static char drivetypes[][10]={"", "Floppy","Hard Disk","CD-Rom", "Network"}; void -print_boot_device(cdboot, drive) - Bit8u cdboot; Bit16u drive; +print_boot_device(type) + Bit16u type; { - Bit8u i; - - // cdboot contains 0 if floppy/harddisk, 1 otherwise - // drive contains real/emulated boot drive - - if(cdboot)i=2; // CD-Rom - else if((drive&0x0080)==0x00)i=0; // Floppy - else if((drive&0x0080)==0x80)i=1; // Hard drive - else return; - - printf("Booting from %s...\n",drivetypes[i]); + /* NIC appears as type 0x80 */ + if (type == 0x80 ) type = 0x4; + if (type == 0 || type > 0x4) BX_PANIC("Bad drive type\n"); + printf("Booting from %s...\n", drivetypes[type]); } //-------------------------------------------------------------------------- @@ -1876,29 +1955,20 @@ print_boot_device(cdboot, drive) // displays the reason why boot failed //-------------------------------------------------------------------------- void -print_boot_failure(cdboot, drive, reason, lastdrive) - Bit8u cdboot; Bit8u drive; Bit8u lastdrive; +print_boot_failure(type, reason) + Bit16u type; Bit8u reason; { - Bit16u drivenum = drive&0x7f; - - // cdboot: 1 if boot from cd, 0 otherwise - // drive : drive number - // reason: 0 signature check failed, 1 read error - // lastdrive: 1 boot drive is the last one in boot sequence - - if (cdboot) - bios_printf(BIOS_PRINTF_INFO | BIOS_PRINTF_SCREEN, "Boot from %s failed\n",drivetypes[2]); - else if (drive & 0x80) - bios_printf(BIOS_PRINTF_INFO | BIOS_PRINTF_SCREEN, "Boot from %s %d failed\n", drivetypes[1],drivenum); + if (type == 0 || type > 0x3) BX_PANIC("Bad drive type\n"); + + printf("Boot from %s failed", drivetypes[type]); + if (type < 4) { + /* Report the reason too */ + if (reason==0) + printf(": not a bootable disk"); else - bios_printf(BIOS_PRINTF_INFO | BIOS_PRINTF_SCREEN, "Boot from %s %d failed\n", drivetypes[0],drivenum); - - if (lastdrive==1) { - if (reason==0) - BX_PANIC("Not a bootable disk\n"); - else - BX_PANIC("Could not read the boot disk\n"); + printf(": could not read the boot disk"); } + printf("\n"); } //-------------------------------------------------------------------------- @@ -7546,19 +7616,19 @@ int17_function(regs, ds, iret_addr) } } -// returns bootsegment in ax, drive in bl - Bit32u -int19_function(bseqnr) -Bit8u bseqnr; +void +int19_function(seq_nr) +Bit16u seq_nr; { Bit16u ebda_seg=read_word(0x0040,0x000E); - Bit16u bootseq; + Bit16u bootdev; Bit8u bootdrv; - Bit8u bootcd; Bit8u bootchk; Bit16u bootseg; + Bit16u bootip; Bit16u status; - Bit8u lastdrive=0; + + struct ipl_entry e; // if BX_ELTORITO_BOOT is not defined, old behavior // check bit 5 in CMOS reg 0x2d. load either 0x00 or 0x80 into DL @@ -7575,62 +7645,54 @@ Bit8u bseqnr; // 0x01 : first floppy // 0x02 : first harddrive // 0x03 : first cdrom + // 0x04 - 0x0f : PnP expansion ROMs (e.g. Etherboot) // else : boot failure // Get the boot sequence #if BX_ELTORITO_BOOT - bootseq=inb_cmos(0x3d); - bootseq|=((inb_cmos(0x38) & 0xf0) << 4); - - if (bseqnr==2) bootseq >>= 4; - if (bseqnr==3) bootseq >>= 8; - if (bootseq<0x10) lastdrive = 1; - bootdrv=0x00; bootcd=0; - switch(bootseq & 0x0f) { - case 0x01: bootdrv=0x00; bootcd=0; break; - case 0x02: bootdrv=0x80; bootcd=0; break; - case 0x03: bootdrv=0x00; bootcd=1; break; - default: return 0x00000000; - } -#else - bootseq=inb_cmos(0x2d); - - if (bseqnr==2) { - bootseq ^= 0x20; - lastdrive = 1; + bootdev = inb_cmos(0x3d); + bootdev |= ((inb_cmos(0x38) & 0xf0) << 4); + bootdev >>= 4 * seq_nr; + bootdev &= 0xf; + if (bootdev == 0) BX_PANIC("No bootable device.\n"); + + /* Translate from CMOS runes to an IPL table offset by subtracting 1 */ + bootdev -= 1; +#else + if (seq_nr ==2) BX_PANIC("No more boot devices."); + if (!!(inb_cmos(0x2d) & 0x20) ^ (seq_nr == 1)) + /* Boot from floppy if the bit is set or it's the second boot */ + bootdev = 0x00; + else + bootdev = 0x01; +#endif + + /* Read the boot device from the IPL table */ + if (get_boot_vector(bootdev, &e) == 0) { + BX_INFO("Invalid boot device (0x%x)\n", bootdev); + return; } - bootdrv=0x00; bootcd=0; - if((bootseq&0x20)==0) bootdrv=0x80; -#endif // BX_ELTORITO_BOOT - -#if BX_ELTORITO_BOOT - // We have to boot from cd - if (bootcd != 0) { - status = cdrom_boot(); - - // If failure - if ( (status & 0x00ff) !=0 ) { - print_cdromboot_failure(status); - print_boot_failure(bootcd, bootdrv, 1, lastdrive); - return 0x00000000; - } - - bootseg = read_word(ebda_seg,&EbdaData->cdemu.load_segment); - bootdrv = (Bit8u)(status>>8); - } - -#endif // BX_ELTORITO_BOOT - - // We have to boot from harddisk or floppy - if (bootcd == 0) { - bootseg=0x07c0; + + /* Do the loading, and set up vector as a far pointer to the boot + * address, and bootdrv as the boot drive */ + print_boot_device(e.type); + + switch(e.type) { + case 0x01: /* FDD */ + case 0x02: /* HDD */ + + bootdrv = (e.type == 0x02) ? 0x80 : 0x00; + bootseg = 0x07c0; + status = 0; ASM_START push bp mov bp, sp - - mov ax, #0x0000 - mov _int19_function.status + 2[bp], ax + push ax + push bx + push cx + push dx + mov dl, _int19_function.bootdrv + 2[bp] mov ax, _int19_function.bootseg + 2[bp] mov es, ax ;; segment @@ -7646,43 +7708,83 @@ ASM_START mov _int19_function.status + 2[bp], ax int19_load_done: + pop dx + pop cx + pop bx + pop ax pop bp ASM_END if (status != 0) { - print_boot_failure(bootcd, bootdrv, 1, lastdrive); - return 0x00000000; + print_boot_failure(e.type, 1); + return; + } + + /* Always check the signature on a HDD boot sector; on FDD, only do + * the check if the CMOS doesn't tell us to skip it */ + if (e.type != 0x00 || !((inb_cmos(0x38) & 0x01))) { + if (read_word(bootseg,0x1fe) != 0xaa55) { + print_boot_failure(e.type, 0); + return; } } - // check signature if instructed by cmos reg 0x38, only for floppy - // bootchk = 1 : signature check disabled - // bootchk = 0 : signature check enabled - if (bootdrv != 0) bootchk = 0; - else bootchk = inb_cmos(0x38) & 0x01; + /* Canonicalize bootseg:bootip */ + bootip = (bootseg & 0x0fff) << 4; + bootseg &= 0xf000; + break; #if BX_ELTORITO_BOOT - // if boot from cd, no signature check - if (bootcd != 0) - bootchk = 1; -#endif // BX_ELTORITO_BOOT - - if (bootchk == 0) { - if (read_word(bootseg,0x1fe) != 0xaa55) { - print_boot_failure(bootcd, bootdrv, 0, lastdrive); - return 0x00000000; - } + case 0x03: /* CD-ROM */ + status = cdrom_boot(); + + // If failure + if ( (status & 0x00ff) !=0 ) { + print_cdromboot_failure(status); + print_boot_failure(e.type, 1); + return; } + + bootdrv = (Bit8u)(status>>8); + bootseg = read_word(ebda_seg,&EbdaData->cdemu.load_segment); + /* Canonicalize bootseg:bootip */ + bootip = (bootseg & 0x0fff) << 4; + bootseg &= 0xf000; + break; +#endif + + case 0x80: /* Expansion ROM with a Bootstrap Entry Vector (a far pointer) */ + bootseg = e.vector >> 16; + bootip = e.vector & 0xffff; + break; + + default: return; + } + + /* Debugging info */ + printf("Booting from %x:%x\n", bootseg, bootip); -#if BX_ELTORITO_BOOT - // Print out the boot string - print_boot_device(bootcd, bootdrv); -#else // BX_ELTORITO_BOOT - print_boot_device(0, bootdrv); -#endif // BX_ELTORITO_BOOT - - // return the boot segment - return (((Bit32u)bootdrv) << 16) + bootseg; + /* Jump to the boot vector */ +ASM_START + mov bp, sp + ;; Build an iret stack frame that will take us to the boot vector. + ;; iret pops ip, then cs, then flags, so push them in the opposite order. + pushf + mov ax, _int19_function.bootseg + 0[bp] + push ax + mov ax, _int19_function.bootip + 0[bp] + push ax + ;; Set the magic number in ax and the boot drive in dl. + mov ax, #0xaa55 + mov dl, _int19_function.bootdrv + 0[bp] + ;; Zero some of the other registers. + xor bx, bx + mov ds, bx + mov es, bx + mov bp, bx + ;; Go! + iret +ASM_END } void @@ -8139,14 +8241,29 @@ int13_out: popa iret - ;---------- ;- INT18h - ;---------- -int18_handler: ;; Boot Failure routing - call _int18_panic_msg - hlt - iret +int18_handler: ;; Boot Failure recovery: try the next device. + + ;; Reset SP and SS + mov ax, #0xfffe + mov sp, ax + xor ax, ax + mov ss, ax + + ;; Get the boot sequence number out of the IPL memory + mov bx, #IPL_SEG + mov ds, bx ;; Set segment + mov bx, IPL_SEQUENCE_OFFSET ;; BX is now the sequence number + inc bx ;; ++ + mov IPL_SEQUENCE_OFFSET, bx ;; Write it back + mov ds, ax ;; and reset the segment to zero. + + ;; Carry on in the INT 19h handler, using the new sequence number + push bx + + jmp int19_next_boot ;---------- ;- INT19h - @@ -8154,62 +8271,32 @@ int19_relocated: ;; Boot function, reloc int19_relocated: ;; Boot function, relocated ;; int19 was beginning to be really complex, so now it - ;; just calls an C function, that does the work - ;; it returns in BL the boot drive, and in AX the boot segment - ;; the boot segment will be 0x0000 if something has failed + ;; just calls a C function that does the work push bp mov bp, sp - - ;; drop ds + + ;; Reset SS and SP + mov ax, #0xfffe + mov sp, ax xor ax, ax - mov ds, ax - - ;; 1st boot device - mov ax, #0x0001 + mov ss, ax + + ;; Start from the first boot device (0, in AX) + mov bx, #IPL_SEG + mov ds, bx ;; Set segment to write to the IPL memory + mov IPL_SEQUENCE_OFFSET, ax ;; Save the sequence number + mov ds, ax ;; and reset the segment. + push ax + +int19_next_boot: + + ;; Call the C code for the next boot device call _int19_function - inc sp - inc sp - ;; bl contains the boot drive - ;; ax contains the boot segment or 0 if failure - - test ax, ax ;; if ax is 0 try next boot device - jnz boot_setup - - ;; 2nd boot device - mov ax, #0x0002 - push ax - call _int19_function - inc sp - inc sp - test ax, ax ;; if ax is 0 try next boot device - jnz boot_setup - - ;; 3rd boot device - mov ax, #0x0003 - push ax - call _int19_function - inc sp - inc sp - test ax, ax ;; if ax is 0 call int18 - jz int18_handler - -boot_setup: - mov dl, bl ;; set drive so guest os find it - shl eax, #0x04 ;; convert seg to ip - mov 2[bp], ax ;; set ip - - shr eax, #0x04 ;; get cs back - and ax, #0xF000 ;; remove what went in ip - mov 4[bp], ax ;; set cs - xor ax, ax - mov es, ax ;; set es to zero fixes [ 549815 ] - mov [bp], ax ;; set bp to zero - mov ax, #0xaa55 ;; set ok flag - - pop bp - iret ;; Beam me up Scotty + + ;; Boot failed: invoke the boot recovery function + int #0x18 ;---------- ;- INT1Ch - @@ -9387,6 +9474,15 @@ checksum_loop: pop ax ret + +;; We need a copy of this string, but we are not actually a PnP BIOS, +;; so make sure it is *not* aligned, so OSes will not see it if they scan. +.align 16 + db 0 +pnp_string: + .ascii "$PnP" + + rom_scan: ;; Scan for existence of valid expansion ROMS. ;; Video ROM: from 0xC0000..0xC7FFF in 2k increments @@ -9421,9 +9517,17 @@ block_count_rounded: xor bx, bx ;; Restore DS back to 0000: mov ds, bx push ax ;; Save AX + push di ;; Save DI ;; Push addr of ROM entry point push cx ;; Push seg push #0x0003 ;; Push offset + + ;; Point ES:DI at "$PnP", which tells the ROM that we are a PnP BIOS. + ;; That should stop it grabbing INT 19h; we will use its BEV instead. + mov ax, #0xf000 + mov es, ax + lea di, pnp_string + mov bp, sp ;; Call ROM init routine using seg:off on stack db 0xff ;; call_far ss:[bp+0] db 0x5e @@ -9431,6 +9535,38 @@ block_count_rounded: cli ;; In case expansion ROM BIOS turns IF on add sp, #2 ;; Pop offset value pop cx ;; Pop seg value (restore CX) + + ;; Look at the ROM's PnP Expansion header. Properly, we're supposed + ;; to init all the ROMs and then go back and build an IPL table of + ;; all the bootable devices, but we can get away with one pass. + mov ds, cx ;; ROM base + mov bx, 0x001a ;; 0x1A is the offset into ROM header that contains... + mov ax, [bx] ;; the offset of PnP expansion header, where... + cmp ax, #0x5024 ;; we look for signature "$PnP" + jne no_bev + mov ax, 2[bx] + cmp ax, #0x506e + jne no_bev + mov ax, 0x1a[bx] ;; 0x1A is also the offset into the expansion header of... + cmp ax, #0x0000 ;; the Bootstrap Entry Vector, or zero if there is none. + je no_bev + + ;; Found a device that thinks it can boot the system. Record its BEV. + mov bx, #IPL_SEG ;; Go to the segment where the IPL table lives + mov ds, bx + mov bx, IPL_COUNT_OFFSET ;; Read the number of entries so far + cmp bx, #IPL_TABLE_ENTRIES + je no_bev ;; Get out if the table is full + shl bx, #0x4 ;; Turn count into offset (entries are 16 bytes) + mov 0[bx], #0x80 ;; This entry is a BEV device + mov 6[bx], cx ;; Build a far pointer from the segment... + mov 4[bx], ax ;; and the offset + shr bx, #0x4 ;; Turn the offset back into a count + inc bx ;; We have one more entry now + mov IPL_COUNT_OFFSET, bx ;; Remember that. + +no_bev: + pop di ;; Restore DI pop ax ;; Restore AX rom_scan_increment: shl ax, #5 ;; convert 512-bytes blocks to 16-byte increments @@ -9763,6 +9899,8 @@ post_default_ints: call _copy_e820_table call smbios_init #endif + + call _init_boot_vectors call rom_scan diff -r 42babffffba5 -r 58633caeece9 tools/firmware/vmxassist/vm86.c --- a/tools/firmware/vmxassist/vm86.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/firmware/vmxassist/vm86.c Wed Jan 10 08:40:47 2007 -0700 @@ -297,7 +297,7 @@ getreg32(struct regs *regs, int r) case 1: return regs->ecx; case 2: return regs->edx; case 3: return regs->ebx; - case 4: return regs->esp; + case 4: return regs->uesp; case 5: return regs->ebp; case 6: return regs->esi; case 7: return regs->edi; @@ -319,10 +319,10 @@ getreg8(struct regs *regs, int r) case 1: return regs->ecx & 0xFF; /* cl */ case 2: return regs->edx & 0xFF; /* dl */ case 3: return regs->ebx & 0xFF; /* bl */ - case 4: return (regs->esp >> 8) & 0xFF; /* ah */ - case 5: return (regs->ebp >> 8) & 0xFF; /* ch */ - case 6: return (regs->esi >> 8) & 0xFF; /* dh */ - case 7: return (regs->edi >> 8) & 0xFF; /* bh */ + case 4: return (regs->eax >> 8) & 0xFF; /* ah */ + case 5: return (regs->ecx >> 8) & 0xFF; /* ch */ + case 6: return (regs->edx >> 8) & 0xFF; /* dh */ + case 7: return (regs->ebx >> 8) & 0xFF; /* bh */ } return ~0; } @@ -335,7 +335,7 @@ setreg32(struct regs *regs, int r, unsig case 1: regs->ecx = v; break; case 2: regs->edx = v; break; case 3: regs->ebx = v; break; - case 4: regs->esp = v; break; + case 4: regs->uesp = v; break; case 5: regs->ebp = v; break; case 6: regs->esi = v; break; case 7: regs->edi = v; break; @@ -357,10 +357,10 @@ setreg8(struct regs *regs, int r, unsign case 1: regs->ecx = (regs->ecx & ~0xFF) | v; break; case 2: regs->edx = (regs->edx & ~0xFF) | v; break; case 3: regs->ebx = (regs->ebx & ~0xFF) | v; break; - case 4: regs->esp = (regs->esp & ~0xFF00) | (v << 8); break; - case 5: regs->ebp = (regs->ebp & ~0xFF00) | (v << 8); break; - case 6: regs->esi = (regs->esi & ~0xFF00) | (v << 8); break; - case 7: regs->edi = (regs->edi & ~0xFF00) | (v << 8); break; + case 4: regs->eax = (regs->eax & ~0xFF00) | (v << 8); break; + case 5: regs->ecx = (regs->ecx & ~0xFF00) | (v << 8); break; + case 6: regs->edx = (regs->edx & ~0xFF00) | (v << 8); break; + case 7: regs->ebx = (regs->ebx & ~0xFF00) | (v << 8); break; } } @@ -961,9 +961,9 @@ protected_mode(struct regs *regs) /* initialize jump environment to warp back to protected mode */ regs->uss = DATA_SELECTOR; - regs->uesp = stack_top; + regs->uesp = (unsigned long)stack_top; regs->cs = CODE_SELECTOR; - regs->eip = (unsigned) switch_to_protected_mode; + regs->eip = (unsigned long)switch_to_protected_mode; /* this should get us into 32-bit mode */ } diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/hw/pc.c --- a/tools/ioemu/hw/pc.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/hw/pc.c Wed Jan 10 08:40:47 2007 -0700 @@ -168,6 +168,8 @@ static int get_bios_disk(char *boot_devi return 0x02; /* hard drive */ case 'd': return 0x03; /* cdrom */ + case 'n': + return 0x04; /* network */ } } return 0x00; /* no device */ diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/hw/vga.c --- a/tools/ioemu/hw/vga.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/hw/vga.c Wed Jan 10 08:40:47 2007 -0700 @@ -2002,7 +2002,10 @@ void vga_common_init(VGAState *s, Displa s->vram_shadow = (uint8_t *)((long)(s->vram_shadow + TARGET_PAGE_SIZE - 1) & ~(TARGET_PAGE_SIZE - 1)); - s->vram_ptr = qemu_malloc(vga_ram_size); + /* Video RAM must be 128-bit aligned for SSE optimizations later */ + s->vram_alloc = qemu_malloc(vga_ram_size + 15); + s->vram_ptr = (uint8_t *)((long)(s->vram_alloc + 15) & ~15L); + s->vram_offset = vga_ram_offset; s->vram_size = vga_ram_size; s->ds = ds; @@ -2126,7 +2129,7 @@ void *vga_update_vram(VGAState *s, void } if (!vga_ram_base) { - vga_ram_base = qemu_malloc(vga_ram_size); + vga_ram_base = qemu_malloc(vga_ram_size + TARGET_PAGE_SIZE + 1); if (!vga_ram_base) { fprintf(stderr, "reallocate error\n"); return NULL; @@ -2134,8 +2137,10 @@ void *vga_update_vram(VGAState *s, void } /* XXX lock needed? */ + old_pointer = s->vram_alloc; + s->vram_alloc = vga_ram_base; + vga_ram_base = (uint8_t *)((long)(vga_ram_base + 15) & ~15L); memcpy(vga_ram_base, s->vram_ptr, vga_ram_size); - old_pointer = s->vram_ptr; s->vram_ptr = vga_ram_base; return old_pointer; diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/hw/vga_int.h --- a/tools/ioemu/hw/vga_int.h Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/hw/vga_int.h Wed Jan 10 08:40:47 2007 -0700 @@ -78,6 +78,7 @@ #define VGA_MAX_HEIGHT 2048 #define VGA_STATE_COMMON \ + uint8_t *vram_alloc; \ uint8_t *vram_ptr; \ uint8_t *vram_shadow; \ unsigned long vram_offset; \ diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/domain-timeoffset --- a/tools/ioemu/patches/domain-timeoffset Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/domain-timeoffset Wed Jan 10 08:40:47 2007 -0700 @@ -1,7 +1,7 @@ Index: ioemu/hw/mc146818rtc.c Index: ioemu/hw/mc146818rtc.c =================================================================== ---- ioemu.orig/hw/mc146818rtc.c 2006-12-08 18:36:31.000000000 +0000 -+++ ioemu/hw/mc146818rtc.c 2006-12-08 18:36:36.000000000 +0000 +--- ioemu.orig/hw/mc146818rtc.c 2006-12-20 15:21:33.000000000 +0000 ++++ ioemu/hw/mc146818rtc.c 2006-12-20 15:21:50.000000000 +0000 @@ -178,10 +178,27 @@ } } @@ -46,8 +46,8 @@ Index: ioemu/hw/mc146818rtc.c static void rtc_copy_date(RTCState *s) Index: ioemu/hw/pc.c =================================================================== ---- ioemu.orig/hw/pc.c 2006-12-08 18:36:35.000000000 +0000 -+++ ioemu/hw/pc.c 2006-12-08 18:36:36.000000000 +0000 +--- ioemu.orig/hw/pc.c 2006-12-20 15:21:49.000000000 +0000 ++++ ioemu/hw/pc.c 2006-12-20 15:21:50.000000000 +0000 @@ -159,7 +159,7 @@ } @@ -117,8 +117,8 @@ Index: ioemu/hw/pc.c QEMUMachine pc_machine = { Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 18:36:35.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 18:36:36.000000000 +0000 +--- ioemu.orig/vl.c 2006-12-20 15:21:49.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:50.000000000 +0000 @@ -163,6 +163,8 @@ int xc_handle; @@ -162,7 +162,7 @@ Index: ioemu/vl.c } } } -@@ -6492,7 +6500,8 @@ +@@ -6484,7 +6492,8 @@ machine->init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, @@ -174,8 +174,8 @@ Index: ioemu/vl.c if (usb_enabled) { Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 18:36:35.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 18:36:36.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:21:49.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:50.000000000 +0000 @@ -576,7 +576,7 @@ int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/fix-interrupt-routing --- a/tools/ioemu/patches/fix-interrupt-routing Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/fix-interrupt-routing Wed Jan 10 08:40:47 2007 -0700 @@ -17,23 +17,21 @@ Signed-off-by: Keir Fraser <keir@xensour Index: ioemu/Makefile.target =================================================================== ---- ioemu.orig/Makefile.target 2006-12-08 18:21:56.000000000 +0000 -+++ ioemu/Makefile.target 2006-12-08 18:22:35.000000000 +0000 -@@ -298,7 +298,7 @@ +--- ioemu.orig/Makefile.target 2006-12-20 15:04:55.000000000 +0000 ++++ ioemu/Makefile.target 2006-12-20 15:08:16.000000000 +0000 +@@ -296,9 +296,9 @@ + + # qemu-dm objects ifeq ($(ARCH),ia64) - LIBOBJS=helper2.o exec-dm.o i8259-dm.o +-LIBOBJS=helper2.o exec-dm.o i8259-dm.o ++LIBOBJS=helper2.o exec-dm.o i8259-dm.o piix_pci-dm.o else -LIBOBJS=helper2.o exec-dm.o i8259-dm.o rtc-dm.o +LIBOBJS=helper2.o exec-dm.o i8259-dm.o rtc-dm.o piix_pci-dm.o endif all: $(PROGS) -@@ -360,11 +360,11 @@ - # Hardware support - VL_OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o $(AUDIODRV) - ifeq ($(ARCH),ia64) --VL_OBJS+= fdc.o mc146818rtc.o serial.o pc.o -+VL_OBJS+= fdc.o mc146818rtc.o serial.o pc.o piix_pci.o +@@ -364,7 +364,7 @@ else VL_OBJS+= fdc.o serial.o pc.o endif @@ -44,8 +42,8 @@ Index: ioemu/Makefile.target VL_OBJS+= xenstore.o Index: ioemu/target-i386-dm/i8259-dm.c =================================================================== ---- ioemu.orig/target-i386-dm/i8259-dm.c 2006-12-08 18:21:36.000000000 +0000 -+++ ioemu/target-i386-dm/i8259-dm.c 2006-12-08 18:22:35.000000000 +0000 +--- ioemu.orig/target-i386-dm/i8259-dm.c 2006-12-20 15:04:54.000000000 +0000 ++++ ioemu/target-i386-dm/i8259-dm.c 2006-12-20 15:04:55.000000000 +0000 @@ -33,7 +33,7 @@ void pic_set_irq_new(void *opaque, int irq, int level) @@ -58,7 +56,7 @@ Index: ioemu/target-i386-dm/piix_pci-dm. Index: ioemu/target-i386-dm/piix_pci-dm.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ ioemu/target-i386-dm/piix_pci-dm.c 2006-12-08 18:22:35.000000000 +0000 ++++ ioemu/target-i386-dm/piix_pci-dm.c 2006-12-20 15:08:13.000000000 +0000 @@ -0,0 +1,397 @@ +/* + * QEMU i440FX/PIIX3 PCI Bridge Emulation diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/ioemu-ia64 --- a/tools/ioemu/patches/ioemu-ia64 Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/ioemu-ia64 Wed Jan 10 08:40:47 2007 -0700 @@ -1,7 +1,7 @@ Index: ioemu/hw/iommu.c Index: ioemu/hw/iommu.c =================================================================== ---- ioemu.orig/hw/iommu.c 2006-12-08 02:02:07.000000000 +0000 -+++ ioemu/hw/iommu.c 2006-12-08 02:02:34.000000000 +0000 +--- ioemu.orig/hw/iommu.c 2006-12-20 15:04:54.000000000 +0000 ++++ ioemu/hw/iommu.c 2006-12-20 15:04:54.000000000 +0000 @@ -82,7 +82,11 @@ #define IOPTE_VALID 0x00000002 /* IOPTE is valid */ #define IOPTE_WAZ 0x00000001 /* Write as zeros */ @@ -16,8 +16,8 @@ Index: ioemu/hw/iommu.c Index: ioemu/cpu-all.h =================================================================== ---- ioemu.orig/cpu-all.h 2006-12-08 02:02:07.000000000 +0000 -+++ ioemu/cpu-all.h 2006-12-08 02:02:34.000000000 +0000 +--- ioemu.orig/cpu-all.h 2006-12-20 15:04:54.000000000 +0000 ++++ ioemu/cpu-all.h 2006-12-20 15:04:54.000000000 +0000 @@ -835,6 +835,31 @@ :"=m" (*(volatile long *)addr) :"dIr" (nr)); @@ -52,13 +52,17 @@ Index: ioemu/cpu-all.h /* memory API */ Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 02:02:28.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 02:02:34.000000000 +0000 -@@ -6137,6 +6137,11 @@ +--- ioemu.orig/vl.c 2006-12-20 15:04:54.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:12:00.000000000 +0000 +@@ -6137,6 +6137,15 @@ exit(1); } +#if defined (__ia64__) ++ /* ram_size passed from xend has added on GFW memory, ++ so we must subtract it here */ ++ ram_size -= 16 * MEM_M; ++ + if (ram_size > MMIO_START) + ram_size += 1 * MEM_G; /* skip 3G-4G MMIO, LEGACY_IO_SPACE etc. */ +#endif @@ -66,7 +70,7 @@ Index: ioemu/vl.c /* init the memory */ phys_ram_size = ram_size + vga_ram_size + bios_size; -@@ -6161,6 +6166,7 @@ +@@ -6161,6 +6170,7 @@ exit(-1); } @@ -74,41 +78,29 @@ Index: ioemu/vl.c for ( i = 0; i < tmp_nr_pages; i++) page_array[i] = i; -@@ -6185,6 +6191,48 @@ +@@ -6185,6 +6195,36 @@ free(page_array); +#elif defined(__ia64__) + -+ if (xc_ia64_get_pfn_list(xc_handle, domid, page_array, -+ IO_PAGE_START >> PAGE_SHIFT, 3) != 3) { -+ fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno); -+ exit(-1); -+ } -+ + shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, + PROT_READ|PROT_WRITE, -+ page_array[0]); -+ -+ fprintf(logfile, "shared page at pfn:%lx, mfn: %016lx\n", -+ IO_PAGE_START >> PAGE_SHIFT, page_array[0]); ++ IO_PAGE_START >> PAGE_SHIFT); + + buffered_io_page =xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, + PROT_READ|PROT_WRITE, -+ page_array[2]); -+ fprintf(logfile, "Buffered IO page at pfn:%lx, mfn: %016lx\n", -+ BUFFER_IO_PAGE_START >> PAGE_SHIFT, page_array[2]); -+ -+ if (xc_ia64_get_pfn_list(xc_handle, domid, -+ page_array, 0, nr_pages) != nr_pages) { -+ fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno); -+ exit(-1); -+ } -+ ++ BUFFER_IO_PAGE_START >> PAGE_SHIFT); ++ ++ for (i = 0; i < tmp_nr_pages; i++) ++ page_array[i] = i; ++ ++ /* VTI will not use memory between 3G~4G, so we just pass a legal pfn ++ to make QEMU map continuous virtual memory space */ + if (ram_size > MMIO_START) { + for (i = 0 ; i < (MEM_G >> PAGE_SHIFT); i++) + page_array[(MMIO_START >> PAGE_SHIFT) + i] = -+ page_array[(IO_PAGE_START >> PAGE_SHIFT) + 1]; ++ (STORE_PAGE_START >> PAGE_SHIFT); + } + + phys_ram_base = xc_map_foreign_batch(xc_handle, domid, @@ -125,8 +117,8 @@ Index: ioemu/vl.c phys_ram_base = qemu_vmalloc(phys_ram_size); Index: ioemu/exec-all.h =================================================================== ---- ioemu.orig/exec-all.h 2006-12-08 02:02:07.000000000 +0000 -+++ ioemu/exec-all.h 2006-12-08 02:02:34.000000000 +0000 +--- ioemu.orig/exec-all.h 2006-12-20 15:04:54.000000000 +0000 ++++ ioemu/exec-all.h 2006-12-20 15:04:54.000000000 +0000 @@ -462,12 +462,13 @@ } #endif @@ -146,8 +138,8 @@ Index: ioemu/exec-all.h Index: ioemu/target-i386-dm/cpu.h =================================================================== ---- ioemu.orig/target-i386-dm/cpu.h 2006-12-08 02:02:07.000000000 +0000 -+++ ioemu/target-i386-dm/cpu.h 2006-12-08 02:02:34.000000000 +0000 +--- ioemu.orig/target-i386-dm/cpu.h 2006-12-20 15:04:54.000000000 +0000 ++++ ioemu/target-i386-dm/cpu.h 2006-12-20 15:10:13.000000000 +0000 @@ -78,7 +78,11 @@ /* helper2.c */ int main_loop(void); @@ -163,7 +155,7 @@ Index: ioemu/ia64_intrinsic.h Index: ioemu/ia64_intrinsic.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ ioemu/ia64_intrinsic.h 2006-12-08 02:02:34.000000000 +0000 ++++ ioemu/ia64_intrinsic.h 2006-12-20 15:04:54.000000000 +0000 @@ -0,0 +1,276 @@ +#ifndef IA64_INTRINSIC_H +#define IA64_INTRINSIC_H diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/qemu-bootorder --- a/tools/ioemu/patches/qemu-bootorder Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/qemu-bootorder Wed Jan 10 08:40:47 2007 -0700 @@ -1,7 +1,7 @@ Index: ioemu/vl.c Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 02:02:38.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 02:02:38.000000000 +0000 +--- ioemu.orig/vl.c 2006-12-20 15:12:08.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:19.000000000 +0000 @@ -125,7 +125,7 @@ struct sockaddr_in vnclisten_addr; const char* keyboard_layout = NULL; @@ -17,15 +17,17 @@ Index: ioemu/vl.c case QEMU_OPTION_boot: - boot_device = optarg[0]; - if (boot_device != 'a' && +-#ifdef TARGET_SPARC +- // Network boot +- boot_device != 'n' && +-#endif +- boot_device != 'c' && boot_device != 'd') { +- fprintf(stderr, "qemu: invalid boot device '%c'\n", boot_device); + boot_device = strdup(optarg); + if (strspn(boot_device, "acd" - #ifdef TARGET_SPARC -- // Network boot -- boot_device != 'n' && ++#if defined(TARGET_SPARC) || defined(TARGET_I386) + "n" - #endif -- boot_device != 'c' && boot_device != 'd') { -- fprintf(stderr, "qemu: invalid boot device '%c'\n", boot_device); ++#endif + ) != strlen(boot_device)) { + fprintf(stderr, "qemu: invalid boot device in '%s'\n", + boot_device); @@ -48,7 +50,7 @@ Index: ioemu/vl.c #endif /* !CONFIG_DM */ setvbuf(stdout, NULL, _IOLBF, 0); -@@ -6598,6 +6600,7 @@ +@@ -6590,6 +6592,7 @@ ds, fd_filename, snapshot, kernel_filename, kernel_cmdline, initrd_filename, timeoffset); @@ -58,8 +60,8 @@ Index: ioemu/vl.c if (usb_enabled) { Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 02:02:38.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 02:02:38.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:12:08.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:14.000000000 +0000 @@ -578,7 +578,7 @@ #ifndef QEMU_TOOL @@ -80,9 +82,9 @@ Index: ioemu/vl.h uint32_t initrd_image, uint32_t initrd_size, Index: ioemu/hw/pc.c =================================================================== ---- ioemu.orig/hw/pc.c 2006-12-08 02:02:38.000000000 +0000 -+++ ioemu/hw/pc.c 2006-12-08 02:02:38.000000000 +0000 -@@ -158,8 +158,23 @@ +--- ioemu.orig/hw/pc.c 2006-12-20 15:12:08.000000000 +0000 ++++ ioemu/hw/pc.c 2006-12-20 15:21:19.000000000 +0000 +@@ -158,8 +158,25 @@ rtc_set_memory(s, info_ofs + 8, sectors); } @@ -96,6 +98,8 @@ Index: ioemu/hw/pc.c + return 0x02; /* hard drive */ + case 'd': + return 0x03; /* cdrom */ ++ case 'n': ++ return 0x04; /* network */ + } + } + return 0x00; /* no device */ @@ -107,7 +111,7 @@ Index: ioemu/hw/pc.c { RTCState *s = rtc_state; int val; -@@ -205,21 +220,14 @@ +@@ -205,21 +222,14 @@ rtc_set_memory(s, 0x34, val); rtc_set_memory(s, 0x35, val >> 8); @@ -137,7 +141,7 @@ Index: ioemu/hw/pc.c /* floppy type */ -@@ -617,7 +625,7 @@ +@@ -617,7 +627,7 @@ #define NOBIOS 1 /* PC hardware initialisation */ @@ -146,7 +150,7 @@ Index: ioemu/hw/pc.c DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, time_t timeoffset, -@@ -919,7 +927,7 @@ +@@ -919,7 +929,7 @@ } } @@ -155,7 +159,7 @@ Index: ioemu/hw/pc.c DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, -@@ -933,7 +941,7 @@ +@@ -933,7 +943,7 @@ initrd_filename, timeoffset, 1); } diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/series --- a/tools/ioemu/patches/series Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/series Wed Jan 10 08:40:47 2007 -0700 @@ -67,5 +67,5 @@ vnc-monitor-shift-key-processing vnc-monitor-shift-key-processing ide-error-reporting vnc-numpad-handling -xen-mapcache -p3 +xen-mapcache usb-mouse-tablet-status-check -p3 diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/tpm-tis-device --- a/tools/ioemu/patches/tpm-tis-device Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/tpm-tis-device Wed Jan 10 08:40:47 2007 -0700 @@ -22,8 +22,8 @@ Signed-off-by: Stefan Berger <stefanb@us Index: ioemu/Makefile.target =================================================================== ---- ioemu.orig/Makefile.target 2006-12-08 18:33:48.000000000 +0000 -+++ ioemu/Makefile.target 2006-12-08 18:35:14.000000000 +0000 +--- ioemu.orig/Makefile.target 2006-12-20 15:21:55.000000000 +0000 ++++ ioemu/Makefile.target 2006-12-20 15:21:55.000000000 +0000 @@ -369,6 +369,7 @@ VL_OBJS+= piix4acpi.o VL_OBJS+= xenstore.o @@ -34,9 +34,9 @@ Index: ioemu/Makefile.target ifeq ($(TARGET_BASE_ARCH), ppc) Index: ioemu/hw/pc.c =================================================================== ---- ioemu.orig/hw/pc.c 2006-12-08 18:33:47.000000000 +0000 -+++ ioemu/hw/pc.c 2006-12-08 18:33:48.000000000 +0000 -@@ -875,6 +875,9 @@ +--- ioemu.orig/hw/pc.c 2006-12-20 15:21:54.000000000 +0000 ++++ ioemu/hw/pc.c 2006-12-20 15:21:55.000000000 +0000 +@@ -877,6 +877,9 @@ } } @@ -49,7 +49,7 @@ Index: ioemu/hw/tpm_tis.c Index: ioemu/hw/tpm_tis.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ ioemu/hw/tpm_tis.c 2006-12-08 18:35:25.000000000 +0000 ++++ ioemu/hw/tpm_tis.c 2006-12-20 15:21:55.000000000 +0000 @@ -0,0 +1,1120 @@ +/* + * tpm_tis.c - QEMU emulator for a 1.2 TPM with TIS interface @@ -1173,8 +1173,8 @@ Index: ioemu/hw/tpm_tis.c +} Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 18:33:48.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 18:35:14.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:21:55.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:55.000000000 +0000 @@ -932,6 +932,10 @@ void piix4_pm_init(PCIBus *bus, int devfn); void acpi_bios_init(void); diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/vnc-display-find-unused --- a/tools/ioemu/patches/vnc-display-find-unused Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/vnc-display-find-unused Wed Jan 10 08:40:47 2007 -0700 @@ -1,7 +1,7 @@ Index: ioemu/vnc.c Index: ioemu/vnc.c =================================================================== ---- ioemu.orig/vnc.c 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/vnc.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vnc.c 2006-12-20 15:21:52.000000000 +0000 ++++ ioemu/vnc.c 2006-12-20 15:21:52.000000000 +0000 @@ -1197,7 +1197,7 @@ } } @@ -50,8 +50,8 @@ Index: ioemu/vnc.c int vnc_start_viewer(int port) Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vl.c 2006-12-20 15:21:51.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:52.000000000 +0000 @@ -121,6 +121,7 @@ static DisplayState display_state; int nographic; @@ -104,7 +104,7 @@ Index: ioemu/vl.c } } } -@@ -6468,7 +6478,7 @@ +@@ -6460,7 +6470,7 @@ if (nographic) { dumb_display_init(ds); } else if (vnc_display != -1) { @@ -115,8 +115,8 @@ Index: ioemu/vl.c } else { Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:21:51.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:52.000000000 +0000 @@ -785,7 +785,7 @@ void cocoa_display_init(DisplayState *ds, int full_screen); diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/vnc-fixes --- a/tools/ioemu/patches/vnc-fixes Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/vnc-fixes Wed Jan 10 08:40:47 2007 -0700 @@ -1,8 +1,8 @@ Index: ioemu/vl.c Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 02:02:36.000000000 +0000 -@@ -6519,8 +6519,10 @@ +--- ioemu.orig/vl.c 2006-12-20 15:21:51.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:51.000000000 +0000 +@@ -6511,8 +6511,10 @@ } } @@ -17,8 +17,8 @@ Index: ioemu/vl.c if (use_gdbstub) { Index: ioemu/vnc.c =================================================================== ---- ioemu.orig/vnc.c 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/vnc.c 2006-12-08 02:02:36.000000000 +0000 +--- ioemu.orig/vnc.c 2006-12-20 15:21:51.000000000 +0000 ++++ ioemu/vnc.c 2006-12-20 15:21:51.000000000 +0000 @@ -3,6 +3,7 @@ * * Copyright (C) 2006 Anthony Liguori <anthony@xxxxxxxxxxxxx> @@ -531,8 +531,8 @@ Index: ioemu/vnc.c } Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 02:02:36.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:21:51.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:51.000000000 +0000 @@ -319,6 +319,7 @@ int is_graphic_console(void); CharDriverState *text_console_init(DisplayState *ds); diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/vnc-listen-specific-interface --- a/tools/ioemu/patches/vnc-listen-specific-interface Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/vnc-listen-specific-interface Wed Jan 10 08:40:47 2007 -0700 @@ -20,8 +20,8 @@ Signed-off-by: Daniel P. Berrange <berr Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 02:02:37.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vl.c 2006-12-20 15:21:52.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:52.000000000 +0000 @@ -122,6 +122,7 @@ int nographic; int vncviewer; @@ -114,7 +114,7 @@ Index: ioemu/vl.c } } } -@@ -6478,7 +6493,7 @@ +@@ -6470,7 +6485,7 @@ if (nographic) { dumb_display_init(ds); } else if (vnc_display != -1) { @@ -125,8 +125,8 @@ Index: ioemu/vl.c } else { Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 02:02:37.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:21:52.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:52.000000000 +0000 @@ -37,6 +37,8 @@ #include <unistd.h> #include <fcntl.h> @@ -147,8 +147,8 @@ Index: ioemu/vl.h /* ide.c */ Index: ioemu/vnc.c =================================================================== ---- ioemu.orig/vnc.c 2006-12-08 02:02:37.000000000 +0000 -+++ ioemu/vnc.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vnc.c 2006-12-20 15:21:52.000000000 +0000 ++++ ioemu/vnc.c 2006-12-20 15:21:52.000000000 +0000 @@ -1197,9 +1197,8 @@ } } diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/vnc-password --- a/tools/ioemu/patches/vnc-password Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/vnc-password Wed Jan 10 08:40:47 2007 -0700 @@ -17,8 +17,8 @@ Signed-off-by: Masami Watanabe <masami.w Index: ioemu/Makefile.target =================================================================== ---- ioemu.orig/Makefile.target 2006-12-08 18:20:53.000000000 +0000 -+++ ioemu/Makefile.target 2006-12-08 18:20:53.000000000 +0000 +--- ioemu.orig/Makefile.target 2006-12-20 15:21:55.000000000 +0000 ++++ ioemu/Makefile.target 2006-12-20 15:21:55.000000000 +0000 @@ -407,6 +407,7 @@ VL_OBJS+=sdl.o endif @@ -39,8 +39,8 @@ Index: ioemu/Makefile.target Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 18:20:52.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 18:20:53.000000000 +0000 +--- ioemu.orig/vl.c 2006-12-20 15:21:54.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:55.000000000 +0000 @@ -171,6 +171,9 @@ char domain_name[1024] = { 'H','V', 'M', 'X', 'E', 'N', '-'}; extern int domid; @@ -59,7 +59,7 @@ Index: ioemu/vl.c #ifndef CONFIG_DM #ifdef TARGET_PPC cdrom_index = 1; -@@ -6543,6 +6547,10 @@ +@@ -6535,6 +6539,10 @@ init_ioports(); @@ -72,8 +72,8 @@ Index: ioemu/vl.c dumb_display_init(ds); Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 18:20:52.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 18:20:53.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:21:54.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:55.000000000 +0000 @@ -1214,6 +1214,7 @@ void xenstore_process_event(void *opaque); void xenstore_check_new_media_present(int timeout); @@ -92,8 +92,8 @@ Index: ioemu/vl.h #endif /* VL_H */ Index: ioemu/vnc.c =================================================================== ---- ioemu.orig/vnc.c 2006-12-08 18:20:52.000000000 +0000 -+++ ioemu/vnc.c 2006-12-08 18:20:53.000000000 +0000 +--- ioemu.orig/vnc.c 2006-12-20 15:21:52.000000000 +0000 ++++ ioemu/vnc.c 2006-12-20 15:21:55.000000000 +0000 @@ -44,6 +44,7 @@ #include "vnc_keysym.h" @@ -244,8 +244,8 @@ Index: ioemu/vnc.c +} Index: ioemu/xenstore.c =================================================================== ---- ioemu.orig/xenstore.c 2006-12-08 18:20:52.000000000 +0000 -+++ ioemu/xenstore.c 2006-12-08 18:20:53.000000000 +0000 +--- ioemu.orig/xenstore.c 2006-12-20 15:21:54.000000000 +0000 ++++ ioemu/xenstore.c 2006-12-20 15:21:55.000000000 +0000 @@ -213,3 +213,54 @@ free(portstr); free(buf); @@ -304,7 +304,7 @@ Index: ioemu/d3des.c Index: ioemu/d3des.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ ioemu/d3des.c 2006-12-08 18:20:53.000000000 +0000 ++++ ioemu/d3des.c 2006-12-20 15:21:55.000000000 +0000 @@ -0,0 +1,434 @@ +/* + * This is D3DES (V5.09) by Richard Outerbridge with the double and @@ -743,7 +743,7 @@ Index: ioemu/d3des.h Index: ioemu/d3des.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ ioemu/d3des.h 2006-12-08 18:20:53.000000000 +0000 ++++ ioemu/d3des.h 2006-12-20 15:21:55.000000000 +0000 @@ -0,0 +1,51 @@ +/* + * This is D3DES (V5.09) by Richard Outerbridge with the double and diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/vnc-start-vncviewer --- a/tools/ioemu/patches/vnc-start-vncviewer Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/vnc-start-vncviewer Wed Jan 10 08:40:47 2007 -0700 @@ -1,7 +1,7 @@ Index: ioemu/vnc.c Index: ioemu/vnc.c =================================================================== ---- ioemu.orig/vnc.c 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/vnc.c 2006-12-08 02:02:36.000000000 +0000 +--- ioemu.orig/vnc.c 2006-12-20 15:21:51.000000000 +0000 ++++ ioemu/vnc.c 2006-12-20 15:21:51.000000000 +0000 @@ -1189,3 +1189,25 @@ vnc_dpy_resize(vs->ds, 640, 400); @@ -30,8 +30,8 @@ Index: ioemu/vnc.c +} Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 02:02:36.000000000 +0000 +--- ioemu.orig/vl.c 2006-12-20 15:21:51.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:51.000000000 +0000 @@ -120,6 +120,7 @@ int bios_size; static DisplayState display_state; @@ -82,7 +82,7 @@ Index: ioemu/vl.c } } } -@@ -6461,6 +6469,8 @@ +@@ -6453,6 +6461,8 @@ dumb_display_init(ds); } else if (vnc_display != -1) { vnc_display_init(ds, vnc_display); @@ -93,8 +93,8 @@ Index: ioemu/vl.c sdl_display_init(ds, full_screen); Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 02:02:36.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:21:51.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:51.000000000 +0000 @@ -786,6 +786,7 @@ /* vnc.c */ diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/xen-mapcache --- a/tools/ioemu/patches/xen-mapcache Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/xen-mapcache Wed Jan 10 08:40:47 2007 -0700 @@ -15,22 +15,179 @@ Signed-off-by: Dexuan Cui <dexuan.cui@in Signed-off-by: Dexuan Cui <dexuan.cui@xxxxxxxxx> Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> -diff -r 3f0ca90351e2 -r 67a06a9b7b1d tools/ioemu/target-i386-dm/cpu.h ---- a/tools/ioemu/target-i386-dm/cpu.h Thu Dec 07 10:54:43 2006 +0000 -+++ b/tools/ioemu/target-i386-dm/cpu.h Thu Dec 07 11:12:52 2006 +0000 -@@ -25,7 +25,8 @@ - #ifdef TARGET_X86_64 - #define TARGET_LONG_BITS 64 - #else --#define TARGET_LONG_BITS 32 -+/* #define TARGET_LONG_BITS 32 */ -+#define TARGET_LONG_BITS 64 /* for Qemu map cache */ - #endif - - /* target supports implicit self modifying code */ -diff -r 3f0ca90351e2 -r 67a06a9b7b1d tools/ioemu/target-i386-dm/exec-dm.c ---- a/tools/ioemu/target-i386-dm/exec-dm.c Thu Dec 07 10:54:43 2006 +0000 -+++ b/tools/ioemu/target-i386-dm/exec-dm.c Thu Dec 07 11:12:52 2006 +0000 +Index: ioemu/vl.c +=================================================================== +--- ioemu.orig/vl.c 2006-12-20 15:21:55.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:56.000000000 +0000 +@@ -5808,6 +5808,91 @@ + return 0; + } + ++#if defined(__i386__) || defined(__x86_64__) ++static struct map_cache *mapcache_entry; ++static unsigned long nr_buckets; ++ ++static int qemu_map_cache_init(unsigned long nr_pages) ++{ ++ unsigned long max_pages = MAX_MCACHE_SIZE >> PAGE_SHIFT; ++ int i; ++ ++ if (nr_pages < max_pages) ++ max_pages = nr_pages; ++ ++ nr_buckets = max_pages + (1UL << (MCACHE_BUCKET_SHIFT - PAGE_SHIFT)) - 1; ++ nr_buckets >>= (MCACHE_BUCKET_SHIFT - PAGE_SHIFT); ++ fprintf(logfile, "qemu_map_cache_init nr_buckets = %lx\n", nr_buckets); ++ ++ mapcache_entry = malloc(nr_buckets * sizeof(struct map_cache)); ++ if (mapcache_entry == NULL) { ++ errno = ENOMEM; ++ return -1; ++ } ++ ++ memset(mapcache_entry, 0, nr_buckets * sizeof(struct map_cache)); ++ ++ /* ++ * To avoid ENOMEM from xc_map_foreign_batch() at runtime, we ++ * pre-fill all the map caches in advance. ++ */ ++ for (i = 0; i < nr_buckets; i++) ++ (void)qemu_map_cache(((target_phys_addr_t)i) << MCACHE_BUCKET_SHIFT); ++ ++ return 0; ++} ++ ++uint8_t *qemu_map_cache(target_phys_addr_t phys_addr) ++{ ++ struct map_cache *entry; ++ unsigned long address_index = phys_addr >> MCACHE_BUCKET_SHIFT; ++ unsigned long address_offset = phys_addr & (MCACHE_BUCKET_SIZE-1); ++ ++ /* For most cases (>99.9%), the page address is the same. */ ++ static unsigned long last_address_index = ~0UL; ++ static uint8_t *last_address_vaddr; ++ ++ if (address_index == last_address_index) ++ return last_address_vaddr + address_offset; ++ ++ entry = &mapcache_entry[address_index % nr_buckets]; ++ ++ if (entry->vaddr_base == NULL || entry->paddr_index != address_index) { ++ /* We need to remap a bucket. */ ++ uint8_t *vaddr_base; ++ unsigned long pfns[MCACHE_BUCKET_SIZE >> PAGE_SHIFT]; ++ unsigned int i; ++ ++ if (entry->vaddr_base != NULL) { ++ errno = munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE); ++ if (errno) { ++ fprintf(logfile, "unmap fails %d\n", errno); ++ exit(-1); ++ } ++ } ++ ++ for (i = 0; i < MCACHE_BUCKET_SIZE >> PAGE_SHIFT; i++) ++ pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-PAGE_SHIFT)) + i; ++ ++ vaddr_base = xc_map_foreign_batch( ++ xc_handle, domid, PROT_READ|PROT_WRITE, ++ pfns, MCACHE_BUCKET_SIZE >> PAGE_SHIFT); ++ if (vaddr_base == NULL) { ++ fprintf(logfile, "xc_map_foreign_batch error %d\n", errno); ++ exit(-1); ++ } ++ ++ entry->vaddr_base = vaddr_base; ++ entry->paddr_index = address_index;; ++ } ++ ++ last_address_index = address_index; ++ last_address_vaddr = entry->vaddr_base; ++ ++ return last_address_vaddr + address_offset; ++} ++#endif ++ + int main(int argc, char **argv) + { + #ifdef CONFIG_GDBSTUB +@@ -6130,6 +6215,7 @@ + break; + case QEMU_OPTION_m: + ram_size = atol(optarg) * 1024 * 1024; ++ ram_size = (uint64_t)atol(optarg) * 1024 * 1024; + if (ram_size <= 0) + help(); + #ifndef CONFIG_DM +@@ -6404,50 +6490,41 @@ + shared_page_nr = nr_pages - 1; + #endif + +- page_array = (xen_pfn_t *)malloc(tmp_nr_pages * sizeof(xen_pfn_t)); +- if (page_array == NULL) { +- fprintf(logfile, "malloc returned error %d\n", errno); +- exit(-1); +- } +- + #if defined(__i386__) || defined(__x86_64__) +- for ( i = 0; i < tmp_nr_pages; i++) +- page_array[i] = i; + +- phys_ram_base = xc_map_foreign_batch(xc_handle, domid, +- PROT_READ|PROT_WRITE, page_array, +- tmp_nr_pages); +- if (phys_ram_base == NULL) { +- fprintf(logfile, "batch map guest memory returned error %d\n", errno); ++ if ( qemu_map_cache_init(tmp_nr_pages) ) ++ { ++ fprintf(logfile, "qemu_map_cache_init returned: error %d\n", errno); + exit(-1); + } + + shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, +- PROT_READ|PROT_WRITE, +- page_array[shared_page_nr]); ++ PROT_READ|PROT_WRITE, shared_page_nr); + if (shared_page == NULL) { + fprintf(logfile, "map shared IO page returned error %d\n", errno); + exit(-1); + } + +- fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", +- shared_page_nr, (uint64_t)(page_array[shared_page_nr])); ++ fprintf(logfile, "shared page at pfn:%lx\n", shared_page_nr); + + buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, + PROT_READ|PROT_WRITE, +- page_array[shared_page_nr - 2]); ++ shared_page_nr - 2); + if (buffered_io_page == NULL) { + fprintf(logfile, "map buffered IO page returned error %d\n", errno); + exit(-1); + } + +- fprintf(logfile, "buffered io page at pfn:%lx, mfn: %"PRIx64"\n", +- shared_page_nr - 2, (uint64_t)(page_array[shared_page_nr - 2])); +- +- free(page_array); ++ fprintf(logfile, "buffered io page at pfn:%lx\n", shared_page_nr - 2); + + #elif defined(__ia64__) +- ++ ++ page_array = (xen_pfn_t *)malloc(tmp_nr_pages * sizeof(xen_pfn_t)); ++ if (page_array == NULL) { ++ fprintf(logfile, "malloc returned error %d\n", errno); ++ exit(-1); ++ } ++ + shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, + PROT_READ|PROT_WRITE, + IO_PAGE_START >> PAGE_SHIFT); +Index: ioemu/target-i386-dm/exec-dm.c +=================================================================== +--- ioemu.orig/target-i386-dm/exec-dm.c 2006-12-20 15:21:42.000000000 +0000 ++++ ioemu/target-i386-dm/exec-dm.c 2006-12-21 11:32:29.000000000 +0000 @@ -36,6 +36,7 @@ #include "cpu.h" @@ -39,7 +196,52 @@ diff -r 3f0ca90351e2 -r 67a06a9b7b1d too //#define DEBUG_TB_INVALIDATE //#define DEBUG_FLUSH -@@ -426,6 +427,12 @@ static inline int paddr_is_ram(target_ph +@@ -127,10 +128,29 @@ + FILE *logfile; + int loglevel; + ++ ++#if defined(__i386__) || defined(__x86_64__) ++#define MAPCACHE ++#endif ++ ++#ifdef MAPCACHE ++#include <pthread.h> ++static pthread_mutex_t mapcache_mutex; ++#define mapcache_lock() pthread_mutex_lock(&mapcache_mutex) ++#define mapcache_unlock() pthread_mutex_unlock(&mapcache_mutex) ++#else ++#define mapcache_lock() ( (void)0 ) ++#define mapcache_unlock() ( (void)0 ) ++#endif ++ ++ + void cpu_exec_init(CPUState *env) + { + CPUState **penv; + int cpu_index; ++#ifdef MAPCACHE ++ pthread_mutexattr_t mxattr; ++#endif + + env->next_cpu = NULL; + penv = &first_cpu; +@@ -144,6 +164,14 @@ + + /* alloc dirty bits array */ + phys_ram_dirty = qemu_malloc(phys_ram_size >> TARGET_PAGE_BITS); ++ ++#ifdef MAPCACHE ++ /* setup memory access mutex to protect mapcache */ ++ pthread_mutexattr_init(&mxattr); ++ pthread_mutexattr_settype(&mxattr, PTHREAD_MUTEX_RECURSIVE); ++ pthread_mutex_init(&mapcache_mutex, &mxattr); ++ pthread_mutexattr_destroy(&mxattr); ++#endif + } + + /* enable or disable low levels log */ +@@ -426,19 +454,27 @@ #endif } @@ -52,7 +254,15 @@ diff -r 3f0ca90351e2 -r 67a06a9b7b1d too void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, int len, int is_write) { -@@ -438,7 +445,7 @@ void cpu_physical_memory_rw(target_phys_ + int l, io_index; + uint8_t *ptr; + uint32_t val; +- ++ ++ mapcache_lock(); ++ + while (len > 0) { + /* How much can we copy before the next page boundary? */ l = TARGET_PAGE_SIZE - (addr & ~TARGET_PAGE_MASK); if (l > len) l = len; @@ -61,7 +271,7 @@ diff -r 3f0ca90351e2 -r 67a06a9b7b1d too io_index = iomem_index(addr); if (is_write) { if (io_index) { -@@ -460,9 +467,10 @@ void cpu_physical_memory_rw(target_phys_ +@@ -460,9 +496,10 @@ } } else if (paddr_is_ram(addr)) { /* Reading from RAM */ @@ -74,7 +284,7 @@ diff -r 3f0ca90351e2 -r 67a06a9b7b1d too #endif } } else { -@@ -485,7 +493,8 @@ void cpu_physical_memory_rw(target_phys_ +@@ -485,7 +522,8 @@ } } else if (paddr_is_ram(addr)) { /* Reading from RAM */ @@ -84,194 +294,20 @@ diff -r 3f0ca90351e2 -r 67a06a9b7b1d too } else { /* Neither RAM nor known MMIO space */ memset(buf, 0xff, len); -diff -r 3f0ca90351e2 -r 67a06a9b7b1d tools/ioemu/vl.c ---- a/tools/ioemu/vl.c Thu Dec 07 10:54:43 2006 +0000 -+++ b/tools/ioemu/vl.c Thu Dec 07 11:12:52 2006 +0000 -@@ -5807,6 +5807,92 @@ int set_mm_mapping(int xc_handle, uint32 - - return 0; - } -+ -+#if defined(__i386__) || defined(__x86_64__) -+static struct map_cache *mapcache_entry; -+static unsigned long nr_buckets; -+ -+static int qemu_map_cache_init(unsigned long nr_pages) -+{ -+ unsigned long max_pages = MAX_MCACHE_SIZE >> PAGE_SHIFT; -+ int i; -+ -+ if (nr_pages < max_pages) -+ max_pages = nr_pages; -+ -+ nr_buckets = (max_pages << PAGE_SHIFT) >> MCACHE_BUCKET_SHIFT; -+ -+ fprintf(logfile, "qemu_map_cache_init nr_buckets = %lx\n", nr_buckets); -+ -+ mapcache_entry = malloc(nr_buckets * sizeof(struct map_cache)); -+ if (mapcache_entry == NULL) { -+ errno = ENOMEM; -+ return -1; -+ } -+ -+ memset(mapcache_entry, 0, nr_buckets * sizeof(struct map_cache)); -+ -+ /* -+ * To avoid ENOMEM from xc_map_foreign_batch() at runtime, we -+ * pre-fill all the map caches in advance. -+ */ -+ for (i = 0; i < nr_buckets; i++) -+ (void)qemu_map_cache(((target_phys_addr_t)i) << MCACHE_BUCKET_SHIFT); -+ -+ return 0; -+} -+ -+uint8_t *qemu_map_cache(target_phys_addr_t phys_addr) -+{ -+ struct map_cache *entry; -+ unsigned long address_index = phys_addr >> MCACHE_BUCKET_SHIFT; -+ unsigned long address_offset = phys_addr & (MCACHE_BUCKET_SIZE-1); -+ -+ /* For most cases (>99.9%), the page address is the same. */ -+ static unsigned long last_address_index = ~0UL; -+ static uint8_t *last_address_vaddr; -+ -+ if (address_index == last_address_index) -+ return last_address_vaddr + address_offset; -+ -+ entry = &mapcache_entry[address_index % nr_buckets]; -+ -+ if (entry->vaddr_base == NULL || entry->paddr_index != address_index) -+ { -+ /* We need to remap a bucket. */ -+ uint8_t *vaddr_base; -+ unsigned long pfns[MCACHE_BUCKET_SIZE >> PAGE_SHIFT]; -+ unsigned int i; -+ -+ if (entry->vaddr_base != NULL) { -+ errno = munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE); -+ if (errno) { -+ fprintf(logfile, "unmap fails %d\n", errno); -+ exit(-1); -+ } -+ } -+ -+ for (i = 0; i < MCACHE_BUCKET_SIZE >> PAGE_SHIFT; i++) -+ pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-PAGE_SHIFT)) + i; -+ -+ vaddr_base = xc_map_foreign_batch( -+ xc_handle, domid, PROT_READ|PROT_WRITE, -+ pfns, MCACHE_BUCKET_SIZE >> PAGE_SHIFT); -+ if (vaddr_base == NULL) { -+ fprintf(logfile, "xc_map_foreign_batch error %d\n", errno); -+ exit(-1); -+ } -+ -+ entry->vaddr_base = vaddr_base; -+ entry->paddr_index = address_index;; -+ } -+ -+ last_address_index = address_index; -+ last_address_vaddr = entry->vaddr_base; -+ -+ return last_address_vaddr + address_offset; -+} -+#endif - - int main(int argc, char **argv) - { -@@ -6130,6 +6216,7 @@ int main(int argc, char **argv) - break; - case QEMU_OPTION_m: - ram_size = atol(optarg) * 1024 * 1024; -+ ram_size = (uint64_t)atol(optarg) * 1024 * 1024; - if (ram_size <= 0) - help(); - #ifndef CONFIG_DM -@@ -6400,50 +6487,41 @@ int main(int argc, char **argv) - shared_page_nr = nr_pages - 1; - #endif - -+#if defined(__i386__) || defined(__x86_64__) -+ -+ if ( qemu_map_cache_init(tmp_nr_pages) ) -+ { -+ fprintf(logfile, "qemu_map_cache_init returned: error %d\n", errno); -+ exit(-1); -+ } -+ -+ shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, -+ PROT_READ|PROT_WRITE, shared_page_nr); -+ if (shared_page == NULL) { -+ fprintf(logfile, "map shared IO page returned error %d\n", errno); -+ exit(-1); -+ } -+ -+ fprintf(logfile, "shared page at pfn:%lx\n", shared_page_nr); -+ -+ buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, -+ PROT_READ|PROT_WRITE, -+ shared_page_nr - 2); -+ if (buffered_io_page == NULL) { -+ fprintf(logfile, "map buffered IO page returned error %d\n", errno); -+ exit(-1); -+ } -+ -+ fprintf(logfile, "buffered io page at pfn:%lx\n", shared_page_nr - 2); -+ -+#elif defined(__ia64__) -+ - page_array = (xen_pfn_t *)malloc(tmp_nr_pages * sizeof(xen_pfn_t)); - if (page_array == NULL) { - fprintf(logfile, "malloc returned error %d\n", errno); - exit(-1); - } - --#if defined(__i386__) || defined(__x86_64__) -- for ( i = 0; i < tmp_nr_pages; i++) -- page_array[i] = i; -- -- phys_ram_base = xc_map_foreign_batch(xc_handle, domid, -- PROT_READ|PROT_WRITE, page_array, -- tmp_nr_pages); -- if (phys_ram_base == NULL) { -- fprintf(logfile, "batch map guest memory returned error %d\n", errno); -- exit(-1); -- } -- -- shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, -- PROT_READ|PROT_WRITE, -- page_array[shared_page_nr]); -- if (shared_page == NULL) { -- fprintf(logfile, "map shared IO page returned error %d\n", errno); -- exit(-1); -- } -- -- fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", -- shared_page_nr, (uint64_t)(page_array[shared_page_nr])); -- -- buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE, -- PROT_READ|PROT_WRITE, -- page_array[shared_page_nr - 2]); -- if (buffered_io_page == NULL) { -- fprintf(logfile, "map buffered IO page returned error %d\n", errno); -- exit(-1); -- } -- -- fprintf(logfile, "buffered io page at pfn:%lx, mfn: %"PRIx64"\n", -- shared_page_nr - 2, (uint64_t)(page_array[shared_page_nr - 2])); -- -- free(page_array); -- --#elif defined(__ia64__) -- - if (xc_ia64_get_pfn_list(xc_handle, domid, page_array, - IO_PAGE_START >> PAGE_SHIFT, 3) != 3) { - fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno); -diff -r 3f0ca90351e2 -r 67a06a9b7b1d tools/ioemu/vl.h ---- a/tools/ioemu/vl.h Thu Dec 07 10:54:43 2006 +0000 -+++ b/tools/ioemu/vl.h Thu Dec 07 11:12:52 2006 +0000 -@@ -156,6 +156,26 @@ extern void *shared_vram; +@@ -495,6 +533,8 @@ + buf += l; + addr += l; + } ++ ++ mapcache_unlock(); + } + #endif + +Index: ioemu/vl.h +=================================================================== +--- ioemu.orig/vl.h 2006-12-20 15:21:55.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:56.000000000 +0000 +@@ -156,6 +156,26 @@ extern FILE *logfile; @@ -298,3 +334,17 @@ diff -r 3f0ca90351e2 -r 67a06a9b7b1d too extern int xc_handle; extern int domid; +Index: ioemu/target-i386-dm/cpu.h +=================================================================== +--- ioemu.orig/target-i386-dm/cpu.h 2006-12-20 15:21:45.000000000 +0000 ++++ ioemu/target-i386-dm/cpu.h 2006-12-20 15:21:56.000000000 +0000 +@@ -25,7 +25,8 @@ + #ifdef TARGET_X86_64 + #define TARGET_LONG_BITS 64 + #else +-#define TARGET_LONG_BITS 32 ++/* #define TARGET_LONG_BITS 32 */ ++#define TARGET_LONG_BITS 64 /* for Qemu map cache */ + #endif + + /* target supports implicit self modifying code */ diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/xen-support-buffered-ioreqs --- a/tools/ioemu/patches/xen-support-buffered-ioreqs Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/xen-support-buffered-ioreqs Wed Jan 10 08:40:47 2007 -0700 @@ -1,7 +1,7 @@ Index: ioemu/vl.c Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 02:02:37.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vl.c 2006-12-20 15:21:54.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:54.000000000 +0000 @@ -5838,6 +5838,7 @@ unsigned long nr_pages, tmp_nr_pages, shared_page_nr; xen_pfn_t *page_array; @@ -10,7 +10,7 @@ Index: ioemu/vl.c char qemu_dm_logfilename[64]; -@@ -6418,6 +6419,17 @@ +@@ -6422,6 +6423,17 @@ fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", shared_page_nr, (uint64_t)(page_array[shared_page_nr])); @@ -30,8 +30,8 @@ Index: ioemu/vl.c #elif defined(__ia64__) Index: ioemu/target-i386-dm/helper2.c =================================================================== ---- ioemu.orig/target-i386-dm/helper2.c 2006-12-08 02:02:35.000000000 +0000 -+++ ioemu/target-i386-dm/helper2.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/target-i386-dm/helper2.c 2006-12-20 15:21:47.000000000 +0000 ++++ ioemu/target-i386-dm/helper2.c 2006-12-20 15:21:54.000000000 +0000 @@ -76,6 +76,10 @@ shared_iopage_t *shared_page = NULL; diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/xenstore-block-device-config --- a/tools/ioemu/patches/xenstore-block-device-config Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/xenstore-block-device-config Wed Jan 10 08:40:47 2007 -0700 @@ -1,7 +1,7 @@ Index: ioemu/Makefile.target Index: ioemu/Makefile.target =================================================================== ---- ioemu.orig/Makefile.target 2006-12-08 02:02:36.000000000 +0000 -+++ ioemu/Makefile.target 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/Makefile.target 2006-12-20 15:21:51.000000000 +0000 ++++ ioemu/Makefile.target 2006-12-20 15:21:53.000000000 +0000 @@ -359,6 +359,7 @@ VL_OBJS+= cirrus_vga.o mixeng.o parallel.o acpi.o piix_pci.o VL_OBJS+= usb-uhci.o @@ -13,7 +13,7 @@ Index: ioemu/xenstore.c Index: ioemu/xenstore.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ ioemu/xenstore.c 2006-12-08 02:02:37.000000000 +0000 ++++ ioemu/xenstore.c 2006-12-20 15:21:53.000000000 +0000 @@ -0,0 +1,187 @@ +/* + * This file is subject to the terms and conditions of the GNU General @@ -204,8 +204,8 @@ Index: ioemu/xenstore.c +} Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 02:02:37.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vl.c 2006-12-20 15:21:52.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:53.000000000 +0000 @@ -5256,9 +5256,11 @@ "Standard options:\n" "-M machine select emulated machine (-M ? for list)\n" @@ -359,7 +359,7 @@ Index: ioemu/vl.c setvbuf(stdout, NULL, _IOLBF, 0); -@@ -6441,6 +6472,7 @@ +@@ -6433,6 +6464,7 @@ #endif /* !CONFIG_DM */ @@ -367,7 +367,7 @@ Index: ioemu/vl.c /* we always create the cdrom drive, even if no disk is there */ bdrv_init(); if (cdrom_index >= 0) { -@@ -6467,6 +6499,7 @@ +@@ -6459,6 +6491,7 @@ } } } @@ -375,7 +375,7 @@ Index: ioemu/vl.c /* we always create at least one floppy disk */ fd_table[0] = bdrv_new("fda"); -@@ -6545,6 +6578,8 @@ +@@ -6537,6 +6570,8 @@ } } @@ -386,8 +386,8 @@ Index: ioemu/vl.c kernel_filename, kernel_cmdline, initrd_filename, Index: ioemu/monitor.c =================================================================== ---- ioemu.orig/monitor.c 2006-12-08 02:02:35.000000000 +0000 -+++ ioemu/monitor.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/monitor.c 2006-12-20 15:21:47.000000000 +0000 ++++ ioemu/monitor.c 2006-12-20 15:21:53.000000000 +0000 @@ -24,6 +24,7 @@ #include "vl.h" #include "disas.h" @@ -416,8 +416,8 @@ Index: ioemu/monitor.c int i; Index: ioemu/block.c =================================================================== ---- ioemu.orig/block.c 2006-12-08 02:02:06.000000000 +0000 -+++ ioemu/block.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/block.c 2006-12-20 15:21:31.000000000 +0000 ++++ ioemu/block.c 2006-12-20 15:21:53.000000000 +0000 @@ -758,6 +758,7 @@ static void raw_close(BlockDriverState *bs) { @@ -428,8 +428,8 @@ Index: ioemu/block.c Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 02:02:37.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:21:52.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:53.000000000 +0000 @@ -1191,6 +1191,8 @@ void term_print_help(void); void monitor_readline(const char *prompt, int is_password, @@ -455,8 +455,8 @@ Index: ioemu/vl.h extern char domain_name[]; Index: ioemu/hw/ide.c =================================================================== ---- ioemu.orig/hw/ide.c 2006-12-08 02:02:35.000000000 +0000 -+++ ioemu/hw/ide.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/hw/ide.c 2006-12-20 15:21:49.000000000 +0000 ++++ ioemu/hw/ide.c 2006-12-20 15:21:53.000000000 +0000 @@ -1158,6 +1158,7 @@ } else { ide_atapi_cmd_error(s, SENSE_NOT_READY, diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/patches/xenstore-write-vnc-port --- a/tools/ioemu/patches/xenstore-write-vnc-port Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/patches/xenstore-write-vnc-port Wed Jan 10 08:40:47 2007 -0700 @@ -1,7 +1,7 @@ Index: ioemu/xenstore.c Index: ioemu/xenstore.c =================================================================== ---- ioemu.orig/xenstore.c 2006-12-08 02:02:37.000000000 +0000 -+++ ioemu/xenstore.c 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/xenstore.c 2006-12-20 15:21:53.000000000 +0000 ++++ ioemu/xenstore.c 2006-12-20 15:21:54.000000000 +0000 @@ -185,3 +185,31 @@ free(image); free(vec); @@ -36,9 +36,9 @@ Index: ioemu/xenstore.c +} Index: ioemu/vl.c =================================================================== ---- ioemu.orig/vl.c 2006-12-08 02:02:37.000000000 +0000 -+++ ioemu/vl.c 2006-12-08 02:02:37.000000000 +0000 -@@ -6535,6 +6535,7 @@ +--- ioemu.orig/vl.c 2006-12-20 15:21:53.000000000 +0000 ++++ ioemu/vl.c 2006-12-20 15:21:54.000000000 +0000 +@@ -6527,6 +6527,7 @@ vnc_display = vnc_display_init(ds, vnc_display, vncunused, &vnclisten_addr); if (vncviewer) vnc_start_viewer(vnc_display); @@ -48,8 +48,8 @@ Index: ioemu/vl.c sdl_display_init(ds, full_screen); Index: ioemu/vl.h =================================================================== ---- ioemu.orig/vl.h 2006-12-08 02:02:37.000000000 +0000 -+++ ioemu/vl.h 2006-12-08 02:02:37.000000000 +0000 +--- ioemu.orig/vl.h 2006-12-20 15:21:53.000000000 +0000 ++++ ioemu/vl.h 2006-12-20 15:21:54.000000000 +0000 @@ -1210,6 +1210,7 @@ int xenstore_fd(void); void xenstore_process_event(void *opaque); diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/target-i386-dm/exec-dm.c --- a/tools/ioemu/target-i386-dm/exec-dm.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/target-i386-dm/exec-dm.c Wed Jan 10 08:40:47 2007 -0700 @@ -134,6 +134,7 @@ int loglevel; #endif #ifdef MAPCACHE +#include <pthread.h> static pthread_mutex_t mapcache_mutex; #define mapcache_lock() pthread_mutex_lock(&mapcache_mutex) #define mapcache_unlock() pthread_mutex_unlock(&mapcache_mutex) diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/target-i386-dm/helper2.c --- a/tools/ioemu/target-i386-dm/helper2.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/target-i386-dm/helper2.c Wed Jan 10 08:40:47 2007 -0700 @@ -498,6 +498,8 @@ void handle_buffered_io(void *opaque) void cpu_handle_ioreq(void *opaque) { + extern int vm_running; + extern int shutdown_requested; CPUState *env = opaque; ioreq_t *req = cpu_get_ioreq(); @@ -516,6 +518,25 @@ void cpu_handle_ioreq(void *opaque) } wmb(); /* Update ioreq contents /then/ update state. */ + + /* + * We do this before we send the response so that the tools + * have the opportunity to pick up on the reset before the + * guest resumes and does a hlt with interrupts disabled which + * causes Xen to powerdown the domain. + */ + if (vm_running) { + if (shutdown_requested) { + fprintf(logfile, "shutdown requested in cpu_handle_ioreq\n"); + destroy_hvm_domain(); + } + if (reset_requested) { + fprintf(logfile, "reset requested in cpu_handle_ioreq.\n"); + qemu_system_reset(); + reset_requested = 0; + } + } + req->state = STATE_IORESP_READY; xc_evtchn_notify(xce_handle, ioreq_local_port[send_vcpu]); } diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/vl.c --- a/tools/ioemu/vl.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/vl.c Wed Jan 10 08:40:47 2007 -0700 @@ -6153,7 +6153,7 @@ int main(int argc, char **argv) case QEMU_OPTION_boot: boot_device = strdup(optarg); if (strspn(boot_device, "acd" -#ifdef TARGET_SPARC +#if defined(TARGET_SPARC) || defined(TARGET_I386) "n" #endif ) != strlen(boot_device)) { diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/vnc.c --- a/tools/ioemu/vnc.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/vnc.c Wed Jan 10 08:40:47 2007 -0700 @@ -54,12 +54,12 @@ typedef struct Buffer { size_t capacity; size_t offset; - char *buffer; + uint8_t *buffer; } Buffer; typedef struct VncState VncState; -typedef int VncReadEvent(VncState *vs, char *data, size_t len); +typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len); typedef void VncWritePixels(VncState *vs, void *data, int size); @@ -90,7 +90,7 @@ struct VncState uint64_t *update_row; /* outstanding updates */ int has_update; /* there's outstanding updates in the * visible area */ - char *old_data; + uint8_t *old_data; int depth; /* internal VNC frame buffer byte per pixel */ int has_resize; int has_hextile; @@ -140,7 +140,7 @@ static void vnc_update_client(void *opaq static void vnc_update_client(void *opaque); static void vnc_client_read(void *opaque); static void framebuffer_set_updated(VncState *vs, int x, int y, int w, int h); -static int make_challenge(char *random, int size); +static int make_challenge(unsigned char *random, int size); static void set_seed(unsigned int *seedp); static void get_random(int len, unsigned char *buf); @@ -330,7 +330,7 @@ static void send_framebuffer_update_raw( static void send_framebuffer_update_raw(VncState *vs, int x, int y, int w, int h) { int i; - char *row; + uint8_t *row; vnc_framebuffer_update(vs, x, y, w, h, 0); @@ -394,9 +394,9 @@ static void vnc_copy(DisplayState *ds, i static void vnc_copy(DisplayState *ds, int src_x, int src_y, int dst_x, int dst_y, int w, int h) { int src, dst; - char *src_row; - char *dst_row; - char *old_row; + uint8_t *src_row; + uint8_t *dst_row; + uint8_t *old_row; int y = 0; int pitch = ds->linesize; VncState *vs = ds->opaque; @@ -465,8 +465,8 @@ static void _vnc_update_client(void *opa VncState *vs = opaque; int64_t now; int y; - char *row; - char *old_row; + uint8_t *row; + uint8_t *old_row; uint64_t width_mask; int n_rectangles; int saved_offset; @@ -491,7 +491,7 @@ static void _vnc_update_client(void *opa for (y = 0; y < vs->ds->height; y++) { if (vs->dirty_row[y] & width_mask) { int x; - char *ptr, *old_ptr; + uint8_t *ptr, *old_ptr; ptr = row; old_ptr = old_row; @@ -654,7 +654,7 @@ static int buffer_empty(Buffer *buffer) return buffer->offset == 0; } -static char *buffer_end(Buffer *buffer) +static uint8_t *buffer_end(Buffer *buffer) { return buffer->buffer + buffer->offset; } @@ -778,7 +778,7 @@ static void vnc_write_u32(VncState *vs, static void vnc_write_u16(VncState *vs, uint16_t value) { - char buf[2]; + uint8_t buf[2]; buf[0] = (value >> 8) & 0xFF; buf[1] = value & 0xFF; @@ -788,7 +788,7 @@ static void vnc_write_u16(VncState *vs, static void vnc_write_u8(VncState *vs, uint8_t value) { - vnc_write(vs, (char *)&value, 1); + vnc_write(vs, &value, 1); } static void vnc_flush(VncState *vs) @@ -797,23 +797,23 @@ static void vnc_flush(VncState *vs) vnc_client_write(vs); } -static uint8_t read_u8(char *data, size_t offset) +static uint8_t read_u8(uint8_t *data, size_t offset) { return data[offset]; } -static uint16_t read_u16(char *data, size_t offset) +static uint16_t read_u16(uint8_t *data, size_t offset) { return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF); } -static int32_t read_s32(char *data, size_t offset) +static int32_t read_s32(uint8_t *data, size_t offset) { return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]); } -static uint32_t read_u32(char *data, size_t offset) +static uint32_t read_u32(uint8_t *data, size_t offset) { return ((data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3]); @@ -1115,11 +1115,10 @@ static void set_pixel_format(VncState *v vga_hw_update(); } -static int protocol_client_msg(VncState *vs, char *data, size_t len) +static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len) { int i; uint16_t limit; - int64_t now; switch (data[0]) { case 0: @@ -1188,7 +1187,7 @@ static int protocol_client_msg(VncState return 8 + v; } - client_cut_text(vs, read_u32(data, 4), data + 8); + client_cut_text(vs, read_u32(data, 4), (char *)(data + 8)); break; default: printf("Msg: %d\n", data[0]); @@ -1200,7 +1199,7 @@ static int protocol_client_msg(VncState return 0; } -static int protocol_client_init(VncState *vs, char *data, size_t len) +static int protocol_client_init(VncState *vs, uint8_t *data, size_t len) { size_t l; char pad[3] = { 0, 0, 0 }; @@ -1261,7 +1260,7 @@ static int protocol_client_init(VncState return 0; } -static int protocol_response(VncState *vs, char *client_response, size_t len) +static int protocol_response(VncState *vs, uint8_t *client_response, size_t len) { extern char vncpasswd[64]; extern unsigned char challenge[AUTHCHALLENGESIZE]; @@ -1299,7 +1298,7 @@ static int protocol_response(VncState *v return 0; } -static int protocol_version(VncState *vs, char *version, size_t len) +static int protocol_version(VncState *vs, uint8_t *version, size_t len) { extern char vncpasswd[64]; extern unsigned char challenge[AUTHCHALLENGESIZE]; @@ -1318,7 +1317,7 @@ static int protocol_version(VncState *vs support = 0; - if (maj = 3) { + if (maj == 3) { if (min == 3 || min ==4) { support = 1; } @@ -1468,7 +1467,7 @@ int vnc_start_viewer(int port) unsigned int seed; -static int make_challenge(char *random, int size) +static int make_challenge(unsigned char *random, int size) { set_seed(&seed); diff -r 42babffffba5 -r 58633caeece9 tools/ioemu/vnchextile.h --- a/tools/ioemu/vnchextile.h Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/ioemu/vnchextile.h Wed Jan 10 08:40:47 2007 -0700 @@ -13,7 +13,7 @@ static void CONCAT(send_hextile_tile_, N uint32_t *last_fg32, int *has_bg, int *has_fg) { - char *row = (vs->ds->data + y * vs->ds->linesize + x * vs->depth); + uint8_t *row = (vs->ds->data + y * vs->ds->linesize + x * vs->depth); pixel_t *irow = (pixel_t *)row; int j, i; pixel_t *last_bg = (pixel_t *)last_bg32; @@ -119,7 +119,7 @@ static void CONCAT(send_hextile_tile_, N for (j = 0; j < h; j++) { int has_color = 0; int min_x = -1; - pixel_t color; + pixel_t color = 0; for (i = 0; i < w; i++) { if (!has_color) { diff -r 42babffffba5 -r 58633caeece9 tools/libxc/xc_hvm_build.c --- a/tools/libxc/xc_hvm_build.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxc/xc_hvm_build.c Wed Jan 10 08:40:47 2007 -0700 @@ -233,8 +233,7 @@ static int setup_guest(int xc_handle, SCRATCH_PFN)) == NULL) ) goto error_out; memset(shared_info, 0, PAGE_SIZE); - for ( i = 0; i < MAX_VIRT_CPUS; i++ ) - shared_info->vcpu_info[i].evtchn_upcall_mask = 1; + /* NB. evtchn_upcall_mask is unused: leave as zero. */ memset(&shared_info->evtchn_mask[0], 0xff, sizeof(shared_info->evtchn_mask)); munmap(shared_info, PAGE_SIZE); diff -r 42babffffba5 -r 58633caeece9 tools/libxc/xc_linux_build.c --- a/tools/libxc/xc_linux_build.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxc/xc_linux_build.c Wed Jan 10 08:40:47 2007 -0700 @@ -595,6 +595,7 @@ static int compat_check(int xc_handle, s return 0; } +#ifndef __x86_64__//temp if (strstr(xen_caps, "xen-3.0-x86_32p")) { if (dsi->pae_kernel == PAEKERN_bimodal) { dsi->pae_kernel = PAEKERN_extended_cr3; @@ -612,6 +613,7 @@ static int compat_check(int xc_handle, s return 0; } } +#endif return 1; } @@ -1079,7 +1081,7 @@ static int xc_linux_build_internal(int x static int xc_linux_build_internal(int xc_handle, uint32_t domid, unsigned int mem_mb, - char *image, + const char *image, unsigned long image_size, struct initrd_info *initrd, const char *cmdline, diff -r 42babffffba5 -r 58633caeece9 tools/libxc/xc_linux_restore.c --- a/tools/libxc/xc_linux_restore.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxc/xc_linux_restore.c Wed Jan 10 08:40:47 2007 -0700 @@ -709,7 +709,7 @@ int xc_linux_restore(int xc_handle, int goto out; } - for (i = 0; i < ctxt.gdt_ents; i += 512) { + for (i = 0; (512*i) < ctxt.gdt_ents; i++) { pfn = ctxt.gdt_frames[i]; if ((pfn >= max_pfn) || (pfn_type[pfn] != XEN_DOMCTL_PFINFO_NOTAB)) { ERROR("GDT frame number is bad"); diff -r 42babffffba5 -r 58633caeece9 tools/libxc/xc_linux_save.c --- a/tools/libxc/xc_linux_save.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxc/xc_linux_save.c Wed Jan 10 08:40:47 2007 -0700 @@ -44,6 +44,7 @@ static xen_pfn_t *live_p2m = NULL; /* Live mapping of system MFN to PFN table. */ static xen_pfn_t *live_m2p = NULL; +static unsigned long m2p_mfn0; /* grep fodder: machine_to_phys */ @@ -80,7 +81,7 @@ static xen_pfn_t *live_m2p = NULL; #define BITMAP_SIZE ((max_pfn + BITS_PER_LONG - 1) / 8) #define BITMAP_ENTRY(_nr,_bmap) \ - ((unsigned long *)(_bmap))[(_nr)/BITS_PER_LONG] + ((volatile unsigned long *)(_bmap))[(_nr)/BITS_PER_LONG] #define BITMAP_SHIFT(_nr) ((_nr) % BITS_PER_LONG) @@ -112,7 +113,7 @@ static inline int count_bits ( int nr, v static inline int count_bits ( int nr, volatile void *addr) { int i, count = 0; - unsigned long *p = (unsigned long *)addr; + volatile unsigned long *p = (volatile unsigned long *)addr; /* We know that the array is padded to unsigned long. */ for( i = 0; i < (nr / (sizeof(unsigned long)*8)); i++, p++ ) count += hweight32(*p); @@ -440,13 +441,23 @@ static int canonicalize_pagetable(unsign ** that this check will fail for other L2s. */ if (pt_levels == 3 && type == XEN_DOMCTL_PFINFO_L2TAB) { - -/* XXX index of the L2 entry in PAE mode which holds the guest LPT */ -#define PAE_GLPT_L2ENTRY (495) - pte = ((uint64_t*)spage)[PAE_GLPT_L2ENTRY]; - - if(((pte >> PAGE_SHIFT) & 0x0fffffff) == live_p2m[pfn]) - xen_start = (hvirt_start >> L2_PAGETABLE_SHIFT_PAE) & 0x1ff; + int hstart; + unsigned long he; + + hstart = (hvirt_start >> L2_PAGETABLE_SHIFT_PAE) & 0x1ff; + he = ((const uint64_t *) spage)[hstart]; + + if ( ((he >> PAGE_SHIFT) & 0x0fffffff) == m2p_mfn0 ) { + /* hvirt starts with xen stuff... */ + xen_start = hstart; + } else if ( hvirt_start != 0xf5800000 ) { + /* old L2s from before hole was shrunk... */ + hstart = (0xf5800000 >> L2_PAGETABLE_SHIFT_PAE) & 0x1ff; + he = ((const uint64_t *) spage)[hstart]; + + if( ((he >> PAGE_SHIFT) & 0x0fffffff) == m2p_mfn0 ) + xen_start = hstart; + } } if (pt_levels == 4 && type == XEN_DOMCTL_PFINFO_L4TAB) { @@ -464,9 +475,9 @@ static int canonicalize_pagetable(unsign unsigned long pfn, mfn; if (pt_levels == 2) - pte = ((uint32_t*)spage)[i]; + pte = ((const uint32_t*)spage)[i]; else - pte = ((uint64_t*)spage)[i]; + pte = ((const uint64_t*)spage)[i]; if (i >= xen_start && i < xen_end) pte = 0; @@ -549,6 +560,8 @@ static xen_pfn_t *xc_map_m2p(int xc_hand ERROR("xc_mmap_foreign_ranges failed (rc = %d)", rc); return NULL; } + + m2p_mfn0 = entries[0].mfn; free(extent_start); free(entries); @@ -915,14 +928,14 @@ int xc_linux_save(int xc_handle, int io_ if(!is_mapped(pfn_type[batch])) { - /* not currently in pusedo-physical map -- set bit - in to_fix that we must send this page in last_iter - unless its sent sooner anyhow */ + /* + ** not currently in psuedo-physical map -- set bit + ** in to_fix since we must send this page in last_iter + ** unless its sent sooner anyhow, or it never enters + ** pseudo-physical map (e.g. for ballooned down domains) + */ set_bit(n, to_fix); - if( (iter > 1) && IS_REAL_PFN(n) ) - DPRINTF("netbuf race: iter %d, pfn %x. mfn %lx\n", - iter, n, pfn_type[batch]); continue; } @@ -1052,7 +1065,7 @@ int xc_linux_save(int xc_handle, int io_ DPRINTF("(of which %ld were fixups)\n", needed_to_fix ); } - if (last_iter && debug){ + if (last_iter && debug) { int minusone = -1; memset(to_send, 0xff, BITMAP_SIZE); debug = 0; @@ -1068,17 +1081,14 @@ int xc_linux_save(int xc_handle, int io_ continue; } - if (last_iter) break; + if (last_iter) + break; if (live) { - - - if( - ((sent_this_iter > sent_last_iter) && RATE_IS_MAX()) || + if (((sent_this_iter > sent_last_iter) && RATE_IS_MAX()) || (iter >= max_iters) || (sent_this_iter+skip_this_iter < 50) || - (total_sent > max_pfn*max_factor) ) { - + (total_sent > max_pfn*max_factor)) { DPRINTF("Start last iteration\n"); last_iter = 1; @@ -1106,8 +1116,6 @@ int xc_linux_save(int xc_handle, int io_ print_stats(xc_handle, dom, sent_this_iter, &stats, 1); } - - } /* end of while 1 */ DPRINTF("All memory is saved\n"); @@ -1159,7 +1167,7 @@ int xc_linux_save(int xc_handle, int io_ } /* Canonicalise each GDT frame number. */ - for ( i = 0; i < ctxt.gdt_ents; i += 512 ) { + for ( i = 0; (512*i) < ctxt.gdt_ents; i++ ) { if ( !translate_mfn_to_pfn(&ctxt.gdt_frames[i]) ) { ERROR("GDT frame is not in range of pseudophys map"); goto out; diff -r 42babffffba5 -r 58633caeece9 tools/libxc/xc_load_bin.c --- a/tools/libxc/xc_load_bin.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxc/xc_load_bin.c Wed Jan 10 08:40:47 2007 -0700 @@ -98,7 +98,7 @@ struct xen_bin_image_table #define FLAGS_MASK ((~ 0) & (~ XEN_REACTOS_FLAG_ALIGN4K)) #define FLAGS_REQUIRED XEN_REACTOS_FLAG_ADDRSVALID -static struct xen_bin_image_table * +static const struct xen_bin_image_table * findtable(const char *image, unsigned long image_size); static int parsebinimage( @@ -122,11 +122,11 @@ int probe_bin(const char *image, return 0; } -static struct xen_bin_image_table * +static const struct xen_bin_image_table * findtable(const char *image, unsigned long image_size) { - struct xen_bin_image_table *table; - unsigned long *probe_ptr; + const struct xen_bin_image_table *table; + const unsigned long *probe_ptr; unsigned probe_index; unsigned probe_count; @@ -142,13 +142,13 @@ findtable(const char *image, unsigned lo sizeof(unsigned long); /* Search for the magic header */ - probe_ptr = (unsigned long *) image; + probe_ptr = (const unsigned long *) image; table = NULL; for ( probe_index = 0; probe_index < probe_count; probe_index++ ) { if ( XEN_REACTOS_MAGIC3 == *probe_ptr ) { - table = (struct xen_bin_image_table *) probe_ptr; + table = (const struct xen_bin_image_table *) probe_ptr; /* Checksum correct? */ if ( 0 == table->magic + table->flags + table->checksum ) { @@ -165,7 +165,7 @@ static int parsebinimage(const char *ima unsigned long image_size, struct domain_setup_info *dsi) { - struct xen_bin_image_table *image_info; + const struct xen_bin_image_table *image_info; unsigned long start_addr; unsigned long end_addr; @@ -186,13 +186,13 @@ static int parsebinimage(const char *ima /* Sanity check on the addresses */ if ( image_info->header_addr < image_info->load_addr || - ((char *) image_info - image) < + ((const char *) image_info - image) < (image_info->header_addr - image_info->load_addr) ) { ERROR("Invalid header_addr."); return -EINVAL; } - start_addr = image_info->header_addr - ((char *) image_info - image); + start_addr = image_info->header_addr - ((const char *) image_info - image); if ( 0 != image_info->load_end_addr && ( image_info->load_end_addr < image_info->load_end_addr || start_addr + image_size < image_info->load_end_addr ) ) @@ -221,7 +221,7 @@ static int parsebinimage(const char *ima else { dsi->v_end = image_info->load_addr + image_size - - (((char *) image_info - image) - + (((const char *) image_info - image) - (image_info->header_addr - image_info->load_addr)); } dsi->v_kernstart = dsi->v_start; @@ -240,7 +240,7 @@ loadbinimage( unsigned long size; char *va; unsigned long done, chunksz; - struct xen_bin_image_table *image_info; + const struct xen_bin_image_table *image_info; image_info = findtable(image, image_size); if ( NULL == image_info ) @@ -252,7 +252,7 @@ loadbinimage( /* Determine image size */ if ( 0 == image_info->load_end_addr ) { - size = image_size - (((char *) image_info - image) - + size = image_size - (((const char *)image_info - image) - (image_info->header_addr - image_info->load_addr)); } @@ -262,7 +262,7 @@ loadbinimage( } /* It's possible that we need to skip the first part of the image */ - image += ((char *)image_info - image) - + image += ((const char *)image_info - image) - (image_info->header_addr - image_info->load_addr); for ( done = 0; done < size; done += chunksz ) diff -r 42babffffba5 -r 58633caeece9 tools/libxc/xc_load_elf.c --- a/tools/libxc/xc_load_elf.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxc/xc_load_elf.c Wed Jan 10 08:40:47 2007 -0700 @@ -75,7 +75,7 @@ int probe_elf(const char *image, unsigned long image_size, struct load_funcs *load_funcs) { - Elf_Ehdr *ehdr = (Elf_Ehdr *)image; + const Elf_Ehdr *ehdr = (const Elf_Ehdr *)image; if ( !IS_ELF(*ehdr) ) return -EINVAL; @@ -86,7 +86,7 @@ int probe_elf(const char *image, return 0; } -static inline int is_loadable_phdr(Elf_Phdr *phdr) +static inline int is_loadable_phdr(const Elf_Phdr *phdr) { return ((phdr->p_type == PT_LOAD) && ((phdr->p_flags & (PF_W|PF_X)) != 0)); @@ -96,12 +96,13 @@ static inline int is_loadable_phdr(Elf_P * Fallback for kernels containing only the legacy __xen_guest string * and no ELF notes. */ -static int is_xen_guest_section(Elf_Shdr *shdr, const char *shstrtab) +static int is_xen_guest_section(const Elf_Shdr *shdr, const char *shstrtab) { return strcmp(&shstrtab[shdr->sh_name], "__xen_guest") == 0; } -static const char *xen_guest_lookup(struct domain_setup_info *dsi, int type) +static const char *xen_guest_lookup( + const struct domain_setup_info *dsi, int type) { const char *xenguest_fallbacks[] = { [XEN_ELFNOTE_ENTRY] = "VIRT_ENTRY=", @@ -134,7 +135,8 @@ static const char *xen_guest_lookup(stru return p + strlen(fallback); } -static const char *xen_guest_string(struct domain_setup_info *dsi, int type) +static const char *xen_guest_string( + const struct domain_setup_info *dsi, int type) { const char *p = xen_guest_lookup(dsi, type); @@ -148,8 +150,8 @@ static const char *xen_guest_string(stru return p; } -static unsigned long long xen_guest_numeric(struct domain_setup_info *dsi, - int type, int *defined) +static unsigned long long xen_guest_numeric( + const struct domain_setup_info *dsi, int type, int *defined) { const char *p = xen_guest_lookup(dsi, type); unsigned long long value; @@ -175,19 +177,19 @@ static unsigned long long xen_guest_nume /* * Interface to the Xen ELF notes. */ -#define ELFNOTE_NAME(_n_) ((void*)(_n_) + sizeof(*(_n_))) +#define ELFNOTE_NAME(_n_) ((const void*)(_n_) + sizeof(*(_n_))) #define ELFNOTE_DESC(_n_) (ELFNOTE_NAME(_n_) + (((_n_)->namesz+3)&~3)) #define ELFNOTE_NEXT(_n_) (ELFNOTE_DESC(_n_) + (((_n_)->descsz+3)&~3)) -static int is_xen_elfnote_section(const char *image, Elf_Shdr *shdr) -{ - Elf_Note *note; +static int is_xen_elfnote_section(const char *image, const Elf_Shdr *shdr) +{ + const Elf_Note *note; if ( shdr->sh_type != SHT_NOTE ) return 0; - for ( note = (Elf_Note *)(image + shdr->sh_offset); - note < (Elf_Note *)(image + shdr->sh_offset + shdr->sh_size); + for ( note = (const Elf_Note *)(image + shdr->sh_offset); + note < (const Elf_Note *)(image + shdr->sh_offset + shdr->sh_size); note = ELFNOTE_NEXT(note) ) { if ( !strncmp(ELFNOTE_NAME(note), "Xen", 4) ) @@ -197,15 +199,16 @@ static int is_xen_elfnote_section(const return 0; } -static Elf_Note *xen_elfnote_lookup(struct domain_setup_info *dsi, int type) -{ - Elf_Note *note; +static const Elf_Note *xen_elfnote_lookup( + const struct domain_setup_info *dsi, int type) +{ + const Elf_Note *note; if ( !dsi->__elfnote_section ) return NULL; - for ( note = (Elf_Note *)dsi->__elfnote_section; - note < (Elf_Note *)dsi->__elfnote_section_end; + for ( note = (const Elf_Note *)dsi->__elfnote_section; + note < (const Elf_Note *)dsi->__elfnote_section_end; note = ELFNOTE_NEXT(note) ) { if ( strncmp(ELFNOTE_NAME(note), "Xen", 4) ) @@ -218,9 +221,9 @@ static Elf_Note *xen_elfnote_lookup(stru return NULL; } -const char *xen_elfnote_string(struct domain_setup_info *dsi, int type) -{ - Elf_Note *note; +const char *xen_elfnote_string(const struct domain_setup_info *dsi, int type) +{ + const Elf_Note *note; if ( !dsi->__elfnote_section ) return xen_guest_string(dsi, type); @@ -232,10 +235,10 @@ const char *xen_elfnote_string(struct do return (const char *)ELFNOTE_DESC(note); } -unsigned long long xen_elfnote_numeric(struct domain_setup_info *dsi, +unsigned long long xen_elfnote_numeric(const struct domain_setup_info *dsi, int type, int *defined) { - Elf_Note *note; + const Elf_Note *note; *defined = 0; @@ -252,10 +255,10 @@ unsigned long long xen_elfnote_numeric(s { case 4: *defined = 1; - return *(uint32_t*)ELFNOTE_DESC(note); + return *(const uint32_t*)ELFNOTE_DESC(note); case 8: *defined = 1; - return *(uint64_t*)ELFNOTE_DESC(note); + return *(const uint64_t*)ELFNOTE_DESC(note); default: xc_set_error(XC_INVALID_KERNEL, "elfnotes: unknown data size %#x for numeric type note %#x\n", @@ -268,9 +271,9 @@ static int parseelfimage(const char *ima unsigned long image_len, struct domain_setup_info *dsi) { - Elf_Ehdr *ehdr = (Elf_Ehdr *)image; - Elf_Phdr *phdr; - Elf_Shdr *shdr; + const Elf_Ehdr *ehdr = (const Elf_Ehdr *)image; + const Elf_Phdr *phdr; + const Elf_Shdr *shdr; Elf_Addr kernstart = ~0, kernend = 0, vaddr, virt_entry; const char *shstrtab, *p; int h, virt_base_defined, elf_pa_off_defined, virt_entry_defined; @@ -331,12 +334,13 @@ static int parseelfimage(const char *ima /* Look for .notes segment containing at least one Xen note */ for ( h = 0; h < ehdr->e_shnum; h++ ) { - shdr = (Elf_Shdr *)(image + ehdr->e_shoff + (h*ehdr->e_shentsize)); + shdr = (const Elf_Shdr *)( + image + ehdr->e_shoff + (h*ehdr->e_shentsize)); if ( !is_xen_elfnote_section(image, shdr) ) continue; - dsi->__elfnote_section = (void *)image + shdr->sh_offset; + dsi->__elfnote_section = (const void *)image + shdr->sh_offset; dsi->__elfnote_section_end = - (void *)image + shdr->sh_offset + shdr->sh_size; + (const void *)image + shdr->sh_offset + shdr->sh_size; break; } @@ -350,16 +354,18 @@ static int parseelfimage(const char *ima "ELF image has no section-header strings table."); return -EINVAL; } - shdr = (Elf_Shdr *)(image + ehdr->e_shoff + + shdr = (const Elf_Shdr *)(image + ehdr->e_shoff + (ehdr->e_shstrndx*ehdr->e_shentsize)); shstrtab = image + shdr->sh_offset; for ( h = 0; h < ehdr->e_shnum; h++ ) { - shdr = (Elf_Shdr *)(image + ehdr->e_shoff + (h*ehdr->e_shentsize)); + shdr = (const Elf_Shdr *)( + image + ehdr->e_shoff + (h*ehdr->e_shentsize)); if ( is_xen_guest_section(shdr, shstrtab) ) { - dsi->__xen_guest_string = (char *)image + shdr->sh_offset; + dsi->__xen_guest_string = + (const char *)image + shdr->sh_offset; break; } } @@ -442,8 +448,8 @@ static int parseelfimage(const char *ima * If we are using the modern ELF notes interface then the default * is 0. */ - dsi->elf_paddr_offset = - xen_elfnote_numeric(dsi, XEN_ELFNOTE_PADDR_OFFSET, &elf_pa_off_defined); + dsi->elf_paddr_offset = xen_elfnote_numeric(dsi, XEN_ELFNOTE_PADDR_OFFSET, + &elf_pa_off_defined); if ( !elf_pa_off_defined ) { if ( dsi->__elfnote_section ) @@ -462,7 +468,8 @@ static int parseelfimage(const char *ima for ( h = 0; h < ehdr->e_phnum; h++ ) { - phdr = (Elf_Phdr *)(image + ehdr->e_phoff + (h*ehdr->e_phentsize)); + phdr = (const Elf_Phdr *)( + image + ehdr->e_phoff + (h*ehdr->e_phentsize)); if ( !is_loadable_phdr(phdr) ) continue; vaddr = phdr->p_paddr - dsi->elf_paddr_offset + dsi->v_start; @@ -514,8 +521,8 @@ loadelfimage( const char *image, unsigned long elfsize, int xch, uint32_t dom, xen_pfn_t *parray, struct domain_setup_info *dsi) { - Elf_Ehdr *ehdr = (Elf_Ehdr *)image; - Elf_Phdr *phdr; + const Elf_Ehdr *ehdr = (const Elf_Ehdr *)image; + const Elf_Phdr *phdr; int h; char *va; @@ -523,7 +530,8 @@ loadelfimage( for ( h = 0; h < ehdr->e_phnum; h++ ) { - phdr = (Elf_Phdr *)(image + ehdr->e_phoff + (h*ehdr->e_phentsize)); + phdr = (const Elf_Phdr *)( + image + ehdr->e_phoff + (h*ehdr->e_phentsize)); if ( !is_loadable_phdr(phdr) ) continue; @@ -569,7 +577,8 @@ loadelfsymtab( const char *image, int xch, uint32_t dom, xen_pfn_t *parray, struct domain_setup_info *dsi) { - Elf_Ehdr *ehdr = (Elf_Ehdr *)image, *sym_ehdr; + const Elf_Ehdr *ehdr = (const Elf_Ehdr *)image; + Elf_Ehdr *sym_ehdr; Elf_Shdr *shdr; unsigned long maxva, symva; char *p; diff -r 42babffffba5 -r 58633caeece9 tools/libxc/xg_private.h --- a/tools/libxc/xg_private.h Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxc/xg_private.h Wed Jan 10 08:40:47 2007 -0700 @@ -146,7 +146,7 @@ struct domain_setup_info * You should use the xen_elfnote_* accessors below in order to * pickup the correct one and retain backwards compatibility. */ - void *__elfnote_section, *__elfnote_section_end; + const void *__elfnote_section, *__elfnote_section_end; const char *__xen_guest_string; }; @@ -162,14 +162,14 @@ typedef int (*loadimagefunc)(const char * in the note is returned and *defined is set to non-zero. If no such * note is found then *defined is set to 0 and 0 is returned. */ -extern unsigned long long xen_elfnote_numeric(struct domain_setup_info *dsi, +extern unsigned long long xen_elfnote_numeric(const struct domain_setup_info *dsi, int type, int *defined); /* * If an ELF note of the given type is found then the string contained * in the value is returned, otherwise NULL is returned. */ -extern const char * xen_elfnote_string(struct domain_setup_info *dsi, +extern const char * xen_elfnote_string(const struct domain_setup_info *dsi, int type); struct load_funcs diff -r 42babffffba5 -r 58633caeece9 tools/libxc/xg_save_restore.h --- a/tools/libxc/xg_save_restore.h Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxc/xg_save_restore.h Wed Jan 10 08:40:47 2007 -0700 @@ -53,8 +53,17 @@ static int get_platform_info(int xc_hand *hvirt_start = xen_params.virt_start; + /* + * XXX For now, 32bit dom0's can only save/restore 32bit domUs + * on 64bit hypervisors, so no need to check which type of domain + * we're dealing with. + */ if (strstr(xen_caps, "xen-3.0-x86_64")) +#if defined(__i386__) + *pt_levels = 3; +#else *pt_levels = 4; +#endif else if (strstr(xen_caps, "xen-3.0-x86_32p")) *pt_levels = 3; else if (strstr(xen_caps, "xen-3.0-x86_32")) @@ -101,12 +110,6 @@ static int get_platform_info(int xc_hand /* Number of entries in the pfn_to_mfn_frame_list_list */ #define P2M_FLL_ENTRIES (((max_pfn)+(fpp*fpp)-1)/(fpp*fpp)) -/* Current guests allow 8MB 'slack' in their P2M */ -#define NR_SLACK_ENTRIES ((8 * 1024 * 1024) / PAGE_SIZE) - -/* Is the given PFN within the 'slack' region at the top of the P2M? */ -#define IS_REAL_PFN(_pfn) ((max_pfn - (_pfn)) > NR_SLACK_ENTRIES) - /* Returns TRUE if the PFN is currently mapped */ #define is_mapped(pfn_type) (!((pfn_type) & 0x80000000UL)) diff -r 42babffffba5 -r 58633caeece9 tools/libxen/include/xen_cpu_feature.h --- a/tools/libxen/include/xen_cpu_feature.h Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxen/include/xen_cpu_feature.h Wed Jan 10 08:40:47 2007 -0700 @@ -198,12 +198,12 @@ enum xen_cpu_feature /** * AMD 3DNow! extensions */ - XEN_CPU_FEATURE_3DNOWEXT, + XEN_CPU_FEATURE_THREEDNOWEXT, /** * 3DNow! */ - XEN_CPU_FEATURE_3DNOW, + XEN_CPU_FEATURE_THREEDNOW, /** * CPU in recovery mode diff -r 42babffffba5 -r 58633caeece9 tools/libxen/src/xen_common.c --- a/tools/libxen/src/xen_common.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxen/src/xen_common.c Wed Jan 10 08:40:47 2007 -0700 @@ -373,11 +373,18 @@ static void server_error_2(xen_session * } -static bool is_container_node(xmlNode *n, char *type) +static bool is_node(xmlNode *n, char *type) { return n->type == XML_ELEMENT_NODE && - 0 == strcmp((char *)n->name, type) && + 0 == strcmp((char *)n->name, type); +} + + +static bool is_container_node(xmlNode *n, char *type) +{ + return + is_node(n, type) && n->children != NULL && n->children == n->last && n->children->type == XML_ELEMENT_NODE; @@ -390,13 +397,30 @@ static bool is_container_node(xmlNode *n */ static xmlChar *string_from_value(xmlNode *n, char *type) { - return - is_container_node(n, "value") && - 0 == strcmp((char *)n->children->name, type) ? - (n->children->children == NULL ? - xmlStrdup(BAD_CAST("")) : - xmlNodeGetContent(n->children->children)) : - NULL; + /* + <value><type>XYZ</type></value> is normal, but the XML-RPC spec also + allows <value>XYZ</value> where XYZ is to be interpreted as a string. + */ + + if (is_container_node(n, "value") && + 0 == strcmp((char *)n->children->name, type)) + { + return + n->children->children == NULL ? + xmlStrdup(BAD_CAST("")) : + xmlNodeGetContent(n->children->children); + } + else if (0 == strcmp(type, "string") && is_node(n, "value")) + { + return + n->children == NULL ? + xmlStrdup(BAD_CAST("")) : + xmlNodeGetContent(n->children); + } + else + { + return NULL; + } } @@ -557,8 +581,14 @@ static void parse_into(xen_session *s, x xmlChar *string = string_from_value(value_node, "double"); if (string == NULL) { +#if PERMISSIVE + fprintf(stderr, + "Expected a Float from the server, but didn't get one\n"); + ((double *)value)[slot] = 0.0; +#else server_error( s, "Expected a Float from the server, but didn't get one"); +#endif } else { diff -r 42babffffba5 -r 58633caeece9 tools/libxen/src/xen_cpu_feature.c --- a/tools/libxen/src/xen_cpu_feature.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/libxen/src/xen_cpu_feature.c Wed Jan 10 08:40:47 2007 -0700 @@ -62,8 +62,8 @@ static const char *lookup_table[] = "NX", "MMXEXT", "LM", - "3DNOWEXT", - "3DNOW", + "THREEDNOWEXT", + "THREEDNOW", "RECOVERY", "LONGRUN", "LRTI", diff -r 42babffffba5 -r 58633caeece9 tools/pygrub/src/pygrub --- a/tools/pygrub/src/pygrub Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/pygrub/src/pygrub Wed Jan 10 08:40:47 2007 -0700 @@ -13,7 +13,7 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # -import os, sys, string, struct, tempfile +import os, sys, string, struct, tempfile, re import copy import logging @@ -65,6 +65,15 @@ def get_active_offset(file): # the first partition P1 = 446 return struct.unpack("<L", buf[P1+8:P1+12])[0] * SECTOR_SIZE + +def open_fs(file): + offset = 0 + if is_disk_image(file): + offset = get_active_offset(file) + if offset == -1: + raise RuntimeError, "Unable to find active partition on disk" + + return fsimage.open(file, offset) class GrubLineEditor(curses.textpad.Textbox): def __init__(self, screen, startx, starty, line = ""): @@ -143,12 +152,12 @@ class GrubLineEditor(curses.textpad.Text class Grub: - def __init__(self, file, isconfig = False): + def __init__(self, file, fs = None): self.screen = None self.entry_win = None self.text_win = None if file: - self.read_config(file, isconfig) + self.read_config(file, fs) def draw_main_windows(self): if self.screen is None: #only init stuff once @@ -295,8 +304,8 @@ class Grub: # else, we cancelled and should just go back break - def read_config(self, fn, isConfig = False): - """Read the given file to parse the config. If isconfig, then + def read_config(self, fn, fs = None): + """Read the given file to parse the config. If fs = None, then we're being given a raw config file rather than a disk image.""" if not os.access(fn, os.R_OK): @@ -304,38 +313,25 @@ class Grub: self.cf = grub.GrubConf.GrubConfigFile() - if isConfig: + if not fs: # set the config file and parse it self.cf.filename = fn self.cf.parse() return - offset = 0 - if is_disk_image(fn): - offset = get_active_offset(fn) - if offset == -1: - raise RuntimeError, "Unable to find active partition on disk" - - # open the image and read the grub config - fs = fsimage.open(fn, offset) - - if fs is not None: - grubfile = None - for f in ("/boot/grub/menu.lst", "/boot/grub/grub.conf", - "/grub/menu.lst", "/grub/grub.conf"): - if fs.file_exists(f): - grubfile = f - break - if grubfile is None: - raise RuntimeError, "we couldn't find grub config file in the image provided." - f = fs.open_file(grubfile) - buf = f.read() - del f - del fs - # then parse the grub config - self.cf.parse(buf) - else: - raise RuntimeError, "Unable to read filesystem" + grubfile = None + for f in ("/boot/grub/menu.lst", "/boot/grub/grub.conf", + "/grub/menu.lst", "/grub/grub.conf"): + if fs.file_exists(f): + grubfile = f + break + if grubfile is None: + raise RuntimeError, "we couldn't find grub config file in the image provided." + f = fs.open_file(grubfile) + buf = f.read() + del f + # then parse the grub config + self.cf.parse(buf) def run(self): timeout = int(self.cf.timeout) @@ -431,19 +427,93 @@ def get_entry_idx(cf, entry): return None +def run_grub(file, entry, fs): + global g + global sel + + def run_main(scr, *args): + global sel + global g + sel = g.run() + + g = Grub(file, fs) + if interactive: + curses.wrapper(run_main) + else: + sel = g.cf.default + + # set the entry to boot as requested + if entry is not None: + idx = get_entry_idx(g.cf, entry) + if idx is not None and idx > 0 and idx < len(g.cf.images): + sel = idx + + if sel == -1: + print "No kernel image selected!" + sys.exit(1) + + img = g.cf.images[sel] + + grubcfg = { "kernel": None, "ramdisk": None, "args": None } + + grubcfg["kernel"] = img.kernel[1] + if img.initrd: + grubcfg["ramdisk"] = img.initrd[1] + if img.args: + grubcfg["args"] = img.args + + return grubcfg + +# If nothing has been specified, look for a Solaris domU. If found, perform the +# necessary tweaks. +def sniff_solaris(fs, cfg): + if not fs.file_exists("/platform/i86xen/kernel/unix"): + return cfg + + # darned python + longmode = (sys.maxint != 2147483647L) + if not longmode: + longmode = os.uname()[4] == "x86_64" + if not longmode: + if (os.access("/usr/bin/isainfo", os.R_OK) and + os.popen("/usr/bin/isainfo -b").read() == "64\n"): + longmode = True + + if not cfg["kernel"]: + cfg["kernel"] = "/platform/i86xen/kernel/unix" + cfg["ramdisk"] = "/platform/i86pc/boot_archive" + if longmode: + cfg["kernel"] = "/platform/i86xen/kernel/amd64/unix" + cfg["ramdisk"] = "/platform/i86pc/amd64/boot_archive" + + # Unpleasant. Typically we'll have 'root=foo -k' or 'root=foo /kernel -k', + # and we need to maintain Xen properties (root= and ip=) and the kernel + # before any user args. + + xenargs = "" + userargs = "" + + if not cfg["args"]: + cfg["args"] = cfg["kernel"] + else: + for arg in cfg["args"].split(): + if re.match("^root=", arg) or re.match("^ip=", arg): + xenargs += arg + " " + elif arg != cfg["kernel"]: + userargs += arg + " " + cfg["args"] = xenargs + " " + cfg["kernel"] + " " + userargs + + return cfg + if __name__ == "__main__": sel = None - def run_main(scr, *args): - global sel - sel = g.run() - def usage(): - print >> sys.stderr, "Usage: %s [-q|--quiet] [--output=] [--entry=] <image>" %(sys.argv[0],) + print >> sys.stderr, "Usage: %s [-q|--quiet] [--output=] [--kernel=] [--ramdisk=] [--args=] [--entry=] <image>" %(sys.argv[0],) try: opts, args = getopt.gnu_getopt(sys.argv[1:], 'qh::', - ["quiet", "help", "output=", "entry=", + ["quiet", "help", "output=", "entry=", "kernel=", "ramdisk=", "args=", "isconfig"]) except getopt.GetoptError: usage() @@ -458,6 +528,14 @@ if __name__ == "__main__": entry = None interactive = True isconfig = False + + # what was passed in + incfg = { "kernel": None, "ramdisk": None, "args": None } + # what grub or sniffing chose + chosencfg = { "kernel": None, "ramdisk": None, "args": None } + # what to boot + bootcfg = { "kernel": None, "ramdisk": None, "args": None } + for o, a in opts: if o in ("-q", "--quiet"): interactive = False @@ -466,6 +544,12 @@ if __name__ == "__main__": sys.exit() elif o in ("--output",): output = a + elif o in ("--kernel",): + incfg["kernel"] = a + elif o in ("--ramdisk",): + incfg["ramdisk"] = a + elif o in ("--args",): + incfg["args"] = a elif o in ("--entry",): entry = a # specifying the entry to boot implies non-interactive @@ -478,58 +562,42 @@ if __name__ == "__main__": else: fd = os.open(output, os.O_WRONLY) - g = Grub(file, isconfig) - if interactive: - curses.wrapper(run_main) - else: - sel = g.cf.default - - # set the entry to boot as requested - if entry is not None: - idx = get_entry_idx(g.cf, entry) - if idx is not None and idx > 0 and idx < len(g.cf.images): - sel = idx - - if sel == -1: - print "No kernel image selected!" - sys.exit(1) - - img = g.cf.images[sel] - print "Going to boot %s" %(img.title) - print " kernel: %s" %(img.kernel[1],) - if img.initrd: - print " initrd: %s" %(img.initrd[1],) - + # debug if isconfig: - print " args: %s" %(img.args,) + chosencfg = run_grub(file, entry) + print " kernel: %s" % chosencfg["kernel"] + if img.initrd: + print " initrd: %s" % chosencfg["ramdisk"] + print " args: %s" % chosencfg["args"] sys.exit(0) - - offset = 0 - if is_disk_image(file): - offset = get_active_offset(file) - if offset == -1: - raise RuntimeError, "Unable to find active partition on disk" - - # read the kernel and initrd onto the hostfs - fs = fsimage.open(file, offset) - - kernel = fs.open_file(img.kernel[1],).read() - (tfd, fn) = tempfile.mkstemp(prefix="boot_kernel.", + + fs = open_fs(file) + + chosencfg = sniff_solaris(fs, incfg) + + if not chosencfg["kernel"]: + chosencfg = run_grub(file, entry, fs) + + data = fs.open_file(chosencfg["kernel"]).read() + (tfd, bootcfg["kernel"]) = tempfile.mkstemp(prefix="boot_kernel.", dir="/var/run/xend/boot") - os.write(tfd, kernel) + os.write(tfd, data) os.close(tfd) - sxp = "linux (kernel %s)" %(fn,) - - if img.initrd: - initrd = fs.open_file(img.initrd[1],).read() - (tfd, fn) = tempfile.mkstemp(prefix="boot_ramdisk.", + + if chosencfg["ramdisk"]: + data = fs.open_file(chosencfg["ramdisk"],).read() + (tfd, bootcfg["ramdisk"]) = tempfile.mkstemp(prefix="boot_ramdisk.", dir="/var/run/xend/boot") - os.write(tfd, initrd) + os.write(tfd, data) os.close(tfd) - sxp += "(ramdisk %s)" %(fn,) else: initrd = None - sxp += "(args '%s')" %(img.args,) + + sxp = "linux (kernel %s)" % bootcfg["kernel"] + if bootcfg["ramdisk"]: + sxp += "(ramdisk %s)" % bootcfg["ramdisk"] + if chosencfg["args"]: + sxp += "(args \"%s\")" % chosencfg["args"] sys.stdout.flush() os.write(fd, sxp) diff -r 42babffffba5 -r 58633caeece9 tools/python/Makefile --- a/tools/python/Makefile Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/python/Makefile Wed Jan 10 08:40:47 2007 -0700 @@ -7,15 +7,29 @@ all: build .PHONY: build build: CC="$(CC)" CFLAGS="$(CFLAGS)" python setup.py build + if which $(MSGFMT) >/dev/null ; then \ + for file in `cd xen/xm; find messages -name xen-xm.po`; do \ + dest=`echo "build/$$file" | \ + sed -e 's#xen-xm.po#LC_MESSAGES/xen-xm.mo#'`; \ + mkdir -p `dirname "$$dest"`; \ + $(MSGFMT) -c -o "$$dest" "xen/xm/$$file"; \ + done; \ + fi .PHONY: install ifndef XEN_PYTHON_NATIVE_INSTALL -install: all +install: install-messages CC="$(CC)" CFLAGS="$(CFLAGS)" python setup.py install --home="$(DESTDIR)/usr" --prefix="" --force else -install: all +install: install-messages CC="$(CC)" CFLAGS="$(CFLAGS)" python setup.py install --root="$(DESTDIR)" --force endif + +install-messages: all + if which $(MSGFMT) >/dev/null ; then \ + mkdir -p "$(DESTDIR)/usr/share/locale"; \ + cp -R build/messages/* "$(DESTDIR)/usr/share/locale/"; \ + fi .PHONY: test test: diff -r 42babffffba5 -r 58633caeece9 tools/python/scripts/xapi.py --- a/tools/python/scripts/xapi.py Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/python/scripts/xapi.py Wed Jan 10 08:40:47 2007 -0700 @@ -41,6 +41,7 @@ COMMANDS = { COMMANDS = { 'host-info': ('', 'Get Xen Host Info'), 'host-set-name': ('', 'Set host name'), + 'pif-list': ('', 'List all PIFs'), 'sr-list': ('', 'List all SRs'), 'vbd-list': ('', 'List all VBDs'), 'vbd-create': ('<domname> <pycfg> [opts]', @@ -63,6 +64,15 @@ COMMANDS = { } OPTIONS = { + 'sr-list': [(('-l', '--long'), + {'action':'store_true', + 'help':'List all properties of SR'}) + ], + + 'vdi-list': [(('-l', '--long'), + {'action':'store_true', + 'help':'List all properties of VDI'}) + ], 'vm-list': [(('-l', '--long'), {'action':'store_true', 'help':'List all properties of VMs'}) @@ -145,7 +155,7 @@ def _connect(*args): def _connect(*args): global _server, _session, _initialised if not _initialised: - _server = ServerProxy('httpu:///var/run/xend/xmlrpc.sock') + _server = ServerProxy('httpu:///var/run/xend/xen-api.sock') login = raw_input("Login: ") password = getpass() creds = (login, password) @@ -361,29 +371,53 @@ def xapi_vbd_list(*args): print VBD_LIST_FORMAT % vbd_struct def xapi_vdi_list(*args): + opts, args = parse_args('vdi-list', args, set_defaults = True) + is_long = opts and opts.long + server, session = _connect() vdis = execute(server.VDI.get_all, session) - print VDI_LIST_FORMAT % {'name_label': 'VDI Label', - 'uuid' : 'UUID', - 'virtual_size': 'Sectors', - 'sector_size': 'Sector Size'} - - for vdi in vdis: - vdi_struct = execute(server.VDI.get_record, session, vdi) - print VDI_LIST_FORMAT % vdi_struct + if not is_long: + print VDI_LIST_FORMAT % {'name_label': 'VDI Label', + 'uuid' : 'UUID', + 'virtual_size': 'Sectors', + 'sector_size': 'Sector Size'} + + for vdi in vdis: + vdi_struct = execute(server.VDI.get_record, session, vdi) + print VDI_LIST_FORMAT % vdi_struct + + else: + + for vdi in vdis: + vdi_struct = execute(server.VDI.get_record, session, vdi) + pprint(vdi_struct) def xapi_sr_list(*args): + opts, args = parse_args('sr-list', args, set_defaults = True) + is_long = opts and opts.long + server, session = _connect() srs = execute(server.SR.get_all, session) - print SR_LIST_FORMAT % {'name_label': 'SR Label', - 'uuid' : 'UUID', - 'physical_size': 'Size', - 'type': 'Type'} - for sr in srs: - sr_struct = execute(server.SR.get_record, session, sr) - sr_struct['physical_size'] = int(sr_struct['physical_size'])/MB - print SR_LIST_FORMAT % sr_struct + if not is_long: + print SR_LIST_FORMAT % {'name_label': 'SR Label', + 'uuid' : 'UUID', + 'physical_size': 'Size (MB)', + 'type': 'Type'} + + for sr in srs: + sr_struct = execute(server.SR.get_record, session, sr) + sr_struct['physical_size'] = int(sr_struct['physical_size'])/MB + print SR_LIST_FORMAT % sr_struct + else: + for sr in srs: + sr_struct = execute(server.SR.get_record, session, sr) + pprint(sr_struct) + +def xapi_sr_rename(*args): + server, session = _connect() + sr = execute(server.SR.get_by_name_label, session, args[0]) + execute(server.SR.set_name_label, session, sr[0], args[1]) def xapi_vdi_create(*args): opts, args = parse_args('vdi-create', args) @@ -421,10 +455,11 @@ def xapi_vdi_rename(*args): if len(args) < 2: raise OptionError('Not enough arguments') - vdi_uuid = args[0] + vdi_uuid = execute(server.VDI.get_by_name_label, session, args[0]) vdi_name = args[1] - print 'Renaming VDI %s to %s' % (vdi_uuid, vdi_name) - result = execute(server.VDI.set_name_label, session, vdi_uuid, vdi_name) + + print 'Renaming VDI %s to %s' % (vdi_uuid[0], vdi_name) + result = execute(server.VDI.set_name_label, session, vdi_uuid[0], vdi_name) print 'Done.' @@ -447,6 +482,14 @@ def xapi_vtpm_create(*args): vtpm_rec = execute(server.VTPM.get_record, session, vtpm_uuid) print "Has vtpm record '%s'" % vtpm_rec + +def xapi_pif_list(*args): + server, session = _connect() + pif_uuids = execute(server.PIF.get_all, session) + for pif_uuid in pif_uuids: + pif = execute(server.PIF.get_record, session, pif_uuid) + print pif + # # Command Line Utils @@ -517,10 +560,12 @@ def usage(command = None, print_usage = print print 'Subcommands:' print - sorted_commands = sorted(COMMANDS.keys()) - for command in sorted_commands: - args, description = COMMANDS[command] - print '%-16s %-40s' % (command, description) + + for func in sorted(globals().keys()): + if func.startswith('xapi_'): + command = func[5:].replace('_', '-') + args, description = COMMANDS.get(command, ('', '')) + print '%-16s %-40s' % (command, description) print else: parse_args(command, ['-h']) @@ -549,7 +594,7 @@ def main(args): try: subcmd_func(*args[1:]) except XenAPIError, e: - print 'Error: %s' % str(e.args[1]) + print 'Error: %s' % str(e.args[0]) sys.exit(2) except OptionError, e: print 'Error: %s' % e diff -r 42babffffba5 -r 58633caeece9 tools/python/xen/lowlevel/acm/acm.c --- a/tools/python/xen/lowlevel/acm/acm.c Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/python/xen/lowlevel/acm/acm.c Wed Jan 10 08:40:47 2007 -0700 @@ -35,6 +35,8 @@ fprintf(stderr, "ERROR: " _m " (%d = %s) fprintf(stderr, "ERROR: " _m " (%d = %s)\n" , ## _a , \ errno, strerror(errno)) +static PyObject *acm_error_obj; + /* generic shared function */ void * __getssid(int domid, uint32_t *buflen) { @@ -80,28 +82,26 @@ static PyObject *policy(PyObject * self, { /* out */ char *policyreference; - PyObject *ret = NULL; + PyObject *ret; void *ssid_buffer; uint32_t buf_len; if (!PyArg_ParseTuple(args, "", NULL)) { - goto out1; + return NULL; } ssid_buffer = __getssid(0, &buf_len); - if (ssid_buffer == NULL) { - goto out1; - } else if (buf_len < sizeof(struct acm_ssid_buffer)) { - goto out2; - } else { + if (ssid_buffer == NULL || buf_len < sizeof(struct acm_ssid_buffer)) { + free(ssid_buffer); + return PyErr_SetFromErrno(acm_error_obj); + } + else { struct acm_ssid_buffer *ssid = (struct acm_ssid_buffer *)ssid_buffer; policyreference = (char *)(ssid_buffer + ssid->policy_reference_offset + sizeof (struct acm_policy_reference_buffer)); - } - ret = Py_BuildValue("s", policyreference); - out2: - free(ssid_buffer); - out1: - return ret; + ret = Py_BuildValue("s", policyreference); + free(ssid_buffer); + return ret; + } } @@ -213,5 +213,8 @@ static PyMethodDef acmMethods[] = { /* inits */ PyMODINIT_FUNC initacm(void) { - Py_InitModule("acm", acmMethods); -} + PyObject *m = Py_InitModule("acm", acmMethods); + acm_error_obj = PyErr_NewException("acm.Error", PyExc_RuntimeError, NULL); + Py_INCREF(acm_error_obj); + PyModule_AddObject(m, "Error", acm_error_obj); +} diff -r 42babffffba5 -r 58633caeece9 tools/python/xen/util/Brctl.py --- a/tools/python/xen/util/Brctl.py Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/python/xen/util/Brctl.py Wed Jan 10 08:40:47 2007 -0700 @@ -27,6 +27,31 @@ def cmd(p, s): if opts.verbose: print c if not opts.dryrun: os.system(c) + +bridgeRE = re.compile(r'([^\t]*)\t*[^\t]*\t*[^\t]*\t*([^\t]*)') +def get_state(): + fin = os.popen(CMD_BRCTL + ' show', 'r') + try: + bridges = {} + brlist = None + brname = None + first = True + for line in fin: + if first: + first = False + elif line[0] == '\t': + brlist.append(line.strip()) + else: + if brname: + bridges[brname] = brlist + m = bridgeRE.match(line) + brname = m.group(1) + brlist = [m.group(2).strip()] + if brname: + bridges[brname] = brlist + return bridges + finally: + fin.close() def vif_bridge_add(params): """Add the network interface for vif on dom to a bridge. diff -r 42babffffba5 -r 58633caeece9 tools/python/xen/util/security.py --- a/tools/python/xen/util/security.py Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/python/xen/util/security.py Wed Jan 10 08:40:47 2007 -0700 @@ -115,7 +115,7 @@ def get_security_info(info, field): if isinstance(info, dict): security = info['security'] elif isinstance(info, list): - security = sxp.child_value(info, 'security', ) + security = sxp.child_value(info, 'security') if not security: if field == 'ssidref': #return default ssid @@ -357,7 +357,7 @@ def refresh_ssidref(config): if isinstance(config, dict): security = config['security'] elif isinstance(config, list): - security = sxp.child_value(config, 'security',) + security = sxp.child_value(config, 'security') else: err("Instance type of config parameter not supported.") if not security: @@ -637,11 +637,11 @@ def res_security_check(resource, domain_ """ rtnval = 1 - #build canonical resource name - resource = unify_resname(resource) - # if security is on, ask the hypervisor for a decision if on(): + #build canonical resource name + resource = unify_resname(resource) + (label, ssidref, policy) = get_res_security_details(resource) domac = ['access_control'] domac.append(['policy', active_policy]) @@ -660,6 +660,8 @@ def res_security_check(resource, domain_ # security is off, make sure resource isn't labeled else: + # Note, we can't canonicalise the resource here, because people using + # xm without ACM are free to use relative paths. (label, policy) = get_res_label(resource) if policy != 'NULL': raise ACMError("Security is off, but '"+resource+"' is labeled") diff -r 42babffffba5 -r 58633caeece9 tools/python/xen/util/xmlrpclib2.py --- a/tools/python/xen/util/xmlrpclib2.py Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/python/xen/util/xmlrpclib2.py Wed Jan 10 08:40:47 2007 -0700 @@ -20,6 +20,7 @@ An enhanced XML-RPC client/server interf An enhanced XML-RPC client/server interface for Python. """ +import re import string import fcntl from types import * @@ -49,13 +50,15 @@ except ImportError: def stringify(value): - if isinstance(value, IntType) and not isinstance(value, BooleanType): + if isinstance(value, float) or \ + isinstance(value, long) or \ + (isinstance(value, int) and not isinstance(value, bool)): return str(value) - elif isinstance(value, DictType): + elif isinstance(value, dict): for k, v in value.items(): value[k] = stringify(v) return value - elif isinstance(value, (TupleType, ListType)): + elif isinstance(value, (tuple, list)): return [stringify(v) for v in value] else: return value @@ -163,8 +166,10 @@ class TCPXMLRPCServer(SocketServer.Threa class TCPXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer): allow_reuse_address = True - def __init__(self, addr, allowed, requestHandler=None, + def __init__(self, addr, allowed, xenapi, requestHandler=None, logRequests = 1): + self.xenapi = xenapi + if requestHandler is None: requestHandler = XMLRPCRequestHandler SimpleXMLRPCServer.__init__(self, addr, @@ -182,7 +187,7 @@ class TCPXMLRPCServer(SocketServer.Threa flags |= fcntl.FD_CLOEXEC fcntl.fcntl(client.fileno(), fcntl.F_SETFD, flags) return (client, addr) - + def _marshaled_dispatch(self, data, dispatch_method = None): params, method = xmlrpclib.loads(data) if False: @@ -214,12 +219,29 @@ class TCPXMLRPCServer(SocketServer.Threa except xmlrpclib.Fault, fault: response = xmlrpclib.dumps(fault) except Exception, exn: - import xen.xend.XendClient - log.exception(exn) - response = xmlrpclib.dumps( - xmlrpclib.Fault(xen.xend.XendClient.ERROR_INTERNAL, str(exn))) - + if self.xenapi: + if _is_not_supported(exn): + errdesc = ['MESSAGE_METHOD_UNKNOWN', method] + else: + log.exception('Internal error handling %s', method) + errdesc = ['INTERNAL_ERROR', str(exn)] + response = xmlrpclib.dumps( + ({ "Status": "Failure", + "ErrorDescription": errdesc },), + methodresponse = 1) + else: + log.exception('Internal error handling %s', method) + import xen.xend.XendClient + response = xmlrpclib.dumps( + xmlrpclib.Fault(xen.xend.XendClient.ERROR_INTERNAL, str(exn))) return response + + +notSupportedRE = re.compile(r'method "(.*)" is not supported') +def _is_not_supported(exn): + m = notSupportedRE.search(exn[0]) + return m is not None + # This is a XML-RPC server that sits on a Unix domain socket. # It implements proper support for allow_reuse_address by @@ -235,10 +257,10 @@ class UnixXMLRPCServer(TCPXMLRPCServer): class UnixXMLRPCServer(TCPXMLRPCServer): address_family = socket.AF_UNIX - def __init__(self, addr, allowed, logRequests = 1): + def __init__(self, addr, allowed, xenapi, logRequests = 1): mkdir.parents(os.path.dirname(addr), stat.S_IRWXU, True) if self.allow_reuse_address and os.path.exists(addr): os.unlink(addr) - TCPXMLRPCServer.__init__(self, addr, allowed, + TCPXMLRPCServer.__init__(self, addr, allowed, xenapi, UnixXMLRPCRequestHandler, logRequests) diff -r 42babffffba5 -r 58633caeece9 tools/python/xen/xend/XendAPI.py --- a/tools/python/xen/xend/XendAPI.py Wed Jan 10 08:00:50 2007 -0700 +++ b/tools/python/xen/xend/XendAPI.py Wed Jan 10 08:40:47 2007 -0700 @@ -15,11 +15,16 @@ # Copyright (C) 2006 XenSource Ltd. #============================================================================ +import inspect +import os +import string +import sys +import traceback + from xen.xend import XendDomain, XendDomainInfo, XendNode from xen.xend import XendLogging from xen.xend.XendAuthSessions import instance as auth_manager -from xen.xend.XendAuthSessions import session_required from xen.xend.XendError import * from xen.xend.XendClient import ERROR_INVALID_DOMAIN from xen.xend.XendLogging import log @@ -30,13 +35,19 @@ AUTH_NONE = 'none' AUTH_NONE = 'none' AUTH_PAM = 'pam' +argcounts = {} + # ------------------------------------------ # Utility Methods for Xen API Implementation # ------------------------------------------ def xen_api_success(value): """Wraps a return value in XenAPI format.""" - return {"Status": "Success", "Value": stringify(value)} + if value is None: + s = '' + else: + s = stringify(value) + return {"Status": "Success", "Value": s} def xen_api_success_void(): """Return success, but caller expects no return value.""" @@ -44,7 +55,16 @@ def xen_api_success_void(): def xen_api_error(error): """Wraps an error value in XenAPI format.""" - return {"Status": "Error", "ErrorDescription": error} + if type(error) == tuple: + error = list(error) + if type(error) != list: + error = [error] + if len(error) == 0: + error = ['INTERNAL_ERROR', 'Empty list given to xen_api_error'] + + return { "Status": "Failure", + "ErrorDescription": [str(x) for x in error] } + def xen_api_todo(): """Temporary method to make sure we track down all the TODOs""" @@ -68,186 +88,164 @@ def trace(func, api_name = ''): trace_func.api = api_name return trace_func -def valid_host(func): - """Decorator to verify if host_ref is valid before calling - method. - - @param func: function with params: (self, session, host_ref) + +def catch_typeerror(func): + """Decorator to catch any TypeErrors and translate them into Xen-API + errors. + + @param func: function with params: (self, ...) + @rtype: callable object + """ + def f(self, *args, **kwargs): + try: + return func(self, *args, **kwargs) + except TypeError, exn: + #log.exception('catch_typeerror') + if hasattr(func, 'api') and func.api in argcounts: + # Assume that if the exception was thrown inside this + # file, then it is due to an invalid call from the client, + # but if it was thrown elsewhere, then it's an internal + # error (which will be handled further up). + tb = sys.exc_info()[2] + try: + sourcefile = traceback.extract_tb(tb)[-1][0] + if sourcefile == inspect.getsourcefile(XendAPI): + return xen_api_error( + ['MESSAGE_PARAMETER_COUNT_MISMATCH', + func.api, argcounts[func.api], + len(args) + len(kwargs)]) + finally: + del tb + raise + + return f + + +def session_required(func): + """Decorator to verify if session is valid before calling method. + + @param func: function with params: (self, session, ...) @rtype: callable object """ - def check_host_ref(self, session, host_ref, *args, **kwargs): - xennode = XendNode.instance() - if type(host_ref) == type(str()) and xennode.is_valid_host(host_ref): - return func(self, session, host_ref, *args, **kwargs) + def check_session(self, session, *args, **kwargs): + if auth_manager().is_session_valid(session): + return func(self, session, *args, **kwargs) else: - return {'Status': 'Failure', - 'ErrorDescription': XEND_ERROR_HOST_INVALID} - - # make sure we keep the 'api' attribute - if hasattr(func, 'api'): - check_host_ref.api = func.api - - return check_host_ref + return xen_api_error(['SESSION_INVALID', session]) + + return check_session + + +def _is_valid_ref(ref, validator): + return type(ref) == str and validator(ref) + +def _check_ref(validator, errcode, func, api, session, ref, *args, **kwargs): + if _is_valid_ref(ref, validator): + return func(api, session, ref, *args, **kwargs) + else: + return xen_api_error([errcode, ref]) + + +def valid_host(func): + """Decorator to verify if host_ref is valid before calling method. + + @param func: function with params: (self, session, host_ref, ...) + @rtype: callable object + """ + return lambda *args, **kwargs: \ + _check_ref(XendNode.instance().is_valid_host, + 'HOST_HANDLE_INVALID', func, *args, **kwargs) def valid_host_cpu(func): - """Decorator to verify if host_cpu_ref is valid before calling - method. - - @param func: function with params: (self, session, host_cpu_ref) + """Decorator to verify if host_cpu_ref is valid before calling method. + + @param func: function with params: (self, session, host_cpu_ref, ...) @rtype: callable object """ - def check_host_cpu_ref(self, session, host_cpu_ref, *args, **kwargs): - xennode = XendNode.instance() - if type(host_cpu_ref) == type(str()) and \ - xennode.is_valid_cpu(host_cpu_ref): - return func(self, session, host_cpu_ref, *args, **kwargs) - else: - return {'Status': 'Failure', - 'ErrorDescription': XEND_ERROR_HOST_CPU_INVALID} - - # make sure we keep the 'api' attribute - if hasattr(func, 'api'): - check_host_cpu_ref.api = func.api - - return check_host_cpu_ref + return lambda *args, **kwargs: \ + _check_ref(XendNode.instance().is_valid_cpu, + 'HOST_CPU_HANDLE_INVALID', func, *args, **kwargs) def valid_vm(func): - """Decorator to verify if vm_ref is valid before calling - method. - - @param func: function with params: (self, session, vm_ref) + """Decorator to verify if vm_ref is valid before calling method. + + @param func: function with params: (self, session, vm_ref, ...) @rtype: callable object """ - def check_vm_ref(self, session, *args, **kwargs): - if len(args) == 0: - return {'Status': 'Failure', - 'ErrorDescription': XEND_ERROR_VM_INVALID} - - vm_ref = args[0] - xendom = XendDomain.instance() - if type(vm_ref) == type(str()) and \ - xendom.is_valid_vm(vm_ref): - return func(self, session, *args, **kwargs) - else: - return {'Status': 'Failure', - 'ErrorDescription': XEND_ERROR_VM_INVALID} - - # make sure we keep the 'api' attribute - if hasattr(func, 'api'): - check_vm_ref.api = func.api - - return check_vm_ref - -def valid_vbd(func): - """Decorator to verify if vbd_ref is valid before calling - method. - - @param func: function with params: (self, session, vbd_ref) + return lambda *args, **kwargs: \ + _check_ref(XendDomain.instance().is_valid_vm, + 'VM_HANDLE_INVALID', func, *args, **kwargs) + +def valid_network(func): + """Decorator to verify if network_ref is valid before calling method. + + @param func: function with params: (self, session, network_ref, ...) @rtype: callable object """ - def check_vbd_ref(self, session, vbd_ref, *args, **kwargs): - xendom = XendDomain.instance() - if type(vbd_ref) == type(str()) and \ - xendom.is_valid_dev('vbd', vbd_ref): - return func(self, session, vbd_ref, *args, **kwargs) - else: - return {'Status': 'Failure', - 'ErrorDescription': XEND_ERROR_VBD_INVALID} - - # make sure we keep the 'api' attribute - if hasattr(func, 'api'): - check_vbd_ref.api = func.api - - return check_vbd_ref + return lambda *args, **kwargs: \ + _check_ref(XendNode.instance().is_valid_network, + 'NETWORK_HANDLE_INVALID', func, *args, **kwargs) + +def valid_vbd(func): + """Decorator to verify if vbd_ref is valid before calling method. + + @param func: function with params: (self, session, vbd_ref, ...) + @rtype: callable object + """ + return lambda *args, **kwargs: \ + _check_ref(lambda r: XendDomain.instance().is_valid_dev('vbd', r), + 'VBD_HANDLE_INVALID', func, *args, **kwargs) def valid_vif(func): - """Decorator to verify if vif_ref is valid before calling - method. - - @param func: function with params: (self, session, vif_ref) + """Decorator to verify if vif_ref is valid before calling method. + + @param func: function with params: (self, session, vif_ref, ...) @rtype: callable object """ - def check_vif_ref(self, session, vif_ref, *args, **kwargs): - xendom = XendDomain.instance() - if type(vif_ref) == type(str()) and \ - xendom.is_valid_dev('vif', vif_ref): - return func(self, session, vif_ref, *args, **kwargs) - else: - return {'Status': 'Failure', - 'ErrorDescription': XEND_ERROR_VIF_INVALID} - - # make sure we keep the 'api' attribute - if hasattr(func, 'api'): - check_vif_ref.api = func.api - - return check_vif_ref - + return lambda *args, **kwargs: \ + _check_ref(lambda r: XendDomain.instance().is_valid_dev('vif', r), + 'VIF_HANDLE_INVALID', func, *args, **kwargs) def valid_vdi(func): - """Decorator to verify if vdi_ref is valid before calling - method. - - @param func: function with params: (self, session, vdi_ref) + """Decorator to verify if vdi_ref is valid before calling method. + + @param func: function with params: (self, session, vdi_ref, ...) @rtype: callable object """ - def check_vdi_ref(self, session, vdi_ref, *args, **kwargs): - xennode = XendNode.instance() - if type(vdi_ref) == type(str()) and \ - xennode.get_sr().is_valid_vdi(vdi_ref): - return func(self, session, vdi_ref, *args, **kwargs) - else: - return {'Status': 'Failure', - 'ErrorDescription': XEND_ERROR_VDI_INVALID} - - # make sure we keep the 'api' attribute - if hasattr(func, 'api'): - check_vdi_ref.api = func.api - - return check_vdi_ref + return lambda *args, **kwargs: \ + _check_ref(XendNode.instance().get_sr().is_valid_vdi, + 'VDI_HANDLE_INVALID', func, *args, **kwargs) def valid_vtpm(func): - """Decorator to verify if vtpm_ref is valid before calling - method. - - @param func: function with params: (self, session, vtpm_ref) + """Decorator to verify if vtpm_ref is valid before calling method. + + @param func: function with params: (self, session, vtpm_ref, ...) @rtype: callable object """ - def check_vtpm_ref(self, session, vtpm_ref, *args, **kwargs): - xendom = XendDomain.instance() - if type(vtpm_ref) == type(str()) and \ - xendom.is_valid_dev('vtpm', vtpm_ref): - return func(self, session, vtpm_ref, *args, **kwargs) - else: - return {'Status': 'Failure', - 'ErrorDescription': XEND_ERROR_VTPM_INVALID} - - # make sure we keep the 'api' attribute - if hasattr(func, 'api'): - check_vtpm_ref.api = func.api - - return check_vtpm_ref + return lambda *args, **kwargs: \ + _check_ref(lambda r: XendDomain.instance().is_valid_dev('vtpm', r), + 'VTPM_HANDLE_INVALID', func, *args, **kwargs) def valid_sr(func): + """Decorator to verify if sr_ref is valid before calling method. + + @param func: function with params: (self, session, sr_ref, ...) + @rtype: callable object + """ + return lambda *args, **kwargs: \ + _check_ref(lambda r: XendNode.instance().get_sr().uuid == r, + 'SR_HANDLE_INVALID', func, *args, **kwargs) + +def valid_pif(func): """Decorator to verify if sr_ref is valid before calling method. @param func: function with params: (self, session, sr_ref) @rtype: callable object """ - def check_sr_ref(self, session, sr_ref, *args, **kwargs): - xennode = XendNode.instance() - if type(sr_ref) == type(str()) and \ - xennode.get_sr().uuid == sr_ref: - return func(self, session, sr_ref, *args, **kwargs) - else: - return {'Status': 'Failure', - 'ErrorDescription': XEND_ERROR_SR_INVALID} - - # make sure we keep the 'api' attribute - if hasattr(func, 'api'): - check_sr_ref.api = func.api - - return check_sr_ref + return lambda *args, **kwargs: \ + _check_ref(lambda r: r in XendNode.instance().pifs, + 'PIF_HANDLE_INVALID', func, *args, **kwargs) # ----------------------------- # Bridge to Legacy XM API calls @@ -263,10 +261,14 @@ def do_vm_func(fn_name, vm_ref, *args, * @param *args: more arguments @type *args: tuple """ - xendom = XendDomain.instance() - fn = getattr(xendom, fn_name) - xendom.do_legacy_api_with_uuid(fn, vm_ref, *args, **kwargs) - return xen_api_success_void() + try: + xendom = XendDomain.instance() + fn = getattr(xendom, fn_name) + xendom.do_legacy_api_with_uuid(fn, vm_ref, *args, **kwargs) + return xen_api_success_void() + except VMBadState, exn: + return xen_api_error(['VM_BAD_POWER_STATE', vm_ref, exn.expected, + exn.actual]) class XendAPI: @@ -274,7 +276,7 @@ class XendAPI: used via XMLRPCServer. All methods that need a valid session are marked with - a L{XendAuthManager.session_required} decorator that will + a L{session_required} decorator that will transparently perform the required session authentication. We need to support Python <2.4, so we use the old decorator syntax. @@ -284,109 +286,13 @@ class XendAPI: """ def __init__(self, auth): - """Initialised Xen API wrapper by making sure all functions - have the correct validation decorators such as L{valid_host} - and L{session_required}. - """ self.auth = auth - - classes = { - 'session': (session_required,), - 'host': (valid_host, session_required), - 'host_cpu': (valid_host_cpu, session_required), - 'VM': (valid_vm, session_required), - 'VBD': (valid_vbd, session_required), - 'VIF': (valid_vif, session_required), - 'VDI': (valid_vdi, session_required), - 'VTPM':(valid_vtpm, session_required), - 'SR': (valid_sr, session_required)} - - # Cheat methods - # ------------- - # Methods that have a trivial implementation for all classes. - # 1. get_by_uuid == getting by ref, so just return uuid for - # all get_by_uuid() methods. - - for cls in classes.keys(): - get_by_uuid = '%s_get_by_uuid' % cls - get_uuid = '%s_get_uuid' % cls - setattr(XendAPI, get_by_uuid, - lambda s, sess, obj_ref: xen_api_success(obj_ref)) - setattr(XendAPI, get_uuid, - lambda s, sess, obj_ref: xen_api_success(obj_ref)) - - # 2. get_record is just getting all the attributes, so provide - # a fake template implementation. - # - # TODO: ... - - - # Wrapping validators around XMLRPC calls - # --------------------------------------- - - for cls, validators in classes.items(): - ro_attrs = getattr(self, '%s_attr_ro' % cls, []) - rw_attrs = getattr(self, '%s_attr_rw' % cls, []) - methods = getattr(self, '%s_methods' % cls, []) - funcs = getattr(self, '%s_funcs' % cls, []) - - # wrap validators around readable class attributes - for attr_name in ro_attrs + rw_attrs + self.Base_attr_ro: - getter_name = '%s_get_%s' % (cls, attr_name) - try: - getter = getattr(XendAPI, getter_name) - for validator in validators: - getter = validator(getter) - getter.api = '%s.get_%s' % (cls, attr_name) - setattr(XendAPI, getter_name, getter) - except AttributeError: - pass - #log.warn("API call: %s not found" % getter_name) - - # wrap validators around writable class attrributes - for attr_name in rw_attrs + self.Base_attr_rw: - setter_name = '%s_set_%s' % (cls, attr_name) - try: - setter = getattr(XendAPI, setter_name) - for validator in validators: - setter = validator(setter) - setter.api = '%s.set_%s' % (cls, attr_name) - setattr(XendAPI, setter_name, setter) - except AttributeError: - pass - #log.warn("API call: %s not found" % setter_name) - - # wrap validators around methods - for method_name in methods + self.Base_methods: - method_full_name = '%s_%s' % (cls, method_name) - - try: - method = getattr(XendAPI, method_full_name) - for validator in validators: - method = validator(method) - method.api = '%s.%s' % (cls, method_name) - setattr(XendAPI, method_full_name, method) - except AttributeError: - pass - #log.warn('API call: %s not found' % method_full_name) - - # wrap validators around class functions - for func_name in funcs + self.Base_funcs: - func_full_name = '%s_%s' % (cls, func_name) - try: - method = getattr(XendAPI, func_full_name) - method = session_required(method) - method.api = '%s.%s' % (cls, func_name) - setattr(XendAPI, func_full_name, method) - except AttributeError: - pass - #log.warn('API call: %s not found' % func_full_name) Base_attr_ro = ['uuid'] Base_attr_rw = [] - Base_methods = ['destroy', 'get_record'] - Base_funcs = ['create', 'get_by_uuid', 'get_all'] + Base_methods = ['destroy', 'get_by_uuid', 'get_record'] + Base_funcs = ['create', 'get_all'] # Xen API: Class Session # ---------------------------------------------------------------- @@ -396,14 +302,20 @@ class XendAPI: session_methods = ['logout'] # session_funcs = ['login_with_password'] - def session_login_with_password(self, username, password): + def session_login_with_password(self, *args): + if len(args) != 2: + return xen_api_error( + ['MESSAGE_PARAMETER_COUNT_MISMATCH', + 'session.login_with_password', 2, len(args)]) + username = args[0] + password = args[1] try: session = (self.auth == AUTH_NONE and auth_manager().login_unconditionally(username) or auth_manager().login_with_password(username, password)) return xen_api_success(session) except XendError, e: - return xen_api_error(XEND_ERROR_AUTHENTICATION_FAILED) + return xen_api_error(['SESSION_AUTHENTICATION_FAILED']) session_login_with_password.api = 'session.login_with_password' @@ -425,7 +337,7 @@ class XendAPI: user = auth_manager().get_user(session) if user: return xen_api_success(user) - return xen_api_error(XEND_ERROR_SESSION_INVALID) + return xen_api_error(['SESSION_INVALID', session]) # Xen API: Class User @@ -548,17 +460,155 @@ class XendAPI: return xen_api_error(XEND_ERROR_UNSUPPORTED) - # Xen API: Class Network + # Xen API: Class network # ---------------------------------------------------------------- - # TODO: NOT IMPLEMENTED - - Network_attr_ro = ['VIFs'] - Network_attr_rw = ['name_label', + + network_attr_ro = ['VIFs', 'PIFs'] + network_attr_rw = ['name_label', 'name_description', - 'NIC', - 'VLAN', 'default_gateway', 'default_netmask'] + + def network_create(self, _, name_label, name_description, + default_gateway, default_netmask): + return xen_api_success( + XendNode.instance().network_create(name_label, name_description, + default_gateway, + default_netmask)) + + def network_destroy(self, _, ref): + return xen_api_success(XendNode.instance().network_destroy(ref)) + + def _get_network(self, ref): + return XendNode.instance().get_network(ref) + + def network_get_all(self, _): + return xen_api_success(XendNode.instance().get_network_refs()) + + def network_get_record(self, _, ref): + return xen_api_success( + XendNode.instance().get_network(ref).get_record()) + + def network_get_name_label(self, _, ref): + return xen_api_success(self._get_network(ref).name_label) + + def network_get_name_description(self, _, ref): + return xen_api_success(self._get_network(ref).name_description) + + def network_get_default_gateway(self, _, ref): + return xen_api_success(self._get_network(ref).default_gateway) + + def network_get_default_netmask(self, _, ref): + return xen_api_success(self._get_network(ref).default_netmask) + + def network_get_VIFs(self, _, ref): + return xen_api_success(self._get_network(ref).get_VIF_UUIDs()) + + def network_get_PIFs(self, session, ref): + return xen_api_success(self._get_network(ref).get_PIF_UUIDs()) + + def network_set_name_label(self, _, ref, val): + return xen_api_success(self._get_network(ref).set_name_label(val)) + + def network_set_name_description(self, _, ref, val): + return xen_api_success(self._get_network(ref).set_name_description(val)) + + def network_set_default_gateway(self, _, ref, val): + return xen_api_success(self._get_network(ref).set_default_gateway(val)) + + def network_set_default_netmask(self, _, ref, val): + return xen_api_success(self._get_network(ref).set_default_netmask(val)) + + + # Xen API: Class PIF + # ---------------------------------------------------------------- + + PIF_attr_ro = ['io_read_kbs', + 'io_write_kbs'] + PIF_attr_rw = ['name', + 'network', + 'host', + 'MAC', + 'MTU', + 'VLAN'] + + PIF_attr_inst = PIF_attr_rw + + PIF_methods = ['create_VLAN'] + + def _get_PIF(self, ref): + return XendNode.instance().pifs[ref] + + def PIF_create(self, _, name, network_uuid, host_uuid, mac, mtu, vlan): + try: + node = XendNode.instance() + if host_uuid != node.uuid: + return xen_api_error(['HOST_HANDLE_INVALID', host_uuid]) + + elif _is_valid_ref(network_uuid, node.is_valid_network): + network = node.get_network(network_uuid) + return xen_api_success(node.PIF_create(name, mtu, vlan, mac, + network)) + else: + return xen_api_error(['NETWORK_HANDLE_INVALID', network_uuid]) + except NetworkAlreadyConnected, exn: + return xen_api_error(['NETWORK_ALREADY_CONNECTED', + network_uuid, exn.pif_uuid]) + + def PIF_destroy(self, _, ref): + return xen_api_success(XendNode.instance().PIF_destroy(ref)) + + # object methods + def PIF_get_record(self, _, ref): + return xen_api_success(self._get_PIF(ref).get_record()) + + def PIF_get_all(self, _): + return xen_api_success(XendNode.instance().pifs.keys()) + + def PIF_get_name(self, _, ref): + return xen_api_success(self._get_PIF(ref).name) + + def PIF_get_network(self, _, ref): + return xen_api_success(self._get_PIF(ref).network.uuid) + + def PIF_get_host(self, _, ref): + return xen_api_success(self._get_PIF(ref).host.uuid) + + def PIF_get_MAC(self, _, ref): + return xen_api_success(self._get_PIF(ref).mac) + + def PIF_get_MTU(self, _, ref): + return xen_api_success(self._get_PIF(ref).mtu) + + def PIF_get_VLAN(self, _, ref): + return xen_api_success(self._get_PIF(ref).vlan) + + def PIF_get_io_read_kbs(self, _, ref): + return xen_api_success(self._get_PIF(ref).get_io_read_kbs()) + + def PIF_get_io_write_kbs(self, _, ref): + return xen_api_success(self._get_PIF(ref).get_io_write_kbs()) + + def PIF_set_name(self, _, ref, name): + return xen_api_success(self._get_PIF(ref).set_name(name)) + + def PIF_set_MAC(self, _, ref, mac): + return xen_api_success(self._get_PIF(ref).set_mac(mac)) + + def PIF_set_MTU(self, _, ref, mtu): + return xen_api_success(self._get_PIF(ref).set_mtu(mtu)) + + def PIF_create_VLAN(self, _, ref, network, vlan): + try: + if _is_valid_ref(network, XendNode.instance().is_valid_network): + return xen_api_success(XendNode.instance().PIF_create_VLAN( + ref, network, vlan)) + else: + return xen_api_error(['NETWORK_HANDLE_INVALID', network]) + except NetworkAlreadyConnected, exn: + return xen_api_error(['NETWORK_ALREADY_CONNECTED', + network, exn.pif_uuid]) + # Xen API: Class VM # ---------------------------------------------------------------- @@ -833,55 +883,55 @@ class XendAPI: dom.setName(label) return xen_api_success_void() - def VM_set_name_description(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_user_version(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_is_a_template(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_memory_dynamic_max(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_memory_dynamic_min(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_VCPUs_policy(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_VCPUs_params(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_VCPUs_features_force_on(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_VCPUs_features_force_off(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_actions_after_shutdown(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() - - def VM_set_actions_after_reboot(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |