debuggers.hg

changeset 26:dec845b4d9c3

Refresh to unstable C/S 19569
author Mukesh Rathor
date Thu Apr 23 18:49:41 2009 -0700 (2009-04-23)
parents 7952b2e658f3
children 15aae9638f74
files Config.mk Makefile config/NetBSD.mk config/StdGNU.mk docs/misc/vtd.txt docs/src/user.tex extras/mini-os/arch/ia64/mm.c extras/mini-os/arch/x86/ioremap.c extras/mini-os/arch/x86/mm.c extras/mini-os/arch/x86/setup.c extras/mini-os/blkfront.c extras/mini-os/events.c extras/mini-os/include/blkfront.h extras/mini-os/include/ioremap.h extras/mini-os/include/mm.h extras/mini-os/include/x86/arch_mm.h extras/mini-os/kernel.c extras/mini-os/lib/stack_chk_fail.c extras/mini-os/lib/sys.c stubdom/Makefile stubdom/stubdom-dm tools/Makefile tools/Rules.mk tools/blktap/drivers/blktapctrl.c tools/blktap/drivers/block-qcow2.c tools/blktap/drivers/qcow-create.c tools/blktap/drivers/tapdisk.h tools/blktap/lib/blktaplib.h tools/blktap/lib/xenbus.c tools/console/client/main.c tools/console/daemon/io.c tools/console/daemon/main.c tools/examples/xend-config.sxp tools/examples/xmexample.hvm tools/examples/xmexample.hvm-dm tools/examples/xmexample.pv-grub tools/examples/xmexample.vti tools/examples/xmexample1 tools/examples/xmexample2 tools/examples/xmexample3 tools/firmware/Makefile tools/firmware/hvmloader/acpi/dsdt.asl tools/firmware/hvmloader/acpi/dsdt.c tools/firmware/hvmloader/acpi/static_tables.c tools/firmware/hvmloader/config.h tools/firmware/hvmloader/hvmloader.c tools/firmware/rombios/32bit/pmm.c tools/firmware/rombios/32bitgateway.c tools/firmware/rombios/rombios.c tools/fs-back/Makefile tools/fs-back/fs-backend.c tools/fs-back/fs-backend.h tools/fs-back/fs-debug.h tools/fs-back/fs-ops.c tools/fs-back/fs-xenbus.c tools/fs-back/sys-queue.h tools/hotplug/Linux/Makefile tools/hotplug/Linux/blktap tools/hotplug/Linux/init.d/xend tools/hotplug/Linux/network-bridge tools/hotplug/Linux/network-nat tools/hotplug/Linux/vif-common.sh tools/hotplug/Linux/xen-backend.rules tools/hotplug/Linux/xen-hotplug-cleanup tools/hotplug/Linux/xend.rules tools/hotplug/NetBSD/Makefile tools/libfsimage/zfs/fsys_zfs.c tools/libfsimage/zfs/zfs-include/zfs.h tools/libxc/Makefile tools/libxc/xc_core.c tools/libxc/xc_cpufeature.h tools/libxc/xc_cpuid_x86.c tools/libxc/xc_dom_x86.c tools/libxc/xc_domain.c tools/libxc/xc_domain_restore.c tools/libxc/xc_domain_save.c tools/libxc/xc_pagetab.c tools/libxc/xc_pm.c tools/libxc/xc_ptrace.c tools/libxc/xc_ptrace_core.c tools/libxc/xc_solaris.c tools/libxc/xc_suspend.c tools/libxc/xenctrl.h tools/libxc/xenguest.h tools/libxc/xg_private.c tools/libxen/src/xen_common.c tools/misc/Makefile tools/misc/fakei386xen tools/misc/netfix tools/misc/sbdf2devicepath tools/misc/sxp-pretty tools/misc/xen-bugtool tools/misc/xen-clone.README tools/misc/xen-python-path tools/misc/xend tools/misc/xenpm.c tools/misc/xm tools/misc/xsview tools/pygrub/Makefile tools/pygrub/src/pygrub tools/python/Makefile tools/python/README.XendConfig tools/python/scripts/test_hvm_create.py tools/python/scripts/test_vm_create.py tools/python/scripts/xapi.py tools/python/setup.py tools/python/xen/lowlevel/acm/acm.c tools/python/xen/lowlevel/process/process.c tools/python/xen/util/acmpolicy.py tools/python/xen/util/auxbin.py tools/python/xen/util/blkif.py tools/python/xen/util/pci.py tools/python/xen/util/vscsi_util.py tools/python/xen/web/SrvDir.py tools/python/xen/web/connection.py tools/python/xen/web/unix.py tools/python/xen/xend/XendAPI.py tools/python/xen/xend/XendAPIStore.py tools/python/xen/xend/XendCheckpoint.py tools/python/xen/xend/XendConfig.py tools/python/xen/xend/XendConstants.py tools/python/xen/xend/XendDomain.py tools/python/xen/xend/XendDomainInfo.py tools/python/xen/xend/XendNode.py tools/python/xen/xend/XendOptions.py tools/python/xen/xend/XendPPCI.py tools/python/xen/xend/image.py tools/python/xen/xend/osdep.py tools/python/xen/xend/server/BlktapController.py tools/python/xen/xend/server/DevController.py tools/python/xen/xend/server/SrvDaemon.py tools/python/xen/xend/server/SrvDomain.py tools/python/xen/xend/server/XMLRPCServer.py tools/python/xen/xend/server/netif.py tools/python/xen/xend/server/pciif.py tools/python/xen/xend/server/udevevent.py tools/python/xen/xend/server/vfbif.py tools/python/xen/xm/create.dtd tools/python/xen/xm/create.py tools/python/xen/xm/main.py tools/python/xen/xm/xenapi_create.py tools/security/Makefile tools/security/python/xensec_tools/acm_getlabel tools/security/xensec_gen.py tools/sv/index.psp tools/vnet/scripts/vn tools/xcutils/xc_save.c tools/xenpmd/Makefile tools/xenstore/Makefile tools/xenstore/xenstored_core.c tools/xenstore/xs.c tools/xenstore/xs.h tools/xentrace/formats tools/xentrace/xenctx.c tools/xentrace/xentrace_format tools/xm-test/lib/XmTestLib/NetConfig.py unmodified_drivers/linux-2.6/compat-include/linux/scatterlist.h xen/Makefile xen/Rules.mk xen/arch/ia64/linux-xen/acpi.c xen/arch/ia64/linux-xen/head.S xen/arch/ia64/linux-xen/irq_ia64.c xen/arch/ia64/linux-xen/mca.c xen/arch/ia64/linux-xen/mm_contig.c xen/arch/ia64/linux-xen/smpboot.c xen/arch/ia64/vmx/vmx_interrupt.c xen/arch/ia64/xen/hypercall.c xen/arch/ia64/xen/ivt.S xen/arch/ia64/xen/mm.c xen/arch/ia64/xen/xen.lds.S xen/arch/ia64/xen/xensetup.c xen/arch/x86/Rules.mk xen/arch/x86/acpi/boot.c xen/arch/x86/acpi/cpu_idle.c xen/arch/x86/acpi/cpufreq/cpufreq.c xen/arch/x86/acpi/power.c xen/arch/x86/acpi/suspend.c xen/arch/x86/apic.c xen/arch/x86/boot/build32.mk xen/arch/x86/bzimage.c xen/arch/x86/cpu/common.c xen/arch/x86/cpu/intel.c xen/arch/x86/cpu/mcheck/Makefile xen/arch/x86/cpu/mcheck/amd_f10.c xen/arch/x86/cpu/mcheck/amd_k8.c xen/arch/x86/cpu/mcheck/amd_nonfatal.c xen/arch/x86/cpu/mcheck/k7.c xen/arch/x86/cpu/mcheck/mce.c xen/arch/x86/cpu/mcheck/mce.h xen/arch/x86/cpu/mcheck/mce_intel.c xen/arch/x86/cpu/mcheck/mctelem.c xen/arch/x86/cpu/mcheck/mctelem.h xen/arch/x86/cpu/mcheck/non-fatal.c xen/arch/x86/cpu/mcheck/p5.c xen/arch/x86/cpu/mcheck/winchip.c xen/arch/x86/cpu/mcheck/x86_mca.h xen/arch/x86/domain.c xen/arch/x86/domctl.c xen/arch/x86/hpet.c xen/arch/x86/hvm/emulate.c xen/arch/x86/hvm/hvm.c xen/arch/x86/hvm/intercept.c xen/arch/x86/hvm/mtrr.c xen/arch/x86/hvm/pmtimer.c xen/arch/x86/hvm/rtc.c xen/arch/x86/hvm/svm/svm.c xen/arch/x86/hvm/vmsi.c xen/arch/x86/hvm/vmx/vmx.c xen/arch/x86/hvm/vmx/vpmu_core2.c xen/arch/x86/hvm/vpic.c xen/arch/x86/hvm/vpt.c xen/arch/x86/io_apic.c xen/arch/x86/irq.c xen/arch/x86/mm.c xen/arch/x86/mm/hap/hap.c xen/arch/x86/mm/hap/p2m-ept.c xen/arch/x86/mm/p2m.c xen/arch/x86/mm/paging.c xen/arch/x86/mm/shadow/common.c xen/arch/x86/mm/shadow/multi.c xen/arch/x86/mm/shadow/private.h xen/arch/x86/msi.c xen/arch/x86/oprofile/op_model_ppro.c xen/arch/x86/physdev.c xen/arch/x86/setup.c xen/arch/x86/shutdown.c xen/arch/x86/smpboot.c xen/arch/x86/sysctl.c xen/arch/x86/tboot.c xen/arch/x86/time.c xen/arch/x86/traps.c xen/arch/x86/x86_32/entry.S xen/arch/x86/x86_64/compat/entry.S xen/arch/x86/x86_64/entry.S xen/arch/x86/x86_64/traps.c xen/common/domain.c xen/common/domctl.c xen/common/event_channel.c xen/common/grant_table.c xen/common/keyhandler.c xen/common/memory.c xen/common/page_alloc.c xen/common/sched_credit.c xen/common/schedule.c xen/common/spinlock.c xen/common/sysctl.c xen/common/trace.c xen/common/xencomm.c xen/common/xenoprof.c xen/crypto/Makefile xen/crypto/rijndael.c xen/crypto/vmac.c xen/drivers/acpi/pmstat.c xen/drivers/char/console.c xen/drivers/cpufreq/cpufreq.c xen/drivers/cpufreq/cpufreq_misc_governors.c xen/drivers/cpufreq/cpufreq_ondemand.c xen/drivers/cpufreq/utility.c xen/drivers/passthrough/amd/iommu_init.c xen/drivers/passthrough/amd/iommu_intr.c xen/drivers/passthrough/amd/iommu_map.c xen/drivers/passthrough/amd/pci_amd_iommu.c xen/drivers/passthrough/io.c xen/drivers/passthrough/iommu.c xen/drivers/passthrough/pci.c xen/drivers/passthrough/vtd/dmar.c xen/drivers/passthrough/vtd/dmar.h xen/drivers/passthrough/vtd/extern.h xen/drivers/passthrough/vtd/intremap.c xen/drivers/passthrough/vtd/iommu.c xen/drivers/passthrough/vtd/qinval.c xen/drivers/passthrough/vtd/x86/vtd.c xen/drivers/video/vga.c xen/include/acpi/cpufreq/cpufreq.h xen/include/asm-ia64/hvm/iommu.h xen/include/asm-ia64/linux-xen/asm/README.origin xen/include/asm-ia64/linux-xen/asm/hw_irq.h xen/include/asm-ia64/linux-xen/asm/processor.h xen/include/asm-ia64/linux-xen/asm/sections.h xen/include/asm-ia64/linux-xen/asm/spinlock.h xen/include/asm-ia64/linux/asm/README.origin xen/include/asm-ia64/linux/asm/hw_irq.h xen/include/asm-ia64/linux/asm/sections.h xen/include/asm-ia64/linux/pci_regs.h xen/include/asm-ia64/mm.h xen/include/asm-x86/atomic.h xen/include/asm-x86/bug.h xen/include/asm-x86/config.h xen/include/asm-x86/cpufeature.h xen/include/asm-x86/desc.h xen/include/asm-x86/domain.h xen/include/asm-x86/hpet.h xen/include/asm-x86/hvm/domain.h xen/include/asm-x86/io_apic.h xen/include/asm-x86/mm.h xen/include/asm-x86/msi.h xen/include/asm-x86/msr-index.h xen/include/asm-x86/mtrr.h xen/include/asm-x86/processor.h xen/include/asm-x86/softirq.h xen/include/asm-x86/spinlock.h xen/include/asm-x86/tboot.h xen/include/asm-x86/traps.h xen/include/asm-x86/x86_32/bug.h xen/include/asm-x86/x86_32/page.h xen/include/asm-x86/x86_64/bug.h xen/include/asm-x86/x86_64/page.h xen/include/crypto/rijndael.h xen/include/crypto/vmac.h xen/include/public/arch-x86/xen-mca.h xen/include/public/arch-x86/xen.h xen/include/public/domctl.h xen/include/public/io/fsif.h xen/include/public/io/usbif.h xen/include/public/io/vscsiif.h xen/include/public/physdev.h xen/include/public/sysctl.h xen/include/public/trace.h xen/include/public/xen.h xen/include/xen/acpi.h xen/include/xen/compat.h xen/include/xen/console.h xen/include/xen/cpumask.h xen/include/xen/domain.h xen/include/xen/hvm/irq.h xen/include/xen/hypercall.h xen/include/xen/iommu.h xen/include/xen/irq.h xen/include/xen/lib.h xen/include/xen/mm.h xen/include/xen/pci.h xen/include/xen/pci_regs.h xen/include/xen/perfc_defn.h xen/include/xen/sched-if.h xen/include/xen/sched.h xen/include/xlat.lst xen/include/xsm/xsm.h xen/kdb/kdbmain.c xen/tools/get-fields.sh xen/xsm/dummy.c
line diff
     1.1 --- a/Config.mk	Mon Mar 30 19:56:30 2009 -0700
     1.2 +++ b/Config.mk	Thu Apr 23 18:49:41 2009 -0700
     1.3 @@ -19,8 +19,6 @@ HOSTCFLAGS += -fno-strict-aliasing
     1.4  
     1.5  DISTDIR     ?= $(XEN_ROOT)/dist
     1.6  DESTDIR     ?= /
     1.7 -DOCDIR      ?= /usr/share/doc/xen
     1.8 -MANDIR      ?= /usr/share/man
     1.9  
    1.10  # Allow phony attribute to be listed as dependency rather than fake target
    1.11  .PHONY: .phony
    1.12 @@ -28,6 +26,10 @@ MANDIR      ?= /usr/share/man
    1.13  include $(XEN_ROOT)/config/$(XEN_OS).mk
    1.14  include $(XEN_ROOT)/config/$(XEN_TARGET_ARCH).mk
    1.15  
    1.16 +SHAREDIR    ?= $(PREFIX)/share
    1.17 +DOCDIR      ?= $(SHAREDIR)/doc/xen
    1.18 +MANDIR      ?= $(SHAREDIR)/man
    1.19 +
    1.20  ifneq ($(EXTRA_PREFIX),)
    1.21  EXTRA_INCLUDES += $(EXTRA_PREFIX)/include
    1.22  EXTRA_LIB += $(EXTRA_PREFIX)/$(LIBLEAFDIR)
     2.1 --- a/Makefile	Mon Mar 30 19:56:30 2009 -0700
     2.2 +++ b/Makefile	Thu Apr 23 18:49:41 2009 -0700
     2.3 @@ -188,11 +188,7 @@ help:
     2.4  	@echo '  clean-tboot      - clean the tboot module if it exists'
     2.5  	@echo
     2.6  	@echo 'Environment:'
     2.7 -	@echo '  XEN_PYTHON_NATIVE_INSTALL=y'
     2.8 -	@echo '                   - native python install or dist'
     2.9 -	@echo '                     install into prefix/lib/python<VERSION>'
    2.10 -	@echo '                     instead of <PREFIX>/lib/python'
    2.11 -	@echo '                     true if set to non-empty value, false otherwise'
    2.12 +	@echo '  [ this documentation is sadly not complete ]'
    2.13  
    2.14  # Use this target with extreme care!
    2.15  .PHONY: uninstall
    2.16 @@ -203,6 +199,8 @@ uninstall:
    2.17  	rm -rf $(D)/etc/hotplug/xen-backend.agent
    2.18  	rm -f  $(D)/etc/udev/rules.d/xen-backend.rules
    2.19  	rm -f  $(D)/etc/udev/xen-backend.rules
    2.20 +	rm -f  $(D)/etc/udev/rules.d/xend.rules
    2.21 +	rm -f  $(D)/etc/udev/xend.rules
    2.22  	rm -f  $(D)/etc/sysconfig/xendomains
    2.23  	rm -rf $(D)/var/run/xen* $(D)/var/lib/xen*
    2.24  	rm -rf $(D)/boot/*xen*
    2.25 @@ -239,7 +237,7 @@ linux26:
    2.26  # tboot targets
    2.27  #
    2.28  
    2.29 -TBOOT_TARFILE = tboot-20080613.tar.gz
    2.30 +TBOOT_TARFILE = tboot-20090330.tar.gz
    2.31  #TBOOT_BASE_URL = http://downloads.sourceforge.net/tboot
    2.32  TBOOT_BASE_URL = $(XEN_EXTFILES_URL)
    2.33  
     3.1 --- a/config/NetBSD.mk	Mon Mar 30 19:56:30 2009 -0700
     3.2 +++ b/config/NetBSD.mk	Thu Apr 23 18:49:41 2009 -0700
     3.3 @@ -2,3 +2,7 @@ include $(XEN_ROOT)/config/StdGNU.mk
     3.4  
     3.5  # Override settings for this OS
     3.6  CURSES_LIBS = -lcurses
     3.7 +
     3.8 +LIBLEAFDIR_x86_64 = lib
     3.9 +LIBEXEC = $(PREFIX)/libexec
    3.10 +PRIVATE_BINDIR = $(BINDIR)
     4.1 --- a/config/StdGNU.mk	Mon Mar 30 19:56:30 2009 -0700
     4.2 +++ b/config/StdGNU.mk	Thu Apr 23 18:49:41 2009 -0700
     4.3 @@ -25,10 +25,14 @@ PREFIX ?= /usr
     4.4  BINDIR = $(PREFIX)/bin
     4.5  INCLUDEDIR = $(PREFIX)/include
     4.6  LIBLEAFDIR = lib
     4.7 +LIBLEAFDIR_x86_32 = lib
     4.8  LIBLEAFDIR_x86_64 = lib64
     4.9  LIBDIR = $(PREFIX)/$(LIBLEAFDIR)
    4.10 +LIBDIR_x86_32 = $(PREFIX)/$(LIBLEAFDIR_x86_32)
    4.11  LIBDIR_x86_64 = $(PREFIX)/$(LIBLEAFDIR_x86_64)
    4.12 -MANDIR = $(PREFIX)/share/man
    4.13 +LIBEXEC = $(LIBDIR_x86_32)/xen/bin
    4.14 +SHAREDIR = $(PREFIX)/share
    4.15 +MANDIR = $(SHAREDIR)/man
    4.16  MAN1DIR = $(MANDIR)/man1
    4.17  MAN8DIR = $(MANDIR)/man8
    4.18  SBINDIR = $(PREFIX)/sbin
     5.1 --- a/docs/misc/vtd.txt	Mon Mar 30 19:56:30 2009 -0700
     5.2 +++ b/docs/misc/vtd.txt	Thu Apr 23 18:49:41 2009 -0700
     5.3 @@ -26,7 +26,18 @@ title Xen-Fedora Core (2.6.18-xen)
     5.4          module /boot/vmlinuz-2.6.18.8-xen root=LABEL=/ ro xencons=ttyS console=tty0 console=ttyS0, pciback.hide=(01:00.0)(03:00.0)
     5.5          module /boot/initrd-2.6.18-xen.img
     5.6  
     5.7 -12) reboot system
     5.8 +    or use dynamic hiding via PCI backend sysfs interface:
     5.9 +        a) check if the driver has binded to the device
    5.10 +            ls -l /sys/bus/pci/devices/0000:01:00.0/driver
    5.11 +            ... /sys/bus/pci/devices/0000:01:00.0/driver -> ../../../../bus/pci/drivers/igb
    5.12 +        b) if yes, then unload the driver first
    5.13 +            echo -n 0000:01:00.0 >/sys/bus/pci/drivers/igb/unbind
    5.14 +        c) add the device to the PCI backend
    5.15 +            echo -n 0000:01:00.0 >/sys/bus/pci/drivers/pciback/new_slot
    5.16 +        d) let the PCI backend bind to the device
    5.17 +            echo -n 0000:01:00.0 >/sys/bus/pci/drivers/pciback/bind
    5.18 +
    5.19 +12) reboot system (not requires if you use the dynamic hiding method)
    5.20  13) add "pci" line in /etc/xen/hvm.conf for to assigned devices
    5.21          pci = [ '01:00.0', '03:00.0' ]
    5.22  15) start hvm guest and use "lspci" to see the passthru device and
    5.23 @@ -160,3 +171,82 @@ driver's view are different. As a result
    5.24  buffer specified by driver.
    5.25  
    5.26  Such devices assigned to HVM domain currently do not work.
    5.27 +
    5.28 +
    5.29 +Using SR-IOV with VT-d
    5.30 +--------------------------------
    5.31 +
    5.32 +The Single Root I/O Virtualization is a PCI Express feature supported by
    5.33 +some devices such as Intel 82576 which allows you to create virtual PCI
    5.34 +devices (Virtual Function) and assign them to the HVM guest.
    5.35 +
    5.36 +You can use latest lspci (v3.1 and above) to check if your PCIe device
    5.37 +supports the SR-IOV capability or not.
    5.38 +
    5.39 +  $ lspci -s 01:00.0 -vvv
    5.40 +
    5.41 +  01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    5.42 +        Subsystem: Intel Corporation Gigabit ET Dual Port Server Adapter
    5.43 +
    5.44 +        ...
    5.45 +
    5.46 +        Capabilities: [160] Single Root I/O Virtualization (SR-IOV)
    5.47 +                IOVCap: Migration-, Interrupt Message Number: 000
    5.48 +                IOVCtl: Enable+ Migration- Interrupt- MSE+ ARIHierarchy+
    5.49 +                IOVSta: Migration-
    5.50 +                Initial VFs: 8, Total VFs: 8, Number of VFs: 7, Function Dependency Link: 00
    5.51 +                VF offset: 128, stride: 2, Device ID: 10ca
    5.52 +                Supported Page Size: 00000553, System Page Size: 00000001
    5.53 +                VF Migration: offset: 00000000, BIR: 0
    5.54 +        Kernel driver in use: igb
    5.55 +
    5.56 +
    5.57 +The function that has the SR-IOV capability is also known as Physical
    5.58 +Function. You need the Physical Function driver (runs in the Dom0 and
    5.59 +controls the physical resources allocation) to enable the Virtual Function.
    5.60 +Following is the Virtual Functions associated with above Physical Function.
    5.61 +
    5.62 +  $ lspci | grep -e 01:1[01].[0246]
    5.63 +
    5.64 +  01:10.0 Ethernet controller: Intel Corporation Device 10ca (rev 01)
    5.65 +  01:10.2 Ethernet controller: Intel Corporation Device 10ca (rev 01)
    5.66 +  01:10.4 Ethernet controller: Intel Corporation Device 10ca (rev 01)
    5.67 +  01:10.6 Ethernet controller: Intel Corporation Device 10ca (rev 01)
    5.68 +  01:11.0 Ethernet controller: Intel Corporation Device 10ca (rev 01)
    5.69 +  01:11.2 Ethernet controller: Intel Corporation Device 10ca (rev 01)
    5.70 +  01:11.4 Ethernet controller: Intel Corporation Device 10ca (rev 01)
    5.71 +
    5.72 +We can tell that Physical Function 01:00.0 has 7 Virtual Functions (01:10.0,
    5.73 +01:10.2, 01:10.4, 01:10.6, 01:11.0, 01:11.2, 01:11.4). And the Virtual
    5.74 +Function PCI Configuration Space looks just like normal PCI device.
    5.75 +
    5.76 +  $ lspci -s 01:10.0 -vvv
    5.77 +
    5.78 +  01:10.0 Ethernet controller: Intel Corporation 82576 Gigabit Virtual Function
    5.79 +        Subsystem: Intel Corporation Gigabit Virtual Function
    5.80 +        Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
    5.81 +        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    5.82 +        Region 0: [virtual] Memory at d2840000 (64-bit, non-prefetchable) [size=16K]
    5.83 +        Region 3: [virtual] Memory at d2860000 (64-bit, non-prefetchable) [size=16K]
    5.84 +        Capabilities: [70] MSI-X: Enable+ Mask- TabSize=3
    5.85 +                Vector table: BAR=3 offset=00000000
    5.86 +                PBA: BAR=3 offset=00002000
    5.87 +        Capabilities: [a0] Express (v2) Endpoint, MSI 00
    5.88 +
    5.89 +        ...
    5.90 +
    5.91 +
    5.92 +The Virtual Function only appears after the Physical Function driver
    5.93 +is loaded. Once the Physical Function driver is unloaded. All Virtual
    5.94 +Functions associated with this Physical Function disappear.
    5.95 +
    5.96 +The Virtual Function is essentially same as the normal PCI device when
    5.97 +using it in VT-d environment. You need to hide the Virtual Function,
    5.98 +use the Virtual Function bus, device and function number in the HVM
    5.99 +guest configuration file and then boot the HVM guest. You also need the
   5.100 +Virtual Function driver which is the normal PCI device driver in the
   5.101 +HMV guest to drive the Virtual Function. The PCIe SR-IOV specification
   5.102 +requires that the Virtual Function can only support MSI/MSI-x if it
   5.103 +uses interrupt. This means you also need to enable Xen/MSI support.
   5.104 +Since the Virtual Function is dynamically allocated by Physical Function
   5.105 +driver, you might want to use the dynamic hiding method mentioned above.
     6.1 --- a/docs/src/user.tex	Mon Mar 30 19:56:30 2009 -0700
     6.2 +++ b/docs/src/user.tex	Thu Apr 23 18:49:41 2009 -0700
     6.3 @@ -4194,6 +4194,9 @@ writing to the VGA console after domain 
     6.4  \item [ dma\_bits=xxx ] Specify width of DMA addresses in bits. This
     6.5    is used in NUMA systems to prevent this special DMA memory from
     6.6    being exhausted in one node when remote nodes have available memory.
     6.7 +\item [ vcpu\_migration\_delay=$<$minimum\_time$>$] Set minimum time of 
     6.8 +  vcpu migration in microseconds (default 0). This parameter avoids agressive
     6.9 +  vcpu migration. For example, the linux kernel uses 0.5ms by default.
    6.10  \end{description}
    6.11  
    6.12  In addition, the following options may be specified on the Xen command
     7.1 --- a/extras/mini-os/arch/ia64/mm.c	Mon Mar 30 19:56:30 2009 -0700
     7.2 +++ b/extras/mini-os/arch/ia64/mm.c	Thu Apr 23 18:49:41 2009 -0700
     7.3 @@ -156,6 +156,18 @@ map_frames_ex(unsigned long* frames, uns
     7.4  	return (void*) __va(frames[0] << PAGE_SHIFT);
     7.5  }
     7.6  
     7.7 +int unmap_frames(unsigned long virt_addr, unsigned long num_frames)
     7.8 +{  
     7.9 +    /* TODO */
    7.10 +    ASSERT(0);
    7.11 +}
    7.12 +
    7.13 +unsigned long alloc_contig_pages(int order, unsigned int addr_bits)
    7.14 +{
    7.15 +    /* TODO */
    7.16 +    ASSERT(0);
    7.17 +}
    7.18 +
    7.19  void arch_init_p2m(unsigned long max_pfn)
    7.20  {
    7.21      printk("Warn: p2m map not implemented.\n");
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/extras/mini-os/arch/x86/ioremap.c	Thu Apr 23 18:49:41 2009 -0700
     8.3 @@ -0,0 +1,88 @@
     8.4 +/*
     8.5 + * Copyright (C) 2009,  Netronome Systems, Inc.
     8.6 + *                
     8.7 + * Permission is hereby granted, free of charge, to any person obtaining a copy
     8.8 + * of this software and associated documentation files (the "Software"), to
     8.9 + * deal in the Software without restriction, including without limitation the
    8.10 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
    8.11 + * sell copies of the Software, and to permit persons to whom the Software is
    8.12 + * furnished to do so, subject to the following conditions:
    8.13 + * 
    8.14 + * The above copyright notice and this permission notice shall be included in
    8.15 + * all copies or substantial portions of the Software.
    8.16 + * 
    8.17 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
    8.18 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
    8.19 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
    8.20 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
    8.21 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
    8.22 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
    8.23 + * DEALINGS IN THE SOFTWARE.
    8.24 + */
    8.25 +
    8.26 +
    8.27 +#include <types.h>
    8.28 +#include <lib.h>
    8.29 +#include <xmalloc.h>
    8.30 +#include <mm.h>
    8.31 +#include <ioremap.h>
    8.32 +
    8.33 +/* Map a physical address range into virtual address space with provided
    8.34 + * flags. Return a virtual address range it is mapped to. */
    8.35 +static void *__do_ioremap(unsigned long phys_addr, unsigned long size, 
    8.36 +                          unsigned long prot)
    8.37 +{
    8.38 +    unsigned long va;
    8.39 +    unsigned long mfns, mfn;
    8.40 +    unsigned long num_pages, offset;
    8.41 +    int i;
    8.42 +
    8.43 +    /* allow non page aligned addresses but for mapping we need to align them */
    8.44 +    offset = (phys_addr & ~PAGE_MASK);
    8.45 +    num_pages = (offset + size + PAGE_SIZE - 1) / PAGE_SIZE;
    8.46 +    phys_addr &= PAGE_MASK;
    8.47 +    mfns = mfn = phys_addr >> PAGE_SHIFT;
    8.48 +    
    8.49 +    /* sanity checks on list of MFNs */
    8.50 +    for ( i = 0; i < num_pages; i++, mfn++ )
    8.51 +    {
    8.52 +        if ( mfn_is_ram(mfn) )
    8.53 +        {
    8.54 +            printk("ioremap: mfn 0x%ulx is RAM\n", mfn);
    8.55 +            goto mfn_invalid;
    8.56 +        }
    8.57 +    }   
    8.58 +    va = (unsigned long)map_frames_ex(&mfns, num_pages, 0, 1, 1,
    8.59 +                                      DOMID_IO, 0, prot);
    8.60 +    return (void *)(va + offset);
    8.61 +    
    8.62 +mfn_invalid:
    8.63 +    return NULL;
    8.64 +}
    8.65 +
    8.66 +void *ioremap(unsigned long phys_addr, unsigned long size)
    8.67 +{
    8.68 +    return __do_ioremap(phys_addr, size, IO_PROT);
    8.69 +}
    8.70 +
    8.71 +void *ioremap_nocache(unsigned long phys_addr, unsigned long size)
    8.72 +{
    8.73 +    return __do_ioremap(phys_addr, size, IO_PROT_NOCACHE);
    8.74 +}
    8.75 +
    8.76 +/* Un-map the io-remapped region. Currently no list of existing mappings is
    8.77 + * maintained, so the caller has to supply the size */
    8.78 +void iounmap(void *virt_addr, unsigned long size)
    8.79 +{   
    8.80 +    unsigned long num_pages;
    8.81 +    unsigned long va = (unsigned long)virt_addr;
    8.82 +
    8.83 +    /* work out number of frames to unmap */
    8.84 +    num_pages = ((va & ~PAGE_MASK) + size + PAGE_SIZE - 1) / PAGE_SIZE;
    8.85 +
    8.86 +    unmap_frames(va & PAGE_MASK, num_pages);
    8.87 +}
    8.88 +
    8.89 +
    8.90 +
    8.91 +/* -*-  Mode:C; c-basic-offset:4; tab-width:4 indent-tabs-mode:nil -*- */
     9.1 --- a/extras/mini-os/arch/x86/mm.c	Mon Mar 30 19:56:30 2009 -0700
     9.2 +++ b/extras/mini-os/arch/x86/mm.c	Thu Apr 23 18:49:41 2009 -0700
     9.3 @@ -52,20 +52,26 @@
     9.4  unsigned long *phys_to_machine_mapping;
     9.5  unsigned long mfn_zero;
     9.6  extern char stack[];
     9.7 -extern void page_walk(unsigned long virt_addr);
     9.8 +extern void page_walk(unsigned long va);
     9.9  
    9.10 -void new_pt_frame(unsigned long *pt_pfn, unsigned long prev_l_mfn, 
    9.11 -                                unsigned long offset, unsigned long level)
    9.12 +/*
    9.13 + * Make pt_pfn a new 'level' page table frame and hook it into the page
    9.14 + * table at offset in previous level MFN (pref_l_mfn). pt_pfn is a guest
    9.15 + * PFN.
    9.16 + */
    9.17 +static void new_pt_frame(unsigned long *pt_pfn, unsigned long prev_l_mfn, 
    9.18 +                         unsigned long offset, unsigned long level)
    9.19  {   
    9.20      pgentry_t *tab = (pgentry_t *)start_info.pt_base;
    9.21      unsigned long pt_page = (unsigned long)pfn_to_virt(*pt_pfn); 
    9.22      pgentry_t prot_e, prot_t;
    9.23      mmu_update_t mmu_updates[1];
    9.24 +    int rc;
    9.25      
    9.26      prot_e = prot_t = 0;
    9.27 -    DEBUG("Allocating new L%d pt frame for pt_pfn=%lx, "
    9.28 -           "prev_l_mfn=%lx, offset=%lx", 
    9.29 -           level, *pt_pfn, prev_l_mfn, offset);
    9.30 +    DEBUG("Allocating new L%d pt frame for pfn=%lx, "
    9.31 +          "prev_l_mfn=%lx, offset=%lx", 
    9.32 +          level, *pt_pfn, prev_l_mfn, offset);
    9.33  
    9.34      /* We need to clear the page, otherwise we might fail to map it
    9.35         as a page table page */
    9.36 @@ -74,56 +80,63 @@ void new_pt_frame(unsigned long *pt_pfn,
    9.37      switch ( level )
    9.38      {
    9.39      case L1_FRAME:
    9.40 -         prot_e = L1_PROT;
    9.41 -         prot_t = L2_PROT;
    9.42 -         break;
    9.43 +        prot_e = L1_PROT;
    9.44 +        prot_t = L2_PROT;
    9.45 +        break;
    9.46      case L2_FRAME:
    9.47 -         prot_e = L2_PROT;
    9.48 -         prot_t = L3_PROT;
    9.49 -         break;
    9.50 +        prot_e = L2_PROT;
    9.51 +        prot_t = L3_PROT;
    9.52 +        break;
    9.53  #if defined(__x86_64__)
    9.54      case L3_FRAME:
    9.55 -         prot_e = L3_PROT;
    9.56 -         prot_t = L4_PROT;
    9.57 -         break;
    9.58 +        prot_e = L3_PROT;
    9.59 +        prot_t = L4_PROT;
    9.60 +        break;
    9.61  #endif
    9.62      default:
    9.63 -         printk("new_pt_frame() called with invalid level number %d\n", level);
    9.64 -         do_exit();
    9.65 -         break;
    9.66 +        printk("new_pt_frame() called with invalid level number %d\n", level);
    9.67 +        do_exit();
    9.68 +        break;
    9.69      }
    9.70  
    9.71 -    /* Update the entry */
    9.72 +    /* Make PFN a page table page */
    9.73  #if defined(__x86_64__)
    9.74      tab = pte_to_virt(tab[l4_table_offset(pt_page)]);
    9.75  #endif
    9.76      tab = pte_to_virt(tab[l3_table_offset(pt_page)]);
    9.77  
    9.78      mmu_updates[0].ptr = (tab[l2_table_offset(pt_page)] & PAGE_MASK) + 
    9.79 -                         sizeof(pgentry_t) * l1_table_offset(pt_page);
    9.80 +        sizeof(pgentry_t) * l1_table_offset(pt_page);
    9.81      mmu_updates[0].val = (pgentry_t)pfn_to_mfn(*pt_pfn) << PAGE_SHIFT | 
    9.82 -                         (prot_e & ~_PAGE_RW);
    9.83 -    if(HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF) < 0)
    9.84 +        (prot_e & ~_PAGE_RW);
    9.85 +    
    9.86 +    if ( (rc = HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF)) < 0 )
    9.87      {
    9.88 -         printk("PTE for new page table page could not be updated\n");
    9.89 -         do_exit();
    9.90 +        printk("ERROR: PTE for new page table page could not be updated\n");
    9.91 +        printk("       mmu_update failed with rc=%d\n", rc);
    9.92 +        do_exit();
    9.93      }
    9.94 -                        
    9.95 -    /* Now fill the new page table page with entries.
    9.96 -       Update the page directory as well. */
    9.97 -    mmu_updates[0].ptr = ((pgentry_t)prev_l_mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
    9.98 +
    9.99 +    /* Hook the new page table page into the hierarchy */
   9.100 +    mmu_updates[0].ptr =
   9.101 +        ((pgentry_t)prev_l_mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
   9.102      mmu_updates[0].val = (pgentry_t)pfn_to_mfn(*pt_pfn) << PAGE_SHIFT | prot_t;
   9.103 -    if(HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF) < 0) 
   9.104 +
   9.105 +    if ( (rc = HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF)) < 0 ) 
   9.106      {
   9.107 -       printk("ERROR: mmu_update failed\n");
   9.108 -       do_exit();
   9.109 +        printk("ERROR: mmu_update failed with rc=%d\n", rc);
   9.110 +        do_exit();
   9.111      }
   9.112  
   9.113      *pt_pfn += 1;
   9.114  }
   9.115  
   9.116 -/* Checks if a pagetable frame is needed (if weren't allocated by Xen) */
   9.117 -static int need_pt_frame(unsigned long virt_address, int level)
   9.118 +/*
   9.119 + * Checks if a pagetable frame is needed at 'level' to map a given
   9.120 + * address. Note, this function is specific to the initial page table
   9.121 + * building.
   9.122 + */
   9.123 +static int need_pt_frame(unsigned long va, int level)
   9.124  {
   9.125      unsigned long hyp_virt_start = HYPERVISOR_VIRT_START;
   9.126  #if defined(__x86_64__)
   9.127 @@ -135,63 +148,71 @@ static int need_pt_frame(unsigned long v
   9.128      /* In general frames will _not_ be needed if they were already
   9.129         allocated to map the hypervisor into our VA space */
   9.130  #if defined(__x86_64__)
   9.131 -    if(level == L3_FRAME)
   9.132 +    if ( level == L3_FRAME )
   9.133      {
   9.134 -        if(l4_table_offset(virt_address) >= 
   9.135 -           l4_table_offset(hyp_virt_start) &&
   9.136 -           l4_table_offset(virt_address) <= 
   9.137 -           l4_table_offset(hyp_virt_end))
   9.138 +        if ( l4_table_offset(va) >= 
   9.139 +             l4_table_offset(hyp_virt_start) &&
   9.140 +             l4_table_offset(va) <= 
   9.141 +             l4_table_offset(hyp_virt_end))
   9.142              return 0;
   9.143          return 1;
   9.144 -    } else
   9.145 +    } 
   9.146 +    else
   9.147  #endif
   9.148  
   9.149 -    if(level == L2_FRAME)
   9.150 +    if ( level == L2_FRAME )
   9.151      {
   9.152  #if defined(__x86_64__)
   9.153 -        if(l4_table_offset(virt_address) >= 
   9.154 -           l4_table_offset(hyp_virt_start) &&
   9.155 -           l4_table_offset(virt_address) <= 
   9.156 -           l4_table_offset(hyp_virt_end))
   9.157 +        if ( l4_table_offset(va) >= 
   9.158 +             l4_table_offset(hyp_virt_start) &&
   9.159 +             l4_table_offset(va) <= 
   9.160 +             l4_table_offset(hyp_virt_end))
   9.161  #endif
   9.162 -            if(l3_table_offset(virt_address) >= 
   9.163 -               l3_table_offset(hyp_virt_start) &&
   9.164 -               l3_table_offset(virt_address) <= 
   9.165 -               l3_table_offset(hyp_virt_end))
   9.166 +            if ( l3_table_offset(va) >= 
   9.167 +                 l3_table_offset(hyp_virt_start) &&
   9.168 +                 l3_table_offset(va) <= 
   9.169 +                 l3_table_offset(hyp_virt_end))
   9.170                  return 0;
   9.171  
   9.172          return 1;
   9.173 -    } else 
   9.174 -
   9.175 -    /* Always need l1 frames */
   9.176 -    if(level == L1_FRAME)
   9.177 -        return 1;
   9.178 +    } 
   9.179 +    else 
   9.180 +        /* Always need l1 frames */
   9.181 +        if ( level == L1_FRAME )
   9.182 +            return 1;
   9.183  
   9.184      printk("ERROR: Unknown frame level %d, hypervisor %llx,%llx\n", 
   9.185 -        level, hyp_virt_start, hyp_virt_end);
   9.186 +           level, hyp_virt_start, hyp_virt_end);
   9.187      return -1;
   9.188  }
   9.189  
   9.190 -void build_pagetable(unsigned long *start_pfn, unsigned long *max_pfn)
   9.191 +/*
   9.192 + * Build the initial pagetable.
   9.193 + */
   9.194 +static void build_pagetable(unsigned long *start_pfn, unsigned long *max_pfn)
   9.195  {
   9.196      unsigned long start_address, end_address;
   9.197      unsigned long pfn_to_map, pt_pfn = *start_pfn;
   9.198      static mmu_update_t mmu_updates[L1_PAGETABLE_ENTRIES + 1];
   9.199      pgentry_t *tab = (pgentry_t *)start_info.pt_base, page;
   9.200 -    unsigned long mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
   9.201 +    unsigned long pt_mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
   9.202      unsigned long offset;
   9.203      int count = 0;
   9.204 +    int rc;
   9.205  
   9.206 -    pfn_to_map = (start_info.nr_pt_frames - NOT_L1_FRAMES) * L1_PAGETABLE_ENTRIES;
   9.207 +    pfn_to_map = 
   9.208 +        (start_info.nr_pt_frames - NOT_L1_FRAMES) * L1_PAGETABLE_ENTRIES;
   9.209  
   9.210 -    if (*max_pfn >= virt_to_pfn(HYPERVISOR_VIRT_START))
   9.211 +    if ( *max_pfn >= virt_to_pfn(HYPERVISOR_VIRT_START) )
   9.212      {
   9.213          printk("WARNING: Mini-OS trying to use Xen virtual space. "
   9.214                 "Truncating memory from %dMB to ",
   9.215 -               ((unsigned long)pfn_to_virt(*max_pfn) - (unsigned long)&_text)>>20);
   9.216 +               ((unsigned long)pfn_to_virt(*max_pfn) -
   9.217 +                (unsigned long)&_text)>>20);
   9.218          *max_pfn = virt_to_pfn(HYPERVISOR_VIRT_START - PAGE_SIZE);
   9.219          printk("%dMB\n",
   9.220 -               ((unsigned long)pfn_to_virt(*max_pfn) - (unsigned long)&_text)>>20);
   9.221 +               ((unsigned long)pfn_to_virt(*max_pfn) - 
   9.222 +                (unsigned long)&_text)>>20);
   9.223      }
   9.224  
   9.225      start_address = (unsigned long)pfn_to_virt(pfn_to_map);
   9.226 @@ -200,49 +221,53 @@ void build_pagetable(unsigned long *star
   9.227      /* We worked out the virtual memory range to map, now mapping loop */
   9.228      printk("Mapping memory range 0x%lx - 0x%lx\n", start_address, end_address);
   9.229  
   9.230 -    while(start_address < end_address)
   9.231 +    while ( start_address < end_address )
   9.232      {
   9.233          tab = (pgentry_t *)start_info.pt_base;
   9.234 -        mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
   9.235 +        pt_mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
   9.236  
   9.237  #if defined(__x86_64__)
   9.238          offset = l4_table_offset(start_address);
   9.239          /* Need new L3 pt frame */
   9.240 -        if(!(start_address & L3_MASK)) 
   9.241 -            if(need_pt_frame(start_address, L3_FRAME)) 
   9.242 -                new_pt_frame(&pt_pfn, mfn, offset, L3_FRAME);
   9.243 +        if ( !(start_address & L3_MASK) )
   9.244 +            if ( need_pt_frame(start_address, L3_FRAME) ) 
   9.245 +                new_pt_frame(&pt_pfn, pt_mfn, offset, L3_FRAME);
   9.246  
   9.247          page = tab[offset];
   9.248 -        mfn = pte_to_mfn(page);
   9.249 -        tab = to_virt(mfn_to_pfn(mfn) << PAGE_SHIFT);
   9.250 +        pt_mfn = pte_to_mfn(page);
   9.251 +        tab = to_virt(mfn_to_pfn(pt_mfn) << PAGE_SHIFT);
   9.252  #endif
   9.253          offset = l3_table_offset(start_address);
   9.254          /* Need new L2 pt frame */
   9.255 -        if(!(start_address & L2_MASK))
   9.256 -            if(need_pt_frame(start_address, L2_FRAME))
   9.257 -                new_pt_frame(&pt_pfn, mfn, offset, L2_FRAME);
   9.258 +        if ( !(start_address & L2_MASK) )
   9.259 +            if ( need_pt_frame(start_address, L2_FRAME) )
   9.260 +                new_pt_frame(&pt_pfn, pt_mfn, offset, L2_FRAME);
   9.261  
   9.262          page = tab[offset];
   9.263 -        mfn = pte_to_mfn(page);
   9.264 -        tab = to_virt(mfn_to_pfn(mfn) << PAGE_SHIFT);
   9.265 +        pt_mfn = pte_to_mfn(page);
   9.266 +        tab = to_virt(mfn_to_pfn(pt_mfn) << PAGE_SHIFT);
   9.267          offset = l2_table_offset(start_address);        
   9.268          /* Need new L1 pt frame */
   9.269 -        if(!(start_address & L1_MASK))
   9.270 -            if(need_pt_frame(start_address, L1_FRAME)) 
   9.271 -                new_pt_frame(&pt_pfn, mfn, offset, L1_FRAME);
   9.272 +        if ( !(start_address & L1_MASK) )
   9.273 +            if ( need_pt_frame(start_address, L1_FRAME) )
   9.274 +                new_pt_frame(&pt_pfn, pt_mfn, offset, L1_FRAME);
   9.275  
   9.276          page = tab[offset];
   9.277 -        mfn = pte_to_mfn(page);
   9.278 +        pt_mfn = pte_to_mfn(page);
   9.279          offset = l1_table_offset(start_address);
   9.280  
   9.281 -        mmu_updates[count].ptr = ((pgentry_t)mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
   9.282 -        mmu_updates[count].val = (pgentry_t)pfn_to_mfn(pfn_to_map++) << PAGE_SHIFT | L1_PROT;
   9.283 +        mmu_updates[count].ptr =
   9.284 +            ((pgentry_t)pt_mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
   9.285 +        mmu_updates[count].val = 
   9.286 +            (pgentry_t)pfn_to_mfn(pfn_to_map++) << PAGE_SHIFT | L1_PROT;
   9.287          count++;
   9.288 -        if (count == L1_PAGETABLE_ENTRIES || pfn_to_map == *max_pfn)
   9.289 +        if ( count == L1_PAGETABLE_ENTRIES || pfn_to_map == *max_pfn )
   9.290          {
   9.291 -            if(HYPERVISOR_mmu_update(mmu_updates, count, NULL, DOMID_SELF) < 0)
   9.292 +            rc = HYPERVISOR_mmu_update(mmu_updates, count, NULL, DOMID_SELF);
   9.293 +            if ( rc < 0 )
   9.294              {
   9.295 -                printk("PTE could not be updated\n");
   9.296 +                printk("ERROR: build_pagetable(): PTE could not be updated\n");
   9.297 +                printk("       mmu_update failed with rc=%d\n", rc);
   9.298                  do_exit();
   9.299              }
   9.300              count = 0;
   9.301 @@ -253,20 +278,26 @@ void build_pagetable(unsigned long *star
   9.302      *start_pfn = pt_pfn;
   9.303  }
   9.304  
   9.305 +/*
   9.306 + * Mark portion of the address space read only.
   9.307 + */
   9.308  extern void shared_info;
   9.309  static void set_readonly(void *text, void *etext)
   9.310  {
   9.311 -    unsigned long start_address = ((unsigned long) text + PAGE_SIZE - 1) & PAGE_MASK;
   9.312 +    unsigned long start_address =
   9.313 +        ((unsigned long) text + PAGE_SIZE - 1) & PAGE_MASK;
   9.314      unsigned long end_address = (unsigned long) etext;
   9.315      static mmu_update_t mmu_updates[L1_PAGETABLE_ENTRIES + 1];
   9.316      pgentry_t *tab = (pgentry_t *)start_info.pt_base, page;
   9.317      unsigned long mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
   9.318      unsigned long offset;
   9.319      int count = 0;
   9.320 +    int rc;
   9.321  
   9.322      printk("setting %p-%p readonly\n", text, etext);
   9.323  
   9.324 -    while (start_address + PAGE_SIZE <= end_address) {
   9.325 +    while ( start_address + PAGE_SIZE <= end_address )
   9.326 +    {
   9.327          tab = (pgentry_t *)start_info.pt_base;
   9.328          mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
   9.329  
   9.330 @@ -287,20 +318,25 @@ static void set_readonly(void *text, voi
   9.331  
   9.332          offset = l1_table_offset(start_address);
   9.333  
   9.334 -	if (start_address != (unsigned long)&shared_info) {
   9.335 -	    mmu_updates[count].ptr = ((pgentry_t)mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
   9.336 -	    mmu_updates[count].val = tab[offset] & ~_PAGE_RW;
   9.337 -	    count++;
   9.338 -	} else
   9.339 -	    printk("skipped %p\n", start_address);
   9.340 +        if ( start_address != (unsigned long)&shared_info )
   9.341 +        {
   9.342 +            mmu_updates[count].ptr = 
   9.343 +                ((pgentry_t)mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
   9.344 +            mmu_updates[count].val = tab[offset] & ~_PAGE_RW;
   9.345 +            count++;
   9.346 +        }
   9.347 +        else
   9.348 +            printk("skipped %p\n", start_address);
   9.349  
   9.350          start_address += PAGE_SIZE;
   9.351  
   9.352 -        if (count == L1_PAGETABLE_ENTRIES || start_address + PAGE_SIZE > end_address)
   9.353 +        if ( count == L1_PAGETABLE_ENTRIES || 
   9.354 +             start_address + PAGE_SIZE > end_address )
   9.355          {
   9.356 -            if(HYPERVISOR_mmu_update(mmu_updates, count, NULL, DOMID_SELF) < 0)
   9.357 +            rc = HYPERVISOR_mmu_update(mmu_updates, count, NULL, DOMID_SELF);
   9.358 +            if ( rc < 0 )
   9.359              {
   9.360 -                printk("PTE could not be updated\n");
   9.361 +                printk("ERROR: set_readonly(): PTE could not be updated\n");
   9.362                  do_exit();
   9.363              }
   9.364              count = 0;
   9.365 @@ -308,41 +344,73 @@ static void set_readonly(void *text, voi
   9.366      }
   9.367  
   9.368      {
   9.369 -	mmuext_op_t op = {
   9.370 -	    .cmd = MMUEXT_TLB_FLUSH_ALL,
   9.371 -	};
   9.372 -	int count;
   9.373 -	HYPERVISOR_mmuext_op(&op, 1, &count, DOMID_SELF);
   9.374 +        mmuext_op_t op = {
   9.375 +            .cmd = MMUEXT_TLB_FLUSH_ALL,
   9.376 +        };
   9.377 +        int count;
   9.378 +        HYPERVISOR_mmuext_op(&op, 1, &count, DOMID_SELF);
   9.379      }
   9.380  }
   9.381  
   9.382 -void mem_test(unsigned long *start_add, unsigned long *end_add)
   9.383 +/*
   9.384 + * A useful mem testing function. Write the address to every address in the
   9.385 + * range provided and read back the value. If verbose, print page walk to
   9.386 + * some VA
   9.387 + * 
   9.388 + * If we get MEM_TEST_MAX_ERRORS we might as well stop
   9.389 + */
   9.390 +#define MEM_TEST_MAX_ERRORS 10 
   9.391 +int mem_test(unsigned long *start_va, unsigned long *end_va, int verbose)
   9.392  {
   9.393      unsigned long mask = 0x10000;
   9.394      unsigned long *pointer;
   9.395 -
   9.396 -    for(pointer = start_add; pointer < end_add; pointer++)
   9.397 +    int error_count = 0;
   9.398 + 
   9.399 +    /* write values and print page walks */
   9.400 +    if ( verbose && (((unsigned long)start_va) & 0xfffff) )
   9.401      {
   9.402 -        if(!(((unsigned long)pointer) & 0xfffff))
   9.403 +        printk("MemTest Start: 0x%lx\n", start_va);
   9.404 +        page_walk((unsigned long)start_va);
   9.405 +    }
   9.406 +    for ( pointer = start_va; pointer < end_va; pointer++ )
   9.407 +    {
   9.408 +        if ( verbose && !(((unsigned long)pointer) & 0xfffff) )
   9.409          {
   9.410              printk("Writing to %lx\n", pointer);
   9.411              page_walk((unsigned long)pointer);
   9.412          }
   9.413          *pointer = (unsigned long)pointer & ~mask;
   9.414      }
   9.415 -
   9.416 -    for(pointer = start_add; pointer < end_add; pointer++)
   9.417 +    if ( verbose && (((unsigned long)end_va) & 0xfffff) )
   9.418      {
   9.419 -        if(((unsigned long)pointer & ~mask) != *pointer)
   9.420 +        printk("MemTest End: %lx\n", end_va-1);
   9.421 +        page_walk((unsigned long)end_va-1);
   9.422 +    }
   9.423 + 
   9.424 +    /* verify values */
   9.425 +    for ( pointer = start_va; pointer < end_va; pointer++ )
   9.426 +    {
   9.427 +        if ( ((unsigned long)pointer & ~mask) != *pointer )
   9.428 +        {
   9.429              printk("Read error at 0x%lx. Read: 0x%lx, should read 0x%lx\n",
   9.430 -                (unsigned long)pointer, 
   9.431 -                *pointer, 
   9.432 -                ((unsigned long)pointer & ~mask));
   9.433 +                   (unsigned long)pointer, *pointer, 
   9.434 +                   ((unsigned long)pointer & ~mask));
   9.435 +            error_count++;
   9.436 +            if ( error_count >= MEM_TEST_MAX_ERRORS )
   9.437 +            {
   9.438 +                printk("mem_test: too many errors\n");
   9.439 +                return -1;
   9.440 +            }
   9.441 +        }
   9.442      }
   9.443 -
   9.444 +    return 0;
   9.445  }
   9.446  
   9.447 -static pgentry_t *get_pgt(unsigned long addr)
   9.448 +
   9.449 +/*
   9.450 + * get the PTE for virtual address va if it exists. Otherwise NULL.
   9.451 + */
   9.452 +static pgentry_t *get_pgt(unsigned long va)
   9.453  {
   9.454      unsigned long mfn;
   9.455      pgentry_t *tab;
   9.456 @@ -352,67 +420,78 @@ static pgentry_t *get_pgt(unsigned long 
   9.457      mfn = virt_to_mfn(start_info.pt_base);
   9.458  
   9.459  #if defined(__x86_64__)
   9.460 -    offset = l4_table_offset(addr);
   9.461 -    if (!(tab[offset] & _PAGE_PRESENT))
   9.462 +    offset = l4_table_offset(va);
   9.463 +    if ( !(tab[offset] & _PAGE_PRESENT) )
   9.464          return NULL;
   9.465      mfn = pte_to_mfn(tab[offset]);
   9.466      tab = mfn_to_virt(mfn);
   9.467  #endif
   9.468 -    offset = l3_table_offset(addr);
   9.469 -    if (!(tab[offset] & _PAGE_PRESENT))
   9.470 +    offset = l3_table_offset(va);
   9.471 +    if ( !(tab[offset] & _PAGE_PRESENT) )
   9.472 +        return NULL;
   9.473 +    mfn = pte_to_mfn(tab[offset]);
   9.474 +    tab = mfn_to_virt(mfn);
   9.475 +    offset = l2_table_offset(va);
   9.476 +    if ( !(tab[offset] & _PAGE_PRESENT) )
   9.477          return NULL;
   9.478      mfn = pte_to_mfn(tab[offset]);
   9.479      tab = mfn_to_virt(mfn);
   9.480 -    offset = l2_table_offset(addr);
   9.481 -    if (!(tab[offset] & _PAGE_PRESENT))
   9.482 -        return NULL;
   9.483 -    mfn = pte_to_mfn(tab[offset]);
   9.484 -    tab = mfn_to_virt(mfn);
   9.485 -    offset = l1_table_offset(addr);
   9.486 +    offset = l1_table_offset(va);
   9.487      return &tab[offset];
   9.488  }
   9.489  
   9.490 -pgentry_t *need_pgt(unsigned long addr)
   9.491 +
   9.492 +/*
   9.493 + * return a valid PTE for a given virtual address. If PTE does not exist,
   9.494 + * allocate page-table pages.
   9.495 + */
   9.496 +pgentry_t *need_pgt(unsigned long va)
   9.497  {
   9.498 -    unsigned long mfn;
   9.499 +    unsigned long pt_mfn;
   9.500      pgentry_t *tab;
   9.501      unsigned long pt_pfn;
   9.502      unsigned offset;
   9.503  
   9.504      tab = (pgentry_t *)start_info.pt_base;
   9.505 -    mfn = virt_to_mfn(start_info.pt_base);
   9.506 +    pt_mfn = virt_to_mfn(start_info.pt_base);
   9.507  
   9.508  #if defined(__x86_64__)
   9.509 -    offset = l4_table_offset(addr);
   9.510 -    if (!(tab[offset] & _PAGE_PRESENT)) {
   9.511 +    offset = l4_table_offset(va);
   9.512 +    if ( !(tab[offset] & _PAGE_PRESENT) )
   9.513 +    {
   9.514          pt_pfn = virt_to_pfn(alloc_page());
   9.515 -        new_pt_frame(&pt_pfn, mfn, offset, L3_FRAME);
   9.516 +        new_pt_frame(&pt_pfn, pt_mfn, offset, L3_FRAME);
   9.517      }
   9.518      ASSERT(tab[offset] & _PAGE_PRESENT);
   9.519 -    mfn = pte_to_mfn(tab[offset]);
   9.520 -    tab = mfn_to_virt(mfn);
   9.521 +    pt_mfn = pte_to_mfn(tab[offset]);
   9.522 +    tab = mfn_to_virt(pt_mfn);
   9.523  #endif
   9.524 -    offset = l3_table_offset(addr);
   9.525 -    if (!(tab[offset] & _PAGE_PRESENT)) {
   9.526 +    offset = l3_table_offset(va);
   9.527 +    if ( !(tab[offset] & _PAGE_PRESENT) ) 
   9.528 +    {
   9.529          pt_pfn = virt_to_pfn(alloc_page());
   9.530 -        new_pt_frame(&pt_pfn, mfn, offset, L2_FRAME);
   9.531 +        new_pt_frame(&pt_pfn, pt_mfn, offset, L2_FRAME);
   9.532      }
   9.533      ASSERT(tab[offset] & _PAGE_PRESENT);
   9.534 -    mfn = pte_to_mfn(tab[offset]);
   9.535 -    tab = mfn_to_virt(mfn);
   9.536 -    offset = l2_table_offset(addr);
   9.537 -    if (!(tab[offset] & _PAGE_PRESENT)) {
   9.538 +    pt_mfn = pte_to_mfn(tab[offset]);
   9.539 +    tab = mfn_to_virt(pt_mfn);
   9.540 +    offset = l2_table_offset(va);
   9.541 +    if ( !(tab[offset] & _PAGE_PRESENT) )
   9.542 +    {
   9.543          pt_pfn = virt_to_pfn(alloc_page());
   9.544 -	new_pt_frame(&pt_pfn, mfn, offset, L1_FRAME);
   9.545 +        new_pt_frame(&pt_pfn, pt_mfn, offset, L1_FRAME);
   9.546      }
   9.547      ASSERT(tab[offset] & _PAGE_PRESENT);
   9.548 -    mfn = pte_to_mfn(tab[offset]);
   9.549 -    tab = mfn_to_virt(mfn);
   9.550 +    pt_mfn = pte_to_mfn(tab[offset]);
   9.551 +    tab = mfn_to_virt(pt_mfn);
   9.552  
   9.553 -    offset = l1_table_offset(addr);
   9.554 +    offset = l1_table_offset(va);
   9.555      return &tab[offset];
   9.556  }
   9.557  
   9.558 +/*
   9.559 + * Reserve an area of virtual address space for mappings and Heap
   9.560 + */
   9.561  static unsigned long demand_map_area_start;
   9.562  #ifdef __x86_64__
   9.563  #define DEMAND_MAP_PAGES ((128ULL << 30) / PAGE_SIZE)
   9.564 @@ -437,7 +516,8 @@ void arch_init_demand_mapping_area(unsig
   9.565  
   9.566      demand_map_area_start = (unsigned long) pfn_to_virt(cur_pfn);
   9.567      cur_pfn += DEMAND_MAP_PAGES;
   9.568 -    printk("Demand map pfns at %lx-%lx.\n", demand_map_area_start, pfn_to_virt(cur_pfn));
   9.569 +    printk("Demand map pfns at %lx-%lx.\n", 
   9.570 +           demand_map_area_start, pfn_to_virt(cur_pfn));
   9.571  
   9.572  #ifdef HAVE_LIBC
   9.573      cur_pfn++;
   9.574 @@ -448,104 +528,346 @@ void arch_init_demand_mapping_area(unsig
   9.575  #endif
   9.576  }
   9.577  
   9.578 +unsigned long allocate_ondemand(unsigned long n, unsigned long alignment)
   9.579 +{
   9.580 +    unsigned long x;
   9.581 +    unsigned long y = 0;
   9.582 +
   9.583 +    /* Find a properly aligned run of n contiguous frames */
   9.584 +    for ( x = 0;
   9.585 +          x <= DEMAND_MAP_PAGES - n; 
   9.586 +          x = (x + y + 1 + alignment - 1) & ~(alignment - 1) )
   9.587 +    {
   9.588 +        unsigned long addr = demand_map_area_start + x * PAGE_SIZE;
   9.589 +        pgentry_t *pgt = get_pgt(addr);
   9.590 +        for ( y = 0; y < n; y++, addr += PAGE_SIZE ) 
   9.591 +        {
   9.592 +            if ( !(addr & L1_MASK) )
   9.593 +                pgt = get_pgt(addr);
   9.594 +            if ( pgt )
   9.595 +            {
   9.596 +                if ( *pgt & _PAGE_PRESENT )
   9.597 +                    break;
   9.598 +                pgt++;
   9.599 +            }
   9.600 +        }
   9.601 +        if ( y == n )
   9.602 +            break;
   9.603 +    }
   9.604 +    if ( y != n )
   9.605 +    {
   9.606 +        printk("Failed to find %ld frames!\n", n);
   9.607 +        return 0;
   9.608 +    }
   9.609 +    return demand_map_area_start + x * PAGE_SIZE;
   9.610 +}
   9.611 +
   9.612 +/*
   9.613 + * Map an array of MFNs contiguously into virtual address space starting at
   9.614 + * va. map f[i*stride]+i*increment for i in 0..n-1.
   9.615 + */
   9.616  #define MAP_BATCH ((STACK_SIZE / 2) / sizeof(mmu_update_t))
   9.617 -void do_map_frames(unsigned long addr,
   9.618 -        unsigned long *f, unsigned long n, unsigned long stride,
   9.619 -	unsigned long increment, domid_t id, int may_fail, unsigned long prot)
   9.620 +void do_map_frames(unsigned long va,
   9.621 +                   unsigned long *mfns, unsigned long n, 
   9.622 +                   unsigned long stride, unsigned long incr, 
   9.623 +                   domid_t id, int may_fail,
   9.624 +                   unsigned long prot)
   9.625  {
   9.626      pgentry_t *pgt = NULL;
   9.627      unsigned long done = 0;
   9.628      unsigned long i;
   9.629      int rc;
   9.630  
   9.631 -    while (done < n) {
   9.632 -	unsigned long todo;
   9.633 +    if ( !mfns ) 
   9.634 +    {
   9.635 +        printk("do_map_frames: no mfns supplied\n");
   9.636 +        return;
   9.637 +    }
   9.638 +    DEBUG("va=%p n=0x%lx, mfns[0]=0x%lx stride=0x%lx incr=0x%lx prot=0x%lx\n",
   9.639 +          va, n, mfns[0], stride, incr, prot);
   9.640 + 
   9.641 +    while ( done < n )
   9.642 +    {
   9.643 +        unsigned long todo;
   9.644  
   9.645 -	if (may_fail)
   9.646 -	    todo = 1;
   9.647 -	else
   9.648 -	    todo = n - done;
   9.649 +        if ( may_fail )
   9.650 +            todo = 1;
   9.651 +        else
   9.652 +            todo = n - done;
   9.653  
   9.654 -	if (todo > MAP_BATCH)
   9.655 -		todo = MAP_BATCH;
   9.656 +        if ( todo > MAP_BATCH )
   9.657 +            todo = MAP_BATCH;
   9.658  
   9.659 -	{
   9.660 -	    mmu_update_t mmu_updates[todo];
   9.661 +        {
   9.662 +            mmu_update_t mmu_updates[todo];
   9.663  
   9.664 -	    for (i = 0; i < todo; i++, addr += PAGE_SIZE, pgt++) {
   9.665 -                if (!pgt || !(addr & L1_MASK))
   9.666 -                    pgt = need_pgt(addr);
   9.667 -		mmu_updates[i].ptr = virt_to_mach(pgt);
   9.668 -		mmu_updates[i].val = ((pgentry_t)(f[(done + i) * stride] + (done + i) * increment) << PAGE_SHIFT) | prot;
   9.669 -	    }
   9.670 +            for ( i = 0; i < todo; i++, va += PAGE_SIZE, pgt++) 
   9.671 +            {
   9.672 +                if ( !pgt || !(va & L1_MASK) )
   9.673 +                    pgt = need_pgt(va);
   9.674 +                
   9.675 +                mmu_updates[i].ptr = virt_to_mach(pgt) | MMU_NORMAL_PT_UPDATE;
   9.676 +                mmu_updates[i].val = ((pgentry_t)(mfns[(done + i) * stride] +
   9.677 +                                                  (done + i) * incr)
   9.678 +                                      << PAGE_SHIFT) | prot;
   9.679 +            }
   9.680  
   9.681 -	    rc = HYPERVISOR_mmu_update(mmu_updates, todo, NULL, id);
   9.682 -	    if (rc < 0) {
   9.683 -		if (may_fail)
   9.684 -		    f[done * stride] |= 0xF0000000;
   9.685 -		else {
   9.686 -		    printk("Map %ld (%lx, ...) at %p failed: %d.\n", todo, f[done * stride] + done * increment, addr, rc);
   9.687 +            rc = HYPERVISOR_mmu_update(mmu_updates, todo, NULL, id);
   9.688 +            if ( rc < 0 )
   9.689 +            {
   9.690 +                if (may_fail)
   9.691 +                    mfns[done * stride] |= 0xF0000000;
   9.692 +                else {
   9.693 +                    printk("Map %ld (%lx, ...) at %p failed: %d.\n",
   9.694 +                           todo, mfns[done * stride] + done * incr, va, rc);
   9.695                      do_exit();
   9.696 -		}
   9.697 -	    }
   9.698 -	}
   9.699 -
   9.700 -	done += todo;
   9.701 +                }
   9.702 +            }
   9.703 +        }
   9.704 +        done += todo;
   9.705      }
   9.706  }
   9.707  
   9.708 -unsigned long allocate_ondemand(unsigned long n, unsigned long alignment)
   9.709 +/*
   9.710 + * Map an array of MFNs contiguous into virtual address space. Virtual
   9.711 + * addresses are allocated from the on demand area.
   9.712 + */
   9.713 +void *map_frames_ex(unsigned long *mfns, unsigned long n, 
   9.714 +                    unsigned long stride, unsigned long incr,
   9.715 +                    unsigned long alignment,
   9.716 +                    domid_t id, int may_fail, unsigned long prot)
   9.717  {
   9.718 -    unsigned long x;
   9.719 -    unsigned long y = 0;
   9.720 +    unsigned long va = allocate_ondemand(n, alignment);
   9.721 +
   9.722 +    if ( !va )
   9.723 +        return NULL;
   9.724 +
   9.725 +    do_map_frames(va, mfns, n, stride, incr, id, may_fail, prot);
   9.726 +
   9.727 +    return (void *)va;
   9.728 +}
   9.729 +
   9.730 +/*
   9.731 + * Unmap nun_frames frames mapped at virtual address va.
   9.732 + */
   9.733 +#define UNMAP_BATCH ((STACK_SIZE / 2) / sizeof(multicall_entry_t))
   9.734 +int unmap_frames(unsigned long va, unsigned long num_frames)
   9.735 +{
   9.736 +    int n = UNMAP_BATCH;
   9.737 +    multicall_entry_t call[n];
   9.738 +    int ret;
   9.739 +    int i;
   9.740 +
   9.741 +    ASSERT(!((unsigned long)va & ~PAGE_MASK));
   9.742  
   9.743 -    /* Find a properly aligned run of n contiguous frames */
   9.744 -    for (x = 0; x <= DEMAND_MAP_PAGES - n; x = (x + y + 1 + alignment - 1) & ~(alignment - 1)) {
   9.745 -        unsigned long addr = demand_map_area_start + x * PAGE_SIZE;
   9.746 -        pgentry_t *pgt = get_pgt(addr);
   9.747 -        for (y = 0; y < n; y++, addr += PAGE_SIZE) {
   9.748 -            if (!(addr & L1_MASK))
   9.749 -                pgt = get_pgt(addr);
   9.750 -            if (pgt) {
   9.751 -                if (*pgt & _PAGE_PRESENT)
   9.752 -                    break;
   9.753 -                pgt++;
   9.754 +    DEBUG("va=%p, num=0x%lx\n", va, num_frames);
   9.755 +
   9.756 +    while ( num_frames ) {
   9.757 +        if ( n > num_frames )
   9.758 +            n = num_frames;
   9.759 +
   9.760 +        for ( i = 0; i < n; i++ )
   9.761 +        {
   9.762 +            int arg = 0;
   9.763 +            /* simply update the PTE for the VA and invalidate TLB */
   9.764 +            call[i].op = __HYPERVISOR_update_va_mapping;
   9.765 +            call[i].args[arg++] = va;
   9.766 +            call[i].args[arg++] = 0;
   9.767 +#ifdef __i386__
   9.768 +            call[i].args[arg++] = 0;
   9.769 +#endif  
   9.770 +            call[i].args[arg++] = UVMF_INVLPG;
   9.771 +
   9.772 +            va += PAGE_SIZE;
   9.773 +        }
   9.774 +
   9.775 +        ret = HYPERVISOR_multicall(call, n);
   9.776 +        if ( ret )
   9.777 +        {
   9.778 +            printk("update_va_mapping hypercall failed with rc=%d.\n", ret);
   9.779 +            return -ret;
   9.780 +        }
   9.781 +
   9.782 +        for ( i = 0; i < n; i++ )
   9.783 +        {
   9.784 +            if ( call[i].result ) 
   9.785 +            {
   9.786 +                printk("update_va_mapping failed for with rc=%d.\n", ret);
   9.787 +                return -(call[i].result);
   9.788              }
   9.789          }
   9.790 -        if (y == n)
   9.791 -            break;
   9.792 +        num_frames -= n;
   9.793      }
   9.794 -    if (y != n) {
   9.795 -        printk("Failed to find %ld frames!\n", n);
   9.796 -        return 0;
   9.797 -    }
   9.798 -    return demand_map_area_start + x * PAGE_SIZE;
   9.799 +    return 0;
   9.800  }
   9.801  
   9.802 -void *map_frames_ex(unsigned long *f, unsigned long n, unsigned long stride,
   9.803 -	unsigned long increment, unsigned long alignment, domid_t id,
   9.804 -	int may_fail, unsigned long prot)
   9.805 +/*
   9.806 + * Allocate pages which are contiguous in machine memory.
   9.807 + * Returns a VA to where they are mapped or 0 on failure.
   9.808 + * 
   9.809 + * addr_bits indicates if the region has restrictions on where it is
   9.810 + * located. Typical values are 32 (if for example PCI devices can't access
   9.811 + * 64bit memory) or 0 for no restrictions.
   9.812 + *
   9.813 + * Allocated pages can be freed using the page allocators free_pages() 
   9.814 + * function.
   9.815 + *
   9.816 + * based on Linux function xen_create_contiguous_region()
   9.817 + */
   9.818 +#define MAX_CONTIG_ORDER 9 /* 2MB */
   9.819 +unsigned long alloc_contig_pages(int order, unsigned int addr_bits)
   9.820  {
   9.821 -    unsigned long addr = allocate_ondemand(n, alignment);
   9.822 +    unsigned long in_va, va;
   9.823 +    unsigned long in_frames[1UL << order], out_frames, mfn;
   9.824 +    multicall_entry_t call[1UL << order];
   9.825 +    unsigned int i, num_pages = 1UL << order;
   9.826 +    int ret, exch_success;
   9.827 +
   9.828 +    /* pass in num_pages 'extends' of size 1 and
   9.829 +     * request 1 extend of size 'order */
   9.830 +    struct xen_memory_exchange exchange = {
   9.831 +        .in = {
   9.832 +            .nr_extents   = num_pages,
   9.833 +            .extent_order = 0,
   9.834 +            .domid        = DOMID_SELF
   9.835 +        },
   9.836 +        .out = {
   9.837 +            .nr_extents   = 1,
   9.838 +            .extent_order = order,
   9.839 +            .address_bits = addr_bits,
   9.840 +            .domid        = DOMID_SELF
   9.841 +        },
   9.842 +        .nr_exchanged = 0
   9.843 +    };
   9.844 +
   9.845 +    if ( order > MAX_CONTIG_ORDER )
   9.846 +    {
   9.847 +        printk("alloc_contig_pages: order too large 0x%x > 0x%x\n",
   9.848 +               order, MAX_CONTIG_ORDER);
   9.849 +        return 0;
   9.850 +    }
   9.851 +
   9.852 +    /* Allocate some potentially discontiguous pages */
   9.853 +    in_va = alloc_pages(order);
   9.854 +    if ( !in_va )
   9.855 +    {
   9.856 +        printk("alloc_contig_pages: could not get enough pages (order=0x%x\n",
   9.857 +               order);
   9.858 +        return 0;
   9.859 +    }
   9.860 +
   9.861 +    /* set up arguments for exchange hyper call */
   9.862 +    set_xen_guest_handle(exchange.in.extent_start, in_frames);
   9.863 +    set_xen_guest_handle(exchange.out.extent_start, &out_frames);
   9.864 +
   9.865 +    /* unmap current frames, keep a list of MFNs */
   9.866 +    for ( i = 0; i < num_pages; i++ )
   9.867 +    {
   9.868 +        int arg = 0;
   9.869 +
   9.870 +        va = in_va + (PAGE_SIZE * i);
   9.871 +        in_frames[i] = virt_to_mfn(va);
   9.872 +
   9.873 +        /* update P2M mapping */
   9.874 +        phys_to_machine_mapping[virt_to_pfn(va)] = INVALID_P2M_ENTRY;
   9.875  
   9.876 -    if (!addr)
   9.877 -        return NULL;
   9.878 +        /* build multi call */
   9.879 +        call[i].op = __HYPERVISOR_update_va_mapping;
   9.880 +        call[i].args[arg++] = va;
   9.881 +        call[i].args[arg++] = 0;
   9.882 +#ifdef __i386__
   9.883 +        call[i].args[arg++] = 0;
   9.884 +#endif  
   9.885 +        call[i].args[arg++] = UVMF_INVLPG;
   9.886 +    }
   9.887 +
   9.888 +    ret = HYPERVISOR_multicall(call, i);
   9.889 +    if ( ret )
   9.890 +    {
   9.891 +        printk("Odd, update_va_mapping hypercall failed with rc=%d.\n", ret);
   9.892 +        return 0;
   9.893 +    }
   9.894 +
   9.895 +    /* try getting a contig range of MFNs */
   9.896 +    out_frames = virt_to_pfn(in_va); /* PFNs to populate */
   9.897 +    ret = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
   9.898 +    if ( ret ) {
   9.899 +        printk("mem exchanged order=0x%x failed with rc=%d, nr_exchanged=%d\n", 
   9.900 +               order, ret, exchange.nr_exchanged);
   9.901 +        /* we still need to return the allocated pages above to the pool
   9.902 +         * ie. map them back into the 1:1 mapping etc. so we continue but 
   9.903 +         * in the end return the pages to the page allocator and return 0. */
   9.904 +        exch_success = 0;
   9.905 +    }
   9.906 +    else
   9.907 +        exch_success = 1;
   9.908  
   9.909 -    /* Found it at x.  Map it in. */
   9.910 -    do_map_frames(addr, f, n, stride, increment, id, may_fail, prot);
   9.911 +    /* map frames into 1:1 and update p2m */
   9.912 +    for ( i = 0; i < num_pages; i++ )
   9.913 +    {
   9.914 +        int arg = 0;
   9.915 +        pte_t pte;
   9.916 +
   9.917 +        va = in_va + (PAGE_SIZE * i);
   9.918 +        mfn = i < exchange.nr_exchanged ? (out_frames + i) : in_frames[i];
   9.919 +        pte = __pte(mfn << PAGE_SHIFT | L1_PROT);
   9.920 +
   9.921 +        /* update P2M mapping */
   9.922 +        phys_to_machine_mapping[virt_to_pfn(va)] = mfn;
   9.923  
   9.924 -    return (void *)addr;
   9.925 +        /* build multi call */
   9.926 +        call[i].op = __HYPERVISOR_update_va_mapping;
   9.927 +        call[i].args[arg++] = va;
   9.928 +#ifdef __x86_64__
   9.929 +        call[i].args[arg++] = (pgentry_t)pte.pte;
   9.930 +#else
   9.931 +        call[i].args[arg++] = pte.pte_low;
   9.932 +        call[i].args[arg++] = pte.pte_high;
   9.933 +#endif  
   9.934 +        call[i].args[arg++] = UVMF_INVLPG;
   9.935 +    }
   9.936 +    ret = HYPERVISOR_multicall(call, i);
   9.937 +    if ( ret )
   9.938 +    {
   9.939 +        printk("update_va_mapping hypercall no. 2 failed with rc=%d.\n", ret);
   9.940 +        return 0;
   9.941 +    }
   9.942 +
   9.943 +    if ( !exch_success )
   9.944 +    {
   9.945 +        /* since the exchanged failed we just free the pages as well */
   9.946 +        free_pages((void *) in_va, order);
   9.947 +        return 0;
   9.948 +    }
   9.949 +    
   9.950 +    return in_va;
   9.951  }
   9.952  
   9.953 +/*
   9.954 + * Check if a given MFN refers to real memory
   9.955 + */
   9.956 +static long system_ram_end_mfn;
   9.957 +int mfn_is_ram(unsigned long mfn)
   9.958 +{
   9.959 +    /* very crude check if a given MFN is memory or not. Probably should
   9.960 +     * make this a little more sophisticated ;) */
   9.961 +    return (mfn <= system_ram_end_mfn) ? 1 : 0;
   9.962 +}
   9.963 +
   9.964 +
   9.965 +/*
   9.966 + * Clear some of the bootstrap memory
   9.967 + */
   9.968  static void clear_bootstrap(void)
   9.969  {
   9.970      pte_t nullpte = { };
   9.971 +    int rc;
   9.972  
   9.973      /* Use first page as the CoW zero page */
   9.974      memset(&_text, 0, PAGE_SIZE);
   9.975      mfn_zero = virt_to_mfn((unsigned long) &_text);
   9.976 -    if (HYPERVISOR_update_va_mapping(0, nullpte, UVMF_INVLPG))
   9.977 -	printk("Unable to unmap NULL page\n");
   9.978 +    if ( (rc = HYPERVISOR_update_va_mapping(0, nullpte, UVMF_INVLPG)) )
   9.979 +        printk("Unable to unmap NULL page. rc=%d\n", rc);
   9.980  }
   9.981  
   9.982  void arch_init_p2m(unsigned long max_pfn)
   9.983 @@ -570,19 +892,19 @@ void arch_init_p2m(unsigned long max_pfn
   9.984      unsigned long pfn;
   9.985      
   9.986      l3_list = (unsigned long *)alloc_page(); 
   9.987 -    for(pfn=0; pfn<max_pfn; pfn++)
   9.988 +    for ( pfn=0; pfn<max_pfn; pfn++ )
   9.989      {
   9.990 -        if(!(pfn % (L1_P2M_ENTRIES * L2_P2M_ENTRIES)))
   9.991 +        if ( !(pfn % (L1_P2M_ENTRIES * L2_P2M_ENTRIES)) )
   9.992          {
   9.993              l2_list = (unsigned long*)alloc_page();
   9.994 -            if((pfn >> L3_P2M_SHIFT) > 0)
   9.995 +            if ( (pfn >> L3_P2M_SHIFT) > 0 )
   9.996              {
   9.997                  printk("Error: Too many pfns.\n");
   9.998                  do_exit();
   9.999              }
  9.1000              l3_list[(pfn >> L2_P2M_SHIFT)] = virt_to_mfn(l2_list);  
  9.1001          }
  9.1002 -        if(!(pfn % (L1_P2M_ENTRIES)))
  9.1003 +        if ( !(pfn % (L1_P2M_ENTRIES)) )
  9.1004          {
  9.1005              l1_list = (unsigned long*)alloc_page();
  9.1006              l2_list[(pfn >> L1_P2M_SHIFT) & L2_P2M_MASK] = 
  9.1007 @@ -598,33 +920,40 @@ void arch_init_p2m(unsigned long max_pfn
  9.1008  
  9.1009  void arch_init_mm(unsigned long* start_pfn_p, unsigned long* max_pfn_p)
  9.1010  {
  9.1011 -
  9.1012 -    unsigned long start_pfn, max_pfn, virt_pfns;
  9.1013 +    unsigned long start_pfn, max_pfn;
  9.1014  
  9.1015 -    printk("  _text:        %p\n", &_text);
  9.1016 -    printk("  _etext:       %p\n", &_etext);
  9.1017 -    printk("  _erodata:     %p\n", &_erodata);
  9.1018 -    printk("  _edata:       %p\n", &_edata);
  9.1019 -    printk("  stack start:  %p\n", stack);
  9.1020 -    printk("  _end:         %p\n", &_end);
  9.1021 +    printk("      _text: %p(VA)\n", &_text);
  9.1022 +    printk("     _etext: %p(VA)\n", &_etext);
  9.1023 +    printk("   _erodata: %p(VA)\n", &_erodata);
  9.1024 +    printk("     _edata: %p(VA)\n", &_edata);
  9.1025 +    printk("stack start: %p(VA)\n", stack);
  9.1026 +    printk("       _end: %p(VA)\n", &_end);
  9.1027  
  9.1028      /* First page follows page table pages and 3 more pages (store page etc) */
  9.1029      start_pfn = PFN_UP(to_phys(start_info.pt_base)) + 
  9.1030 -                start_info.nr_pt_frames + 3;
  9.1031 +        start_info.nr_pt_frames + 3;
  9.1032      max_pfn = start_info.nr_pages;
  9.1033  
  9.1034      /* We need room for demand mapping and heap, clip available memory */
  9.1035 -    virt_pfns = DEMAND_MAP_PAGES + HEAP_PAGES;
  9.1036 -    if (max_pfn + virt_pfns + 1 < max_pfn)
  9.1037 -        max_pfn = -(virt_pfns + 1);
  9.1038 +#if defined(__i386__)
  9.1039 +    {
  9.1040 +        unsigned long virt_pfns = 1 + DEMAND_MAP_PAGES + 1 + HEAP_PAGES;
  9.1041 +        if (max_pfn + virt_pfns >= 0x100000)
  9.1042 +            max_pfn = 0x100000 - virt_pfns - 1;
  9.1043 +    }
  9.1044 +#endif
  9.1045  
  9.1046 -    printk("  start_pfn:    %lx\n", start_pfn);
  9.1047 -    printk("  max_pfn:      %lx\n", max_pfn);
  9.1048 +    printk("  start_pfn: %lx\n", start_pfn);
  9.1049 +    printk("    max_pfn: %lx\n", max_pfn);
  9.1050  
  9.1051      build_pagetable(&start_pfn, &max_pfn);
  9.1052      clear_bootstrap();
  9.1053      set_readonly(&_text, &_erodata);
  9.1054  
  9.1055 +    /* get the number of physical pages the system has. Used to check for
  9.1056 +     * system memory. */
  9.1057 +    system_ram_end_mfn = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
  9.1058 +
  9.1059      *start_pfn_p = start_pfn;
  9.1060      *max_pfn_p = max_pfn;
  9.1061  }
    10.1 --- a/extras/mini-os/arch/x86/setup.c	Mon Mar 30 19:56:30 2009 -0700
    10.2 +++ b/extras/mini-os/arch/x86/setup.c	Thu Apr 23 18:49:41 2009 -0700
    10.3 @@ -63,10 +63,12 @@ void failsafe_callback(void);
    10.4  static
    10.5  shared_info_t *map_shared_info(unsigned long pa)
    10.6  {
    10.7 -	if ( HYPERVISOR_update_va_mapping(
    10.8 -		(unsigned long)shared_info, __pte(pa | 7), UVMF_INVLPG) )
    10.9 +    int rc;
   10.10 +
   10.11 +	if ( (rc = HYPERVISOR_update_va_mapping(
   10.12 +              (unsigned long)shared_info, __pte(pa | 7), UVMF_INVLPG)) )
   10.13  	{
   10.14 -		printk("Failed to map shared_info!!\n");
   10.15 +		printk("Failed to map shared_info!! rc=%d\n", rc);
   10.16  		do_exit();
   10.17  	}
   10.18  	return (shared_info_t *)shared_info;
    11.1 --- a/extras/mini-os/blkfront.c	Mon Mar 30 19:56:30 2009 -0700
    11.2 +++ b/extras/mini-os/blkfront.c	Thu Apr 23 18:49:41 2009 -0700
    11.3 @@ -244,10 +244,6 @@ void shutdown_blkfront(struct blkfront_d
    11.4      xenbus_wait_for_value(path, "5", &dev->events);
    11.5  
    11.6      err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 6);
    11.7 -    xenbus_wait_for_value(path, "6", &dev->events);
    11.8 -
    11.9 -    err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1);
   11.10 -    xenbus_wait_for_value(path, "2", &dev->events);
   11.11  
   11.12      xenbus_unwatch_path(XBT_NIL, path);
   11.13  
   11.14 @@ -317,19 +313,21 @@ void blkfront_aio(struct blkfront_aiocb 
   11.15      req->sector_number = aiocbp->aio_offset / dev->info.sector_size;
   11.16  
   11.17      for (j = 0; j < n; j++) {
   11.18 +        req->seg[j].first_sect = 0;
   11.19 +        req->seg[j].last_sect = PAGE_SIZE / dev->info.sector_size - 1;
   11.20 +    }
   11.21 +    req->seg[0].first_sect = ((uintptr_t)aiocbp->aio_buf & ~PAGE_MASK) / dev->info.sector_size;
   11.22 +    req->seg[n-1].last_sect = (((uintptr_t)aiocbp->aio_buf + aiocbp->aio_nbytes - 1) & ~PAGE_MASK) / dev->info.sector_size;
   11.23 +    for (j = 0; j < n; j++) {
   11.24  	uintptr_t data = start + j * PAGE_SIZE;
   11.25          if (!write) {
   11.26              /* Trigger CoW if needed */
   11.27 -            *(char*)data = 0;
   11.28 +            *(char*)(data + (req->seg[j].first_sect << 9)) = 0;
   11.29              barrier();
   11.30          }
   11.31  	aiocbp->gref[j] = req->seg[j].gref =
   11.32              gnttab_grant_access(dev->dom, virtual_to_mfn(data), write);
   11.33 -	req->seg[j].first_sect = 0;
   11.34 -	req->seg[j].last_sect = PAGE_SIZE / dev->info.sector_size - 1;
   11.35      }
   11.36 -    req->seg[0].first_sect = ((uintptr_t)aiocbp->aio_buf & ~PAGE_MASK) / dev->info.sector_size;
   11.37 -    req->seg[n-1].last_sect = (((uintptr_t)aiocbp->aio_buf + aiocbp->aio_nbytes - 1) & ~PAGE_MASK) / dev->info.sector_size;
   11.38  
   11.39      dev->ring.req_prod_pvt = i + 1;
   11.40  
    12.1 --- a/extras/mini-os/events.c	Mon Mar 30 19:56:30 2009 -0700
    12.2 +++ b/extras/mini-os/events.c	Thu Apr 23 18:49:41 2009 -0700
    12.3 @@ -42,19 +42,23 @@ void unbind_all_ports(void)
    12.4      int cpu = 0;
    12.5      shared_info_t *s = HYPERVISOR_shared_info;
    12.6      vcpu_info_t   *vcpu_info = &s->vcpu_info[cpu];
    12.7 +    int rc;
    12.8  
    12.9 -    for (i = 0; i < NR_EVS; i++)
   12.10 +    for ( i = 0; i < NR_EVS; i++ )
   12.11      {
   12.12 -        if (i == start_info.console.domU.evtchn ||
   12.13 -            i == start_info.store_evtchn)
   12.14 +        if ( i == start_info.console.domU.evtchn ||
   12.15 +             i == start_info.store_evtchn)
   12.16              continue;
   12.17 -        if (test_and_clear_bit(i, bound_ports))
   12.18 +
   12.19 +        if ( test_and_clear_bit(i, bound_ports) )
   12.20          {
   12.21              struct evtchn_close close;
   12.22              printk("port %d still bound!\n", i);
   12.23              mask_evtchn(i);
   12.24              close.port = i;
   12.25 -            HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
   12.26 +            rc = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
   12.27 +            if ( rc )
   12.28 +                printk("WARN: close_port %s failed rc=%d. ignored\n", i, rc);
   12.29              clear_evtchn(i);
   12.30          }
   12.31      }
   12.32 @@ -71,8 +75,9 @@ int do_event(evtchn_port_t port, struct 
   12.33  
   12.34      clear_evtchn(port);
   12.35  
   12.36 -    if (port >= NR_EVS) {
   12.37 -        printk("Port number too large: %d\n", port);
   12.38 +    if ( port >= NR_EVS )
   12.39 +    {
   12.40 +        printk("WARN: do_event(): Port number too large: %d\n", port);
   12.41          return 1;
   12.42      }
   12.43  
   12.44 @@ -89,9 +94,9 @@ int do_event(evtchn_port_t port, struct 
   12.45  evtchn_port_t bind_evtchn(evtchn_port_t port, evtchn_handler_t handler,
   12.46  						  void *data)
   12.47  {
   12.48 - 	if(ev_actions[port].handler != default_handler)
   12.49 + 	if ( ev_actions[port].handler != default_handler )
   12.50          printk("WARN: Handler for port %d already registered, replacing\n",
   12.51 -				port);
   12.52 +               port);
   12.53  
   12.54  	ev_actions[port].data = data;
   12.55  	wmb();
   12.56 @@ -104,8 +109,9 @@ evtchn_port_t bind_evtchn(evtchn_port_t 
   12.57  void unbind_evtchn(evtchn_port_t port )
   12.58  {
   12.59  	struct evtchn_close close;
   12.60 +    int rc;
   12.61  
   12.62 -	if (ev_actions[port].handler == default_handler)
   12.63 +	if ( ev_actions[port].handler == default_handler )
   12.64  		printk("WARN: No handler for port %d when unbinding\n", port);
   12.65  	mask_evtchn(port);
   12.66  	clear_evtchn(port);
   12.67 @@ -116,37 +122,43 @@ void unbind_evtchn(evtchn_port_t port )
   12.68  	clear_bit(port, bound_ports);
   12.69  
   12.70  	close.port = port;
   12.71 -	HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
   12.72 +	rc = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
   12.73 +    if ( rc )
   12.74 +        printk("WARN: close_port %s failed rc=%d. ignored\n", port, rc);
   12.75 +        
   12.76  }
   12.77  
   12.78  evtchn_port_t bind_virq(uint32_t virq, evtchn_handler_t handler, void *data)
   12.79  {
   12.80  	evtchn_bind_virq_t op;
   12.81 +    int rc;
   12.82  
   12.83  	/* Try to bind the virq to a port */
   12.84  	op.virq = virq;
   12.85  	op.vcpu = smp_processor_id();
   12.86  
   12.87 -	if ( HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, &op) != 0 )
   12.88 +	if ( (rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, &op)) != 0 )
   12.89  	{
   12.90 -		printk("Failed to bind virtual IRQ %d\n", virq);
   12.91 +		printk("Failed to bind virtual IRQ %d with rc=%d\n", virq, rc);
   12.92  		return -1;
   12.93      }
   12.94      bind_evtchn(op.port, handler, data);
   12.95  	return op.port;
   12.96  }
   12.97  
   12.98 -evtchn_port_t bind_pirq(uint32_t pirq, int will_share, evtchn_handler_t handler, void *data)
   12.99 +evtchn_port_t bind_pirq(uint32_t pirq, int will_share,
  12.100 +                        evtchn_handler_t handler, void *data)
  12.101  {
  12.102  	evtchn_bind_pirq_t op;
  12.103 +    int rc;
  12.104  
  12.105  	/* Try to bind the pirq to a port */
  12.106  	op.pirq = pirq;
  12.107  	op.flags = will_share ? BIND_PIRQ__WILL_SHARE : 0;
  12.108  
  12.109 -	if ( HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &op) != 0 )
  12.110 +	if ( (rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &op)) != 0 )
  12.111  	{
  12.112 -		printk("Failed to bind physical IRQ %d\n", pirq);
  12.113 +		printk("Failed to bind physical IRQ %d with rc=%d\n", pirq, rc);
  12.114  		return -1;
  12.115  	}
  12.116  	bind_evtchn(op.port, handler, data);
  12.117 @@ -173,7 +185,8 @@ void init_events(void)
  12.118      asm volatile("movl %0,%%fs ; movl %0,%%gs" :: "r" (0));
  12.119      wrmsrl(0xc0000101, &cpu0_pda); /* 0xc0000101 is MSR_GS_BASE */
  12.120      cpu0_pda.irqcount = -1;
  12.121 -    cpu0_pda.irqstackptr = (void*) (((unsigned long)irqstack + 2 * STACK_SIZE) & ~(STACK_SIZE - 1));
  12.122 +    cpu0_pda.irqstackptr = (void*) (((unsigned long)irqstack + 2 * STACK_SIZE)
  12.123 +                                    & ~(STACK_SIZE - 1));
  12.124  #endif
  12.125      /* initialize event handler */
  12.126      for ( i = 0; i < NR_EVS; i++ )
  12.127 @@ -207,15 +220,19 @@ void default_handler(evtchn_port_t port,
  12.128  int evtchn_alloc_unbound(domid_t pal, evtchn_handler_t handler,
  12.129  						 void *data, evtchn_port_t *port)
  12.130  {
  12.131 -    int err;
  12.132 +    int rc;
  12.133 +
  12.134      evtchn_alloc_unbound_t op;
  12.135      op.dom = DOMID_SELF;
  12.136      op.remote_dom = pal;
  12.137 -    err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &op);
  12.138 -    if (err)
  12.139 -		return err;
  12.140 +    rc = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &op);
  12.141 +    if ( rc )
  12.142 +    {
  12.143 +        printk("ERROR: alloc_unbound failed with rc=%d", rc);
  12.144 +		return rc;
  12.145 +    }
  12.146      *port = bind_evtchn(op.port, handler, data);
  12.147 -    return err;
  12.148 +    return rc;
  12.149  }
  12.150  
  12.151  /* Connect to a port so as to allow the exchange of notifications with
  12.152 @@ -225,15 +242,28 @@ int evtchn_bind_interdomain(domid_t pal,
  12.153  			    evtchn_handler_t handler, void *data,
  12.154  			    evtchn_port_t *local_port)
  12.155  {
  12.156 -    int err;
  12.157 +    int rc;
  12.158      evtchn_port_t port;
  12.159      evtchn_bind_interdomain_t op;
  12.160      op.remote_dom = pal;
  12.161      op.remote_port = remote_port;
  12.162 -    err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &op);
  12.163 -    if (err)
  12.164 -		return err;
  12.165 +    rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &op);
  12.166 +    if ( rc )
  12.167 +    {
  12.168 +        printk("ERROR: bind_interdomain failed with rc=%d", rc);
  12.169 +		return rc;
  12.170 +    }
  12.171      port = op.local_port;
  12.172      *local_port = bind_evtchn(port, handler, data);
  12.173 -    return err;
  12.174 +    return rc;
  12.175  }
  12.176 +
  12.177 +/*
  12.178 + * Local variables:
  12.179 + * mode: C
  12.180 + * c-set-style: "BSD"
  12.181 + * c-basic-offset: 4
  12.182 + * tab-width: 4
  12.183 + * indent-tabs-mode: nil
  12.184 + * End:
  12.185 + */
    13.1 --- a/extras/mini-os/include/blkfront.h	Mon Mar 30 19:56:30 2009 -0700
    13.2 +++ b/extras/mini-os/include/blkfront.h	Thu Apr 23 18:49:41 2009 -0700
    13.3 @@ -8,6 +8,8 @@ struct blkfront_aiocb
    13.4      uint8_t *aio_buf;
    13.5      size_t aio_nbytes;
    13.6      off_t aio_offset;
    13.7 +    size_t total_bytes;
    13.8 +    uint8_t is_write;
    13.9      void *data;
   13.10  
   13.11      grant_ref_t gref[BLKIF_MAX_SEGMENTS_PER_REQUEST];
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/extras/mini-os/include/ioremap.h	Thu Apr 23 18:49:41 2009 -0700
    14.3 @@ -0,0 +1,33 @@
    14.4 +/**
    14.5 + * Copyright (C) 2009 Netronome Systems, Inc.  All rights reserved.
    14.6 + *
    14.7 + * Permission is hereby granted, free of charge, to any person obtaining a copy
    14.8 + * of this software and associated documentation files (the "Software"), to
    14.9 + * deal in the Software without restriction, including without limitation the
   14.10 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
   14.11 + * sell copies of the Software, and to permit persons to whom the Software is
   14.12 + * furnished to do so, subject to the following conditions:
   14.13 + * 
   14.14 + * The above copyright notice and this permission notice shall be included in
   14.15 + * all copies or substantial portions of the Software.
   14.16 + * 
   14.17 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
   14.18 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
   14.19 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
   14.20 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
   14.21 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
   14.22 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
   14.23 + * DEALINGS IN THE SOFTWARE.
   14.24 + */
   14.25 +
   14.26 +
   14.27 +#ifndef _IOREMAP_H_
   14.28 +#define _IOREMAP_H_
   14.29 +
   14.30 +void *ioremap(unsigned long phys_addr, unsigned long size);
   14.31 +void *ioremap_nocache(unsigned long phys_addr, unsigned long size);
   14.32 +void iounmap(void *virt_addr, unsigned long size);
   14.33 +
   14.34 +#endif /* _IOREMAP_H_ */
   14.35 +
   14.36 +/* -*-  Mode:C; c-basic-offset:4; tab-width:4 indent-tabs-mode:nil -*- */
    15.1 --- a/extras/mini-os/include/mm.h	Mon Mar 30 19:56:30 2009 -0700
    15.2 +++ b/extras/mini-os/include/mm.h	Thu Apr 23 18:49:41 2009 -0700
    15.3 @@ -71,6 +71,8 @@ void *map_frames_ex(unsigned long *f, un
    15.4  void do_map_frames(unsigned long addr,
    15.5          unsigned long *f, unsigned long n, unsigned long stride,
    15.6  	unsigned long increment, domid_t id, int may_fail, unsigned long prot);
    15.7 +int unmap_frames(unsigned long va, unsigned long num_frames);
    15.8 +unsigned long alloc_contig_pages(int order, unsigned int addr_bits);
    15.9  #ifdef HAVE_LIBC
   15.10  extern unsigned long heap, brk, heap_mapped, heap_end;
   15.11  #endif
    16.1 --- a/extras/mini-os/include/x86/arch_mm.h	Mon Mar 30 19:56:30 2009 -0700
    16.2 +++ b/extras/mini-os/include/x86/arch_mm.h	Thu Apr 23 18:49:41 2009 -0700
    16.3 @@ -133,6 +133,13 @@ typedef unsigned long pgentry_t;
    16.4  #define L4_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
    16.5  #endif /* __i386__ || __x86_64__ */
    16.6  
    16.7 +/* flags for ioremap */
    16.8 +#define IO_PROT (L1_PROT)
    16.9 +#define IO_PROT_NOCACHE (L1_PROT | _PAGE_PCD)
   16.10 +
   16.11 +/* for P2M */
   16.12 +#define INVALID_P2M_ENTRY (~0UL)
   16.13 +
   16.14  #include "arch_limits.h"
   16.15  #define PAGE_SIZE       __PAGE_SIZE
   16.16  #define PAGE_SHIFT      __PAGE_SHIFT
   16.17 @@ -222,5 +229,6 @@ static __inline__ paddr_t machine_to_phy
   16.18  #define do_map_zero(start, n) do_map_frames(start, &mfn_zero, n, 0, 0, DOMID_SELF, 0, L1_PROT_RO)
   16.19  
   16.20  pgentry_t *need_pgt(unsigned long addr);
   16.21 +int mfn_is_ram(unsigned long mfn);
   16.22  
   16.23  #endif /* _ARCH_MM_H_ */
    17.1 --- a/extras/mini-os/kernel.c	Mon Mar 30 19:56:30 2009 -0700
    17.2 +++ b/extras/mini-os/kernel.c	Thu Apr 23 18:49:41 2009 -0700
    17.3 @@ -490,14 +490,16 @@ void start_kernel(start_info_t *si)
    17.4  
    17.5      /* print out some useful information  */
    17.6      printk("Xen Minimal OS!\n");
    17.7 -    printk("start_info:   %p\n",    si);
    17.8 -    printk("  nr_pages:   %lu",     si->nr_pages);
    17.9 -    printk("  shared_inf: %08lx\n", si->shared_info);
   17.10 -    printk("  pt_base:    %p",      (void *)si->pt_base); 
   17.11 -    printk("  mod_start:  0x%lx\n", si->mod_start);
   17.12 -    printk("  mod_len:    %lu\n",   si->mod_len); 
   17.13 -    printk("  flags:      0x%x\n",  (unsigned int)si->flags);
   17.14 -    printk("  cmd_line:   %s\n",  
   17.15 +    printk("  start_info: %p(VA)\n", si);
   17.16 +    printk("    nr_pages: 0x%lx\n", si->nr_pages);
   17.17 +    printk("  shared_inf: 0x%08lx(MA)\n", si->shared_info);
   17.18 +    printk("     pt_base: %p(VA)\n", (void *)si->pt_base); 
   17.19 +    printk("nr_pt_frames: 0x%lx\n", si->nr_pt_frames);
   17.20 +    printk("    mfn_list: %p(VA)\n", (void *)si->mfn_list); 
   17.21 +    printk("   mod_start: 0x%lx(VA)\n", si->mod_start);
   17.22 +    printk("     mod_len: %lu\n", si->mod_len); 
   17.23 +    printk("       flags: 0x%x\n", (unsigned int)si->flags);
   17.24 +    printk("    cmd_line: %s\n",  
   17.25             si->cmd_line ? (const char *)si->cmd_line : "NULL");
   17.26  
   17.27      /* Set up events. */
    18.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.2 +++ b/extras/mini-os/lib/stack_chk_fail.c	Thu Apr 23 18:49:41 2009 -0700
    18.3 @@ -0,0 +1,8 @@
    18.4 +#include <kernel.h>
    18.5 +#include <console.h>
    18.6 +
    18.7 +void __stack_chk_fail(void)
    18.8 +{
    18.9 +    printk("stack smashing detected\n");
   18.10 +    do_exit();
   18.11 +}
    19.1 --- a/extras/mini-os/lib/sys.c	Mon Mar 30 19:56:30 2009 -0700
    19.2 +++ b/extras/mini-os/lib/sys.c	Thu Apr 23 18:49:41 2009 -0700
    19.3 @@ -1206,47 +1206,15 @@ void *mmap(void *start, size_t length, i
    19.4      } else ASSERT(0);
    19.5  }
    19.6  
    19.7 -#define UNMAP_BATCH ((STACK_SIZE / 2) / sizeof(multicall_entry_t))
    19.8  int munmap(void *start, size_t length)
    19.9  {
   19.10      int total = length / PAGE_SIZE;
   19.11 -    ASSERT(!((unsigned long)start & ~PAGE_MASK));
   19.12 -    while (total) {
   19.13 -        int n = UNMAP_BATCH;
   19.14 -        if (n > total)
   19.15 -            n = total;
   19.16 -        {
   19.17 -            int i;
   19.18 -            multicall_entry_t call[n];
   19.19 -            unsigned char (*data)[PAGE_SIZE] = start;
   19.20 -            int ret;
   19.21 +    int ret;
   19.22  
   19.23 -            for (i = 0; i < n; i++) {
   19.24 -                int arg = 0;
   19.25 -                call[i].op = __HYPERVISOR_update_va_mapping;
   19.26 -                call[i].args[arg++] = (unsigned long) &data[i];
   19.27 -                call[i].args[arg++] = 0;
   19.28 -#ifdef __i386__
   19.29 -                call[i].args[arg++] = 0;
   19.30 -#endif
   19.31 -                call[i].args[arg++] = UVMF_INVLPG;
   19.32 -            }
   19.33 -
   19.34 -            ret = HYPERVISOR_multicall(call, n);
   19.35 -            if (ret) {
   19.36 -                errno = -ret;
   19.37 -                return -1;
   19.38 -            }
   19.39 -
   19.40 -            for (i = 0; i < n; i++) {
   19.41 -                if (call[i].result) {
   19.42 -                    errno = call[i].result;
   19.43 -                    return -1;
   19.44 -                }
   19.45 -            }
   19.46 -        }
   19.47 -        start = (char *)start + n * PAGE_SIZE;
   19.48 -        total -= n;
   19.49 +    ret = unmap_frames((unsigned long)start, (unsigned long)total);
   19.50 +    if (ret) {
   19.51 +        errno = ret;
   19.52 +        return -1;
   19.53      }
   19.54      return 0;
   19.55  }
    20.1 --- a/stubdom/Makefile	Mon Mar 30 19:56:30 2009 -0700
    20.2 +++ b/stubdom/Makefile	Thu Apr 23 18:49:41 2009 -0700
    20.3 @@ -7,8 +7,6 @@ export stubdom=y
    20.4  export debug=y
    20.5  include $(XEN_ROOT)/Config.mk
    20.6  
    20.7 -IOEMU_OPTIONS=--disable-sdl --disable-opengl --disable-vnc-tls --disable-brlapi --disable-kqemu
    20.8 -
    20.9  #ZLIB_URL?=http://www.zlib.net
   20.10  ZLIB_URL=$(XEN_EXTFILES_URL)
   20.11  ZLIB_VERSION=1.2.3
   20.12 @@ -93,6 +91,7 @@ newlib-$(NEWLIB_VERSION).tar.gz:
   20.13  newlib-$(NEWLIB_VERSION): newlib-$(NEWLIB_VERSION).tar.gz
   20.14  	tar xzf $<
   20.15  	patch -d $@ -p0 < newlib.patch
   20.16 +	patch -d $@ -p0 < newlib-chk.patch
   20.17  	touch $@
   20.18  
   20.19  NEWLIB_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libc.a
   20.20 @@ -237,8 +236,12 @@ ioemu: cross-zlib cross-libpci libxc
   20.21  	[ -f ioemu/config-host.mak ] || \
   20.22  	  ( $(absolutify_xen_root); \
   20.23  	    cd ioemu ; \
   20.24 -          CONFIG_STUBDOM=yes XEN_TARGET_ARCH=$(XEN_TARGET_ARCH) CFLAGS="$(TARGET_CFLAGS)" sh ./xen-setup --cc=$(CC) --disable-gcc-check $(IOEMU_OPTIONS))
   20.25 -	CPPFLAGS= TARGET_CPPFLAGS="$(TARGET_CPPFLAGS)" $(MAKE) -C ioemu LWIPDIR=$(CURDIR)/lwip-$(XEN_TARGET_ARCH) TOOLS= CONFIG_STUBDOM=yes
   20.26 +	    LWIPDIR=$(CURDIR)/lwip-$(XEN_TARGET_ARCH) \
   20.27 +	    TARGET_CPPFLAGS="$(TARGET_CPPFLAGS)" \
   20.28 +	    TARGET_CFLAGS="$(TARGET_CFLAGS)" \
   20.29 +	    TARGET_LDFLAGS="$(TARGET_LDFLAGS)" \
   20.30 +	    ./xen-setup-stubdom )
   20.31 +	$(MAKE) -C ioemu
   20.32  
   20.33  ######
   20.34  # caml
   20.35 @@ -312,14 +315,14 @@ install-readme:
   20.36  	$(INSTALL_DATA) README $(DESTDIR)$(DOCDIR)/README.stubdom
   20.37  
   20.38  install-ioemu: ioemu-stubdom
   20.39 -	$(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/bin"
   20.40 -	$(INSTALL_PROG) stubdom-dm "$(DESTDIR)/usr/lib/xen/bin"
   20.41 -	$(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/boot"
   20.42 -	$(INSTALL_DATA) mini-os-$(XEN_TARGET_ARCH)-ioemu/mini-os.gz "$(DESTDIR)/usr/lib/xen/boot/ioemu-stubdom.gz"
   20.43 +	$(INSTALL_DIR) "$(DESTDIR)$(LIBEXEC)"
   20.44 +	$(INSTALL_PROG) stubdom-dm "$(DESTDIR)$(LIBEXEC)"
   20.45 +	$(INSTALL_DIR) "$(DESTDIR)$(LIBDIR_x86_32)/xen/boot"
   20.46 +	$(INSTALL_DATA) mini-os-$(XEN_TARGET_ARCH)-ioemu/mini-os.gz "$(DESTDIR)$(LIBDIR_x86_32)/xen/boot/ioemu-stubdom.gz"
   20.47  
   20.48  install-grub: pv-grub
   20.49 -	$(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/boot"
   20.50 -	$(INSTALL_DATA) mini-os-$(XEN_TARGET_ARCH)-grub/mini-os.gz "$(DESTDIR)/usr/lib/xen/boot/pv-grub-$(XEN_TARGET_ARCH).gz"
   20.51 +	$(INSTALL_DIR) "$(DESTDIR)$(LIBDIR_x86_32)/xen/boot"
   20.52 +	$(INSTALL_DATA) mini-os-$(XEN_TARGET_ARCH)-grub/mini-os.gz "$(DESTDIR)$(LIBDIR_x86_32)/xen/boot/pv-grub-$(XEN_TARGET_ARCH).gz"
   20.53  
   20.54  #######
   20.55  # clean
    21.1 --- a/stubdom/stubdom-dm	Mon Mar 30 19:56:30 2009 -0700
    21.2 +++ b/stubdom/stubdom-dm	Thu Apr 23 18:49:41 2009 -0700
    21.3 @@ -15,7 +15,10 @@ domname=
    21.4  vncviewer=0
    21.5  vncpid=
    21.6  extra=
    21.7 -videoram=4
    21.8 +sdl=0
    21.9 +opengl=1
   21.10 +vnc=0
   21.11 +vncunused=0
   21.12  while [ "$#" -gt 0 ];
   21.13  do
   21.14      if [ "$#" -ge 2 ];
   21.15 @@ -31,22 +34,30 @@ do
   21.16                  shift
   21.17                  ;;
   21.18  	    -vnc)
   21.19 -		ip=${2%:*};
   21.20 -		vnc_port=${2#*:};
   21.21 +                vnc=1
   21.22 +                op=${2%,*}
   21.23 +		ip=${op%:*};
   21.24 +		vnc_port=${op#*:};
   21.25  		shift
   21.26  		;;
   21.27 +            -vncunused)
   21.28 +                vncunused=1
   21.29 +                shift
   21.30 +                ;;
   21.31              -loadvm)
   21.32                  extra="$extra -loadvm $2";
   21.33                  shift
   21.34                  ;;
   21.35 -	    -videoram)
   21.36 -	        videoram="$2"
   21.37 -		shift
   21.38 -		;;
   21.39 +            -k)
   21.40 +                keymap=$2
   21.41 +                shift
   21.42 +                ;;
   21.43  	esac
   21.44      fi
   21.45      case "$1" in
   21.46  	-vncviewer) vncviewer=1 ;;
   21.47 +        -sdl) sdl=1 ;;
   21.48 +        -disable-opengl) opengl=0 ;;
   21.49      esac
   21.50      shift
   21.51  done
   21.52 @@ -61,7 +72,7 @@ term() {
   21.53      (
   21.54  	[ -n "$vncpid" ] && kill -9 $vncpid
   21.55  	xm destroy $domname-dm
   21.56 -	#xm destroy $domname
   21.57 +        rm /etc/xen/stubdoms/$domname-dm
   21.58      ) &
   21.59      # We need to exit immediately so as to let xend do the commands above
   21.60      exit 0
   21.61 @@ -77,7 +88,58 @@ do
   21.62  	sleep 1
   21.63  done
   21.64  
   21.65 -creation="xm create -c $domname-dm target=$domid memory=32 videoram=$videoram extra=\"$extra\""
   21.66 +# Generate stubdom config file
   21.67 +mkdir -p /etc/xen/stubdoms &>/dev/null
   21.68 +echo "#This file is autogenerated, edit $domname instead!" > /etc/xen/stubdoms/$domname-dm
   21.69 +echo "kernel = '/usr/lib/xen/boot/ioemu-stubdom.gz'" >> /etc/xen/stubdoms/$domname-dm
   21.70 +
   21.71 +vfb="sdl=$sdl, opengl=$opengl"
   21.72 +test "$DISPLAY" && vfb="$vfb, display=$DISPLAY"
   21.73 +test "$XAUTHORITY" && vfb="$vfb, xauthority=$XAUTHORITY"
   21.74 +test $vnc != 0 && vfb="$vfb, vnc=$vnc, vncdisplay=$vnc_port, vnclisten=$ip, vncunused=$vncunused"
   21.75 +vncpasswd=`xenstore-read /local/domain/0/backend/vfb/$domid/0/vncpasswd 2>/dev/null`
   21.76 +test "$vncpasswd" && vfb="$vfb, vncpasswd=$vncpasswd"
   21.77 +test "$keymap" && vfb="$vfb, keymap=$keymap"
   21.78 +echo "vfb = ['$vfb']" >> /etc/xen/stubdoms/$domname-dm
   21.79 +
   21.80 +echo -n "disk = [ " >> /etc/xen/stubdoms/$domname-dm
   21.81 +j=0
   21.82 +for i in `xenstore-ls /local/domain/$domid/device/vbd | grep 'backend =' | awk '{print $3}'`
   21.83 +do
   21.84 +    i=${i%\"}
   21.85 +    i=${i#\"}
   21.86 +    vbd_mode=`xenstore-read $i/mode`
   21.87 +    vbd_disk=`xenstore-read $i/params`
   21.88 +    vbd_type=`xenstore-read $i/type`
   21.89 +    vbd_dev=`xenstore-read $i/dev`
   21.90 +    if [ $vbd_type = "file" ]
   21.91 +    then
   21.92 +        vbd_type="tap:aio"
   21.93 +    fi
   21.94 +    if [ $j -ne 0 ]
   21.95 +    then
   21.96 +        echo -n "," >> /etc/xen/stubdoms/$domname-dm
   21.97 +    fi
   21.98 +    echo -n "'$vbd_type:$vbd_disk,$vbd_dev,$vbd_mode'" >> /etc/xen/stubdoms/$domname-dm
   21.99 +    j=$(( $j + 1 ))
  21.100 +done
  21.101 +echo " ] " >> /etc/xen/stubdoms/$domname-dm
  21.102 +echo -n "vif = [ " >> /etc/xen/stubdoms/$domname-dm
  21.103 +j=0
  21.104 +for i in `xenstore-ls /local/domain/$domid/device/vif | grep 'backend =' | awk '{print $3}'`
  21.105 +do
  21.106 +    i=${i%\"}
  21.107 +    i=${i#\"}
  21.108 +    vif_mac=`xenstore-read $i/mac`
  21.109 +    if [ $j -ne 0 ]
  21.110 +    then
  21.111 +        echo -n "," >> /etc/xen/stubdoms/$domname-dm
  21.112 +    fi
  21.113 +    echo -n "'mac=$vif_mac'" >> /etc/xen/stubdoms/$domname-dm
  21.114 +    j=$(( $j + 1 ))
  21.115 +done
  21.116 +echo " ] " >> /etc/xen/stubdoms/$domname-dm
  21.117 +creation="xm create -c /etc/xen/stubdoms/$domname-dm target=$domid memory=32 extra=\"$extra\""
  21.118  
  21.119  (while true ; do sleep 60 ; done) | /bin/sh -c "$creation" &
  21.120  #xterm -geometry +0+0 -e /bin/sh -c "$creation ; echo ; echo press ENTER to shut down ; read" &
    22.1 --- a/tools/Makefile	Mon Mar 30 19:56:30 2009 -0700
    22.2 +++ b/tools/Makefile	Thu Apr 23 18:49:41 2009 -0700
    22.3 @@ -19,11 +19,11 @@ SUBDIRS-y += xenmon
    22.4  SUBDIRS-$(VTPM_TOOLS) += vtpm_manager
    22.5  SUBDIRS-$(VTPM_TOOLS) += vtpm
    22.6  SUBDIRS-y += xenstat
    22.7 -SUBDIRS-y += libaio
    22.8 -SUBDIRS-y += blktap
    22.9 +SUBDIRS-$(CONFIG_Linux) += libaio
   22.10 +SUBDIRS-$(CONFIG_Linux) += blktap
   22.11  SUBDIRS-y += libfsimage
   22.12  SUBDIRS-$(LIBXENAPI_BINDINGS) += libxen
   22.13 -SUBDIRS-y += fs-back
   22.14 +SUBDIRS-$(CONFIG_Linux) += fs-back
   22.15  SUBDIRS-$(CONFIG_IOEMU) += ioemu-dir
   22.16  SUBDIRS-y += xenpmd
   22.17  
    23.1 --- a/tools/Rules.mk	Mon Mar 30 19:56:30 2009 -0700
    23.2 +++ b/tools/Rules.mk	Thu Apr 23 18:49:41 2009 -0700
    23.3 @@ -33,10 +33,12 @@ CFLAGS += -D__XEN_TOOLS__
    23.4  CFLAGS += -MMD -MF .$(@F).d
    23.5  DEPS = .*.d
    23.6  
    23.7 +ifneq ($(XEN_OS),NetBSD)
    23.8  # Enable implicit LFS support *and* explicit LFS names.
    23.9  CFLAGS  += $(shell getconf LFS_CFLAGS)
   23.10  CFLAGS  += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
   23.11  LDFLAGS += $(shell getconf LFS_LDFLAGS)
   23.12 +endif
   23.13  
   23.14  # 32-bit x86 does not perform well with -ve segment accesses on Xen.
   23.15  CFLAGS-$(CONFIG_X86_32) += $(call cc-option,$(CC),-mno-tls-direct-seg-refs)
    24.1 --- a/tools/blktap/drivers/blktapctrl.c	Mon Mar 30 19:56:30 2009 -0700
    24.2 +++ b/tools/blktap/drivers/blktapctrl.c	Thu Apr 23 18:49:41 2009 -0700
    24.3 @@ -148,7 +148,8 @@ static int get_tapdisk_pid(blkif_t *blki
    24.4   *   return 0 on success, -1 on error.
    24.5   */
    24.6  
    24.7 -static int test_path(char *path, char **dev, int *type, blkif_t **blkif)
    24.8 +static int test_path(char *path, char **dev, int *type, blkif_t **blkif,
    24.9 +	int* use_ioemu)
   24.10  {
   24.11  	char *ptr, handle[10];
   24.12  	int i, size, found = 0;
   24.13 @@ -158,6 +159,17 @@ static int test_path(char *path, char **
   24.14  	*type = MAX_DISK_TYPES + 1;
   24.15          *blkif = NULL;
   24.16  
   24.17 +	if (!strncmp(path, "tapdisk:", strlen("tapdisk:"))) {
   24.18 +		*use_ioemu = 0;
   24.19 +		path += strlen("tapdisk:");
   24.20 +	} else if (!strncmp(path, "ioemu:", strlen("ioemu:"))) {
   24.21 +		*use_ioemu = 1;
   24.22 +		path += strlen("ioemu:");
   24.23 +	} else {
   24.24 +		// Use the default for the image type
   24.25 +		*use_ioemu = -1;
   24.26 +	}
   24.27 +
   24.28  	if ( (ptr = strstr(path, ":"))!=NULL) {
   24.29  		handle_len = (ptr - path);
   24.30  		memcpy(handle, path, handle_len);
   24.31 @@ -174,6 +186,8 @@ static int test_path(char *path, char **
   24.32                          }
   24.33  
   24.34  			if (found) {
   24.35 +				if (*use_ioemu == -1)
   24.36 +					*use_ioemu = dtypes[i]->use_ioemu;
   24.37  				*type = dtypes[i]->idnum;
   24.38                          
   24.39                          if (dtypes[i]->single_handler == 1) {
   24.40 @@ -185,6 +199,7 @@ static int test_path(char *path, char **
   24.41                                          *blkif = active_disks[dtypes[i]
   24.42                                                               ->idnum]->blkif;
   24.43                          }
   24.44 +
   24.45                          return 0;
   24.46                  }
   24.47              }
   24.48 @@ -216,6 +231,24 @@ static void add_disktype(blkif_t *blkif,
   24.49  	entry->pprev = pprev;
   24.50  }
   24.51  
   24.52 +static int qemu_instance_has_disks(pid_t pid)
   24.53 +{
   24.54 +	int i;
   24.55 +	int count = 0;
   24.56 +	driver_list_entry_t *entry;
   24.57 +
   24.58 +	for (i = 0; i < MAX_DISK_TYPES; i++) {
   24.59 +		entry = active_disks[i];
   24.60 +		while (entry) {
   24.61 +			if ((entry->blkif->tappid == pid) && dtypes[i]->use_ioemu)
   24.62 +				count++;
   24.63 +			entry = entry->next;
   24.64 +		}
   24.65 +	}
   24.66 +
   24.67 +	return (count != 0);
   24.68 +}
   24.69 +
   24.70  static int del_disktype(blkif_t *blkif)
   24.71  {
   24.72  	driver_list_entry_t *entry, **pprev;
   24.73 @@ -240,6 +273,14 @@ static int del_disktype(blkif_t *blkif)
   24.74  	DPRINTF("DEL_DISKTYPE: Freeing entry\n");
   24.75  	free(entry);
   24.76  
   24.77 +	/*
   24.78 +	 * When using ioemu, all disks of one VM are connected to the same
   24.79 +	 * qemu-dm instance. We may close the file handle only if there is
   24.80 +	 * no other disk left for this domain.
   24.81 +	 */
   24.82 +	if (dtypes[type]->use_ioemu)
   24.83 +		return !qemu_instance_has_disks(blkif->tappid);
   24.84 +
   24.85  	/* Caller should close() if no single controller, or list is empty. */
   24.86  	return (!dtypes[type]->single_handler || (active_disks[type] == NULL));
   24.87  }
   24.88 @@ -504,7 +545,8 @@ static int connect_qemu(blkif_t *blkif, 
   24.89  	static int tapdisk_ioemu_pid = 0;
   24.90  	static int dom0_readfd = 0;
   24.91  	static int dom0_writefd = 0;
   24.92 -	
   24.93 +	int refresh_pid = 0;
   24.94 +
   24.95  	if (asprintf(&rdctldev, BLKTAP_CTRL_DIR "/qemu-read-%d", domid) < 0)
   24.96  		return -1;
   24.97  
   24.98 @@ -523,15 +565,23 @@ static int connect_qemu(blkif_t *blkif, 
   24.99  		if (tapdisk_ioemu_pid == 0 || kill(tapdisk_ioemu_pid, 0)) {
  24.100  			/* No device model and tapdisk-ioemu doesn't run yet */
  24.101  			DPRINTF("Launching tapdisk-ioemu\n");
  24.102 -			tapdisk_ioemu_pid = launch_tapdisk_ioemu();
  24.103 +			launch_tapdisk_ioemu();
  24.104  			
  24.105  			dom0_readfd = open_ctrl_socket(wrctldev);
  24.106  			dom0_writefd = open_ctrl_socket(rdctldev);
  24.107 +
  24.108 +			refresh_pid = 1;
  24.109  		}
  24.110  
  24.111  		DPRINTF("Using tapdisk-ioemu connection\n");
  24.112  		blkif->fds[READ] = dom0_readfd;
  24.113  		blkif->fds[WRITE] = dom0_writefd;
  24.114 +
  24.115 +		if (refresh_pid) {
  24.116 +			get_tapdisk_pid(blkif);
  24.117 +			tapdisk_ioemu_pid = blkif->tappid;
  24.118 +		}
  24.119 +
  24.120  	} else if (access(rdctldev, R_OK | W_OK) == 0) {
  24.121  		/* Use existing pipe to the device model */
  24.122  		DPRINTF("Using qemu-dm connection\n");
  24.123 @@ -605,13 +655,11 @@ static int blktapctrl_new_blkif(blkif_t 
  24.124  	image_t *image;
  24.125  	blkif_t *exist = NULL;
  24.126  	static uint16_t next_cookie = 0;
  24.127 +	int use_ioemu;
  24.128  
  24.129  	DPRINTF("Received a poll for a new vbd\n");
  24.130  	if ( ((blk=blkif->info) != NULL) && (blk->params != NULL) ) {
  24.131 -		if (blktap_interface_create(ctlfd, &major, &minor, blkif) < 0)
  24.132 -			return -1;
  24.133 -
  24.134 -		if (test_path(blk->params, &ptr, &type, &exist) != 0) {
  24.135 +		if (test_path(blk->params, &ptr, &type, &exist, &use_ioemu) != 0) {
  24.136                          DPRINTF("Error in blktap device string(%s).\n",
  24.137                                  blk->params);
  24.138                          goto fail;
  24.139 @@ -620,7 +668,7 @@ static int blktapctrl_new_blkif(blkif_t 
  24.140  		blkif->cookie = next_cookie++;
  24.141  
  24.142  		if (!exist) {
  24.143 -			if (type == DISK_TYPE_IOEMU) {
  24.144 +			if (use_ioemu) {
  24.145  				if (connect_qemu(blkif, blkif->domid))
  24.146  					goto fail;
  24.147  			} else {
  24.148 @@ -634,10 +682,6 @@ static int blktapctrl_new_blkif(blkif_t 
  24.149  			blkif->fds[WRITE] = exist->fds[WRITE];
  24.150  		}
  24.151  
  24.152 -		add_disktype(blkif, type);
  24.153 -		blkif->major = major;
  24.154 -		blkif->minor = minor;
  24.155 -
  24.156  		image = (image_t *)malloc(sizeof(image_t));
  24.157  		blkif->prv = (void *)image;
  24.158  		blkif->ops = &tapdisk_ops;
  24.159 @@ -661,11 +705,18 @@ static int blktapctrl_new_blkif(blkif_t 
  24.160  			goto fail;
  24.161  		}
  24.162  
  24.163 +		if (blktap_interface_create(ctlfd, &major, &minor, blkif) < 0)
  24.164 +			return -1;
  24.165 +
  24.166 +		blkif->major = major;
  24.167 +		blkif->minor = minor;
  24.168 +
  24.169 +		add_disktype(blkif, type);
  24.170 +
  24.171  	} else return -1;
  24.172  
  24.173  	return 0;
  24.174  fail:
  24.175 -	ioctl(ctlfd, BLKTAP_IOCTL_FREEINTF, minor);
  24.176  	return -EINVAL;
  24.177  }
  24.178  
  24.179 @@ -696,6 +747,7 @@ static int unmap_blktapctrl(blkif_t *blk
  24.180  	}
  24.181  
  24.182  	if (del_disktype(blkif)) {
  24.183 +		DPRINTF("Closing communication pipe to pid %d\n", blkif->tappid);
  24.184  		close(blkif->fds[WRITE]);
  24.185  		close(blkif->fds[READ]);
  24.186  	}
    25.1 --- a/tools/blktap/drivers/block-qcow2.c	Mon Mar 30 19:56:30 2009 -0700
    25.2 +++ b/tools/blktap/drivers/block-qcow2.c	Thu Apr 23 18:49:41 2009 -0700
    25.3 @@ -1980,6 +1980,104 @@ static int qcow_validate_parent(struct d
    25.4  	return 0;
    25.5  }
    25.6  
    25.7 +int qcow2_create(const char *filename, uint64_t total_size,
    25.8 +                      const char *backing_file, int flags)
    25.9 +{
   25.10 +    int fd, header_size, backing_filename_len, l1_size, i, shift, l2_bits;
   25.11 +    int ret = 0;
   25.12 +    QCowHeader header;
   25.13 +    uint64_t tmp, offset;
   25.14 +    QCowCreateState s1, *s = &s1;
   25.15 +
   25.16 +    memset(s, 0, sizeof(*s));
   25.17 +
   25.18 +    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
   25.19 +    if (fd < 0)
   25.20 +        return -1;
   25.21 +    memset(&header, 0, sizeof(header));
   25.22 +    header.magic = cpu_to_be32(QCOW_MAGIC);
   25.23 +    header.version = cpu_to_be32(QCOW_VERSION);
   25.24 +    header.size = cpu_to_be64(total_size * 512);
   25.25 +    header_size = sizeof(header);
   25.26 +    backing_filename_len = 0;
   25.27 +    if (backing_file) {
   25.28 +        header.backing_file_offset = cpu_to_be64(header_size);
   25.29 +        backing_filename_len = strlen(backing_file);
   25.30 +        header.backing_file_size = cpu_to_be32(backing_filename_len);
   25.31 +        header_size += backing_filename_len;
   25.32 +    }
   25.33 +    s->cluster_bits = 12;  /* 4 KB clusters */
   25.34 +    s->cluster_size = 1 << s->cluster_bits;
   25.35 +    header.cluster_bits = cpu_to_be32(s->cluster_bits);
   25.36 +    header_size = (header_size + 7) & ~7;
   25.37 +    if (flags & BLOCK_FLAG_ENCRYPT) {
   25.38 +        header.crypt_method = cpu_to_be32(QCOW_CRYPT_AES);
   25.39 +    } else {
   25.40 +        header.crypt_method = cpu_to_be32(QCOW_CRYPT_NONE);
   25.41 +    }
   25.42 +    l2_bits = s->cluster_bits - 3;
   25.43 +    shift = s->cluster_bits + l2_bits;
   25.44 +    l1_size = (((total_size * 512) + (1LL << shift) - 1) >> shift);
   25.45 +    offset = align_offset(header_size, s->cluster_size);
   25.46 +    s->l1_table_offset = offset;
   25.47 +    header.l1_table_offset = cpu_to_be64(s->l1_table_offset);
   25.48 +    header.l1_size = cpu_to_be32(l1_size);
   25.49 +    offset += align_offset(l1_size * sizeof(uint64_t), s->cluster_size);
   25.50 +
   25.51 +    s->refcount_table = qemu_mallocz(s->cluster_size);
   25.52 +    s->refcount_block = qemu_mallocz(s->cluster_size);
   25.53 +
   25.54 +    s->refcount_table_offset = offset;
   25.55 +    header.refcount_table_offset = cpu_to_be64(offset);
   25.56 +    header.refcount_table_clusters = cpu_to_be32(1);
   25.57 +    offset += s->cluster_size;
   25.58 +
   25.59 +    s->refcount_table[0] = cpu_to_be64(offset);
   25.60 +    s->refcount_block_offset = offset;
   25.61 +    offset += s->cluster_size;
   25.62 +
   25.63 +    /* update refcounts */
   25.64 +    create_refcount_update(s, 0, header_size);
   25.65 +    create_refcount_update(s, s->l1_table_offset, l1_size * sizeof(uint64_t));
   25.66 +    create_refcount_update(s, s->refcount_table_offset, s->cluster_size);
   25.67 +    create_refcount_update(s, s->refcount_block_offset, s->cluster_size);
   25.68 +
   25.69 +    /* write all the data */
   25.70 +    ret = write(fd, &header, sizeof(header));
   25.71 +    if (ret < 0)
   25.72 +        goto out;
   25.73 +    if (backing_file) {
   25.74 +        ret = write(fd, backing_file, backing_filename_len);
   25.75 +        if (ret < 0)
   25.76 +            goto out;
   25.77 +    }
   25.78 +    lseek(fd, s->l1_table_offset, SEEK_SET);
   25.79 +    tmp = 0;
   25.80 +    for(i = 0;i < l1_size; i++) {
   25.81 +        ret = write(fd, &tmp, sizeof(tmp));
   25.82 +        if (ret < 0)
   25.83 +            goto out;
   25.84 +    }
   25.85 +    lseek(fd, s->refcount_table_offset, SEEK_SET);
   25.86 +    ret = write(fd, s->refcount_table, s->cluster_size);
   25.87 +    if (ret < 0)
   25.88 +        goto out;
   25.89 +
   25.90 +    lseek(fd, s->refcount_block_offset, SEEK_SET);
   25.91 +    ret = write(fd, s->refcount_block, s->cluster_size);
   25.92 +    if (ret < 0)
   25.93 +        goto out;
   25.94 +    ret = 0;
   25.95 +
   25.96 +  out:
   25.97 +    qemu_free(s->refcount_table);
   25.98 +    qemu_free(s->refcount_block);
   25.99 +    close(fd);
  25.100 +    return ret;
  25.101 +}
  25.102 +
  25.103 +
  25.104 +
  25.105  struct tap_disk tapdisk_qcow2 = {
  25.106  	"qcow2",
  25.107  	sizeof(BDRVQcowState),
    26.1 --- a/tools/blktap/drivers/qcow-create.c	Mon Mar 30 19:56:30 2009 -0700
    26.2 +++ b/tools/blktap/drivers/qcow-create.c	Thu Apr 23 18:49:41 2009 -0700
    26.3 @@ -52,7 +52,7 @@ static void help(void)
    26.4  {
    26.5  	fprintf(stderr, "Qcow-utils: v1.0.0\n");
    26.6  	fprintf(stderr, 
    26.7 -		"usage: qcow-create [-h help] [-r reserve] <SIZE(MB)> <FILENAME> "
    26.8 +		"usage: qcow-create [-h help] [-r reserve] [-f format] <SIZE(MB)> <FILENAME> "
    26.9  		"[<BACKING_FILENAME>]\n"); 
   26.10  	exit(-1);
   26.11  }
   26.12 @@ -61,11 +61,13 @@ int main(int argc, char *argv[])
   26.13  {
   26.14  	int ret = -1, c, backed = 0;
   26.15  	int sparse =  1;
   26.16 +	char *fmt = "qcow";
   26.17  	uint64_t size;
   26.18  	char filename[MAX_NAME_LEN], bfilename[MAX_NAME_LEN];
   26.19 +	char *tmpfile;
   26.20  
   26.21          for(;;) {
   26.22 -                c = getopt(argc, argv, "hr");
   26.23 +                c = getopt(argc, argv, "hrf");
   26.24                  if (c == -1)
   26.25                          break;
   26.26                  switch(c) {
   26.27 @@ -73,6 +75,9 @@ int main(int argc, char *argv[])
   26.28                          help();
   26.29                          exit(0);
   26.30                          break;
   26.31 +                case 'f':
   26.32 +                        fmt = argv[optind++];
   26.33 +                        break;
   26.34                  case 'r':
   26.35  			sparse = 0;
   26.36  			break;
   26.37 @@ -105,11 +110,16 @@ int main(int argc, char *argv[])
   26.38  		}
   26.39  	}
   26.40  
   26.41 -	DFPRINTF("Creating file size %llu, name %s\n",(long long unsigned)size, filename);
   26.42 -	if (!backed)
   26.43 -		ret = qcow_create(filename,size,NULL,sparse);
   26.44 -	else
   26.45 -		ret = qcow_create(filename,size,bfilename,sparse);
   26.46 +    tmpfile = backed ? bfilename: NULL; 
   26.47 +    if (!strcmp(fmt, "qcow")) {
   26.48 +        ret = qcow_create(filename, size, tmpfile, sparse);
   26.49 +    } else if(!strcmp(fmt, "qcow2")) {
   26.50 +        ret = qcow2_create(filename, size, tmpfile, sparse);
   26.51 +    } else {
   26.52 +        fprintf(stderr,"Unsupport format:%s\n", fmt);
   26.53 +        exit(-1);
   26.54 +    } 
   26.55 +    DFPRINTF("Creating file size %llu, name %s\n",(long long unsigned)size, filename);
   26.56  
   26.57  	if (ret < 0)
   26.58  		DPRINTF("Unable to create QCOW file\n");
    27.1 --- a/tools/blktap/drivers/tapdisk.h	Mon Mar 30 19:56:30 2009 -0700
    27.2 +++ b/tools/blktap/drivers/tapdisk.h	Thu Apr 23 18:49:41 2009 -0700
    27.3 @@ -145,6 +145,8 @@ typedef struct disk_info {
    27.4  	char handle[10];     /* xend handle, e.g. 'ram' */
    27.5  	int  single_handler; /* is there a single controller for all */
    27.6  	                     /* instances of disk type? */
    27.7 +	int  use_ioemu;      /* backend provider: 0 = tapdisk; 1 = ioemu */
    27.8 +
    27.9  #ifdef TAPDISK
   27.10  	struct tap_disk *drv;	
   27.11  #endif
   27.12 @@ -159,16 +161,6 @@ extern struct tap_disk tapdisk_ram;
   27.13  extern struct tap_disk tapdisk_qcow;
   27.14  extern struct tap_disk tapdisk_qcow2;
   27.15  
   27.16 -#define MAX_DISK_TYPES     20
   27.17 -
   27.18 -#define DISK_TYPE_AIO      0
   27.19 -#define DISK_TYPE_SYNC     1
   27.20 -#define DISK_TYPE_VMDK     2
   27.21 -#define DISK_TYPE_RAM      3
   27.22 -#define DISK_TYPE_QCOW     4
   27.23 -#define DISK_TYPE_QCOW2    5
   27.24 -#define DISK_TYPE_IOEMU    6
   27.25 -
   27.26  
   27.27  /*Define Individual Disk Parameters here */
   27.28  static disk_info_t aio_disk = {
   27.29 @@ -176,6 +168,7 @@ static disk_info_t aio_disk = {
   27.30  	"raw image (aio)",
   27.31  	"aio",
   27.32  	0,
   27.33 +	0,
   27.34  #ifdef TAPDISK
   27.35  	&tapdisk_aio,
   27.36  #endif
   27.37 @@ -186,6 +179,7 @@ static disk_info_t sync_disk = {
   27.38  	"raw image (sync)",
   27.39  	"sync",
   27.40  	0,
   27.41 +	0,
   27.42  #ifdef TAPDISK
   27.43  	&tapdisk_sync,
   27.44  #endif
   27.45 @@ -196,6 +190,7 @@ static disk_info_t vmdk_disk = {
   27.46  	"vmware image (vmdk)",
   27.47  	"vmdk",
   27.48  	1,
   27.49 +	0,
   27.50  #ifdef TAPDISK
   27.51  	&tapdisk_vmdk,
   27.52  #endif
   27.53 @@ -206,6 +201,7 @@ static disk_info_t ram_disk = {
   27.54  	"ramdisk image (ram)",
   27.55  	"ram",
   27.56  	1,
   27.57 +	0,
   27.58  #ifdef TAPDISK
   27.59  	&tapdisk_ram,
   27.60  #endif
   27.61 @@ -216,6 +212,7 @@ static disk_info_t qcow_disk = {
   27.62  	"qcow disk (qcow)",
   27.63  	"qcow",
   27.64  	0,
   27.65 +	0,
   27.66  #ifdef TAPDISK
   27.67  	&tapdisk_qcow,
   27.68  #endif
   27.69 @@ -226,21 +223,12 @@ static disk_info_t qcow2_disk = {
   27.70  	"qcow2 disk (qcow2)",
   27.71  	"qcow2",
   27.72  	0,
   27.73 +	0,
   27.74  #ifdef TAPDISK
   27.75  	&tapdisk_qcow2,
   27.76  #endif
   27.77  };
   27.78  
   27.79 -static disk_info_t ioemu_disk = {
   27.80 -	DISK_TYPE_IOEMU,
   27.81 -	"ioemu disk",
   27.82 -	"ioemu",
   27.83 -	1,
   27.84 -#ifdef TAPDISK
   27.85 -	NULL
   27.86 -#endif
   27.87 -};
   27.88 -
   27.89  /*Main disk info array */
   27.90  static disk_info_t *dtypes[] = {
   27.91  	&aio_disk,
   27.92 @@ -249,7 +237,6 @@ static disk_info_t *dtypes[] = {
   27.93  	&ram_disk,
   27.94  	&qcow_disk,
   27.95  	&qcow2_disk,
   27.96 -	&ioemu_disk,
   27.97  };
   27.98  
   27.99  typedef struct driver_list_entry {
  27.100 @@ -266,4 +253,7 @@ typedef struct fd_list_entry {
  27.101  
  27.102  int qcow_create(const char *filename, uint64_t total_size,
  27.103  		const char *backing_file, int flags);
  27.104 +
  27.105 +int qcow2_create(const char *filename, uint64_t total_size,
  27.106 +		const char *backing_file, int flags);
  27.107  #endif /*TAPDISK_H_*/
    28.1 --- a/tools/blktap/lib/blktaplib.h	Mon Mar 30 19:56:30 2009 -0700
    28.2 +++ b/tools/blktap/lib/blktaplib.h	Thu Apr 23 18:49:41 2009 -0700
    28.3 @@ -210,6 +210,16 @@ typedef struct msg_pid {
    28.4  #define CTLMSG_PID         9
    28.5  #define CTLMSG_PID_RSP     10
    28.6  
    28.7 +/* disk driver types */
    28.8 +#define MAX_DISK_TYPES     20
    28.9 +
   28.10 +#define DISK_TYPE_AIO      0
   28.11 +#define DISK_TYPE_SYNC     1
   28.12 +#define DISK_TYPE_VMDK     2
   28.13 +#define DISK_TYPE_RAM      3
   28.14 +#define DISK_TYPE_QCOW     4
   28.15 +#define DISK_TYPE_QCOW2    5
   28.16 +
   28.17  /* xenstore/xenbus: */
   28.18  #define DOMNAME "Domain-0"
   28.19  int setup_probe_watch(struct xs_handle *h);
    29.1 --- a/tools/blktap/lib/xenbus.c	Mon Mar 30 19:56:30 2009 -0700
    29.2 +++ b/tools/blktap/lib/xenbus.c	Thu Apr 23 18:49:41 2009 -0700
    29.3 @@ -48,6 +48,7 @@
    29.4  #include <poll.h>
    29.5  #include <time.h>
    29.6  #include <sys/time.h>
    29.7 +#include <unistd.h>
    29.8  #include "blktaplib.h"
    29.9  #include "list.h"
   29.10  #include "xs_api.h"
   29.11 @@ -149,6 +150,137 @@ static int backend_remove(struct xs_hand
   29.12  	return 0;
   29.13  }
   29.14  
   29.15 +static int check_sharing(struct xs_handle *h, struct backend_info *be)
   29.16 +{
   29.17 +	char *dom_uuid;
   29.18 +	char *cur_dom_uuid;
   29.19 +	char *path;
   29.20 +	char *mode;
   29.21 +	char *params;
   29.22 +	char **domains;
   29.23 +	char **devices;
   29.24 +	int i, j;
   29.25 +	unsigned int num_dom, num_dev;
   29.26 +	blkif_info_t *info;
   29.27 +	int ret = 0;
   29.28 +
   29.29 +	/* If the mode contains '!' or doesn't contain 'w' don't check anything */
   29.30 +	xs_gather(h, be->backpath, "mode", NULL, &mode, NULL);
   29.31 +	if (strchr(mode, '!'))
   29.32 +		goto out;
   29.33 +	if (strchr(mode, 'w') == NULL)
   29.34 +		goto out;
   29.35 +
   29.36 +	/* Get the UUID of the domain we want to attach to */
   29.37 +	if (asprintf(&path, "/local/domain/%ld", be->frontend_id) == -1)
   29.38 +		goto fail;
   29.39 +	xs_gather(h, path, "vm", NULL, &dom_uuid, NULL);
   29.40 +	free(path);
   29.41 +
   29.42 +	/* Iterate through the devices of all VMs */
   29.43 +	domains = xs_directory(h, XBT_NULL, "backend/tap", &num_dom);
   29.44 +	if (domains == NULL)
   29.45 +		num_dom = 0;
   29.46 +
   29.47 +	for (i = 0; !ret && (i < num_dom); i++) {
   29.48 +
   29.49 +		/* If it's the same VM, no action needed */
   29.50 +		if (asprintf(&path, "/local/domain/%s", domains[i]) == -1) {
   29.51 +			ret = -1;
   29.52 +			break;
   29.53 +		}
   29.54 +		xs_gather(h, path, "vm", NULL, &cur_dom_uuid, NULL);
   29.55 +		free(path);
   29.56 +
   29.57 +		if (!strcmp(cur_dom_uuid, dom_uuid)) {
   29.58 +			free(cur_dom_uuid);
   29.59 +			continue;
   29.60 +		}
   29.61 +
   29.62 +		/* Check the devices */
   29.63 +		if (asprintf(&path, "backend/tap/%s", domains[i]) == -1) {
   29.64 +			ret = -1;
   29.65 +			free(cur_dom_uuid);
   29.66 +			break;
   29.67 +		}
   29.68 +		devices = xs_directory(h, XBT_NULL, path, &num_dev);
   29.69 +		if (devices == NULL)
   29.70 +			num_dev = 0;
   29.71 +		free(path);
   29.72 +
   29.73 +		for (j = 0; !ret && (j < num_dev); j++) {
   29.74 +			if (asprintf(&path, "backend/tap/%s/%s", domains[i], devices[j]) == -1) {
   29.75 +				ret = -1;
   29.76 +				break;
   29.77 +			}
   29.78 +			xs_gather(h, path, "params", NULL, &params, NULL);
   29.79 +			free(path);
   29.80 +
   29.81 +			info =  be->blkif->info;
   29.82 +			if (strcmp(params, info->params)) {
   29.83 +				ret = -1;
   29.84 +			}
   29.85 +
   29.86 +			free(params);
   29.87 +		}
   29.88 +
   29.89 +		free(cur_dom_uuid);
   29.90 +		free(devices);
   29.91 +	}
   29.92 +	free(domains);
   29.93 +	free(dom_uuid);
   29.94 +	goto out;
   29.95 +
   29.96 +fail:
   29.97 +	ret = -1;
   29.98 +out:
   29.99 +	free(mode);
  29.100 +	return ret;
  29.101 +}
  29.102 +
  29.103 +static int check_image(struct xs_handle *h, struct backend_info *be,
  29.104 +	const char** errmsg)
  29.105 +{
  29.106 +	const char *tmp;
  29.107 +	const char *path;
  29.108 +	int mode;
  29.109 +	blkif_t *blkif = be->blkif;
  29.110 +	blkif_info_t *info = blkif->info;
  29.111 +
  29.112 +	/* Strip off the image type */
  29.113 +	path = info->params;
  29.114 +
  29.115 +	if (!strncmp(path, "tapdisk:", strlen("tapdisk:"))) {
  29.116 +		path += strlen("tapdisk:");
  29.117 +	} else if (!strncmp(path, "ioemu:", strlen("ioemu:"))) {
  29.118 +		path += strlen("ioemu:");
  29.119 +	}
  29.120 +
  29.121 +	tmp = strchr(path, ':');
  29.122 +	if (tmp != NULL)
  29.123 +		path = tmp + 1;
  29.124 +
  29.125 +	/* Check if the image exists and access is permitted */
  29.126 +	mode = R_OK;
  29.127 +	if (!be->readonly)
  29.128 +		mode |= W_OK;
  29.129 +	if (access(path, mode)) {
  29.130 +		if (errno == ENOENT)
  29.131 +			*errmsg = "File not found.";
  29.132 +		else
  29.133 +			*errmsg = "Insufficient file permissions.";
  29.134 +		return -1;
  29.135 +	}
  29.136 +
  29.137 +	/* Check that the image is not attached to a different VM */
  29.138 +	if (check_sharing(h, be)) {
  29.139 +		*errmsg = "File already in use by other domain";
  29.140 +		return -1;
  29.141 +	}
  29.142 +
  29.143 +	return 0;
  29.144 +}
  29.145 +
  29.146  static void ueblktap_setup(struct xs_handle *h, char *bepath)
  29.147  {
  29.148  	struct backend_info *be;
  29.149 @@ -156,6 +288,7 @@ static void ueblktap_setup(struct xs_han
  29.150  	int len, er, deverr;
  29.151  	long int pdev = 0, handle;
  29.152  	blkif_info_t *blk;
  29.153 +	const char* errmsg = NULL;
  29.154  	
  29.155  	be = be_lookup_be(bepath);
  29.156  	if (be == NULL)
  29.157 @@ -211,6 +344,9 @@ static void ueblktap_setup(struct xs_han
  29.158  			be->pdev = pdev;
  29.159  		}
  29.160  
  29.161 +		if (check_image(h, be, &errmsg))
  29.162 +			goto fail;
  29.163 +
  29.164  		er = blkif_init(be->blkif, handle, be->pdev, be->readonly);
  29.165  		if (er != 0) {
  29.166  			DPRINTF("Unable to open device %s\n",blk->params);
  29.167 @@ -246,12 +382,21 @@ static void ueblktap_setup(struct xs_han
  29.168  	}
  29.169  
  29.170  	be->blkif->state = CONNECTED;
  29.171 +	xs_printf(h, be->backpath, "hotplug-status", "connected");
  29.172 +
  29.173  	DPRINTF("[SETUP] Complete\n\n");
  29.174  	goto close;
  29.175  	
  29.176  fail:
  29.177 -	if ( (be != NULL) && (be->blkif != NULL) ) 
  29.178 +	if (be) {
  29.179 +		if (errmsg == NULL)
  29.180 +			errmsg = "Setting up the backend failed. See the log "
  29.181 +				"files in /var/log/xen/ for details.";
  29.182 +		xs_printf(h, be->backpath, "hotplug-error", errmsg);
  29.183 +		xs_printf(h, be->backpath, "hotplug-status", "error");
  29.184 +
  29.185  		backend_remove(h, be);
  29.186 +	}
  29.187  close:
  29.188  	if (path)
  29.189  		free(path);
  29.190 @@ -286,7 +431,8 @@ static void ueblktap_probe(struct xs_han
  29.191  	len = strsep_len(bepath, '/', 7);
  29.192  	if (len < 0) 
  29.193  		goto free_be;
  29.194 -	bepath[len] = '\0';
  29.195 +	if (bepath[len] != '\0')
  29.196 +		goto free_be;
  29.197  	
  29.198  	be = malloc(sizeof(*be));
  29.199  	if (!be) {
    30.1 --- a/tools/console/client/main.c	Mon Mar 30 19:56:30 2009 -0700
    30.2 +++ b/tools/console/client/main.c	Thu Apr 23 18:49:41 2009 -0700
    30.3 @@ -35,6 +35,9 @@
    30.4  #include <err.h>
    30.5  #include <errno.h>
    30.6  #include <string.h>
    30.7 +#ifdef __sun__
    30.8 +#include <sys/stropts.h>
    30.9 +#endif
   30.10  
   30.11  #include "xs.h"
   30.12  
   30.13 @@ -71,6 +74,21 @@ static void usage(const char *program) {
   30.14  	       , program);
   30.15  }
   30.16  
   30.17 +#ifdef	__sun__
   30.18 +void cfmakeraw(struct termios *termios_p)
   30.19 +{
   30.20 +	termios_p->c_iflag &=
   30.21 +	    ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
   30.22 +	termios_p->c_oflag &= ~OPOST;
   30.23 +	termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
   30.24 +	termios_p->c_cflag &= ~(CSIZE|PARENB);
   30.25 +	termios_p->c_cflag |= CS8;
   30.26 +
   30.27 +	termios_p->c_cc[VMIN] = 0;
   30.28 +	termios_p->c_cc[VTIME] = 0;
   30.29 +}
   30.30 +#endif
   30.31 +
   30.32  static int get_pty_fd(struct xs_handle *xs, char *path, int seconds)
   30.33  /* Check for a pty in xenstore, open it and return its fd.
   30.34   * Assumes there is already a watch set in the store for this path. */
   30.35 @@ -80,7 +98,7 @@ static int get_pty_fd(struct xs_handle *
   30.36  	int xs_fd = xs_fileno(xs), pty_fd = -1;
   30.37  	int start, now;
   30.38  	unsigned int len = 0;
   30.39 -	char *pty_path, **watch_paths;;
   30.40 +	char *pty_path, **watch_paths;
   30.41  
   30.42  	start = now = time(NULL);
   30.43  	do {
   30.44 @@ -104,6 +122,29 @@ static int get_pty_fd(struct xs_handle *
   30.45  			}
   30.46  		}
   30.47  	} while (pty_fd == -1 && (now = time(NULL)) < start + seconds);
   30.48 +
   30.49 +#ifdef __sun__
   30.50 +	if (pty_fd != -1) {
   30.51 +		struct termios term;
   30.52 +
   30.53 +		/*
   30.54 +		 * The pty may come from either xend (with pygrub) or
   30.55 +		 * xenconsoled.  It may have tty semantics set up, or not.
   30.56 +		 * While it isn't strictly necessary to have those
   30.57 +		 * semantics here, it is good to have a consistent
   30.58 +		 * state that is the same as under Linux.
   30.59 +		 *
   30.60 +		 * If tcgetattr fails, they have not been set up,
   30.61 +		 * so go ahead and set them up now, by pushing the
   30.62 +		 * ptem and ldterm streams modules.
   30.63 +		 */
   30.64 +		if (tcgetattr(pty_fd, &term) < 0) {
   30.65 +			ioctl(pty_fd, I_PUSH, "ptem");
   30.66 +			ioctl(pty_fd, I_PUSH, "ldterm");
   30.67 +		}
   30.68 +	}
   30.69 +#endif
   30.70 +
   30.71  	return pty_fd;
   30.72  }
   30.73  
   30.74 @@ -119,12 +160,12 @@ static void init_term(int fd, struct ter
   30.75  	new_term = *old;
   30.76  	cfmakeraw(&new_term);
   30.77  
   30.78 -	tcsetattr(fd, TCSAFLUSH, &new_term);
   30.79 +	tcsetattr(fd, TCSANOW, &new_term);
   30.80  }
   30.81  
   30.82  static void restore_term(int fd, struct termios *old)
   30.83  {
   30.84 -	tcsetattr(fd, TCSAFLUSH, old);
   30.85 +	tcsetattr(fd, TCSANOW, old);
   30.86  }
   30.87  
   30.88  static int console_loop(int fd, struct xs_handle *xs, char *pty_path)
   30.89 @@ -152,7 +193,8 @@ static int console_loop(int fd, struct x
   30.90  
   30.91  		if (FD_ISSET(xs_fileno(xs), &fds)) {
   30.92  			int newfd = get_pty_fd(xs, pty_path, 0);
   30.93 -			close(fd);
   30.94 +			if (fd != -1)
   30.95 +				close(fd);
   30.96                          if (newfd == -1) 
   30.97  				/* Console PTY has become invalid */
   30.98  				return 0;
    31.1 --- a/tools/console/daemon/io.c	Mon Mar 30 19:56:30 2009 -0700
    31.2 +++ b/tools/console/daemon/io.c	Thu Apr 23 18:49:41 2009 -0700
    31.3 @@ -288,6 +288,7 @@ static int create_domain_log(struct doma
    31.4  	namepath = s;
    31.5  	strcat(namepath, "/name");
    31.6  	data = xs_read(xs, XBT_NULL, namepath, &len);
    31.7 +	free(namepath);
    31.8  	if (!data)
    31.9  		return -1;
   31.10  	if (!len) {
   31.11 @@ -402,9 +403,7 @@ static int domain_create_tty(struct doma
   31.12  	assert(dom->slave_fd == -1);
   31.13  	assert(dom->master_fd == -1);
   31.14  
   31.15 -	cfmakeraw(&term);
   31.16 -
   31.17 -	if (openpty(&dom->master_fd, &dom->slave_fd, NULL, &term, NULL) < 0) {
   31.18 +	if (openpty(&dom->master_fd, &dom->slave_fd, NULL, NULL, NULL) < 0) {
   31.19  		err = errno;
   31.20  		dolog(LOG_ERR, "Failed to create tty for domain-%d "
   31.21  		      "(errno = %i, %s)",
   31.22 @@ -412,6 +411,22 @@ static int domain_create_tty(struct doma
   31.23  		return 0;
   31.24  	}
   31.25  
   31.26 +	if (tcgetattr(dom->slave_fd, &term) < 0) {
   31.27 +		err = errno;
   31.28 +		dolog(LOG_ERR, "Failed to get tty attributes for domain-%d "
   31.29 +			"(errno = %i, %s)",
   31.30 +			dom->domid, err, strerror(err));
   31.31 +		goto out;
   31.32 +	}
   31.33 +	cfmakeraw(&term);
   31.34 +	if (tcsetattr(dom->slave_fd, TCSANOW, &term) < 0) {
   31.35 +		err = errno;
   31.36 +		dolog(LOG_ERR, "Failed to set tty attributes for domain-%d "
   31.37 +			"(errno = %i, %s)",
   31.38 +			dom->domid, err, strerror(err));
   31.39 +		goto out;
   31.40 +	}
   31.41 +
   31.42  	if ((slave = ptsname(dom->master_fd)) == NULL) {
   31.43  		err = errno;
   31.44  		dolog(LOG_ERR, "Failed to get slave name for domain-%d "
   31.45 @@ -534,9 +549,6 @@ static int domain_create_ring(struct dom
   31.46  	}
   31.47  	free(type);
   31.48  
   31.49 -	if ((ring_ref == dom->ring_ref) && (remote_port == dom->remote_port))
   31.50 -		goto out;
   31.51 -
   31.52  	if (ring_ref != dom->ring_ref) {
   31.53  		if (dom->interface != NULL)
   31.54  			munmap(dom->interface, getpagesize());
   31.55 @@ -551,6 +563,16 @@ static int domain_create_ring(struct dom
   31.56  		dom->ring_ref = ring_ref;
   31.57  	}
   31.58  
   31.59 +	/* Go no further if port has not changed and we are still bound. */
   31.60 +	if (remote_port == dom->remote_port) {
   31.61 +		xc_evtchn_status_t status = {
   31.62 +			.dom = DOMID_SELF,
   31.63 +			.port = dom->local_port };
   31.64 +		if ((xc_evtchn_status(xc, &status) == 0) &&
   31.65 +		    (status.status == EVTCHNSTAT_interdomain))
   31.66 +			goto out;
   31.67 +	}
   31.68 +
   31.69  	dom->local_port = -1;
   31.70  	dom->remote_port = -1;
   31.71  	if (dom->xce_handle != -1)
   31.72 @@ -587,7 +609,7 @@ static int domain_create_ring(struct dom
   31.73  		}
   31.74  	}
   31.75  
   31.76 -	if (log_guest)
   31.77 +	if (log_guest && (dom->log_fd == -1))
   31.78  		dom->log_fd = create_domain_log(dom);
   31.79  
   31.80   out:
    32.1 --- a/tools/console/daemon/main.c	Mon Mar 30 19:56:30 2009 -0700
    32.2 +++ b/tools/console/daemon/main.c	Thu Apr 23 18:49:41 2009 -0700
    32.3 @@ -86,7 +86,9 @@ int main(int argc, char **argv)
    32.4  			version(argv[0]);
    32.5  			exit(0);
    32.6  		case 'v':
    32.7 +#ifndef __sun__
    32.8  			syslog_option |= LOG_PERROR;
    32.9 +#endif
   32.10  			syslog_mask = LOG_DEBUG;
   32.11  			break;
   32.12  		case 'i':
    33.1 --- a/tools/examples/xend-config.sxp	Mon Mar 30 19:56:30 2009 -0700
    33.2 +++ b/tools/examples/xend-config.sxp	Thu Apr 23 18:49:41 2009 -0700
    33.3 @@ -64,6 +64,7 @@
    33.4  #(xend-relocation-server no)
    33.5  (xend-relocation-server yes)
    33.6  #(xend-relocation-ssl-server no)
    33.7 +#(xend-udev-event-server no)
    33.8  
    33.9  #(xend-unix-path /var/lib/xend/xend-socket)
   33.10  
    34.1 --- a/tools/examples/xmexample.hvm	Mon Mar 30 19:56:30 2009 -0700
    34.2 +++ b/tools/examples/xmexample.hvm	Thu Apr 23 18:49:41 2009 -0700
    34.3 @@ -7,11 +7,11 @@
    34.4  #============================================================================
    34.5  
    34.6  import os, re
    34.7 +
    34.8 +arch_libdir = 'lib'
    34.9  arch = os.uname()[4]
   34.10 -if re.search('64', arch):
   34.11 +if os.uname()[0] == 'Linux' and re.search('64', arch):
   34.12      arch_libdir = 'lib64'
   34.13 -else:
   34.14 -    arch_libdir = 'lib'
   34.15  
   34.16  #----------------------------------------------------------------------------
   34.17  # Kernel image file.
   34.18 @@ -225,6 +225,10 @@ serial='pty'
   34.19  #keymap='ja'
   34.20  
   34.21  #-----------------------------------------------------------------------------
   34.22 +#   Enable/disable xen platform PCI device, default=1 (enabled)
   34.23 +#xen_platform_pci=1
   34.24 +
   34.25 +#-----------------------------------------------------------------------------
   34.26  #   Configure guest CPUID responses:
   34.27  #
   34.28  #cpuid=[ '1:ecx=xxxxxxxxxxx00xxxxxxxxxxxxxxxxxxx,
   34.29 @@ -264,8 +268,8 @@ serial='pty'
   34.30  # Look like a generic 686 :
   34.31  # cpuid = [ '0:eax=0x3,ebx=0x0,ecx=0x0,edx=0x0',
   34.32  #           '1:eax=0x06b1,
   34.33 -#              ecx=xxxxxxxxxx0000xx00xxx0000000xx0,
   34.34 -#              edx=xx00000xxxxxxx0xxxxxxxxx0xxxxxx',
   34.35 +#              ecx=xxxxxxxxxxx0000xx00xxx0000000xx0,
   34.36 +#              edx=xxx00000xxxxxxx0xxxxxxxxx0xxxxxx',
   34.37  #           '4:eax=0x3,ebx=0x0,ecx=0x0,edx=0x0',
   34.38  #  '0x80000000:eax=0x3,ebx=0x0,ecx=0x0,edx=0x0']
   34.39  #  with the highest leaf
   34.40 @@ -308,6 +312,8 @@ serial='pty'
   34.41  #                   available options are:
   34.42  #                   - msitranslate=0|1
   34.43  #                      per-device overriden of pci_msitranslate, see below
   34.44 +#                   - power_mgmt=0|1
   34.45 +#                      per-device overriden of pci_power_mgmt, see below
   34.46  #
   34.47  #pci=[ '07:00.0', '07:00.1' ]
   34.48  
   34.49 @@ -322,6 +328,13 @@ serial='pty'
   34.50  # 
   34.51  #pci_msitranslate=1
   34.52  
   34.53 +#   PCI Power Management:
   34.54 +#
   34.55 +#   If it's set, the guest OS will be able to program D0-D3hot states of the
   34.56 +# PCI device for the purpose of low power consumption.
   34.57 +# 
   34.58 +#pci_power_mgmt=0
   34.59 +
   34.60  #-----------------------------------------------------------------------------
   34.61  #   Configure PVSCSI devices:
   34.62  #
    35.1 --- a/tools/examples/xmexample.hvm-dm	Mon Mar 30 19:56:30 2009 -0700
    35.2 +++ b/tools/examples/xmexample.hvm-dm	Thu Apr 23 18:49:41 2009 -0700
    35.3 @@ -11,4 +11,4 @@ vif = [ '', 'type=ioemu, bridge=xenbr0' 
    35.4  disk = [ 'file:/var/images/min-el3-i386.img,hda,w', ',hdc:cdrom,r' ]
    35.5  
    35.6  # Actual output via PVFB
    35.7 -vfb = [ 'type=sdl' ]
    35.8 +vfb = [ 'sdl=1' ]
    36.1 --- a/tools/examples/xmexample.pv-grub	Mon Mar 30 19:56:30 2009 -0700
    36.2 +++ b/tools/examples/xmexample.pv-grub	Thu Apr 23 18:49:41 2009 -0700
    36.3 @@ -77,29 +77,29 @@ disk = [ 'phy:hda1,hda1,w' ]
    36.4  #
    36.5  # To create one using the SDL backend and sensible defaults:
    36.6  #
    36.7 -# vfb = [ 'type=sdl' ]
    36.8 +# vfb = [ 'sdl=1' ]
    36.9  #
   36.10  # This uses environment variables XAUTHORITY and DISPLAY.  You
   36.11  # can override that:
   36.12  #
   36.13 -# vfb = [ 'type=sdl,xauthority=/home/bozo/.Xauthority,display=:1' ]
   36.14 +# vfb = [ 'sdl=1,xauthority=/home/bozo/.Xauthority,display=:1' ]
   36.15  #
   36.16  # To create one using the VNC backend and sensible defaults:
   36.17  #
   36.18 -# vfb = [ 'type=vnc' ]
   36.19 +# vfb = [ 'vnc=1' ]
   36.20  #
   36.21  # The backend listens on 127.0.0.1 port 5900+N by default, where N is
   36.22  # the domain ID.  You can override both address and N:
   36.23  #
   36.24 -# vfb = [ 'type=vnc,vnclisten=127.0.0.1,vncdisplay=1' ]
   36.25 +# vfb = [ 'vnc=1,vnclisten=127.0.0.1,vncdisplay=1' ]
   36.26  #
   36.27  # Or you can bind the first unused port above 5900:
   36.28  #
   36.29 -# vfb = [ 'type=vnc,vnclisten=0.0.0.0,vncunused=1' ]
   36.30 +# vfb = [ 'vnc=1,vnclisten=0.0.0.0,vncunused=1' ]
   36.31  #
   36.32  # You can override the password:
   36.33  #
   36.34 -# vfb = [ 'type=vnc,vncpasswd=MYPASSWD' ]
   36.35 +# vfb = [ 'vnc=1,vncpasswd=MYPASSWD' ]
   36.36  #
   36.37  # Empty password disables authentication.  Defaults to the vncpasswd
   36.38  # configured in xend-config.sxp.
    37.1 --- a/tools/examples/xmexample.vti	Mon Mar 30 19:56:30 2009 -0700
    37.2 +++ b/tools/examples/xmexample.vti	Thu Apr 23 18:49:41 2009 -0700
    37.3 @@ -7,8 +7,8 @@
    37.4  #============================================================================
    37.5  
    37.6  import os, re
    37.7 +arch_libdir = 'lib'
    37.8  arch = os.uname()[4]
    37.9 -arch_libdir = 'lib'
   37.10  
   37.11  #----------------------------------------------------------------------------
   37.12  # Kernel image file.
    38.1 --- a/tools/examples/xmexample1	Mon Mar 30 19:56:30 2009 -0700
    38.2 +++ b/tools/examples/xmexample1	Thu Apr 23 18:49:41 2009 -0700
    38.3 @@ -73,29 +73,29 @@ disk = [ 'phy:hda1,hda1,w' ]
    38.4  #
    38.5  # To create one using the SDL backend and sensible defaults:
    38.6  #
    38.7 -# vfb = [ 'type=sdl' ]
    38.8 +# vfb = [ 'sdl=1' ]
    38.9  #
   38.10  # This uses environment variables XAUTHORITY and DISPLAY.  You
   38.11  # can override that:
   38.12  #
   38.13 -# vfb = [ 'type=sdl,xauthority=/home/bozo/.Xauthority,display=:1' ]
   38.14 +# vfb = [ 'sdl=1,xauthority=/home/bozo/.Xauthority,display=:1' ]
   38.15  #
   38.16  # To create one using the VNC backend and sensible defaults:
   38.17  #
   38.18 -# vfb = [ 'type=vnc' ]
   38.19 +# vfb = [ 'vnc=1' ]
   38.20  #
   38.21  # The backend listens on 127.0.0.1 port 5900+N by default, where N is
   38.22  # the domain ID.  You can override both address and N:
   38.23  #
   38.24 -# vfb = [ 'type=vnc,vnclisten=127.0.0.1,vncdisplay=1' ]
   38.25 +# vfb = [ 'vnc=1,vnclisten=127.0.0.1,vncdisplay=1' ]
   38.26  #
   38.27  # Or you can bind the first unused port above 5900:
   38.28  #
   38.29 -# vfb = [ 'type=vnc,vnclisten=0.0.0.0,vncunused=1' ]
   38.30 +# vfb = [ 'vnc=1,vnclisten=0.0.0.0,vncunused=1' ]
   38.31  #
   38.32  # You can override the password:
   38.33  #
   38.34 -# vfb = [ 'type=vnc,vncpasswd=MYPASSWD' ]
   38.35 +# vfb = [ 'vnc=1,vncpasswd=MYPASSWD' ]
   38.36  #
   38.37  # Empty password disables authentication.  Defaults to the vncpasswd
   38.38  # configured in xend-config.sxp.
    39.1 --- a/tools/examples/xmexample2	Mon Mar 30 19:56:30 2009 -0700
    39.2 +++ b/tools/examples/xmexample2	Thu Apr 23 18:49:41 2009 -0700
    39.3 @@ -109,29 +109,29 @@ disk = [ 'phy:sda%d,sda1,w' % (7+vmid),
    39.4  #
    39.5  # To create one using the SDL backend and sensible defaults:
    39.6  #
    39.7 -# vfb = [ 'type=sdl' ]
    39.8 +# vfb = [ 'sdl=1' ]
    39.9  #
   39.10  # This uses environment variables XAUTHORITY and DISPLAY.  You
   39.11  # can override that:
   39.12  #
   39.13 -# vfb = [ 'type=sdl,xauthority=/home/bozo/.Xauthority,display=:1' ]
   39.14 +# vfb = [ 'sdl=1,xauthority=/home/bozo/.Xauthority,display=:1' ]
   39.15  #
   39.16  # To create one using the VNC backend and sensible defaults:
   39.17  #
   39.18 -# vfb = [ 'type=vnc' ]
   39.19 +# vfb = [ 'vnc=1' ]
   39.20  #
   39.21  # The backend listens on 127.0.0.1 port 5900+N by default, where N is
   39.22  # the domain ID.  You can override both address and N:
   39.23  #
   39.24 -# vfb = [ 'type=vnc,vnclisten=127.0.0.1,vncdisplay=%d' % vmid ]
   39.25 +# vfb = [ 'vnc=1,vnclisten=127.0.0.1,vncdisplay=%d' % vmid ]
   39.26  #
   39.27  # Or you can bind the first unused port above 5900:
   39.28  #
   39.29 -# vfb = [ 'type=vnc,vnclisten=0.0.0.0,vncunused=1' ]
   39.30 +# vfb = [ 'vnc=1,vnclisten=0.0.0.0,vncunused=1' ]
   39.31  #
   39.32  # You can override the password:
   39.33  #
   39.34 -# vfb = [ 'type=vnc,vncpasswd=MYPASSWD' ]
   39.35 +# vfb = [ 'vnc=1,vncpasswd=MYPASSWD' ]
   39.36  #
   39.37  # Empty password disables authentication.  Defaults to the vncpasswd
   39.38  # configured in xend-config.sxp.
    40.1 --- a/tools/examples/xmexample3	Mon Mar 30 19:56:30 2009 -0700
    40.2 +++ b/tools/examples/xmexample3	Thu Apr 23 18:49:41 2009 -0700
    40.3 @@ -94,29 +94,29 @@ disk = [ 'phy:hda%d,hda1,w' % (vmid)]
    40.4  #
    40.5  # To create one using the SDL backend and sensible defaults:
    40.6  #
    40.7 -# vfb = [ 'type=sdl' ]
    40.8 +# vfb = [ 'sdl=1' ]
    40.9  #
   40.10  # This uses environment variables XAUTHORITY and DISPLAY.  You
   40.11  # can override that:
   40.12  #
   40.13 -# vfb = [ 'type=sdl,xauthority=/home/bozo/.Xauthority,display=:1' ]
   40.14 +# vfb = [ 'sdl=1,xauthority=/home/bozo/.Xauthority,display=:1' ]
   40.15  #
   40.16  # To create one using the VNC backend and sensible defaults:
   40.17  #
   40.18 -# vfb = [ 'type=vnc' ]
   40.19 +# vfb = [ 'vnc=1' ]
   40.20  #
   40.21  # The backend listens on 127.0.0.1 port 5900+N by default, where N is
   40.22  # the domain ID.  You can override both address and N:
   40.23  #
   40.24 -# vfb = [ 'type=vnc,vnclisten=127.0.0.1,vncdisplay=%d' % vmid ]
   40.25 +# vfb = [ 'vnc=1,vnclisten=127.0.0.1,vncdisplay=%d' % vmid ]
   40.26  #
   40.27  # Or you can bind the first unused port above 5900:
   40.28  #
   40.29 -# vfb = [ 'type=vnc,vnclisten=0.0.0.0,vncunused=1' ]
   40.30 +# vfb = [ 'vnc=1,vnclisten=0.0.0.0,vncunused=1' ]
   40.31  #
   40.32  # You can override the password:
   40.33  #
   40.34 -# vfb = [ 'type=vnc,vncpasswd=MYPASSWD' ]
   40.35 +# vfb = [ 'vnc=1,vncpasswd=MYPASSWD' ]
   40.36  #
   40.37  # Empty password disables authentication.  Defaults to the vncpasswd
   40.38  # configured in xend-config.sxp.
    41.1 --- a/tools/firmware/Makefile	Mon Mar 30 19:56:30 2009 -0700
    41.2 +++ b/tools/firmware/Makefile	Thu Apr 23 18:49:41 2009 -0700
    41.3 @@ -2,9 +2,8 @@ XEN_ROOT = ../..
    41.4  include $(XEN_ROOT)/tools/Rules.mk
    41.5  
    41.6  # hvmloader is a 32-bit protected mode binary.
    41.7 -# It belongs in /usr/lib, not /usr/lib64.
    41.8  TARGET      := hvmloader/hvmloader
    41.9 -INST_DIR := $(DESTDIR)/usr/lib/xen/boot
   41.10 +INST_DIR := $(DESTDIR)$(LIBDIR_x86_32)/xen/boot
   41.11  
   41.12  SUBDIRS :=
   41.13  SUBDIRS += rombios
   41.14 @@ -15,13 +14,13 @@ SUBDIRS += hvmloader
   41.15  .PHONY: all
   41.16  all:
   41.17  	@set -e; if [ $$((`( bcc -v 2>&1 | grep version || echo 0.0.0 ) | cut -d' ' -f 3 | awk -F. '{ printf "0x%02x%02x%02x", $$1, $$2, $$3}'`)) -lt $$((0x00100e)) ] ; then \
   41.18 -	echo "==========================================================="; \
   41.19 -	echo "Require dev86 package version >= 0.16.14 to build firmware!"; \
   41.20 -	echo "(visit http://www.cix.co.uk/~mayday for more information)"; \
   41.21 -	echo "==========================================================="; \
   41.22 -	else \
   41.23 +	echo "==========================================================================="; \
   41.24 +	echo "Require dev86 rpm or bin86 & bcc debs version >= 0.16.14 to build firmware!"; \
   41.25 +	echo "(visit http://www.debath.co.uk/dev86/ for more information)"; \
   41.26 +	echo "==========================================================================="; \
   41.27 +	false ; \
   41.28 +	fi
   41.29  	$(MAKE) subdirs-$@; \
   41.30 -	fi
   41.31  
   41.32  
   41.33  .PHONY: install
    42.1 --- a/tools/firmware/hvmloader/acpi/dsdt.asl	Mon Mar 30 19:56:30 2009 -0700
    42.2 +++ b/tools/firmware/hvmloader/acpi/dsdt.asl	Thu Apr 23 18:49:41 2009 -0700
    42.3 @@ -123,7 +123,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
    42.4             Name (_BBN, 0x00)
    42.5  
    42.6             /*
    42.7 -            * Reserve the IO port ranges [0x10c0, 0x10c2] and [0xb044, 0xb047].
    42.8 +            * Reserve the IO port ranges [0x10c0, 0x10e1] and [0xb044, 0xb047].
    42.9              * Or else, for a hotplugged-in device, the port IO BAR assigned
   42.10              * by guest OS may conflict with the ranges here.
   42.11              */
   42.12 @@ -131,7 +131,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
   42.13             {
   42.14                 Name(_HID, EISAID("PNP0C02"))
   42.15                 Name(_CRS, ResourceTemplate() {
   42.16 -                   IO (Decode16, 0x10c0, 0x10c0, 0x00, 0x03)
   42.17 +                   IO (Decode16, 0x10c0, 0x10c0, 0x00, 0x22)
   42.18                     IO (Decode16, 0xb044, 0xb044, 0x00, 0x04)
   42.19                 })
   42.20             }
   42.21 @@ -470,6 +470,102 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
   42.22                  Package(){0x000fffff, 1, \_SB.PCI0.LNKA, 0},
   42.23                  Package(){0x000fffff, 2, \_SB.PCI0.LNKB, 0},
   42.24                  Package(){0x000fffff, 3, \_SB.PCI0.LNKC, 0},
   42.25 +
   42.26 +                /* Device 16, INTA - INTD */
   42.27 +                Package(){0x0010ffff, 0, \_SB.PCI0.LNKA, 0},
   42.28 +                Package(){0x0010ffff, 1, \_SB.PCI0.LNKB, 0},
   42.29 +                Package(){0x0010ffff, 2, \_SB.PCI0.LNKC, 0},
   42.30 +                Package(){0x0010ffff, 3, \_SB.PCI0.LNKD, 0},
   42.31 +
   42.32 +                /* Device 17, INTA - INTD */
   42.33 +                Package(){0x0011ffff, 0, \_SB.PCI0.LNKB, 0},
   42.34 +                Package(){0x0011ffff, 1, \_SB.PCI0.LNKC, 0},
   42.35 +                Package(){0x0011ffff, 2, \_SB.PCI0.LNKD, 0},
   42.36 +                Package(){0x0011ffff, 3, \_SB.PCI0.LNKA, 0},
   42.37 +
   42.38 +                /* Device 18, INTA - INTD */
   42.39 +                Package(){0x0012ffff, 0, \_SB.PCI0.LNKC, 0},
   42.40 +                Package(){0x0012ffff, 1, \_SB.PCI0.LNKD, 0},
   42.41 +                Package(){0x0012ffff, 2, \_SB.PCI0.LNKA, 0},
   42.42 +                Package(){0x0012ffff, 3, \_SB.PCI0.LNKB, 0},
   42.43 +
   42.44 +                /* Device 19, INTA - INTD */
   42.45 +                Package(){0x0013ffff, 0, \_SB.PCI0.LNKD, 0},
   42.46 +                Package(){0x0013ffff, 1, \_SB.PCI0.LNKA, 0},
   42.47 +                Package(){0x0013ffff, 2, \_SB.PCI0.LNKB, 0},
   42.48 +                Package(){0x0013ffff, 3, \_SB.PCI0.LNKC, 0},
   42.49 +
   42.50 +                /* Device 20, INTA - INTD */
   42.51 +                Package(){0x0014ffff, 0, \_SB.PCI0.LNKA, 0},
   42.52 +                Package(){0x0014ffff, 1, \_SB.PCI0.LNKB, 0},
   42.53 +                Package(){0x0014ffff, 2, \_SB.PCI0.LNKC, 0},
   42.54 +                Package(){0x0014ffff, 3, \_SB.PCI0.LNKD, 0},
   42.55 +
   42.56 +                /* Device 21, INTA - INTD */
   42.57 +                Package(){0x0015ffff, 0, \_SB.PCI0.LNKB, 0},
   42.58 +                Package(){0x0015ffff, 1, \_SB.PCI0.LNKC, 0},
   42.59 +                Package(){0x0015ffff, 2, \_SB.PCI0.LNKD, 0},
   42.60 +                Package(){0x0015ffff, 3, \_SB.PCI0.LNKA, 0},
   42.61 +
   42.62 +                /* Device 22, INTA - INTD */
   42.63 +                Package(){0x0016ffff, 0, \_SB.PCI0.LNKC, 0},
   42.64 +                Package(){0x0016ffff, 1, \_SB.PCI0.LNKD, 0},
   42.65 +                Package(){0x0016ffff, 2, \_SB.PCI0.LNKA, 0},
   42.66 +                Package(){0x0016ffff, 3, \_SB.PCI0.LNKB, 0},
   42.67 +
   42.68 +                /* Device 23, INTA - INTD */
   42.69 +                Package(){0x0017ffff, 0, \_SB.PCI0.LNKD, 0},
   42.70 +                Package(){0x0017ffff, 1, \_SB.PCI0.LNKA, 0},
   42.71 +                Package(){0x0017ffff, 2, \_SB.PCI0.LNKB, 0},
   42.72 +                Package(){0x0017ffff, 3, \_SB.PCI0.LNKC, 0},
   42.73 +
   42.74 +                /* Device 24, INTA - INTD */
   42.75 +                Package(){0x0018ffff, 0, \_SB.PCI0.LNKA, 0},
   42.76 +                Package(){0x0018ffff, 1, \_SB.PCI0.LNKB, 0},
   42.77 +                Package(){0x0018ffff, 2, \_SB.PCI0.LNKC, 0},
   42.78 +                Package(){0x0018ffff, 3, \_SB.PCI0.LNKD, 0},
   42.79 +
   42.80 +                /* Device 25, INTA - INTD */
   42.81 +                Package(){0x0019ffff, 0, \_SB.PCI0.LNKB, 0},
   42.82 +                Package(){0x0019ffff, 1, \_SB.PCI0.LNKC, 0},
   42.83 +                Package(){0x0019ffff, 2, \_SB.PCI0.LNKD, 0},
   42.84 +                Package(){0x0019ffff, 3, \_SB.PCI0.LNKA, 0},
   42.85 +
   42.86 +                /* Device 26, INTA - INTD */
   42.87 +                Package(){0x001affff, 0, \_SB.PCI0.LNKC, 0},
   42.88 +                Package(){0x001affff, 1, \_SB.PCI0.LNKD, 0},
   42.89 +                Package(){0x001affff, 2, \_SB.PCI0.LNKA, 0},
   42.90 +                Package(){0x001affff, 3, \_SB.PCI0.LNKB, 0},
   42.91 +
   42.92 +                /* Device 27, INTA - INTD */
   42.93 +                Package(){0x001bffff, 0, \_SB.PCI0.LNKD, 0},
   42.94 +                Package(){0x001bffff, 1, \_SB.PCI0.LNKA, 0},
   42.95 +                Package(){0x001bffff, 2, \_SB.PCI0.LNKB, 0},
   42.96 +                Package(){0x001bffff, 3, \_SB.PCI0.LNKC, 0},
   42.97 +
   42.98 +                /* Device 28, INTA - INTD */
   42.99 +                Package(){0x001cffff, 0, \_SB.PCI0.LNKA, 0},
  42.100 +                Package(){0x001cffff, 1, \_SB.PCI0.LNKB, 0},
  42.101 +                Package(){0x001cffff, 2, \_SB.PCI0.LNKC, 0},
  42.102 +                Package(){0x001cffff, 3, \_SB.PCI0.LNKD, 0},
  42.103 +
  42.104 +                /* Device 29, INTA - INTD */
  42.105 +                Package(){0x001dffff, 0, \_SB.PCI0.LNKB, 0},
  42.106 +                Package(){0x001dffff, 1, \_SB.PCI0.LNKC, 0},
  42.107 +                Package(){0x001dffff, 2, \_SB.PCI0.LNKD, 0},
  42.108 +                Package(){0x001dffff, 3, \_SB.PCI0.LNKA, 0},
  42.109 +
  42.110 +                /* Device 30, INTA - INTD */
  42.111 +                Package(){0x001effff, 0, \_SB.PCI0.LNKC, 0},
  42.112 +                Package(){0x001effff, 1, \_SB.PCI0.LNKD, 0},
  42.113 +                Package(){0x001effff, 2, \_SB.PCI0.LNKA, 0},
  42.114 +                Package(){0x001effff, 3, \_SB.PCI0.LNKB, 0},
  42.115 +
  42.116 +                /* Device 31, INTA - INTD */
  42.117 +                Package(){0x001fffff, 0, \_SB.PCI0.LNKD, 0},
  42.118 +                Package(){0x001fffff, 1, \_SB.PCI0.LNKA, 0},
  42.119 +                Package(){0x001fffff, 2, \_SB.PCI0.LNKB, 0},
  42.120 +                Package(){0x001fffff, 3, \_SB.PCI0.LNKC, 0},
  42.121              })
  42.122  
  42.123              Name(PRTA, Package() {
  42.124 @@ -562,6 +658,102 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
  42.125                  Package(){0x000fffff, 1, 0, 46},
  42.126                  Package(){0x000fffff, 2, 0, 47},
  42.127                  Package(){0x000fffff, 3, 0, 16},
  42.128 +
  42.129 +                /* Device 16, INTA - INTD */
  42.130 +                Package(){0x0010ffff, 0, 0, 18},
  42.131 +                Package(){0x0010ffff, 1, 0, 19},
  42.132 +                Package(){0x0010ffff, 2, 0, 20},
  42.133 +                Package(){0x0010ffff, 3, 0, 21},
  42.134 +
  42.135 +                /* Device 17, INTA - INTD */
  42.136 +                Package(){0x0011ffff, 0, 0, 22},
  42.137 +                Package(){0x0011ffff, 1, 0, 23},
  42.138 +                Package(){0x0011ffff, 2, 0, 24},
  42.139 +                Package(){0x0011ffff, 3, 0, 25},
  42.140 +
  42.141 +                /* Device 18, INTA - INTD */
  42.142 +                Package(){0x0012ffff, 0, 0, 26},
  42.143 +                Package(){0x0012ffff, 1, 0, 27},
  42.144 +                Package(){0x0012ffff, 2, 0, 28},
  42.145 +                Package(){0x0012ffff, 3, 0, 29},
  42.146 +
  42.147 +                /* Device 19, INTA - INTD */
  42.148 +                Package(){0x0013ffff, 0, 0, 30},
  42.149 +                Package(){0x0013ffff, 1, 0, 31},
  42.150 +                Package(){0x0013ffff, 2, 0, 32},
  42.151 +                Package(){0x0013ffff, 3, 0, 33},
  42.152 +
  42.153 +                /* Device 20, INTA - INTD */
  42.154 +                Package(){0x0014ffff, 0, 0, 34},
  42.155 +                Package(){0x0014ffff, 1, 0, 35},
  42.156 +                Package(){0x0014ffff, 2, 0, 36},
  42.157 +                Package(){0x0014ffff, 3, 0, 37},
  42.158 +
  42.159 +                /* Device 21, INTA - INTD */
  42.160 +                Package(){0x0015ffff, 0, 0, 38},
  42.161 +                Package(){0x0015ffff, 1, 0, 39},
  42.162 +                Package(){0x0015ffff, 2, 0, 40},
  42.163 +                Package(){0x0015ffff, 3, 0, 41},
  42.164 +
  42.165 +                /* Device 22, INTA - INTD */
  42.166 +                Package(){0x0016ffff, 0, 0, 42},
  42.167 +                Package(){0x0016ffff, 1, 0, 43},
  42.168 +                Package(){0x0016ffff, 2, 0, 44},
  42.169 +                Package(){0x0016ffff, 3, 0, 45},
  42.170 +
  42.171 +                /* Device 23, INTA - INTD */
  42.172 +                Package(){0x0017ffff, 0, 0, 46},
  42.173 +                Package(){0x0017ffff, 1, 0, 47},
  42.174 +                Package(){0x0017ffff, 2, 0, 16},
  42.175 +                Package(){0x0017ffff, 3, 0, 17},
  42.176 +
  42.177 +                /* Device 24, INTA - INTD */
  42.178 +                Package(){0x0018ffff, 0, 0, 19},
  42.179 +                Package(){0x0018ffff, 1, 0, 20},
  42.180 +                Package(){0x0018ffff, 2, 0, 21},
  42.181 +                Package(){0x0018ffff, 3, 0, 22},
  42.182 +
  42.183 +                /* Device 25, INTA - INTD */
  42.184 +                Package(){0x0019ffff, 0, 0, 23},
  42.185 +                Package(){0x0019ffff, 1, 0, 24},
  42.186 +                Package(){0x0019ffff, 2, 0, 25},
  42.187 +                Package(){0x0019ffff, 3, 0, 26},
  42.188 +
  42.189 +                /* Device 26, INTA - INTD */
  42.190 +                Package(){0x001affff, 0, 0, 27},
  42.191 +                Package(){0x001affff, 1, 0, 28},
  42.192 +                Package(){0x001affff, 2, 0, 29},
  42.193 +                Package(){0x001affff, 3, 0, 30},
  42.194 +
  42.195 +                /* Device 27, INTA - INTD */
  42.196 +                Package(){0x001bffff, 0, 0, 31},
  42.197 +                Package(){0x001bffff, 1, 0, 32},
  42.198 +                Package(){0x001bffff, 2, 0, 33},
  42.199 +                Package(){0x001bffff, 3, 0, 34},
  42.200 +
  42.201 +                /* Device 28, INTA - INTD */
  42.202 +                Package(){0x001cffff, 0, 0, 35},
  42.203 +                Package(){0x001cffff, 1, 0, 36},
  42.204 +                Package(){0x001cffff, 2, 0, 37},
  42.205 +                Package(){0x001cffff, 3, 0, 38},
  42.206 +
  42.207 +                /* Device 29, INTA - INTD */
  42.208 +                Package(){0x001dffff, 0, 0, 39},
  42.209 +                Package(){0x001dffff, 1, 0, 40},
  42.210 +                Package(){0x001dffff, 2, 0, 41},
  42.211 +                Package(){0x001dffff, 3, 0, 42},
  42.212 +
  42.213 +                /* Device 30, INTA - INTD */
  42.214 +                Package(){0x001effff, 0, 0, 43},
  42.215 +                Package(){0x001effff, 1, 0, 44},
  42.216 +                Package(){0x001effff, 2, 0, 45},
  42.217 +                Package(){0x001effff, 3, 0, 46},
  42.218 +
  42.219 +                /* Device 31, INTA - INTD */
  42.220 +                Package(){0x001fffff, 0, 0, 47},
  42.221 +                Package(){0x001fffff, 1, 0, 16},
  42.222 +                Package(){0x001fffff, 2, 0, 17},
  42.223 +                Package(){0x001fffff, 3, 0, 18},
  42.224              })
  42.225              
  42.226              Device (ISA)
  42.227 @@ -789,60 +981,1027 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
  42.228               * handle the hotplug action and status, which is beyond the ACPI
  42.229               * scope.
  42.230               */
  42.231 +            Device(S00)
  42.232 +            {
  42.233 +                Name (_ADR, 0x00000000) /* Dev 0, Func 0 */
  42.234 +                Name (_SUN, 0x00000000)
  42.235  
  42.236 -            Device (S1F0)
  42.237 +                Method (_PS0, 0)
  42.238 +                {
  42.239 +                    Store (0x00, \_GPE.DPT1)
  42.240 +                    Store (0x80, \_GPE.DPT2)
  42.241 +                }
  42.242 +
  42.243 +                Method (_PS3, 0)
  42.244 +                {
  42.245 +                    Store (0x00, \_GPE.DPT1)
  42.246 +                    Store (0x83, \_GPE.DPT2)
  42.247 +                }
  42.248 +
  42.249 +                Method (_EJ0, 1)
  42.250 +                {
  42.251 +                    Store (0x00, \_GPE.DPT1)
  42.252 +                    Store (0x88, \_GPE.DPT2)
  42.253 +                    Store (0x1, \_GPE.PH00) /* eject php slot 0x00 */
  42.254 +                }
  42.255 +
  42.256 +                Method (_STA, 0)
  42.257 +                {
  42.258 +                    Store (0x00, \_GPE.DPT1)
  42.259 +                    Store (0x89, \_GPE.DPT2)
  42.260 +                    Return (\_GPE.PH00) /* IN status as the _STA */
  42.261 +                }
  42.262 +            }
  42.263 +
  42.264 +            Device(S01)
  42.265              {
  42.266 -                Name (_ADR, 0x00060000) /* Dev 6, Func 0 */
  42.267 +                Name (_ADR, 0x00010000) /* Dev 1, Func 0 */
  42.268                  Name (_SUN, 0x00000001)
  42.269  
  42.270                  Method (_PS0, 0)
  42.271                  {
  42.272 +                    Store (0x01, \_GPE.DPT1)
  42.273 +                    Store (0x80, \_GPE.DPT2)
  42.274 +                }
  42.275 +
  42.276 +                Method (_PS3, 0)
  42.277 +                {
  42.278 +                    Store (0x01, \_GPE.DPT1)
  42.279 +                    Store (0x83, \_GPE.DPT2)
  42.280 +                }
  42.281 +
  42.282 +                Method (_EJ0, 1)
  42.283 +                {
  42.284 +                    Store (0x01, \_GPE.DPT1)
  42.285 +                    Store (0x88, \_GPE.DPT2)
  42.286 +                    Store (0x1, \_GPE.PH01) /* eject php slot 0x01 */
  42.287 +                }
  42.288 +
  42.289 +                Method (_STA, 0)
  42.290 +                {
  42.291 +                    Store (0x01, \_GPE.DPT1)
  42.292 +                    Store (0x89, \_GPE.DPT2)
  42.293 +                    Return (\_GPE.PH01) /* IN status as the _STA */
  42.294 +                }
  42.295 +            }
  42.296 +
  42.297 +            Device(S02)
  42.298 +            {
  42.299 +                Name (_ADR, 0x00020000) /* Dev 2, Func 0 */
  42.300 +                Name (_SUN, 0x00000002)
  42.301 +
  42.302 +                Method (_PS0, 0)
  42.303 +                {
  42.304 +                    Store (0x02, \_GPE.DPT1)
  42.305 +                    Store (0x80, \_GPE.DPT2)
  42.306 +                }
  42.307 +
  42.308 +                Method (_PS3, 0)
  42.309 +                {
  42.310 +                    Store (0x02, \_GPE.DPT1)
  42.311 +                    Store (0x83, \_GPE.DPT2)
  42.312 +                }
  42.313 +
  42.314 +                Method (_EJ0, 1)
  42.315 +                {
  42.316 +                    Store (0x02, \_GPE.DPT1)
  42.317 +                    Store (0x88, \_GPE.DPT2)
  42.318 +                    Store (0x1, \_GPE.PH02) /* eject php slot 0x02 */
  42.319 +                }
  42.320 +
  42.321 +                Method (_STA, 0)
  42.322 +                {
  42.323 +                    Store (0x02, \_GPE.DPT1)
  42.324 +                    Store (0x89, \_GPE.DPT2)
  42.325 +                    Return (\_GPE.PH02) /* IN status as the _STA */
  42.326 +                }
  42.327 +            }
  42.328 +
  42.329 +            Device(S03)
  42.330 +            {
  42.331 +                Name (_ADR, 0x00030000) /* Dev 3, Func 0 */
  42.332 +                Name (_SUN, 0x00000003)
  42.333 +
  42.334 +                Method (_PS0, 0)
  42.335 +                {
  42.336 +                    Store (0x03, \_GPE.DPT1)
  42.337 +                    Store (0x80, \_GPE.DPT2)
  42.338 +                }
  42.339 +
  42.340 +                Method (_PS3, 0)
  42.341 +                {
  42.342 +                    Store (0x03, \_GPE.DPT1)
  42.343 +                    Store (0x83, \_GPE.DPT2)
  42.344 +                }
  42.345 +
  42.346 +                Method (_EJ0, 1)
  42.347 +                {
  42.348 +                    Store (0x03, \_GPE.DPT1)
  42.349 +                    Store (0x88, \_GPE.DPT2)
  42.350 +                    Store (0x1, \_GPE.PH03) /* eject php slot 0x03 */
  42.351 +                }
  42.352 +
  42.353 +                Method (_STA, 0)
  42.354 +                {
  42.355 +                    Store (0x03, \_GPE.DPT1)
  42.356 +                    Store (0x89, \_GPE.DPT2)
  42.357 +                    Return (\_GPE.PH03) /* IN status as the _STA */
  42.358 +                }
  42.359 +            }
  42.360 +
  42.361 +            Device(S04)
  42.362 +            {
  42.363 +                Name (_ADR, 0x00040000) /* Dev 4, Func 0 */
  42.364 +                Name (_SUN, 0x00000004)
  42.365 +
  42.366 +                Method (_PS0, 0)
  42.367 +                {
  42.368 +                    Store (0x04, \_GPE.DPT1)
  42.369 +                    Store (0x80, \_GPE.DPT2)
  42.370 +                }
  42.371 +
  42.372 +                Method (_PS3, 0)
  42.373 +                {
  42.374 +                    Store (0x04, \_GPE.DPT1)
  42.375 +                    Store (0x83, \_GPE.DPT2)
  42.376 +                }
  42.377 +
  42.378 +                Method (_EJ0, 1)
  42.379 +                {
  42.380 +                    Store (0x04, \_GPE.DPT1)
  42.381 +                    Store (0x88, \_GPE.DPT2)
  42.382 +                    Store (0x1, \_GPE.PH04) /* eject php slot 0x04 */
  42.383 +                }
  42.384 +
  42.385 +                Method (_STA, 0)
  42.386 +                {
  42.387 +                    Store (0x04, \_GPE.DPT1)
  42.388 +                    Store (0x89, \_GPE.DPT2)
  42.389 +                    Return (\_GPE.PH04) /* IN status as the _STA */
  42.390 +                }
  42.391 +            }
  42.392 +
  42.393 +            Device(S05)
  42.394 +            {
  42.395 +                Name (_ADR, 0x00050000) /* Dev 5, Func 0 */
  42.396 +                Name (_SUN, 0x00000005)
  42.397 +
  42.398 +                Method (_PS0, 0)
  42.399 +                {
  42.400 +                    Store (0x05, \_GPE.DPT1)
  42.401 +                    Store (0x80, \_GPE.DPT2)
  42.402 +                }
  42.403 +
  42.404 +                Method (_PS3, 0)
  42.405 +                {
  42.406 +                    Store (0x05, \_GPE.DPT1)
  42.407 +                    Store (0x83, \_GPE.DPT2)
  42.408 +                }
  42.409 +
  42.410 +                Method (_EJ0, 1)
  42.411 +                {
  42.412 +                    Store (0x05, \_GPE.DPT1)
  42.413 +                    Store (0x88, \_GPE.DPT2)
  42.414 +                    Store (0x1, \_GPE.PH05) /* eject php slot 0x05 */
  42.415 +                }
  42.416 +
  42.417 +                Method (_STA, 0)
  42.418 +                {
  42.419 +                    Store (0x05, \_GPE.DPT1)
  42.420 +                    Store (0x89, \_GPE.DPT2)
  42.421 +                    Return (\_GPE.PH05) /* IN status as the _STA */
  42.422 +                }
  42.423 +            }
  42.424 +
  42.425 +            Device(S06)
  42.426 +            {
  42.427 +                Name (_ADR, 0x00060000) /* Dev 6, Func 0 */
  42.428 +                Name (_SUN, 0x00000006)
  42.429 +
  42.430 +                Method (_PS0, 0)
  42.431 +                {
  42.432 +                    Store (0x06, \_GPE.DPT1)
  42.433 +                    Store (0x80, \_GPE.DPT2)
  42.434 +                }
  42.435 +
  42.436 +                Method (_PS3, 0)
  42.437 +                {
  42.438 +                    Store (0x06, \_GPE.DPT1)
  42.439 +                    Store (0x83, \_GPE.DPT2)
  42.440 +                }
  42.441 +
  42.442 +                Method (_EJ0, 1)
  42.443 +                {
  42.444 +                    Store (0x06, \_GPE.DPT1)
  42.445 +                    Store (0x88, \_GPE.DPT2)
  42.446 +                    Store (0x1, \_GPE.PH06) /* eject php slot 0x06 */
  42.447 +                }
  42.448 +
  42.449 +                Method (_STA, 0)
  42.450 +                {
  42.451 +                    Store (0x06, \_GPE.DPT1)
  42.452 +                    Store (0x89, \_GPE.DPT2)
  42.453 +                    Return (\_GPE.PH06) /* IN status as the _STA */
  42.454 +                }
  42.455 +            }
  42.456 +
  42.457 +            Device(S07)
  42.458 +            {
  42.459 +                Name (_ADR, 0x00070000) /* Dev 7, Func 0 */
  42.460 +                Name (_SUN, 0x00000007)
  42.461 +
  42.462 +                Method (_PS0, 0)
  42.463 +                {
  42.464 +                    Store (0x07, \_GPE.DPT1)
  42.465                      Store (0x80, \_GPE.DPT2)
  42.466                  }
  42.467  
  42.468                  Method (_PS3, 0)
  42.469                  {
  42.470 +                    Store (0x07, \_GPE.DPT1)
  42.471 +                    Store (0x83, \_GPE.DPT2)
  42.472 +                }
  42.473 +
  42.474 +                Method (_EJ0, 1)
  42.475 +                {
  42.476 +                    Store (0x07, \_GPE.DPT1)
  42.477 +                    Store (0x88, \_GPE.DPT2)
  42.478 +                    Store (0x1, \_GPE.PH07) /* eject php slot 0x07 */
  42.479 +                }
  42.480 +
  42.481 +                Method (_STA, 0)
  42.482 +                {
  42.483 +                    Store (0x07, \_GPE.DPT1)
  42.484 +                    Store (0x89, \_GPE.DPT2)
  42.485 +                    Return (\_GPE.PH07) /* IN status as the _STA */
  42.486 +                }
  42.487 +            }
  42.488 +
  42.489 +            Device(S08)
  42.490 +            {
  42.491 +                Name (_ADR, 0x00080000) /* Dev 8, Func 0 */
  42.492 +                Name (_SUN, 0x00000008)
  42.493 +
  42.494 +                Method (_PS0, 0)
  42.495 +                {
  42.496 +                    Store (0x08, \_GPE.DPT1)
  42.497 +                    Store (0x80, \_GPE.DPT2)
  42.498 +                }
  42.499 +
  42.500 +                Method (_PS3, 0)
  42.501 +                {
  42.502 +                    Store (0x08, \_GPE.DPT1)
  42.503 +                    Store (0x83, \_GPE.DPT2)
  42.504 +                }
  42.505 +
  42.506 +                Method (_EJ0, 1)
  42.507 +                {
  42.508 +                    Store (0x08, \_GPE.DPT1)
  42.509 +                    Store (0x88, \_GPE.DPT2)
  42.510 +                    Store (0x1, \_GPE.PH08) /* eject php slot 0x08 */
  42.511 +                }
  42.512 +
  42.513 +                Method (_STA, 0)
  42.514 +                {
  42.515 +                    Store (0x08, \_GPE.DPT1)
  42.516 +                    Store (0x89, \_GPE.DPT2)
  42.517 +                    Return (\_GPE.PH08) /* IN status as the _STA */
  42.518 +                }
  42.519 +            }
  42.520 +
  42.521 +            Device(S09)
  42.522 +            {
  42.523 +                Name (_ADR, 0x00090000) /* Dev 9, Func 0 */
  42.524 +                Name (_SUN, 0x00000009)
  42.525 +
  42.526 +                Method (_PS0, 0)
  42.527 +                {
  42.528 +                    Store (0x09, \_GPE.DPT1)
  42.529 +                    Store (0x80, \_GPE.DPT2)
  42.530 +                }
  42.531 +
  42.532 +                Method (_PS3, 0)
  42.533 +                {
  42.534 +                    Store (0x09, \_GPE.DPT1)
  42.535 +                    Store (0x83, \_GPE.DPT2)
  42.536 +                }
  42.537 +
  42.538 +                Method (_EJ0, 1)
  42.539 +                {
  42.540 +                    Store (0x09, \_GPE.DPT1)
  42.541 +                    Store (0x88, \_GPE.DPT2)
  42.542 +                    Store (0x1, \_GPE.PH09) /* eject php slot 0x09 */
  42.543 +                }
  42.544 +
  42.545 +                Method (_STA, 0)
  42.546 +                {
  42.547 +                    Store (0x09, \_GPE.DPT1)
  42.548 +                    Store (0x89, \_GPE.DPT2)
  42.549 +                    Return (\_GPE.PH09) /* IN status as the _STA */
  42.550 +                }
  42.551 +            }
  42.552 +
  42.553 +            Device(S0A)
  42.554 +            {
  42.555 +                Name (_ADR, 0x000a0000) /* Dev 10, Func 0 */
  42.556 +                Name (_SUN, 0x0000000a)
  42.557 +
  42.558 +                Method (_PS0, 0)
  42.559 +                {
  42.560 +                    Store (0x0a, \_GPE.DPT1)
  42.561 +                    Store (0x80, \_GPE.DPT2)
  42.562 +                }
  42.563 +
  42.564 +                Method (_PS3, 0)
  42.565 +                {
  42.566 +                    Store (0x0a, \_GPE.DPT1)
  42.567 +                    Store (0x83, \_GPE.DPT2)
  42.568 +                }
  42.569 +
  42.570 +                Method (_EJ0, 1)
  42.571 +                {
  42.572 +                    Store (0x0a, \_GPE.DPT1)
  42.573 +                    Store (0x88, \_GPE.DPT2)
  42.574 +                    Store (0x1, \_GPE.PH0A) /* eject php slot 0x0a */
  42.575 +                }
  42.576 +
  42.577 +                Method (_STA, 0)
  42.578 +                {
  42.579 +                    Store (0x0a, \_GPE.DPT1)
  42.580 +                    Store (0x89, \_GPE.DPT2)
  42.581 +                    Return (\_GPE.PH0A) /* IN status as the _STA */
  42.582 +                }
  42.583 +            }
  42.584 +
  42.585 +            Device(S0B)
  42.586 +            {
  42.587 +                Name (_ADR, 0x000b0000) /* Dev 11, Func 0 */
  42.588 +                Name (_SUN, 0x0000000b)
  42.589 +
  42.590 +                Method (_PS0, 0)
  42.591 +                {
  42.592 +                    Store (0x0b, \_GPE.DPT1)
  42.593 +                    Store (0x80, \_GPE.DPT2)
  42.594 +                }
  42.595 +
  42.596 +                Method (_PS3, 0)
  42.597 +                {
  42.598 +                    Store (0x0b, \_GPE.DPT1)
  42.599 +                    Store (0x83, \_GPE.DPT2)
  42.600 +                }
  42.601 +
  42.602 +                Method (_EJ0, 1)
  42.603 +                {
  42.604 +                    Store (0x0b, \_GPE.DPT1)
  42.605 +                    Store (0x88, \_GPE.DPT2)
  42.606 +                    Store (0x1, \_GPE.PH0B) /* eject php slot 0x0b */
  42.607 +                }
  42.608 +
  42.609 +                Method (_STA, 0)
  42.610 +                {
  42.611 +                    Store (0x0b, \_GPE.DPT1)
  42.612 +                    Store (0x89, \_GPE.DPT2)
  42.613 +                    Return (\_GPE.PH0B) /* IN status as the _STA */
  42.614 +                }
  42.615 +            }
  42.616 +
  42.617 +            Device(S0C)
  42.618 +            {
  42.619 +                Name (_ADR, 0x000c0000) /* Dev 12, Func 0 */
  42.620 +                Name (_SUN, 0x0000000c)
  42.621 +
  42.622 +                Method (_PS0, 0)
  42.623 +                {
  42.624 +                    Store (0x0c, \_GPE.DPT1)
  42.625 +                    Store (0x80, \_GPE.DPT2)
  42.626 +                }
  42.627 +
  42.628 +                Method (_PS3, 0)
  42.629 +                {
  42.630 +                    Store (0x0c, \_GPE.DPT1)
  42.631 +                    Store (0x83, \_GPE.DPT2)
  42.632 +                }
  42.633 +
  42.634 +                Method (_EJ0, 1)
  42.635 +                {
  42.636 +                    Store (0x0c, \_GPE.DPT1)
  42.637 +                    Store (0x88, \_GPE.DPT2)
  42.638 +                    Store (0x1, \_GPE.PH0C) /* eject php slot 0x0c */
  42.639 +                }
  42.640 +
  42.641 +                Method (_STA, 0)
  42.642 +                {
  42.643 +                    Store (0x0c, \_GPE.DPT1)
  42.644 +                    Store (0x89, \_GPE.DPT2)
  42.645 +                    Return (\_GPE.PH0C) /* IN status as the _STA */
  42.646 +                }
  42.647 +            }
  42.648 +
  42.649 +            Device(S0D)
  42.650 +            {
  42.651 +                Name (_ADR, 0x000d0000) /* Dev 13, Func 0 */
  42.652 +                Name (_SUN, 0x0000000d)
  42.653 +
  42.654 +                Method (_PS0, 0)
  42.655 +                {
  42.656 +                    Store (0x0d, \_GPE.DPT1)
  42.657 +                    Store (0x80, \_GPE.DPT2)
  42.658 +                }
  42.659 +
  42.660 +                Method (_PS3, 0)
  42.661 +                {
  42.662 +                    Store (0x0d, \_GPE.DPT1)
  42.663 +                    Store (0x83, \_GPE.DPT2)
  42.664 +                }
  42.665 +
  42.666 +                Method (_EJ0, 1)
  42.667 +                {
  42.668 +                    Store (0x0d, \_GPE.DPT1)
  42.669 +                    Store (0x88, \_GPE.DPT2)
  42.670 +                    Store (0x1, \_GPE.PH0D) /* eject php slot 0x0d */
  42.671 +                }
  42.672 +
  42.673 +                Method (_STA, 0)
  42.674 +                {
  42.675 +                    Store (0x0d, \_GPE.DPT1)
  42.676 +                    Store (0x89, \_GPE.DPT2)
  42.677 +                    Return (\_GPE.PH0D) /* IN status as the _STA */
  42.678 +                }
  42.679 +            }
  42.680 +
  42.681 +            Device(S0E)
  42.682 +            {
  42.683 +                Name (_ADR, 0x000e0000) /* Dev 14, Func 0 */
  42.684 +                Name (_SUN, 0x0000000e)
  42.685 +
  42.686 +                Method (_PS0, 0)
  42.687 +                {
  42.688 +                    Store (0x0e, \_GPE.DPT1)
  42.689 +                    Store (0x80, \_GPE.DPT2)
  42.690 +                }
  42.691 +
  42.692 +                Method (_PS3, 0)
  42.693 +                {
  42.694 +                    Store (0x0e, \_GPE.DPT1)
  42.695 +                    Store (0x83, \_GPE.DPT2)
  42.696 +                }
  42.697 +
  42.698 +                Method (_EJ0, 1)
  42.699 +                {
  42.700 +                    Store (0x0e, \_GPE.DPT1)
  42.701 +                    Store (0x88, \_GPE.DPT2)
  42.702 +                    Store (0x1, \_GPE.PH0E) /* eject php slot 0x0e */
  42.703 +                }
  42.704 +
  42.705 +                Method (_STA, 0)
  42.706 +                {
  42.707 +                    Store (0x0e, \_GPE.DPT1)
  42.708 +                    Store (0x89, \_GPE.DPT2)
  42.709 +                    Return (\_GPE.PH0E) /* IN status as the _STA */
  42.710 +                }
  42.711 +            }
  42.712 +
  42.713 +            Device(S0F)
  42.714 +            {
  42.715 +                Name (_ADR, 0x000f0000) /* Dev 15, Func 0 */
  42.716 +                Name (_SUN, 0x0000000f)
  42.717 +
  42.718 +                Method (_PS0, 0)
  42.719 +                {
  42.720 +                    Store (0x0f, \_GPE.DPT1)
  42.721 +                    Store (0x80, \_GPE.DPT2)
  42.722 +                }
  42.723 +
  42.724 +                Method (_PS3, 0)
  42.725 +                {
  42.726 +                    Store (0x0f, \_GPE.DPT1)
  42.727                      Store (0x83, \_GPE.DPT2)
  42.728                  }
  42.729  
  42.730                  Method (_EJ0, 1)
  42.731                  {
  42.732 +                    Store (0x0f, \_GPE.DPT1)
  42.733                      Store (0x88, \_GPE.DPT2)
  42.734 -                    Store (0x1, \_GPE.PHP1) /* eject php slot 1*/
  42.735 +                    Store (0x1, \_GPE.PH0F) /* eject php slot 0x0f */
  42.736 +                }
  42.737 +
  42.738 +                Method (_STA, 0)
  42.739 +                {
  42.740 +                    Store (0x0f, \_GPE.DPT1)
  42.741 +                    Store (0x89, \_GPE.DPT2)
  42.742 +                    Return (\_GPE.PH0F) /* IN status as the _STA */
  42.743 +                }
  42.744 +            }
  42.745 +
  42.746 +            Device(S10)
  42.747 +            {
  42.748 +                Name (_ADR, 0x00100000) /* Dev 16, Func 0 */
  42.749 +                Name (_SUN, 0x00000010)
  42.750 +
  42.751 +                Method (_PS0, 0)
  42.752 +                {
  42.753 +                    Store (0x10, \_GPE.DPT1)
  42.754 +                    Store (0x80, \_GPE.DPT2)
  42.755 +                }
  42.756 +
  42.757 +                Method (_PS3, 0)
  42.758 +                {
  42.759 +                    Store (0x10, \_GPE.DPT1)
  42.760 +                    Store (0x83, \_GPE.DPT2)
  42.761 +                }
  42.762 +
  42.763 +                Method (_EJ0, 1)
  42.764 +                {
  42.765 +                    Store (0x10, \_GPE.DPT1)
  42.766 +                    Store (0x88, \_GPE.DPT2)
  42.767 +                    Store (0x1, \_GPE.PH10) /* eject php slot 0x10 */
  42.768 +                }
  42.769 +
  42.770 +                Method (_STA, 0)
  42.771 +                {
  42.772 +                    Store (0x10, \_GPE.DPT1)
  42.773 +                    Store (0x89, \_GPE.DPT2)
  42.774 +                    Return (\_GPE.PH10) /* IN status as the _STA */
  42.775 +                }
  42.776 +            }
  42.777 +
  42.778 +            Device(S11)
  42.779 +            {
  42.780 +                Name (_ADR, 0x00110000) /* Dev 17, Func 0 */
  42.781 +                Name (_SUN, 0x00000011)
  42.782 +
  42.783 +                Method (_PS0, 0)
  42.784 +                {
  42.785 +                    Store (0x11, \_GPE.DPT1)
  42.786 +                    Store (0x80, \_GPE.DPT2)
  42.787 +                }
  42.788 +
  42.789 +                Method (_PS3, 0)
  42.790 +                {
  42.791 +                    Store (0x11, \_GPE.DPT1)
  42.792 +                    Store (0x83, \_GPE.DPT2)
  42.793 +                }
  42.794 +
  42.795 +                Method (_EJ0, 1)
  42.796 +                {
  42.797 +                    Store (0x11, \_GPE.DPT1)
  42.798 +                    Store (0x88, \_GPE.DPT2)
  42.799 +                    Store (0x1, \_GPE.PH11) /* eject php slot 0x11 */
  42.800 +                }
  42.801 +
  42.802 +                Method (_STA, 0)
  42.803 +                {
  42.804 +                    Store (0x11, \_GPE.DPT1)
  42.805 +                    Store (0x89, \_GPE.DPT2)
  42.806 +                    Return (\_GPE.PH11) /* IN status as the _STA */
  42.807 +                }
  42.808 +            }
  42.809 +
  42.810 +            Device(S12)
  42.811 +            {
  42.812 +                Name (_ADR, 0x00120000) /* Dev 18, Func 0 */
  42.813 +                Name (_SUN, 0x00000012)
  42.814 +
  42.815 +                Method (_PS0, 0)
  42.816 +                {
  42.817 +                    Store (0x12, \_GPE.DPT1)
  42.818 +                    Store (0x80, \_GPE.DPT2)
  42.819 +                }
  42.820 +
  42.821 +                Method (_PS3, 0)
  42.822 +                {
  42.823 +                    Store (0x12, \_GPE.DPT1)
  42.824 +                    Store (0x83, \_GPE.DPT2)
  42.825 +                }
  42.826 +
  42.827 +                Method (_EJ0, 1)
  42.828 +                {
  42.829 +                    Store (0x12, \_GPE.DPT1)
  42.830 +                    Store (0x88, \_GPE.DPT2)
  42.831 +                    Store (0x1, \_GPE.PH12) /* eject php slot 0x12 */
  42.832 +                }
  42.833 +
  42.834 +                Method (_STA, 0)
  42.835 +                {
  42.836 +                    Store (0x12, \_GPE.DPT1)
  42.837 +                    Store (0x89, \_GPE.DPT2)
  42.838 +                    Return (\_GPE.PH12) /* IN status as the _STA */
  42.839 +                }
  42.840 +            }
  42.841 +
  42.842 +            Device(S13)
  42.843 +            {
  42.844 +                Name (_ADR, 0x00130000) /* Dev 19, Func 0 */
  42.845 +                Name (_SUN, 0x00000013)
  42.846 +
  42.847 +                Method (_PS0, 0)
  42.848 +                {
  42.849 +                    Store (0x13, \_GPE.DPT1)
  42.850 +                    Store (0x80, \_GPE.DPT2)
  42.851 +                }
  42.852 +
  42.853 +                Method (_PS3, 0)
  42.854 +                {
  42.855 +                    Store (0x13, \_GPE.DPT1)
  42.856 +                    Store (0x83, \_GPE.DPT2)
  42.857 +                }
  42.858 +
  42.859 +                Method (_EJ0, 1)
  42.860 +                {
  42.861 +                    Store (0x13, \_GPE.DPT1)
  42.862 +                    Store (0x88, \_GPE.DPT2)
  42.863 +                    Store (0x1, \_GPE.PH13) /* eject php slot 0x13 */
  42.864 +                }
  42.865 +
  42.866 +                Method (_STA, 0)
  42.867 +                {
  42.868 +                    Store (0x13, \_GPE.DPT1)
  42.869 +                    Store (0x89, \_GPE.DPT2)
  42.870 +                    Return (\_GPE.PH13) /* IN status as the _STA */
  42.871 +                }
  42.872 +            }
  42.873 +
  42.874 +            Device(S14)
  42.875 +            {
  42.876 +                Name (_ADR, 0x00140000) /* Dev 20, Func 0 */
  42.877 +                Name (_SUN, 0x00000014)
  42.878 +
  42.879 +                Method (_PS0, 0)
  42.880 +                {
  42.881 +                    Store (0x14, \_GPE.DPT1)
  42.882 +                    Store (0x80, \_GPE.DPT2)
  42.883 +                }
  42.884 +
  42.885 +                Method (_PS3, 0)
  42.886 +                {
  42.887 +                    Store (0x14, \_GPE.DPT1)
  42.888 +                    Store (0x83, \_GPE.DPT2)
  42.889 +                }
  42.890 +
  42.891 +                Method (_EJ0, 1)
  42.892 +                {
  42.893 +                    Store (0x14, \_GPE.DPT1)
  42.894 +                    Store (0x88, \_GPE.DPT2)
  42.895 +                    Store (0x1, \_GPE.PH14) /* eject php slot 0x14 */
  42.896 +                }
  42.897 +
  42.898 +                Method (_STA, 0)
  42.899 +                {
  42.900 +                    Store (0x14, \_GPE.DPT1)
  42.901 +                    Store (0x89, \_GPE.DPT2)
  42.902 +                    Return (\_GPE.PH14) /* IN status as the _STA */
  42.903 +                }
  42.904 +            }
  42.905 +
  42.906 +            Device(S15)
  42.907 +            {
  42.908 +                Name (_ADR, 0x00150000) /* Dev 21, Func 0 */
  42.909 +                Name (_SUN, 0x00000015)
  42.910 +
  42.911 +                Method (_PS0, 0)
  42.912 +                {
  42.913 +                    Store (0x15, \_GPE.DPT1)
  42.914 +                    Store (0x80, \_GPE.DPT2)
  42.915 +                }
  42.916 +
  42.917 +                Method (_PS3, 0)
  42.918 +                {
  42.919 +                    Store (0x15, \_GPE.DPT1)
  42.920 +                    Store (0x83, \_GPE.DPT2)
  42.921 +                }
  42.922 +
  42.923 +                Method (_EJ0, 1)
  42.924 +                {
  42.925 +                    Store (0x15, \_GPE.DPT1)
  42.926 +                    Store (0x88, \_GPE.DPT2)
  42.927 +                    Store (0x1, \_GPE.PH15) /* eject php slot 0x15 */
  42.928 +                }
  42.929 +
  42.930 +                Method (_STA, 0)
  42.931 +                {
  42.932 +                    Store (0x15, \_GPE.DPT1)
  42.933 +                    Store (0x89, \_GPE.DPT2)
  42.934 +                    Return (\_GPE.PH15) /* IN status as the _STA */
  42.935 +                }
  42.936 +            }
  42.937 +
  42.938 +            Device(S16)
  42.939 +            {
  42.940 +                Name (_ADR, 0x00160000) /* Dev 22, Func 0 */
  42.941 +                Name (_SUN, 0x00000016)
  42.942 +
  42.943 +                Method (_PS0, 0)
  42.944 +                {
  42.945 +                    Store (0x16, \_GPE.DPT1)
  42.946 +                    Store (0x80, \_GPE.DPT2)
  42.947 +                }
  42.948 +
  42.949 +                Method (_PS3, 0)
  42.950 +                {
  42.951 +                    Store (0x16, \_GPE.DPT1)
  42.952 +                    Store (0x83, \_GPE.DPT2)
  42.953 +                }
  42.954 +
  42.955 +                Method (_EJ0, 1)
  42.956 +                {
  42.957 +                    Store (0x16, \_GPE.DPT1)
  42.958 +                    Store (0x88, \_GPE.DPT2)
  42.959 +                    Store (0x1, \_GPE.PH16) /* eject php slot 0x16 */
  42.960                  }
  42.961  
  42.962                  Method (_STA, 0)
  42.963                  {
  42.964 +                    Store (0x16, \_GPE.DPT1)
  42.965                      Store (0x89, \_GPE.DPT2)
  42.966 -                    Return ( \_GPE.PHP1 )   /* IN status as the _STA */
  42.967 +                    Return (\_GPE.PH16) /* IN status as the _STA */
  42.968 +                }
  42.969 +            }
  42.970 +
  42.971 +            Device(S17)
  42.972 +            {
  42.973 +                Name (_ADR, 0x00170000) /* Dev 23, Func 0 */
  42.974 +                Name (_SUN, 0x00000017)
  42.975 +
  42.976 +                Method (_PS0, 0)
  42.977 +                {
  42.978 +                    Store (0x17, \_GPE.DPT1)
  42.979 +                    Store (0x80, \_GPE.DPT2)
  42.980 +                }
  42.981 +
  42.982 +                Method (_PS3, 0)
  42.983 +                {
  42.984 +                    Store (0x17, \_GPE.DPT1)
  42.985 +                    Store (0x83, \_GPE.DPT2)
  42.986 +                }
  42.987 +
  42.988 +                Method (_EJ0, 1)
  42.989 +                {
  42.990 +                    Store (0x17, \_GPE.DPT1)
  42.991 +                    Store (0x88, \_GPE.DPT2)
  42.992 +                    Store (0x1, \_GPE.PH17) /* eject php slot 0x17 */
  42.993 +                }
  42.994 +
  42.995 +                Method (_STA, 0)
  42.996 +                {
  42.997 +                    Store (0x17, \_GPE.DPT1)
  42.998 +                    Store (0x89, \_GPE.DPT2)
  42.999 +                    Return (\_GPE.PH17) /* IN status as the _STA */
 42.1000                  }
 42.1001              }
 42.1002  
 42.1003 -            Device (S2F0)
 42.1004 +            Device(S18)
 42.1005              {
 42.1006 -                Name (_ADR, 0x00070000) /* Dev 7, Func 0 */
 42.1007 -                Name (_SUN, 0x00000002)
 42.1008 +                Name (_ADR, 0x00180000) /* Dev 24, Func 0 */
 42.1009 +                Name (_SUN, 0x00000018)
 42.1010  
 42.1011                  Method (_PS0, 0)
 42.1012                  {
 42.1013 -                    Store (0x90, \_GPE.DPT2)
 42.1014 +                    Store (0x18, \_GPE.DPT1)
 42.1015 +                    Store (0x80, \_GPE.DPT2)
 42.1016 +                }
 42.1017 +
 42.1018 +                Method (_PS3, 0)
 42.1019 +                {
 42.1020 +                    Store (0x18, \_GPE.DPT1)
 42.1021 +                    Store (0x83, \_GPE.DPT2)
 42.1022 +                }
 42.1023 +
 42.1024 +                Method (_EJ0, 1)
 42.1025 +                {
 42.1026 +                    Store (0x18, \_GPE.DPT1)
 42.1027 +                    Store (0x88, \_GPE.DPT2)
 42.1028 +                    Store (0x1, \_GPE.PH18) /* eject php slot 0x18 */
 42.1029 +                }
 42.1030 +
 42.1031 +                Method (_STA, 0)
 42.1032 +                {
 42.1033 +                    Store (0x18, \_GPE.DPT1)
 42.1034 +                    Store (0x89, \_GPE.DPT2)
 42.1035 +                    Return (\_GPE.PH18) /* IN status as the _STA */
 42.1036 +                }
 42.1037 +            }
 42.1038 +
 42.1039 +            Device(S19)
 42.1040 +            {
 42.1041 +                Name (_ADR, 0x00190000) /* Dev 25, Func 0 */
 42.1042 +                Name (_SUN, 0x00000019)
 42.1043 +
 42.1044 +                Method (_PS0, 0)
 42.1045 +                {
 42.1046 +                    Store (0x19, \_GPE.DPT1)
 42.1047 +                    Store (0x80, \_GPE.DPT2)
 42.1048 +                }
 42.1049 +
 42.1050 +                Method (_PS3, 0)
 42.1051 +                {
 42.1052 +                    Store (0x19, \_GPE.DPT1)
 42.1053 +                    Store (0x83, \_GPE.DPT2)
 42.1054 +                }
 42.1055 +
 42.1056 +                Method (_EJ0, 1)
 42.1057 +                {
 42.1058 +                    Store (0x19, \_GPE.DPT1)
 42.1059 +                    Store (0x88, \_GPE.DPT2)
 42.1060 +                    Store (0x1, \_GPE.PH19) /* eject php slot 0x19 */
 42.1061 +                }
 42.1062 +
 42.1063 +                Method (_STA, 0)
 42.1064 +                {
 42.1065 +                    Store (0x19, \_GPE.DPT1)
 42.1066 +                    Store (0x89, \_GPE.DPT2)
 42.1067 +                    Return (\_GPE.PH19) /* IN status as the _STA */
 42.1068 +                }
 42.1069 +            }
 42.1070 +
 42.1071 +            Device(S1A)
 42.1072 +            {
 42.1073 +                Name (_ADR, 0x001a0000) /* Dev 26, Func 0 */
 42.1074 +                Name (_SUN, 0x0000001a)
 42.1075 +
 42.1076 +                Method (_PS0, 0)
 42.1077 +                {
 42.1078 +                    Store (0x1a, \_GPE.DPT1)
 42.1079 +                    Store (0x80, \_GPE.DPT2)
 42.1080                  }
 42.1081  
 42.1082                  Method (_PS3, 0)
 42.1083                  {
 42.1084 -                    Store (0x93, \_GPE.DPT2)
 42.1085 +                    Store (0x1a, \_GPE.DPT1)
 42.1086 +                    Store (0x83, \_GPE.DPT2)
 42.1087 +                }
 42.1088 +
 42.1089 +                Method (_EJ0, 1)
 42.1090 +                {
 42.1091 +                    Store (0x1a, \_GPE.DPT1)
 42.1092 +                    Store (0x88, \_GPE.DPT2)
 42.1093 +                    Store (0x1, \_GPE.PH1A) /* eject php slot 0x1a */
 42.1094 +                }
 42.1095 +
 42.1096 +                Method (_STA, 0)
 42.1097 +                {
 42.1098 +                    Store (0x1a, \_GPE.DPT1)
 42.1099 +                    Store (0x89, \_GPE.DPT2)
 42.1100 +                    Return (\_GPE.PH1A) /* IN status as the _STA */
 42.1101 +                }
 42.1102 +            }
 42.1103 +
 42.1104 +            Device(S1B)
 42.1105 +            {
 42.1106 +                Name (_ADR, 0x001b0000) /* Dev 27, Func 0 */
 42.1107 +                Name (_SUN, 0x0000001b)
 42.1108 +
 42.1109 +                Method (_PS0, 0)
 42.1110 +                {
 42.1111 +                    Store (0x1b, \_GPE.DPT1)
 42.1112 +                    Store (0x80, \_GPE.DPT2)
 42.1113 +                }
 42.1114 +
 42.1115 +                Method (_PS3, 0)
 42.1116 +                {
 42.1117 +                    Store (0x1b, \_GPE.DPT1)
 42.1118 +                    Store (0x83, \_GPE.DPT2)
 42.1119 +                }
 42.1120 +
 42.1121 +                Method (_EJ0, 1)
 42.1122 +                {
 42.1123 +                    Store (0x1b, \_GPE.DPT1)
 42.1124 +                    Store (0x88, \_GPE.DPT2)
 42.1125 +                    Store (0x1, \_GPE.PH1B) /* eject php slot 0x1b */
 42.1126 +                }
 42.1127 +
 42.1128 +                Method (_STA, 0)
 42.1129 +                {
 42.1130 +                    Store (0x1b, \_GPE.DPT1)
 42.1131 +                    Store (0x89, \_GPE.DPT2)
 42.1132 +                    Return (\_GPE.PH1B) /* IN status as the _STA */
 42.1133 +                }
 42.1134 +            }
 42.1135 +
 42.1136 +            Device(S1C)
 42.1137 +            {
 42.1138 +                Name (_ADR, 0x001c0000) /* Dev 28, Func 0 */
 42.1139 +                Name (_SUN, 0x0000001c)
 42.1140 +
 42.1141 +                Method (_PS0, 0)
 42.1142 +                {
 42.1143 +                    Store (0x1c, \_GPE.DPT1)
 42.1144 +                    Store (0x80, \_GPE.DPT2)
 42.1145 +                }
 42.1146 +
 42.1147 +                Method (_PS3, 0)
 42.1148 +                {
 42.1149 +                    Store (0x1c, \_GPE.DPT1)
 42.1150 +                    Store (0x83, \_GPE.DPT2)
 42.1151                  }
 42.1152  
 42.1153                  Method (_EJ0, 1)
 42.1154                  {
 42.1155 -                    Store (0x98, \_GPE.DPT2)
 42.1156 -                    Store (0x1, \_GPE.PHP2) /* eject php slot 1*/
 42.1157 +                    Store (0x1c, \_GPE.DPT1)
 42.1158 +                    Store (0x88, \_GPE.DPT2)
 42.1159 +                    Store (0x1, \_GPE.PH1C) /* eject php slot 0x1c */
 42.1160 +                }
 42.1161 +
 42.1162 +                Method (_STA, 0)
 42.1163 +                {
 42.1164 +                    Store (0x1c, \_GPE.DPT1)
 42.1165 +                    Store (0x89, \_GPE.DPT2)
 42.1166 +                    Return (\_GPE.PH1C) /* IN status as the _STA */
 42.1167 +                }
 42.1168 +            }
 42.1169 +
 42.1170 +            Device(S1D)
 42.1171 +            {
 42.1172 +                Name (_ADR, 0x001d0000) /* Dev 29, Func 0 */
 42.1173 +                Name (_SUN, 0x0000001d)
 42.1174 +
 42.1175 +                Method (_PS0, 0)
 42.1176 +                {
 42.1177 +                    Store (0x1d, \_GPE.DPT1)
 42.1178 +                    Store (0x80, \_GPE.DPT2)
 42.1179 +                }
 42.1180 +
 42.1181 +                Method (_PS3, 0)
 42.1182 +                {
 42.1183 +                    Store (0x1d, \_GPE.DPT1)
 42.1184 +                    Store (0x83, \_GPE.DPT2)
 42.1185 +                }
 42.1186 +
 42.1187 +                Method (_EJ0, 1)
 42.1188 +                {
 42.1189 +                    Store (0x1d, \_GPE.DPT1)
 42.1190 +                    Store (0x88, \_GPE.DPT2)
 42.1191 +                    Store (0x1, \_GPE.PH1D) /* eject php slot 0x1d */
 42.1192                  }
 42.1193  
 42.1194                  Method (_STA, 0)
 42.1195                  {
 42.1196 -                    Store (0x99, \_GPE.DPT2)
 42.1197 -                    Return ( \_GPE.PHP2 )   /* IN status as the _STA */
 42.1198 +                    Store (0x1d, \_GPE.DPT1)
 42.1199 +                    Store (0x89, \_GPE.DPT2)
 42.1200 +                    Return (\_GPE.PH1D) /* IN status as the _STA */
 42.1201 +                }
 42.1202 +            }
 42.1203 +
 42.1204 +            Device(S1E)
 42.1205 +            {
 42.1206 +                Name (_ADR, 0x001e0000) /* Dev 30, Func 0 */
 42.1207 +                Name (_SUN, 0x0000001e)
 42.1208 +
 42.1209 +                Method (_PS0, 0)
 42.1210 +                {
 42.1211 +                    Store (0x1e, \_GPE.DPT1)
 42.1212 +                    Store (0x80, \_GPE.DPT2)
 42.1213 +                }
 42.1214 +
 42.1215 +                Method (_PS3, 0)
 42.1216 +                {
 42.1217 +                    Store (0x1e, \_GPE.DPT1)
 42.1218 +                    Store (0x83, \_GPE.DPT2)
 42.1219 +                }
 42.1220 +
 42.1221 +                Method (_EJ0, 1)
 42.1222 +                {
 42.1223 +                    Store (0x1e, \_GPE.DPT1)
 42.1224 +                    Store (0x88, \_GPE.DPT2)
 42.1225 +                    Store (0x1, \_GPE.PH1E) /* eject php slot 0x1e */
 42.1226 +                }
 42.1227 +
 42.1228 +                Method (_STA, 0)
 42.1229 +                {
 42.1230 +                    Store (0x1e, \_GPE.DPT1)
 42.1231 +                    Store (0x89, \_GPE.DPT2)
 42.1232 +                    Return (\_GPE.PH1E) /* IN status as the _STA */
 42.1233 +                }
 42.1234 +            }
 42.1235 +
 42.1236 +            Device(S1F)
 42.1237 +            {
 42.1238 +                Name (_ADR, 0x001f0000) /* Dev 31, Func 0 */
 42.1239 +                Name (_SUN, 0x0000001f)
 42.1240 +
 42.1241 +                Method (_PS0, 0)
 42.1242 +                {
 42.1243 +                    Store (0x1f, \_GPE.DPT1)
 42.1244 +                    Store (0x80, \_GPE.DPT2)
 42.1245 +                }
 42.1246 +
 42.1247 +                Method (_PS3, 0)
 42.1248 +                {
 42.1249 +                    Store (0x1f, \_GPE.DPT1)
 42.1250 +                    Store (0x83, \_GPE.DPT2)
 42.1251 +                }
 42.1252 +
 42.1253 +                Method (_EJ0, 1)
 42.1254 +                {
 42.1255 +                    Store (0x1f, \_GPE.DPT1)
 42.1256 +                    Store (0x88, \_GPE.DPT2)
 42.1257 +                    Store (0x1, \_GPE.PH1F) /* eject php slot 0x1f */
 42.1258 +                }
 42.1259 +
 42.1260 +                Method (_STA, 0)
 42.1261 +                {
 42.1262 +                    Store (0x1f, \_GPE.DPT1)
 42.1263 +                    Store (0x89, \_GPE.DPT2)
 42.1264 +                    Return (\_GPE.PH1F) /* IN status as the _STA */
 42.1265                  }
 42.1266              }
 42.1267          }
 42.1268 @@ -850,39 +2009,191 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
 42.1269  
 42.1270      Scope (\_GPE)
 42.1271      {
 42.1272 -        OperationRegion (PHP, SystemIO, 0x10c0, 0x03)
 42.1273 +        OperationRegion (PHP, SystemIO, 0x10c0, 0x22)
 42.1274          Field (PHP, ByteAcc, NoLock, Preserve)
 42.1275          {
 42.1276 -            PSTA,   8, /* hotplug controller status reg */
 42.1277 -            PHP1,   8, /* hotplug slot 1 control reg */
 42.1278 -            PHP2,   8  /* hotplug slot 2 control reg */
 42.1279 -        }
 42.1280 +            PSTA,  8, /* hotplug controller event reg */
 42.1281 +            PSTB,  8, /* hotplug controller slot  reg */
 42.1282 +            PH00,  8, /* hotplug slot 0x00 control reg */
 42.1283 +            PH01,  8, /* hotplug slot 0x01 control reg */
 42.1284 +            PH02,  8, /* hotplug slot 0x02 control reg */
 42.1285 +            PH03,  8, /* hotplug slot 0x03 control reg */
 42.1286 +            PH04,  8, /* hotplug slot 0x04 control reg */
 42.1287 +            PH05,  8, /* hotplug slot 0x05 control reg */
 42.1288 +            PH06,  8, /* hotplug slot 0x06 control reg */
 42.1289 +            PH07,  8, /* hotplug slot 0x07 control reg */
 42.1290 +            PH08,  8, /* hotplug slot 0x08 control reg */
 42.1291 +            PH09,  8, /* hotplug slot 0x09 control reg */
 42.1292 +            PH0A,  8, /* hotplug slot 0x0a control reg */
 42.1293 +            PH0B,  8, /* hotplug slot 0x0b control reg */
 42.1294 +            PH0C,  8, /* hotplug slot 0x0c control reg */
 42.1295 +            PH0D,  8, /* hotplug slot 0x0d control reg */
 42.1296 +            PH0E,  8, /* hotplug slot 0x0e control reg */
 42.1297 +            PH0F,  8, /* hotplug slot 0x0f control reg */
 42.1298 +            PH10,  8, /* hotplug slot 0x10 control reg */
 42.1299 +            PH11,  8, /* hotplug slot 0x11 control reg */
 42.1300 +            PH12,  8, /* hotplug slot 0x12 control reg */
 42.1301 +            PH13,  8, /* hotplug slot 0x13 control reg */
 42.1302 +            PH14,  8, /* hotplug slot 0x14 control reg */
 42.1303 +            PH15,  8, /* hotplug slot 0x15 control reg */
 42.1304 +            PH16,  8, /* hotplug slot 0x16 control reg */
 42.1305 +            PH17,  8, /* hotplug slot 0x17 control reg */
 42.1306 +            PH18,  8, /* hotplug slot 0x18 control reg */
 42.1307 +            PH19,  8, /* hotplug slot 0x19 control reg */
 42.1308 +            PH1A,  8, /* hotplug slot 0x1a control reg */
 42.1309 +            PH1B,  8, /* hotplug slot 0x1b control reg */
 42.1310 +            PH1C,  8, /* hotplug slot 0x1c control reg */
 42.1311 +            PH1D,  8, /* hotplug slot 0x1d control reg */
 42.1312 +            PH1E,  8, /* hotplug slot 0x1e control reg */
 42.1313 +            PH1F,  8  /* hotplug slot 0x1f control reg */
 42.1314 +       }
 42.1315          OperationRegion (DG1, SystemIO, 0xb044, 0x04)
 42.1316          Field (DG1, ByteAcc, NoLock, Preserve)
 42.1317          {
 42.1318              DPT1,   8,
 42.1319              DPT2,   8
 42.1320          }
 42.1321 -        Method (_L03, 0, NotSerialized)
 42.1322 +        Method (_L03, 0, Serialized)
 42.1323          {
 42.1324              /* detect slot and event(remove/add) */
 42.1325              Name (SLT, 0x0)
 42.1326              Name (EVT, 0x0)
 42.1327              Store (PSTA, Local1)
 42.1328 -            ShiftRight (Local1, 0x4, SLT)
 42.1329              And (Local1, 0xf, EVT)
 42.1330 +            Store (PSTB, Local1)           /* XXX: Store (PSTB, SLT) ? */
 42.1331 +            And (Local1, 0xff, SLT)
 42.1332  
 42.1333              /* debug */
 42.1334              Store (SLT, DPT1)
 42.1335              Store (EVT, DPT2)
 42.1336  
 42.1337 -            If ( LEqual(SLT, 0x1) )
 42.1338 +            If ( LEqual(SLT, 0x00) )
 42.1339 +            {
 42.1340 +                Notify (\_SB.PCI0.S00, EVT)
 42.1341 +            }
 42.1342 +            ElseIf ( LEqual(SLT, 0x01) )
 42.1343 +            {
 42.1344 +                Notify (\_SB.PCI0.S01, EVT)
 42.1345 +            }
 42.1346 +            ElseIf ( LEqual(SLT, 0x02) )
 42.1347 +            {
 42.1348 +                Notify (\_SB.PCI0.S02, EVT)
 42.1349 +            }
 42.1350 +            ElseIf ( LEqual(SLT, 0x03) )
 42.1351 +            {
 42.1352 +                Notify (\_SB.PCI0.S03, EVT)
 42.1353 +            }
 42.1354 +            ElseIf ( LEqual(SLT, 0x04) )
 42.1355 +            {
 42.1356 +                Notify (\_SB.PCI0.S04, EVT)
 42.1357 +            }
 42.1358 +            ElseIf ( LEqual(SLT, 0x05) )
 42.1359 +            {
 42.1360 +                Notify (\_SB.PCI0.S05, EVT)
 42.1361 +            }
 42.1362 +            ElseIf ( LEqual(SLT, 0x06) )
 42.1363 +            {
 42.1364 +                Notify (\_SB.PCI0.S06, EVT)
 42.1365 +            }
 42.1366 +            ElseIf ( LEqual(SLT, 0x07) )
 42.1367              {
 42.1368 -                Notify (\_SB.PCI0.S1F0, EVT)
 42.1369 +                Notify (\_SB.PCI0.S07, EVT)
 42.1370 +            }
 42.1371 +            ElseIf ( LEqual(SLT, 0x08) )
 42.1372 +            {
 42.1373 +                Notify (\_SB.PCI0.S08, EVT)
 42.1374 +            }
 42.1375 +            ElseIf ( LEqual(SLT, 0x09) )
 42.1376 +            {
 42.1377 +                Notify (\_SB.PCI0.S09, EVT)
 42.1378 +            }
 42.1379 +            ElseIf ( LEqual(SLT, 0x0a) )
 42.1380 +            {
 42.1381 +                Notify (\_SB.PCI0.S0A, EVT)
 42.1382 +            }
 42.1383 +            ElseIf ( LEqual(SLT, 0x0b) )
 42.1384 +            {
 42.1385 +                Notify (\_SB.PCI0.S0B, EVT)
 42.1386 +            }
 42.1387 +            ElseIf ( LEqual(SLT, 0x0c) )
 42.1388 +            {
 42.1389 +                Notify (\_SB.PCI0.S0C, EVT)
 42.1390 +            }
 42.1391 +            ElseIf ( LEqual(SLT, 0x0d) )
 42.1392 +            {
 42.1393 +                Notify (\_SB.PCI0.S0D, EVT)
 42.1394 +            }
 42.1395 +            ElseIf ( LEqual(SLT, 0x0e) )
 42.1396 +            {
 42.1397 +                Notify (\_SB.PCI0.S0E, EVT)
 42.1398 +            }
 42.1399 +            ElseIf ( LEqual(SLT, 0x0f) )
 42.1400 +            {
 42.1401 +                Notify (\_SB.PCI0.S0F, EVT)
 42.1402              }
 42.1403 -            ElseIf ( LEqual(SLT, 0x2) )
 42.1404 +            ElseIf ( LEqual(SLT, 0x10) )
 42.1405 +            {
 42.1406 +                Notify (\_SB.PCI0.S10, EVT)
 42.1407 +            }
 42.1408 +            ElseIf ( LEqual(SLT, 0x11) )
 42.1409 +            {
 42.1410 +                Notify (\_SB.PCI0.S11, EVT)
 42.1411 +            }
 42.1412 +            ElseIf ( LEqual(SLT, 0x12) )
 42.1413 +            {
 42.1414 +                Notify (\_SB.PCI0.S12, EVT)
 42.1415 +            }
 42.1416 +            ElseIf ( LEqual(SLT, 0x13) )
 42.1417 +            {
 42.1418 +                Notify (\_SB.PCI0.S13, EVT)
 42.1419 +            }
 42.1420 +            ElseIf ( LEqual(SLT, 0x14) )
 42.1421 +            {
 42.1422 +                Notify (\_SB.PCI0.S14, EVT)
 42.1423 +            }
 42.1424 +            ElseIf ( LEqual(SLT, 0x15) )
 42.1425 +            {
 42.1426 +                Notify (\_SB.PCI0.S15, EVT)
 42.1427 +            }
 42.1428 +            ElseIf ( LEqual(SLT, 0x16) )
 42.1429 +            {
 42.1430 +                Notify (\_SB.PCI0.S16, EVT)
 42.1431 +            }
 42.1432 +            ElseIf ( LEqual(SLT, 0x17) )
 42.1433              {
 42.1434 -                Notify (\_SB.PCI0.S2F0, EVT)
 42.1435 +                Notify (\_SB.PCI0.S17, EVT)
 42.1436 +            }
 42.1437 +            ElseIf ( LEqual(SLT, 0x18) )
 42.1438 +            {
 42.1439 +                Notify (\_SB.PCI0.S18, EVT)
 42.1440 +            }
 42.1441 +            ElseIf ( LEqual(SLT, 0x19) )
 42.1442 +            {
 42.1443 +                Notify (\_SB.PCI0.S19, EVT)
 42.1444 +            }
 42.1445 +            ElseIf ( LEqual(SLT, 0x1a) )
 42.1446 +            {
 42.1447 +                Notify (\_SB.PCI0.S1A, EVT)
 42.1448 +            }
 42.1449 +            ElseIf ( LEqual(SLT, 0x1b) )
 42.1450 +            {
 42.1451 +                Notify (\_SB.PCI0.S1B, EVT)
 42.1452 +            }
 42.1453 +            ElseIf ( LEqual(SLT, 0x1c) )
 42.1454 +            {
 42.1455 +                Notify (\_SB.PCI0.S1C, EVT)
 42.1456 +            }
 42.1457 +            ElseIf ( LEqual(SLT, 0x1d) )
 42.1458 +            {
 42.1459 +                Notify (\_SB.PCI0.S1D, EVT)
 42.1460 +            }
 42.1461 +            ElseIf ( LEqual(SLT, 0x1e) )
 42.1462 +            {
 42.1463 +                Notify (\_SB.PCI0.S1E, EVT)
 42.1464 +            }
 42.1465 +            ElseIf ( LEqual(SLT, 0x1f) )
 42.1466 +            {
 42.1467 +                Notify (\_SB.PCI0.S1F, EVT)
 42.1468              }
 42.1469          }
 42.1470      }
    43.1 --- a/tools/firmware/hvmloader/acpi/dsdt.c	Mon Mar 30 19:56:30 2009 -0700
    43.2 +++ b/tools/firmware/hvmloader/acpi/dsdt.c	Thu Apr 23 18:49:41 2009 -0700
    43.3 @@ -5,15 +5,15 @@
    43.4   * Copyright (C) 2000 - 2008 Intel Corporation
    43.5   * Supports ACPI Specification Revision 3.0a
    43.6   * 
    43.7 - * Compilation of "dsdt.asl" - Fri Jan 23 14:30:29 2009
    43.8 + * Compilation of "dsdt.asl" - Tue Mar 31 13:24:51 2009
    43.9   * 
   43.10   * C source code output
   43.11   *
   43.12   */
   43.13  unsigned char AmlCode[] =
   43.14  {
   43.15 -    0x44,0x53,0x44,0x54,0x5E,0x11,0x00,0x00,  /* 00000000    "DSDT^..." */
   43.16 -    0x02,0xEB,0x58,0x65,0x6E,0x00,0x00,0x00,  /* 00000008    "..Xen..." */
   43.17 +    0x44,0x53,0x44,0x54,0xF3,0x31,0x00,0x00,  /* 00000000    "DSDT.1.." */
   43.18 +    0x02,0x12,0x58,0x65,0x6E,0x00,0x00,0x00,  /* 00000008    "..Xen..." */
   43.19      0x48,0x56,0x4D,0x00,0x00,0x00,0x00,0x00,  /* 00000010    "HVM....." */
   43.20      0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
   43.21      0x04,0x12,0x08,0x20,0x08,0x50,0x4D,0x42,  /* 00000020    "... .PMB" */
   43.22 @@ -56,517 +56,1560 @@ unsigned char AmlCode[] =
   43.23      0x07,0x0A,0x07,0x00,0x00,0x08,0x50,0x49,  /* 00000148    "......PI" */
   43.24      0x43,0x44,0x00,0x14,0x0C,0x5F,0x50,0x49,  /* 00000150    "CD..._PI" */
   43.25      0x43,0x01,0x70,0x68,0x50,0x49,0x43,0x44,  /* 00000158    "C.phPICD" */
   43.26 -    0x10,0x4E,0xF3,0x5F,0x53,0x42,0x5F,0x5B,  /* 00000160    ".N._SB_[" */
   43.27 -    0x80,0x42,0x49,0x4F,0x53,0x00,0x0C,0x00,  /* 00000168    ".BIOS..." */
   43.28 -    0xA0,0x0E,0x00,0x0A,0x10,0x5B,0x81,0x21,  /* 00000170    ".....[.!" */
   43.29 -    0x42,0x49,0x4F,0x53,0x01,0x55,0x41,0x52,  /* 00000178    "BIOS.UAR" */
   43.30 -    0x31,0x01,0x55,0x41,0x52,0x32,0x01,0x48,  /* 00000180    "1.UAR2.H" */
   43.31 -    0x50,0x45,0x54,0x01,0x00,0x1D,0x50,0x4D,  /* 00000188    "PET...PM" */
   43.32 -    0x49,0x4E,0x20,0x50,0x4C,0x45,0x4E,0x20,  /* 00000190    "IN PLEN " */
   43.33 -    0x5B,0x82,0x49,0x04,0x4D,0x45,0x4D,0x30,  /* 00000198    "[.I.MEM0" */
   43.34 -    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 000001A0    "._HID.A." */
   43.35 -    0x0C,0x02,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 000001A8    "..._CRS." */
   43.36 -    0x33,0x0A,0x30,0x8A,0x2B,0x00,0x00,0x0D,  /* 000001B0    "3.0.+..." */
   43.37 -    0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B8    "........" */
   43.38 +    0x10,0x83,0xB7,0x02,0x5F,0x53,0x42,0x5F,  /* 00000160    "...._SB_" */
   43.39 +    0x5B,0x80,0x42,0x49,0x4F,0x53,0x00,0x0C,  /* 00000168    "[.BIOS.." */
   43.40 +    0x00,0xA0,0x0E,0x00,0x0A,0x10,0x5B,0x81,  /* 00000170    "......[." */
   43.41 +    0x21,0x42,0x49,0x4F,0x53,0x01,0x55,0x41,  /* 00000178    "!BIOS.UA" */
   43.42 +    0x52,0x31,0x01,0x55,0x41,0x52,0x32,0x01,  /* 00000180    "R1.UAR2." */
   43.43 +    0x48,0x50,0x45,0x54,0x01,0x00,0x1D,0x50,  /* 00000188    "HPET...P" */
   43.44 +    0x4D,0x49,0x4E,0x20,0x50,0x4C,0x45,0x4E,  /* 00000190    "MIN PLEN" */
   43.45 +    0x20,0x5B,0x82,0x49,0x04,0x4D,0x45,0x4D,  /* 00000198    " [.I.MEM" */
   43.46 +    0x30,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 000001A0    "0._HID.A" */
   43.47 +    0xD0,0x0C,0x02,0x08,0x5F,0x43,0x52,0x53,  /* 000001A8    "...._CRS" */
   43.48 +    0x11,0x33,0x0A,0x30,0x8A,0x2B,0x00,0x00,  /* 000001B0    ".3.0.+.." */
   43.49 +    0x0D,0x03,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B8    "........" */
   43.50      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001C0    "........" */
   43.51 -    0x00,0xFF,0xFF,0x09,0x00,0x00,0x00,0x00,  /* 000001C8    "........" */
   43.52 +    0x00,0x00,0xFF,0xFF,0x09,0x00,0x00,0x00,  /* 000001C8    "........" */
   43.53      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001D0    "........" */
   43.54 -    0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x00,  /* 000001D8    "........" */
   43.55 -    0x00,0x79,0x00,0x5B,0x82,0x4A,0xEB,0x50,  /* 000001E0    ".y.[.J.P" */
   43.56 -    0x43,0x49,0x30,0x08,0x5F,0x48,0x49,0x44,  /* 000001E8    "CI0._HID" */
   43.57 -    0x0C,0x41,0xD0,0x0A,0x03,0x08,0x5F,0x55,  /* 000001F0    ".A...._U" */
   43.58 -    0x49,0x44,0x00,0x08,0x5F,0x41,0x44,0x52,  /* 000001F8    "ID.._ADR" */
   43.59 -    0x00,0x08,0x5F,0x42,0x42,0x4E,0x00,0x5B,  /* 00000200    ".._BBN.[" */
   43.60 -    0x82,0x2A,0x48,0x50,0x30,0x5F,0x08,0x5F,  /* 00000208    ".*HP0_._" */
   43.61 -    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x02,  /* 00000210    "HID.A..." */
   43.62 -    0x08,0x5F,0x43,0x52,0x53,0x11,0x15,0x0A,  /* 00000218    "._CRS..." */
   43.63 -    0x12,0x47,0x01,0xC0,0x10,0xC0,0x10,0x00,  /* 00000220    ".G......" */
   43.64 -    0x03,0x47,0x01,0x44,0xB0,0x44,0xB0,0x00,  /* 00000228    ".G.D.D.." */
   43.65 -    0x04,0x79,0x00,0x14,0x4E,0x0C,0x5F,0x43,  /* 00000230    ".y..N._C" */
   43.66 -    0x52,0x53,0x00,0x08,0x50,0x52,0x54,0x30,  /* 00000238    "RS..PRT0" */
   43.67 -    0x11,0x42,0x07,0x0A,0x6E,0x88,0x0D,0x00,  /* 00000240    ".B..n..." */
   43.68 -    0x02,0x0E,0x00,0x00,0x00,0x00,0x00,0xFF,  /* 00000248    "........" */
   43.69 -    0x00,0x00,0x00,0x00,0x01,0x47,0x01,0xF8,  /* 00000250    ".....G.." */
   43.70 -    0x0C,0xF8,0x0C,0x01,0x08,0x88,0x0D,0x00,  /* 00000258    "........" */
   43.71 -    0x01,0x0C,0x03,0x00,0x00,0x00,0x00,0xF7,  /* 00000260    "........" */
   43.72 -    0x0C,0x00,0x00,0xF8,0x0C,0x88,0x0D,0x00,  /* 00000268    "........" */
   43.73 -    0x01,0x0C,0x03,0x00,0x00,0x00,0x0D,0xFF,  /* 00000270    "........" */
   43.74 -    0xFF,0x00,0x00,0x00,0xF3,0x87,0x17,0x00,  /* 00000278    "........" */
   43.75 -    0x00,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,  /* 00000280    "........" */
   43.76 -    0x00,0x0A,0x00,0xFF,0xFF,0x0B,0x00,0x00,  /* 00000288    "........" */
   43.77 -    0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x87,  /* 00000290    "........" */
   43.78 -    0x17,0x00,0x00,0x0C,0x03,0x00,0x00,0x00,  /* 00000298    "........" */
   43.79 -    0x00,0x00,0x00,0x00,0xF0,0xFF,0xFF,0xFF,  /* 000002A0    "........" */
   43.80 -    0xF4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000002A8    "........" */
   43.81 -    0x05,0x79,0x00,0x8A,0x50,0x52,0x54,0x30,  /* 000002B0    ".y..PRT0" */
   43.82 -    0x0A,0x5C,0x4D,0x4D,0x49,0x4E,0x8A,0x50,  /* 000002B8    ".\MMIN.P" */
   43.83 -    0x52,0x54,0x30,0x0A,0x60,0x4D,0x4D,0x41,  /* 000002C0    "RT0.`MMA" */
   43.84 -    0x58,0x8A,0x50,0x52,0x54,0x30,0x0A,0x68,  /* 000002C8    "X.PRT0.h" */
   43.85 -    0x4D,0x4C,0x45,0x4E,0x70,0x50,0x4D,0x49,  /* 000002D0    "MLENpPMI" */
   43.86 -    0x4E,0x4D,0x4D,0x49,0x4E,0x70,0x50,0x4C,  /* 000002D8    "NMMINpPL" */
   43.87 -    0x45,0x4E,0x4D,0x4C,0x45,0x4E,0x72,0x4D,  /* 000002E0    "ENMLENrM" */
   43.88 -    0x4D,0x49,0x4E,0x4D,0x4C,0x45,0x4E,0x4D,  /* 000002E8    "MINMLENM" */
   43.89 -    0x4D,0x41,0x58,0x74,0x4D,0x4D,0x41,0x58,  /* 000002F0    "MAXtMMAX" */
   43.90 -    0x01,0x4D,0x4D,0x41,0x58,0xA4,0x50,0x52,  /* 000002F8    ".MMAX.PR" */
   43.91 -    0x54,0x30,0x08,0x42,0x55,0x46,0x41,0x11,  /* 00000300    "T0.BUFA." */
   43.92 -    0x09,0x0A,0x06,0x23,0x20,0x0C,0x18,0x79,  /* 00000308    "...# ..y" */
   43.93 -    0x00,0x08,0x42,0x55,0x46,0x42,0x11,0x09,  /* 00000310    "..BUFB.." */
   43.94 -    0x0A,0x06,0x23,0x00,0x00,0x18,0x79,0x00,  /* 00000318    "..#...y." */
   43.95 -    0x8B,0x42,0x55,0x46,0x42,0x01,0x49,0x52,  /* 00000320    ".BUFB.IR" */
   43.96 -    0x51,0x56,0x5B,0x82,0x48,0x08,0x4C,0x4E,  /* 00000328    "QV[.H.LN" */
   43.97 -    0x4B,0x41,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000330    "KA._HID." */
   43.98 -    0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49,  /* 00000338    "A...._UI" */
   43.99 -    0x44,0x01,0x14,0x1C,0x5F,0x53,0x54,0x41,  /* 00000340    "D..._STA" */
  43.100 -    0x00,0x7B,0x50,0x49,0x52,0x41,0x0A,0x80,  /* 00000348    ".{PIRA.." */
  43.101 -    0x60,0xA0,0x08,0x93,0x60,0x0A,0x80,0xA4,  /* 00000350    "`...`..." */
  43.102 -    0x0A,0x09,0xA1,0x04,0xA4,0x0A,0x0B,0x14,  /* 00000358    "........" */
  43.103 -    0x0B,0x5F,0x50,0x52,0x53,0x00,0xA4,0x42,  /* 00000360    "._PRS..B" */
  43.104 -    0x55,0x46,0x41,0x14,0x11,0x5F,0x44,0x49,  /* 00000368    "UFA.._DI" */
  43.105 -    0x53,0x00,0x7D,0x50,0x49,0x52,0x41,0x0A,  /* 00000370    "S.}PIRA." */
  43.106 -    0x80,0x50,0x49,0x52,0x41,0x14,0x1A,0x5F,  /* 00000378    ".PIRA.._" */
  43.107 -    0x43,0x52,0x53,0x00,0x7B,0x50,0x49,0x52,  /* 00000380    "CRS.{PIR" */
  43.108 -    0x41,0x0A,0x0F,0x60,0x79,0x01,0x60,0x49,  /* 00000388    "A..`y.`I" */
  43.109 -    0x52,0x51,0x56,0xA4,0x42,0x55,0x46,0x42,  /* 00000390    "RQV.BUFB" */
  43.110 -    0x14,0x1B,0x5F,0x53,0x52,0x53,0x01,0x8B,  /* 00000398    ".._SRS.." */
  43.111 -    0x68,0x01,0x49,0x52,0x51,0x31,0x82,0x49,  /* 000003A0    "h.IRQ1.I" */
  43.112 -    0x52,0x51,0x31,0x60,0x76,0x60,0x70,0x60,  /* 000003A8    "RQ1`v`p`" */
  43.113 -    0x50,0x49,0x52,0x41,0x5B,0x82,0x49,0x08,  /* 000003B0    "PIRA[.I." */
  43.114 -    0x4C,0x4E,0x4B,0x42,0x08,0x5F,0x48,0x49,  /* 000003B8    "LNKB._HI" */
  43.115 -    0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,  /* 000003C0    "D.A...._" */
  43.116 -    0x55,0x49,0x44,0x0A,0x02,0x14,0x1C,0x5F,  /* 000003C8    "UID...._" */
  43.117 -    0x53,0x54,0x41,0x00,0x7B,0x50,0x49,0x52,  /* 000003D0    "STA.{PIR" */
  43.118 -    0x42,0x0A,0x80,0x60,0xA0,0x08,0x93,0x60,  /* 000003D8    "B..`...`" */
  43.119 -    0x0A,0x80,0xA4,0x0A,0x09,0xA1,0x04,0xA4,  /* 000003E0    "........" */
  43.120 -    0x0A,0x0B,0x14,0x0B,0x5F,0x50,0x52,0x53,  /* 000003E8    "...._PRS" */
  43.121 -    0x00,0xA4,0x42,0x55,0x46,0x41,0x14,0x11,  /* 000003F0    "..BUFA.." */
  43.122 -    0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,0x49,  /* 000003F8    "_DIS.}PI" */
  43.123 -    0x52,0x42,0x0A,0x80,0x50,0x49,0x52,0x42,  /* 00000400    "RB..PIRB" */
  43.124 -    0x14,0x1A,0x5F,0x43,0x52,0x53,0x00,0x7B,  /* 00000408    ".._CRS.{" */
  43.125 -    0x50,0x49,0x52,0x42,0x0A,0x0F,0x60,0x79,  /* 00000410    "PIRB..`y" */
  43.126 -    0x01,0x60,0x49,0x52,0x51,0x56,0xA4,0x42,  /* 00000418    ".`IRQV.B" */
  43.127 -    0x55,0x46,0x42,0x14,0x1B,0x5F,0x53,0x52,  /* 00000420    "UFB.._SR" */
  43.128 -    0x53,0x01,0x8B,0x68,0x01,0x49,0x52,0x51,  /* 00000428    "S..h.IRQ" */
  43.129 -    0x31,0x82,0x49,0x52,0x51,0x31,0x60,0x76,  /* 00000430    "1.IRQ1`v" */
  43.130 -    0x60,0x70,0x60,0x50,0x49,0x52,0x42,0x5B,  /* 00000438    "`p`PIRB[" */
  43.131 -    0x82,0x49,0x08,0x4C,0x4E,0x4B,0x43,0x08,  /* 00000440    ".I.LNKC." */
  43.132 -    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,  /* 00000448    "_HID.A.." */
  43.133 -    0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,0x03,  /* 00000450    ".._UID.." */
  43.134 -    0x14,0x1C,0x5F,0x53,0x54,0x41,0x00,0x7B,  /* 00000458    ".._STA.{" */
  43.135 -    0x50,0x49,0x52,0x43,0x0A,0x80,0x60,0xA0,  /* 00000460    "PIRC..`." */
  43.136 -    0x08,0x93,0x60,0x0A,0x80,0xA4,0x0A,0x09,  /* 00000468    "..`....." */
  43.137 -    0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x0B,0x5F,  /* 00000470    "......._" */
  43.138 -    0x50,0x52,0x53,0x00,0xA4,0x42,0x55,0x46,  /* 00000478    "PRS..BUF" */
  43.139 -    0x41,0x14,0x11,0x5F,0x44,0x49,0x53,0x00,  /* 00000480    "A.._DIS." */
  43.140 -    0x7D,0x50,0x49,0x52,0x43,0x0A,0x80,0x50,  /* 00000488    "}PIRC..P" */
  43.141 -    0x49,0x52,0x43,0x14,0x1A,0x5F,0x43,0x52,  /* 00000490    "IRC.._CR" */
  43.142 -    0x53,0x00,0x7B,0x50,0x49,0x52,0x43,0x0A,  /* 00000498    "S.{PIRC." */
  43.143 -    0x0F,0x60,0x79,0x01,0x60,0x49,0x52,0x51,  /* 000004A0    ".`y.`IRQ" */
  43.144 -    0x56,0xA4,0x42,0x55,0x46,0x42,0x14,0x1B,  /* 000004A8    "V.BUFB.." */
  43.145 -    0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,0x01,  /* 000004B0    "_SRS..h." */
  43.146 -    0x49,0x52,0x51,0x31,0x82,0x49,0x52,0x51,  /* 000004B8    "IRQ1.IRQ" */
  43.147 -    0x31,0x60,0x76,0x60,0x70,0x60,0x50,0x49,  /* 000004C0    "1`v`p`PI" */
  43.148 -    0x52,0x43,0x5B,0x82,0x49,0x08,0x4C,0x4E,  /* 000004C8    "RC[.I.LN" */
  43.149 -    0x4B,0x44,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 000004D0    "KD._HID." */
  43.150 -    0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49,  /* 000004D8    "A...._UI" */
  43.151 -    0x44,0x0A,0x04,0x14,0x1C,0x5F,0x53,0x54,  /* 000004E0    "D...._ST" */
  43.152 -    0x41,0x00,0x7B,0x50,0x49,0x52,0x44,0x0A,  /* 000004E8    "A.{PIRD." */
  43.153 -    0x80,0x60,0xA0,0x08,0x93,0x60,0x0A,0x80,  /* 000004F0    ".`...`.." */
  43.154 -    0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,0x0B,  /* 000004F8    "........" */
  43.155 -    0x14,0x0B,0x5F,0x50,0x52,0x53,0x00,0xA4,  /* 00000500    ".._PRS.." */
  43.156 -    0x42,0x55,0x46,0x41,0x14,0x11,0x5F,0x44,  /* 00000508    "BUFA.._D" */
  43.157 -    0x49,0x53,0x00,0x7D,0x50,0x49,0x52,0x44,  /* 00000510    "IS.}PIRD" */
  43.158 -    0x0A,0x80,0x50,0x49,0x52,0x44,0x14,0x1A,  /* 00000518    "..PIRD.." */
  43.159 -    0x5F,0x43,0x52,0x53,0x00,0x7B,0x50,0x49,  /* 00000520    "_CRS.{PI" */
  43.160 -    0x52,0x44,0x0A,0x0F,0x60,0x79,0x01,0x60,  /* 00000528    "RD..`y.`" */
  43.161 -    0x49,0x52,0x51,0x56,0xA4,0x42,0x55,0x46,  /* 00000530    "IRQV.BUF" */
  43.162 -    0x42,0x14,0x1B,0x5F,0x53,0x52,0x53,0x01,  /* 00000538    "B.._SRS." */
  43.163 -    0x8B,0x68,0x01,0x49,0x52,0x51,0x31,0x82,  /* 00000540    ".h.IRQ1." */
  43.164 -    0x49,0x52,0x51,0x31,0x60,0x76,0x60,0x70,  /* 00000548    "IRQ1`v`p" */
  43.165 -    0x60,0x50,0x49,0x52,0x44,0x5B,0x82,0x44,  /* 00000550    "`PIRD[.D" */
  43.166 -    0x05,0x48,0x50,0x45,0x54,0x08,0x5F,0x48,  /* 00000558    ".HPET._H" */
  43.167 -    0x49,0x44,0x0C,0x41,0xD0,0x01,0x03,0x08,  /* 00000560    "ID.A...." */
  43.168 -    0x5F,0x55,0x49,0x44,0x00,0x14,0x18,0x5F,  /* 00000568    "_UID..._" */
  43.169 -    0x53,0x54,0x41,0x00,0xA0,0x0C,0x93,0x5E,  /* 00000570    "STA....^" */
  43.170 -    0x5E,0x5E,0x48,0x50,0x45,0x54,0x00,0xA4,  /* 00000578    "^^HPET.." */
  43.171 -    0x00,0xA1,0x04,0xA4,0x0A,0x0F,0x08,0x5F,  /* 00000580    "......._" */
  43.172 -    0x43,0x52,0x53,0x11,0x1F,0x0A,0x1C,0x87,  /* 00000588    "CRS....." */
  43.173 -    0x17,0x00,0x00,0x0D,0x01,0x00,0x00,0x00,  /* 00000590    "........" */
  43.174 -    0x00,0x00,0x00,0xD0,0xFE,0xFF,0x03,0xD0,  /* 00000598    "........" */
  43.175 -    0xFE,0x00,0x00,0x00,0x00,0x00,0x04,0x00,  /* 000005A0    "........" */
  43.176 -    0x00,0x79,0x00,0x14,0x16,0x5F,0x50,0x52,  /* 000005A8    ".y..._PR" */
  43.177 -    0x54,0x00,0xA0,0x0A,0x50,0x49,0x43,0x44,  /* 000005B0    "T...PICD" */
  43.178 -    0xA4,0x50,0x52,0x54,0x41,0xA4,0x50,0x52,  /* 000005B8    ".PRTA.PR" */
  43.179 -    0x54,0x50,0x08,0x50,0x52,0x54,0x50,0x12,  /* 000005C0    "TP.PRTP." */
  43.180 -    0x49,0x36,0x3C,0x12,0x0D,0x04,0x0C,0xFF,  /* 000005C8    "I6<....." */
  43.181 -    0xFF,0x01,0x00,0x00,0x4C,0x4E,0x4B,0x42,  /* 000005D0    "....LNKB" */
  43.182 -    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x01,  /* 000005D8    "........" */
  43.183 -    0x00,0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 000005E0    "..LNKC.." */
  43.184 -    0x0E,0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,  /* 000005E8    "........" */
  43.185 -    0x02,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,  /* 000005F0    ".LNKD..." */
  43.186 -    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x03,  /* 000005F8    "........" */
  43.187 -    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 00000600    "LNKA...." */
  43.188 -    0x0C,0xFF,0xFF,0x02,0x00,0x00,0x4C,0x4E,  /* 00000608    "......LN" */
  43.189 -    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000610    "KC......" */
  43.190 -    0xFF,0x02,0x00,0x01,0x4C,0x4E,0x4B,0x44,  /* 00000618    "....LNKD" */
  43.191 -    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x02,  /* 00000620    "........" */
  43.192 -    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,  /* 00000628    "...LNKA." */
  43.193 -    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 00000630    "........" */
  43.194 -    0x0A,0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000638    "..LNKB.." */
  43.195 -    0x0D,0x04,0x0C,0xFF,0xFF,0x03,0x00,0x00,  /* 00000640    "........" */
  43.196 -    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000648    "LNKD...." */
  43.197 -    0x0C,0xFF,0xFF,0x03,0x00,0x01,0x4C,0x4E,  /* 00000650    "......LN" */
  43.198 -    0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000658    "KA......" */
  43.199 -    0xFF,0x03,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000660    ".....LNK" */
  43.200 -    0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000668    "B......." */
  43.201 -    0x03,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,  /* 00000670    "....LNKC" */
  43.202 -    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x04,  /* 00000678    "........" */
  43.203 -    0x00,0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000680    "..LNKA.." */
  43.204 -    0x0D,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x01,  /* 00000688    "........" */
  43.205 -    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,  /* 00000690    "LNKB...." */
  43.206 -    0x0C,0xFF,0xFF,0x04,0x00,0x0A,0x02,0x4C,  /* 00000698    ".......L" */
  43.207 -    0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,  /* 000006A0    "NKC....." */
  43.208 -    0xFF,0xFF,0x04,0x00,0x0A,0x03,0x4C,0x4E,  /* 000006A8    "......LN" */
  43.209 -    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000006B0    "KD......" */
  43.210 -    0xFF,0x05,0x00,0x00,0x4C,0x4E,0x4B,0x42,  /* 000006B8    "....LNKB" */
  43.211 -    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x05,  /* 000006C0    "........" */
  43.212 -    0x00,0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 000006C8    "..LNKC.." */
  43.213 -    0x0E,0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,  /* 000006D0    "........" */
  43.214 -    0x02,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,  /* 000006D8    ".LNKD..." */
  43.215 -    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x03,  /* 000006E0    "........" */
  43.216 -    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 000006E8    "LNKA...." */
  43.217 -    0x0C,0xFF,0xFF,0x06,0x00,0x00,0x4C,0x4E,  /* 000006F0    "......LN" */
  43.218 -    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000006F8    "KC......" */
  43.219 -    0xFF,0x06,0x00,0x01,0x4C,0x4E,0x4B,0x44,  /* 00000700    "....LNKD" */
  43.220 -    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x06,  /* 00000708    "........" */
  43.221 -    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,  /* 00000710    "...LNKA." */
  43.222 -    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 00000718    "........" */
  43.223 -    0x0A,0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000720    "..LNKB.." */
  43.224 -    0x0D,0x04,0x0C,0xFF,0xFF,0x07,0x00,0x00,  /* 00000728    "........" */
  43.225 -    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000730    "LNKD...." */
  43.226 -    0x0C,0xFF,0xFF,0x07,0x00,0x01,0x4C,0x4E,  /* 00000738    "......LN" */
  43.227 -    0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000740    "KA......" */
  43.228 -    0xFF,0x07,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000748    ".....LNK" */
  43.229 -    0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000750    "B......." */
  43.230 -    0x07,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,  /* 00000758    "....LNKC" */
  43.231 -    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x08,  /* 00000760    "........" */
  43.232 -    0x00,0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000768    "..LNKA.." */
  43.233 -    0x0D,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x01,  /* 00000770    "........" */
  43.234 -    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,  /* 00000778    "LNKB...." */
  43.235 -    0x0C,0xFF,0xFF,0x08,0x00,0x0A,0x02,0x4C,  /* 00000780    ".......L" */
  43.236 -    0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,  /* 00000788    "NKC....." */
  43.237 -    0xFF,0xFF,0x08,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000790    "......LN" */
  43.238 -    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000798    "KD......" */
  43.239 -    0xFF,0x09,0x00,0x00,0x4C,0x4E,0x4B,0x42,  /* 000007A0    "....LNKB" */
  43.240 -    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x09,  /* 000007A8    "........" */
  43.241 -    0x00,0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 000007B0    "..LNKC.." */
  43.242 -    0x0E,0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,  /* 000007B8    "........" */
  43.243 -    0x02,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,  /* 000007C0    ".LNKD..." */
  43.244 -    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x03,  /* 000007C8    "........" */
  43.245 -    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 000007D0    "LNKA...." */
  43.246 -    0x0C,0xFF,0xFF,0x0A,0x00,0x00,0x4C,0x4E,  /* 000007D8    "......LN" */
  43.247 -    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000007E0    "KC......" */
  43.248 -    0xFF,0x0A,0x00,0x01,0x4C,0x4E,0x4B,0x44,  /* 000007E8    "....LNKD" */
  43.249 -    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0A,  /* 000007F0    "........" */
  43.250 -    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,  /* 000007F8    "...LNKA." */
  43.251 -    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000800    "........" */
  43.252 -    0x0A,0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000808    "..LNKB.." */
  43.253 -    0x0D,0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x00,  /* 00000810    "........" */
  43.254 -    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000818    "LNKD...." */
  43.255 -    0x0C,0xFF,0xFF,0x0B,0x00,0x01,0x4C,0x4E,  /* 00000820    "......LN" */
  43.256 -    0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000828    "KA......" */
  43.257 -    0xFF,0x0B,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000830    ".....LNK" */
  43.258 -    0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000838    "B......." */
  43.259 -    0x0B,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,  /* 00000840    "....LNKC" */
  43.260 -    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0C,  /* 00000848    "........" */
  43.261 -    0x00,0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000850    "..LNKA.." */
  43.262 -    0x0D,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x01,  /* 00000858    "........" */
  43.263 -    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,  /* 00000860    "LNKB...." */
  43.264 -    0x0C,0xFF,0xFF,0x0C,0x00,0x0A,0x02,0x4C,  /* 00000868    ".......L" */
  43.265 -    0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,  /* 00000870    "NKC....." */
  43.266 -    0xFF,0xFF,0x0C,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000878    "......LN" */
  43.267 -    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000880    "KD......" */
  43.268 -    0xFF,0x0D,0x00,0x00,0x4C,0x4E,0x4B,0x42,  /* 00000888    "....LNKB" */
  43.269 -    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0D,  /* 00000890    "........" */
  43.270 -    0x00,0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000898    "..LNKC.." */
  43.271 -    0x0E,0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,  /* 000008A0    "........" */
  43.272 -    0x02,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,  /* 000008A8    ".LNKD..." */
  43.273 -    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x03,  /* 000008B0    "........" */
  43.274 -    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 000008B8    "LNKA...." */
  43.275 -    0x0C,0xFF,0xFF,0x0E,0x00,0x00,0x4C,0x4E,  /* 000008C0    "......LN" */
  43.276 -    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000008C8    "KC......" */
  43.277 -    0xFF,0x0E,0x00,0x01,0x4C,0x4E,0x4B,0x44,  /* 000008D0    "....LNKD" */
  43.278 -    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0E,  /* 000008D8    "........" */
  43.279 -    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,  /* 000008E0    "...LNKA." */
  43.280 -    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 000008E8    "........" */
  43.281 -    0x0A,0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 000008F0    "..LNKB.." */
  43.282 -    0x0D,0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x00,  /* 000008F8    "........" */
  43.283 -    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000900    "LNKD...." */
  43.284 -    0x0C,0xFF,0xFF,0x0F,0x00,0x01,0x4C,0x4E,  /* 00000908    "......LN" */
  43.285 -    0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000910    "KA......" */
  43.286 -    0xFF,0x0F,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000918    ".....LNK" */
  43.287 -    0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000920    "B......." */
  43.288 -    0x0F,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,  /* 00000928    "....LNKC" */
  43.289 -    0x00,0x08,0x50,0x52,0x54,0x41,0x12,0x41,  /* 00000930    "..PRTA.A" */
  43.290 -    0x2F,0x3C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000938    "/<......" */
  43.291 -    0x01,0x00,0x00,0x00,0x0A,0x14,0x12,0x0B,  /* 00000940    "........" */
  43.292 -    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x01,0x00,  /* 00000948    "........" */
  43.293 -    0x0A,0x15,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000950    "........" */
  43.294 -    0x01,0x00,0x0A,0x02,0x00,0x0A,0x16,0x12,  /* 00000958    "........" */
  43.295 -    0x0C,0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,  /* 00000960    "........" */
  43.296 -    0x03,0x00,0x0A,0x17,0x12,0x0B,0x04,0x0C,  /* 00000968    "........" */
  43.297 -    0xFF,0xFF,0x02,0x00,0x00,0x00,0x0A,0x18,  /* 00000970    "........" */
  43.298 -    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 00000978    "........" */
  43.299 -    0x01,0x00,0x0A,0x19,0x12,0x0C,0x04,0x0C,  /* 00000980    "........" */
  43.300 -    0xFF,0xFF,0x02,0x00,0x0A,0x02,0x00,0x0A,  /* 00000988    "........" */
  43.301 -    0x1A,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x02,  /* 00000990    "........" */
  43.302 -    0x00,0x0A,0x03,0x00,0x0A,0x1B,0x12,0x0B,  /* 00000998    "........" */
  43.303 -    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x00,0x00,  /* 000009A0    "........" */
  43.304 -    0x0A,0x1C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000009A8    "........" */
  43.305 -    0x03,0x00,0x01,0x00,0x0A,0x1D,0x12,0x0C,  /* 000009B0    "........" */
  43.306 -    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x02,  /* 000009B8    "........" */
  43.307 -    0x00,0x0A,0x1E,0x12,0x0C,0x04,0x0C,0xFF,  /* 000009C0    "........" */
  43.308 -    0xFF,0x03,0x00,0x0A,0x03,0x00,0x0A,0x1F,  /* 000009C8    "........" */
  43.309 -    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 000009D0    "........" */
  43.310 -    0x00,0x00,0x0A,0x20,0x12,0x0B,0x04,0x0C,  /* 000009D8    "... ...." */
  43.311 -    0xFF,0xFF,0x04,0x00,0x01,0x00,0x0A,0x21,  /* 000009E0    ".......!" */
  43.312 -    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 000009E8    "........" */
  43.313 -    0x0A,0x02,0x00,0x0A,0x22,0x12,0x0C,0x04,  /* 000009F0    "...."..." */
  43.314 -    0x0C,0xFF,0xFF,0x04,0x00,0x0A,0x03,0x00,  /* 000009F8    "........" */
  43.315 -    0x0A,0x23,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000A00    ".#......" */
  43.316 -    0x05,0x00,0x00,0x00,0x0A,0x24,0x12,0x0B,  /* 00000A08    ".....$.." */
  43.317 -    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x01,0x00,  /* 00000A10    "........" */
  43.318 -    0x0A,0x25,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000A18    ".%......" */
  43.319 -    0x05,0x00,0x0A,0x02,0x00,0x0A,0x26,0x12,  /* 00000A20    "......&." */
  43.320 -    0x0C,0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,  /* 00000A28    "........" */
  43.321 -    0x03,0x00,0x0A,0x27,0x12,0x0B,0x04,0x0C,  /* 00000A30    "...'...." */
  43.322 -    0xFF,0xFF,0x06,0x00,0x00,0x00,0x0A,0x28,  /* 00000A38    ".......(" */
  43.323 -    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 00000A40    "........" */
  43.324 -    0x01,0x00,0x0A,0x29,0x12,0x0C,0x04,0x0C,  /* 00000A48    "...)...." */
  43.325 -    0xFF,0xFF,0x06,0x00,0x0A,0x02,0x00,0x0A,  /* 00000A50    "........" */
  43.326 -    0x2A,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x06,  /* 00000A58    "*......." */
  43.327 -    0x00,0x0A,0x03,0x00,0x0A,0x2B,0x12,0x0B,  /* 00000A60    ".....+.." */
  43.328 -    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x00,0x00,  /* 00000A68    "........" */
  43.329 -    0x0A,0x2C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000A70    ".,......" */
  43.330 -    0x07,0x00,0x01,0x00,0x0A,0x2D,0x12,0x0C,  /* 00000A78    ".....-.." */
  43.331 -    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x02,  /* 00000A80    "........" */
  43.332 -    0x00,0x0A,0x2E,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000A88    "........" */
  43.333 -    0xFF,0x07,0x00,0x0A,0x03,0x00,0x0A,0x2F,  /* 00000A90    "......./" */
  43.334 -    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 00000A98    "........" */
  43.335 -    0x00,0x00,0x0A,0x11,0x12,0x0B,0x04,0x0C,  /* 00000AA0    "........" */
  43.336 -    0xFF,0xFF,0x08,0x00,0x01,0x00,0x0A,0x12,  /* 00000AA8    "........" */
  43.337 -    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 00000AB0    "........" */
  43.338 -    0x0A,0x02,0x00,0x0A,0x13,0x12,0x0C,0x04,  /* 00000AB8    "........" */
  43.339 -    0x0C,0xFF,0xFF,0x08,0x00,0x0A,0x03,0x00,  /* 00000AC0    "........" */
  43.340 -    0x0A,0x14,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000AC8    "........" */
  43.341 -    0x09,0x00,0x00,0x00,0x0A,0x15,0x12,0x0B,  /* 00000AD0    "........" */
  43.342 -    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x01,0x00,  /* 00000AD8    "........" */
  43.343 -    0x0A,0x16,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000AE0    "........" */
  43.344 -    0x09,0x00,0x0A,0x02,0x00,0x0A,0x17,0x12,  /* 00000AE8    "........" */
  43.345 -    0x0C,0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,  /* 00000AF0    "........" */
  43.346 -    0x03,0x00,0x0A,0x18,0x12,0x0B,0x04,0x0C,  /* 00000AF8    "........" */
  43.347 -    0xFF,0xFF,0x0A,0x00,0x00,0x00,0x0A,0x19,  /* 00000B00    "........" */
  43.348 -    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000B08    "........" */
  43.349 -    0x01,0x00,0x0A,0x1A,0x12,0x0C,0x04,0x0C,  /* 00000B10    "........" */
  43.350 -    0xFF,0xFF,0x0A,0x00,0x0A,0x02,0x00,0x0A,  /* 00000B18    "........" */
  43.351 -    0x1B,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0A,  /* 00000B20    "........" */
  43.352 -    0x00,0x0A,0x03,0x00,0x0A,0x1C,0x12,0x0B,  /* 00000B28    "........" */
  43.353 -    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x00,0x00,  /* 00000B30    "........" */
  43.354 -    0x0A,0x1D,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000B38    "........" */
  43.355 -    0x0B,0x00,0x01,0x00,0x0A,0x1E,0x12,0x0C,  /* 00000B40    "........" */
  43.356 -    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x02,  /* 00000B48    "........" */
  43.357 -    0x00,0x0A,0x1F,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000B50    "........" */
  43.358 -    0xFF,0x0B,0x00,0x0A,0x03,0x00,0x0A,0x20,  /* 00000B58    "....... " */
  43.359 -    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 00000B60    "........" */
  43.360 -    0x00,0x00,0x0A,0x21,0x12,0x0B,0x04,0x0C,  /* 00000B68    "...!...." */
  43.361 -    0xFF,0xFF,0x0C,0x00,0x01,0x00,0x0A,0x22,  /* 00000B70    "......."" */
  43.362 -    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 00000B78    "........" */
  43.363 -    0x0A,0x02,0x00,0x0A,0x23,0x12,0x0C,0x04,  /* 00000B80    "....#..." */
  43.364 -    0x0C,0xFF,0xFF,0x0C,0x00,0x0A,0x03,0x00,  /* 00000B88    "........" */
  43.365 -    0x0A,0x24,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000B90    ".$......" */
  43.366 -    0x0D,0x00,0x00,0x00,0x0A,0x25,0x12,0x0B,  /* 00000B98    ".....%.." */
  43.367 -    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x01,0x00,  /* 00000BA0    "........" */
  43.368 -    0x0A,0x26,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000BA8    ".&......" */
  43.369 -    0x0D,0x00,0x0A,0x02,0x00,0x0A,0x27,0x12,  /* 00000BB0    "......'." */
  43.370 -    0x0C,0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,  /* 00000BB8    "........" */
  43.371 -    0x03,0x00,0x0A,0x28,0x12,0x0B,0x04,0x0C,  /* 00000BC0    "...(...." */
  43.372 -    0xFF,0xFF,0x0E,0x00,0x00,0x00,0x0A,0x29,  /* 00000BC8    ".......)" */
  43.373 -    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000BD0    "........" */
  43.374 -    0x01,0x00,0x0A,0x2A,0x12,0x0C,0x04,0x0C,  /* 00000BD8    "...*...." */
  43.375 -    0xFF,0xFF,0x0E,0x00,0x0A,0x02,0x00,0x0A,  /* 00000BE0    "........" */
  43.376 -    0x2B,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0E,  /* 00000BE8    "+......." */
  43.377 -    0x00,0x0A,0x03,0x00,0x0A,0x2C,0x12,0x0B,  /* 00000BF0    ".....,.." */
  43.378 -    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x00,0x00,  /* 00000BF8    "........" */
  43.379 -    0x0A,0x2D,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000C00    ".-......" */
  43.380 -    0x0F,0x00,0x01,0x00,0x0A,0x2E,0x12,0x0C,  /* 00000C08    "........" */
  43.381 -    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x02,  /* 00000C10    "........" */
  43.382 -    0x00,0x0A,0x2F,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000C18    "../....." */
  43.383 -    0xFF,0x0F,0x00,0x0A,0x03,0x00,0x0A,0x10,  /* 00000C20    "........" */
  43.384 -    0x5B,0x82,0x46,0x37,0x49,0x53,0x41,0x5F,  /* 00000C28    "[.F7ISA_" */
  43.385 -    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00000C30    "._ADR..." */
  43.386 -    0x01,0x00,0x5B,0x80,0x50,0x49,0x52,0x51,  /* 00000C38    "..[.PIRQ" */
  43.387 -    0x02,0x0A,0x60,0x0A,0x04,0x10,0x2E,0x5C,  /* 00000C40    "..`....\" */
  43.388 -    0x00,0x5B,0x81,0x29,0x5C,0x2F,0x04,0x5F,  /* 00000C48    ".[.)\/._" */
  43.389 -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x49,  /* 00000C50    "SB_PCI0I" */
  43.390 -    0x53,0x41,0x5F,0x50,0x49,0x52,0x51,0x01,  /* 00000C58    "SA_PIRQ." */
  43.391 -    0x50,0x49,0x52,0x41,0x08,0x50,0x49,0x52,  /* 00000C60    "PIRA.PIR" */
  43.392 -    0x42,0x08,0x50,0x49,0x52,0x43,0x08,0x50,  /* 00000C68    "B.PIRC.P" */
  43.393 -    0x49,0x52,0x44,0x08,0x5B,0x82,0x46,0x0B,  /* 00000C70    "IRD.[.F." */
  43.394 -    0x53,0x59,0x53,0x52,0x08,0x5F,0x48,0x49,  /* 00000C78    "SYSR._HI" */
  43.395 -    0x44,0x0C,0x41,0xD0,0x0C,0x02,0x08,0x5F,  /* 00000C80    "D.A...._" */
  43.396 -    0x55,0x49,0x44,0x01,0x08,0x43,0x52,0x53,  /* 00000C88    "UID..CRS" */
  43.397 -    0x5F,0x11,0x4E,0x08,0x0A,0x8A,0x47,0x01,  /* 00000C90    "_.N...G." */
  43.398 -    0x10,0x00,0x10,0x00,0x00,0x10,0x47,0x01,  /* 00000C98    "......G." */
  43.399 -    0x22,0x00,0x22,0x00,0x00,0x0C,0x47,0x01,  /* 00000CA0    ""."...G." */
  43.400 -    0x30,0x00,0x30,0x00,0x00,0x10,0x47,0x01,  /* 00000CA8    "0.0...G." */
  43.401 -    0x44,0x00,0x44,0x00,0x00,0x1C,0x47,0x01,  /* 00000CB0    "D.D...G." */
  43.402 -    0x62,0x00,0x62,0x00,0x00,0x02,0x47,0x01,  /* 00000CB8    "b.b...G." */
  43.403 -    0x65,0x00,0x65,0x00,0x00,0x0B,0x47,0x01,  /* 00000CC0    "e.e...G." */
  43.404 -    0x72,0x00,0x72,0x00,0x00,0x0E,0x47,0x01,  /* 00000CC8    "r.r...G." */
  43.405 -    0x80,0x00,0x80,0x00,0x00,0x01,0x47,0x01,  /* 00000CD0    "......G." */
  43.406 -    0x84,0x00,0x84,0x00,0x00,0x03,0x47,0x01,  /* 00000CD8    "......G." */
  43.407 -    0x88,0x00,0x88,0x00,0x00,0x01,0x47,0x01,  /* 00000CE0    "......G." */
  43.408 -    0x8C,0x00,0x8C,0x00,0x00,0x03,0x47,0x01,  /* 00000CE8    "......G." */
  43.409 -    0x90,0x00,0x90,0x00,0x00,0x10,0x47,0x01,  /* 00000CF0    "......G." */
  43.410 -    0xA2,0x00,0xA2,0x00,0x00,0x1C,0x47,0x01,  /* 00000CF8    "......G." */
  43.411 -    0xE0,0x00,0xE0,0x00,0x00,0x10,0x47,0x01,  /* 00000D00    "......G." */
  43.412 -    0xA0,0x08,0xA0,0x08,0x00,0x04,0x47,0x01,  /* 00000D08    "......G." */
  43.413 -    0xC0,0x0C,0xC0,0x0C,0x00,0x10,0x47,0x01,  /* 00000D10    "......G." */
  43.414 -    0xD0,0x04,0xD0,0x04,0x00,0x02,0x79,0x00,  /* 00000D18    "......y." */
  43.415 -    0x14,0x0B,0x5F,0x43,0x52,0x53,0x00,0xA4,  /* 00000D20    ".._CRS.." */
  43.416 -    0x43,0x52,0x53,0x5F,0x5B,0x82,0x2B,0x50,  /* 00000D28    "CRS_[.+P" */
  43.417 -    0x49,0x43,0x5F,0x08,0x5F,0x48,0x49,0x44,  /* 00000D30    "IC_._HID" */
  43.418 -    0x0B,0x41,0xD0,0x08,0x5F,0x43,0x52,0x53,  /* 00000D38    ".A.._CRS" */
  43.419 -    0x11,0x18,0x0A,0x15,0x47,0x01,0x20,0x00,  /* 00000D40    "....G. ." */
  43.420 -    0x20,0x00,0x01,0x02,0x47,0x01,0xA0,0x00,  /* 00000D48    " ...G..." */
  43.421 -    0xA0,0x00,0x01,0x02,0x22,0x04,0x00,0x79,  /* 00000D50    "...."..y" */
  43.422 -    0x00,0x5B,0x82,0x47,0x05,0x44,0x4D,0x41,  /* 00000D58    ".[.G.DMA" */
  43.423 -    0x30,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000D60    "0._HID.A" */
  43.424 -    0xD0,0x02,0x00,0x08,0x5F,0x43,0x52,0x53,  /* 00000D68    "...._CRS" */
  43.425 -    0x11,0x41,0x04,0x0A,0x3D,0x2A,0x10,0x04,  /* 00000D70    ".A..=*.." */
  43.426 -    0x47,0x01,0x00,0x00,0x00,0x00,0x00,0x10,  /* 00000D78    "G......." */
  43.427 -    0x47,0x01,0x81,0x00,0x81,0x00,0x00,0x03,  /* 00000D80    "G......." */
  43.428 -    0x47,0x01,0x87,0x00,0x87,0x00,0x00,0x01,  /* 00000D88    "G......." */
  43.429 -    0x47,0x01,0x89,0x00,0x89,0x00,0x00,0x03,  /* 00000D90    "G......." */
  43.430 -    0x47,0x01,0x8F,0x00,0x8F,0x00,0x00,0x01,  /* 00000D98    "G......." */
  43.431 -    0x47,0x01,0xC0,0x00,0xC0,0x00,0x00,0x20,  /* 00000DA0    "G...... " */
  43.432 -    0x47,0x01,0x80,0x04,0x80,0x04,0x00,0x10,  /* 00000DA8    "G......." */
  43.433 -    0x79,0x00,0x5B,0x82,0x25,0x54,0x4D,0x52,  /* 00000DB0    "y.[.%TMR" */
  43.434 -    0x5F,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000DB8    "_._HID.A" */
  43.435 -    0xD0,0x01,0x00,0x08,0x5F,0x43,0x52,0x53,  /* 00000DC0    "...._CRS" */
  43.436 -    0x11,0x10,0x0A,0x0D,0x47,0x01,0x40,0x00,  /* 00000DC8    "....G.@." */
  43.437 -    0x40,0x00,0x00,0x04,0x22,0x01,0x00,0x79,  /* 00000DD0    "@..."..y" */
  43.438 -    0x00,0x5B,0x82,0x25,0x52,0x54,0x43,0x5F,  /* 00000DD8    ".[.%RTC_" */
  43.439 -    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000DE0    "._HID.A." */
  43.440 -    0x0B,0x00,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000DE8    "..._CRS." */
  43.441 -    0x10,0x0A,0x0D,0x47,0x01,0x70,0x00,0x70,  /* 00000DF0    "...G.p.p" */
  43.442 -    0x00,0x00,0x02,0x22,0x00,0x01,0x79,0x00,  /* 00000DF8    "..."..y." */
  43.443 -    0x5B,0x82,0x22,0x53,0x50,0x4B,0x52,0x08,  /* 00000E00    "[."SPKR." */
  43.444 -    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x08,  /* 00000E08    "_HID.A.." */
  43.445 -    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x0D,  /* 00000E10    ".._CRS.." */
  43.446 -    0x0A,0x0A,0x47,0x01,0x61,0x00,0x61,0x00,  /* 00000E18    "..G.a.a." */
  43.447 -    0x00,0x01,0x79,0x00,0x5B,0x82,0x31,0x50,  /* 00000E20    "..y.[.1P" */
  43.448 -    0x53,0x32,0x4D,0x08,0x5F,0x48,0x49,0x44,  /* 00000E28    "S2M._HID" */
  43.449 -    0x0C,0x41,0xD0,0x0F,0x13,0x08,0x5F,0x43,  /* 00000E30    ".A...._C" */
  43.450 -    0x49,0x44,0x0C,0x41,0xD0,0x0F,0x13,0x14,  /* 00000E38    "ID.A...." */
  43.451 -    0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,  /* 00000E40    "._STA..." */
  43.452 -    0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,0x08,  /* 00000E48    ".._CRS.." */
  43.453 -    0x0A,0x05,0x22,0x00,0x10,0x79,0x00,0x5B,  /* 00000E50    ".."..y.[" */
  43.454 -    0x82,0x42,0x04,0x50,0x53,0x32,0x4B,0x08,  /* 00000E58    ".B.PS2K." */
  43.455 -    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x03,  /* 00000E60    "_HID.A.." */
  43.456 -    0x03,0x08,0x5F,0x43,0x49,0x44,0x0C,0x41,  /* 00000E68    ".._CID.A" */
  43.457 -    0xD0,0x03,0x0B,0x14,0x09,0x5F,0x53,0x54,  /* 00000E70    "....._ST" */
  43.458 -    0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,  /* 00000E78    "A....._C" */
  43.459 -    0x52,0x53,0x11,0x18,0x0A,0x15,0x47,0x01,  /* 00000E80    "RS....G." */
  43.460 -    0x60,0x00,0x60,0x00,0x00,0x01,0x47,0x01,  /* 00000E88    "`.`...G." */
  43.461 -    0x64,0x00,0x64,0x00,0x00,0x01,0x22,0x02,  /* 00000E90    "d.d..."." */
  43.462 -    0x00,0x79,0x00,0x5B,0x82,0x3A,0x46,0x44,  /* 00000E98    ".y.[.:FD" */
  43.463 -    0x43,0x30,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000EA0    "C0._HID." */
  43.464 -    0x41,0xD0,0x07,0x00,0x14,0x09,0x5F,0x53,  /* 00000EA8    "A....._S" */
  43.465 -    0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,  /* 00000EB0    "TA....._" */
  43.466 -    0x43,0x52,0x53,0x11,0x1B,0x0A,0x18,0x47,  /* 00000EB8    "CRS....G" */
  43.467 -    0x01,0xF0,0x03,0xF0,0x03,0x01,0x06,0x47,  /* 00000EC0    ".......G" */
  43.468 -    0x01,0xF7,0x03,0xF7,0x03,0x01,0x01,0x22,  /* 00000EC8    "......."" */
  43.469 -    0x40,0x00,0x2A,0x04,0x00,0x79,0x00,0x5B,  /* 00000ED0    "@.*..y.[" */
  43.470 -    0x82,0x46,0x04,0x55,0x41,0x52,0x31,0x08,  /* 00000ED8    ".F.UAR1." */
  43.471 -    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x05,  /* 00000EE0    "_HID.A.." */
  43.472 -    0x01,0x08,0x5F,0x55,0x49,0x44,0x01,0x14,  /* 00000EE8    ".._UID.." */
  43.473 -    0x19,0x5F,0x53,0x54,0x41,0x00,0xA0,0x0D,  /* 00000EF0    "._STA..." */
  43.474 -    0x93,0x5E,0x5E,0x5E,0x5E,0x55,0x41,0x52,  /* 00000EF8    ".^^^^UAR" */
  43.475 -    0x31,0x00,0xA4,0x00,0xA1,0x04,0xA4,0x0A,  /* 00000F00    "1......." */
  43.476 -    0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,0x10,  /* 00000F08    ".._CRS.." */
  43.477 -    0x0A,0x0D,0x47,0x01,0xF8,0x03,0xF8,0x03,  /* 00000F10    "..G....." */
  43.478 -    0x08,0x08,0x22,0x10,0x00,0x79,0x00,0x5B,  /* 00000F18    ".."..y.[" */
  43.479 -    0x82,0x47,0x04,0x55,0x41,0x52,0x32,0x08,  /* 00000F20    ".G.UAR2." */
  43.480 -    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x05,  /* 00000F28    "_HID.A.." */
  43.481 -    0x01,0x08,0x5F,0x55,0x49,0x44,0x0A,0x02,  /* 00000F30    ".._UID.." */
  43.482 -    0x14,0x19,0x5F,0x53,0x54,0x41,0x00,0xA0,  /* 00000F38    ".._STA.." */
  43.483 -    0x0D,0x93,0x5E,0x5E,0x5E,0x5E,0x55,0x41,  /* 00000F40    "..^^^^UA" */
  43.484 -    0x52,0x32,0x00,0xA4,0x00,0xA1,0x04,0xA4,  /* 00000F48    "R2......" */
  43.485 -    0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000F50    "..._CRS." */
  43.486 -    0x10,0x0A,0x0D,0x47,0x01,0xF8,0x02,0xF8,  /* 00000F58    "...G...." */
  43.487 -    0x02,0x08,0x08,0x22,0x08,0x00,0x79,0x00,  /* 00000F60    "..."..y." */
  43.488 -    0x5B,0x82,0x36,0x4C,0x54,0x50,0x31,0x08,  /* 00000F68    "[.6LTP1." */
  43.489 -    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x04,  /* 00000F70    "_HID.A.." */
  43.490 -    0x00,0x08,0x5F,0x55,0x49,0x44,0x0A,0x02,  /* 00000F78    ".._UID.." */
  43.491 -    0x14,0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,  /* 00000F80    ".._STA.." */
  43.492 -    0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000F88    "..._CRS." */
  43.493 -    0x10,0x0A,0x0D,0x47,0x01,0x78,0x03,0x78,  /* 00000F90    "...G.x.x" */
  43.494 -    0x03,0x08,0x08,0x22,0x80,0x00,0x79,0x00,  /* 00000F98    "..."..y." */
  43.495 -    0x5B,0x82,0x4D,0x07,0x53,0x31,0x46,0x30,  /* 00000FA0    "[.M.S1F0" */
  43.496 -    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00000FA8    "._ADR..." */
  43.497 -    0x06,0x00,0x08,0x5F,0x53,0x55,0x4E,0x01,  /* 00000FB0    "..._SUN." */
  43.498 -    0x14,0x13,0x5F,0x50,0x53,0x30,0x00,0x70,  /* 00000FB8    ".._PS0.p" */
  43.499 -    0x0A,0x80,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00000FC0    "..\._GPE" */
  43.500 -    0x44,0x50,0x54,0x32,0x14,0x13,0x5F,0x50,  /* 00000FC8    "DPT2.._P" */
  43.501 -    0x53,0x33,0x00,0x70,0x0A,0x83,0x5C,0x2E,  /* 00000FD0    "S3.p..\." */
  43.502 -    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000FD8    "_GPEDPT2" */
  43.503 -    0x14,0x1F,0x5F,0x45,0x4A,0x30,0x01,0x70,  /* 00000FE0    ".._EJ0.p" */
  43.504 -    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00000FE8    "..\._GPE" */
  43.505 -    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00000FF0    "DPT2p.\." */
  43.506 -    0x5F,0x47,0x50,0x45,0x50,0x48,0x50,0x31,  /* 00000FF8    "_GPEPHP1" */
  43.507 -    0x14,0x1E,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00001000    ".._STA.p" */
  43.508 -    0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001008    "..\._GPE" */
  43.509 -    0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,0x5F,  /* 00001010    "DPT2.\._" */
  43.510 -    0x47,0x50,0x45,0x50,0x48,0x50,0x31,0x5B,  /* 00001018    "GPEPHP1[" */
  43.511 -    0x82,0x4E,0x07,0x53,0x32,0x46,0x30,0x08,  /* 00001020    ".N.S2F0." */
  43.512 -    0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,0x07,  /* 00001028    "_ADR...." */
  43.513 -    0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,0x02,  /* 00001030    ".._SUN.." */
  43.514 -    0x14,0x13,0x5F,0x50,0x53,0x30,0x00,0x70,  /* 00001038    ".._PS0.p" */
  43.515 -    0x0A,0x90,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001040    "..\._GPE" */
  43.516 -    0x44,0x50,0x54,0x32,0x14,0x13,0x5F,0x50,  /* 00001048    "DPT2.._P" */
  43.517 -    0x53,0x33,0x00,0x70,0x0A,0x93,0x5C,0x2E,  /* 00001050    "S3.p..\." */
  43.518 -    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001058    "_GPEDPT2" */
  43.519 -    0x14,0x1F,0x5F,0x45,0x4A,0x30,0x01,0x70,  /* 00001060    ".._EJ0.p" */
  43.520 -    0x0A,0x98,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001068    "..\._GPE" */
  43.521 -    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00001070    "DPT2p.\." */
  43.522 -    0x5F,0x47,0x50,0x45,0x50,0x48,0x50,0x32,  /* 00001078    "_GPEPHP2" */
  43.523 -    0x14,0x1E,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00001080    ".._STA.p" */
  43.524 -    0x0A,0x99,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001088    "..\._GPE" */
  43.525 -    0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,0x5F,  /* 00001090    "DPT2.\._" */
  43.526 -    0x47,0x50,0x45,0x50,0x48,0x50,0x32,0x10,  /* 00001098    "GPEPHP2." */
  43.527 -    0x4E,0x0B,0x5F,0x47,0x50,0x45,0x5B,0x80,  /* 000010A0    "N._GPE[." */
  43.528 -    0x50,0x48,0x50,0x5F,0x01,0x0B,0xC0,0x10,  /* 000010A8    "PHP_...." */
  43.529 -    0x0A,0x03,0x5B,0x81,0x15,0x50,0x48,0x50,  /* 000010B0    "..[..PHP" */
  43.530 -    0x5F,0x01,0x50,0x53,0x54,0x41,0x08,0x50,  /* 000010B8    "_.PSTA.P" */
  43.531 -    0x48,0x50,0x31,0x08,0x50,0x48,0x50,0x32,  /* 000010C0    "HP1.PHP2" */
  43.532 -    0x08,0x5B,0x80,0x44,0x47,0x31,0x5F,0x01,  /* 000010C8    ".[.DG1_." */
  43.533 -    0x0B,0x44,0xB0,0x0A,0x04,0x5B,0x81,0x10,  /* 000010D0    ".D...[.." */
  43.534 -    0x44,0x47,0x31,0x5F,0x01,0x44,0x50,0x54,  /* 000010D8    "DG1_.DPT" */
  43.535 -    0x31,0x08,0x44,0x50,0x54,0x32,0x08,0x14,  /* 000010E0    "1.DPT2.." */
  43.536 -    0x46,0x07,0x5F,0x4C,0x30,0x33,0x00,0x08,  /* 000010E8    "F._L03.." */
  43.537 -    0x53,0x4C,0x54,0x5F,0x00,0x08,0x45,0x56,  /* 000010F0    "SLT_..EV" */
  43.538 -    0x54,0x5F,0x00,0x70,0x50,0x53,0x54,0x41,  /* 000010F8    "T_.pPSTA" */
  43.539 -    0x61,0x7A,0x61,0x0A,0x04,0x53,0x4C,0x54,  /* 00001100    "aza..SLT" */
  43.540 -    0x5F,0x7B,0x61,0x0A,0x0F,0x45,0x56,0x54,  /* 00001108    "_{a..EVT" */
  43.541 -    0x5F,0x70,0x53,0x4C,0x54,0x5F,0x44,0x50,  /* 00001110    "_pSLT_DP" */
  43.542 -    0x54,0x31,0x70,0x45,0x56,0x54,0x5F,0x44,  /* 00001118    "T1pEVT_D" */
  43.543 -    0x50,0x54,0x32,0xA0,0x1B,0x93,0x53,0x4C,  /* 00001120    "PT2...SL" */
  43.544 -    0x54,0x5F,0x01,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001128    "T_..\/._" */
  43.545 -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001130    "SB_PCI0S" */
  43.546 -    0x31,0x46,0x30,0x45,0x56,0x54,0x5F,0xA1,  /* 00001138    "1F0EVT_." */
  43.547 -    0x1E,0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,  /* 00001140    "....SLT_" */
  43.548 -    0x0A,0x02,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001148    "...\/._S" */
  43.549 -    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 00001150    "B_PCI0S2" */
  43.550 -    0x46,0x30,0x45,0x56,0x54,0x5F,
  43.551 +    0x00,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,  /* 000001D8    "........" */
  43.552 +    0x00,0x00,0x79,0x00,0x5B,0x82,0x8E,0xAE,  /* 000001E0    "..y.[..." */
  43.553 +    0x02,0x50,0x43,0x49,0x30,0x08,0x5F,0x48,  /* 000001E8    ".PCI0._H" */
  43.554 +    0x49,0x44,0x0C,0x41,0xD0,0x0A,0x03,0x08,  /* 000001F0    "ID.A...." */
  43.555 +    0x5F,0x55,0x49,0x44,0x00,0x08,0x5F,0x41,  /* 000001F8    "_UID.._A" */
  43.556 +    0x44,0x52,0x00,0x08,0x5F,0x42,0x42,0x4E,  /* 00000200    "DR.._BBN" */
  43.557 +    0x00,0x5B,0x82,0x2A,0x48,0x50,0x30,0x5F,  /* 00000208    ".[.*HP0_" */
  43.558 +    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000210    "._HID.A." */
  43.559 +    0x0C,0x02,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000218    "..._CRS." */
  43.560 +    0x15,0x0A,0x12,0x47,0x01,0xC0,0x10,0xC0,  /* 00000220    "...G...." */
  43.561 +    0x10,0x00,0x22,0x47,0x01,0x44,0xB0,0x44,  /* 00000228    ".."G.D.D" */
  43.562 +    0xB0,0x00,0x04,0x79,0x00,0x14,0x4E,0x0C,  /* 00000230    "...y..N." */
  43.563 +    0x5F,0x43,0x52,0x53,0x00,0x08,0x50,0x52,  /* 00000238    "_CRS..PR" */
  43.564 +    0x54,0x30,0x11,0x42,0x07,0x0A,0x6E,0x88,  /* 00000240    "T0.B..n." */
  43.565 +    0x0D,0x00,0x02,0x0E,0x00,0x00,0x00,0x00,  /* 00000248    "........" */
  43.566 +    0x00,0xFF,0x00,0x00,0x00,0x00,0x01,0x47,  /* 00000250    ".......G" */
  43.567 +    0x01,0xF8,0x0C,0xF8,0x0C,0x01,0x08,0x88,  /* 00000258    "........" */
  43.568 +    0x0D,0x00,0x01,0x0C,0x03,0x00,0x00,0x00,  /* 00000260    "........" */
  43.569 +    0x00,0xF7,0x0C,0x00,0x00,0xF8,0x0C,0x88,  /* 00000268    "........" */
  43.570 +    0x0D,0x00,0x01,0x0C,0x03,0x00,0x00,0x00,  /* 00000270    "........" */
  43.571 +    0x0D,0xFF,0xFF,0x00,0x00,0x00,0xF3,0x87,  /* 00000278    "........" */
  43.572 +    0x17,0x00,0x00,0x0C,0x03,0x00,0x00,0x00,  /* 00000280    "........" */
  43.573 +    0x00,0x00,0x00,0x0A,0x00,0xFF,0xFF,0x0B,  /* 00000288    "........" */
  43.574 +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,  /* 00000290    "........" */
  43.575 +    0x00,0x87,0x17,0x00,0x00,0x0C,0x03,0x00,  /* 00000298    "........" */
  43.576 +    0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,  /* 000002A0    "........" */
  43.577 +    0xFF,0xFF,0xF4,0x00,0x00,0x00,0x00,0x00,  /* 000002A8    "........" */
  43.578 +    0x00,0x00,0x05,0x79,0x00,0x8A,0x50,0x52,  /* 000002B0    "...y..PR" */
  43.579 +    0x54,0x30,0x0A,0x5C,0x4D,0x4D,0x49,0x4E,  /* 000002B8    "T0.\MMIN" */
  43.580 +    0x8A,0x50,0x52,0x54,0x30,0x0A,0x60,0x4D,  /* 000002C0    ".PRT0.`M" */
  43.581 +    0x4D,0x41,0x58,0x8A,0x50,0x52,0x54,0x30,  /* 000002C8    "MAX.PRT0" */
  43.582 +    0x0A,0x68,0x4D,0x4C,0x45,0x4E,0x70,0x50,  /* 000002D0    ".hMLENpP" */
  43.583 +    0x4D,0x49,0x4E,0x4D,0x4D,0x49,0x4E,0x70,  /* 000002D8    "MINMMINp" */
  43.584 +    0x50,0x4C,0x45,0x4E,0x4D,0x4C,0x45,0x4E,  /* 000002E0    "PLENMLEN" */
  43.585 +    0x72,0x4D,0x4D,0x49,0x4E,0x4D,0x4C,0x45,  /* 000002E8    "rMMINMLE" */
  43.586 +    0x4E,0x4D,0x4D,0x41,0x58,0x74,0x4D,0x4D,  /* 000002F0    "NMMAXtMM" */
  43.587 +    0x41,0x58,0x01,0x4D,0x4D,0x41,0x58,0xA4,  /* 000002F8    "AX.MMAX." */
  43.588 +    0x50,0x52,0x54,0x30,0x08,0x42,0x55,0x46,  /* 00000300    "PRT0.BUF" */
  43.589 +    0x41,0x11,0x09,0x0A,0x06,0x23,0x20,0x0C,  /* 00000308    "A....# ." */
  43.590 +    0x18,0x79,0x00,0x08,0x42,0x55,0x46,0x42,  /* 00000310    ".y..BUFB" */
  43.591 +    0x11,0x09,0x0A,0x06,0x23,0x00,0x00,0x18,  /* 00000318    "....#..." */
  43.592 +    0x79,0x00,0x8B,0x42,0x55,0x46,0x42,0x01,  /* 00000320    "y..BUFB." */
  43.593 +    0x49,0x52,0x51,0x56,0x5B,0x82,0x48,0x08,  /* 00000328    "IRQV[.H." */
  43.594 +    0x4C,0x4E,0x4B,0x41,0x08,0x5F,0x48,0x49,  /* 00000330    "LNKA._HI" */
  43.595 +    0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,  /* 00000338    "D.A...._" */
  43.596 +    0x55,0x49,0x44,0x01,0x14,0x1C,0x5F,0x53,  /* 00000340    "UID..._S" */
  43.597 +    0x54,0x41,0x00,0x7B,0x50,0x49,0x52,0x41,  /* 00000348    "TA.{PIRA" */
  43.598 +    0x0A,0x80,0x60,0xA0,0x08,0x93,0x60,0x0A,  /* 00000350    "..`...`." */
  43.599 +    0x80,0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,  /* 00000358    "........" */
  43.600 +    0x0B,0x14,0x0B,0x5F,0x50,0x52,0x53,0x00,  /* 00000360    "..._PRS." */
  43.601 +    0xA4,0x42,0x55,0x46,0x41,0x14,0x11,0x5F,  /* 00000368    ".BUFA.._" */
  43.602 +    0x44,0x49,0x53,0x00,0x7D,0x50,0x49,0x52,  /* 00000370    "DIS.}PIR" */
  43.603 +    0x41,0x0A,0x80,0x50,0x49,0x52,0x41,0x14,  /* 00000378    "A..PIRA." */
  43.604 +    0x1A,0x5F,0x43,0x52,0x53,0x00,0x7B,0x50,  /* 00000380    "._CRS.{P" */
  43.605 +    0x49,0x52,0x41,0x0A,0x0F,0x60,0x79,0x01,  /* 00000388    "IRA..`y." */
  43.606 +    0x60,0x49,0x52,0x51,0x56,0xA4,0x42,0x55,  /* 00000390    "`IRQV.BU" */
  43.607 +    0x46,0x42,0x14,0x1B,0x5F,0x53,0x52,0x53,  /* 00000398    "FB.._SRS" */
  43.608 +    0x01,0x8B,0x68,0x01,0x49,0x52,0x51,0x31,  /* 000003A0    "..h.IRQ1" */
  43.609 +    0x82,0x49,0x52,0x51,0x31,0x60,0x76,0x60,  /* 000003A8    ".IRQ1`v`" */
  43.610 +    0x70,0x60,0x50,0x49,0x52,0x41,0x5B,0x82,  /* 000003B0    "p`PIRA[." */
  43.611 +    0x49,0x08,0x4C,0x4E,0x4B,0x42,0x08,0x5F,  /* 000003B8    "I.LNKB._" */
  43.612 +    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,  /* 000003C0    "HID.A..." */
  43.613 +    0x08,0x5F,0x55,0x49,0x44,0x0A,0x02,0x14,  /* 000003C8    "._UID..." */
  43.614 +    0x1C,0x5F,0x53,0x54,0x41,0x00,0x7B,0x50,  /* 000003D0    "._STA.{P" */
  43.615 +    0x49,0x52,0x42,0x0A,0x80,0x60,0xA0,0x08,  /* 000003D8    "IRB..`.." */
  43.616 +    0x93,0x60,0x0A,0x80,0xA4,0x0A,0x09,0xA1,  /* 000003E0    ".`......" */
  43.617 +    0x04,0xA4,0x0A,0x0B,0x14,0x0B,0x5F,0x50,  /* 000003E8    "......_P" */
  43.618 +    0x52,0x53,0x00,0xA4,0x42,0x55,0x46,0x41,  /* 000003F0    "RS..BUFA" */
  43.619 +    0x14,0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,  /* 000003F8    ".._DIS.}" */
  43.620 +    0x50,0x49,0x52,0x42,0x0A,0x80,0x50,0x49,  /* 00000400    "PIRB..PI" */
  43.621 +    0x52,0x42,0x14,0x1A,0x5F,0x43,0x52,0x53,  /* 00000408    "RB.._CRS" */
  43.622 +    0x00,0x7B,0x50,0x49,0x52,0x42,0x0A,0x0F,  /* 00000410    ".{PIRB.." */
  43.623 +    0x60,0x79,0x01,0x60,0x49,0x52,0x51,0x56,  /* 00000418    "`y.`IRQV" */
  43.624 +    0xA4,0x42,0x55,0x46,0x42,0x14,0x1B,0x5F,  /* 00000420    ".BUFB.._" */
  43.625 +    0x53,0x52,0x53,0x01,0x8B,0x68,0x01,0x49,  /* 00000428    "SRS..h.I" */
  43.626 +    0x52,0x51,0x31,0x82,0x49,0x52,0x51,0x31,  /* 00000430    "RQ1.IRQ1" */
  43.627 +    0x60,0x76,0x60,0x70,0x60,0x50,0x49,0x52,  /* 00000438    "`v`p`PIR" */
  43.628 +    0x42,0x5B,0x82,0x49,0x08,0x4C,0x4E,0x4B,  /* 00000440    "B[.I.LNK" */
  43.629 +    0x43,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000448    "C._HID.A" */
  43.630 +    0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,  /* 00000450    "...._UID" */
  43.631 +    0x0A,0x03,0x14,0x1C,0x5F,0x53,0x54,0x41,  /* 00000458    "...._STA" */
  43.632 +    0x00,0x7B,0x50,0x49,0x52,0x43,0x0A,0x80,  /* 00000460    ".{PIRC.." */
  43.633 +    0x60,0xA0,0x08,0x93,0x60,0x0A,0x80,0xA4,  /* 00000468    "`...`..." */
  43.634 +    0x0A,0x09,0xA1,0x04,0xA4,0x0A,0x0B,0x14,  /* 00000470    "........" */
  43.635 +    0x0B,0x5F,0x50,0x52,0x53,0x00,0xA4,0x42,  /* 00000478    "._PRS..B" */
  43.636 +    0x55,0x46,0x41,0x14,0x11,0x5F,0x44,0x49,  /* 00000480    "UFA.._DI" */
  43.637 +    0x53,0x00,0x7D,0x50,0x49,0x52,0x43,0x0A,  /* 00000488    "S.}PIRC." */
  43.638 +    0x80,0x50,0x49,0x52,0x43,0x14,0x1A,0x5F,  /* 00000490    ".PIRC.._" */
  43.639 +    0x43,0x52,0x53,0x00,0x7B,0x50,0x49,0x52,  /* 00000498    "CRS.{PIR" */
  43.640 +    0x43,0x0A,0x0F,0x60,0x79,0x01,0x60,0x49,  /* 000004A0    "C..`y.`I" */
  43.641 +    0x52,0x51,0x56,0xA4,0x42,0x55,0x46,0x42,  /* 000004A8    "RQV.BUFB" */
  43.642 +    0x14,0x1B,0x5F,0x53,0x52,0x53,0x01,0x8B,  /* 000004B0    ".._SRS.." */
  43.643 +    0x68,0x01,0x49,0x52,0x51,0x31,0x82,0x49,  /* 000004B8    "h.IRQ1.I" */
  43.644 +    0x52,0x51,0x31,0x60,0x76,0x60,0x70,0x60,  /* 000004C0    "RQ1`v`p`" */
  43.645 +    0x50,0x49,0x52,0x43,0x5B,0x82,0x49,0x08,  /* 000004C8    "PIRC[.I." */
  43.646 +    0x4C,0x4E,0x4B,0x44,0x08,0x5F,0x48,0x49,  /* 000004D0    "LNKD._HI" */
  43.647 +    0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,  /* 000004D8    "D.A...._" */
  43.648 +    0x55,0x49,0x44,0x0A,0x04,0x14,0x1C,0x5F,  /* 000004E0    "UID...._" */
  43.649 +    0x53,0x54,0x41,0x00,0x7B,0x50,0x49,0x52,  /* 000004E8    "STA.{PIR" */
  43.650 +    0x44,0x0A,0x80,0x60,0xA0,0x08,0x93,0x60,  /* 000004F0    "D..`...`" */
  43.651 +    0x0A,0x80,0xA4,0x0A,0x09,0xA1,0x04,0xA4,  /* 000004F8    "........" */
  43.652 +    0x0A,0x0B,0x14,0x0B,0x5F,0x50,0x52,0x53,  /* 00000500    "...._PRS" */
  43.653 +    0x00,0xA4,0x42,0x55,0x46,0x41,0x14,0x11,  /* 00000508    "..BUFA.." */
  43.654 +    0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,0x49,  /* 00000510    "_DIS.}PI" */
  43.655 +    0x52,0x44,0x0A,0x80,0x50,0x49,0x52,0x44,  /* 00000518    "RD..PIRD" */
  43.656 +    0x14,0x1A,0x5F,0x43,0x52,0x53,0x00,0x7B,  /* 00000520    ".._CRS.{" */
  43.657 +    0x50,0x49,0x52,0x44,0x0A,0x0F,0x60,0x79,  /* 00000528    "PIRD..`y" */
  43.658 +    0x01,0x60,0x49,0x52,0x51,0x56,0xA4,0x42,  /* 00000530    ".`IRQV.B" */
  43.659 +    0x55,0x46,0x42,0x14,0x1B,0x5F,0x53,0x52,  /* 00000538    "UFB.._SR" */
  43.660 +    0x53,0x01,0x8B,0x68,0x01,0x49,0x52,0x51,  /* 00000540    "S..h.IRQ" */
  43.661 +    0x31,0x82,0x49,0x52,0x51,0x31,0x60,0x76,  /* 00000548    "1.IRQ1`v" */
  43.662 +    0x60,0x70,0x60,0x50,0x49,0x52,0x44,0x5B,  /* 00000550    "`p`PIRD[" */
  43.663 +    0x82,0x44,0x05,0x48,0x50,0x45,0x54,0x08,  /* 00000558    ".D.HPET." */
  43.664 +    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x01,  /* 00000560    "_HID.A.." */
  43.665 +    0x03,0x08,0x5F,0x55,0x49,0x44,0x00,0x14,  /* 00000568    ".._UID.." */
  43.666 +    0x18,0x5F,0x53,0x54,0x41,0x00,0xA0,0x0C,  /* 00000570    "._STA..." */
  43.667 +    0x93,0x5E,0x5E,0x5E,0x48,0x50,0x45,0x54,  /* 00000578    ".^^^HPET" */
  43.668 +    0x00,0xA4,0x00,0xA1,0x04,0xA4,0x0A,0x0F,  /* 00000580    "........" */
  43.669 +    0x08,0x5F,0x43,0x52,0x53,0x11,0x1F,0x0A,  /* 00000588    "._CRS..." */
  43.670 +    0x1C,0x87,0x17,0x00,0x00,0x0D,0x01,0x00,  /* 00000590    "........" */
  43.671 +    0x00,0x00,0x00,0x00,0x00,0xD0,0xFE,0xFF,  /* 00000598    "........" */
  43.672 +    0x03,0xD0,0xFE,0x00,0x00,0x00,0x00,0x00,  /* 000005A0    "........" */
  43.673 +    0x04,0x00,0x00,0x79,0x00,0x14,0x16,0x5F,  /* 000005A8    "...y..._" */
  43.674 +    0x50,0x52,0x54,0x00,0xA0,0x0A,0x50,0x49,  /* 000005B0    "PRT...PI" */
  43.675 +    0x43,0x44,0xA4,0x50,0x52,0x54,0x41,0xA4,  /* 000005B8    "CD.PRTA." */
  43.676 +    0x50,0x52,0x54,0x50,0x08,0x50,0x52,0x54,  /* 000005C0    "PRTP.PRT" */
  43.677 +    0x50,0x12,0x49,0x70,0x7C,0x12,0x0D,0x04,  /* 000005C8    "P.Ip|..." */
  43.678 +    0x0C,0xFF,0xFF,0x01,0x00,0x00,0x4C,0x4E,  /* 000005D0    "......LN" */
  43.679 +    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000005D8    "KB......" */
  43.680 +    0xFF,0x01,0x00,0x01,0x4C,0x4E,0x4B,0x43,  /* 000005E0    "....LNKC" */
  43.681 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x01,  /* 000005E8    "........" */
  43.682 +    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,  /* 000005F0    "...LNKD." */
  43.683 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 000005F8    "........" */
  43.684 +    0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000600    "..LNKA.." */
  43.685 +    0x0D,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x00,  /* 00000608    "........" */
  43.686 +    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000610    "LNKC...." */
  43.687 +    0x0C,0xFF,0xFF,0x02,0x00,0x01,0x4C,0x4E,  /* 00000618    "......LN" */
  43.688 +    0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000620    "KD......" */
  43.689 +    0xFF,0x02,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000628    ".....LNK" */
  43.690 +    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000630    "A......." */
  43.691 +    0x02,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,  /* 00000638    "....LNKB" */
  43.692 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000640    "........" */
  43.693 +    0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000648    "..LNKD.." */
  43.694 +    0x0D,0x04,0x0C,0xFF,0xFF,0x03,0x00,0x01,  /* 00000650    "........" */
  43.695 +    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,  /* 00000658    "LNKA...." */
  43.696 +    0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x02,0x4C,  /* 00000660    ".......L" */
  43.697 +    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000668    "NKB....." */
  43.698 +    0xFF,0xFF,0x03,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000670    "......LN" */
  43.699 +    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000678    "KC......" */
  43.700 +    0xFF,0x04,0x00,0x00,0x4C,0x4E,0x4B,0x41,  /* 00000680    "....LNKA" */
  43.701 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x04,  /* 00000688    "........" */
  43.702 +    0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000690    "..LNKB.." */
  43.703 +    0x0E,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,  /* 00000698    "........" */
  43.704 +    0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 000006A0    ".LNKC..." */
  43.705 +    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,0x03,  /* 000006A8    "........" */
  43.706 +    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 000006B0    "LNKD...." */
  43.707 +    0x0C,0xFF,0xFF,0x05,0x00,0x00,0x4C,0x4E,  /* 000006B8    "......LN" */
  43.708 +    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000006C0    "KB......" */
  43.709 +    0xFF,0x05,0x00,0x01,0x4C,0x4E,0x4B,0x43,  /* 000006C8    "....LNKC" */
  43.710 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x05,  /* 000006D0    "........" */
  43.711 +    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,  /* 000006D8    "...LNKD." */
  43.712 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 000006E0    "........" */
  43.713 +    0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 000006E8    "..LNKA.." */
  43.714 +    0x0D,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x00,  /* 000006F0    "........" */
  43.715 +    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 000006F8    "LNKC...." */
  43.716 +    0x0C,0xFF,0xFF,0x06,0x00,0x01,0x4C,0x4E,  /* 00000700    "......LN" */
  43.717 +    0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000708    "KD......" */
  43.718 +    0xFF,0x06,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000710    ".....LNK" */
  43.719 +    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000718    "A......." */
  43.720 +    0x06,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,  /* 00000720    "....LNKB" */
  43.721 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x07,  /* 00000728    "........" */
  43.722 +    0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000730    "..LNKD.." */
  43.723 +    0x0D,0x04,0x0C,0xFF,0xFF,0x07,0x00,0x01,  /* 00000738    "........" */
  43.724 +    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,  /* 00000740    "LNKA...." */
  43.725 +    0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x02,0x4C,  /* 00000748    ".......L" */
  43.726 +    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000750    "NKB....." */
  43.727 +    0xFF,0xFF,0x07,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000758    "......LN" */
  43.728 +    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000760    "KC......" */
  43.729 +    0xFF,0x08,0x00,0x00,0x4C,0x4E,0x4B,0x41,  /* 00000768    "....LNKA" */
  43.730 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x08,  /* 00000770    "........" */
  43.731 +    0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000778    "..LNKB.." */
  43.732 +    0x0E,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,  /* 00000780    "........" */
  43.733 +    0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000788    ".LNKC..." */
  43.734 +    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,0x03,  /* 00000790    "........" */
  43.735 +    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000798    "LNKD...." */
  43.736 +    0x0C,0xFF,0xFF,0x09,0x00,0x00,0x4C,0x4E,  /* 000007A0    "......LN" */
  43.737 +    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000007A8    "KB......" */
  43.738 +    0xFF,0x09,0x00,0x01,0x4C,0x4E,0x4B,0x43,  /* 000007B0    "....LNKC" */
  43.739 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x09,  /* 000007B8    "........" */
  43.740 +    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,  /* 000007C0    "...LNKD." */
  43.741 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 000007C8    "........" */
  43.742 +    0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 000007D0    "..LNKA.." */
  43.743 +    0x0D,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x00,  /* 000007D8    "........" */
  43.744 +    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 000007E0    "LNKC...." */
  43.745 +    0x0C,0xFF,0xFF,0x0A,0x00,0x01,0x4C,0x4E,  /* 000007E8    "......LN" */
  43.746 +    0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000007F0    "KD......" */
  43.747 +    0xFF,0x0A,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 000007F8    ".....LNK" */
  43.748 +    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000800    "A......." */
  43.749 +    0x0A,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,  /* 00000808    "....LNKB" */
  43.750 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0B,  /* 00000810    "........" */
  43.751 +    0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000818    "..LNKD.." */
  43.752 +    0x0D,0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x01,  /* 00000820    "........" */
  43.753 +    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,  /* 00000828    "LNKA...." */
  43.754 +    0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x02,0x4C,  /* 00000830    ".......L" */
  43.755 +    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000838    "NKB....." */
  43.756 +    0xFF,0xFF,0x0B,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000840    "......LN" */
  43.757 +    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000848    "KC......" */
  43.758 +    0xFF,0x0C,0x00,0x00,0x4C,0x4E,0x4B,0x41,  /* 00000850    "....LNKA" */
  43.759 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0C,  /* 00000858    "........" */
  43.760 +    0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000860    "..LNKB.." */
  43.761 +    0x0E,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,  /* 00000868    "........" */
  43.762 +    0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000870    ".LNKC..." */
  43.763 +    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,0x03,  /* 00000878    "........" */
  43.764 +    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000880    "LNKD...." */
  43.765 +    0x0C,0xFF,0xFF,0x0D,0x00,0x00,0x4C,0x4E,  /* 00000888    "......LN" */
  43.766 +    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000890    "KB......" */
  43.767 +    0xFF,0x0D,0x00,0x01,0x4C,0x4E,0x4B,0x43,  /* 00000898    "....LNKC" */
  43.768 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0D,  /* 000008A0    "........" */
  43.769 +    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,  /* 000008A8    "...LNKD." */
  43.770 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 000008B0    "........" */
  43.771 +    0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 000008B8    "..LNKA.." */
  43.772 +    0x0D,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x00,  /* 000008C0    "........" */
  43.773 +    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 000008C8    "LNKC...." */
  43.774 +    0x0C,0xFF,0xFF,0x0E,0x00,0x01,0x4C,0x4E,  /* 000008D0    "......LN" */
  43.775 +    0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000008D8    "KD......" */
  43.776 +    0xFF,0x0E,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 000008E0    ".....LNK" */
  43.777 +    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000008E8    "A......." */
  43.778 +    0x0E,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,  /* 000008F0    "....LNKB" */
  43.779 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0F,  /* 000008F8    "........" */
  43.780 +    0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000900    "..LNKD.." */
  43.781 +    0x0D,0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x01,  /* 00000908    "........" */
  43.782 +    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,  /* 00000910    "LNKA...." */
  43.783 +    0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x02,0x4C,  /* 00000918    ".......L" */
  43.784 +    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000920    "NKB....." */
  43.785 +    0xFF,0xFF,0x0F,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000928    "......LN" */
  43.786 +    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000930    "KC......" */
  43.787 +    0xFF,0x10,0x00,0x00,0x4C,0x4E,0x4B,0x41,  /* 00000938    "....LNKA" */
  43.788 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x10,  /* 00000940    "........" */
  43.789 +    0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000948    "..LNKB.." */
  43.790 +    0x0E,0x04,0x0C,0xFF,0xFF,0x10,0x00,0x0A,  /* 00000950    "........" */
  43.791 +    0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000958    ".LNKC..." */
  43.792 +    0x04,0x0C,0xFF,0xFF,0x10,0x00,0x0A,0x03,  /* 00000960    "........" */
  43.793 +    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000968    "LNKD...." */
  43.794 +    0x0C,0xFF,0xFF,0x11,0x00,0x00,0x4C,0x4E,  /* 00000970    "......LN" */
  43.795 +    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000978    "KB......" */
  43.796 +    0xFF,0x11,0x00,0x01,0x4C,0x4E,0x4B,0x43,  /* 00000980    "....LNKC" */
  43.797 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x11,  /* 00000988    "........" */
  43.798 +    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000990    "...LNKD." */
  43.799 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x11,0x00,  /* 00000998    "........" */
  43.800 +    0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 000009A0    "..LNKA.." */
  43.801 +    0x0D,0x04,0x0C,0xFF,0xFF,0x12,0x00,0x00,  /* 000009A8    "........" */
  43.802 +    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 000009B0    "LNKC...." */
  43.803 +    0x0C,0xFF,0xFF,0x12,0x00,0x01,0x4C,0x4E,  /* 000009B8    "......LN" */
  43.804 +    0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000009C0    "KD......" */
  43.805 +    0xFF,0x12,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 000009C8    ".....LNK" */
  43.806 +    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000009D0    "A......." */
  43.807 +    0x12,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,  /* 000009D8    "....LNKB" */
  43.808 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x13,  /* 000009E0    "........" */
  43.809 +    0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 000009E8    "..LNKD.." */
  43.810 +    0x0D,0x04,0x0C,0xFF,0xFF,0x13,0x00,0x01,  /* 000009F0    "........" */
  43.811 +    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,  /* 000009F8    "LNKA...." */
  43.812 +    0x0C,0xFF,0xFF,0x13,0x00,0x0A,0x02,0x4C,  /* 00000A00    ".......L" */
  43.813 +    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000A08    "NKB....." */
  43.814 +    0xFF,0xFF,0x13,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000A10    "......LN" */
  43.815 +    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000A18    "KC......" */
  43.816 +    0xFF,0x14,0x00,0x00,0x4C,0x4E,0x4B,0x41,  /* 00000A20    "....LNKA" */
  43.817 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x14,  /* 00000A28    "........" */
  43.818 +    0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000A30    "..LNKB.." */
  43.819 +    0x0E,0x04,0x0C,0xFF,0xFF,0x14,0x00,0x0A,  /* 00000A38    "........" */
  43.820 +    0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000A40    ".LNKC..." */
  43.821 +    0x04,0x0C,0xFF,0xFF,0x14,0x00,0x0A,0x03,  /* 00000A48    "........" */
  43.822 +    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000A50    "LNKD...." */
  43.823 +    0x0C,0xFF,0xFF,0x15,0x00,0x00,0x4C,0x4E,  /* 00000A58    "......LN" */
  43.824 +    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000A60    "KB......" */
  43.825 +    0xFF,0x15,0x00,0x01,0x4C,0x4E,0x4B,0x43,  /* 00000A68    "....LNKC" */
  43.826 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x15,  /* 00000A70    "........" */
  43.827 +    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000A78    "...LNKD." */
  43.828 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x15,0x00,  /* 00000A80    "........" */
  43.829 +    0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000A88    "..LNKA.." */
  43.830 +    0x0D,0x04,0x0C,0xFF,0xFF,0x16,0x00,0x00,  /* 00000A90    "........" */
  43.831 +    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000A98    "LNKC...." */
  43.832 +    0x0C,0xFF,0xFF,0x16,0x00,0x01,0x4C,0x4E,  /* 00000AA0    "......LN" */
  43.833 +    0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000AA8    "KD......" */
  43.834 +    0xFF,0x16,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000AB0    ".....LNK" */
  43.835 +    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000AB8    "A......." */
  43.836 +    0x16,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,  /* 00000AC0    "....LNKB" */
  43.837 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x17,  /* 00000AC8    "........" */
  43.838 +    0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000AD0    "..LNKD.." */
  43.839 +    0x0D,0x04,0x0C,0xFF,0xFF,0x17,0x00,0x01,  /* 00000AD8    "........" */
  43.840 +    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,  /* 00000AE0    "LNKA...." */
  43.841 +    0x0C,0xFF,0xFF,0x17,0x00,0x0A,0x02,0x4C,  /* 00000AE8    ".......L" */
  43.842 +    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000AF0    "NKB....." */
  43.843 +    0xFF,0xFF,0x17,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000AF8    "......LN" */
  43.844 +    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000B00    "KC......" */
  43.845 +    0xFF,0x18,0x00,0x00,0x4C,0x4E,0x4B,0x41,  /* 00000B08    "....LNKA" */
  43.846 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x18,  /* 00000B10    "........" */
  43.847 +    0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000B18    "..LNKB.." */
  43.848 +    0x0E,0x04,0x0C,0xFF,0xFF,0x18,0x00,0x0A,  /* 00000B20    "........" */
  43.849 +    0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000B28    ".LNKC..." */
  43.850 +    0x04,0x0C,0xFF,0xFF,0x18,0x00,0x0A,0x03,  /* 00000B30    "........" */
  43.851 +    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000B38    "LNKD...." */
  43.852 +    0x0C,0xFF,0xFF,0x19,0x00,0x00,0x4C,0x4E,  /* 00000B40    "......LN" */
  43.853 +    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000B48    "KB......" */
  43.854 +    0xFF,0x19,0x00,0x01,0x4C,0x4E,0x4B,0x43,  /* 00000B50    "....LNKC" */
  43.855 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x19,  /* 00000B58    "........" */
  43.856 +    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000B60    "...LNKD." */
  43.857 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x19,0x00,  /* 00000B68    "........" */
  43.858 +    0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000B70    "..LNKA.." */
  43.859 +    0x0D,0x04,0x0C,0xFF,0xFF,0x1A,0x00,0x00,  /* 00000B78    "........" */
  43.860 +    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000B80    "LNKC...." */
  43.861 +    0x0C,0xFF,0xFF,0x1A,0x00,0x01,0x4C,0x4E,  /* 00000B88    "......LN" */
  43.862 +    0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000B90    "KD......" */
  43.863 +    0xFF,0x1A,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000B98    ".....LNK" */
  43.864 +    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000BA0    "A......." */
  43.865 +    0x1A,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,  /* 00000BA8    "....LNKB" */
  43.866 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x1B,  /* 00000BB0    "........" */
  43.867 +    0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000BB8    "..LNKD.." */
  43.868 +    0x0D,0x04,0x0C,0xFF,0xFF,0x1B,0x00,0x01,  /* 00000BC0    "........" */
  43.869 +    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,  /* 00000BC8    "LNKA...." */
  43.870 +    0x0C,0xFF,0xFF,0x1B,0x00,0x0A,0x02,0x4C,  /* 00000BD0    ".......L" */
  43.871 +    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000BD8    "NKB....." */
  43.872 +    0xFF,0xFF,0x1B,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000BE0    "......LN" */
  43.873 +    0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000BE8    "KC......" */
  43.874 +    0xFF,0x1C,0x00,0x00,0x4C,0x4E,0x4B,0x41,  /* 00000BF0    "....LNKA" */
  43.875 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x1C,  /* 00000BF8    "........" */
  43.876 +    0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000C00    "..LNKB.." */
  43.877 +    0x0E,0x04,0x0C,0xFF,0xFF,0x1C,0x00,0x0A,  /* 00000C08    "........" */
  43.878 +    0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000C10    ".LNKC..." */
  43.879 +    0x04,0x0C,0xFF,0xFF,0x1C,0x00,0x0A,0x03,  /* 00000C18    "........" */
  43.880 +    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,  /* 00000C20    "LNKD...." */
  43.881 +    0x0C,0xFF,0xFF,0x1D,0x00,0x00,0x4C,0x4E,  /* 00000C28    "......LN" */
  43.882 +    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000C30    "KB......" */
  43.883 +    0xFF,0x1D,0x00,0x01,0x4C,0x4E,0x4B,0x43,  /* 00000C38    "....LNKC" */
  43.884 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x1D,  /* 00000C40    "........" */
  43.885 +    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000C48    "...LNKD." */
  43.886 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x1D,0x00,  /* 00000C50    "........" */
  43.887 +    0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000C58    "..LNKA.." */
  43.888 +    0x0D,0x04,0x0C,0xFF,0xFF,0x1E,0x00,0x00,  /* 00000C60    "........" */
  43.889 +    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000C68    "LNKC...." */
  43.890 +    0x0C,0xFF,0xFF,0x1E,0x00,0x01,0x4C,0x4E,  /* 00000C70    "......LN" */
  43.891 +    0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000C78    "KD......" */
  43.892 +    0xFF,0x1E,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000C80    ".....LNK" */
  43.893 +    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000C88    "A......." */
  43.894 +    0x1E,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,  /* 00000C90    "....LNKB" */
  43.895 +    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x1F,  /* 00000C98    "........" */
  43.896 +    0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000CA0    "..LNKD.." */
  43.897 +    0x0D,0x04,0x0C,0xFF,0xFF,0x1F,0x00,0x01,  /* 00000CA8    "........" */
  43.898 +    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,  /* 00000CB0    "LNKA...." */
  43.899 +    0x0C,0xFF,0xFF,0x1F,0x00,0x0A,0x02,0x4C,  /* 00000CB8    ".......L" */
  43.900 +    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000CC0    "NKB....." */
  43.901 +    0xFF,0xFF,0x1F,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000CC8    "......LN" */
  43.902 +    0x4B,0x43,0x00,0x08,0x50,0x52,0x54,0x41,  /* 00000CD0    "KC..PRTA" */
  43.903 +    0x12,0x41,0x61,0x7C,0x12,0x0B,0x04,0x0C,  /* 00000CD8    ".Aa|...." */
  43.904 +    0xFF,0xFF,0x01,0x00,0x00,0x00,0x0A,0x14,  /* 00000CE0    "........" */
  43.905 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 00000CE8    "........" */
  43.906 +    0x01,0x00,0x0A,0x15,0x12,0x0C,0x04,0x0C,  /* 00000CF0    "........" */
  43.907 +    0xFF,0xFF,0x01,0x00,0x0A,0x02,0x00,0x0A,  /* 00000CF8    "........" */
  43.908 +    0x16,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x01,  /* 00000D00    "........" */
  43.909 +    0x00,0x0A,0x03,0x00,0x0A,0x17,0x12,0x0B,  /* 00000D08    "........" */
  43.910 +    0x04,0x0C,0xFF,0xFF,0x02,0x00,0x00,0x00,  /* 00000D10    "........" */
  43.911 +    0x0A,0x18,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000D18    "........" */
  43.912 +    0x02,0x00,0x01,0x00,0x0A,0x19,0x12,0x0C,  /* 00000D20    "........" */
  43.913 +    0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,0x02,  /* 00000D28    "........" */
  43.914 +    0x00,0x0A,0x1A,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000D30    "........" */
  43.915 +    0xFF,0x02,0x00,0x0A,0x03,0x00,0x0A,0x1B,  /* 00000D38    "........" */
  43.916 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x03,0x00,  /* 00000D40    "........" */
  43.917 +    0x00,0x00,0x0A,0x1C,0x12,0x0B,0x04,0x0C,  /* 00000D48    "........" */
  43.918 +    0xFF,0xFF,0x03,0x00,0x01,0x00,0x0A,0x1D,  /* 00000D50    "........" */
  43.919 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x03,0x00,  /* 00000D58    "........" */
  43.920 +    0x0A,0x02,0x00,0x0A,0x1E,0x12,0x0C,0x04,  /* 00000D60    "........" */
  43.921 +    0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x03,0x00,  /* 00000D68    "........" */
  43.922 +    0x0A,0x1F,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000D70    "........" */
  43.923 +    0x04,0x00,0x00,0x00,0x0A,0x20,0x12,0x0B,  /* 00000D78    "..... .." */
  43.924 +    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x01,0x00,  /* 00000D80    "........" */
  43.925 +    0x0A,0x21,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000D88    ".!......" */
  43.926 +    0x04,0x00,0x0A,0x02,0x00,0x0A,0x22,0x12,  /* 00000D90    "......"." */
  43.927 +    0x0C,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,  /* 00000D98    "........" */
  43.928 +    0x03,0x00,0x0A,0x23,0x12,0x0B,0x04,0x0C,  /* 00000DA0    "...#...." */
  43.929 +    0xFF,0xFF,0x05,0x00,0x00,0x00,0x0A,0x24,  /* 00000DA8    ".......$" */
  43.930 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 00000DB0    "........" */
  43.931 +    0x01,0x00,0x0A,0x25,0x12,0x0C,0x04,0x0C,  /* 00000DB8    "...%...." */
  43.932 +    0xFF,0xFF,0x05,0x00,0x0A,0x02,0x00,0x0A,  /* 00000DC0    "........" */
  43.933 +    0x26,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x05,  /* 00000DC8    "&......." */
  43.934 +    0x00,0x0A,0x03,0x00,0x0A,0x27,0x12,0x0B,  /* 00000DD0    ".....'.." */
  43.935 +    0x04,0x0C,0xFF,0xFF,0x06,0x00,0x00,0x00,  /* 00000DD8    "........" */
  43.936 +    0x0A,0x28,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000DE0    ".(......" */
  43.937 +    0x06,0x00,0x01,0x00,0x0A,0x29,0x12,0x0C,  /* 00000DE8    ".....).." */
  43.938 +    0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,0x02,  /* 00000DF0    "........" */
  43.939 +    0x00,0x0A,0x2A,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000DF8    "..*....." */
  43.940 +    0xFF,0x06,0x00,0x0A,0x03,0x00,0x0A,0x2B,  /* 00000E00    ".......+" */
  43.941 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x07,0x00,  /* 00000E08    "........" */
  43.942 +    0x00,0x00,0x0A,0x2C,0x12,0x0B,0x04,0x0C,  /* 00000E10    "...,...." */
  43.943 +    0xFF,0xFF,0x07,0x00,0x01,0x00,0x0A,0x2D,  /* 00000E18    ".......-" */
  43.944 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x07,0x00,  /* 00000E20    "........" */
  43.945 +    0x0A,0x02,0x00,0x0A,0x2E,0x12,0x0C,0x04,  /* 00000E28    "........" */
  43.946 +    0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x03,0x00,  /* 00000E30    "........" */
  43.947 +    0x0A,0x2F,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000E38    "./......" */
  43.948 +    0x08,0x00,0x00,0x00,0x0A,0x11,0x12,0x0B,  /* 00000E40    "........" */
  43.949 +    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x01,0x00,  /* 00000E48    "........" */
  43.950 +    0x0A,0x12,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000E50    "........" */
  43.951 +    0x08,0x00,0x0A,0x02,0x00,0x0A,0x13,0x12,  /* 00000E58    "........" */
  43.952 +    0x0C,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,  /* 00000E60    "........" */
  43.953 +    0x03,0x00,0x0A,0x14,0x12,0x0B,0x04,0x0C,  /* 00000E68    "........" */
  43.954 +    0xFF,0xFF,0x09,0x00,0x00,0x00,0x0A,0x15,  /* 00000E70    "........" */
  43.955 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 00000E78    "........" */
  43.956 +    0x01,0x00,0x0A,0x16,0x12,0x0C,0x04,0x0C,  /* 00000E80    "........" */
  43.957 +    0xFF,0xFF,0x09,0x00,0x0A,0x02,0x00,0x0A,  /* 00000E88    "........" */
  43.958 +    0x17,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x09,  /* 00000E90    "........" */
  43.959 +    0x00,0x0A,0x03,0x00,0x0A,0x18,0x12,0x0B,  /* 00000E98    "........" */
  43.960 +    0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x00,0x00,  /* 00000EA0    "........" */
  43.961 +    0x0A,0x19,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000EA8    "........" */
  43.962 +    0x0A,0x00,0x01,0x00,0x0A,0x1A,0x12,0x0C,  /* 00000EB0    "........" */
  43.963 +    0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,0x02,  /* 00000EB8    "........" */
  43.964 +    0x00,0x0A,0x1B,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000EC0    "........" */
  43.965 +    0xFF,0x0A,0x00,0x0A,0x03,0x00,0x0A,0x1C,  /* 00000EC8    "........" */
  43.966 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0B,0x00,  /* 00000ED0    "........" */
  43.967 +    0x00,0x00,0x0A,0x1D,0x12,0x0B,0x04,0x0C,  /* 00000ED8    "........" */
  43.968 +    0xFF,0xFF,0x0B,0x00,0x01,0x00,0x0A,0x1E,  /* 00000EE0    "........" */
  43.969 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0B,0x00,  /* 00000EE8    "........" */
  43.970 +    0x0A,0x02,0x00,0x0A,0x1F,0x12,0x0C,0x04,  /* 00000EF0    "........" */
  43.971 +    0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x03,0x00,  /* 00000EF8    "........" */
  43.972 +    0x0A,0x20,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000F00    ". ......" */
  43.973 +    0x0C,0x00,0x00,0x00,0x0A,0x21,0x12,0x0B,  /* 00000F08    ".....!.." */
  43.974 +    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x01,0x00,  /* 00000F10    "........" */
  43.975 +    0x0A,0x22,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000F18    "."......" */
  43.976 +    0x0C,0x00,0x0A,0x02,0x00,0x0A,0x23,0x12,  /* 00000F20    "......#." */
  43.977 +    0x0C,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,  /* 00000F28    "........" */
  43.978 +    0x03,0x00,0x0A,0x24,0x12,0x0B,0x04,0x0C,  /* 00000F30    "...$...." */
  43.979 +    0xFF,0xFF,0x0D,0x00,0x00,0x00,0x0A,0x25,  /* 00000F38    ".......%" */
  43.980 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 00000F40    "........" */
  43.981 +    0x01,0x00,0x0A,0x26,0x12,0x0C,0x04,0x0C,  /* 00000F48    "...&...." */
  43.982 +    0xFF,0xFF,0x0D,0x00,0x0A,0x02,0x00,0x0A,  /* 00000F50    "........" */
  43.983 +    0x27,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0D,  /* 00000F58    "'......." */
  43.984 +    0x00,0x0A,0x03,0x00,0x0A,0x28,0x12,0x0B,  /* 00000F60    ".....(.." */
  43.985 +    0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x00,0x00,  /* 00000F68    "........" */
  43.986 +    0x0A,0x29,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000F70    ".)......" */
  43.987 +    0x0E,0x00,0x01,0x00,0x0A,0x2A,0x12,0x0C,  /* 00000F78    ".....*.." */
  43.988 +    0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,0x02,  /* 00000F80    "........" */
  43.989 +    0x00,0x0A,0x2B,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000F88    "..+....." */
  43.990 +    0xFF,0x0E,0x00,0x0A,0x03,0x00,0x0A,0x2C,  /* 00000F90    ".......," */
  43.991 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0F,0x00,  /* 00000F98    "........" */
  43.992 +    0x00,0x00,0x0A,0x2D,0x12,0x0B,0x04,0x0C,  /* 00000FA0    "...-...." */
  43.993 +    0xFF,0xFF,0x0F,0x00,0x01,0x00,0x0A,0x2E,  /* 00000FA8    "........" */
  43.994 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0F,0x00,  /* 00000FB0    "........" */
  43.995 +    0x0A,0x02,0x00,0x0A,0x2F,0x12,0x0C,0x04,  /* 00000FB8    "..../..." */
  43.996 +    0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x03,0x00,  /* 00000FC0    "........" */
  43.997 +    0x0A,0x10,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000FC8    "........" */
  43.998 +    0x10,0x00,0x00,0x00,0x0A,0x12,0x12,0x0B,  /* 00000FD0    "........" */
  43.999 +    0x04,0x0C,0xFF,0xFF,0x10,0x00,0x01,0x00,  /* 00000FD8    "........" */
 43.1000 +    0x0A,0x13,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000FE0    "........" */
 43.1001 +    0x10,0x00,0x0A,0x02,0x00,0x0A,0x14,0x12,  /* 00000FE8    "........" */
 43.1002 +    0x0C,0x04,0x0C,0xFF,0xFF,0x10,0x00,0x0A,  /* 00000FF0    "........" */
 43.1003 +    0x03,0x00,0x0A,0x15,0x12,0x0B,0x04,0x0C,  /* 00000FF8    "........" */
 43.1004 +    0xFF,0xFF,0x11,0x00,0x00,0x00,0x0A,0x16,  /* 00001000    "........" */
 43.1005 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x11,0x00,  /* 00001008    "........" */
 43.1006 +    0x01,0x00,0x0A,0x17,0x12,0x0C,0x04,0x0C,  /* 00001010    "........" */
 43.1007 +    0xFF,0xFF,0x11,0x00,0x0A,0x02,0x00,0x0A,  /* 00001018    "........" */
 43.1008 +    0x18,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x11,  /* 00001020    "........" */
 43.1009 +    0x00,0x0A,0x03,0x00,0x0A,0x19,0x12,0x0B,  /* 00001028    "........" */
 43.1010 +    0x04,0x0C,0xFF,0xFF,0x12,0x00,0x00,0x00,  /* 00001030    "........" */
 43.1011 +    0x0A,0x1A,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00001038    "........" */
 43.1012 +    0x12,0x00,0x01,0x00,0x0A,0x1B,0x12,0x0C,  /* 00001040    "........" */
 43.1013 +    0x04,0x0C,0xFF,0xFF,0x12,0x00,0x0A,0x02,  /* 00001048    "........" */
 43.1014 +    0x00,0x0A,0x1C,0x12,0x0C,0x04,0x0C,0xFF,  /* 00001050    "........" */
 43.1015 +    0xFF,0x12,0x00,0x0A,0x03,0x00,0x0A,0x1D,  /* 00001058    "........" */
 43.1016 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x13,0x00,  /* 00001060    "........" */
 43.1017 +    0x00,0x00,0x0A,0x1E,0x12,0x0B,0x04,0x0C,  /* 00001068    "........" */
 43.1018 +    0xFF,0xFF,0x13,0x00,0x01,0x00,0x0A,0x1F,  /* 00001070    "........" */
 43.1019 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x13,0x00,  /* 00001078    "........" */
 43.1020 +    0x0A,0x02,0x00,0x0A,0x20,0x12,0x0C,0x04,  /* 00001080    ".... ..." */
 43.1021 +    0x0C,0xFF,0xFF,0x13,0x00,0x0A,0x03,0x00,  /* 00001088    "........" */
 43.1022 +    0x0A,0x21,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00001090    ".!......" */
 43.1023 +    0x14,0x00,0x00,0x00,0x0A,0x22,0x12,0x0B,  /* 00001098    ".....".." */
 43.1024 +    0x04,0x0C,0xFF,0xFF,0x14,0x00,0x01,0x00,  /* 000010A0    "........" */
 43.1025 +    0x0A,0x23,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 000010A8    ".#......" */
 43.1026 +    0x14,0x00,0x0A,0x02,0x00,0x0A,0x24,0x12,  /* 000010B0    "......$." */
 43.1027 +    0x0C,0x04,0x0C,0xFF,0xFF,0x14,0x00,0x0A,  /* 000010B8    "........" */
 43.1028 +    0x03,0x00,0x0A,0x25,0x12,0x0B,0x04,0x0C,  /* 000010C0    "...%...." */
 43.1029 +    0xFF,0xFF,0x15,0x00,0x00,0x00,0x0A,0x26,  /* 000010C8    ".......&" */
 43.1030 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x15,0x00,  /* 000010D0    "........" */
 43.1031 +    0x01,0x00,0x0A,0x27,0x12,0x0C,0x04,0x0C,  /* 000010D8    "...'...." */
 43.1032 +    0xFF,0xFF,0x15,0x00,0x0A,0x02,0x00,0x0A,  /* 000010E0    "........" */
 43.1033 +    0x28,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x15,  /* 000010E8    "(......." */
 43.1034 +    0x00,0x0A,0x03,0x00,0x0A,0x29,0x12,0x0B,  /* 000010F0    ".....).." */
 43.1035 +    0x04,0x0C,0xFF,0xFF,0x16,0x00,0x00,0x00,  /* 000010F8    "........" */
 43.1036 +    0x0A,0x2A,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00001100    ".*......" */
 43.1037 +    0x16,0x00,0x01,0x00,0x0A,0x2B,0x12,0x0C,  /* 00001108    ".....+.." */
 43.1038 +    0x04,0x0C,0xFF,0xFF,0x16,0x00,0x0A,0x02,  /* 00001110    "........" */
 43.1039 +    0x00,0x0A,0x2C,0x12,0x0C,0x04,0x0C,0xFF,  /* 00001118    "..,....." */
 43.1040 +    0xFF,0x16,0x00,0x0A,0x03,0x00,0x0A,0x2D,  /* 00001120    ".......-" */
 43.1041 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x17,0x00,  /* 00001128    "........" */
 43.1042 +    0x00,0x00,0x0A,0x2E,0x12,0x0B,0x04,0x0C,  /* 00001130    "........" */
 43.1043 +    0xFF,0xFF,0x17,0x00,0x01,0x00,0x0A,0x2F,  /* 00001138    "......./" */
 43.1044 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x17,0x00,  /* 00001140    "........" */
 43.1045 +    0x0A,0x02,0x00,0x0A,0x10,0x12,0x0C,0x04,  /* 00001148    "........" */
 43.1046 +    0x0C,0xFF,0xFF,0x17,0x00,0x0A,0x03,0x00,  /* 00001150    "........" */
 43.1047 +    0x0A,0x11,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00001158    "........" */
 43.1048 +    0x18,0x00,0x00,0x00,0x0A,0x13,0x12,0x0B,  /* 00001160    "........" */
 43.1049 +    0x04,0x0C,0xFF,0xFF,0x18,0x00,0x01,0x00,  /* 00001168    "........" */
 43.1050 +    0x0A,0x14,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00001170    "........" */
 43.1051 +    0x18,0x00,0x0A,0x02,0x00,0x0A,0x15,0x12,  /* 00001178    "........" */
 43.1052 +    0x0C,0x04,0x0C,0xFF,0xFF,0x18,0x00,0x0A,  /* 00001180    "........" */
 43.1053 +    0x03,0x00,0x0A,0x16,0x12,0x0B,0x04,0x0C,  /* 00001188    "........" */
 43.1054 +    0xFF,0xFF,0x19,0x00,0x00,0x00,0x0A,0x17,  /* 00001190    "........" */
 43.1055 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x19,0x00,  /* 00001198    "........" */
 43.1056 +    0x01,0x00,0x0A,0x18,0x12,0x0C,0x04,0x0C,  /* 000011A0    "........" */
 43.1057 +    0xFF,0xFF,0x19,0x00,0x0A,0x02,0x00,0x0A,  /* 000011A8    "........" */
 43.1058 +    0x19,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x19,  /* 000011B0    "........" */
 43.1059 +    0x00,0x0A,0x03,0x00,0x0A,0x1A,0x12,0x0B,  /* 000011B8    "........" */
 43.1060 +    0x04,0x0C,0xFF,0xFF,0x1A,0x00,0x00,0x00,  /* 000011C0    "........" */
 43.1061 +    0x0A,0x1B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000011C8    "........" */
 43.1062 +    0x1A,0x00,0x01,0x00,0x0A,0x1C,0x12,0x0C,  /* 000011D0    "........" */
 43.1063 +    0x04,0x0C,0xFF,0xFF,0x1A,0x00,0x0A,0x02,  /* 000011D8    "........" */
 43.1064 +    0x00,0x0A,0x1D,0x12,0x0C,0x04,0x0C,0xFF,  /* 000011E0    "........" */
 43.1065 +    0xFF,0x1A,0x00,0x0A,0x03,0x00,0x0A,0x1E,  /* 000011E8    "........" */
 43.1066 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x1B,0x00,  /* 000011F0    "........" */
 43.1067 +    0x00,0x00,0x0A,0x1F,0x12,0x0B,0x04,0x0C,  /* 000011F8    "........" */
 43.1068 +    0xFF,0xFF,0x1B,0x00,0x01,0x00,0x0A,0x20,  /* 00001200    "....... " */
 43.1069 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x1B,0x00,  /* 00001208    "........" */
 43.1070 +    0x0A,0x02,0x00,0x0A,0x21,0x12,0x0C,0x04,  /* 00001210    "....!..." */
 43.1071 +    0x0C,0xFF,0xFF,0x1B,0x00,0x0A,0x03,0x00,  /* 00001218    "........" */
 43.1072 +    0x0A,0x22,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00001220    "."......" */
 43.1073 +    0x1C,0x00,0x00,0x00,0x0A,0x23,0x12,0x0B,  /* 00001228    ".....#.." */
 43.1074 +    0x04,0x0C,0xFF,0xFF,0x1C,0x00,0x01,0x00,  /* 00001230    "........" */
 43.1075 +    0x0A,0x24,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00001238    ".$......" */
 43.1076 +    0x1C,0x00,0x0A,0x02,0x00,0x0A,0x25,0x12,  /* 00001240    "......%." */
 43.1077 +    0x0C,0x04,0x0C,0xFF,0xFF,0x1C,0x00,0x0A,  /* 00001248    "........" */
 43.1078 +    0x03,0x00,0x0A,0x26,0x12,0x0B,0x04,0x0C,  /* 00001250    "...&...." */
 43.1079 +    0xFF,0xFF,0x1D,0x00,0x00,0x00,0x0A,0x27,  /* 00001258    ".......'" */
 43.1080 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x1D,0x00,  /* 00001260    "........" */
 43.1081 +    0x01,0x00,0x0A,0x28,0x12,0x0C,0x04,0x0C,  /* 00001268    "...(...." */
 43.1082 +    0xFF,0xFF,0x1D,0x00,0x0A,0x02,0x00,0x0A,  /* 00001270    "........" */
 43.1083 +    0x29,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x1D,  /* 00001278    ")......." */
 43.1084 +    0x00,0x0A,0x03,0x00,0x0A,0x2A,0x12,0x0B,  /* 00001280    ".....*.." */
 43.1085 +    0x04,0x0C,0xFF,0xFF,0x1E,0x00,0x00,0x00,  /* 00001288    "........" */
 43.1086 +    0x0A,0x2B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00001290    ".+......" */
 43.1087 +    0x1E,0x00,0x01,0x00,0x0A,0x2C,0x12,0x0C,  /* 00001298    ".....,.." */
 43.1088 +    0x04,0x0C,0xFF,0xFF,0x1E,0x00,0x0A,0x02,  /* 000012A0    "........" */
 43.1089 +    0x00,0x0A,0x2D,0x12,0x0C,0x04,0x0C,0xFF,  /* 000012A8    "..-....." */
 43.1090 +    0xFF,0x1E,0x00,0x0A,0x03,0x00,0x0A,0x2E,  /* 000012B0    "........" */
 43.1091 +    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x1F,0x00,  /* 000012B8    "........" */
 43.1092 +    0x00,0x00,0x0A,0x2F,0x12,0x0B,0x04,0x0C,  /* 000012C0    ".../...." */
 43.1093 +    0xFF,0xFF,0x1F,0x00,0x01,0x00,0x0A,0x10,  /* 000012C8    "........" */
 43.1094 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x1F,0x00,  /* 000012D0    "........" */
 43.1095 +    0x0A,0x02,0x00,0x0A,0x11,0x12,0x0C,0x04,  /* 000012D8    "........" */
 43.1096 +    0x0C,0xFF,0xFF,0x1F,0x00,0x0A,0x03,0x00,  /* 000012E0    "........" */
 43.1097 +    0x0A,0x12,0x5B,0x82,0x46,0x37,0x49,0x53,  /* 000012E8    "..[.F7IS" */
 43.1098 +    0x41,0x5F,0x08,0x5F,0x41,0x44,0x52,0x0C,  /* 000012F0    "A_._ADR." */
 43.1099 +    0x00,0x00,0x01,0x00,0x5B,0x80,0x50,0x49,  /* 000012F8    "....[.PI" */
 43.1100 +    0x52,0x51,0x02,0x0A,0x60,0x0A,0x04,0x10,  /* 00001300    "RQ..`..." */
 43.1101 +    0x2E,0x5C,0x00,0x5B,0x81,0x29,0x5C,0x2F,  /* 00001308    ".\.[.)\/" */
 43.1102 +    0x04,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001310    "._SB_PCI" */
 43.1103 +    0x30,0x49,0x53,0x41,0x5F,0x50,0x49,0x52,  /* 00001318    "0ISA_PIR" */
 43.1104 +    0x51,0x01,0x50,0x49,0x52,0x41,0x08,0x50,  /* 00001320    "Q.PIRA.P" */
 43.1105 +    0x49,0x52,0x42,0x08,0x50,0x49,0x52,0x43,  /* 00001328    "IRB.PIRC" */
 43.1106 +    0x08,0x50,0x49,0x52,0x44,0x08,0x5B,0x82,  /* 00001330    ".PIRD.[." */
 43.1107 +    0x46,0x0B,0x53,0x59,0x53,0x52,0x08,0x5F,  /* 00001338    "F.SYSR._" */
 43.1108 +    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x02,  /* 00001340    "HID.A..." */
 43.1109 +    0x08,0x5F,0x55,0x49,0x44,0x01,0x08,0x43,  /* 00001348    "._UID..C" */
 43.1110 +    0x52,0x53,0x5F,0x11,0x4E,0x08,0x0A,0x8A,  /* 00001350    "RS_.N..." */
 43.1111 +    0x47,0x01,0x10,0x00,0x10,0x00,0x00,0x10,  /* 00001358    "G......." */
 43.1112 +    0x47,0x01,0x22,0x00,0x22,0x00,0x00,0x0C,  /* 00001360    "G."."..." */
 43.1113 +    0x47,0x01,0x30,0x00,0x30,0x00,0x00,0x10,  /* 00001368    "G.0.0..." */
 43.1114 +    0x47,0x01,0x44,0x00,0x44,0x00,0x00,0x1C,  /* 00001370    "G.D.D..." */
 43.1115 +    0x47,0x01,0x62,0x00,0x62,0x00,0x00,0x02,  /* 00001378    "G.b.b..." */
 43.1116 +    0x47,0x01,0x65,0x00,0x65,0x00,0x00,0x0B,  /* 00001380    "G.e.e..." */
 43.1117 +    0x47,0x01,0x72,0x00,0x72,0x00,0x00,0x0E,  /* 00001388    "G.r.r..." */
 43.1118 +    0x47,0x01,0x80,0x00,0x80,0x00,0x00,0x01,  /* 00001390    "G......." */
 43.1119 +    0x47,0x01,0x84,0x00,0x84,0x00,0x00,0x03,  /* 00001398    "G......." */
 43.1120 +    0x47,0x01,0x88,0x00,0x88,0x00,0x00,0x01,  /* 000013A0    "G......." */
 43.1121 +    0x47,0x01,0x8C,0x00,0x8C,0x00,0x00,0x03,  /* 000013A8    "G......." */
 43.1122 +    0x47,0x01,0x90,0x00,0x90,0x00,0x00,0x10,  /* 000013B0    "G......." */
 43.1123 +    0x47,0x01,0xA2,0x00,0xA2,0x00,0x00,0x1C,  /* 000013B8    "G......." */
 43.1124 +    0x47,0x01,0xE0,0x00,0xE0,0x00,0x00,0x10,  /* 000013C0    "G......." */
 43.1125 +    0x47,0x01,0xA0,0x08,0xA0,0x08,0x00,0x04,  /* 000013C8    "G......." */
 43.1126 +    0x47,0x01,0xC0,0x0C,0xC0,0x0C,0x00,0x10,  /* 000013D0    "G......." */
 43.1127 +    0x47,0x01,0xD0,0x04,0xD0,0x04,0x00,0x02,  /* 000013D8    "G......." */
 43.1128 +    0x79,0x00,0x14,0x0B,0x5F,0x43,0x52,0x53,  /* 000013E0    "y..._CRS" */
 43.1129 +    0x00,0xA4,0x43,0x52,0x53,0x5F,0x5B,0x82,  /* 000013E8    "..CRS_[." */
 43.1130 +    0x2B,0x50,0x49,0x43,0x5F,0x08,0x5F,0x48,  /* 000013F0    "+PIC_._H" */
 43.1131 +    0x49,0x44,0x0B,0x41,0xD0,0x08,0x5F,0x43,  /* 000013F8    "ID.A.._C" */
 43.1132 +    0x52,0x53,0x11,0x18,0x0A,0x15,0x47,0x01,  /* 00001400    "RS....G." */
 43.1133 +    0x20,0x00,0x20,0x00,0x01,0x02,0x47,0x01,  /* 00001408    " . ...G." */
 43.1134 +    0xA0,0x00,0xA0,0x00,0x01,0x02,0x22,0x04,  /* 00001410    "......"." */
 43.1135 +    0x00,0x79,0x00,0x5B,0x82,0x47,0x05,0x44,  /* 00001418    ".y.[.G.D" */
 43.1136 +    0x4D,0x41,0x30,0x08,0x5F,0x48,0x49,0x44,  /* 00001420    "MA0._HID" */
 43.1137 +    0x0C,0x41,0xD0,0x02,0x00,0x08,0x5F,0x43,  /* 00001428    ".A...._C" */
 43.1138 +    0x52,0x53,0x11,0x41,0x04,0x0A,0x3D,0x2A,  /* 00001430    "RS.A..=*" */
 43.1139 +    0x10,0x04,0x47,0x01,0x00,0x00,0x00,0x00,  /* 00001438    "..G....." */
 43.1140 +    0x00,0x10,0x47,0x01,0x81,0x00,0x81,0x00,  /* 00001440    "..G....." */
 43.1141 +    0x00,0x03,0x47,0x01,0x87,0x00,0x87,0x00,  /* 00001448    "..G....." */
 43.1142 +    0x00,0x01,0x47,0x01,0x89,0x00,0x89,0x00,  /* 00001450    "..G....." */
 43.1143 +    0x00,0x03,0x47,0x01,0x8F,0x00,0x8F,0x00,  /* 00001458    "..G....." */
 43.1144 +    0x00,0x01,0x47,0x01,0xC0,0x00,0xC0,0x00,  /* 00001460    "..G....." */
 43.1145 +    0x00,0x20,0x47,0x01,0x80,0x04,0x80,0x04,  /* 00001468    ". G....." */
 43.1146 +    0x00,0x10,0x79,0x00,0x5B,0x82,0x25,0x54,  /* 00001470    "..y.[.%T" */
 43.1147 +    0x4D,0x52,0x5F,0x08,0x5F,0x48,0x49,0x44,  /* 00001478    "MR_._HID" */
 43.1148 +    0x0C,0x41,0xD0,0x01,0x00,0x08,0x5F,0x43,  /* 00001480    ".A...._C" */
 43.1149 +    0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,0x01,  /* 00001488    "RS....G." */
 43.1150 +    0x40,0x00,0x40,0x00,0x00,0x04,0x22,0x01,  /* 00001490    "@.@..."." */
 43.1151 +    0x00,0x79,0x00,0x5B,0x82,0x25,0x52,0x54,  /* 00001498    ".y.[.%RT" */
 43.1152 +    0x43,0x5F,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 000014A0    "C_._HID." */
 43.1153 +    0x41,0xD0,0x0B,0x00,0x08,0x5F,0x43,0x52,  /* 000014A8    "A...._CR" */
 43.1154 +    0x53,0x11,0x10,0x0A,0x0D,0x47,0x01,0x70,  /* 000014B0    "S....G.p" */
 43.1155 +    0x00,0x70,0x00,0x00,0x02,0x22,0x00,0x01,  /* 000014B8    ".p...".." */
 43.1156 +    0x79,0x00,0x5B,0x82,0x22,0x53,0x50,0x4B,  /* 000014C0    "y.[."SPK" */
 43.1157 +    0x52,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 000014C8    "R._HID.A" */
 43.1158 +    0xD0,0x08,0x00,0x08,0x5F,0x43,0x52,0x53,  /* 000014D0    "...._CRS" */
 43.1159 +    0x11,0x0D,0x0A,0x0A,0x47,0x01,0x61,0x00,  /* 000014D8    "....G.a." */
 43.1160 +    0x61,0x00,0x00,0x01,0x79,0x00,0x5B,0x82,  /* 000014E0    "a...y.[." */
 43.1161 +    0x31,0x50,0x53,0x32,0x4D,0x08,0x5F,0x48,  /* 000014E8    "1PS2M._H" */
 43.1162 +    0x49,0x44,0x0C,0x41,0xD0,0x0F,0x13,0x08,  /* 000014F0    "ID.A...." */
 43.1163 +    0x5F,0x43,0x49,0x44,0x0C,0x41,0xD0,0x0F,  /* 000014F8    "_CID.A.." */
 43.1164 +    0x13,0x14,0x09,0x5F,0x53,0x54,0x41,0x00,  /* 00001500    "..._STA." */
 43.1165 +    0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,  /* 00001508    "...._CRS" */
 43.1166 +    0x11,0x08,0x0A,0x05,0x22,0x00,0x10,0x79,  /* 00001510    "...."..y" */
 43.1167 +    0x00,0x5B,0x82,0x42,0x04,0x50,0x53,0x32,  /* 00001518    ".[.B.PS2" */
 43.1168 +    0x4B,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00001520    "K._HID.A" */
 43.1169 +    0xD0,0x03,0x03,0x08,0x5F,0x43,0x49,0x44,  /* 00001528    "...._CID" */
 43.1170 +    0x0C,0x41,0xD0,0x03,0x0B,0x14,0x09,0x5F,  /* 00001530    ".A....._" */
 43.1171 +    0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,  /* 00001538    "STA....." */
 43.1172 +    0x5F,0x43,0x52,0x53,0x11,0x18,0x0A,0x15,  /* 00001540    "_CRS...." */
 43.1173 +    0x47,0x01,0x60,0x00,0x60,0x00,0x00,0x01,  /* 00001548    "G.`.`..." */
 43.1174 +    0x47,0x01,0x64,0x00,0x64,0x00,0x00,0x01,  /* 00001550    "G.d.d..." */
 43.1175 +    0x22,0x02,0x00,0x79,0x00,0x5B,0x82,0x3A,  /* 00001558    ""..y.[.:" */
 43.1176 +    0x46,0x44,0x43,0x30,0x08,0x5F,0x48,0x49,  /* 00001560    "FDC0._HI" */
 43.1177 +    0x44,0x0C,0x41,0xD0,0x07,0x00,0x14,0x09,  /* 00001568    "D.A....." */
 43.1178 +    0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,  /* 00001570    "_STA...." */
 43.1179 +    0x08,0x5F,0x43,0x52,0x53,0x11,0x1B,0x0A,  /* 00001578    "._CRS..." */
 43.1180 +    0x18,0x47,0x01,0xF0,0x03,0xF0,0x03,0x01,  /* 00001580    ".G......" */
 43.1181 +    0x06,0x47,0x01,0xF7,0x03,0xF7,0x03,0x01,  /* 00001588    ".G......" */
 43.1182 +    0x01,0x22,0x40,0x00,0x2A,0x04,0x00,0x79,  /* 00001590    "."@.*..y" */
 43.1183 +    0x00,0x5B,0x82,0x46,0x04,0x55,0x41,0x52,  /* 00001598    ".[.F.UAR" */
 43.1184 +    0x31,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 000015A0    "1._HID.A" */
 43.1185 +    0xD0,0x05,0x01,0x08,0x5F,0x55,0x49,0x44,  /* 000015A8    "...._UID" */
 43.1186 +    0x01,0x14,0x19,0x5F,0x53,0x54,0x41,0x00,  /* 000015B0    "..._STA." */
 43.1187 +    0xA0,0x0D,0x93,0x5E,0x5E,0x5E,0x5E,0x55,  /* 000015B8    "...^^^^U" */
 43.1188 +    0x41,0x52,0x31,0x00,0xA4,0x00,0xA1,0x04,  /* 000015C0    "AR1....." */
 43.1189 +    0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,  /* 000015C8    "...._CRS" */
 43.1190 +    0x11,0x10,0x0A,0x0D,0x47,0x01,0xF8,0x03,  /* 000015D0    "....G..." */
 43.1191 +    0xF8,0x03,0x08,0x08,0x22,0x10,0x00,0x79,  /* 000015D8    "...."..y" */
 43.1192 +    0x00,0x5B,0x82,0x47,0x04,0x55,0x41,0x52,  /* 000015E0    ".[.G.UAR" */
 43.1193 +    0x32,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 000015E8    "2._HID.A" */
 43.1194 +    0xD0,0x05,0x01,0x08,0x5F,0x55,0x49,0x44,  /* 000015F0    "...._UID" */
 43.1195 +    0x0A,0x02,0x14,0x19,0x5F,0x53,0x54,0x41,  /* 000015F8    "...._STA" */
 43.1196 +    0x00,0xA0,0x0D,0x93,0x5E,0x5E,0x5E,0x5E,  /* 00001600    "....^^^^" */
 43.1197 +    0x55,0x41,0x52,0x32,0x00,0xA4,0x00,0xA1,  /* 00001608    "UAR2...." */
 43.1198 +    0x04,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,  /* 00001610    "....._CR" */
 43.1199 +    0x53,0x11,0x10,0x0A,0x0D,0x47,0x01,0xF8,  /* 00001618    "S....G.." */
 43.1200 +    0x02,0xF8,0x02,0x08,0x08,0x22,0x08,0x00,  /* 00001620    ".....".." */
 43.1201 +    0x79,0x00,0x5B,0x82,0x36,0x4C,0x54,0x50,  /* 00001628    "y.[.6LTP" */
 43.1202 +    0x31,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00001630    "1._HID.A" */
 43.1203 +    0xD0,0x04,0x00,0x08,0x5F,0x55,0x49,0x44,  /* 00001638    "...._UID" */
 43.1204 +    0x0A,0x02,0x14,0x09,0x5F,0x53,0x54,0x41,  /* 00001640    "...._STA" */
 43.1205 +    0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,  /* 00001648    "....._CR" */
 43.1206 +    0x53,0x11,0x10,0x0A,0x0D,0x47,0x01,0x78,  /* 00001650    "S....G.x" */
 43.1207 +    0x03,0x78,0x03,0x08,0x08,0x22,0x80,0x00,  /* 00001658    ".x...".." */
 43.1208 +    0x79,0x00,0x5B,0x82,0x49,0x0A,0x53,0x30,  /* 00001660    "y.[.I.S0" */
 43.1209 +    0x30,0x5F,0x08,0x5F,0x41,0x44,0x52,0x00,  /* 00001668    "0_._ADR." */
 43.1210 +    0x08,0x5F,0x53,0x55,0x4E,0x00,0x14,0x1F,  /* 00001670    "._SUN..." */
 43.1211 +    0x5F,0x50,0x53,0x30,0x00,0x70,0x00,0x5C,  /* 00001678    "_PS0.p.\" */
 43.1212 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001680    "._GPEDPT" */
 43.1213 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00001688    "1p..\._G" */
 43.1214 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x1F,  /* 00001690    "PEDPT2.." */
 43.1215 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x00,0x5C,  /* 00001698    "_PS3.p.\" */
 43.1216 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000016A0    "._GPEDPT" */
 43.1217 +    0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,0x47,  /* 000016A8    "1p..\._G" */
 43.1218 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x2B,  /* 000016B0    "PEDPT2.+" */
 43.1219 +    0x5F,0x45,0x4A,0x30,0x01,0x70,0x00,0x5C,  /* 000016B8    "_EJ0.p.\" */
 43.1220 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000016C0    "._GPEDPT" */
 43.1221 +    0x31,0x70,0x0A,0x88,0x5C,0x2E,0x5F,0x47,  /* 000016C8    "1p..\._G" */
 43.1222 +    0x50,0x45,0x44,0x50,0x54,0x32,0x70,0x01,  /* 000016D0    "PEDPT2p." */
 43.1223 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x50,0x48,  /* 000016D8    "\._GPEPH" */
 43.1224 +    0x30,0x30,0x14,0x2A,0x5F,0x53,0x54,0x41,  /* 000016E0    "00.*_STA" */
 43.1225 +    0x00,0x70,0x00,0x5C,0x2E,0x5F,0x47,0x50,  /* 000016E8    ".p.\._GP" */
 43.1226 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x89,  /* 000016F0    "EDPT1p.." */
 43.1227 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 000016F8    "\._GPEDP" */
 43.1228 +    0x54,0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001700    "T2.\._GP" */
 43.1229 +    0x45,0x50,0x48,0x30,0x30,0x5B,0x82,0x4D,  /* 00001708    "EPH00[.M" */
 43.1230 +    0x0A,0x53,0x30,0x31,0x5F,0x08,0x5F,0x41,  /* 00001710    ".S01_._A" */
 43.1231 +    0x44,0x52,0x0C,0x00,0x00,0x01,0x00,0x08,  /* 00001718    "DR......" */
 43.1232 +    0x5F,0x53,0x55,0x4E,0x01,0x14,0x1F,0x5F,  /* 00001720    "_SUN..._" */
 43.1233 +    0x50,0x53,0x30,0x00,0x70,0x01,0x5C,0x2E,  /* 00001728    "PS0.p.\." */
 43.1234 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00001730    "_GPEDPT1" */
 43.1235 +    0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001738    "p..\._GP" */
 43.1236 +    0x45,0x44,0x50,0x54,0x32,0x14,0x1F,0x5F,  /* 00001740    "EDPT2.._" */
 43.1237 +    0x50,0x53,0x33,0x00,0x70,0x01,0x5C,0x2E,  /* 00001748    "PS3.p.\." */
 43.1238 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00001750    "_GPEDPT1" */
 43.1239 +    0x70,0x0A,0x83,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001758    "p..\._GP" */
 43.1240 +    0x45,0x44,0x50,0x54,0x32,0x14,0x2B,0x5F,  /* 00001760    "EDPT2.+_" */
 43.1241 +    0x45,0x4A,0x30,0x01,0x70,0x01,0x5C,0x2E,  /* 00001768    "EJ0.p.\." */
 43.1242 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00001770    "_GPEDPT1" */
 43.1243 +    0x70,0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001778    "p..\._GP" */
 43.1244 +    0x45,0x44,0x50,0x54,0x32,0x70,0x01,0x5C,  /* 00001780    "EDPT2p.\" */
 43.1245 +    0x2E,0x5F,0x47,0x50,0x45,0x50,0x48,0x30,  /* 00001788    "._GPEPH0" */
 43.1246 +    0x31,0x14,0x2A,0x5F,0x53,0x54,0x41,0x00,  /* 00001790    "1.*_STA." */
 43.1247 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001798    "p.\._GPE" */
 43.1248 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 000017A0    "DPT1p..\" */
 43.1249 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000017A8    "._GPEDPT" */
 43.1250 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000017B0    "2.\._GPE" */
 43.1251 +    0x50,0x48,0x30,0x31,0x5B,0x82,0x42,0x0B,  /* 000017B8    "PH01[.B." */
 43.1252 +    0x53,0x30,0x32,0x5F,0x08,0x5F,0x41,0x44,  /* 000017C0    "S02_._AD" */
 43.1253 +    0x52,0x0C,0x00,0x00,0x02,0x00,0x08,0x5F,  /* 000017C8    "R......_" */
 43.1254 +    0x53,0x55,0x4E,0x0A,0x02,0x14,0x20,0x5F,  /* 000017D0    "SUN... _" */
 43.1255 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x02,0x5C,  /* 000017D8    "PS0.p..\" */
 43.1256 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000017E0    "._GPEDPT" */
 43.1257 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 000017E8    "1p..\._G" */
 43.1258 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 000017F0    "PEDPT2. " */
 43.1259 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x02,  /* 000017F8    "_PS3.p.." */
 43.1260 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001800    "\._GPEDP" */
 43.1261 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00001808    "T1p..\._" */
 43.1262 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00001810    "GPEDPT2." */
 43.1263 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00001818    ",_EJ0.p." */
 43.1264 +    0x02,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001820    ".\._GPED" */
 43.1265 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00001828    "PT1p..\." */
 43.1266 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001830    "_GPEDPT2" */
 43.1267 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001838    "p.\._GPE" */
 43.1268 +    0x50,0x48,0x30,0x32,0x14,0x2B,0x5F,0x53,  /* 00001840    "PH02.+_S" */
 43.1269 +    0x54,0x41,0x00,0x70,0x0A,0x02,0x5C,0x2E,  /* 00001848    "TA.p..\." */
 43.1270 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00001850    "_GPEDPT1" */
 43.1271 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001858    "p..\._GP" */
 43.1272 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00001860    "EDPT2.\." */
 43.1273 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x32,  /* 00001868    "_GPEPH02" */
 43.1274 +    0x5B,0x82,0x42,0x0B,0x53,0x30,0x33,0x5F,  /* 00001870    "[.B.S03_" */
 43.1275 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00001878    "._ADR..." */
 43.1276 +    0x03,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00001880    "..._SUN." */
 43.1277 +    0x03,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00001888    ".. _PS0." */
 43.1278 +    0x70,0x0A,0x03,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001890    "p..\._GP" */
 43.1279 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00001898    "EDPT1p.." */
 43.1280 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 000018A0    "\._GPEDP" */
 43.1281 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 000018A8    "T2. _PS3" */
 43.1282 +    0x00,0x70,0x0A,0x03,0x5C,0x2E,0x5F,0x47,  /* 000018B0    ".p..\._G" */
 43.1283 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 000018B8    "PEDPT1p." */
 43.1284 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 000018C0    ".\._GPED" */
 43.1285 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 000018C8    "PT2.,_EJ" */
 43.1286 +    0x30,0x01,0x70,0x0A,0x03,0x5C,0x2E,0x5F,  /* 000018D0    "0.p..\._" */
 43.1287 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 000018D8    "GPEDPT1p" */
 43.1288 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000018E0    "..\._GPE" */
 43.1289 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 000018E8    "DPT2p.\." */
 43.1290 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x33,  /* 000018F0    "_GPEPH03" */
 43.1291 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 000018F8    ".+_STA.p" */
 43.1292 +    0x0A,0x03,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001900    "..\._GPE" */
 43.1293 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00001908    "DPT1p..\" */
 43.1294 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001910    "._GPEDPT" */
 43.1295 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001918    "2.\._GPE" */
 43.1296 +    0x50,0x48,0x30,0x33,0x5B,0x82,0x42,0x0B,  /* 00001920    "PH03[.B." */
 43.1297 +    0x53,0x30,0x34,0x5F,0x08,0x5F,0x41,0x44,  /* 00001928    "S04_._AD" */
 43.1298 +    0x52,0x0C,0x00,0x00,0x04,0x00,0x08,0x5F,  /* 00001930    "R......_" */
 43.1299 +    0x53,0x55,0x4E,0x0A,0x04,0x14,0x20,0x5F,  /* 00001938    "SUN... _" */
 43.1300 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x04,0x5C,  /* 00001940    "PS0.p..\" */
 43.1301 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001948    "._GPEDPT" */
 43.1302 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00001950    "1p..\._G" */
 43.1303 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00001958    "PEDPT2. " */
 43.1304 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x04,  /* 00001960    "_PS3.p.." */
 43.1305 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001968    "\._GPEDP" */
 43.1306 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00001970    "T1p..\._" */
 43.1307 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00001978    "GPEDPT2." */
 43.1308 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00001980    ",_EJ0.p." */
 43.1309 +    0x04,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001988    ".\._GPED" */
 43.1310 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00001990    "PT1p..\." */
 43.1311 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001998    "_GPEDPT2" */
 43.1312 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000019A0    "p.\._GPE" */
 43.1313 +    0x50,0x48,0x30,0x34,0x14,0x2B,0x5F,0x53,  /* 000019A8    "PH04.+_S" */
 43.1314 +    0x54,0x41,0x00,0x70,0x0A,0x04,0x5C,0x2E,  /* 000019B0    "TA.p..\." */
 43.1315 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 000019B8    "_GPEDPT1" */
 43.1316 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 000019C0    "p..\._GP" */
 43.1317 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 000019C8    "EDPT2.\." */
 43.1318 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x34,  /* 000019D0    "_GPEPH04" */
 43.1319 +    0x5B,0x82,0x42,0x0B,0x53,0x30,0x35,0x5F,  /* 000019D8    "[.B.S05_" */
 43.1320 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 000019E0    "._ADR..." */
 43.1321 +    0x05,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 000019E8    "..._SUN." */
 43.1322 +    0x05,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 000019F0    ".. _PS0." */
 43.1323 +    0x70,0x0A,0x05,0x5C,0x2E,0x5F,0x47,0x50,  /* 000019F8    "p..\._GP" */
 43.1324 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00001A00    "EDPT1p.." */
 43.1325 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001A08    "\._GPEDP" */
 43.1326 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00001A10    "T2. _PS3" */
 43.1327 +    0x00,0x70,0x0A,0x05,0x5C,0x2E,0x5F,0x47,  /* 00001A18    ".p..\._G" */
 43.1328 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00001A20    "PEDPT1p." */
 43.1329 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001A28    ".\._GPED" */
 43.1330 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00001A30    "PT2.,_EJ" */
 43.1331 +    0x30,0x01,0x70,0x0A,0x05,0x5C,0x2E,0x5F,  /* 00001A38    "0.p..\._" */
 43.1332 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00001A40    "GPEDPT1p" */
 43.1333 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001A48    "..\._GPE" */
 43.1334 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00001A50    "DPT2p.\." */
 43.1335 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x35,  /* 00001A58    "_GPEPH05" */
 43.1336 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00001A60    ".+_STA.p" */
 43.1337 +    0x0A,0x05,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001A68    "..\._GPE" */
 43.1338 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00001A70    "DPT1p..\" */
 43.1339 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001A78    "._GPEDPT" */
 43.1340 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001A80    "2.\._GPE" */
 43.1341 +    0x50,0x48,0x30,0x35,0x5B,0x82,0x42,0x0B,  /* 00001A88    "PH05[.B." */
 43.1342 +    0x53,0x30,0x36,0x5F,0x08,0x5F,0x41,0x44,  /* 00001A90    "S06_._AD" */
 43.1343 +    0x52,0x0C,0x00,0x00,0x06,0x00,0x08,0x5F,  /* 00001A98    "R......_" */
 43.1344 +    0x53,0x55,0x4E,0x0A,0x06,0x14,0x20,0x5F,  /* 00001AA0    "SUN... _" */
 43.1345 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x06,0x5C,  /* 00001AA8    "PS0.p..\" */
 43.1346 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001AB0    "._GPEDPT" */
 43.1347 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00001AB8    "1p..\._G" */
 43.1348 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00001AC0    "PEDPT2. " */
 43.1349 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x06,  /* 00001AC8    "_PS3.p.." */
 43.1350 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001AD0    "\._GPEDP" */
 43.1351 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00001AD8    "T1p..\._" */
 43.1352 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00001AE0    "GPEDPT2." */
 43.1353 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00001AE8    ",_EJ0.p." */
 43.1354 +    0x06,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001AF0    ".\._GPED" */
 43.1355 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00001AF8    "PT1p..\." */
 43.1356 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001B00    "_GPEDPT2" */
 43.1357 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001B08    "p.\._GPE" */
 43.1358 +    0x50,0x48,0x30,0x36,0x14,0x2B,0x5F,0x53,  /* 00001B10    "PH06.+_S" */
 43.1359 +    0x54,0x41,0x00,0x70,0x0A,0x06,0x5C,0x2E,  /* 00001B18    "TA.p..\." */
 43.1360 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00001B20    "_GPEDPT1" */
 43.1361 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001B28    "p..\._GP" */
 43.1362 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00001B30    "EDPT2.\." */
 43.1363 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x36,  /* 00001B38    "_GPEPH06" */
 43.1364 +    0x5B,0x82,0x42,0x0B,0x53,0x30,0x37,0x5F,  /* 00001B40    "[.B.S07_" */
 43.1365 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00001B48    "._ADR..." */
 43.1366 +    0x07,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00001B50    "..._SUN." */
 43.1367 +    0x07,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00001B58    ".. _PS0." */
 43.1368 +    0x70,0x0A,0x07,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001B60    "p..\._GP" */
 43.1369 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00001B68    "EDPT1p.." */
 43.1370 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001B70    "\._GPEDP" */
 43.1371 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00001B78    "T2. _PS3" */
 43.1372 +    0x00,0x70,0x0A,0x07,0x5C,0x2E,0x5F,0x47,  /* 00001B80    ".p..\._G" */
 43.1373 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00001B88    "PEDPT1p." */
 43.1374 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001B90    ".\._GPED" */
 43.1375 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00001B98    "PT2.,_EJ" */
 43.1376 +    0x30,0x01,0x70,0x0A,0x07,0x5C,0x2E,0x5F,  /* 00001BA0    "0.p..\._" */
 43.1377 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00001BA8    "GPEDPT1p" */
 43.1378 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001BB0    "..\._GPE" */
 43.1379 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00001BB8    "DPT2p.\." */
 43.1380 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x37,  /* 00001BC0    "_GPEPH07" */
 43.1381 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00001BC8    ".+_STA.p" */
 43.1382 +    0x0A,0x07,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001BD0    "..\._GPE" */
 43.1383 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00001BD8    "DPT1p..\" */
 43.1384 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001BE0    "._GPEDPT" */
 43.1385 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001BE8    "2.\._GPE" */
 43.1386 +    0x50,0x48,0x30,0x37,0x5B,0x82,0x42,0x0B,  /* 00001BF0    "PH07[.B." */
 43.1387 +    0x53,0x30,0x38,0x5F,0x08,0x5F,0x41,0x44,  /* 00001BF8    "S08_._AD" */
 43.1388 +    0x52,0x0C,0x00,0x00,0x08,0x00,0x08,0x5F,  /* 00001C00    "R......_" */
 43.1389 +    0x53,0x55,0x4E,0x0A,0x08,0x14,0x20,0x5F,  /* 00001C08    "SUN... _" */
 43.1390 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x08,0x5C,  /* 00001C10    "PS0.p..\" */
 43.1391 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001C18    "._GPEDPT" */
 43.1392 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00001C20    "1p..\._G" */
 43.1393 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00001C28    "PEDPT2. " */
 43.1394 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x08,  /* 00001C30    "_PS3.p.." */
 43.1395 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001C38    "\._GPEDP" */
 43.1396 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00001C40    "T1p..\._" */
 43.1397 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00001C48    "GPEDPT2." */
 43.1398 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00001C50    ",_EJ0.p." */
 43.1399 +    0x08,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001C58    ".\._GPED" */
 43.1400 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00001C60    "PT1p..\." */
 43.1401 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001C68    "_GPEDPT2" */
 43.1402 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001C70    "p.\._GPE" */
 43.1403 +    0x50,0x48,0x30,0x38,0x14,0x2B,0x5F,0x53,  /* 00001C78    "PH08.+_S" */
 43.1404 +    0x54,0x41,0x00,0x70,0x0A,0x08,0x5C,0x2E,  /* 00001C80    "TA.p..\." */
 43.1405 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00001C88    "_GPEDPT1" */
 43.1406 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001C90    "p..\._GP" */
 43.1407 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00001C98    "EDPT2.\." */
 43.1408 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x38,  /* 00001CA0    "_GPEPH08" */
 43.1409 +    0x5B,0x82,0x42,0x0B,0x53,0x30,0x39,0x5F,  /* 00001CA8    "[.B.S09_" */
 43.1410 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00001CB0    "._ADR..." */
 43.1411 +    0x09,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00001CB8    "..._SUN." */
 43.1412 +    0x09,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00001CC0    ".. _PS0." */
 43.1413 +    0x70,0x0A,0x09,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001CC8    "p..\._GP" */
 43.1414 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00001CD0    "EDPT1p.." */
 43.1415 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001CD8    "\._GPEDP" */
 43.1416 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00001CE0    "T2. _PS3" */
 43.1417 +    0x00,0x70,0x0A,0x09,0x5C,0x2E,0x5F,0x47,  /* 00001CE8    ".p..\._G" */
 43.1418 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00001CF0    "PEDPT1p." */
 43.1419 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001CF8    ".\._GPED" */
 43.1420 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00001D00    "PT2.,_EJ" */
 43.1421 +    0x30,0x01,0x70,0x0A,0x09,0x5C,0x2E,0x5F,  /* 00001D08    "0.p..\._" */
 43.1422 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00001D10    "GPEDPT1p" */
 43.1423 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001D18    "..\._GPE" */
 43.1424 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00001D20    "DPT2p.\." */
 43.1425 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x39,  /* 00001D28    "_GPEPH09" */
 43.1426 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00001D30    ".+_STA.p" */
 43.1427 +    0x0A,0x09,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001D38    "..\._GPE" */
 43.1428 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00001D40    "DPT1p..\" */
 43.1429 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001D48    "._GPEDPT" */
 43.1430 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001D50    "2.\._GPE" */
 43.1431 +    0x50,0x48,0x30,0x39,0x5B,0x82,0x42,0x0B,  /* 00001D58    "PH09[.B." */
 43.1432 +    0x53,0x30,0x41,0x5F,0x08,0x5F,0x41,0x44,  /* 00001D60    "S0A_._AD" */
 43.1433 +    0x52,0x0C,0x00,0x00,0x0A,0x00,0x08,0x5F,  /* 00001D68    "R......_" */
 43.1434 +    0x53,0x55,0x4E,0x0A,0x0A,0x14,0x20,0x5F,  /* 00001D70    "SUN... _" */
 43.1435 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x0A,0x5C,  /* 00001D78    "PS0.p..\" */
 43.1436 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001D80    "._GPEDPT" */
 43.1437 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00001D88    "1p..\._G" */
 43.1438 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00001D90    "PEDPT2. " */
 43.1439 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x0A,  /* 00001D98    "_PS3.p.." */
 43.1440 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001DA0    "\._GPEDP" */
 43.1441 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00001DA8    "T1p..\._" */
 43.1442 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00001DB0    "GPEDPT2." */
 43.1443 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00001DB8    ",_EJ0.p." */
 43.1444 +    0x0A,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001DC0    ".\._GPED" */
 43.1445 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00001DC8    "PT1p..\." */
 43.1446 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001DD0    "_GPEDPT2" */
 43.1447 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001DD8    "p.\._GPE" */
 43.1448 +    0x50,0x48,0x30,0x41,0x14,0x2B,0x5F,0x53,  /* 00001DE0    "PH0A.+_S" */
 43.1449 +    0x54,0x41,0x00,0x70,0x0A,0x0A,0x5C,0x2E,  /* 00001DE8    "TA.p..\." */
 43.1450 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00001DF0    "_GPEDPT1" */
 43.1451 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001DF8    "p..\._GP" */
 43.1452 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00001E00    "EDPT2.\." */
 43.1453 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x41,  /* 00001E08    "_GPEPH0A" */
 43.1454 +    0x5B,0x82,0x42,0x0B,0x53,0x30,0x42,0x5F,  /* 00001E10    "[.B.S0B_" */
 43.1455 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00001E18    "._ADR..." */
 43.1456 +    0x0B,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00001E20    "..._SUN." */
 43.1457 +    0x0B,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00001E28    ".. _PS0." */
 43.1458 +    0x70,0x0A,0x0B,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001E30    "p..\._GP" */
 43.1459 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00001E38    "EDPT1p.." */
 43.1460 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001E40    "\._GPEDP" */
 43.1461 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00001E48    "T2. _PS3" */
 43.1462 +    0x00,0x70,0x0A,0x0B,0x5C,0x2E,0x5F,0x47,  /* 00001E50    ".p..\._G" */
 43.1463 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00001E58    "PEDPT1p." */
 43.1464 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001E60    ".\._GPED" */
 43.1465 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00001E68    "PT2.,_EJ" */
 43.1466 +    0x30,0x01,0x70,0x0A,0x0B,0x5C,0x2E,0x5F,  /* 00001E70    "0.p..\._" */
 43.1467 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00001E78    "GPEDPT1p" */
 43.1468 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001E80    "..\._GPE" */
 43.1469 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00001E88    "DPT2p.\." */
 43.1470 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x42,  /* 00001E90    "_GPEPH0B" */
 43.1471 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00001E98    ".+_STA.p" */
 43.1472 +    0x0A,0x0B,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001EA0    "..\._GPE" */
 43.1473 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00001EA8    "DPT1p..\" */
 43.1474 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001EB0    "._GPEDPT" */
 43.1475 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001EB8    "2.\._GPE" */
 43.1476 +    0x50,0x48,0x30,0x42,0x5B,0x82,0x42,0x0B,  /* 00001EC0    "PH0B[.B." */
 43.1477 +    0x53,0x30,0x43,0x5F,0x08,0x5F,0x41,0x44,  /* 00001EC8    "S0C_._AD" */
 43.1478 +    0x52,0x0C,0x00,0x00,0x0C,0x00,0x08,0x5F,  /* 00001ED0    "R......_" */
 43.1479 +    0x53,0x55,0x4E,0x0A,0x0C,0x14,0x20,0x5F,  /* 00001ED8    "SUN... _" */
 43.1480 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x0C,0x5C,  /* 00001EE0    "PS0.p..\" */
 43.1481 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00001EE8    "._GPEDPT" */
 43.1482 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00001EF0    "1p..\._G" */
 43.1483 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00001EF8    "PEDPT2. " */
 43.1484 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x0C,  /* 00001F00    "_PS3.p.." */
 43.1485 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001F08    "\._GPEDP" */
 43.1486 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00001F10    "T1p..\._" */
 43.1487 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00001F18    "GPEDPT2." */
 43.1488 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00001F20    ",_EJ0.p." */
 43.1489 +    0x0C,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001F28    ".\._GPED" */
 43.1490 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00001F30    "PT1p..\." */
 43.1491 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001F38    "_GPEDPT2" */
 43.1492 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001F40    "p.\._GPE" */
 43.1493 +    0x50,0x48,0x30,0x43,0x14,0x2B,0x5F,0x53,  /* 00001F48    "PH0C.+_S" */
 43.1494 +    0x54,0x41,0x00,0x70,0x0A,0x0C,0x5C,0x2E,  /* 00001F50    "TA.p..\." */
 43.1495 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00001F58    "_GPEDPT1" */
 43.1496 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001F60    "p..\._GP" */
 43.1497 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00001F68    "EDPT2.\." */
 43.1498 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x43,  /* 00001F70    "_GPEPH0C" */
 43.1499 +    0x5B,0x82,0x42,0x0B,0x53,0x30,0x44,0x5F,  /* 00001F78    "[.B.S0D_" */
 43.1500 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00001F80    "._ADR..." */
 43.1501 +    0x0D,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00001F88    "..._SUN." */
 43.1502 +    0x0D,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00001F90    ".. _PS0." */
 43.1503 +    0x70,0x0A,0x0D,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001F98    "p..\._GP" */
 43.1504 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00001FA0    "EDPT1p.." */
 43.1505 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001FA8    "\._GPEDP" */
 43.1506 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00001FB0    "T2. _PS3" */
 43.1507 +    0x00,0x70,0x0A,0x0D,0x5C,0x2E,0x5F,0x47,  /* 00001FB8    ".p..\._G" */
 43.1508 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00001FC0    "PEDPT1p." */
 43.1509 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00001FC8    ".\._GPED" */
 43.1510 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00001FD0    "PT2.,_EJ" */
 43.1511 +    0x30,0x01,0x70,0x0A,0x0D,0x5C,0x2E,0x5F,  /* 00001FD8    "0.p..\._" */
 43.1512 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00001FE0    "GPEDPT1p" */
 43.1513 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001FE8    "..\._GPE" */
 43.1514 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00001FF0    "DPT2p.\." */
 43.1515 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x44,  /* 00001FF8    "_GPEPH0D" */
 43.1516 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00002000    ".+_STA.p" */
 43.1517 +    0x0A,0x0D,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002008    "..\._GPE" */
 43.1518 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00002010    "DPT1p..\" */
 43.1519 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002018    "._GPEDPT" */
 43.1520 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002020    "2.\._GPE" */
 43.1521 +    0x50,0x48,0x30,0x44,0x5B,0x82,0x42,0x0B,  /* 00002028    "PH0D[.B." */
 43.1522 +    0x53,0x30,0x45,0x5F,0x08,0x5F,0x41,0x44,  /* 00002030    "S0E_._AD" */
 43.1523 +    0x52,0x0C,0x00,0x00,0x0E,0x00,0x08,0x5F,  /* 00002038    "R......_" */
 43.1524 +    0x53,0x55,0x4E,0x0A,0x0E,0x14,0x20,0x5F,  /* 00002040    "SUN... _" */
 43.1525 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x0E,0x5C,  /* 00002048    "PS0.p..\" */
 43.1526 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002050    "._GPEDPT" */
 43.1527 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00002058    "1p..\._G" */
 43.1528 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00002060    "PEDPT2. " */
 43.1529 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x0E,  /* 00002068    "_PS3.p.." */
 43.1530 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002070    "\._GPEDP" */
 43.1531 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00002078    "T1p..\._" */
 43.1532 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00002080    "GPEDPT2." */
 43.1533 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00002088    ",_EJ0.p." */
 43.1534 +    0x0E,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002090    ".\._GPED" */
 43.1535 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00002098    "PT1p..\." */
 43.1536 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 000020A0    "_GPEDPT2" */
 43.1537 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000020A8    "p.\._GPE" */
 43.1538 +    0x50,0x48,0x30,0x45,0x14,0x2B,0x5F,0x53,  /* 000020B0    "PH0E.+_S" */
 43.1539 +    0x54,0x41,0x00,0x70,0x0A,0x0E,0x5C,0x2E,  /* 000020B8    "TA.p..\." */
 43.1540 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 000020C0    "_GPEDPT1" */
 43.1541 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 000020C8    "p..\._GP" */
 43.1542 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 000020D0    "EDPT2.\." */
 43.1543 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x45,  /* 000020D8    "_GPEPH0E" */
 43.1544 +    0x5B,0x82,0x42,0x0B,0x53,0x30,0x46,0x5F,  /* 000020E0    "[.B.S0F_" */
 43.1545 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 000020E8    "._ADR..." */
 43.1546 +    0x0F,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 000020F0    "..._SUN." */
 43.1547 +    0x0F,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 000020F8    ".. _PS0." */
 43.1548 +    0x70,0x0A,0x0F,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002100    "p..\._GP" */
 43.1549 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00002108    "EDPT1p.." */
 43.1550 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002110    "\._GPEDP" */
 43.1551 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00002118    "T2. _PS3" */
 43.1552 +    0x00,0x70,0x0A,0x0F,0x5C,0x2E,0x5F,0x47,  /* 00002120    ".p..\._G" */
 43.1553 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00002128    "PEDPT1p." */
 43.1554 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002130    ".\._GPED" */
 43.1555 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00002138    "PT2.,_EJ" */
 43.1556 +    0x30,0x01,0x70,0x0A,0x0F,0x5C,0x2E,0x5F,  /* 00002140    "0.p..\._" */
 43.1557 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00002148    "GPEDPT1p" */
 43.1558 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002150    "..\._GPE" */
 43.1559 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00002158    "DPT2p.\." */
 43.1560 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x30,0x46,  /* 00002160    "_GPEPH0F" */
 43.1561 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00002168    ".+_STA.p" */
 43.1562 +    0x0A,0x0F,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002170    "..\._GPE" */
 43.1563 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00002178    "DPT1p..\" */
 43.1564 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002180    "._GPEDPT" */
 43.1565 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002188    "2.\._GPE" */
 43.1566 +    0x50,0x48,0x30,0x46,0x5B,0x82,0x42,0x0B,  /* 00002190    "PH0F[.B." */
 43.1567 +    0x53,0x31,0x30,0x5F,0x08,0x5F,0x41,0x44,  /* 00002198    "S10_._AD" */
 43.1568 +    0x52,0x0C,0x00,0x00,0x10,0x00,0x08,0x5F,  /* 000021A0    "R......_" */
 43.1569 +    0x53,0x55,0x4E,0x0A,0x10,0x14,0x20,0x5F,  /* 000021A8    "SUN... _" */
 43.1570 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x10,0x5C,  /* 000021B0    "PS0.p..\" */
 43.1571 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000021B8    "._GPEDPT" */
 43.1572 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 000021C0    "1p..\._G" */
 43.1573 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 000021C8    "PEDPT2. " */
 43.1574 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x10,  /* 000021D0    "_PS3.p.." */
 43.1575 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 000021D8    "\._GPEDP" */
 43.1576 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 000021E0    "T1p..\._" */
 43.1577 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 000021E8    "GPEDPT2." */
 43.1578 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 000021F0    ",_EJ0.p." */
 43.1579 +    0x10,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 000021F8    ".\._GPED" */
 43.1580 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00002200    "PT1p..\." */
 43.1581 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00002208    "_GPEDPT2" */
 43.1582 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002210    "p.\._GPE" */
 43.1583 +    0x50,0x48,0x31,0x30,0x14,0x2B,0x5F,0x53,  /* 00002218    "PH10.+_S" */
 43.1584 +    0x54,0x41,0x00,0x70,0x0A,0x10,0x5C,0x2E,  /* 00002220    "TA.p..\." */
 43.1585 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00002228    "_GPEDPT1" */
 43.1586 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002230    "p..\._GP" */
 43.1587 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00002238    "EDPT2.\." */
 43.1588 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x30,  /* 00002240    "_GPEPH10" */
 43.1589 +    0x5B,0x82,0x42,0x0B,0x53,0x31,0x31,0x5F,  /* 00002248    "[.B.S11_" */
 43.1590 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00002250    "._ADR..." */
 43.1591 +    0x11,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00002258    "..._SUN." */
 43.1592 +    0x11,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00002260    ".. _PS0." */
 43.1593 +    0x70,0x0A,0x11,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002268    "p..\._GP" */
 43.1594 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00002270    "EDPT1p.." */
 43.1595 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002278    "\._GPEDP" */
 43.1596 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00002280    "T2. _PS3" */
 43.1597 +    0x00,0x70,0x0A,0x11,0x5C,0x2E,0x5F,0x47,  /* 00002288    ".p..\._G" */
 43.1598 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00002290    "PEDPT1p." */
 43.1599 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002298    ".\._GPED" */
 43.1600 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 000022A0    "PT2.,_EJ" */
 43.1601 +    0x30,0x01,0x70,0x0A,0x11,0x5C,0x2E,0x5F,  /* 000022A8    "0.p..\._" */
 43.1602 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 000022B0    "GPEDPT1p" */
 43.1603 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000022B8    "..\._GPE" */
 43.1604 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 000022C0    "DPT2p.\." */
 43.1605 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x31,  /* 000022C8    "_GPEPH11" */
 43.1606 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 000022D0    ".+_STA.p" */
 43.1607 +    0x0A,0x11,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000022D8    "..\._GPE" */
 43.1608 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 000022E0    "DPT1p..\" */
 43.1609 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000022E8    "._GPEDPT" */
 43.1610 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000022F0    "2.\._GPE" */
 43.1611 +    0x50,0x48,0x31,0x31,0x5B,0x82,0x42,0x0B,  /* 000022F8    "PH11[.B." */
 43.1612 +    0x53,0x31,0x32,0x5F,0x08,0x5F,0x41,0x44,  /* 00002300    "S12_._AD" */
 43.1613 +    0x52,0x0C,0x00,0x00,0x12,0x00,0x08,0x5F,  /* 00002308    "R......_" */
 43.1614 +    0x53,0x55,0x4E,0x0A,0x12,0x14,0x20,0x5F,  /* 00002310    "SUN... _" */
 43.1615 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x12,0x5C,  /* 00002318    "PS0.p..\" */
 43.1616 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002320    "._GPEDPT" */
 43.1617 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00002328    "1p..\._G" */
 43.1618 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00002330    "PEDPT2. " */
 43.1619 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x12,  /* 00002338    "_PS3.p.." */
 43.1620 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002340    "\._GPEDP" */
 43.1621 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00002348    "T1p..\._" */
 43.1622 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00002350    "GPEDPT2." */
 43.1623 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00002358    ",_EJ0.p." */
 43.1624 +    0x12,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002360    ".\._GPED" */
 43.1625 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00002368    "PT1p..\." */
 43.1626 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00002370    "_GPEDPT2" */
 43.1627 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002378    "p.\._GPE" */
 43.1628 +    0x50,0x48,0x31,0x32,0x14,0x2B,0x5F,0x53,  /* 00002380    "PH12.+_S" */
 43.1629 +    0x54,0x41,0x00,0x70,0x0A,0x12,0x5C,0x2E,  /* 00002388    "TA.p..\." */
 43.1630 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00002390    "_GPEDPT1" */
 43.1631 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002398    "p..\._GP" */
 43.1632 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 000023A0    "EDPT2.\." */
 43.1633 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x32,  /* 000023A8    "_GPEPH12" */
 43.1634 +    0x5B,0x82,0x42,0x0B,0x53,0x31,0x33,0x5F,  /* 000023B0    "[.B.S13_" */
 43.1635 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 000023B8    "._ADR..." */
 43.1636 +    0x13,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 000023C0    "..._SUN." */
 43.1637 +    0x13,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 000023C8    ".. _PS0." */
 43.1638 +    0x70,0x0A,0x13,0x5C,0x2E,0x5F,0x47,0x50,  /* 000023D0    "p..\._GP" */
 43.1639 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 000023D8    "EDPT1p.." */
 43.1640 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 000023E0    "\._GPEDP" */
 43.1641 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 000023E8    "T2. _PS3" */
 43.1642 +    0x00,0x70,0x0A,0x13,0x5C,0x2E,0x5F,0x47,  /* 000023F0    ".p..\._G" */
 43.1643 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 000023F8    "PEDPT1p." */
 43.1644 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002400    ".\._GPED" */
 43.1645 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00002408    "PT2.,_EJ" */
 43.1646 +    0x30,0x01,0x70,0x0A,0x13,0x5C,0x2E,0x5F,  /* 00002410    "0.p..\._" */
 43.1647 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00002418    "GPEDPT1p" */
 43.1648 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002420    "..\._GPE" */
 43.1649 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00002428    "DPT2p.\." */
 43.1650 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x33,  /* 00002430    "_GPEPH13" */
 43.1651 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00002438    ".+_STA.p" */
 43.1652 +    0x0A,0x13,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002440    "..\._GPE" */
 43.1653 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00002448    "DPT1p..\" */
 43.1654 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002450    "._GPEDPT" */
 43.1655 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002458    "2.\._GPE" */
 43.1656 +    0x50,0x48,0x31,0x33,0x5B,0x82,0x42,0x0B,  /* 00002460    "PH13[.B." */
 43.1657 +    0x53,0x31,0x34,0x5F,0x08,0x5F,0x41,0x44,  /* 00002468    "S14_._AD" */
 43.1658 +    0x52,0x0C,0x00,0x00,0x14,0x00,0x08,0x5F,  /* 00002470    "R......_" */
 43.1659 +    0x53,0x55,0x4E,0x0A,0x14,0x14,0x20,0x5F,  /* 00002478    "SUN... _" */
 43.1660 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x14,0x5C,  /* 00002480    "PS0.p..\" */
 43.1661 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002488    "._GPEDPT" */
 43.1662 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00002490    "1p..\._G" */
 43.1663 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00002498    "PEDPT2. " */
 43.1664 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x14,  /* 000024A0    "_PS3.p.." */
 43.1665 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 000024A8    "\._GPEDP" */
 43.1666 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 000024B0    "T1p..\._" */
 43.1667 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 000024B8    "GPEDPT2." */
 43.1668 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 000024C0    ",_EJ0.p." */
 43.1669 +    0x14,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 000024C8    ".\._GPED" */
 43.1670 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 000024D0    "PT1p..\." */
 43.1671 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 000024D8    "_GPEDPT2" */
 43.1672 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000024E0    "p.\._GPE" */
 43.1673 +    0x50,0x48,0x31,0x34,0x14,0x2B,0x5F,0x53,  /* 000024E8    "PH14.+_S" */
 43.1674 +    0x54,0x41,0x00,0x70,0x0A,0x14,0x5C,0x2E,  /* 000024F0    "TA.p..\." */
 43.1675 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 000024F8    "_GPEDPT1" */
 43.1676 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002500    "p..\._GP" */
 43.1677 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00002508    "EDPT2.\." */
 43.1678 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x34,  /* 00002510    "_GPEPH14" */
 43.1679 +    0x5B,0x82,0x42,0x0B,0x53,0x31,0x35,0x5F,  /* 00002518    "[.B.S15_" */
 43.1680 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00002520    "._ADR..." */
 43.1681 +    0x15,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00002528    "..._SUN." */
 43.1682 +    0x15,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00002530    ".. _PS0." */
 43.1683 +    0x70,0x0A,0x15,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002538    "p..\._GP" */
 43.1684 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00002540    "EDPT1p.." */
 43.1685 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002548    "\._GPEDP" */
 43.1686 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00002550    "T2. _PS3" */
 43.1687 +    0x00,0x70,0x0A,0x15,0x5C,0x2E,0x5F,0x47,  /* 00002558    ".p..\._G" */
 43.1688 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00002560    "PEDPT1p." */
 43.1689 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002568    ".\._GPED" */
 43.1690 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00002570    "PT2.,_EJ" */
 43.1691 +    0x30,0x01,0x70,0x0A,0x15,0x5C,0x2E,0x5F,  /* 00002578    "0.p..\._" */
 43.1692 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00002580    "GPEDPT1p" */
 43.1693 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002588    "..\._GPE" */
 43.1694 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00002590    "DPT2p.\." */
 43.1695 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x35,  /* 00002598    "_GPEPH15" */
 43.1696 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 000025A0    ".+_STA.p" */
 43.1697 +    0x0A,0x15,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000025A8    "..\._GPE" */
 43.1698 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 000025B0    "DPT1p..\" */
 43.1699 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000025B8    "._GPEDPT" */
 43.1700 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000025C0    "2.\._GPE" */
 43.1701 +    0x50,0x48,0x31,0x35,0x5B,0x82,0x42,0x0B,  /* 000025C8    "PH15[.B." */
 43.1702 +    0x53,0x31,0x36,0x5F,0x08,0x5F,0x41,0x44,  /* 000025D0    "S16_._AD" */
 43.1703 +    0x52,0x0C,0x00,0x00,0x16,0x00,0x08,0x5F,  /* 000025D8    "R......_" */
 43.1704 +    0x53,0x55,0x4E,0x0A,0x16,0x14,0x20,0x5F,  /* 000025E0    "SUN... _" */
 43.1705 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x16,0x5C,  /* 000025E8    "PS0.p..\" */
 43.1706 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000025F0    "._GPEDPT" */
 43.1707 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 000025F8    "1p..\._G" */
 43.1708 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00002600    "PEDPT2. " */
 43.1709 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x16,  /* 00002608    "_PS3.p.." */
 43.1710 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002610    "\._GPEDP" */
 43.1711 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00002618    "T1p..\._" */
 43.1712 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00002620    "GPEDPT2." */
 43.1713 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00002628    ",_EJ0.p." */
 43.1714 +    0x16,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002630    ".\._GPED" */
 43.1715 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00002638    "PT1p..\." */
 43.1716 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00002640    "_GPEDPT2" */
 43.1717 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002648    "p.\._GPE" */
 43.1718 +    0x50,0x48,0x31,0x36,0x14,0x2B,0x5F,0x53,  /* 00002650    "PH16.+_S" */
 43.1719 +    0x54,0x41,0x00,0x70,0x0A,0x16,0x5C,0x2E,  /* 00002658    "TA.p..\." */
 43.1720 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00002660    "_GPEDPT1" */
 43.1721 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002668    "p..\._GP" */
 43.1722 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00002670    "EDPT2.\." */
 43.1723 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x36,  /* 00002678    "_GPEPH16" */
 43.1724 +    0x5B,0x82,0x42,0x0B,0x53,0x31,0x37,0x5F,  /* 00002680    "[.B.S17_" */
 43.1725 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00002688    "._ADR..." */
 43.1726 +    0x17,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00002690    "..._SUN." */
 43.1727 +    0x17,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00002698    ".. _PS0." */
 43.1728 +    0x70,0x0A,0x17,0x5C,0x2E,0x5F,0x47,0x50,  /* 000026A0    "p..\._GP" */
 43.1729 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 000026A8    "EDPT1p.." */
 43.1730 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 000026B0    "\._GPEDP" */
 43.1731 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 000026B8    "T2. _PS3" */
 43.1732 +    0x00,0x70,0x0A,0x17,0x5C,0x2E,0x5F,0x47,  /* 000026C0    ".p..\._G" */
 43.1733 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 000026C8    "PEDPT1p." */
 43.1734 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 000026D0    ".\._GPED" */
 43.1735 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 000026D8    "PT2.,_EJ" */
 43.1736 +    0x30,0x01,0x70,0x0A,0x17,0x5C,0x2E,0x5F,  /* 000026E0    "0.p..\._" */
 43.1737 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 000026E8    "GPEDPT1p" */
 43.1738 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000026F0    "..\._GPE" */
 43.1739 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 000026F8    "DPT2p.\." */
 43.1740 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x37,  /* 00002700    "_GPEPH17" */
 43.1741 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00002708    ".+_STA.p" */
 43.1742 +    0x0A,0x17,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002710    "..\._GPE" */
 43.1743 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00002718    "DPT1p..\" */
 43.1744 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002720    "._GPEDPT" */
 43.1745 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002728    "2.\._GPE" */
 43.1746 +    0x50,0x48,0x31,0x37,0x5B,0x82,0x42,0x0B,  /* 00002730    "PH17[.B." */
 43.1747 +    0x53,0x31,0x38,0x5F,0x08,0x5F,0x41,0x44,  /* 00002738    "S18_._AD" */
 43.1748 +    0x52,0x0C,0x00,0x00,0x18,0x00,0x08,0x5F,  /* 00002740    "R......_" */
 43.1749 +    0x53,0x55,0x4E,0x0A,0x18,0x14,0x20,0x5F,  /* 00002748    "SUN... _" */
 43.1750 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x18,0x5C,  /* 00002750    "PS0.p..\" */
 43.1751 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002758    "._GPEDPT" */
 43.1752 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00002760    "1p..\._G" */
 43.1753 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00002768    "PEDPT2. " */
 43.1754 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x18,  /* 00002770    "_PS3.p.." */
 43.1755 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002778    "\._GPEDP" */
 43.1756 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00002780    "T1p..\._" */
 43.1757 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00002788    "GPEDPT2." */
 43.1758 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00002790    ",_EJ0.p." */
 43.1759 +    0x18,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002798    ".\._GPED" */
 43.1760 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 000027A0    "PT1p..\." */
 43.1761 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 000027A8    "_GPEDPT2" */
 43.1762 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000027B0    "p.\._GPE" */
 43.1763 +    0x50,0x48,0x31,0x38,0x14,0x2B,0x5F,0x53,  /* 000027B8    "PH18.+_S" */
 43.1764 +    0x54,0x41,0x00,0x70,0x0A,0x18,0x5C,0x2E,  /* 000027C0    "TA.p..\." */
 43.1765 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 000027C8    "_GPEDPT1" */
 43.1766 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 000027D0    "p..\._GP" */
 43.1767 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 000027D8    "EDPT2.\." */
 43.1768 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x38,  /* 000027E0    "_GPEPH18" */
 43.1769 +    0x5B,0x82,0x42,0x0B,0x53,0x31,0x39,0x5F,  /* 000027E8    "[.B.S19_" */
 43.1770 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 000027F0    "._ADR..." */
 43.1771 +    0x19,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 000027F8    "..._SUN." */
 43.1772 +    0x19,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00002800    ".. _PS0." */
 43.1773 +    0x70,0x0A,0x19,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002808    "p..\._GP" */
 43.1774 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00002810    "EDPT1p.." */
 43.1775 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002818    "\._GPEDP" */
 43.1776 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00002820    "T2. _PS3" */
 43.1777 +    0x00,0x70,0x0A,0x19,0x5C,0x2E,0x5F,0x47,  /* 00002828    ".p..\._G" */
 43.1778 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00002830    "PEDPT1p." */
 43.1779 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002838    ".\._GPED" */
 43.1780 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00002840    "PT2.,_EJ" */
 43.1781 +    0x30,0x01,0x70,0x0A,0x19,0x5C,0x2E,0x5F,  /* 00002848    "0.p..\._" */
 43.1782 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00002850    "GPEDPT1p" */
 43.1783 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002858    "..\._GPE" */
 43.1784 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00002860    "DPT2p.\." */
 43.1785 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x39,  /* 00002868    "_GPEPH19" */
 43.1786 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00002870    ".+_STA.p" */
 43.1787 +    0x0A,0x19,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002878    "..\._GPE" */
 43.1788 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00002880    "DPT1p..\" */
 43.1789 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002888    "._GPEDPT" */
 43.1790 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002890    "2.\._GPE" */
 43.1791 +    0x50,0x48,0x31,0x39,0x5B,0x82,0x42,0x0B,  /* 00002898    "PH19[.B." */
 43.1792 +    0x53,0x31,0x41,0x5F,0x08,0x5F,0x41,0x44,  /* 000028A0    "S1A_._AD" */
 43.1793 +    0x52,0x0C,0x00,0x00,0x1A,0x00,0x08,0x5F,  /* 000028A8    "R......_" */
 43.1794 +    0x53,0x55,0x4E,0x0A,0x1A,0x14,0x20,0x5F,  /* 000028B0    "SUN... _" */
 43.1795 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x1A,0x5C,  /* 000028B8    "PS0.p..\" */
 43.1796 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000028C0    "._GPEDPT" */
 43.1797 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 000028C8    "1p..\._G" */
 43.1798 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 000028D0    "PEDPT2. " */
 43.1799 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x1A,  /* 000028D8    "_PS3.p.." */
 43.1800 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 000028E0    "\._GPEDP" */
 43.1801 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 000028E8    "T1p..\._" */
 43.1802 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 000028F0    "GPEDPT2." */
 43.1803 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 000028F8    ",_EJ0.p." */
 43.1804 +    0x1A,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002900    ".\._GPED" */
 43.1805 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00002908    "PT1p..\." */
 43.1806 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00002910    "_GPEDPT2" */
 43.1807 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002918    "p.\._GPE" */
 43.1808 +    0x50,0x48,0x31,0x41,0x14,0x2B,0x5F,0x53,  /* 00002920    "PH1A.+_S" */
 43.1809 +    0x54,0x41,0x00,0x70,0x0A,0x1A,0x5C,0x2E,  /* 00002928    "TA.p..\." */
 43.1810 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00002930    "_GPEDPT1" */
 43.1811 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002938    "p..\._GP" */
 43.1812 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00002940    "EDPT2.\." */
 43.1813 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x41,  /* 00002948    "_GPEPH1A" */
 43.1814 +    0x5B,0x82,0x42,0x0B,0x53,0x31,0x42,0x5F,  /* 00002950    "[.B.S1B_" */
 43.1815 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00002958    "._ADR..." */
 43.1816 +    0x1B,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00002960    "..._SUN." */
 43.1817 +    0x1B,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00002968    ".. _PS0." */
 43.1818 +    0x70,0x0A,0x1B,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002970    "p..\._GP" */
 43.1819 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00002978    "EDPT1p.." */
 43.1820 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002980    "\._GPEDP" */
 43.1821 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00002988    "T2. _PS3" */
 43.1822 +    0x00,0x70,0x0A,0x1B,0x5C,0x2E,0x5F,0x47,  /* 00002990    ".p..\._G" */
 43.1823 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00002998    "PEDPT1p." */
 43.1824 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 000029A0    ".\._GPED" */
 43.1825 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 000029A8    "PT2.,_EJ" */
 43.1826 +    0x30,0x01,0x70,0x0A,0x1B,0x5C,0x2E,0x5F,  /* 000029B0    "0.p..\._" */
 43.1827 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 000029B8    "GPEDPT1p" */
 43.1828 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000029C0    "..\._GPE" */
 43.1829 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 000029C8    "DPT2p.\." */
 43.1830 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x42,  /* 000029D0    "_GPEPH1B" */
 43.1831 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 000029D8    ".+_STA.p" */
 43.1832 +    0x0A,0x1B,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000029E0    "..\._GPE" */
 43.1833 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 000029E8    "DPT1p..\" */
 43.1834 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 000029F0    "._GPEDPT" */
 43.1835 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 000029F8    "2.\._GPE" */
 43.1836 +    0x50,0x48,0x31,0x42,0x5B,0x82,0x42,0x0B,  /* 00002A00    "PH1B[.B." */
 43.1837 +    0x53,0x31,0x43,0x5F,0x08,0x5F,0x41,0x44,  /* 00002A08    "S1C_._AD" */
 43.1838 +    0x52,0x0C,0x00,0x00,0x1C,0x00,0x08,0x5F,  /* 00002A10    "R......_" */
 43.1839 +    0x53,0x55,0x4E,0x0A,0x1C,0x14,0x20,0x5F,  /* 00002A18    "SUN... _" */
 43.1840 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x1C,0x5C,  /* 00002A20    "PS0.p..\" */
 43.1841 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002A28    "._GPEDPT" */
 43.1842 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00002A30    "1p..\._G" */
 43.1843 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00002A38    "PEDPT2. " */
 43.1844 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x1C,  /* 00002A40    "_PS3.p.." */
 43.1845 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002A48    "\._GPEDP" */
 43.1846 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00002A50    "T1p..\._" */
 43.1847 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00002A58    "GPEDPT2." */
 43.1848 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00002A60    ",_EJ0.p." */
 43.1849 +    0x1C,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002A68    ".\._GPED" */
 43.1850 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00002A70    "PT1p..\." */
 43.1851 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00002A78    "_GPEDPT2" */
 43.1852 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002A80    "p.\._GPE" */
 43.1853 +    0x50,0x48,0x31,0x43,0x14,0x2B,0x5F,0x53,  /* 00002A88    "PH1C.+_S" */
 43.1854 +    0x54,0x41,0x00,0x70,0x0A,0x1C,0x5C,0x2E,  /* 00002A90    "TA.p..\." */
 43.1855 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00002A98    "_GPEDPT1" */
 43.1856 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002AA0    "p..\._GP" */
 43.1857 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00002AA8    "EDPT2.\." */
 43.1858 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x43,  /* 00002AB0    "_GPEPH1C" */
 43.1859 +    0x5B,0x82,0x42,0x0B,0x53,0x31,0x44,0x5F,  /* 00002AB8    "[.B.S1D_" */
 43.1860 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00002AC0    "._ADR..." */
 43.1861 +    0x1D,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00002AC8    "..._SUN." */
 43.1862 +    0x1D,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00002AD0    ".. _PS0." */
 43.1863 +    0x70,0x0A,0x1D,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002AD8    "p..\._GP" */
 43.1864 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00002AE0    "EDPT1p.." */
 43.1865 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002AE8    "\._GPEDP" */
 43.1866 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00002AF0    "T2. _PS3" */
 43.1867 +    0x00,0x70,0x0A,0x1D,0x5C,0x2E,0x5F,0x47,  /* 00002AF8    ".p..\._G" */
 43.1868 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00002B00    "PEDPT1p." */
 43.1869 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002B08    ".\._GPED" */
 43.1870 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00002B10    "PT2.,_EJ" */
 43.1871 +    0x30,0x01,0x70,0x0A,0x1D,0x5C,0x2E,0x5F,  /* 00002B18    "0.p..\._" */
 43.1872 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00002B20    "GPEDPT1p" */
 43.1873 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002B28    "..\._GPE" */
 43.1874 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00002B30    "DPT2p.\." */
 43.1875 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x44,  /* 00002B38    "_GPEPH1D" */
 43.1876 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00002B40    ".+_STA.p" */
 43.1877 +    0x0A,0x1D,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002B48    "..\._GPE" */
 43.1878 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00002B50    "DPT1p..\" */
 43.1879 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002B58    "._GPEDPT" */
 43.1880 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002B60    "2.\._GPE" */
 43.1881 +    0x50,0x48,0x31,0x44,0x5B,0x82,0x42,0x0B,  /* 00002B68    "PH1D[.B." */
 43.1882 +    0x53,0x31,0x45,0x5F,0x08,0x5F,0x41,0x44,  /* 00002B70    "S1E_._AD" */
 43.1883 +    0x52,0x0C,0x00,0x00,0x1E,0x00,0x08,0x5F,  /* 00002B78    "R......_" */
 43.1884 +    0x53,0x55,0x4E,0x0A,0x1E,0x14,0x20,0x5F,  /* 00002B80    "SUN... _" */
 43.1885 +    0x50,0x53,0x30,0x00,0x70,0x0A,0x1E,0x5C,  /* 00002B88    "PS0.p..\" */
 43.1886 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002B90    "._GPEDPT" */
 43.1887 +    0x31,0x70,0x0A,0x80,0x5C,0x2E,0x5F,0x47,  /* 00002B98    "1p..\._G" */
 43.1888 +    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x20,  /* 00002BA0    "PEDPT2. " */
 43.1889 +    0x5F,0x50,0x53,0x33,0x00,0x70,0x0A,0x1E,  /* 00002BA8    "_PS3.p.." */
 43.1890 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002BB0    "\._GPEDP" */
 43.1891 +    0x54,0x31,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00002BB8    "T1p..\._" */
 43.1892 +    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00002BC0    "GPEDPT2." */
 43.1893 +    0x2C,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00002BC8    ",_EJ0.p." */
 43.1894 +    0x1E,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002BD0    ".\._GPED" */
 43.1895 +    0x50,0x54,0x31,0x70,0x0A,0x88,0x5C,0x2E,  /* 00002BD8    "PT1p..\." */
 43.1896 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00002BE0    "_GPEDPT2" */
 43.1897 +    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002BE8    "p.\._GPE" */
 43.1898 +    0x50,0x48,0x31,0x45,0x14,0x2B,0x5F,0x53,  /* 00002BF0    "PH1E.+_S" */
 43.1899 +    0x54,0x41,0x00,0x70,0x0A,0x1E,0x5C,0x2E,  /* 00002BF8    "TA.p..\." */
 43.1900 +    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x31,  /* 00002C00    "_GPEDPT1" */
 43.1901 +    0x70,0x0A,0x89,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002C08    "p..\._GP" */
 43.1902 +    0x45,0x44,0x50,0x54,0x32,0xA4,0x5C,0x2E,  /* 00002C10    "EDPT2.\." */
 43.1903 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x45,  /* 00002C18    "_GPEPH1E" */
 43.1904 +    0x5B,0x82,0x42,0x0B,0x53,0x31,0x46,0x5F,  /* 00002C20    "[.B.S1F_" */
 43.1905 +    0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,  /* 00002C28    "._ADR..." */
 43.1906 +    0x1F,0x00,0x08,0x5F,0x53,0x55,0x4E,0x0A,  /* 00002C30    "..._SUN." */
 43.1907 +    0x1F,0x14,0x20,0x5F,0x50,0x53,0x30,0x00,  /* 00002C38    ".. _PS0." */
 43.1908 +    0x70,0x0A,0x1F,0x5C,0x2E,0x5F,0x47,0x50,  /* 00002C40    "p..\._GP" */
 43.1909 +    0x45,0x44,0x50,0x54,0x31,0x70,0x0A,0x80,  /* 00002C48    "EDPT1p.." */
 43.1910 +    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00002C50    "\._GPEDP" */
 43.1911 +    0x54,0x32,0x14,0x20,0x5F,0x50,0x53,0x33,  /* 00002C58    "T2. _PS3" */
 43.1912 +    0x00,0x70,0x0A,0x1F,0x5C,0x2E,0x5F,0x47,  /* 00002C60    ".p..\._G" */
 43.1913 +    0x50,0x45,0x44,0x50,0x54,0x31,0x70,0x0A,  /* 00002C68    "PEDPT1p." */
 43.1914 +    0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00002C70    ".\._GPED" */
 43.1915 +    0x50,0x54,0x32,0x14,0x2C,0x5F,0x45,0x4A,  /* 00002C78    "PT2.,_EJ" */
 43.1916 +    0x30,0x01,0x70,0x0A,0x1F,0x5C,0x2E,0x5F,  /* 00002C80    "0.p..\._" */
 43.1917 +    0x47,0x50,0x45,0x44,0x50,0x54,0x31,0x70,  /* 00002C88    "GPEDPT1p" */
 43.1918 +    0x0A,0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002C90    "..\._GPE" */
 43.1919 +    0x44,0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,  /* 00002C98    "DPT2p.\." */
 43.1920 +    0x5F,0x47,0x50,0x45,0x50,0x48,0x31,0x46,  /* 00002CA0    "_GPEPH1F" */
 43.1921 +    0x14,0x2B,0x5F,0x53,0x54,0x41,0x00,0x70,  /* 00002CA8    ".+_STA.p" */
 43.1922 +    0x0A,0x1F,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002CB0    "..\._GPE" */
 43.1923 +    0x44,0x50,0x54,0x31,0x70,0x0A,0x89,0x5C,  /* 00002CB8    "DPT1p..\" */
 43.1924 +    0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,0x54,  /* 00002CC0    "._GPEDPT" */
 43.1925 +    0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00002CC8    "2.\._GPE" */
 43.1926 +    0x50,0x48,0x31,0x46,0x10,0x4E,0x51,0x5F,  /* 00002CD0    "PH1F.NQ_" */
 43.1927 +    0x47,0x50,0x45,0x5B,0x80,0x50,0x48,0x50,  /* 00002CD8    "GPE[.PHP" */
 43.1928 +    0x5F,0x01,0x0B,0xC0,0x10,0x0A,0x22,0x5B,  /* 00002CE0    "_....."[" */
 43.1929 +    0x81,0x41,0x0B,0x50,0x48,0x50,0x5F,0x01,  /* 00002CE8    ".A.PHP_." */
 43.1930 +    0x50,0x53,0x54,0x41,0x08,0x50,0x53,0x54,  /* 00002CF0    "PSTA.PST" */
 43.1931 +    0x42,0x08,0x50,0x48,0x30,0x30,0x08,0x50,  /* 00002CF8    "B.PH00.P" */
 43.1932 +    0x48,0x30,0x31,0x08,0x50,0x48,0x30,0x32,  /* 00002D00    "H01.PH02" */
 43.1933 +    0x08,0x50,0x48,0x30,0x33,0x08,0x50,0x48,  /* 00002D08    ".PH03.PH" */
 43.1934 +    0x30,0x34,0x08,0x50,0x48,0x30,0x35,0x08,  /* 00002D10    "04.PH05." */
 43.1935 +    0x50,0x48,0x30,0x36,0x08,0x50,0x48,0x30,  /* 00002D18    "PH06.PH0" */
 43.1936 +    0x37,0x08,0x50,0x48,0x30,0x38,0x08,0x50,  /* 00002D20    "7.PH08.P" */
 43.1937 +    0x48,0x30,0x39,0x08,0x50,0x48,0x30,0x41,  /* 00002D28    "H09.PH0A" */
 43.1938 +    0x08,0x50,0x48,0x30,0x42,0x08,0x50,0x48,  /* 00002D30    ".PH0B.PH" */
 43.1939 +    0x30,0x43,0x08,0x50,0x48,0x30,0x44,0x08,  /* 00002D38    "0C.PH0D." */
 43.1940 +    0x50,0x48,0x30,0x45,0x08,0x50,0x48,0x30,  /* 00002D40    "PH0E.PH0" */
 43.1941 +    0x46,0x08,0x50,0x48,0x31,0x30,0x08,0x50,  /* 00002D48    "F.PH10.P" */
 43.1942 +    0x48,0x31,0x31,0x08,0x50,0x48,0x31,0x32,  /* 00002D50    "H11.PH12" */
 43.1943 +    0x08,0x50,0x48,0x31,0x33,0x08,0x50,0x48,  /* 00002D58    ".PH13.PH" */
 43.1944 +    0x31,0x34,0x08,0x50,0x48,0x31,0x35,0x08,  /* 00002D60    "14.PH15." */
 43.1945 +    0x50,0x48,0x31,0x36,0x08,0x50,0x48,0x31,  /* 00002D68    "PH16.PH1" */
 43.1946 +    0x37,0x08,0x50,0x48,0x31,0x38,0x08,0x50,  /* 00002D70    "7.PH18.P" */
 43.1947 +    0x48,0x31,0x39,0x08,0x50,0x48,0x31,0x41,  /* 00002D78    "H19.PH1A" */
 43.1948 +    0x08,0x50,0x48,0x31,0x42,0x08,0x50,0x48,  /* 00002D80    ".PH1B.PH" */
 43.1949 +    0x31,0x43,0x08,0x50,0x48,0x31,0x44,0x08,  /* 00002D88    "1C.PH1D." */
 43.1950 +    0x50,0x48,0x31,0x45,0x08,0x50,0x48,0x31,  /* 00002D90    "PH1E.PH1" */
 43.1951 +    0x46,0x08,0x5B,0x80,0x44,0x47,0x31,0x5F,  /* 00002D98    "F.[.DG1_" */
 43.1952 +    0x01,0x0B,0x44,0xB0,0x0A,0x04,0x5B,0x81,  /* 00002DA0    "..D...[." */
 43.1953 +    0x10,0x44,0x47,0x31,0x5F,0x01,0x44,0x50,  /* 00002DA8    ".DG1_.DP" */
 43.1954 +    0x54,0x31,0x08,0x44,0x50,0x54,0x32,0x08,  /* 00002DB0    "T1.DPT2." */
 43.1955 +    0x14,0x4A,0x43,0x5F,0x4C,0x30,0x33,0x08,  /* 00002DB8    ".JC_L03." */
 43.1956 +    0x08,0x53,0x4C,0x54,0x5F,0x00,0x08,0x45,  /* 00002DC0    ".SLT_..E" */
 43.1957 +    0x56,0x54,0x5F,0x00,0x70,0x50,0x53,0x54,  /* 00002DC8    "VT_.pPST" */
 43.1958 +    0x41,0x61,0x7B,0x61,0x0A,0x0F,0x45,0x56,  /* 00002DD0    "Aa{a..EV" */
 43.1959 +    0x54,0x5F,0x70,0x50,0x53,0x54,0x42,0x61,  /* 00002DD8    "T_pPSTBa" */
 43.1960 +    0x7B,0x61,0x0A,0xFF,0x53,0x4C,0x54,0x5F,  /* 00002DE0    "{a..SLT_" */
 43.1961 +    0x70,0x53,0x4C,0x54,0x5F,0x44,0x50,0x54,  /* 00002DE8    "pSLT_DPT" */
 43.1962 +    0x31,0x70,0x45,0x56,0x54,0x5F,0x44,0x50,  /* 00002DF0    "1pEVT_DP" */
 43.1963 +    0x54,0x32,0xA0,0x1B,0x93,0x53,0x4C,0x54,  /* 00002DF8    "T2...SLT" */
 43.1964 +    0x5F,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002E00    "_..\/._S" */
 43.1965 +    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x30,  /* 00002E08    "B_PCI0S0" */
 43.1966 +    0x30,0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4C,  /* 00002E10    "0_EVT_.L" */
 43.1967 +    0x3D,0xA0,0x1B,0x93,0x53,0x4C,0x54,0x5F,  /* 00002E18    "=...SLT_" */
 43.1968 +    0x01,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002E20    "..\/._SB" */
 43.1969 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x31,  /* 00002E28    "_PCI0S01" */
 43.1970 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x3B,  /* 00002E30    "_EVT_.M;" */
 43.1971 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002E38    "...SLT_." */
 43.1972 +    0x02,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002E40    "..\/._SB" */
 43.1973 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x32,  /* 00002E48    "_PCI0S02" */
 43.1974 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x39,  /* 00002E50    "_EVT_.M9" */
 43.1975 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002E58    "...SLT_." */
 43.1976 +    0x03,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002E60    "..\/._SB" */
 43.1977 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x33,  /* 00002E68    "_PCI0S03" */
 43.1978 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x37,  /* 00002E70    "_EVT_.M7" */
 43.1979 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002E78    "...SLT_." */
 43.1980 +    0x04,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002E80    "..\/._SB" */
 43.1981 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x34,  /* 00002E88    "_PCI0S04" */
 43.1982 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x35,  /* 00002E90    "_EVT_.M5" */
 43.1983 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002E98    "...SLT_." */
 43.1984 +    0x05,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002EA0    "..\/._SB" */
 43.1985 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x35,  /* 00002EA8    "_PCI0S05" */
 43.1986 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x33,  /* 00002EB0    "_EVT_.M3" */
 43.1987 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002EB8    "...SLT_." */
 43.1988 +    0x06,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002EC0    "..\/._SB" */
 43.1989 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x36,  /* 00002EC8    "_PCI0S06" */
 43.1990 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x31,  /* 00002ED0    "_EVT_.M1" */
 43.1991 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002ED8    "...SLT_." */
 43.1992 +    0x07,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002EE0    "..\/._SB" */
 43.1993 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x37,  /* 00002EE8    "_PCI0S07" */
 43.1994 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x2F,  /* 00002EF0    "_EVT_.M/" */
 43.1995 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002EF8    "...SLT_." */
 43.1996 +    0x08,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002F00    "..\/._SB" */
 43.1997 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x38,  /* 00002F08    "_PCI0S08" */
 43.1998 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x2D,  /* 00002F10    "_EVT_.M-" */
 43.1999 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002F18    "...SLT_." */
 43.2000 +    0x09,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002F20    "..\/._SB" */
 43.2001 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x39,  /* 00002F28    "_PCI0S09" */
 43.2002 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x2B,  /* 00002F30    "_EVT_.M+" */
 43.2003 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002F38    "...SLT_." */
 43.2004 +    0x0A,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002F40    "..\/._SB" */
 43.2005 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x41,  /* 00002F48    "_PCI0S0A" */
 43.2006 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x29,  /* 00002F50    "_EVT_.M)" */
 43.2007 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002F58    "...SLT_." */
 43.2008 +    0x0B,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002F60    "..\/._SB" */
 43.2009 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x42,  /* 00002F68    "_PCI0S0B" */
 43.2010 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x27,  /* 00002F70    "_EVT_.M'" */
 43.2011 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002F78    "...SLT_." */
 43.2012 +    0x0C,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002F80    "..\/._SB" */
 43.2013 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x43,  /* 00002F88    "_PCI0S0C" */
 43.2014 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x25,  /* 00002F90    "_EVT_.M%" */
 43.2015 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002F98    "...SLT_." */
 43.2016 +    0x0D,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002FA0    "..\/._SB" */
 43.2017 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x44,  /* 00002FA8    "_PCI0S0D" */
 43.2018 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x23,  /* 00002FB0    "_EVT_.M#" */
 43.2019 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002FB8    "...SLT_." */
 43.2020 +    0x0E,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002FC0    "..\/._SB" */
 43.2021 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x45,  /* 00002FC8    "_PCI0S0E" */
 43.2022 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x21,  /* 00002FD0    "_EVT_.M!" */
 43.2023 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002FD8    "...SLT_." */
 43.2024 +    0x0F,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002FE0    "..\/._SB" */
 43.2025 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x30,0x46,  /* 00002FE8    "_PCI0S0F" */
 43.2026 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x1F,  /* 00002FF0    "_EVT_.M." */
 43.2027 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00002FF8    "...SLT_." */
 43.2028 +    0x10,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003000    "..\/._SB" */
 43.2029 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x30,  /* 00003008    "_PCI0S10" */
 43.2030 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x1D,  /* 00003010    "_EVT_.M." */
 43.2031 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003018    "...SLT_." */
 43.2032 +    0x11,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003020    "..\/._SB" */
 43.2033 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x31,  /* 00003028    "_PCI0S11" */
 43.2034 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x1B,  /* 00003030    "_EVT_.M." */
 43.2035 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003038    "...SLT_." */
 43.2036 +    0x12,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003040    "..\/._SB" */
 43.2037 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x32,  /* 00003048    "_PCI0S12" */
 43.2038 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x19,  /* 00003050    "_EVT_.M." */
 43.2039 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003058    "...SLT_." */
 43.2040 +    0x13,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003060    "..\/._SB" */
 43.2041 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x33,  /* 00003068    "_PCI0S13" */
 43.2042 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x17,  /* 00003070    "_EVT_.M." */
 43.2043 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003078    "...SLT_." */
 43.2044 +    0x14,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003080    "..\/._SB" */
 43.2045 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x34,  /* 00003088    "_PCI0S14" */
 43.2046 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x15,  /* 00003090    "_EVT_.M." */
 43.2047 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003098    "...SLT_." */
 43.2048 +    0x15,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000030A0    "..\/._SB" */
 43.2049 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x35,  /* 000030A8    "_PCI0S15" */
 43.2050 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x13,  /* 000030B0    "_EVT_.M." */
 43.2051 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 000030B8    "...SLT_." */
 43.2052 +    0x16,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000030C0    "..\/._SB" */
 43.2053 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x36,  /* 000030C8    "_PCI0S16" */
 43.2054 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x11,  /* 000030D0    "_EVT_.M." */
 43.2055 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 000030D8    "...SLT_." */
 43.2056 +    0x17,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000030E0    "..\/._SB" */
 43.2057 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x37,  /* 000030E8    "_PCI0S17" */
 43.2058 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x0F,  /* 000030F0    "_EVT_.M." */
 43.2059 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 000030F8    "...SLT_." */
 43.2060 +    0x18,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003100    "..\/._SB" */
 43.2061 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x38,  /* 00003108    "_PCI0S18" */
 43.2062 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x0D,  /* 00003110    "_EVT_.M." */
 43.2063 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003118    "...SLT_." */
 43.2064 +    0x19,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003120    "..\/._SB" */
 43.2065 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x39,  /* 00003128    "_PCI0S19" */
 43.2066 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x0B,  /* 00003130    "_EVT_.M." */
 43.2067 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003138    "...SLT_." */
 43.2068 +    0x1A,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003140    "..\/._SB" */
 43.2069 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x41,  /* 00003148    "_PCI0S1A" */
 43.2070 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x09,  /* 00003150    "_EVT_.M." */
 43.2071 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003158    "...SLT_." */
 43.2072 +    0x1B,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003160    "..\/._SB" */
 43.2073 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x42,  /* 00003168    "_PCI0S1B" */
 43.2074 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x07,  /* 00003170    "_EVT_.M." */
 43.2075 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003178    "...SLT_." */
 43.2076 +    0x1C,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00003180    "..\/._SB" */
 43.2077 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x43,  /* 00003188    "_PCI0S1C" */
 43.2078 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x4D,0x05,  /* 00003190    "_EVT_.M." */
 43.2079 +    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00003198    "...SLT_." */
 43.2080 +    0x1D,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000031A0    "..\/._SB" */
 43.2081 +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x44,  /* 000031A8    "_PCI0S1D" */
 43.2082 +    0x5F,0x45,0x56,0x54,0x5F,0xA1,0x3D,0xA0,  /* 000031B0    "_EVT_.=." */
 43.2083 +    0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,0x1E,  /* 000031B8    "..SLT_.." */
 43.2084 +    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000031C0    ".\/._SB_" */
 43.2085 +    0x50,0x43,0x49,0x30,0x53,0x31,0x45,0x5F,  /* 000031C8    "PCI0S1E_" */
 43.2086 +    0x45,0x56,0x54,0x5F,0xA1,0x1E,0xA0,0x1C,  /* 000031D0    "EVT_...." */
 43.2087 +    0x93,0x53,0x4C,0x54,0x5F,0x0A,0x1F,0x86,  /* 000031D8    ".SLT_..." */
 43.2088 +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000031E0    "\/._SB_P" */
 43.2089 +    0x43,0x49,0x30,0x53,0x31,0x46,0x5F,0x45,  /* 000031E8    "CI0S1F_E" */
 43.2090 +    0x56,0x54,0x5F,
 43.2091  };
 43.2092  int DsdtLen=sizeof(AmlCode);
    44.1 --- a/tools/firmware/hvmloader/acpi/static_tables.c	Mon Mar 30 19:56:30 2009 -0700
    44.2 +++ b/tools/firmware/hvmloader/acpi/static_tables.c	Thu Apr 23 18:49:41 2009 -0700
    44.3 @@ -69,7 +69,7 @@ struct acpi_20_fadt Fadt = {
    44.4      .p_lvl3_lat = 0x0fff, /* >1000, means we do not support C3 state */
    44.5      .iapc_boot_arch = ACPI_8042,
    44.6      .flags = (ACPI_PROC_C1 | ACPI_SLP_BUTTON |
    44.7 -              ACPI_WBINVD | ACPI_PWR_BUTTON |
    44.8 +              ACPI_WBINVD |
    44.9                ACPI_FIX_RTC | ACPI_TMR_VAL_EXT),
   44.10  
   44.11      .reset_reg = {
    45.1 --- a/tools/firmware/hvmloader/config.h	Mon Mar 30 19:56:30 2009 -0700
    45.2 +++ b/tools/firmware/hvmloader/config.h	Thu Apr 23 18:49:41 2009 -0700
    45.3 @@ -47,6 +47,7 @@ extern unsigned long pci_mem_start, pci_
    45.4  #define E820_OFFSET                   0x8
    45.5  
    45.6  /* Xen Platform Device */
    45.7 +#define XEN_PF_IOBASE   0x10
    45.8  #define PFFLAG_ROM_LOCK 1 /* Sets whether ROM memory area is RW or RO */
    45.9  
   45.10  /* Located at BIOS_INFO_PHYSICAL_ADDRESS. */
   45.11 @@ -56,9 +57,7 @@ struct bios_info {
   45.12      uint8_t  hpet_present:1;    /* 0[2] - System has HPET? */
   45.13      uint32_t pci_min, pci_len;  /* 4, 8 - PCI I/O hole boundaries */
   45.14      uint32_t bios32_entry;      /* 12   - Entry point for 32-bit BIOS */
   45.15 -    uint16_t xen_pfiob;         /* 16   - Xen platform device I/O ports */
   45.16  };
   45.17  #define BIOSINFO_OFF_bios32_entry 12
   45.18 -#define BIOSINFO_OFF_xen_pfiob    16
   45.19  
   45.20  #endif /* __HVMLOADER_CONFIG_H__ */
    46.1 --- a/tools/firmware/hvmloader/hvmloader.c	Mon Mar 30 19:56:30 2009 -0700
    46.2 +++ b/tools/firmware/hvmloader/hvmloader.c	Thu Apr 23 18:49:41 2009 -0700
    46.3 @@ -88,8 +88,8 @@ asm (
    46.4      "    .align 8                    \n"
    46.5      "gdt:                            \n"
    46.6      "    .quad 0x0000000000000000    \n"
    46.7 -    "    .quad 0x00009a000000ffff    \n" /* Ring 0 code, base 0 limit 0xffff */
    46.8 -    "    .quad 0x000092000000ffff    \n" /* Ring 0 data, base 0 limit 0xffff */
    46.9 +    "    .quad 0x008f9a000000ffff    \n" /* Ring 0 16b code, base 0 limit 4G */
   46.10 +    "    .quad 0x008f92000000ffff    \n" /* Ring 0 16b data, base 0 limit 4G */
   46.11      "gdt_end:                        \n"
   46.12      "                                \n"
   46.13      "    .bss                        \n"
   46.14 @@ -539,25 +539,6 @@ static void cmos_write_memory_size(void)
   46.15      cmos_outb(0x35, (uint8_t)( alt_mem >> 8));
   46.16  }
   46.17  
   46.18 -static uint16_t xen_platform_io_base(void)
   46.19 -{
   46.20 -    uint32_t devfn, bar_data;
   46.21 -    uint16_t vendor_id, device_id;
   46.22 -
   46.23 -    for ( devfn = 0; devfn < 128; devfn++ )
   46.24 -    {
   46.25 -        vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
   46.26 -        device_id = pci_readw(devfn, PCI_DEVICE_ID);
   46.27 -        if ( (vendor_id == 0x5853) && (device_id == 0x0001) )
   46.28 -        {
   46.29 -            bar_data = pci_readl(devfn, PCI_BASE_ADDRESS_0);
   46.30 -            return bar_data & PCI_BASE_ADDRESS_IO_MASK;
   46.31 -        }
   46.32 -    }
   46.33 -
   46.34 -    return 0;
   46.35 -}
   46.36 -
   46.37  /*
   46.38   * Set up an empty TSS area for virtual 8086 mode to use. 
   46.39   * The only important thing is that it musn't have any bits set 
   46.40 @@ -744,7 +725,6 @@ int main(void)
   46.41      bios_info->pci_min = pci_mem_start;
   46.42      bios_info->pci_len = pci_mem_end - pci_mem_start;
   46.43      bios_info->bios32_entry = bios32_addr;
   46.44 -    bios_info->xen_pfiob = xen_platform_io_base();
   46.45  
   46.46      printf("Invoking ROMBIOS ...\n");
   46.47      return 0;
    47.1 --- a/tools/firmware/rombios/32bit/pmm.c	Mon Mar 30 19:56:30 2009 -0700
    47.2 +++ b/tools/firmware/rombios/32bit/pmm.c	Thu Apr 23 18:49:41 2009 -0700
    47.3 @@ -71,10 +71,13 @@
    47.4  
    47.5  #define DEBUG_PMM 0
    47.6  
    47.7 +#define __stringify(a) #a
    47.8 +#define stringify(a) __stringify(a)
    47.9 +
   47.10  #define ASSERT(_expr, _action)                                  \
   47.11      if (!(_expr)) {                                             \
   47.12          printf("ASSERTION FAIL: %s %s:%d %s()\n",               \
   47.13 -               __STRING(_expr), __FILE__, __LINE__, __func__);  \
   47.14 +               stringify(_expr), __FILE__, __LINE__, __func__); \
   47.15          _action;                                                \
   47.16      } else
   47.17  
    48.1 --- a/tools/firmware/rombios/32bitgateway.c	Mon Mar 30 19:56:30 2009 -0700
    48.2 +++ b/tools/firmware/rombios/32bitgateway.c	Thu Apr 23 18:49:41 2009 -0700
    48.3 @@ -56,13 +56,13 @@ gdt_entry_pm_32bit_cs:
    48.4      .byte 0x00, 0x9b, 0xcf, 0x00
    48.5  gdt_entry_pm_16bit_cs:
    48.6      .word 0xffff, 0x0000
    48.7 -    .byte REAL_MODE_CODE_OFFSET >> 16, 0x9b, 0x0, 0x0
    48.8 +    .byte REAL_MODE_CODE_OFFSET >> 16, 0x9b, 0x8f, 0x0
    48.9  gdt_entry_pm_32bit_ds:
   48.10      .word 0xffff, 0x0000
   48.11      .byte 0x0, 0x93, 0xcf, 0x0
   48.12  gdt_entry_pm_16bit_ds:
   48.13      .word 0xffff, 0x0000
   48.14 -    .byte 0x0, 0x93, 0x0, 0x0
   48.15 +    .byte 0x0, 0x93, 0x8f, 0x0
   48.16  gdt_entry_end:
   48.17  
   48.18  protmode_gdtdesc:
    49.1 --- a/tools/firmware/rombios/rombios.c	Mon Mar 30 19:56:30 2009 -0700
    49.2 +++ b/tools/firmware/rombios/rombios.c	Thu Apr 23 18:49:41 2009 -0700
    49.3 @@ -1418,24 +1418,14 @@ fixup_base_mem_in_k()
    49.4    write_word(0x40, 0x13, base_mem >> 10);
    49.5  }
    49.6  
    49.7 -ASM_START
    49.8 -_rom_write_access_control:
    49.9 -    push ds
   49.10 -    mov ax,#(BIOS_INFO_PHYSICAL_ADDRESS >> 4)
   49.11 -    mov ds,ax
   49.12 -    mov ax,[BIOSINFO_OFF_xen_pfiob]
   49.13 -    pop ds
   49.14 -    ret
   49.15 -ASM_END
   49.16 -
   49.17  void enable_rom_write_access()
   49.18  {
   49.19 -    outb(rom_write_access_control(), 0);
   49.20 +    outb(XEN_PF_IOBASE, 0);
   49.21  }
   49.22  
   49.23  void disable_rom_write_access()
   49.24  {
   49.25 -    outb(rom_write_access_control(), PFFLAG_ROM_LOCK);
   49.26 +    outb(XEN_PF_IOBASE, PFFLAG_ROM_LOCK);
   49.27  }
   49.28      
   49.29  #endif /* HVMASSIST */
    50.1 --- a/tools/fs-back/Makefile	Mon Mar 30 19:56:30 2009 -0700
    50.2 +++ b/tools/fs-back/Makefile	Thu Apr 23 18:49:41 2009 -0700
    50.3 @@ -16,7 +16,7 @@ CFLAGS   += -D_GNU_SOURCE
    50.4  LIBS      := -L. -L.. -L../lib
    50.5  LIBS      += $(LDFLAGS_libxenctrl)
    50.6  LIBS      += $(LDFLAGS_libxenstore)
    50.7 -LIBS      += -lpthread -lrt 
    50.8 +LIBS      += -lrt 
    50.9  
   50.10  OBJS	  := fs-xenbus.o fs-ops.o
   50.11  
    51.1 --- a/tools/fs-back/fs-backend.c	Mon Mar 30 19:56:30 2009 -0700
    51.2 +++ b/tools/fs-back/fs-backend.c	Thu Apr 23 18:49:41 2009 -0700
    51.3 @@ -1,108 +1,76 @@
    51.4  #undef NDEBUG
    51.5 +#include <unistd.h>
    51.6  #include <stdio.h>
    51.7  #include <string.h>
    51.8  #include <assert.h>
    51.9  #include <malloc.h>
   51.10 -#include <pthread.h>
   51.11  #include <xenctrl.h>
   51.12  #include <aio.h>
   51.13  #include <sys/mman.h>
   51.14  #include <sys/select.h>
   51.15 +#include <sys/socket.h>
   51.16  #include <xen/io/ring.h>
   51.17 +#include <xc_private.h>
   51.18 +#include <err.h>
   51.19 +#include "sys-queue.h"
   51.20  #include "fs-backend.h"
   51.21 +#include "fs-debug.h"
   51.22  
   51.23  struct xs_handle *xsh = NULL;
   51.24  static struct fs_export *fs_exports = NULL;
   51.25  static int export_id = 0;
   51.26  static int mount_id = 0;
   51.27 +static int pipefds[2];
   51.28 +static LIST_HEAD(mount_requests_head, fs_mount) mount_requests_head;
   51.29  
   51.30 -static void dispatch_response(struct fs_mount *mount, int priv_req_id)
   51.31 +static void free_mount_request(struct fs_mount *mount);
   51.32 +
   51.33 +static void dispatch_response(struct fs_request *request)
   51.34  {
   51.35      int i;
   51.36      struct fs_op *op;
   51.37 -    struct fs_request *req = &mount->requests[priv_req_id];
   51.38  
   51.39      for(i=0;;i++)
   51.40      {
   51.41          op = fsops[i];
   51.42          /* We should dispatch a response before reaching the end of the array */
   51.43          assert(op != NULL);
   51.44 -        if(op->type == req->req_shadow.type)
   51.45 +        if(op->type == request->req_shadow.type)
   51.46          {
   51.47 -            printf("Found op for type=%d\n", op->type);
   51.48 +            FS_DEBUG("Found op for type=%d\n", op->type);
   51.49              /* There needs to be a response handler */
   51.50              assert(op->response_handler != NULL);
   51.51 -            op->response_handler(mount, req);
   51.52 +            op->response_handler(request->mount, request);
   51.53              break;
   51.54          }
   51.55      }
   51.56  
   51.57 -    req->active = 0;
   51.58 -    add_id_to_freelist(priv_req_id, mount->freelist);
   51.59 +    request->active = 0;
   51.60 +    add_id_to_freelist(request->id, request->mount->freelist);
   51.61  }
   51.62  
   51.63 -static void handle_aio_events(struct fs_mount *mount)
   51.64 +static void handle_aio_event(struct fs_request *request)
   51.65  {
   51.66 -    int fd, ret, count, i, notify;
   51.67 -    evtchn_port_t port;
   51.68 -    /* AIO control block for the evtchn file destriptor */
   51.69 -    struct aiocb evtchn_cb;
   51.70 -    const struct aiocb * cb_list[mount->nr_entries];
   51.71 -    int request_ids[mount->nr_entries];
   51.72 -
   51.73 -    /* Prepare the AIO control block for evtchn */ 
   51.74 -    fd = xc_evtchn_fd(mount->evth); 
   51.75 -    bzero(&evtchn_cb, sizeof(struct aiocb));
   51.76 -    evtchn_cb.aio_fildes = fd;
   51.77 -    evtchn_cb.aio_nbytes = sizeof(port);
   51.78 -    evtchn_cb.aio_buf = &port;
   51.79 -    assert(aio_read(&evtchn_cb) == 0);
   51.80 +    int ret, notify;
   51.81  
   51.82 -wait_again:   
   51.83 -    /* Create list of active AIO requests */
   51.84 -    count = 0;
   51.85 -    for(i=0; i<mount->nr_entries; i++)
   51.86 -        if(mount->requests[i].active)
   51.87 -        {
   51.88 -            cb_list[count] = &mount->requests[i].aiocb;
   51.89 -            request_ids[count] = i;
   51.90 -            count++;
   51.91 -        }
   51.92 -    /* Add the event channel at the end of the list. Event channel needs to be
   51.93 -     * handled last as it exits this function. */
   51.94 -    cb_list[count] = &evtchn_cb;
   51.95 -    request_ids[count] = -1;
   51.96 -    count++;
   51.97 +    FS_DEBUG("handle_aio_event: mount %s request %d\n", request->mount->frontend, request->id);
   51.98 +    if (request->active < 0) {
   51.99 +        request->mount->nr_entries++;
  51.100 +        if (!request->mount->nr_entries)
  51.101 +            free_mount_request(request->mount);
  51.102 +        return;
  51.103 +    }
  51.104  
  51.105 -    /* Block till an AIO requset finishes, or we get an event */ 
  51.106 -    while(1) {
  51.107 -	int ret = aio_suspend(cb_list, count, NULL);
  51.108 -	if (!ret)
  51.109 -	    break;
  51.110 -	assert(errno == EINTR);
  51.111 -    }
  51.112 -    for(i=0; i<count; i++)
  51.113 -        if(aio_error(cb_list[i]) != EINPROGRESS)
  51.114 -        {
  51.115 -            if(request_ids[i] >= 0)
  51.116 -                dispatch_response(mount, request_ids[i]);
  51.117 -            else
  51.118 -                goto read_event_channel;
  51.119 -        }
  51.120 - 
  51.121 -    RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&mount->ring, notify);
  51.122 -    printf("Pushed responces and notify=%d\n", notify);
  51.123 +    ret = aio_error(&request->aiocb);
  51.124 +    if(ret != EINPROGRESS && ret != ECANCELED)
  51.125 +        dispatch_response(request);
  51.126 +
  51.127 +    RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&request->mount->ring, notify);
  51.128 +    FS_DEBUG("Pushed responces and notify=%d\n", notify);
  51.129      if(notify)
  51.130 -        xc_evtchn_notify(mount->evth, mount->local_evtchn);
  51.131 -    
  51.132 -    goto wait_again;
  51.133 -
  51.134 -read_event_channel:    
  51.135 -    assert(aio_return(&evtchn_cb) == sizeof(evtchn_port_t)); 
  51.136 -    assert(xc_evtchn_unmask(mount->evth, mount->local_evtchn) >= 0);
  51.137 +        xc_evtchn_notify(request->mount->evth, request->mount->local_evtchn);
  51.138  }
  51.139  
  51.140 -
  51.141  static void allocate_request_array(struct fs_mount *mount)
  51.142  {
  51.143      int i, nr_entries = mount->nr_entries;
  51.144 @@ -116,6 +84,7 @@ static void allocate_request_array(struc
  51.145      for(i=0; i< nr_entries; i++)
  51.146      {
  51.147          requests[i].active = 0; 
  51.148 +        requests[i].mount = mount; 
  51.149          add_id_to_freelist(i, freelist);
  51.150      }
  51.151      mount->requests = requests;
  51.152 @@ -123,86 +92,102 @@ static void allocate_request_array(struc
  51.153  }
  51.154  
  51.155  
  51.156 -static void *handle_mount(void *data)
  51.157 +static void handle_mount(struct fs_mount *mount)
  51.158  {
  51.159      int more, notify;
  51.160 -    struct fs_mount *mount = (struct fs_mount *)data;
  51.161 -    
  51.162 -    printf("Starting a thread for mount: %d\n", mount->mount_id);
  51.163 -    allocate_request_array(mount);
  51.164 +    int nr_consumed=0;
  51.165 +    RING_IDX cons, rp;
  51.166 +    struct fsif_request *req;
  51.167  
  51.168 -    for(;;)
  51.169 -    {
  51.170 -        int nr_consumed=0;
  51.171 -        RING_IDX cons, rp;
  51.172 -        struct fsif_request *req;
  51.173 -
  51.174 -        handle_aio_events(mount);
  51.175  moretodo:
  51.176 -        rp = mount->ring.sring->req_prod;
  51.177 -        xen_rmb(); /* Ensure we see queued requests up to 'rp'. */
  51.178 +    rp = mount->ring.sring->req_prod;
  51.179 +    xen_rmb(); /* Ensure we see queued requests up to 'rp'. */
  51.180  
  51.181 -        while ((cons = mount->ring.req_cons) != rp)
  51.182 +    while ((cons = mount->ring.req_cons) != rp)
  51.183 +    {
  51.184 +        int i;
  51.185 +        struct fs_op *op;
  51.186 +
  51.187 +        FS_DEBUG("Got a request at %d (of %d)\n", 
  51.188 +                cons, RING_SIZE(&mount->ring));
  51.189 +        req = RING_GET_REQUEST(&mount->ring, cons);
  51.190 +        FS_DEBUG("Request type=%d\n", req->type); 
  51.191 +        for(i=0;;i++)
  51.192          {
  51.193 -            int i;
  51.194 -            struct fs_op *op;
  51.195 -
  51.196 -            printf("Got a request at %d (of %d)\n", 
  51.197 -                    cons, RING_SIZE(&mount->ring));
  51.198 -            req = RING_GET_REQUEST(&mount->ring, cons);
  51.199 -            printf("Request type=%d\n", req->type); 
  51.200 -            for(i=0;;i++)
  51.201 +            op = fsops[i];
  51.202 +            if(op == NULL)
  51.203 +            {
  51.204 +                /* We've reached the end of the array, no appropirate
  51.205 +                 * handler found. Warn, ignore and continue. */
  51.206 +                FS_DEBUG("WARN: Unknown request type: %d\n", req->type);
  51.207 +                mount->ring.req_cons++; 
  51.208 +                break;
  51.209 +            }
  51.210 +            if(op->type == req->type)
  51.211              {
  51.212 -                op = fsops[i];
  51.213 -                if(op == NULL)
  51.214 -                {
  51.215 -                    /* We've reached the end of the array, no appropirate
  51.216 -                     * handler found. Warn, ignore and continue. */
  51.217 -                    printf("WARN: Unknown request type: %d\n", req->type);
  51.218 -                    mount->ring.req_cons++; 
  51.219 -                    break;
  51.220 -                }
  51.221 -                if(op->type == req->type)
  51.222 -                {
  51.223 -                    /* There needs to be a dispatch handler */
  51.224 -                    assert(op->dispatch_handler != NULL);
  51.225 -                    op->dispatch_handler(mount, req);
  51.226 -                    break;
  51.227 -                }
  51.228 -             }
  51.229 +                /* There needs to be a dispatch handler */
  51.230 +                assert(op->dispatch_handler != NULL);
  51.231 +                op->dispatch_handler(mount, req);
  51.232 +                break;
  51.233 +            }
  51.234 +        }
  51.235 +
  51.236 +        nr_consumed++;
  51.237 +    }
  51.238 +    FS_DEBUG("Backend consumed: %d requests\n", nr_consumed);
  51.239 +    RING_FINAL_CHECK_FOR_REQUESTS(&mount->ring, more);
  51.240 +    if(more) goto moretodo;
  51.241 +
  51.242 +    RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&mount->ring, notify);
  51.243 +    FS_DEBUG("Pushed responces and notify=%d\n", notify);
  51.244 +    if(notify)
  51.245 +        xc_evtchn_notify(mount->evth, mount->local_evtchn);
  51.246 +}
  51.247  
  51.248 -            nr_consumed++;
  51.249 -        }
  51.250 -        printf("Backend consumed: %d requests\n", nr_consumed);
  51.251 -        RING_FINAL_CHECK_FOR_REQUESTS(&mount->ring, more);
  51.252 -        if(more) goto moretodo;
  51.253 +static void terminate_mount_request(struct fs_mount *mount) {
  51.254 +    int count = 0, i;
  51.255 +
  51.256 +    FS_DEBUG("terminate_mount_request %s\n", mount->frontend);
  51.257 +    xenbus_write_backend_state(mount, STATE_CLOSING);
  51.258  
  51.259 -        RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&mount->ring, notify);
  51.260 -        printf("Pushed responces and notify=%d\n", notify);
  51.261 -        if(notify)
  51.262 -            xc_evtchn_notify(mount->evth, mount->local_evtchn);
  51.263 -    }
  51.264 - 
  51.265 -    printf("Destroying thread for mount: %d\n", mount->mount_id);
  51.266 -    xc_gnttab_munmap(mount->gnth, mount->ring.sring, 1);
  51.267 +    for(i=0; i<mount->nr_entries; i++)
  51.268 +        if(mount->requests[i].active) {
  51.269 +            mount->requests[i].active = -1;
  51.270 +            aio_cancel(mount->requests[i].aiocb.aio_fildes, &mount->requests[i].aiocb);
  51.271 +            count--;
  51.272 +        }
  51.273 +    mount->nr_entries = count;
  51.274 +
  51.275 +    while (!xenbus_frontend_state_changed(mount, STATE_CLOSING));
  51.276 +    xenbus_write_backend_state(mount, STATE_CLOSED);
  51.277 +
  51.278 +    xc_gnttab_munmap(mount->gnth, mount->ring.sring, mount->shared_ring_size);
  51.279      xc_gnttab_close(mount->gnth);
  51.280      xc_evtchn_unbind(mount->evth, mount->local_evtchn);
  51.281      xc_evtchn_close(mount->evth);
  51.282 +
  51.283 +    if (!count)
  51.284 +        free_mount_request(mount);
  51.285 +}
  51.286 +
  51.287 +static void free_mount_request(struct fs_mount *mount) {
  51.288 +    FS_DEBUG("free_mount_request %s\n", mount->frontend);
  51.289      free(mount->frontend);
  51.290 -    pthread_exit(NULL);
  51.291 +    free(mount->requests);
  51.292 +    free(mount->freelist);
  51.293 +    LIST_REMOVE (mount, entries);
  51.294 +    free(mount);
  51.295  }
  51.296  
  51.297  static void handle_connection(int frontend_dom_id, int export_id, char *frontend)
  51.298  {
  51.299      struct fs_mount *mount;
  51.300      struct fs_export *export;
  51.301 -    int evt_port;
  51.302 -    pthread_t handling_thread;
  51.303      struct fsif_sring *sring;
  51.304      uint32_t dom_ids[MAX_RING_SIZE];
  51.305      int i;
  51.306  
  51.307 -    printf("Handling connection from dom=%d, for export=%d\n", 
  51.308 +    FS_DEBUG("Handling connection from dom=%d, for export=%d\n", 
  51.309              frontend_dom_id, export_id);
  51.310      /* Try to find the export on the list */
  51.311      export = fs_exports;
  51.312 @@ -214,7 +199,7 @@ static void handle_connection(int fronte
  51.313      }
  51.314      if(!export)
  51.315      {
  51.316 -        printf("Could not find the export (the id is unknown).\n");
  51.317 +        FS_DEBUG("Could not find the export (the id is unknown).\n");
  51.318          return;
  51.319      }
  51.320  
  51.321 @@ -223,7 +208,7 @@ static void handle_connection(int fronte
  51.322      mount->export = export;
  51.323      mount->mount_id = mount_id++;
  51.324      xenbus_read_mount_request(mount, frontend);
  51.325 -    printf("Frontend found at: %s (gref=%d, evtchn=%d)\n", 
  51.326 +    FS_DEBUG("Frontend found at: %s (gref=%d, evtchn=%d)\n", 
  51.327              mount->frontend, mount->grefs[0], mount->remote_evtchn);
  51.328      xenbus_write_backend_node(mount);
  51.329      mount->evth = -1;
  51.330 @@ -249,18 +234,24 @@ static void handle_connection(int fronte
  51.331      mount->nr_entries = mount->ring.nr_ents; 
  51.332      for (i = 0; i < MAX_FDS; i++)
  51.333          mount->fds[i] = -1;
  51.334 -    xenbus_write_backend_ready(mount);
  51.335  
  51.336 -    pthread_create(&handling_thread, NULL, &handle_mount, mount);
  51.337 +    LIST_INSERT_HEAD(&mount_requests_head, mount, entries);
  51.338 +    xenbus_watch_frontend_state(mount);
  51.339 +    xenbus_write_backend_state(mount, STATE_READY);
  51.340 +    
  51.341 +    allocate_request_array(mount);
  51.342  }
  51.343  
  51.344  static void await_connections(void)
  51.345  {
  51.346 -    int fd, ret, dom_id, export_id; 
  51.347 +    int fd, max_fd, ret, dom_id, export_id; 
  51.348      fd_set fds;
  51.349      char **watch_paths;
  51.350      unsigned int len;
  51.351      char d;
  51.352 +    struct fs_mount *pointer;
  51.353 +
  51.354 +    LIST_INIT (&mount_requests_head);
  51.355  
  51.356      assert(xsh != NULL);
  51.357      fd = xenbus_get_watch_fd(); 
  51.358 @@ -268,28 +259,97 @@ static void await_connections(void)
  51.359      do {
  51.360  	FD_ZERO(&fds);
  51.361  	FD_SET(fd, &fds);
  51.362 -        ret = select(fd+1, &fds, NULL, NULL, NULL);
  51.363 -        assert(ret == 1);
  51.364 -        watch_paths = xs_read_watch(xsh, &len);
  51.365 -        assert(len == 2);
  51.366 -        assert(strcmp(watch_paths[1], "conn-watch") == 0);
  51.367 -        dom_id = -1;
  51.368 -        export_id = -1;
  51.369 -	d = 0;
  51.370 -        printf("Path changed %s\n", watch_paths[0]);
  51.371 -        sscanf(watch_paths[0], WATCH_NODE"/%d/%d/fronten%c", 
  51.372 -                &dom_id, &export_id, &d);
  51.373 -        if((dom_id >= 0) && (export_id >= 0) && d == 'd') {
  51.374 -	    char *frontend = xs_read(xsh, XBT_NULL, watch_paths[0], NULL);
  51.375 -	    if (frontend) {
  51.376 -		handle_connection(dom_id, export_id, frontend);
  51.377 -		xs_rm(xsh, XBT_NULL, watch_paths[0]);
  51.378 -	    }
  51.379 -	}
  51.380 -next_select:        
  51.381 -        printf("Awaiting next connection.\n");
  51.382 -        /* TODO - we need to figure out what to free */
  51.383 -	free(watch_paths);
  51.384 +	FD_SET(pipefds[0], &fds);
  51.385 +        max_fd = fd > pipefds[0] ? fd : pipefds[0];
  51.386 +        LIST_FOREACH(pointer, &mount_requests_head, entries) {
  51.387 +            int tfd = xc_evtchn_fd(pointer->evth);
  51.388 +            FD_SET(tfd, &fds);
  51.389 +            if (tfd > max_fd) max_fd = tfd;
  51.390 +        }
  51.391 +        ret = select(max_fd+1, &fds, NULL, NULL, NULL);
  51.392 +        if (ret < 0) {
  51.393 +            if (errno == EINTR) continue;
  51.394 +            /* try to recover */
  51.395 +            else if (errno == EBADF) {
  51.396 +                struct timeval timeout;
  51.397 +                memset(&timeout, 0x00, sizeof(timeout));
  51.398 +                FD_ZERO(&fds);
  51.399 +                FD_SET(fd, &fds);
  51.400 +                FD_SET(pipefds[0], &fds);
  51.401 +                max_fd = fd > pipefds[0] ? fd : pipefds[0];
  51.402 +                ret = select(max_fd + 1, &fds, NULL, NULL, &timeout);
  51.403 +                if (ret < 0)
  51.404 +                    err(1, "select: unrecoverable error occurred: %d\n", errno);
  51.405 +
  51.406 +                /* trying to find the bogus fd among the open event channels */
  51.407 +                LIST_FOREACH(pointer, &mount_requests_head, entries) {
  51.408 +                    int tfd = xc_evtchn_fd(pointer->evth);
  51.409 +                    memset(&timeout, 0x00, sizeof(timeout));
  51.410 +                    FD_ZERO(&fds);
  51.411 +                    FD_SET(tfd, &fds);
  51.412 +                    ret = select(tfd + 1, &fds, NULL, NULL, &timeout);
  51.413 +                    if (ret < 0) {
  51.414 +                        FS_DEBUG("fd %d is bogus, closing the related connection\n", tfd);
  51.415 +                        pointer->evth = fd;
  51.416 +                        terminate_mount_request(pointer);
  51.417 +                        continue;
  51.418 +                    }
  51.419 +                }
  51.420 +                continue;
  51.421 +            } else
  51.422 +                err(1, "select: unrecoverable error occurred: %d\n", errno);
  51.423 +        }
  51.424 +        if (FD_ISSET(fd, &fds)) {
  51.425 +            watch_paths = xs_read_watch(xsh, &len);
  51.426 +            if (!strcmp(watch_paths[XS_WATCH_TOKEN], "conn-watch")) {
  51.427 +                dom_id = -1;
  51.428 +                export_id = -1;
  51.429 +                d = 0;
  51.430 +                FS_DEBUG("Path changed %s\n", watch_paths[0]);
  51.431 +                sscanf(watch_paths[XS_WATCH_PATH], WATCH_NODE"/%d/%d/fronten%c", 
  51.432 +                        &dom_id, &export_id, &d);
  51.433 +                if((dom_id >= 0) && (export_id >= 0) && d == 'd') {
  51.434 +                    char *frontend = xs_read(xsh, XBT_NULL, watch_paths[XS_WATCH_PATH], NULL);
  51.435 +                    if (frontend) {
  51.436 +                        handle_connection(dom_id, export_id, frontend);
  51.437 +                        xs_rm(xsh, XBT_NULL, watch_paths[XS_WATCH_PATH]);
  51.438 +                    }
  51.439 +                }
  51.440 +            } else if (!strcmp(watch_paths[XS_WATCH_TOKEN], "frontend-state")) {
  51.441 +                LIST_FOREACH(pointer, &mount_requests_head, entries) {
  51.442 +                    if (!strncmp(pointer->frontend, watch_paths[XS_WATCH_PATH], strlen(pointer->frontend))) {
  51.443 +                        char *state = xenbus_read_frontend_state(pointer);
  51.444 +                        if (!state || strcmp(state, STATE_READY)) {
  51.445 +                            xenbus_unwatch_frontend_state(pointer);
  51.446 +                            terminate_mount_request(pointer);
  51.447 +                        }
  51.448 +                        free(state);
  51.449 +                        break;
  51.450 +                    }
  51.451 +                }
  51.452 +            } else {
  51.453 +                FS_DEBUG("xenstore watch event unrecognized\n");
  51.454 +            }
  51.455 +            FS_DEBUG("Awaiting next connection.\n");
  51.456 +            /* TODO - we need to figure out what to free */
  51.457 +            free(watch_paths);
  51.458 +        }
  51.459 +        if (FD_ISSET(pipefds[0], &fds)) {
  51.460 +            struct fs_request *request;
  51.461 +            if (read_exact(pipefds[0], &request, sizeof(struct fs_request *)) < 0)
  51.462 +                err(1, "read request failed\n");
  51.463 +            handle_aio_event(request); 
  51.464 +        }
  51.465 +        LIST_FOREACH(pointer, &mount_requests_head, entries) {
  51.466 +            if (FD_ISSET(xc_evtchn_fd(pointer->evth), &fds)) {
  51.467 +                evtchn_port_t port;
  51.468 +                port = xc_evtchn_pending(pointer->evth);
  51.469 +                if (port != -1) {
  51.470 +                    handle_mount(pointer);
  51.471 +                    xc_evtchn_unmask(pointer->evth, port);
  51.472 +                }
  51.473 +            }
  51.474 +        }
  51.475      } while (1);
  51.476  }
  51.477  
  51.478 @@ -312,10 +372,29 @@ static struct fs_export* create_export(c
  51.479      return curr_export;
  51.480  }
  51.481  
  51.482 +static void aio_signal_handler(int signo, siginfo_t *info, void *context)
  51.483 +{
  51.484 +    struct fs_request *request = (struct fs_request*) info->si_value.sival_ptr;
  51.485 +    int saved_errno = errno;
  51.486 +    if (write_exact(pipefds[1], &request, sizeof(struct fs_request *)) < 0)
  51.487 +        err(1, "write request filed\n");
  51.488 +    errno = saved_errno;
  51.489 +}
  51.490  
  51.491  int main(void)
  51.492  {
  51.493      struct fs_export *export;
  51.494 +    struct sigaction act;
  51.495 +    sigset_t enable;
  51.496 +
  51.497 +    sigemptyset(&enable);
  51.498 +    sigaddset(&enable, SIGUSR2);
  51.499 +    pthread_sigmask(SIG_UNBLOCK, &enable, NULL);
  51.500 +
  51.501 +    sigfillset(&act.sa_mask);
  51.502 +    act.sa_flags = SA_SIGINFO; /* do not restart syscalls to interrupt select(); use sa_sigaction */
  51.503 +    act.sa_sigaction = aio_signal_handler;
  51.504 +    sigaction(SIGUSR2, &act, NULL);
  51.505  
  51.506      /* Open the connection to XenStore first */
  51.507      xsh = xs_domain_open();
  51.508 @@ -328,6 +407,9 @@ int main(void)
  51.509      export = create_export("default", "/exports");
  51.510      xenbus_register_export(export);
  51.511  
  51.512 +    if (socketpair(PF_UNIX,SOCK_STREAM, 0, pipefds) == -1)
  51.513 +        err(1, "failed to create pipe\n");
  51.514 +
  51.515      await_connections();
  51.516      /* Close the connection to XenStore when we are finished with everything */
  51.517      xs_daemon_close(xsh);
    52.1 --- a/tools/fs-back/fs-backend.h	Mon Mar 30 19:56:30 2009 -0700
    52.2 +++ b/tools/fs-back/fs-backend.h	Thu Apr 23 18:49:41 2009 -0700
    52.3 @@ -7,6 +7,7 @@
    52.4  #include <xen/event_channel.h>
    52.5  #include <xen/io/ring.h>
    52.6  #include <xen/io/fsif.h>
    52.7 +#include "sys-queue.h"
    52.8  
    52.9  #define ROOT_NODE           "backend/vfs"
   52.10  #define EXPORTS_SUBNODE     "exports"
   52.11 @@ -25,6 +26,8 @@ struct fs_export
   52.12  
   52.13  struct fs_request
   52.14  {
   52.15 +    struct fs_mount *mount;
   52.16 +    int id;
   52.17      int active;
   52.18      void *page;                         /* Pointer to mapped grant */
   52.19      int count;
   52.20 @@ -50,6 +53,7 @@ struct fs_mount
   52.21      struct fs_request *requests;
   52.22      unsigned short *freelist;
   52.23      int fds[MAX_FDS];
   52.24 +    LIST_ENTRY(fs_mount) entries;
   52.25  };
   52.26  
   52.27  
   52.28 @@ -61,7 +65,11 @@ int xenbus_register_export(struct fs_exp
   52.29  int xenbus_get_watch_fd(void);
   52.30  void xenbus_read_mount_request(struct fs_mount *mount, char *frontend);
   52.31  void xenbus_write_backend_node(struct fs_mount *mount);
   52.32 -void xenbus_write_backend_ready(struct fs_mount *mount);
   52.33 +void xenbus_write_backend_state(struct fs_mount *mount, const char *state);
   52.34 +int xenbus_frontend_state_changed(struct fs_mount *mount, const char *oldstate);
   52.35 +void xenbus_watch_frontend_state(struct fs_mount *mount);
   52.36 +void xenbus_unwatch_frontend_state(struct fs_mount *mount);
   52.37 +char* xenbus_read_frontend_state(struct fs_mount *mount);
   52.38  
   52.39  /* File operations, implemented in fs-ops.c */
   52.40  struct fs_op
    53.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    53.2 +++ b/tools/fs-back/fs-debug.h	Thu Apr 23 18:49:41 2009 -0700
    53.3 @@ -0,0 +1,12 @@
    53.4 +#ifndef __FS_DEBUG__
    53.5 +#define __FS_DEBUG__
    53.6 +
    53.7 +// #define DEBUG 1
    53.8 +
    53.9 +#ifdef DEBUG
   53.10 +#define FS_DEBUG(fmt, ...) do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
   53.11 +#else
   53.12 +#define FS_DEBUG(fmt, ...) do { } while (0)
   53.13 +#endif
   53.14 +
   53.15 +#endif /*__FS_DEBUG__*/
    54.1 --- a/tools/fs-back/fs-ops.c	Mon Mar 30 19:56:30 2009 -0700
    54.2 +++ b/tools/fs-back/fs-ops.c	Thu Apr 23 18:49:41 2009 -0700
    54.3 @@ -14,6 +14,7 @@
    54.4  #include <sys/mount.h>
    54.5  #include <unistd.h>
    54.6  #include "fs-backend.h"
    54.7 +#include "fs-debug.h"
    54.8  
    54.9  /* For debugging only */
   54.10  #include <sys/time.h>
   54.11 @@ -22,12 +23,11 @@
   54.12  
   54.13  #define BUFFER_SIZE 1024
   54.14  
   54.15 -
   54.16  static unsigned short get_request(struct fs_mount *mount, struct fsif_request *req)
   54.17  {
   54.18      unsigned short id = get_id_from_freelist(mount->freelist); 
   54.19  
   54.20 -    printf("Private Request id: %d\n", id);
   54.21 +    FS_DEBUG("Private Request id: %d\n", id);
   54.22      memcpy(&mount->requests[id].req_shadow, req, sizeof(struct fsif_request));
   54.23      mount->requests[id].active = 1;
   54.24  
   54.25 @@ -49,12 +49,11 @@ static void dispatch_file_open(struct fs
   54.26  {
   54.27      char *file_name, full_path[BUFFER_SIZE];
   54.28      int fd;
   54.29 -    struct timeval tv1, tv2;
   54.30      RING_IDX rsp_idx;
   54.31      fsif_response_t *rsp;
   54.32      uint16_t req_id;
   54.33  
   54.34 -    printf("Dispatching file open operation (gref=%d).\n", req->u.fopen.gref);
   54.35 +    FS_DEBUG("Dispatching file open operation (gref=%d).\n", req->u.fopen.gref);
   54.36      /* Read the request, and open file */
   54.37      file_name = xc_gnttab_map_grant_ref(mount->gnth,
   54.38                                          mount->dom_id,
   54.39 @@ -62,13 +61,13 @@ static void dispatch_file_open(struct fs
   54.40                                          PROT_READ);
   54.41     
   54.42      req_id = req->id;
   54.43 -    printf("File open issued for %s\n", file_name); 
   54.44 +    FS_DEBUG("File open issued for %s\n", file_name); 
   54.45      assert(BUFFER_SIZE > 
   54.46             strlen(file_name) + strlen(mount->export->export_path) + 1); 
   54.47      snprintf(full_path, sizeof(full_path), "%s/%s",
   54.48             mount->export->export_path, file_name);
   54.49      assert(xc_gnttab_munmap(mount->gnth, file_name, 1) == 0);
   54.50 -    printf("Issuing open for %s\n", full_path);
   54.51 +    FS_DEBUG("Issuing open for %s\n", full_path);
   54.52      fd = get_fd(mount);
   54.53      if (fd >= 0) {
   54.54          int real_fd = open(full_path, O_RDWR);
   54.55 @@ -77,7 +76,7 @@ static void dispatch_file_open(struct fs
   54.56          else
   54.57          {
   54.58              mount->fds[fd] = real_fd;
   54.59 -            printf("Got FD: %d for real %d\n", fd, real_fd);
   54.60 +            FS_DEBUG("Got FD: %d for real %d\n", fd, real_fd);
   54.61          }
   54.62      }
   54.63      /* We can advance the request consumer index, from here on, the request
   54.64 @@ -87,7 +86,7 @@ static void dispatch_file_open(struct fs
   54.65  
   54.66      /* Get a response from the ring */
   54.67      rsp_idx = mount->ring.rsp_prod_pvt++;
   54.68 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
   54.69 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
   54.70      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
   54.71      rsp->id = req_id; 
   54.72      rsp->ret_val = (uint64_t)fd;
   54.73 @@ -100,7 +99,7 @@ static void dispatch_file_close(struct f
   54.74      fsif_response_t *rsp;
   54.75      uint16_t req_id;
   54.76  
   54.77 -    printf("Dispatching file close operation (fd=%d).\n", req->u.fclose.fd);
   54.78 +    FS_DEBUG("Dispatching file close operation (fd=%d).\n", req->u.fclose.fd);
   54.79     
   54.80      req_id = req->id;
   54.81      if (req->u.fclose.fd < MAX_FDS) {
   54.82 @@ -109,7 +108,7 @@ static void dispatch_file_close(struct f
   54.83          mount->fds[req->u.fclose.fd] = -1;
   54.84      } else
   54.85          ret = -1;
   54.86 -    printf("Got ret: %d\n", ret);
   54.87 +    FS_DEBUG("Got ret: %d\n", ret);
   54.88      /* We can advance the request consumer index, from here on, the request
   54.89       * should not be used (it may be overrinden by a response) */
   54.90      mount->ring.req_cons++;
   54.91 @@ -117,7 +116,7 @@ static void dispatch_file_close(struct f
   54.92  
   54.93      /* Get a response from the ring */
   54.94      rsp_idx = mount->ring.rsp_prod_pvt++;
   54.95 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
   54.96 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
   54.97      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
   54.98      rsp->id = req_id; 
   54.99      rsp->ret_val = (uint64_t)ret;
  54.100 @@ -127,7 +126,7 @@ static void dispatch_file_close(struct f
  54.101  static void dispatch_file_read(struct fs_mount *mount, struct fsif_request *req)
  54.102  {
  54.103      void *buf;
  54.104 -    int fd, i, count;
  54.105 +    int fd, count;
  54.106      uint16_t req_id;
  54.107      unsigned short priv_id;
  54.108      struct fs_request *priv_req;
  54.109 @@ -143,7 +142,7 @@ static void dispatch_file_read(struct fs
  54.110                                            PROT_WRITE);
  54.111     
  54.112      req_id = req->id;
  54.113 -    printf("File read issued for FD=%d (len=%"PRIu64", offest=%"PRIu64")\n", 
  54.114 +    FS_DEBUG("File read issued for FD=%d (len=%"PRIu64", offest=%"PRIu64")\n", 
  54.115              req->u.fread.fd, req->u.fread.len, req->u.fread.offset); 
  54.116  
  54.117      if (req->u.fread.fd < MAX_FDS)
  54.118 @@ -152,10 +151,11 @@ static void dispatch_file_read(struct fs
  54.119          fd = -1;
  54.120  
  54.121      priv_id = get_request(mount, req);
  54.122 -    printf("Private id is: %d\n", priv_id);
  54.123 +    FS_DEBUG("Private id is: %d\n", priv_id);
  54.124      priv_req = &mount->requests[priv_id];
  54.125      priv_req->page = buf;
  54.126      priv_req->count = count;
  54.127 +    priv_req->id = priv_id;
  54.128  
  54.129      /* Dispatch AIO read request */
  54.130      bzero(&priv_req->aiocb, sizeof(struct aiocb));
  54.131 @@ -163,9 +163,11 @@ static void dispatch_file_read(struct fs
  54.132      priv_req->aiocb.aio_nbytes = req->u.fread.len;
  54.133      priv_req->aiocb.aio_offset = req->u.fread.offset;
  54.134      priv_req->aiocb.aio_buf = buf;
  54.135 +    priv_req->aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
  54.136 +    priv_req->aiocb.aio_sigevent.sigev_signo = SIGUSR2;
  54.137 +    priv_req->aiocb.aio_sigevent.sigev_value.sival_ptr = priv_req;
  54.138      assert(aio_read(&priv_req->aiocb) >= 0);
  54.139  
  54.140 -out: 
  54.141      /* We can advance the request consumer index, from here on, the request
  54.142       * should not be used (it may be overrinden by a response) */
  54.143      mount->ring.req_cons++;
  54.144 @@ -185,7 +187,7 @@ static void end_file_read(struct fs_moun
  54.145      /* Get a response from the ring */
  54.146      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.147      req_id = priv_req->req_shadow.id; 
  54.148 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.149 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.150      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.151      rsp->id = req_id; 
  54.152      rsp->ret_val = (uint64_t)aio_return(&priv_req->aiocb);
  54.153 @@ -194,7 +196,7 @@ static void end_file_read(struct fs_moun
  54.154  static void dispatch_file_write(struct fs_mount *mount, struct fsif_request *req)
  54.155  {
  54.156      void *buf;
  54.157 -    int fd, count, i;
  54.158 +    int fd, count;
  54.159      uint16_t req_id;
  54.160      unsigned short priv_id;
  54.161      struct fs_request *priv_req;
  54.162 @@ -210,7 +212,7 @@ static void dispatch_file_write(struct f
  54.163                                            PROT_READ);
  54.164     
  54.165      req_id = req->id;
  54.166 -    printf("File write issued for FD=%d (len=%"PRIu64", offest=%"PRIu64")\n", 
  54.167 +    FS_DEBUG("File write issued for FD=%d (len=%"PRIu64", offest=%"PRIu64")\n", 
  54.168              req->u.fwrite.fd, req->u.fwrite.len, req->u.fwrite.offset); 
  54.169     
  54.170      if (req->u.fwrite.fd < MAX_FDS)
  54.171 @@ -219,10 +221,11 @@ static void dispatch_file_write(struct f
  54.172          fd = -1;
  54.173  
  54.174      priv_id = get_request(mount, req);
  54.175 -    printf("Private id is: %d\n", priv_id);
  54.176 +    FS_DEBUG("Private id is: %d\n", priv_id);
  54.177      priv_req = &mount->requests[priv_id];
  54.178      priv_req->page = buf;
  54.179      priv_req->count = count;
  54.180 +    priv_req->id = priv_id;
  54.181  
  54.182      /* Dispatch AIO write request */
  54.183      bzero(&priv_req->aiocb, sizeof(struct aiocb));
  54.184 @@ -230,6 +233,9 @@ static void dispatch_file_write(struct f
  54.185      priv_req->aiocb.aio_nbytes = req->u.fwrite.len;
  54.186      priv_req->aiocb.aio_offset = req->u.fwrite.offset;
  54.187      priv_req->aiocb.aio_buf = buf;
  54.188 +    priv_req->aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
  54.189 +    priv_req->aiocb.aio_sigevent.sigev_signo = SIGUSR2;
  54.190 +    priv_req->aiocb.aio_sigevent.sigev_value.sival_ptr = priv_req;
  54.191      assert(aio_write(&priv_req->aiocb) >= 0);
  54.192  
  54.193       
  54.194 @@ -252,7 +258,7 @@ static void end_file_write(struct fs_mou
  54.195      /* Get a response from the ring */
  54.196      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.197      req_id = priv_req->req_shadow.id; 
  54.198 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.199 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.200      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.201      rsp->id = req_id; 
  54.202      rsp->ret_val = (uint64_t)aio_return(&priv_req->aiocb);
  54.203 @@ -260,7 +266,6 @@ static void end_file_write(struct fs_mou
  54.204  
  54.205  static void dispatch_stat(struct fs_mount *mount, struct fsif_request *req)
  54.206  {
  54.207 -    struct fsif_stat_response *buf;
  54.208      struct stat stat;
  54.209      int fd, ret;
  54.210      uint16_t req_id;
  54.211 @@ -273,7 +278,7 @@ static void dispatch_stat(struct fs_moun
  54.212      else
  54.213          fd = -1;
  54.214  
  54.215 -    printf("File stat issued for FD=%d\n", req->u.fstat.fd); 
  54.216 +    FS_DEBUG("File stat issued for FD=%d\n", req->u.fstat.fd); 
  54.217     
  54.218      /* We can advance the request consumer index, from here on, the request
  54.219       * should not be used (it may be overrinden by a response) */
  54.220 @@ -281,12 +286,12 @@ static void dispatch_stat(struct fs_moun
  54.221     
  54.222      /* Stat, and create the response */ 
  54.223      ret = fstat(fd, &stat);
  54.224 -    printf("Mode=%o, uid=%d, a_time=%ld\n",
  54.225 +    FS_DEBUG("Mode=%o, uid=%d, a_time=%ld\n",
  54.226              stat.st_mode, stat.st_uid, (long)stat.st_atime);
  54.227      
  54.228      /* Get a response from the ring */
  54.229      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.230 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.231 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.232      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.233      rsp->id = req_id; 
  54.234      rsp->fstat.stat_ret = (uint32_t)ret;
  54.235 @@ -320,7 +325,7 @@ static void dispatch_truncate(struct fs_
  54.236  
  54.237      req_id = req->id;
  54.238      length = req->u.ftruncate.length;
  54.239 -    printf("File truncate issued for FD=%d, length=%"PRId64"\n", req->u.ftruncate.fd, length); 
  54.240 +    FS_DEBUG("File truncate issued for FD=%d, length=%"PRId64"\n", req->u.ftruncate.fd, length); 
  54.241     
  54.242      if (req->u.ftruncate.fd < MAX_FDS)
  54.243          fd = mount->fds[req->u.ftruncate.fd];
  54.244 @@ -336,7 +341,7 @@ static void dispatch_truncate(struct fs_
  54.245  
  54.246      /* Get a response from the ring */
  54.247      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.248 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.249 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.250      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.251      rsp->id = req_id; 
  54.252      rsp->ret_val = (uint64_t)ret;
  54.253 @@ -350,7 +355,7 @@ static void dispatch_remove(struct fs_mo
  54.254      fsif_response_t *rsp;
  54.255      uint16_t req_id;
  54.256  
  54.257 -    printf("Dispatching remove operation (gref=%d).\n", req->u.fremove.gref);
  54.258 +    FS_DEBUG("Dispatching remove operation (gref=%d).\n", req->u.fremove.gref);
  54.259      /* Read the request, and open file */
  54.260      file_name = xc_gnttab_map_grant_ref(mount->gnth,
  54.261                                          mount->dom_id,
  54.262 @@ -358,15 +363,15 @@ static void dispatch_remove(struct fs_mo
  54.263                                          PROT_READ);
  54.264     
  54.265      req_id = req->id;
  54.266 -    printf("File remove issued for %s\n", file_name); 
  54.267 +    FS_DEBUG("File remove issued for %s\n", file_name); 
  54.268      assert(BUFFER_SIZE > 
  54.269             strlen(file_name) + strlen(mount->export->export_path) + 1); 
  54.270      snprintf(full_path, sizeof(full_path), "%s/%s",
  54.271             mount->export->export_path, file_name);
  54.272      assert(xc_gnttab_munmap(mount->gnth, file_name, 1) == 0);
  54.273 -    printf("Issuing remove for %s\n", full_path);
  54.274 +    FS_DEBUG("Issuing remove for %s\n", full_path);
  54.275      ret = remove(full_path);
  54.276 -    printf("Got ret: %d\n", ret);
  54.277 +    FS_DEBUG("Got ret: %d\n", ret);
  54.278      /* We can advance the request consumer index, from here on, the request
  54.279       * should not be used (it may be overrinden by a response) */
  54.280      mount->ring.req_cons++;
  54.281 @@ -374,7 +379,7 @@ static void dispatch_remove(struct fs_mo
  54.282  
  54.283      /* Get a response from the ring */
  54.284      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.285 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.286 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.287      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.288      rsp->id = req_id; 
  54.289      rsp->ret_val = (uint64_t)ret;
  54.290 @@ -390,7 +395,7 @@ static void dispatch_rename(struct fs_mo
  54.291      fsif_response_t *rsp;
  54.292      uint16_t req_id;
  54.293  
  54.294 -    printf("Dispatching rename operation (gref=%d).\n", req->u.fremove.gref);
  54.295 +    FS_DEBUG("Dispatching rename operation (gref=%d).\n", req->u.fremove.gref);
  54.296      /* Read the request, and open file */
  54.297      buf = xc_gnttab_map_grant_ref(mount->gnth,
  54.298                                    mount->dom_id,
  54.299 @@ -400,7 +405,7 @@ static void dispatch_rename(struct fs_mo
  54.300      req_id = req->id;
  54.301      old_file_name = buf + req->u.frename.old_name_offset;
  54.302      new_file_name = buf + req->u.frename.new_name_offset;
  54.303 -    printf("File rename issued for %s -> %s (buf=%s)\n", 
  54.304 +    FS_DEBUG("File rename issued for %s -> %s (buf=%s)\n", 
  54.305              old_file_name, new_file_name, buf); 
  54.306      assert(BUFFER_SIZE > 
  54.307             strlen(old_file_name) + strlen(mount->export->export_path) + 1); 
  54.308 @@ -411,9 +416,9 @@ static void dispatch_rename(struct fs_mo
  54.309      snprintf(new_full_path, sizeof(new_full_path), "%s/%s",
  54.310             mount->export->export_path, new_file_name);
  54.311      assert(xc_gnttab_munmap(mount->gnth, buf, 1) == 0);
  54.312 -    printf("Issuing rename for %s -> %s\n", old_full_path, new_full_path);
  54.313 +    FS_DEBUG("Issuing rename for %s -> %s\n", old_full_path, new_full_path);
  54.314      ret = rename(old_full_path, new_full_path);
  54.315 -    printf("Got ret: %d\n", ret);
  54.316 +    FS_DEBUG("Got ret: %d\n", ret);
  54.317      /* We can advance the request consumer index, from here on, the request
  54.318       * should not be used (it may be overrinden by a response) */
  54.319      mount->ring.req_cons++;
  54.320 @@ -421,7 +426,7 @@ static void dispatch_rename(struct fs_mo
  54.321  
  54.322      /* Get a response from the ring */
  54.323      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.324 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.325 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.326      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.327      rsp->id = req_id; 
  54.328      rsp->ret_val = (uint64_t)ret;
  54.329 @@ -438,7 +443,7 @@ static void dispatch_create(struct fs_mo
  54.330      fsif_response_t *rsp;
  54.331      uint16_t req_id;
  54.332  
  54.333 -    printf("Dispatching file create operation (gref=%d).\n", req->u.fcreate.gref);
  54.334 +    FS_DEBUG("Dispatching file create operation (gref=%d).\n", req->u.fcreate.gref);
  54.335      /* Read the request, and create file/directory */
  54.336      mode = req->u.fcreate.mode;
  54.337      directory = req->u.fcreate.directory;
  54.338 @@ -448,7 +453,7 @@ static void dispatch_create(struct fs_mo
  54.339                                          PROT_READ);
  54.340     
  54.341      req_id = req->id;
  54.342 -    printf("File create issued for %s\n", file_name); 
  54.343 +    FS_DEBUG("File create issued for %s\n", file_name); 
  54.344      assert(BUFFER_SIZE > 
  54.345             strlen(file_name) + strlen(mount->export->export_path) + 1); 
  54.346      snprintf(full_path, sizeof(full_path), "%s/%s",
  54.347 @@ -460,12 +465,12 @@ static void dispatch_create(struct fs_mo
  54.348  
  54.349      if(directory)
  54.350      {
  54.351 -        printf("Issuing create for directory: %s\n", full_path);
  54.352 +        FS_DEBUG("Issuing create for directory: %s\n", full_path);
  54.353          ret = mkdir(full_path, mode);
  54.354      }
  54.355      else
  54.356      {
  54.357 -        printf("Issuing create for file: %s\n", full_path);
  54.358 +        FS_DEBUG("Issuing create for file: %s\n", full_path);
  54.359          ret = get_fd(mount);
  54.360          if (ret >= 0) {
  54.361              int real_fd = creat(full_path, mode); 
  54.362 @@ -474,15 +479,15 @@ static void dispatch_create(struct fs_mo
  54.363              else
  54.364              {
  54.365                  mount->fds[ret] = real_fd;
  54.366 -                printf("Got FD: %d for real %d\n", ret, real_fd);
  54.367 +                FS_DEBUG("Got FD: %d for real %d\n", ret, real_fd);
  54.368              }
  54.369          }
  54.370      }
  54.371 -    printf("Got ret %d (errno=%d)\n", ret, errno);
  54.372 +    FS_DEBUG("Got ret %d (errno=%d)\n", ret, errno);
  54.373  
  54.374      /* Get a response from the ring */
  54.375      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.376 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.377 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.378      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.379      rsp->id = req_id; 
  54.380      rsp->ret_val = (uint64_t)ret;
  54.381 @@ -499,7 +504,7 @@ static void dispatch_list(struct fs_moun
  54.382      DIR *dir;
  54.383      struct dirent *dirent = NULL;
  54.384  
  54.385 -    printf("Dispatching list operation (gref=%d).\n", req->u.flist.gref);
  54.386 +    FS_DEBUG("Dispatching list operation (gref=%d).\n", req->u.flist.gref);
  54.387      /* Read the request, and list directory */
  54.388      offset = req->u.flist.offset;
  54.389      buf = file_name = xc_gnttab_map_grant_ref(mount->gnth,
  54.390 @@ -508,7 +513,7 @@ static void dispatch_list(struct fs_moun
  54.391                                          PROT_READ | PROT_WRITE);
  54.392     
  54.393      req_id = req->id;
  54.394 -    printf("Dir list issued for %s\n", file_name); 
  54.395 +    FS_DEBUG("Dir list issued for %s\n", file_name); 
  54.396      assert(BUFFER_SIZE > 
  54.397             strlen(file_name) + strlen(mount->export->export_path) + 1); 
  54.398      snprintf(full_path, sizeof(full_path), "%s/%s",
  54.399 @@ -552,7 +557,7 @@ error_out:
  54.400      
  54.401      /* Get a response from the ring */
  54.402      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.403 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.404 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.405      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.406      rsp->id = req_id; 
  54.407      rsp->ret_val = ret_val;
  54.408 @@ -566,7 +571,7 @@ static void dispatch_chmod(struct fs_mou
  54.409      uint16_t req_id;
  54.410      int32_t mode;
  54.411  
  54.412 -    printf("Dispatching file chmod operation (fd=%d, mode=%o).\n", 
  54.413 +    FS_DEBUG("Dispatching file chmod operation (fd=%d, mode=%o).\n", 
  54.414              req->u.fchmod.fd, req->u.fchmod.mode);
  54.415      req_id = req->id;
  54.416      if (req->u.fchmod.fd < MAX_FDS)
  54.417 @@ -583,7 +588,7 @@ static void dispatch_chmod(struct fs_mou
  54.418  
  54.419      /* Get a response from the ring */
  54.420      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.421 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.422 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.423      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.424      rsp->id = req_id; 
  54.425      rsp->ret_val = (uint64_t)ret;
  54.426 @@ -598,7 +603,7 @@ static void dispatch_fs_space(struct fs_
  54.427      struct statvfs stat;
  54.428      int64_t ret;
  54.429  
  54.430 -    printf("Dispatching fs space operation (gref=%d).\n", req->u.fspace.gref);
  54.431 +    FS_DEBUG("Dispatching fs space operation (gref=%d).\n", req->u.fspace.gref);
  54.432      /* Read the request, and open file */
  54.433      file_name = xc_gnttab_map_grant_ref(mount->gnth,
  54.434                                          mount->dom_id,
  54.435 @@ -606,13 +611,13 @@ static void dispatch_fs_space(struct fs_
  54.436                                          PROT_READ);
  54.437     
  54.438      req_id = req->id;
  54.439 -    printf("Fs space issued for %s\n", file_name); 
  54.440 +    FS_DEBUG("Fs space issued for %s\n", file_name); 
  54.441      assert(BUFFER_SIZE > 
  54.442             strlen(file_name) + strlen(mount->export->export_path) + 1); 
  54.443      snprintf(full_path, sizeof(full_path), "%s/%s",
  54.444             mount->export->export_path, file_name);
  54.445      assert(xc_gnttab_munmap(mount->gnth, file_name, 1) == 0);
  54.446 -    printf("Issuing fs space for %s\n", full_path);
  54.447 +    FS_DEBUG("Issuing fs space for %s\n", full_path);
  54.448      ret = statvfs(full_path, &stat);
  54.449      if(ret >= 0)
  54.450          ret = stat.f_bsize * stat.f_bfree;
  54.451 @@ -624,7 +629,7 @@ static void dispatch_fs_space(struct fs_
  54.452  
  54.453      /* Get a response from the ring */
  54.454      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.455 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.456 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.457      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.458      rsp->id = req_id; 
  54.459      rsp->ret_val = (uint64_t)ret;
  54.460 @@ -643,15 +648,19 @@ static void dispatch_file_sync(struct fs
  54.461      else
  54.462          fd = -1;
  54.463  
  54.464 -    printf("File sync issued for FD=%d\n", req->u.fsync.fd); 
  54.465 +    FS_DEBUG("File sync issued for FD=%d\n", req->u.fsync.fd); 
  54.466     
  54.467      priv_id = get_request(mount, req);
  54.468 -    printf("Private id is: %d\n", priv_id);
  54.469 +    FS_DEBUG("Private id is: %d\n", priv_id);
  54.470      priv_req = &mount->requests[priv_id];
  54.471 +    priv_req->id = priv_id;
  54.472  
  54.473      /* Dispatch AIO read request */
  54.474      bzero(&priv_req->aiocb, sizeof(struct aiocb));
  54.475      priv_req->aiocb.aio_fildes = fd;
  54.476 +    priv_req->aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
  54.477 +    priv_req->aiocb.aio_sigevent.sigev_signo = SIGUSR2;
  54.478 +    priv_req->aiocb.aio_sigevent.sigev_value.sival_ptr = priv_req;
  54.479      assert(aio_fsync(O_SYNC, &priv_req->aiocb) >= 0);
  54.480  
  54.481       
  54.482 @@ -669,7 +678,7 @@ static void end_file_sync(struct fs_moun
  54.483      /* Get a response from the ring */
  54.484      rsp_idx = mount->ring.rsp_prod_pvt++;
  54.485      req_id = priv_req->req_shadow.id; 
  54.486 -    printf("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.487 +    FS_DEBUG("Writing response at: idx=%d, id=%d\n", rsp_idx, req_id);
  54.488      rsp = RING_GET_RESPONSE(&mount->ring, rsp_idx);
  54.489      rsp->id = req_id; 
  54.490      rsp->ret_val = (uint64_t)aio_return(&priv_req->aiocb);
    55.1 --- a/tools/fs-back/fs-xenbus.c	Mon Mar 30 19:56:30 2009 -0700
    55.2 +++ b/tools/fs-back/fs-xenbus.c	Thu Apr 23 18:49:41 2009 -0700
    55.3 @@ -4,10 +4,12 @@
    55.4  #include <stdarg.h>
    55.5  #include <string.h>
    55.6  #include <assert.h>
    55.7 +#include <sys/select.h>
    55.8  #include <xenctrl.h>
    55.9  #include <xs.h>
   55.10  #include <xen/io/fsif.h>
   55.11  #include "fs-backend.h"
   55.12 +#include "fs-debug.h"
   55.13  
   55.14  
   55.15  static bool xenbus_printf(struct xs_handle *xsh,
   55.16 @@ -25,7 +27,7 @@ static bool xenbus_printf(struct xs_hand
   55.17      snprintf(fullpath, sizeof(fullpath), "%s/%s", node, path);
   55.18      vsnprintf(val, sizeof(val), fmt, args);
   55.19      va_end(args);
   55.20 -    printf("xenbus_printf (%s) <= %s.\n", fullpath, val);    
   55.21 +    FS_DEBUG("xenbus_printf (%s) <= %s.\n", fullpath, val);    
   55.22  
   55.23      return xs_write(xsh, xbt, fullpath, val, strlen(val));
   55.24  }
   55.25 @@ -57,19 +59,19 @@ int xenbus_register_export(struct fs_exp
   55.26      assert(xsh != NULL);
   55.27      if(xsh == NULL)
   55.28      {
   55.29 -        printf("Could not open connection to xenbus deamon.\n");
   55.30 +        FS_DEBUG("Could not open connection to xenbus deamon.\n");
   55.31          goto error_exit;
   55.32      }
   55.33 -    printf("Connection to the xenbus deamon opened successfully.\n");
   55.34 +    FS_DEBUG("Connection to the xenbus deamon opened successfully.\n");
   55.35  
   55.36      /* Start transaction */
   55.37      xst = xs_transaction_start(xsh);
   55.38      if(xst == 0)
   55.39      {
   55.40 -        printf("Could not start a transaction.\n");
   55.41 +        FS_DEBUG("Could not start a transaction.\n");
   55.42          goto error_exit;
   55.43      }
   55.44 -    printf("XS transaction is %d\n", xst); 
   55.45 +    FS_DEBUG("XS transaction is %d\n", xst); 
   55.46   
   55.47      /* Create node string */
   55.48      snprintf(node, sizeof(node), "%s/%d", EXPORTS_NODE, export->export_id); 
   55.49 @@ -78,7 +80,7 @@ int xenbus_register_export(struct fs_exp
   55.50  
   55.51      if(!xenbus_printf(xsh, xst, node, "name", "%s", export->name))
   55.52      {
   55.53 -        printf("Could not write the export node.\n");
   55.54 +        FS_DEBUG("Could not write the export node.\n");
   55.55          goto error_exit;
   55.56      }
   55.57  
   55.58 @@ -87,7 +89,7 @@ int xenbus_register_export(struct fs_exp
   55.59      perms.perms = XS_PERM_READ;
   55.60      if(!xs_set_permissions(xsh, xst, EXPORTS_NODE, &perms, 1))
   55.61      {
   55.62 -        printf("Could not set permissions on the export node.\n");
   55.63 +        FS_DEBUG("Could not set permissions on the export node.\n");
   55.64          goto error_exit;
   55.65      }
   55.66  
   55.67 @@ -166,7 +168,7 @@ void xenbus_write_backend_node(struct fs
   55.68  
   55.69      assert(xsh != NULL);
   55.70      self_id = get_self_id();
   55.71 -    printf("Our own dom_id=%d\n", self_id);
   55.72 +    FS_DEBUG("Our own dom_id=%d\n", self_id);
   55.73      snprintf(node, sizeof(node), "%s/backend", mount->frontend);
   55.74      snprintf(backend_node, sizeof(backend_node), "/local/domain/%d/"ROOT_NODE"/%d",
   55.75                                  self_id, mount->mount_id);
   55.76 @@ -176,7 +178,7 @@ void xenbus_write_backend_node(struct fs
   55.77      xs_write(xsh, XBT_NULL, node, STATE_INITIALISED, strlen(STATE_INITIALISED));
   55.78  }
   55.79  
   55.80 -void xenbus_write_backend_ready(struct fs_mount *mount)
   55.81 +void xenbus_write_backend_state(struct fs_mount *mount, const char *state)
   55.82  {
   55.83      char node[1024];
   55.84      int self_id;
   55.85 @@ -184,6 +186,59 @@ void xenbus_write_backend_ready(struct f
   55.86      assert(xsh != NULL);
   55.87      self_id = get_self_id();
   55.88      snprintf(node, sizeof(node), ROOT_NODE"/%d/state", mount->mount_id);
   55.89 -    xs_write(xsh, XBT_NULL, node, STATE_READY, strlen(STATE_READY));
   55.90 +    xs_write(xsh, XBT_NULL, node, state, strlen(state));
   55.91 +}
   55.92 +
   55.93 +void xenbus_watch_frontend_state(struct fs_mount *mount)
   55.94 +{
   55.95 +    int res;
   55.96 +    char statepath[1024];
   55.97 +
   55.98 +    assert(xsh != NULL);
   55.99 +    snprintf(statepath, sizeof(statepath), "%s/state", mount->frontend);
  55.100 +    res = xs_watch(xsh, statepath, "frontend-state");
  55.101 +    assert(res);
  55.102 +}
  55.103 +
  55.104 +void xenbus_unwatch_frontend_state(struct fs_mount *mount)
  55.105 +{
  55.106 +    int res;
  55.107 +    char statepath[1024];
  55.108 +
  55.109 +    assert(xsh != NULL);
  55.110 +    snprintf(statepath, sizeof(statepath), "%s/state", mount->frontend);
  55.111 +    res = xs_unwatch(xsh, statepath, "frontend-state");
  55.112 +    assert(res);
  55.113  }
  55.114  
  55.115 +int xenbus_frontend_state_changed(struct fs_mount *mount, const char *oldstate)
  55.116 +{
  55.117 +    unsigned int len;
  55.118 +    char statepath[1024];
  55.119 +    char *state = NULL;
  55.120 +
  55.121 +    assert(xsh != NULL);
  55.122 +    snprintf(statepath, sizeof(statepath), "%s/state", mount->frontend);
  55.123 +    state = xs_read(xsh, XBT_NULL, statepath, &len);
  55.124 +    if (state && len > 0) {
  55.125 +        if (strcmp(state, oldstate)) {
  55.126 +            free(state);
  55.127 +            return 1;
  55.128 +        } else {
  55.129 +            free(state);
  55.130 +            return 0;
  55.131 +        }
  55.132 +    } else
  55.133 +        return 1;
  55.134 +}
  55.135 +
  55.136 +char* xenbus_read_frontend_state(struct fs_mount *mount)
  55.137 +{
  55.138 +    unsigned int len;
  55.139 +    char statepath[1024];
  55.140 +
  55.141 +    assert(xsh != NULL);
  55.142 +    snprintf(statepath, sizeof(statepath), "%s/state", mount->frontend);
  55.143 +    return xs_read(xsh, XBT_NULL, statepath, &len);
  55.144 +}
  55.145 +
    56.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    56.2 +++ b/tools/fs-back/sys-queue.h	Thu Apr 23 18:49:41 2009 -0700
    56.3 @@ -0,0 +1,338 @@
    56.4 +/*      $NetBSD: queue.h,v 1.45.14.1 2007/07/18 20:13:24 liamjfoy Exp $ */
    56.5 +
    56.6 +/*
    56.7 + * Qemu version: Copy from netbsd, removed debug code, removed some of
    56.8 + * the implementations.  Left in lists, tail queues and circular queues.
    56.9 + */
   56.10 +
   56.11 +/*
   56.12 + * Copyright (c) 1991, 1993
   56.13 + *      The Regents of the University of California.  All rights reserved.
   56.14 + *
   56.15 + * Redistribution and use in source and binary forms, with or without
   56.16 + * modification, are permitted provided that the following conditions
   56.17 + * are met:
   56.18 + * 1. Redistributions of source code must retain the above copyright
   56.19 + *    notice, this list of conditions and the following disclaimer.
   56.20 + * 2. Redistributions in binary form must reproduce the above copyright
   56.21 + *    notice, this list of conditions and the following disclaimer in the
   56.22 + *    documentation and/or other materials provided with the distribution.
   56.23 + * 3. Neither the name of the University nor the names of its contributors
   56.24 + *    may be used to endorse or promote products derived from this software
   56.25 + *    without specific prior written permission.
   56.26 + *
   56.27 + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   56.28 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   56.29 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   56.30 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   56.31 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   56.32 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   56.33 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   56.34 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   56.35 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   56.36 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   56.37 + * SUCH DAMAGE.
   56.38 + *
   56.39 + *      @(#)queue.h     8.5 (Berkeley) 8/20/94
   56.40 + */
   56.41 +
   56.42 +#ifndef _SYS_QUEUE_H_
   56.43 +#define _SYS_QUEUE_H_
   56.44 +
   56.45 +/*
   56.46 + * This file defines three types of data structures:
   56.47 + * lists, tail queues, and circular queues.
   56.48 + *
   56.49 + * A list is headed by a single forward pointer (or an array of forward
   56.50 + * pointers for a hash table header). The elements are doubly linked
   56.51 + * so that an arbitrary element can be removed without a need to
   56.52 + * traverse the list. New elements can be added to the list before
   56.53 + * or after an existing element or at the head of the list. A list
   56.54 + * may only be traversed in the forward direction.
   56.55 + *
   56.56 + * A tail queue is headed by a pair of pointers, one to the head of the
   56.57 + * list and the other to the tail of the list. The elements are doubly
   56.58 + * linked so that an arbitrary element can be removed without a need to
   56.59 + * traverse the list. New elements can be added to the list before or
   56.60 + * after an existing element, at the head of the list, or at the end of
   56.61 + * the list. A tail queue may be traversed in either direction.
   56.62 + *
   56.63 + * A circle queue is headed by a pair of pointers, one to the head of the
   56.64 + * list and the other to the tail of the list. The elements are doubly
   56.65 + * linked so that an arbitrary element can be removed without a need to
   56.66 + * traverse the list. New elements can be added to the list before or after
   56.67 + * an existing element, at the head of the list, or at the end of the list.
   56.68 + * A circle queue may be traversed in either direction, but has a more
   56.69 + * complex end of list detection.
   56.70 + *
   56.71 + * For details on the use of these macros, see the queue(3) manual page.
   56.72 + */
   56.73 +
   56.74 +/*
   56.75 + * List definitions.
   56.76 + */
   56.77 +#define LIST_HEAD(name, type)                                           \
   56.78 +struct name {                                                           \
   56.79 +        struct type *lh_first;  /* first element */                     \
   56.80 +}
   56.81 +
   56.82 +#define LIST_HEAD_INITIALIZER(head)                                     \
   56.83 +        { NULL }
   56.84 +
   56.85 +#define LIST_ENTRY(type)                                                \
   56.86 +struct {                                                                \
   56.87 +        struct type *le_next;   /* next element */                      \
   56.88 +        struct type **le_prev;  /* address of previous next element */  \
   56.89 +}
   56.90 +
   56.91 +/*
   56.92 + * List functions.
   56.93 + */
   56.94 +#define LIST_INIT(head) do {                                            \
   56.95 +        (head)->lh_first = NULL;                                        \
   56.96 +} while (/*CONSTCOND*/0)
   56.97 +
   56.98 +#define LIST_INSERT_AFTER(listelm, elm, field) do {                     \
   56.99 +        if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)  \
  56.100 +                (listelm)->field.le_next->field.le_prev =               \
  56.101 +                    &(elm)->field.le_next;                              \
  56.102 +        (listelm)->field.le_next = (elm);                               \
  56.103 +        (elm)->field.le_prev = &(listelm)->field.le_next;               \
  56.104 +} while (/*CONSTCOND*/0)
  56.105 +
  56.106 +#define LIST_INSERT_BEFORE(listelm, elm, field) do {                    \
  56.107 +        (elm)->field.le_prev = (listelm)->field.le_prev;                \
  56.108 +        (elm)->field.le_next = (listelm);                               \
  56.109 +        *(listelm)->field.le_prev = (elm);                              \
  56.110 +        (listelm)->field.le_prev = &(elm)->field.le_next;               \
  56.111 +} while (/*CONSTCOND*/0)
  56.112 +
  56.113 +#define LIST_INSERT_HEAD(head, elm, field) do {                         \
  56.114 +        if (((elm)->field.le_next = (head)->lh_first) != NULL)          \
  56.115 +                (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
  56.116 +        (head)->lh_first = (elm);                                       \
  56.117 +        (elm)->field.le_prev = &(head)->lh_first;                       \
  56.118 +} while (/*CONSTCOND*/0)
  56.119 +
  56.120 +#define LIST_REMOVE(elm, field) do {                                    \
  56.121 +        if ((elm)->field.le_next != NULL)                               \
  56.122 +                (elm)->field.le_next->field.le_prev =                   \
  56.123 +                    (elm)->field.le_prev;                               \
  56.124 +        *(elm)->field.le_prev = (elm)->field.le_next;                   \
  56.125 +} while (/*CONSTCOND*/0)
  56.126 +
  56.127 +#define LIST_FOREACH(var, head, field)                                  \
  56.128 +        for ((var) = ((head)->lh_first);                                \
  56.129 +                (var);                                                  \
  56.130 +                (var) = ((var)->field.le_next))
  56.131 +
  56.132 +/*
  56.133 + * List access methods.
  56.134 + */
  56.135 +#define LIST_EMPTY(head)                ((head)->lh_first == NULL)
  56.136 +#define LIST_FIRST(head)                ((head)->lh_first)
  56.137 +#define LIST_NEXT(elm, field)           ((elm)->field.le_next)
  56.138 +
  56.139 +
  56.140 +/*
  56.141 + * Tail queue definitions.
  56.142 + */
  56.143 +#define _TAILQ_HEAD(name, type, qual)                                   \
  56.144 +struct name {                                                           \
  56.145 +        qual type *tqh_first;           /* first element */             \
  56.146 +        qual type *qual *tqh_last;      /* addr of last next element */ \
  56.147 +}
  56.148 +#define TAILQ_HEAD(name, type)  _TAILQ_HEAD(name, struct type,)
  56.149 +
  56.150 +#define TAILQ_HEAD_INITIALIZER(head)                                    \
  56.151 +        { NULL, &(head).tqh_first }
  56.152 +
  56.153 +#define _TAILQ_ENTRY(type, qual)                                        \
  56.154 +struct {                                                                \
  56.155 +        qual type *tqe_next;            /* next element */              \
  56.156 +        qual type *qual *tqe_prev;      /* address of previous next element */\
  56.157 +}
  56.158 +#define TAILQ_ENTRY(type)       _TAILQ_ENTRY(struct type,)
  56.159 +
  56.160 +/*
  56.161 + * Tail queue functions.
  56.162 + */
  56.163 +#define TAILQ_INIT(head) do {                                           \
  56.164 +        (head)->tqh_first = NULL;                                       \
  56.165 +        (head)->tqh_last = &(head)->tqh_first;                          \
  56.166 +} while (/*CONSTCOND*/0)
  56.167 +
  56.168 +#define TAILQ_INSERT_HEAD(head, elm, field) do {                        \
  56.169 +        if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)        \
  56.170 +                (head)->tqh_first->field.tqe_prev =                     \
  56.171 +                    &(elm)->field.tqe_next;                             \
  56.172 +        else                                                            \
  56.173 +                (head)->tqh_last = &(elm)->field.tqe_next;              \
  56.174 +        (head)->tqh_first = (elm);                                      \
  56.175 +        (elm)->field.tqe_prev = &(head)->tqh_first;                     \
  56.176 +} while (/*CONSTCOND*/0)
  56.177 +
  56.178 +#define TAILQ_INSERT_TAIL(head, elm, field) do {                        \
  56.179 +        (elm)->field.tqe_next = NULL;                                   \
  56.180 +        (elm)->field.tqe_prev = (head)->tqh_last;                       \
  56.181 +        *(head)->tqh_last = (elm);                                      \
  56.182 +        (head)->tqh_last = &(elm)->field.tqe_next;                      \
  56.183 +} while (/*CONSTCOND*/0)
  56.184 +
  56.185 +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {              \
  56.186 +        if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
  56.187 +                (elm)->field.tqe_next->field.tqe_prev =                 \
  56.188 +                    &(elm)->field.tqe_next;                             \
  56.189 +        else                                                            \
  56.190 +                (head)->tqh_last = &(elm)->field.tqe_next;              \
  56.191 +        (listelm)->field.tqe_next = (elm);                              \
  56.192 +        (elm)->field.tqe_prev = &(listelm)->field.tqe_next;             \
  56.193 +} while (/*CONSTCOND*/0)
  56.194 +
  56.195 +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   \
  56.196 +        (elm)->field.tqe_prev = (listelm)->field.tqe_prev;              \
  56.197 +        (elm)->field.tqe_next = (listelm);                              \
  56.198 +        *(listelm)->field.tqe_prev = (elm);                             \
  56.199 +        (listelm)->field.tqe_prev = &(elm)->field.tqe_next;             \
  56.200 +} while (/*CONSTCOND*/0)
  56.201 +
  56.202 +#define TAILQ_REMOVE(head, elm, field) do {                             \
  56.203 +        if (((elm)->field.tqe_next) != NULL)                            \
  56.204 +                (elm)->field.tqe_next->field.tqe_prev =                 \
  56.205 +                    (elm)->field.tqe_prev;                              \
  56.206 +        else                                                            \
  56.207 +                (head)->tqh_last = (elm)->field.tqe_prev;               \
  56.208 +        *(elm)->field.tqe_prev = (elm)->field.tqe_next;                 \
  56.209 +} while (/*CONSTCOND*/0)
  56.210 +
  56.211 +#define TAILQ_FOREACH(var, head, field)                                 \
  56.212 +        for ((var) = ((head)->tqh_first);                               \
  56.213 +                (var);                                                  \
  56.214 +                (var) = ((var)->field.tqe_next))
  56.215 +
  56.216 +#define TAILQ_FOREACH_REVERSE(var, head, headname, field)               \
  56.217 +        for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));    \
  56.218 +                (var);                                                  \
  56.219 +                (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
  56.220 +
  56.221 +/*
  56.222 + * Tail queue access methods.
  56.223 + */
  56.224 +#define TAILQ_EMPTY(head)               ((head)->tqh_first == NULL)
  56.225 +#define TAILQ_FIRST(head)               ((head)->tqh_first)
  56.226 +#define TAILQ_NEXT(elm, field)          ((elm)->field.tqe_next)
  56.227 +
  56.228 +#define TAILQ_LAST(head, headname) \
  56.229 +        (*(((struct headname *)((head)->tqh_last))->tqh_last))
  56.230 +#define TAILQ_PREV(elm, headname, field) \
  56.231 +        (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
  56.232 +
  56.233 +
  56.234 +/*
  56.235 + * Circular queue definitions.
  56.236 + */
  56.237 +#define CIRCLEQ_HEAD(name, type)                                        \
  56.238 +struct name {                                                           \
  56.239 +        struct type *cqh_first;         /* first element */             \
  56.240 +        struct type *cqh_last;          /* last element */              \
  56.241 +}
  56.242 +
  56.243 +#define CIRCLEQ_HEAD_INITIALIZER(head)                                  \
  56.244 +        { (void *)&head, (void *)&head }
  56.245 +
  56.246 +#define CIRCLEQ_ENTRY(type)                                             \
  56.247 +struct {                                                                \
  56.248 +        struct type *cqe_next;          /* next element */              \
  56.249 +        struct type *cqe_prev;          /* previous element */          \
  56.250 +}
  56.251 +
  56.252 +/*
  56.253 + * Circular queue functions.
  56.254 + */
  56.255 +#define CIRCLEQ_INIT(head) do {                                         \
  56.256 +        (head)->cqh_first = (void *)(head);                             \
  56.257 +        (head)->cqh_last = (void *)(head);                              \
  56.258 +} while (/*CONSTCOND*/0)
  56.259 +
  56.260 +#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {            \
  56.261 +        (elm)->field.cqe_next = (listelm)->field.cqe_next;              \
  56.262 +        (elm)->field.cqe_prev = (listelm);                              \
  56.263 +        if ((listelm)->field.cqe_next == (void *)(head))                \
  56.264 +                (head)->cqh_last = (elm);                               \
  56.265 +        else                                                            \
  56.266 +                (listelm)->field.cqe_next->field.cqe_prev = (elm);      \
  56.267 +        (listelm)->field.cqe_next = (elm);                              \
  56.268 +} while (/*CONSTCOND*/0)
  56.269 +
  56.270 +#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {           \
  56.271 +        (elm)->field.cqe_next = (listelm);                              \
  56.272 +        (elm)->field.cqe_prev = (listelm)->field.cqe_prev;              \
  56.273 +        if ((listelm)->field.cqe_prev == (void *)(head))                \
  56.274 +                (head)->cqh_first = (elm);                              \
  56.275 +        else                                                            \
  56.276 +                (listelm)->field.cqe_prev->field.cqe_next = (elm);      \
  56.277 +        (listelm)->field.cqe_prev = (elm);                              \
  56.278 +} while (/*CONSTCOND*/0)
  56.279 +
  56.280 +#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {                      \
  56.281 +        (elm)->field.cqe_next = (head)->cqh_first;                      \
  56.282 +        (elm)->field.cqe_prev = (void *)(head);                         \
  56.283 +        if ((head)->cqh_last == (void *)(head))                         \
  56.284 +                (head)->cqh_last = (elm);                               \
  56.285 +        else                                                            \
  56.286 +                (head)->cqh_first->field.cqe_prev = (elm);              \
  56.287 +        (head)->cqh_first = (elm);                                      \
  56.288 +} while (/*CONSTCOND*/0)
  56.289 +
  56.290 +#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {                      \
  56.291 +        (elm)->field.cqe_next = (void *)(head);                         \
  56.292 +        (elm)->field.cqe_prev = (head)->cqh_last;                       \
  56.293 +        if ((head)->cqh_first == (void *)(head))                        \
  56.294 +                (head)->cqh_first = (elm);                              \
  56.295 +        else                                                            \
  56.296 +                (head)->cqh_last->field.cqe_next = (elm);               \
  56.297 +        (head)->cqh_last = (elm);                                       \
  56.298 +} while (/*CONSTCOND*/0)
  56.299 +
  56.300 +#define CIRCLEQ_REMOVE(head, elm, field) do {                           \
  56.301 +        if ((elm)->field.cqe_next == (void *)(head))                    \
  56.302 +                (head)->cqh_last = (elm)->field.cqe_prev;               \
  56.303 +        else                                                            \
  56.304 +                (elm)->field.cqe_next->field.cqe_prev =                 \
  56.305 +                    (elm)->field.cqe_prev;                              \
  56.306 +        if ((elm)->field.cqe_prev == (void *)(head))                    \
  56.307 +                (head)->cqh_first = (elm)->field.cqe_next;              \
  56.308 +        else                                                            \
  56.309 +                (elm)->field.cqe_prev->field.cqe_next =                 \
  56.310 +                    (elm)->field.cqe_next;                              \
  56.311 +} while (/*CONSTCOND*/0)
  56.312 +
  56.313 +#define CIRCLEQ_FOREACH(var, head, field)                               \
  56.314 +        for ((var) = ((head)->cqh_first);                               \
  56.315 +                (var) != (const void *)(head);                          \
  56.316 +                (var) = ((var)->field.cqe_next))
  56.317 +
  56.318 +#define CIRCLEQ_FOREACH_REVERSE(var, head, field)                       \
  56.319 +        for ((var) = ((head)->cqh_last);                                \
  56.320 +                (var) != (const void *)(head);                          \
  56.321 +                (var) = ((var)->field.cqe_prev))
  56.322 +
  56.323 +/*
  56.324 + * Circular queue access methods.
  56.325 + */
  56.326 +#define CIRCLEQ_EMPTY(head)             ((head)->cqh_first == (void *)(head))
  56.327 +#define CIRCLEQ_FIRST(head)             ((head)->cqh_first)
  56.328 +#define CIRCLEQ_LAST(head)              ((head)->cqh_last)
  56.329 +#define CIRCLEQ_NEXT(elm, field)        ((elm)->field.cqe_next)
  56.330 +#define CIRCLEQ_PREV(elm, field)        ((elm)->field.cqe_prev)
  56.331 +
  56.332 +#define CIRCLEQ_LOOP_NEXT(head, elm, field)                             \
  56.333 +        (((elm)->field.cqe_next == (void *)(head))                      \
  56.334 +            ? ((head)->cqh_first)                                       \
  56.335 +            : (elm->field.cqe_next))
  56.336 +#define CIRCLEQ_LOOP_PREV(head, elm, field)                             \
  56.337 +        (((elm)->field.cqe_prev == (void *)(head))                      \
  56.338 +            ? ((head)->cqh_last)                                        \
  56.339 +            : (elm->field.cqe_prev))
  56.340 +
  56.341 +#endif  /* !_SYS_QUEUE_H_ */
    57.1 --- a/tools/hotplug/Linux/Makefile	Mon Mar 30 19:56:30 2009 -0700
    57.2 +++ b/tools/hotplug/Linux/Makefile	Thu Apr 23 18:49:41 2009 -0700
    57.3 @@ -16,7 +16,6 @@ XEN_SCRIPTS += network-route vif-route
    57.4  XEN_SCRIPTS += network-nat vif-nat
    57.5  XEN_SCRIPTS += block
    57.6  XEN_SCRIPTS += block-enbd block-nbd
    57.7 -XEN_SCRIPTS += blktap
    57.8  XEN_SCRIPTS += vtpm vtpm-delete
    57.9  XEN_SCRIPTS += xen-hotplug-cleanup
   57.10  XEN_SCRIPTS += external-device-migrate
   57.11 @@ -30,7 +29,7 @@ XEN_HOTPLUG_DIR = /etc/hotplug
   57.12  XEN_HOTPLUG_SCRIPTS = xen-backend.agent
   57.13  
   57.14  UDEV_RULES_DIR = /etc/udev
   57.15 -UDEV_RULES = xen-backend.rules
   57.16 +UDEV_RULES = xen-backend.rules xend.rules
   57.17  
   57.18  DI = $(if $(DISTDIR),$(shell readlink -f $(DISTDIR)),)
   57.19  DE = $(if $(DESTDIR),$(shell readlink -f $(DESTDIR)),)
    58.1 --- a/tools/hotplug/Linux/blktap	Mon Mar 30 19:56:30 2009 -0700
    58.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    58.3 @@ -1,93 +0,0 @@
    58.4 -#!/bin/bash
    58.5 -
    58.6 -# Copyright (c) 2005, XenSource Ltd.
    58.7 -
    58.8 -dir=$(dirname "$0")
    58.9 -. "$dir/xen-hotplug-common.sh"
   58.10 -. "$dir/block-common.sh"
   58.11 -
   58.12 -findCommand "$@"
   58.13 -
   58.14 -##
   58.15 -# check_blktap_sharing file mode
   58.16 -#
   58.17 -# Perform the sharing check for the given blktap and mode.
   58.18 -#
   58.19 -check_blktap_sharing()
   58.20 -{
   58.21 -    local file="$1"
   58.22 -    local mode="$2"
   58.23 -
   58.24 -    local base_path="$XENBUS_BASE_PATH/$XENBUS_TYPE"
   58.25 -    for dom in $(xenstore-list "$base_path")
   58.26 -    do
   58.27 -        for dev in $(xenstore-list "$base_path/$dom")
   58.28 -        do
   58.29 -            params=$(xenstore_read "$base_path/$dom/$dev/params" | cut -d: -f2)
   58.30 -            if [ "$file" = "$params" ]
   58.31 -            then
   58.32 -
   58.33 -                if [ "$mode" = 'w' ]
   58.34 -                then
   58.35 -                    if ! same_vm "$dom" 
   58.36 -                    then
   58.37 -                        echo 'guest'
   58.38 -                        return
   58.39 -                    fi
   58.40 -                else 
   58.41 -                    local m=$(xenstore_read "$base_path/$dom/$dev/mode")
   58.42 -                    m=$(canonicalise_mode "$m")
   58.43 -
   58.44 -                    if [ "$m" = 'w' ] 
   58.45 -                    then
   58.46 -                        if ! same_vm "$dom"
   58.47 -                        then
   58.48 -                            echo 'guest'
   58.49 -                            return
   58.50 -                        fi
   58.51 -                    fi
   58.52 -                fi
   58.53 -            fi
   58.54 -        done
   58.55 -    done
   58.56 -
   58.57 -    echo 'ok'
   58.58 -}
   58.59 -
   58.60 -
   58.61 -t=$(xenstore_read_default "$XENBUS_PATH/type" 'MISSING')
   58.62 -if [ -n "$t" ]
   58.63 -then
   58.64 -    p=$(xenstore_read "$XENBUS_PATH/params")
   58.65 -    # if we have a ':', chew from head including :
   58.66 -    if echo $p | grep -q \:
   58.67 -    then
   58.68 -        p=${p#*:}
   58.69 -    fi
   58.70 -fi
   58.71 -# some versions of readlink cannot be passed a regular file
   58.72 -if [ -L "$p" ]; then
   58.73 -    file=$(readlink -f "$p") || fatal "$p link does not exist."
   58.74 -else
   58.75 -    file="$p"
   58.76 -fi
   58.77 -
   58.78 -if [ "$command" = 'add' ]
   58.79 -then
   58.80 -    [ -e "$file" ] || { fatal $file does not exist; }
   58.81 -
   58.82 -    FRONTEND_ID=$(xenstore_read "$XENBUS_PATH/frontend-id")
   58.83 -    FRONTEND_UUID=$(xenstore_read "/local/domain/$FRONTEND_ID/vm")
   58.84 -    mode=$(xenstore_read "$XENBUS_PATH/mode")
   58.85 -    mode=$(canonicalise_mode "$mode")
   58.86 -
   58.87 -    if [ "$mode" != '!' ] 
   58.88 -    then
   58.89 -        result=$(check_blktap_sharing "$file" "$mode")
   58.90 -        [ "$result" = 'ok' ] || ebusy "$file already in use by other domain"
   58.91 -    fi
   58.92 -
   58.93 -    success
   58.94 -fi
   58.95 -
   58.96 -exit 0
    59.1 --- a/tools/hotplug/Linux/init.d/xend	Mon Mar 30 19:56:30 2009 -0700
    59.2 +++ b/tools/hotplug/Linux/init.d/xend	Thu Apr 23 18:49:41 2009 -0700
    59.3 @@ -39,11 +39,13 @@ function await_daemons_up
    59.4  
    59.5  case "$1" in
    59.6    start)
    59.7 +	touch /var/lock/subsys/xend
    59.8  	xend start
    59.9  	await_daemons_up
   59.10  	;;
   59.11    stop)
   59.12  	xend stop
   59.13 +	rm -f /var/lock/subsys/xend
   59.14  	;;
   59.15    status)
   59.16  	xend status
    60.1 --- a/tools/hotplug/Linux/network-bridge	Mon Mar 30 19:56:30 2009 -0700
    60.2 +++ b/tools/hotplug/Linux/network-bridge	Thu Apr 23 18:49:41 2009 -0700
    60.3 @@ -106,7 +106,7 @@ get_ip_info() {
    60.4  }
    60.5      
    60.6  do_ifup() {
    60.7 -    if ! ifup $1 ; then
    60.8 +    if [ $1 != "${netdev}" ] || ! ifup $1 ; then
    60.9          if [ -n "$addr_pfx" ] ; then
   60.10              # use the info from get_ip_info()
   60.11              ip addr flush $1
   60.12 @@ -223,9 +223,13 @@ op_start () {
   60.13  
   60.14      preiftransfer ${netdev}
   60.15      transfer_addrs ${netdev} ${tdev}
   60.16 +    # Remember slaves for bonding interface.
   60.17 +    if [ -e /sys/class/net/${netdev}/bonding/slaves ]; then
   60.18 +	slaves=`cat /sys/class/net/${netdev}/bonding/slaves`
   60.19 +    fi
   60.20 +    # Remember the IP details for do_ifup.
   60.21 +    get_ip_info ${netdev}
   60.22      if ! ifdown ${netdev}; then
   60.23 -	# If ifdown fails, remember the IP details.
   60.24 -	get_ip_info ${netdev}
   60.25  	ip link set ${netdev} down
   60.26  	ip addr flush ${netdev}
   60.27      fi
   60.28 @@ -234,6 +238,11 @@ op_start () {
   60.29  
   60.30      setup_bridge_port ${pdev}
   60.31  
   60.32 +    # Restore slaves
   60.33 +    if [ -n "${slaves}" ]; then
   60.34 +	ip link set ${pdev} up
   60.35 +	ifenslave ${pdev} ${slaves}
   60.36 +    fi
   60.37      add_to_bridge2 ${bridge} ${pdev}
   60.38      do_ifup ${bridge}
   60.39  
    61.1 --- a/tools/hotplug/Linux/network-nat	Mon Mar 30 19:56:30 2009 -0700
    61.2 +++ b/tools/hotplug/Linux/network-nat	Thu Apr 23 18:49:41 2009 -0700
    61.3 @@ -48,12 +48,16 @@ then
    61.4    fi
    61.5  fi
    61.6  
    61.7 +domain_name=`cat /etc/resolv.conf | grep -v "#" | grep -E 'search|domain' -i | tail -n 1 | awk '{ print $2 }'`
    61.8 +nameserver=`cat /etc/resolv.conf | grep -v "#" | grep "nameserver" -i -m 1 | awk '{ print $2 }'`
    61.9  
   61.10  function dhcp_start()
   61.11  {
   61.12    if ! grep -q "subnet 10.0.0.0" "$dhcpd_conf_file"
   61.13    then
   61.14 -    echo >>"$dhcpd_conf_file" "subnet 10.0.0.0 netmask 255.255.0.0 {}"
   61.15 +    echo >>"$dhcpd_conf_file" "subnet 10.0.0.0 netmask 255.255.0.0 {\
   61.16 + option domain-name \"$domain_name\";\
   61.17 + option domain-name-servers $nameserver; }"
   61.18    fi
   61.19  
   61.20    "$dhcpd_init_file" restart
    62.1 --- a/tools/hotplug/Linux/vif-common.sh	Mon Mar 30 19:56:30 2009 -0700
    62.2 +++ b/tools/hotplug/Linux/vif-common.sh	Thu Apr 23 18:49:41 2009 -0700
    62.3 @@ -68,17 +68,20 @@ frob_iptable()
    62.4  {
    62.5    if [ "$command" == "online" ]
    62.6    then
    62.7 -    local c="-A"
    62.8 +    local c="-I"
    62.9    else
   62.10      local c="-D"
   62.11    fi
   62.12  
   62.13    iptables "$c" FORWARD -m physdev --physdev-in "$vif" "$@" -j ACCEPT \
   62.14 -    2>/dev/null ||
   62.15 -    [ "$c" == "-D" ] ||
   62.16 -    log err \
   62.17 -     "iptables $c FORWARD -m physdev --physdev-in $vif $@ -j ACCEPT failed.
   62.18 -If you are using iptables, this may affect networking for guest domains."
   62.19 +    2>/dev/null &&
   62.20 +  iptables "$c" FORWARD -m state --state RELATED,ESTABLISHED -m physdev \
   62.21 +    --physdev-out "$vif" -j ACCEPT 2>/dev/null
   62.22 +
   62.23 +  if [ "$command" == "online" ] && [ $? ]
   62.24 +  then
   62.25 +    log err "iptables setup failed. This may affect guest networking."
   62.26 +  fi
   62.27  }
   62.28  
   62.29  
    63.1 --- a/tools/hotplug/Linux/xen-backend.rules	Mon Mar 30 19:56:30 2009 -0700
    63.2 +++ b/tools/hotplug/Linux/xen-backend.rules	Thu Apr 23 18:49:41 2009 -0700
    63.3 @@ -1,4 +1,3 @@
    63.4 -SUBSYSTEM=="xen-backend", KERNEL=="tap*", RUN+="/etc/xen/scripts/blktap $env{ACTION}"
    63.5  SUBSYSTEM=="xen-backend", KERNEL=="vbd*", RUN+="/etc/xen/scripts/block $env{ACTION}"
    63.6  SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm $env{ACTION}"
    63.7  SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="online", RUN+="$env{script} online"
    64.1 --- a/tools/hotplug/Linux/xen-hotplug-cleanup	Mon Mar 30 19:56:30 2009 -0700
    64.2 +++ b/tools/hotplug/Linux/xen-hotplug-cleanup	Thu Apr 23 18:49:41 2009 -0700
    64.3 @@ -11,6 +11,17 @@ dir=$(dirname "$0")
    64.4  # This is pretty horrible, but there's not really a nicer way of solving this.
    64.5  claim_lock "block"
    64.6  
    64.7 +# split backend/DEVCLASS/VMID/DEVID on slashes
    64.8 +path_array=( ${XENBUS_PATH//\// } )
    64.9 +# get /vm/UUID path
   64.10 +vm=$(xenstore_read_default "/local/domain/${path_array[2]}/vm" "")
   64.11 +# construct /vm/UUID/device/DEVCLASS/DEVID
   64.12 +if [ "$vm" != "" ]; then
   64.13 +  vm_dev="$vm/device/${path_array[1]}/${path_array[3]}"
   64.14 +else
   64.15 +  vm_dev=
   64.16 +fi
   64.17 +
   64.18  # remove device frontend store entries
   64.19  xenstore-rm -t \
   64.20    $(xenstore-read "$XENBUS_PATH/frontend" 2>/dev/null) 2>/dev/null || true
   64.21 @@ -19,4 +30,7 @@ xenstore-rm -t \
   64.22  xenstore-rm -t "$XENBUS_PATH"        2>/dev/null || true
   64.23  xenstore-rm -t "error/$XENBUS_PATH"  2>/dev/null || true
   64.24