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

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



# HG changeset patch
# User Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
# Date 1211452971 -32400
# Node ID 74d0f17f3fa5245675aa8d3cdfc354e6702645f3
# Parent  f04ce41dab843b275ccb6636290e51c591ac2a06
# Parent  b259eebb0223e58eb9caf88f80b5aae1f12fc394
merge with xen-unstable.hg
---
 tools/firmware/hvmloader/acpi/dsdt.asl    |   12 
 tools/firmware/hvmloader/acpi/dsdt.c      | 1024 +++++++++++++++---------------
 tools/firmware/hvmloader/config.h         |    3 
 tools/firmware/hvmloader/hvmloader.c      |  103 +--
 tools/firmware/hvmloader/smbios.c         |    7 
 tools/firmware/rombios/rombios.c          |   91 ++
 tools/firmware/vgabios/clext.c            |   54 +
 tools/firmware/vgabios/vgatables.h        |    1 
 tools/ioemu/hw/pc.c                       |    8 
 tools/ioemu/hw/piix4acpi.c                |   11 
 tools/ioemu/hw/xenfb.c                    |    2 
 tools/ioemu/target-i386-dm/helper2.c      |    4 
 tools/ioemu/vl.h                          |    1 
 tools/libxc/xc_cpuid_x86.c                |   13 
 tools/libxc/xc_pm.c                       |   68 +
 tools/libxc/xenctrl.h                     |   13 
 tools/python/xen/util/blkif.py            |    2 
 tools/python/xen/xend/XendConfig.py       |    9 
 tools/python/xen/xend/XendConstants.py    |    5 
 tools/python/xen/xend/XendDomain.py       |    7 
 tools/python/xen/xend/xenstore/xswatch.py |    4 
 tools/python/xen/xm/main.py               |    2 
 xen/arch/ia64/xen/domain.c                |    3 
 xen/arch/x86/Makefile                     |    1 
 xen/arch/x86/acpi/cpu_idle.c              |  116 ++-
 xen/arch/x86/acpi/pmstat.c                |   25 
 xen/arch/x86/domain.c                     |    3 
 xen/arch/x86/domain_build.c               |   57 -
 xen/arch/x86/hpet.c                       |  291 ++++++++
 xen/arch/x86/hvm/hpet.c                   |    5 
 xen/arch/x86/hvm/hvm.c                    |  137 +++-
 xen/arch/x86/hvm/i8254.c                  |   30 
 xen/arch/x86/hvm/pmtimer.c                |    6 
 xen/arch/x86/hvm/rtc.c                    |    6 
 xen/arch/x86/hvm/vioapic.c                |   22 
 xen/arch/x86/hvm/vlapic.c                 |  105 ---
 xen/arch/x86/hvm/vpic.c                   |   13 
 xen/arch/x86/mm/hap/p2m-ept.c             |  172 +++--
 xen/arch/x86/mm/p2m.c                     |    8 
 xen/arch/x86/time.c                       |   59 -
 xen/arch/x86/x86_32/entry.S               |    5 
 xen/arch/x86/x86_64/compat/entry.S        |    5 
 xen/arch/x86/x86_64/entry.S               |    5 
 xen/common/domain.c                       |   10 
 xen/common/domctl.c                       |    3 
 xen/common/timer.c                        |    8 
 xen/include/asm-x86/hpet.h                |   20 
 xen/include/asm-x86/hvm/domain.h          |    1 
 xen/include/asm-x86/hvm/hvm.h             |    1 
 xen/include/asm-x86/hvm/vioapic.h         |    1 
 xen/include/asm-x86/hvm/vpic.h            |    1 
 xen/include/asm-x86/hvm/vpt.h             |    6 
 xen/include/public/hvm/params.h           |    5 
 xen/include/public/sysctl.h               |   23 
 xen/include/xen/domain.h                  |    4 
 xen/include/xen/timer.h                   |    9 
 56 files changed, 1687 insertions(+), 923 deletions(-)

diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/firmware/hvmloader/acpi/dsdt.asl
--- a/tools/firmware/hvmloader/acpi/dsdt.asl    Tue May 20 18:54:09 2008 +0900
+++ b/tools/firmware/hvmloader/acpi/dsdt.asl    Thu May 22 19:42:51 2008 +0900
@@ -52,7 +52,17 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
          * at HVM guest boot time. */
     }
 
-    /* S4 (STD) and S5 (power-off) type codes: must match piix4 emulation. */
+    /*
+     * S3 (suspend-to-ram), S4 (suspend-to-disc) and S5 (power-off) type codes:
+     * must match piix4 emulation.
+     */
+    Name (\_S3, Package (0x04)
+    {
+        0x05,  /* PM1a_CNT.SLP_TYP */
+        0x05,  /* PM1b_CNT.SLP_TYP */
+        0x0,   /* reserved */
+        0x0    /* reserved */
+    })
     Name (\_S4, Package (0x04)
     {
         0x06,  /* PM1a_CNT.SLP_TYP */
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/firmware/hvmloader/acpi/dsdt.c
--- a/tools/firmware/hvmloader/acpi/dsdt.c      Tue May 20 18:54:09 2008 +0900
+++ b/tools/firmware/hvmloader/acpi/dsdt.c      Thu May 22 19:42:51 2008 +0900
@@ -5,15 +5,15 @@
  * Copyright (C) 2000 - 2006 Intel Corporation
  * Supports ACPI Specification Revision 3.0a
  * 
- * Compilation of "dsdt.asl" - Tue Mar 25 10:53:38 2008
+ * Compilation of "dsdt.asl" - Tue May 20 14:34:40 2008
  * 
  * C source code output
  *
  */
 unsigned char AmlCode[] =
 {
-    0x44,0x53,0x44,0x54,0x24,0x11,0x00,0x00,  /* 00000000    "DSDT$..." */
-    0x02,0x82,0x58,0x65,0x6E,0x00,0x00,0x00,  /* 00000008    "..Xen..." */
+    0x44,0x53,0x44,0x54,0x32,0x11,0x00,0x00,  /* 00000000    "DSDT2..." */
+    0x02,0xEC,0x58,0x65,0x6E,0x00,0x00,0x00,  /* 00000008    "..Xen..." */
     0x48,0x56,0x4D,0x00,0x00,0x00,0x00,0x00,  /* 00000010    "HVM....." */
     0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
     0x07,0x07,0x06,0x20,0x08,0x50,0x4D,0x42,  /* 00000020    "... .PMB" */
@@ -48,518 +48,520 @@ unsigned char AmlCode[] =
     0x00,0x5B,0x83,0x0B,0x50,0x52,0x30,0x44,  /* 00000108    ".[..PR0D" */
     0x0D,0x00,0x00,0x00,0x00,0x00,0x5B,0x83,  /* 00000110    "......[." */
     0x0B,0x50,0x52,0x30,0x45,0x0E,0x00,0x00,  /* 00000118    ".PR0E..." */
-    0x00,0x00,0x00,0x08,0x5F,0x53,0x34,0x5F,  /* 00000120    "...._S4_" */
-    0x12,0x08,0x04,0x0A,0x06,0x0A,0x06,0x00,  /* 00000128    "........" */
-    0x00,0x08,0x5F,0x53,0x35,0x5F,0x12,0x08,  /* 00000130    ".._S5_.." */
-    0x04,0x0A,0x07,0x0A,0x07,0x00,0x00,0x08,  /* 00000138    "........" */
-    0x50,0x49,0x43,0x44,0x00,0x14,0x0C,0x5F,  /* 00000140    "PICD..._" */
-    0x50,0x49,0x43,0x01,0x70,0x68,0x50,0x49,  /* 00000148    "PIC.phPI" */
-    0x43,0x44,0x10,0x42,0xF1,0x5F,0x53,0x42,  /* 00000150    "CD.B._SB" */
-    0x5F,0x5B,0x80,0x42,0x49,0x4F,0x53,0x00,  /* 00000158    "_[.BIOS." */
-    0x0C,0x00,0xA0,0x0E,0x00,0x0A,0x10,0x5B,  /* 00000160    ".......[" */
-    0x81,0x21,0x42,0x49,0x4F,0x53,0x01,0x55,  /* 00000168    ".!BIOS.U" */
-    0x41,0x52,0x31,0x01,0x55,0x41,0x52,0x32,  /* 00000170    "AR1.UAR2" */
-    0x01,0x48,0x50,0x45,0x54,0x01,0x00,0x1D,  /* 00000178    ".HPET..." */
-    0x50,0x4D,0x49,0x4E,0x20,0x50,0x4C,0x45,  /* 00000180    "PMIN PLE" */
-    0x4E,0x20,0x5B,0x82,0x49,0x04,0x4D,0x45,  /* 00000188    "N [.I.ME" */
-    0x4D,0x30,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000190    "M0._HID." */
-    0x41,0xD0,0x0C,0x02,0x08,0x5F,0x43,0x52,  /* 00000198    "A...._CR" */
-    0x53,0x11,0x33,0x0A,0x30,0x8A,0x2B,0x00,  /* 000001A0    "S.3.0.+." */
-    0x00,0x0D,0x03,0x00,0x00,0x00,0x00,0x00,  /* 000001A8    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B0    "........" */
-    0x00,0x00,0x00,0xFF,0xFF,0x09,0x00,0x00,  /* 000001B8    "........" */
+    0x00,0x00,0x00,0x08,0x5F,0x53,0x33,0x5F,  /* 00000120    "...._S3_" */
+    0x12,0x08,0x04,0x0A,0x05,0x0A,0x05,0x00,  /* 00000128    "........" */
+    0x00,0x08,0x5F,0x53,0x34,0x5F,0x12,0x08,  /* 00000130    ".._S4_.." */
+    0x04,0x0A,0x06,0x0A,0x06,0x00,0x00,0x08,  /* 00000138    "........" */
+    0x5F,0x53,0x35,0x5F,0x12,0x08,0x04,0x0A,  /* 00000140    "_S5_...." */
+    0x07,0x0A,0x07,0x00,0x00,0x08,0x50,0x49,  /* 00000148    "......PI" */
+    0x43,0x44,0x00,0x14,0x0C,0x5F,0x50,0x49,  /* 00000150    "CD..._PI" */
+    0x43,0x01,0x70,0x68,0x50,0x49,0x43,0x44,  /* 00000158    "C.phPICD" */
+    0x10,0x42,0xF1,0x5F,0x53,0x42,0x5F,0x5B,  /* 00000160    ".B._SB_[" */
+    0x80,0x42,0x49,0x4F,0x53,0x00,0x0C,0x00,  /* 00000168    ".BIOS..." */
+    0xA0,0x0E,0x00,0x0A,0x10,0x5B,0x81,0x21,  /* 00000170    ".....[.!" */
+    0x42,0x49,0x4F,0x53,0x01,0x55,0x41,0x52,  /* 00000178    "BIOS.UAR" */
+    0x31,0x01,0x55,0x41,0x52,0x32,0x01,0x48,  /* 00000180    "1.UAR2.H" */
+    0x50,0x45,0x54,0x01,0x00,0x1D,0x50,0x4D,  /* 00000188    "PET...PM" */
+    0x49,0x4E,0x20,0x50,0x4C,0x45,0x4E,0x20,  /* 00000190    "IN PLEN " */
+    0x5B,0x82,0x49,0x04,0x4D,0x45,0x4D,0x30,  /* 00000198    "[.I.MEM0" */
+    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 000001A0    "._HID.A." */
+    0x0C,0x02,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 000001A8    "..._CRS." */
+    0x33,0x0A,0x30,0x8A,0x2B,0x00,0x00,0x0D,  /* 000001B0    "3.0.+..." */
+    0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001B8    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001C0    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x00,  /* 000001C8    "........" */
-    0x00,0x00,0x00,0x79,0x00,0x5B,0x82,0x4E,  /* 000001D0    "...y.[.N" */
-    0xE8,0x50,0x43,0x49,0x30,0x08,0x5F,0x48,  /* 000001D8    ".PCI0._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x0A,0x03,0x08,  /* 000001E0    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x00,0x08,0x5F,0x41,  /* 000001E8    "_UID.._A" */
-    0x44,0x52,0x00,0x08,0x5F,0x42,0x42,0x4E,  /* 000001F0    "DR.._BBN" */
-    0x00,0x14,0x4E,0x0C,0x5F,0x43,0x52,0x53,  /* 000001F8    "..N._CRS" */
-    0x00,0x08,0x50,0x52,0x54,0x30,0x11,0x42,  /* 00000200    "..PRT0.B" */
-    0x07,0x0A,0x6E,0x88,0x0D,0x00,0x02,0x0E,  /* 00000208    "..n....." */
-    0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,  /* 00000210    "........" */
-    0x00,0x00,0x01,0x47,0x01,0xF8,0x0C,0xF8,  /* 00000218    "...G...." */
-    0x0C,0x01,0x08,0x88,0x0D,0x00,0x01,0x0C,  /* 00000220    "........" */
-    0x03,0x00,0x00,0x00,0x00,0xF7,0x0C,0x00,  /* 00000228    "........" */
-    0x00,0xF8,0x0C,0x88,0x0D,0x00,0x01,0x0C,  /* 00000230    "........" */
-    0x03,0x00,0x00,0x00,0x0D,0xFF,0xFF,0x00,  /* 00000238    "........" */
-    0x00,0x00,0xF3,0x87,0x17,0x00,0x00,0x0C,  /* 00000240    "........" */
-    0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,  /* 00000248    "........" */
-    0x00,0xFF,0xFF,0x0B,0x00,0x00,0x00,0x00,  /* 00000250    "........" */
-    0x00,0x00,0x00,0x02,0x00,0x87,0x17,0x00,  /* 00000258    "........" */
-    0x00,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,  /* 00000260    "........" */
-    0x00,0x00,0xF0,0xFF,0xFF,0xFF,0xF4,0x00,  /* 00000268    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x79,  /* 00000270    ".......y" */
-    0x00,0x8A,0x50,0x52,0x54,0x30,0x0A,0x5C,  /* 00000278    "..PRT0.\" */
-    0x4D,0x4D,0x49,0x4E,0x8A,0x50,0x52,0x54,  /* 00000280    "MMIN.PRT" */
-    0x30,0x0A,0x60,0x4D,0x4D,0x41,0x58,0x8A,  /* 00000288    "0.`MMAX." */
-    0x50,0x52,0x54,0x30,0x0A,0x68,0x4D,0x4C,  /* 00000290    "PRT0.hML" */
-    0x45,0x4E,0x70,0x50,0x4D,0x49,0x4E,0x4D,  /* 00000298    "ENpPMINM" */
-    0x4D,0x49,0x4E,0x70,0x50,0x4C,0x45,0x4E,  /* 000002A0    "MINpPLEN" */
-    0x4D,0x4C,0x45,0x4E,0x72,0x4D,0x4D,0x49,  /* 000002A8    "MLENrMMI" */
-    0x4E,0x4D,0x4C,0x45,0x4E,0x4D,0x4D,0x41,  /* 000002B0    "NMLENMMA" */
-    0x58,0x74,0x4D,0x4D,0x41,0x58,0x01,0x4D,  /* 000002B8    "XtMMAX.M" */
-    0x4D,0x41,0x58,0xA4,0x50,0x52,0x54,0x30,  /* 000002C0    "MAX.PRT0" */
-    0x08,0x42,0x55,0x46,0x41,0x11,0x09,0x0A,  /* 000002C8    ".BUFA..." */
-    0x06,0x23,0x20,0x0C,0x18,0x79,0x00,0x08,  /* 000002D0    ".# ..y.." */
-    0x42,0x55,0x46,0x42,0x11,0x09,0x0A,0x06,  /* 000002D8    "BUFB...." */
-    0x23,0x00,0x00,0x18,0x79,0x00,0x8B,0x42,  /* 000002E0    "#...y..B" */
-    0x55,0x46,0x42,0x01,0x49,0x52,0x51,0x56,  /* 000002E8    "UFB.IRQV" */
-    0x5B,0x82,0x48,0x08,0x4C,0x4E,0x4B,0x41,  /* 000002F0    "[.H.LNKA" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 000002F8    "._HID.A." */
-    0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x01,  /* 00000300    "..._UID." */
-    0x14,0x1C,0x5F,0x53,0x54,0x41,0x00,0x7B,  /* 00000308    ".._STA.{" */
-    0x50,0x49,0x52,0x41,0x0A,0x80,0x60,0xA0,  /* 00000310    "PIRA..`." */
-    0x08,0x93,0x60,0x0A,0x80,0xA4,0x0A,0x09,  /* 00000318    "..`....." */
-    0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x0B,0x5F,  /* 00000320    "......._" */
-    0x50,0x52,0x53,0x00,0xA4,0x42,0x55,0x46,  /* 00000328    "PRS..BUF" */
-    0x41,0x14,0x11,0x5F,0x44,0x49,0x53,0x00,  /* 00000330    "A.._DIS." */
-    0x7D,0x50,0x49,0x52,0x41,0x0A,0x80,0x50,  /* 00000338    "}PIRA..P" */
-    0x49,0x52,0x41,0x14,0x1A,0x5F,0x43,0x52,  /* 00000340    "IRA.._CR" */
-    0x53,0x00,0x7B,0x50,0x49,0x52,0x41,0x0A,  /* 00000348    "S.{PIRA." */
-    0x0F,0x60,0x79,0x01,0x60,0x49,0x52,0x51,  /* 00000350    ".`y.`IRQ" */
-    0x56,0xA4,0x42,0x55,0x46,0x42,0x14,0x1B,  /* 00000358    "V.BUFB.." */
-    0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,0x01,  /* 00000360    "_SRS..h." */
-    0x49,0x52,0x51,0x31,0x82,0x49,0x52,0x51,  /* 00000368    "IRQ1.IRQ" */
-    0x31,0x60,0x76,0x60,0x70,0x60,0x50,0x49,  /* 00000370    "1`v`p`PI" */
-    0x52,0x41,0x5B,0x82,0x49,0x08,0x4C,0x4E,  /* 00000378    "RA[.I.LN" */
-    0x4B,0x42,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000380    "KB._HID." */
-    0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49,  /* 00000388    "A...._UI" */
-    0x44,0x0A,0x02,0x14,0x1C,0x5F,0x53,0x54,  /* 00000390    "D...._ST" */
-    0x41,0x00,0x7B,0x50,0x49,0x52,0x42,0x0A,  /* 00000398    "A.{PIRB." */
-    0x80,0x60,0xA0,0x08,0x93,0x60,0x0A,0x80,  /* 000003A0    ".`...`.." */
-    0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,0x0B,  /* 000003A8    "........" */
-    0x14,0x0B,0x5F,0x50,0x52,0x53,0x00,0xA4,  /* 000003B0    ".._PRS.." */
-    0x42,0x55,0x46,0x41,0x14,0x11,0x5F,0x44,  /* 000003B8    "BUFA.._D" */
-    0x49,0x53,0x00,0x7D,0x50,0x49,0x52,0x42,  /* 000003C0    "IS.}PIRB" */
-    0x0A,0x80,0x50,0x49,0x52,0x42,0x14,0x1A,  /* 000003C8    "..PIRB.." */
-    0x5F,0x43,0x52,0x53,0x00,0x7B,0x50,0x49,  /* 000003D0    "_CRS.{PI" */
-    0x52,0x42,0x0A,0x0F,0x60,0x79,0x01,0x60,  /* 000003D8    "RB..`y.`" */
-    0x49,0x52,0x51,0x56,0xA4,0x42,0x55,0x46,  /* 000003E0    "IRQV.BUF" */
-    0x42,0x14,0x1B,0x5F,0x53,0x52,0x53,0x01,  /* 000003E8    "B.._SRS." */
-    0x8B,0x68,0x01,0x49,0x52,0x51,0x31,0x82,  /* 000003F0    ".h.IRQ1." */
-    0x49,0x52,0x51,0x31,0x60,0x76,0x60,0x70,  /* 000003F8    "IRQ1`v`p" */
-    0x60,0x50,0x49,0x52,0x42,0x5B,0x82,0x49,  /* 00000400    "`PIRB[.I" */
-    0x08,0x4C,0x4E,0x4B,0x43,0x08,0x5F,0x48,  /* 00000408    ".LNKC._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,  /* 00000410    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x0A,0x03,0x14,0x1C,  /* 00000418    "_UID...." */
-    0x5F,0x53,0x54,0x41,0x00,0x7B,0x50,0x49,  /* 00000420    "_STA.{PI" */
-    0x52,0x43,0x0A,0x80,0x60,0xA0,0x08,0x93,  /* 00000428    "RC..`..." */
-    0x60,0x0A,0x80,0xA4,0x0A,0x09,0xA1,0x04,  /* 00000430    "`......." */
-    0xA4,0x0A,0x0B,0x14,0x0B,0x5F,0x50,0x52,  /* 00000438    "....._PR" */
-    0x53,0x00,0xA4,0x42,0x55,0x46,0x41,0x14,  /* 00000440    "S..BUFA." */
-    0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,  /* 00000448    "._DIS.}P" */
-    0x49,0x52,0x43,0x0A,0x80,0x50,0x49,0x52,  /* 00000450    "IRC..PIR" */
-    0x43,0x14,0x1A,0x5F,0x43,0x52,0x53,0x00,  /* 00000458    "C.._CRS." */
-    0x7B,0x50,0x49,0x52,0x43,0x0A,0x0F,0x60,  /* 00000460    "{PIRC..`" */
-    0x79,0x01,0x60,0x49,0x52,0x51,0x56,0xA4,  /* 00000468    "y.`IRQV." */
-    0x42,0x55,0x46,0x42,0x14,0x1B,0x5F,0x53,  /* 00000470    "BUFB.._S" */
-    0x52,0x53,0x01,0x8B,0x68,0x01,0x49,0x52,  /* 00000478    "RS..h.IR" */
-    0x51,0x31,0x82,0x49,0x52,0x51,0x31,0x60,  /* 00000480    "Q1.IRQ1`" */
-    0x76,0x60,0x70,0x60,0x50,0x49,0x52,0x43,  /* 00000488    "v`p`PIRC" */
-    0x5B,0x82,0x49,0x08,0x4C,0x4E,0x4B,0x44,  /* 00000490    "[.I.LNKD" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000498    "._HID.A." */
-    0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 000004A0    "..._UID." */
-    0x04,0x14,0x1C,0x5F,0x53,0x54,0x41,0x00,  /* 000004A8    "..._STA." */
-    0x7B,0x50,0x49,0x52,0x44,0x0A,0x80,0x60,  /* 000004B0    "{PIRD..`" */
-    0xA0,0x08,0x93,0x60,0x0A,0x80,0xA4,0x0A,  /* 000004B8    "...`...." */
-    0x09,0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x0B,  /* 000004C0    "........" */
-    0x5F,0x50,0x52,0x53,0x00,0xA4,0x42,0x55,  /* 000004C8    "_PRS..BU" */
-    0x46,0x41,0x14,0x11,0x5F,0x44,0x49,0x53,  /* 000004D0    "FA.._DIS" */
-    0x00,0x7D,0x50,0x49,0x52,0x44,0x0A,0x80,  /* 000004D8    ".}PIRD.." */
-    0x50,0x49,0x52,0x44,0x14,0x1A,0x5F,0x43,  /* 000004E0    "PIRD.._C" */
-    0x52,0x53,0x00,0x7B,0x50,0x49,0x52,0x44,  /* 000004E8    "RS.{PIRD" */
-    0x0A,0x0F,0x60,0x79,0x01,0x60,0x49,0x52,  /* 000004F0    "..`y.`IR" */
-    0x51,0x56,0xA4,0x42,0x55,0x46,0x42,0x14,  /* 000004F8    "QV.BUFB." */
-    0x1B,0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,  /* 00000500    "._SRS..h" */
-    0x01,0x49,0x52,0x51,0x31,0x82,0x49,0x52,  /* 00000508    ".IRQ1.IR" */
-    0x51,0x31,0x60,0x76,0x60,0x70,0x60,0x50,  /* 00000510    "Q1`v`p`P" */
-    0x49,0x52,0x44,0x5B,0x82,0x44,0x05,0x48,  /* 00000518    "IRD[.D.H" */
-    0x50,0x45,0x54,0x08,0x5F,0x48,0x49,0x44,  /* 00000520    "PET._HID" */
-    0x0C,0x41,0xD0,0x01,0x03,0x08,0x5F,0x55,  /* 00000528    ".A...._U" */
-    0x49,0x44,0x00,0x14,0x18,0x5F,0x53,0x54,  /* 00000530    "ID..._ST" */
-    0x41,0x00,0xA0,0x0C,0x93,0x5E,0x5E,0x5E,  /* 00000538    "A....^^^" */
-    0x48,0x50,0x45,0x54,0x00,0xA4,0x00,0xA1,  /* 00000540    "HPET...." */
-    0x04,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,  /* 00000548    "....._CR" */
-    0x53,0x11,0x1F,0x0A,0x1C,0x87,0x17,0x00,  /* 00000550    "S......." */
-    0x00,0x0D,0x01,0x00,0x00,0x00,0x00,0x00,  /* 00000558    "........" */
-    0x00,0xD0,0xFE,0xFF,0x03,0xD0,0xFE,0x00,  /* 00000560    "........" */
-    0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x79,  /* 00000568    ".......y" */
-    0x00,0x14,0x16,0x5F,0x50,0x52,0x54,0x00,  /* 00000570    "..._PRT." */
-    0xA0,0x0A,0x50,0x49,0x43,0x44,0xA4,0x50,  /* 00000578    "..PICD.P" */
-    0x52,0x54,0x41,0xA4,0x50,0x52,0x54,0x50,  /* 00000580    "RTA.PRTP" */
-    0x08,0x50,0x52,0x54,0x50,0x12,0x49,0x36,  /* 00000588    ".PRTP.I6" */
-    0x3C,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x01,  /* 00000590    "<......." */
-    0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000598    "..LNKB.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x01,0x00,0x01,  /* 000005A0    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 000005A8    "LNKC...." */
-    0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x02,0x4C,  /* 000005B0    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 000005B8    "NKD....." */
-    0xFF,0xFF,0x01,0x00,0x0A,0x03,0x4C,0x4E,  /* 000005C0    "......LN" */
-    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000005C8    "KA......" */
-    0xFF,0x02,0x00,0x00,0x4C,0x4E,0x4B,0x43,  /* 000005D0    "....LNKC" */
+    0x00,0xFF,0xFF,0x09,0x00,0x00,0x00,0x00,  /* 000001C8    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001D0    "........" */
+    0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x00,  /* 000001D8    "........" */
+    0x00,0x79,0x00,0x5B,0x82,0x4E,0xE8,0x50,  /* 000001E0    ".y.[.N.P" */
+    0x43,0x49,0x30,0x08,0x5F,0x48,0x49,0x44,  /* 000001E8    "CI0._HID" */
+    0x0C,0x41,0xD0,0x0A,0x03,0x08,0x5F,0x55,  /* 000001F0    ".A...._U" */
+    0x49,0x44,0x00,0x08,0x5F,0x41,0x44,0x52,  /* 000001F8    "ID.._ADR" */
+    0x00,0x08,0x5F,0x42,0x42,0x4E,0x00,0x14,  /* 00000200    ".._BBN.." */
+    0x4E,0x0C,0x5F,0x43,0x52,0x53,0x00,0x08,  /* 00000208    "N._CRS.." */
+    0x50,0x52,0x54,0x30,0x11,0x42,0x07,0x0A,  /* 00000210    "PRT0.B.." */
+    0x6E,0x88,0x0D,0x00,0x02,0x0E,0x00,0x00,  /* 00000218    "n......." */
+    0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,  /* 00000220    "........" */
+    0x01,0x47,0x01,0xF8,0x0C,0xF8,0x0C,0x01,  /* 00000228    ".G......" */
+    0x08,0x88,0x0D,0x00,0x01,0x0C,0x03,0x00,  /* 00000230    "........" */
+    0x00,0x00,0x00,0xF7,0x0C,0x00,0x00,0xF8,  /* 00000238    "........" */
+    0x0C,0x88,0x0D,0x00,0x01,0x0C,0x03,0x00,  /* 00000240    "........" */
+    0x00,0x00,0x0D,0xFF,0xFF,0x00,0x00,0x00,  /* 00000248    "........" */
+    0xF3,0x87,0x17,0x00,0x00,0x0C,0x03,0x00,  /* 00000250    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0xFF,  /* 00000258    "........" */
+    0xFF,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000260    "........" */
+    0x00,0x02,0x00,0x87,0x17,0x00,0x00,0x0C,  /* 00000268    "........" */
+    0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000270    "........" */
+    0xF0,0xFF,0xFF,0xFF,0xF4,0x00,0x00,0x00,  /* 00000278    "........" */
+    0x00,0x00,0x00,0x00,0x05,0x79,0x00,0x8A,  /* 00000280    ".....y.." */
+    0x50,0x52,0x54,0x30,0x0A,0x5C,0x4D,0x4D,  /* 00000288    "PRT0.\MM" */
+    0x49,0x4E,0x8A,0x50,0x52,0x54,0x30,0x0A,  /* 00000290    "IN.PRT0." */
+    0x60,0x4D,0x4D,0x41,0x58,0x8A,0x50,0x52,  /* 00000298    "`MMAX.PR" */
+    0x54,0x30,0x0A,0x68,0x4D,0x4C,0x45,0x4E,  /* 000002A0    "T0.hMLEN" */
+    0x70,0x50,0x4D,0x49,0x4E,0x4D,0x4D,0x49,  /* 000002A8    "pPMINMMI" */
+    0x4E,0x70,0x50,0x4C,0x45,0x4E,0x4D,0x4C,  /* 000002B0    "NpPLENML" */
+    0x45,0x4E,0x72,0x4D,0x4D,0x49,0x4E,0x4D,  /* 000002B8    "ENrMMINM" */
+    0x4C,0x45,0x4E,0x4D,0x4D,0x41,0x58,0x74,  /* 000002C0    "LENMMAXt" */
+    0x4D,0x4D,0x41,0x58,0x01,0x4D,0x4D,0x41,  /* 000002C8    "MMAX.MMA" */
+    0x58,0xA4,0x50,0x52,0x54,0x30,0x08,0x42,  /* 000002D0    "X.PRT0.B" */
+    0x55,0x46,0x41,0x11,0x09,0x0A,0x06,0x23,  /* 000002D8    "UFA....#" */
+    0x20,0x0C,0x18,0x79,0x00,0x08,0x42,0x55,  /* 000002E0    " ..y..BU" */
+    0x46,0x42,0x11,0x09,0x0A,0x06,0x23,0x00,  /* 000002E8    "FB....#." */
+    0x00,0x18,0x79,0x00,0x8B,0x42,0x55,0x46,  /* 000002F0    "..y..BUF" */
+    0x42,0x01,0x49,0x52,0x51,0x56,0x5B,0x82,  /* 000002F8    "B.IRQV[." */
+    0x48,0x08,0x4C,0x4E,0x4B,0x41,0x08,0x5F,  /* 00000300    "H.LNKA._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,  /* 00000308    "HID.A..." */
+    0x08,0x5F,0x55,0x49,0x44,0x01,0x14,0x1C,  /* 00000310    "._UID..." */
+    0x5F,0x53,0x54,0x41,0x00,0x7B,0x50,0x49,  /* 00000318    "_STA.{PI" */
+    0x52,0x41,0x0A,0x80,0x60,0xA0,0x08,0x93,  /* 00000320    "RA..`..." */
+    0x60,0x0A,0x80,0xA4,0x0A,0x09,0xA1,0x04,  /* 00000328    "`......." */
+    0xA4,0x0A,0x0B,0x14,0x0B,0x5F,0x50,0x52,  /* 00000330    "....._PR" */
+    0x53,0x00,0xA4,0x42,0x55,0x46,0x41,0x14,  /* 00000338    "S..BUFA." */
+    0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,  /* 00000340    "._DIS.}P" */
+    0x49,0x52,0x41,0x0A,0x80,0x50,0x49,0x52,  /* 00000348    "IRA..PIR" */
+    0x41,0x14,0x1A,0x5F,0x43,0x52,0x53,0x00,  /* 00000350    "A.._CRS." */
+    0x7B,0x50,0x49,0x52,0x41,0x0A,0x0F,0x60,  /* 00000358    "{PIRA..`" */
+    0x79,0x01,0x60,0x49,0x52,0x51,0x56,0xA4,  /* 00000360    "y.`IRQV." */
+    0x42,0x55,0x46,0x42,0x14,0x1B,0x5F,0x53,  /* 00000368    "BUFB.._S" */
+    0x52,0x53,0x01,0x8B,0x68,0x01,0x49,0x52,  /* 00000370    "RS..h.IR" */
+    0x51,0x31,0x82,0x49,0x52,0x51,0x31,0x60,  /* 00000378    "Q1.IRQ1`" */
+    0x76,0x60,0x70,0x60,0x50,0x49,0x52,0x41,  /* 00000380    "v`p`PIRA" */
+    0x5B,0x82,0x49,0x08,0x4C,0x4E,0x4B,0x42,  /* 00000388    "[.I.LNKB" */
+    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000390    "._HID.A." */
+    0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 00000398    "..._UID." */
+    0x02,0x14,0x1C,0x5F,0x53,0x54,0x41,0x00,  /* 000003A0    "..._STA." */
+    0x7B,0x50,0x49,0x52,0x42,0x0A,0x80,0x60,  /* 000003A8    "{PIRB..`" */
+    0xA0,0x08,0x93,0x60,0x0A,0x80,0xA4,0x0A,  /* 000003B0    "...`...." */
+    0x09,0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x0B,  /* 000003B8    "........" */
+    0x5F,0x50,0x52,0x53,0x00,0xA4,0x42,0x55,  /* 000003C0    "_PRS..BU" */
+    0x46,0x41,0x14,0x11,0x5F,0x44,0x49,0x53,  /* 000003C8    "FA.._DIS" */
+    0x00,0x7D,0x50,0x49,0x52,0x42,0x0A,0x80,  /* 000003D0    ".}PIRB.." */
+    0x50,0x49,0x52,0x42,0x14,0x1A,0x5F,0x43,  /* 000003D8    "PIRB.._C" */
+    0x52,0x53,0x00,0x7B,0x50,0x49,0x52,0x42,  /* 000003E0    "RS.{PIRB" */
+    0x0A,0x0F,0x60,0x79,0x01,0x60,0x49,0x52,  /* 000003E8    "..`y.`IR" */
+    0x51,0x56,0xA4,0x42,0x55,0x46,0x42,0x14,  /* 000003F0    "QV.BUFB." */
+    0x1B,0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,  /* 000003F8    "._SRS..h" */
+    0x01,0x49,0x52,0x51,0x31,0x82,0x49,0x52,  /* 00000400    ".IRQ1.IR" */
+    0x51,0x31,0x60,0x76,0x60,0x70,0x60,0x50,  /* 00000408    "Q1`v`p`P" */
+    0x49,0x52,0x42,0x5B,0x82,0x49,0x08,0x4C,  /* 00000410    "IRB[.I.L" */
+    0x4E,0x4B,0x43,0x08,0x5F,0x48,0x49,0x44,  /* 00000418    "NKC._HID" */
+    0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,  /* 00000420    ".A...._U" */
+    0x49,0x44,0x0A,0x03,0x14,0x1C,0x5F,0x53,  /* 00000428    "ID...._S" */
+    0x54,0x41,0x00,0x7B,0x50,0x49,0x52,0x43,  /* 00000430    "TA.{PIRC" */
+    0x0A,0x80,0x60,0xA0,0x08,0x93,0x60,0x0A,  /* 00000438    "..`...`." */
+    0x80,0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,  /* 00000440    "........" */
+    0x0B,0x14,0x0B,0x5F,0x50,0x52,0x53,0x00,  /* 00000448    "..._PRS." */
+    0xA4,0x42,0x55,0x46,0x41,0x14,0x11,0x5F,  /* 00000450    ".BUFA.._" */
+    0x44,0x49,0x53,0x00,0x7D,0x50,0x49,0x52,  /* 00000458    "DIS.}PIR" */
+    0x43,0x0A,0x80,0x50,0x49,0x52,0x43,0x14,  /* 00000460    "C..PIRC." */
+    0x1A,0x5F,0x43,0x52,0x53,0x00,0x7B,0x50,  /* 00000468    "._CRS.{P" */
+    0x49,0x52,0x43,0x0A,0x0F,0x60,0x79,0x01,  /* 00000470    "IRC..`y." */
+    0x60,0x49,0x52,0x51,0x56,0xA4,0x42,0x55,  /* 00000478    "`IRQV.BU" */
+    0x46,0x42,0x14,0x1B,0x5F,0x53,0x52,0x53,  /* 00000480    "FB.._SRS" */
+    0x01,0x8B,0x68,0x01,0x49,0x52,0x51,0x31,  /* 00000488    "..h.IRQ1" */
+    0x82,0x49,0x52,0x51,0x31,0x60,0x76,0x60,  /* 00000490    ".IRQ1`v`" */
+    0x70,0x60,0x50,0x49,0x52,0x43,0x5B,0x82,  /* 00000498    "p`PIRC[." */
+    0x49,0x08,0x4C,0x4E,0x4B,0x44,0x08,0x5F,  /* 000004A0    "I.LNKD._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,  /* 000004A8    "HID.A..." */
+    0x08,0x5F,0x55,0x49,0x44,0x0A,0x04,0x14,  /* 000004B0    "._UID..." */
+    0x1C,0x5F,0x53,0x54,0x41,0x00,0x7B,0x50,  /* 000004B8    "._STA.{P" */
+    0x49,0x52,0x44,0x0A,0x80,0x60,0xA0,0x08,  /* 000004C0    "IRD..`.." */
+    0x93,0x60,0x0A,0x80,0xA4,0x0A,0x09,0xA1,  /* 000004C8    ".`......" */
+    0x04,0xA4,0x0A,0x0B,0x14,0x0B,0x5F,0x50,  /* 000004D0    "......_P" */
+    0x52,0x53,0x00,0xA4,0x42,0x55,0x46,0x41,  /* 000004D8    "RS..BUFA" */
+    0x14,0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,  /* 000004E0    ".._DIS.}" */
+    0x50,0x49,0x52,0x44,0x0A,0x80,0x50,0x49,  /* 000004E8    "PIRD..PI" */
+    0x52,0x44,0x14,0x1A,0x5F,0x43,0x52,0x53,  /* 000004F0    "RD.._CRS" */
+    0x00,0x7B,0x50,0x49,0x52,0x44,0x0A,0x0F,  /* 000004F8    ".{PIRD.." */
+    0x60,0x79,0x01,0x60,0x49,0x52,0x51,0x56,  /* 00000500    "`y.`IRQV" */
+    0xA4,0x42,0x55,0x46,0x42,0x14,0x1B,0x5F,  /* 00000508    ".BUFB.._" */
+    0x53,0x52,0x53,0x01,0x8B,0x68,0x01,0x49,  /* 00000510    "SRS..h.I" */
+    0x52,0x51,0x31,0x82,0x49,0x52,0x51,0x31,  /* 00000518    "RQ1.IRQ1" */
+    0x60,0x76,0x60,0x70,0x60,0x50,0x49,0x52,  /* 00000520    "`v`p`PIR" */
+    0x44,0x5B,0x82,0x44,0x05,0x48,0x50,0x45,  /* 00000528    "D[.D.HPE" */
+    0x54,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000530    "T._HID.A" */
+    0xD0,0x01,0x03,0x08,0x5F,0x55,0x49,0x44,  /* 00000538    "...._UID" */
+    0x00,0x14,0x18,0x5F,0x53,0x54,0x41,0x00,  /* 00000540    "..._STA." */
+    0xA0,0x0C,0x93,0x5E,0x5E,0x5E,0x48,0x50,  /* 00000548    "...^^^HP" */
+    0x45,0x54,0x00,0xA4,0x00,0xA1,0x04,0xA4,  /* 00000550    "ET......" */
+    0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000558    "..._CRS." */
+    0x1F,0x0A,0x1C,0x87,0x17,0x00,0x00,0x0D,  /* 00000560    "........" */
+    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,  /* 00000568    "........" */
+    0xFE,0xFF,0x03,0xD0,0xFE,0x00,0x00,0x00,  /* 00000570    "........" */
+    0x00,0x00,0x04,0x00,0x00,0x79,0x00,0x14,  /* 00000578    ".....y.." */
+    0x16,0x5F,0x50,0x52,0x54,0x00,0xA0,0x0A,  /* 00000580    "._PRT..." */
+    0x50,0x49,0x43,0x44,0xA4,0x50,0x52,0x54,  /* 00000588    "PICD.PRT" */
+    0x41,0xA4,0x50,0x52,0x54,0x50,0x08,0x50,  /* 00000590    "A.PRTP.P" */
+    0x52,0x54,0x50,0x12,0x49,0x36,0x3C,0x12,  /* 00000598    "RTP.I6<." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x01,0x00,0x00,  /* 000005A0    "........" */
+    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 000005A8    "LNKB...." */
+    0x0C,0xFF,0xFF,0x01,0x00,0x01,0x4C,0x4E,  /* 000005B0    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000005B8    "KC......" */
+    0xFF,0x01,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 000005C0    ".....LNK" */
+    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000005C8    "D......." */
+    0x01,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,  /* 000005D0    "....LNKA" */
     0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x02,  /* 000005D8    "........" */
-    0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 000005E0    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,  /* 000005E8    "........" */
-    0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000005F0    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,0x03,  /* 000005F8    "........" */
-    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 00000600    "LNKB...." */
-    0x0C,0xFF,0xFF,0x03,0x00,0x00,0x4C,0x4E,  /* 00000608    "......LN" */
-    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000610    "KD......" */
-    0xFF,0x03,0x00,0x01,0x4C,0x4E,0x4B,0x41,  /* 00000618    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000620    "........" */
-    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000628    "...LNKB." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x03,0x00,  /* 00000630    "........" */
-    0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000638    "..LNKC.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x00,  /* 00000640    "........" */
-    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 00000648    "LNKA...." */
-    0x0C,0xFF,0xFF,0x04,0x00,0x01,0x4C,0x4E,  /* 00000650    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000658    "KB......" */
-    0xFF,0x04,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000660    ".....LNK" */
-    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000668    "C......." */
-    0x04,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x44,  /* 00000670    "....LNKD" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x05,  /* 00000678    "........" */
-    0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000680    "..LNKB.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x05,0x00,0x01,  /* 00000688    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 00000690    "LNKC...." */
-    0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x02,0x4C,  /* 00000698    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 000006A0    "NKD....." */
-    0xFF,0xFF,0x05,0x00,0x0A,0x03,0x4C,0x4E,  /* 000006A8    "......LN" */
-    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000006B0    "KA......" */
-    0xFF,0x06,0x00,0x00,0x4C,0x4E,0x4B,0x43,  /* 000006B8    "....LNKC" */
+    0x00,0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 000005E0    "..LNKC.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x01,  /* 000005E8    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 000005F0    "LNKD...." */
+    0x0C,0xFF,0xFF,0x02,0x00,0x0A,0x02,0x4C,  /* 000005F8    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 00000600    "NKA....." */
+    0xFF,0xFF,0x02,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000608    "......LN" */
+    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000610    "KB......" */
+    0xFF,0x03,0x00,0x00,0x4C,0x4E,0x4B,0x44,  /* 00000618    "....LNKD" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000620    "........" */
+    0x00,0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000628    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,  /* 00000630    "........" */
+    0x02,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 00000638    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x03,  /* 00000640    "........" */
+    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000648    "LNKC...." */
+    0x0C,0xFF,0xFF,0x04,0x00,0x00,0x4C,0x4E,  /* 00000650    "......LN" */
+    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000658    "KA......" */
+    0xFF,0x04,0x00,0x01,0x4C,0x4E,0x4B,0x42,  /* 00000660    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x04,  /* 00000668    "........" */
+    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000670    "...LNKC." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 00000678    "........" */
+    0x0A,0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000680    "..LNKD.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x05,0x00,0x00,  /* 00000688    "........" */
+    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 00000690    "LNKB...." */
+    0x0C,0xFF,0xFF,0x05,0x00,0x01,0x4C,0x4E,  /* 00000698    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000006A0    "KC......" */
+    0xFF,0x05,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 000006A8    ".....LNK" */
+    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000006B0    "D......." */
+    0x05,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,  /* 000006B8    "....LNKA" */
     0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x06,  /* 000006C0    "........" */
-    0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 000006C8    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,  /* 000006D0    "........" */
-    0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000006D8    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,0x03,  /* 000006E0    "........" */
-    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 000006E8    "LNKB...." */
-    0x0C,0xFF,0xFF,0x07,0x00,0x00,0x4C,0x4E,  /* 000006F0    "......LN" */
-    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000006F8    "KD......" */
-    0xFF,0x07,0x00,0x01,0x4C,0x4E,0x4B,0x41,  /* 00000700    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x07,  /* 00000708    "........" */
-    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000710    "...LNKB." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x07,0x00,  /* 00000718    "........" */
-    0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000720    "..LNKC.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x00,  /* 00000728    "........" */
-    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 00000730    "LNKA...." */
-    0x0C,0xFF,0xFF,0x08,0x00,0x01,0x4C,0x4E,  /* 00000738    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000740    "KB......" */
-    0xFF,0x08,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000748    ".....LNK" */
-    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000750    "C......." */
-    0x08,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x44,  /* 00000758    "....LNKD" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x09,  /* 00000760    "........" */
-    0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000768    "..LNKB.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x09,0x00,0x01,  /* 00000770    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 00000778    "LNKC...." */
-    0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x02,0x4C,  /* 00000780    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 00000788    "NKD....." */
-    0xFF,0xFF,0x09,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000790    "......LN" */
-    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000798    "KA......" */
-    0xFF,0x0A,0x00,0x00,0x4C,0x4E,0x4B,0x43,  /* 000007A0    "....LNKC" */
+    0x00,0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 000006C8    "..LNKC.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x01,  /* 000006D0    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 000006D8    "LNKD...." */
+    0x0C,0xFF,0xFF,0x06,0x00,0x0A,0x02,0x4C,  /* 000006E0    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 000006E8    "NKA....." */
+    0xFF,0xFF,0x06,0x00,0x0A,0x03,0x4C,0x4E,  /* 000006F0    "......LN" */
+    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000006F8    "KB......" */
+    0xFF,0x07,0x00,0x00,0x4C,0x4E,0x4B,0x44,  /* 00000700    "....LNKD" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x07,  /* 00000708    "........" */
+    0x00,0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000710    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,  /* 00000718    "........" */
+    0x02,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 00000720    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x03,  /* 00000728    "........" */
+    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000730    "LNKC...." */
+    0x0C,0xFF,0xFF,0x08,0x00,0x00,0x4C,0x4E,  /* 00000738    "......LN" */
+    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000740    "KA......" */
+    0xFF,0x08,0x00,0x01,0x4C,0x4E,0x4B,0x42,  /* 00000748    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x08,  /* 00000750    "........" */
+    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000758    "...LNKC." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 00000760    "........" */
+    0x0A,0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000768    "..LNKD.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x09,0x00,0x00,  /* 00000770    "........" */
+    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 00000778    "LNKB...." */
+    0x0C,0xFF,0xFF,0x09,0x00,0x01,0x4C,0x4E,  /* 00000780    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000788    "KC......" */
+    0xFF,0x09,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000790    ".....LNK" */
+    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000798    "D......." */
+    0x09,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,  /* 000007A0    "....LNKA" */
     0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0A,  /* 000007A8    "........" */
-    0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 000007B0    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,  /* 000007B8    "........" */
-    0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000007C0    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,0x03,  /* 000007C8    "........" */
-    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 000007D0    "LNKB...." */
-    0x0C,0xFF,0xFF,0x0B,0x00,0x00,0x4C,0x4E,  /* 000007D8    "......LN" */
-    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000007E0    "KD......" */
-    0xFF,0x0B,0x00,0x01,0x4C,0x4E,0x4B,0x41,  /* 000007E8    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0B,  /* 000007F0    "........" */
-    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,0x00,  /* 000007F8    "...LNKB." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0B,0x00,  /* 00000800    "........" */
-    0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000808    "..LNKC.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x00,  /* 00000810    "........" */
-    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 00000818    "LNKA...." */
-    0x0C,0xFF,0xFF,0x0C,0x00,0x01,0x4C,0x4E,  /* 00000820    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000828    "KB......" */
-    0xFF,0x0C,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000830    ".....LNK" */
-    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000838    "C......." */
-    0x0C,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x44,  /* 00000840    "....LNKD" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0D,  /* 00000848    "........" */
-    0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000850    "..LNKB.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x01,  /* 00000858    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 00000860    "LNKC...." */
-    0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x02,0x4C,  /* 00000868    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 00000870    "NKD....." */
-    0xFF,0xFF,0x0D,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000878    "......LN" */
-    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000880    "KA......" */
-    0xFF,0x0E,0x00,0x00,0x4C,0x4E,0x4B,0x43,  /* 00000888    "....LNKC" */
+    0x00,0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 000007B0    "..LNKC.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x01,  /* 000007B8    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 000007C0    "LNKD...." */
+    0x0C,0xFF,0xFF,0x0A,0x00,0x0A,0x02,0x4C,  /* 000007C8    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 000007D0    "NKA....." */
+    0xFF,0xFF,0x0A,0x00,0x0A,0x03,0x4C,0x4E,  /* 000007D8    "......LN" */
+    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000007E0    "KB......" */
+    0xFF,0x0B,0x00,0x00,0x4C,0x4E,0x4B,0x44,  /* 000007E8    "....LNKD" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0B,  /* 000007F0    "........" */
+    0x00,0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 000007F8    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,  /* 00000800    "........" */
+    0x02,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 00000808    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x03,  /* 00000810    "........" */
+    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000818    "LNKC...." */
+    0x0C,0xFF,0xFF,0x0C,0x00,0x00,0x4C,0x4E,  /* 00000820    "......LN" */
+    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000828    "KA......" */
+    0xFF,0x0C,0x00,0x01,0x4C,0x4E,0x4B,0x42,  /* 00000830    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0C,  /* 00000838    "........" */
+    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000840    "...LNKC." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 00000848    "........" */
+    0x0A,0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000850    "..LNKD.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x00,  /* 00000858    "........" */
+    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 00000860    "LNKB...." */
+    0x0C,0xFF,0xFF,0x0D,0x00,0x01,0x4C,0x4E,  /* 00000868    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000870    "KC......" */
+    0xFF,0x0D,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000878    ".....LNK" */
+    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000880    "D......." */
+    0x0D,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,  /* 00000888    "....LNKA" */
     0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0E,  /* 00000890    "........" */
-    0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000898    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,  /* 000008A0    "........" */
-    0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000008A8    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,0x03,  /* 000008B0    "........" */
-    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 000008B8    "LNKB...." */
-    0x0C,0xFF,0xFF,0x0F,0x00,0x00,0x4C,0x4E,  /* 000008C0    "......LN" */
-    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000008C8    "KD......" */
-    0xFF,0x0F,0x00,0x01,0x4C,0x4E,0x4B,0x41,  /* 000008D0    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0F,  /* 000008D8    "........" */
-    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,0x00,  /* 000008E0    "...LNKB." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0F,0x00,  /* 000008E8    "........" */
-    0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,0x08,  /* 000008F0    "..LNKC.." */
-    0x50,0x52,0x54,0x41,0x12,0x41,0x2F,0x3C,  /* 000008F8    "PRTA.A/<" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 00000900    "........" */
-    0x00,0x00,0x0A,0x14,0x12,0x0B,0x04,0x0C,  /* 00000908    "........" */
-    0xFF,0xFF,0x01,0x00,0x01,0x00,0x0A,0x15,  /* 00000910    "........" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 00000918    "........" */
-    0x0A,0x02,0x00,0x0A,0x16,0x12,0x0C,0x04,  /* 00000920    "........" */
-    0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x03,0x00,  /* 00000928    "........" */
-    0x0A,0x17,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000930    "........" */
-    0x02,0x00,0x00,0x00,0x0A,0x18,0x12,0x0B,  /* 00000938    "........" */
-    0x04,0x0C,0xFF,0xFF,0x02,0x00,0x01,0x00,  /* 00000940    "........" */
-    0x0A,0x19,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000948    "........" */
-    0x02,0x00,0x0A,0x02,0x00,0x0A,0x1A,0x12,  /* 00000950    "........" */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,  /* 00000958    "........" */
-    0x03,0x00,0x0A,0x1B,0x12,0x0B,0x04,0x0C,  /* 00000960    "........" */
-    0xFF,0xFF,0x03,0x00,0x00,0x00,0x0A,0x1C,  /* 00000968    "........" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x03,0x00,  /* 00000970    "........" */
-    0x01,0x00,0x0A,0x1D,0x12,0x0C,0x04,0x0C,  /* 00000978    "........" */
-    0xFF,0xFF,0x03,0x00,0x0A,0x02,0x00,0x0A,  /* 00000980    "........" */
-    0x1E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000988    "........" */
-    0x00,0x0A,0x03,0x00,0x0A,0x1F,0x12,0x0B,  /* 00000990    "........" */
-    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x00,0x00,  /* 00000998    "........" */
-    0x0A,0x20,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000009A0    ". ......" */
-    0x04,0x00,0x01,0x00,0x0A,0x21,0x12,0x0C,  /* 000009A8    ".....!.." */
-    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,0x02,  /* 000009B0    "........" */
-    0x00,0x0A,0x22,0x12,0x0C,0x04,0x0C,0xFF,  /* 000009B8    ".."....." */
-    0xFF,0x04,0x00,0x0A,0x03,0x00,0x0A,0x23,  /* 000009C0    ".......#" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 000009C8    "........" */
-    0x00,0x00,0x0A,0x24,0x12,0x0B,0x04,0x0C,  /* 000009D0    "...$...." */
-    0xFF,0xFF,0x05,0x00,0x01,0x00,0x0A,0x25,  /* 000009D8    ".......%" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 000009E0    "........" */
-    0x0A,0x02,0x00,0x0A,0x26,0x12,0x0C,0x04,  /* 000009E8    "....&..." */
-    0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x03,0x00,  /* 000009F0    "........" */
-    0x0A,0x27,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000009F8    ".'......" */
-    0x06,0x00,0x00,0x00,0x0A,0x28,0x12,0x0B,  /* 00000A00    ".....(.." */
-    0x04,0x0C,0xFF,0xFF,0x06,0x00,0x01,0x00,  /* 00000A08    "........" */
-    0x0A,0x29,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000A10    ".)......" */
-    0x06,0x00,0x0A,0x02,0x00,0x0A,0x2A,0x12,  /* 00000A18    "......*." */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,  /* 00000A20    "........" */
-    0x03,0x00,0x0A,0x2B,0x12,0x0B,0x04,0x0C,  /* 00000A28    "...+...." */
-    0xFF,0xFF,0x07,0x00,0x00,0x00,0x0A,0x2C,  /* 00000A30    ".......," */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x07,0x00,  /* 00000A38    "........" */
-    0x01,0x00,0x0A,0x2D,0x12,0x0C,0x04,0x0C,  /* 00000A40    "...-...." */
-    0xFF,0xFF,0x07,0x00,0x0A,0x02,0x00,0x0A,  /* 00000A48    "........" */
-    0x2E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x07,  /* 00000A50    "........" */
-    0x00,0x0A,0x03,0x00,0x0A,0x2F,0x12,0x0B,  /* 00000A58    "...../.." */
-    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x00,0x00,  /* 00000A60    "........" */
-    0x0A,0x11,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000A68    "........" */
-    0x08,0x00,0x01,0x00,0x0A,0x12,0x12,0x0C,  /* 00000A70    "........" */
-    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,0x02,  /* 00000A78    "........" */
-    0x00,0x0A,0x13,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000A80    "........" */
-    0xFF,0x08,0x00,0x0A,0x03,0x00,0x0A,0x14,  /* 00000A88    "........" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 00000A90    "........" */
-    0x00,0x00,0x0A,0x15,0x12,0x0B,0x04,0x0C,  /* 00000A98    "........" */
-    0xFF,0xFF,0x09,0x00,0x01,0x00,0x0A,0x16,  /* 00000AA0    "........" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 00000AA8    "........" */
-    0x0A,0x02,0x00,0x0A,0x17,0x12,0x0C,0x04,  /* 00000AB0    "........" */
-    0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x03,0x00,  /* 00000AB8    "........" */
-    0x0A,0x18,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000AC0    "........" */
-    0x0A,0x00,0x00,0x00,0x0A,0x19,0x12,0x0B,  /* 00000AC8    "........" */
-    0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x01,0x00,  /* 00000AD0    "........" */
-    0x0A,0x1A,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000AD8    "........" */
-    0x0A,0x00,0x0A,0x02,0x00,0x0A,0x1B,0x12,  /* 00000AE0    "........" */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,  /* 00000AE8    "........" */
-    0x03,0x00,0x0A,0x1C,0x12,0x0B,0x04,0x0C,  /* 00000AF0    "........" */
-    0xFF,0xFF,0x0B,0x00,0x00,0x00,0x0A,0x1D,  /* 00000AF8    "........" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0B,0x00,  /* 00000B00    "........" */
-    0x01,0x00,0x0A,0x1E,0x12,0x0C,0x04,0x0C,  /* 00000B08    "........" */
-    0xFF,0xFF,0x0B,0x00,0x0A,0x02,0x00,0x0A,  /* 00000B10    "........" */
-    0x1F,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0B,  /* 00000B18    "........" */
-    0x00,0x0A,0x03,0x00,0x0A,0x20,0x12,0x0B,  /* 00000B20    "..... .." */
-    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x00,0x00,  /* 00000B28    "........" */
-    0x0A,0x21,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000B30    ".!......" */
-    0x0C,0x00,0x01,0x00,0x0A,0x22,0x12,0x0C,  /* 00000B38    ".....".." */
-    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,0x02,  /* 00000B40    "........" */
-    0x00,0x0A,0x23,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000B48    "..#....." */
-    0xFF,0x0C,0x00,0x0A,0x03,0x00,0x0A,0x24,  /* 00000B50    ".......$" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 00000B58    "........" */
-    0x00,0x00,0x0A,0x25,0x12,0x0B,0x04,0x0C,  /* 00000B60    "...%...." */
-    0xFF,0xFF,0x0D,0x00,0x01,0x00,0x0A,0x26,  /* 00000B68    ".......&" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 00000B70    "........" */
-    0x0A,0x02,0x00,0x0A,0x27,0x12,0x0C,0x04,  /* 00000B78    "....'..." */
-    0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x03,0x00,  /* 00000B80    "........" */
-    0x0A,0x28,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000B88    ".(......" */
-    0x0E,0x00,0x00,0x00,0x0A,0x29,0x12,0x0B,  /* 00000B90    ".....).." */
-    0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x01,0x00,  /* 00000B98    "........" */
-    0x0A,0x2A,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000BA0    ".*......" */
-    0x0E,0x00,0x0A,0x02,0x00,0x0A,0x2B,0x12,  /* 00000BA8    "......+." */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,  /* 00000BB0    "........" */
-    0x03,0x00,0x0A,0x2C,0x12,0x0B,0x04,0x0C,  /* 00000BB8    "...,...." */
-    0xFF,0xFF,0x0F,0x00,0x00,0x00,0x0A,0x2D,  /* 00000BC0    ".......-" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0F,0x00,  /* 00000BC8    "........" */
-    0x01,0x00,0x0A,0x2E,0x12,0x0C,0x04,0x0C,  /* 00000BD0    "........" */
-    0xFF,0xFF,0x0F,0x00,0x0A,0x02,0x00,0x0A,  /* 00000BD8    "........" */
-    0x2F,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0F,  /* 00000BE0    "/......." */
-    0x00,0x0A,0x03,0x00,0x0A,0x10,0x5B,0x82,  /* 00000BE8    "......[." */
-    0x46,0x37,0x49,0x53,0x41,0x5F,0x08,0x5F,  /* 00000BF0    "F7ISA_._" */
-    0x41,0x44,0x52,0x0C,0x00,0x00,0x01,0x00,  /* 00000BF8    "ADR....." */
-    0x5B,0x80,0x50,0x49,0x52,0x51,0x02,0x0A,  /* 00000C00    "[.PIRQ.." */
-    0x60,0x0A,0x04,0x10,0x2E,0x5C,0x00,0x5B,  /* 00000C08    "`....\.[" */
-    0x81,0x29,0x5C,0x2F,0x04,0x5F,0x53,0x42,  /* 00000C10    ".)\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x49,0x53,0x41,  /* 00000C18    "_PCI0ISA" */
-    0x5F,0x50,0x49,0x52,0x51,0x01,0x50,0x49,  /* 00000C20    "_PIRQ.PI" */
-    0x52,0x41,0x08,0x50,0x49,0x52,0x42,0x08,  /* 00000C28    "RA.PIRB." */
-    0x50,0x49,0x52,0x43,0x08,0x50,0x49,0x52,  /* 00000C30    "PIRC.PIR" */
-    0x44,0x08,0x5B,0x82,0x46,0x0B,0x53,0x59,  /* 00000C38    "D.[.F.SY" */
-    0x53,0x52,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000C40    "SR._HID." */
-    0x41,0xD0,0x0C,0x02,0x08,0x5F,0x55,0x49,  /* 00000C48    "A...._UI" */
-    0x44,0x01,0x08,0x43,0x52,0x53,0x5F,0x11,  /* 00000C50    "D..CRS_." */
-    0x4E,0x08,0x0A,0x8A,0x47,0x01,0x10,0x00,  /* 00000C58    "N...G..." */
-    0x10,0x00,0x00,0x10,0x47,0x01,0x22,0x00,  /* 00000C60    "....G."." */
-    0x22,0x00,0x00,0x0C,0x47,0x01,0x30,0x00,  /* 00000C68    ""...G.0." */
-    0x30,0x00,0x00,0x10,0x47,0x01,0x44,0x00,  /* 00000C70    "0...G.D." */
-    0x44,0x00,0x00,0x1C,0x47,0x01,0x62,0x00,  /* 00000C78    "D...G.b." */
-    0x62,0x00,0x00,0x02,0x47,0x01,0x65,0x00,  /* 00000C80    "b...G.e." */
-    0x65,0x00,0x00,0x0B,0x47,0x01,0x72,0x00,  /* 00000C88    "e...G.r." */
-    0x72,0x00,0x00,0x0E,0x47,0x01,0x80,0x00,  /* 00000C90    "r...G..." */
-    0x80,0x00,0x00,0x01,0x47,0x01,0x84,0x00,  /* 00000C98    "....G..." */
-    0x84,0x00,0x00,0x03,0x47,0x01,0x88,0x00,  /* 00000CA0    "....G..." */
-    0x88,0x00,0x00,0x01,0x47,0x01,0x8C,0x00,  /* 00000CA8    "....G..." */
-    0x8C,0x00,0x00,0x03,0x47,0x01,0x90,0x00,  /* 00000CB0    "....G..." */
-    0x90,0x00,0x00,0x10,0x47,0x01,0xA2,0x00,  /* 00000CB8    "....G..." */
-    0xA2,0x00,0x00,0x1C,0x47,0x01,0xE0,0x00,  /* 00000CC0    "....G..." */
-    0xE0,0x00,0x00,0x10,0x47,0x01,0xA0,0x08,  /* 00000CC8    "....G..." */
-    0xA0,0x08,0x00,0x04,0x47,0x01,0xC0,0x0C,  /* 00000CD0    "....G..." */
-    0xC0,0x0C,0x00,0x10,0x47,0x01,0xD0,0x04,  /* 00000CD8    "....G..." */
-    0xD0,0x04,0x00,0x02,0x79,0x00,0x14,0x0B,  /* 00000CE0    "....y..." */
-    0x5F,0x43,0x52,0x53,0x00,0xA4,0x43,0x52,  /* 00000CE8    "_CRS..CR" */
-    0x53,0x5F,0x5B,0x82,0x2B,0x50,0x49,0x43,  /* 00000CF0    "S_[.+PIC" */
-    0x5F,0x08,0x5F,0x48,0x49,0x44,0x0B,0x41,  /* 00000CF8    "_._HID.A" */
-    0xD0,0x08,0x5F,0x43,0x52,0x53,0x11,0x18,  /* 00000D00    ".._CRS.." */
-    0x0A,0x15,0x47,0x01,0x20,0x00,0x20,0x00,  /* 00000D08    "..G. . ." */
-    0x01,0x02,0x47,0x01,0xA0,0x00,0xA0,0x00,  /* 00000D10    "..G....." */
-    0x01,0x02,0x22,0x04,0x00,0x79,0x00,0x5B,  /* 00000D18    ".."..y.[" */
-    0x82,0x47,0x05,0x44,0x4D,0x41,0x30,0x08,  /* 00000D20    ".G.DMA0." */
-    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x02,  /* 00000D28    "_HID.A.." */
-    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x41,  /* 00000D30    ".._CRS.A" */
-    0x04,0x0A,0x3D,0x2A,0x10,0x04,0x47,0x01,  /* 00000D38    "..=*..G." */
-    0x00,0x00,0x00,0x00,0x00,0x10,0x47,0x01,  /* 00000D40    "......G." */
-    0x81,0x00,0x81,0x00,0x00,0x03,0x47,0x01,  /* 00000D48    "......G." */
-    0x87,0x00,0x87,0x00,0x00,0x01,0x47,0x01,  /* 00000D50    "......G." */
-    0x89,0x00,0x89,0x00,0x00,0x03,0x47,0x01,  /* 00000D58    "......G." */
-    0x8F,0x00,0x8F,0x00,0x00,0x01,0x47,0x01,  /* 00000D60    "......G." */
-    0xC0,0x00,0xC0,0x00,0x00,0x20,0x47,0x01,  /* 00000D68    "..... G." */
-    0x80,0x04,0x80,0x04,0x00,0x10,0x79,0x00,  /* 00000D70    "......y." */
-    0x5B,0x82,0x25,0x54,0x4D,0x52,0x5F,0x08,  /* 00000D78    "[.%TMR_." */
-    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x01,  /* 00000D80    "_HID.A.." */
-    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x10,  /* 00000D88    ".._CRS.." */
-    0x0A,0x0D,0x47,0x01,0x40,0x00,0x40,0x00,  /* 00000D90    "..G.@.@." */
-    0x00,0x04,0x22,0x01,0x00,0x79,0x00,0x5B,  /* 00000D98    ".."..y.[" */
-    0x82,0x25,0x52,0x54,0x43,0x5F,0x08,0x5F,  /* 00000DA0    ".%RTC_._" */
-    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0B,0x00,  /* 00000DA8    "HID.A..." */
-    0x08,0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,  /* 00000DB0    "._CRS..." */
-    0x0D,0x47,0x01,0x70,0x00,0x70,0x00,0x00,  /* 00000DB8    ".G.p.p.." */
-    0x02,0x22,0x00,0x01,0x79,0x00,0x5B,0x82,  /* 00000DC0    "."..y.[." */
-    0x22,0x53,0x50,0x4B,0x52,0x08,0x5F,0x48,  /* 00000DC8    ""SPKR._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x08,0x00,0x08,  /* 00000DD0    "ID.A...." */
-    0x5F,0x43,0x52,0x53,0x11,0x0D,0x0A,0x0A,  /* 00000DD8    "_CRS...." */
-    0x47,0x01,0x61,0x00,0x61,0x00,0x00,0x01,  /* 00000DE0    "G.a.a..." */
-    0x79,0x00,0x5B,0x82,0x31,0x50,0x53,0x32,  /* 00000DE8    "y.[.1PS2" */
-    0x4D,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000DF0    "M._HID.A" */
-    0xD0,0x0F,0x13,0x08,0x5F,0x43,0x49,0x44,  /* 00000DF8    "...._CID" */
-    0x0C,0x41,0xD0,0x0F,0x13,0x14,0x09,0x5F,  /* 00000E00    ".A....._" */
-    0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,  /* 00000E08    "STA....." */
-    0x5F,0x43,0x52,0x53,0x11,0x08,0x0A,0x05,  /* 00000E10    "_CRS...." */
-    0x22,0x00,0x10,0x79,0x00,0x5B,0x82,0x42,  /* 00000E18    ""..y.[.B" */
-    0x04,0x50,0x53,0x32,0x4B,0x08,0x5F,0x48,  /* 00000E20    ".PS2K._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x03,0x03,0x08,  /* 00000E28    "ID.A...." */
-    0x5F,0x43,0x49,0x44,0x0C,0x41,0xD0,0x03,  /* 00000E30    "_CID.A.." */
-    0x0B,0x14,0x09,0x5F,0x53,0x54,0x41,0x00,  /* 00000E38    "..._STA." */
-    0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,  /* 00000E40    "...._CRS" */
-    0x11,0x18,0x0A,0x15,0x47,0x01,0x60,0x00,  /* 00000E48    "....G.`." */
-    0x60,0x00,0x00,0x01,0x47,0x01,0x64,0x00,  /* 00000E50    "`...G.d." */
-    0x64,0x00,0x00,0x01,0x22,0x02,0x00,0x79,  /* 00000E58    "d..."..y" */
-    0x00,0x5B,0x82,0x3A,0x46,0x44,0x43,0x30,  /* 00000E60    ".[.:FDC0" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000E68    "._HID.A." */
-    0x07,0x00,0x14,0x09,0x5F,0x53,0x54,0x41,  /* 00000E70    "...._STA" */
-    0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,  /* 00000E78    "....._CR" */
-    0x53,0x11,0x1B,0x0A,0x18,0x47,0x01,0xF0,  /* 00000E80    "S....G.." */
-    0x03,0xF0,0x03,0x01,0x06,0x47,0x01,0xF7,  /* 00000E88    ".....G.." */
-    0x03,0xF7,0x03,0x01,0x01,0x22,0x40,0x00,  /* 00000E90    "....."@." */
-    0x2A,0x04,0x00,0x79,0x00,0x5B,0x82,0x46,  /* 00000E98    "*..y.[.F" */
-    0x04,0x55,0x41,0x52,0x31,0x08,0x5F,0x48,  /* 00000EA0    ".UAR1._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x05,0x01,0x08,  /* 00000EA8    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x01,0x14,0x19,0x5F,  /* 00000EB0    "_UID..._" */
-    0x53,0x54,0x41,0x00,0xA0,0x0D,0x93,0x5E,  /* 00000EB8    "STA....^" */
-    0x5E,0x5E,0x5E,0x55,0x41,0x52,0x31,0x00,  /* 00000EC0    "^^^UAR1." */
-    0xA4,0x00,0xA1,0x04,0xA4,0x0A,0x0F,0x08,  /* 00000EC8    "........" */
-    0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,  /* 00000ED0    "_CRS...." */
-    0x47,0x01,0xF8,0x03,0xF8,0x03,0x08,0x08,  /* 00000ED8    "G......." */
-    0x22,0x10,0x00,0x79,0x00,0x5B,0x82,0x47,  /* 00000EE0    ""..y.[.G" */
-    0x04,0x55,0x41,0x52,0x32,0x08,0x5F,0x48,  /* 00000EE8    ".UAR2._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x05,0x01,0x08,  /* 00000EF0    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x0A,0x02,0x14,0x19,  /* 00000EF8    "_UID...." */
-    0x5F,0x53,0x54,0x41,0x00,0xA0,0x0D,0x93,  /* 00000F00    "_STA...." */
-    0x5E,0x5E,0x5E,0x5E,0x55,0x41,0x52,0x32,  /* 00000F08    "^^^^UAR2" */
-    0x00,0xA4,0x00,0xA1,0x04,0xA4,0x0A,0x0F,  /* 00000F10    "........" */
-    0x08,0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,  /* 00000F18    "._CRS..." */
-    0x0D,0x47,0x01,0xF8,0x02,0xF8,0x02,0x08,  /* 00000F20    ".G......" */
-    0x08,0x22,0x08,0x00,0x79,0x00,0x5B,0x82,  /* 00000F28    "."..y.[." */
-    0x36,0x4C,0x54,0x50,0x31,0x08,0x5F,0x48,  /* 00000F30    "6LTP1._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x04,0x00,0x08,  /* 00000F38    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x0A,0x02,0x14,0x09,  /* 00000F40    "_UID...." */
-    0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,  /* 00000F48    "_STA...." */
-    0x08,0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,  /* 00000F50    "._CRS..." */
-    0x0D,0x47,0x01,0x78,0x03,0x78,0x03,0x08,  /* 00000F58    ".G.x.x.." */
-    0x08,0x22,0x80,0x00,0x79,0x00,0x5B,0x82,  /* 00000F60    "."..y.[." */
-    0x4D,0x07,0x53,0x31,0x46,0x30,0x08,0x5F,  /* 00000F68    "M.S1F0._" */
-    0x41,0x44,0x52,0x0C,0x00,0x00,0x06,0x00,  /* 00000F70    "ADR....." */
-    0x08,0x5F,0x53,0x55,0x4E,0x01,0x14,0x13,  /* 00000F78    "._SUN..." */
-    0x5F,0x50,0x53,0x30,0x00,0x70,0x0A,0x80,  /* 00000F80    "_PS0.p.." */
-    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00000F88    "\._GPEDP" */
-    0x54,0x32,0x14,0x13,0x5F,0x50,0x53,0x33,  /* 00000F90    "T2.._PS3" */
-    0x00,0x70,0x0A,0x83,0x5C,0x2E,0x5F,0x47,  /* 00000F98    ".p..\._G" */
-    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x1F,  /* 00000FA0    "PEDPT2.." */
-    0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,0x88,  /* 00000FA8    "_EJ0.p.." */
-    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00000FB0    "\._GPEDP" */
-    0x54,0x32,0x70,0x01,0x5C,0x2E,0x5F,0x47,  /* 00000FB8    "T2p.\._G" */
-    0x50,0x45,0x50,0x48,0x50,0x31,0x14,0x1E,  /* 00000FC0    "PEPHP1.." */
-    0x5F,0x53,0x54,0x41,0x00,0x70,0x0A,0x89,  /* 00000FC8    "_STA.p.." */
-    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00000FD0    "\._GPEDP" */
-    0x54,0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,  /* 00000FD8    "T2.\._GP" */
-    0x45,0x50,0x48,0x50,0x31,0x5B,0x82,0x4E,  /* 00000FE0    "EPHP1[.N" */
-    0x07,0x53,0x32,0x46,0x30,0x08,0x5F,0x41,  /* 00000FE8    ".S2F0._A" */
-    0x44,0x52,0x0C,0x00,0x00,0x07,0x00,0x08,  /* 00000FF0    "DR......" */
-    0x5F,0x53,0x55,0x4E,0x0A,0x02,0x14,0x13,  /* 00000FF8    "_SUN...." */
-    0x5F,0x50,0x53,0x30,0x00,0x70,0x0A,0x90,  /* 00001000    "_PS0.p.." */
-    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001008    "\._GPEDP" */
-    0x54,0x32,0x14,0x13,0x5F,0x50,0x53,0x33,  /* 00001010    "T2.._PS3" */
-    0x00,0x70,0x0A,0x93,0x5C,0x2E,0x5F,0x47,  /* 00001018    ".p..\._G" */
-    0x50,0x45,0x44,0x50,0x54,0x32,0x14,0x1F,  /* 00001020    "PEDPT2.." */
-    0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,0x98,  /* 00001028    "_EJ0.p.." */
-    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001030    "\._GPEDP" */
-    0x54,0x32,0x70,0x01,0x5C,0x2E,0x5F,0x47,  /* 00001038    "T2p.\._G" */
-    0x50,0x45,0x50,0x48,0x50,0x32,0x14,0x1E,  /* 00001040    "PEPHP2.." */
-    0x5F,0x53,0x54,0x41,0x00,0x70,0x0A,0x99,  /* 00001048    "_STA.p.." */
-    0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,0x50,  /* 00001050    "\._GPEDP" */
-    0x54,0x32,0xA4,0x5C,0x2E,0x5F,0x47,0x50,  /* 00001058    "T2.\._GP" */
-    0x45,0x50,0x48,0x50,0x32,0x10,0x4E,0x0B,  /* 00001060    "EPHP2.N." */
-    0x5F,0x47,0x50,0x45,0x5B,0x80,0x50,0x48,  /* 00001068    "_GPE[.PH" */
-    0x50,0x5F,0x01,0x0B,0xC0,0x10,0x0A,0x03,  /* 00001070    "P_......" */
-    0x5B,0x81,0x15,0x50,0x48,0x50,0x5F,0x01,  /* 00001078    "[..PHP_." */
-    0x50,0x53,0x54,0x41,0x08,0x50,0x48,0x50,  /* 00001080    "PSTA.PHP" */
-    0x31,0x08,0x50,0x48,0x50,0x32,0x08,0x5B,  /* 00001088    "1.PHP2.[" */
-    0x80,0x44,0x47,0x31,0x5F,0x01,0x0B,0x44,  /* 00001090    ".DG1_..D" */
-    0xB0,0x0A,0x04,0x5B,0x81,0x10,0x44,0x47,  /* 00001098    "...[..DG" */
-    0x31,0x5F,0x01,0x44,0x50,0x54,0x31,0x08,  /* 000010A0    "1_.DPT1." */
-    0x44,0x50,0x54,0x32,0x08,0x14,0x46,0x07,  /* 000010A8    "DPT2..F." */
-    0x5F,0x4C,0x30,0x33,0x00,0x08,0x53,0x4C,  /* 000010B0    "_L03..SL" */
-    0x54,0x5F,0x00,0x08,0x45,0x56,0x54,0x5F,  /* 000010B8    "T_..EVT_" */
-    0x00,0x70,0x50,0x53,0x54,0x41,0x61,0x7A,  /* 000010C0    ".pPSTAaz" */
-    0x61,0x0A,0x04,0x53,0x4C,0x54,0x5F,0x7B,  /* 000010C8    "a..SLT_{" */
-    0x61,0x0A,0x0F,0x45,0x56,0x54,0x5F,0x70,  /* 000010D0    "a..EVT_p" */
-    0x53,0x4C,0x54,0x5F,0x44,0x50,0x54,0x31,  /* 000010D8    "SLT_DPT1" */
-    0x70,0x45,0x56,0x54,0x5F,0x44,0x50,0x54,  /* 000010E0    "pEVT_DPT" */
-    0x32,0xA0,0x1B,0x93,0x53,0x4C,0x54,0x5F,  /* 000010E8    "2...SLT_" */
-    0x01,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000010F0    "..\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x46,  /* 000010F8    "_PCI0S1F" */
-    0x30,0x45,0x56,0x54,0x5F,0xA1,0x1E,0xA0,  /* 00001100    "0EVT_..." */
-    0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,0x02,  /* 00001108    "..SLT_.." */
-    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001110    ".\/._SB_" */
-    0x50,0x43,0x49,0x30,0x53,0x32,0x46,0x30,  /* 00001118    "PCI0S2F0" */
-    0x45,0x56,0x54,0x5F,
+    0x00,0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000898    "..LNKC.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x01,  /* 000008A0    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 000008A8    "LNKD...." */
+    0x0C,0xFF,0xFF,0x0E,0x00,0x0A,0x02,0x4C,  /* 000008B0    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 000008B8    "NKA....." */
+    0xFF,0xFF,0x0E,0x00,0x0A,0x03,0x4C,0x4E,  /* 000008C0    "......LN" */
+    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000008C8    "KB......" */
+    0xFF,0x0F,0x00,0x00,0x4C,0x4E,0x4B,0x44,  /* 000008D0    "....LNKD" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0F,  /* 000008D8    "........" */
+    0x00,0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 000008E0    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,  /* 000008E8    "........" */
+    0x02,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 000008F0    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x03,  /* 000008F8    "........" */
+    0x4C,0x4E,0x4B,0x43,0x00,0x08,0x50,0x52,  /* 00000900    "LNKC..PR" */
+    0x54,0x41,0x12,0x41,0x2F,0x3C,0x12,0x0B,  /* 00000908    "TA.A/<.." */
+    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x00,0x00,  /* 00000910    "........" */
+    0x0A,0x14,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000918    "........" */
+    0x01,0x00,0x01,0x00,0x0A,0x15,0x12,0x0C,  /* 00000920    "........" */
+    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x02,  /* 00000928    "........" */
+    0x00,0x0A,0x16,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000930    "........" */
+    0xFF,0x01,0x00,0x0A,0x03,0x00,0x0A,0x17,  /* 00000938    "........" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 00000940    "........" */
+    0x00,0x00,0x0A,0x18,0x12,0x0B,0x04,0x0C,  /* 00000948    "........" */
+    0xFF,0xFF,0x02,0x00,0x01,0x00,0x0A,0x19,  /* 00000950    "........" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 00000958    "........" */
+    0x0A,0x02,0x00,0x0A,0x1A,0x12,0x0C,0x04,  /* 00000960    "........" */
+    0x0C,0xFF,0xFF,0x02,0x00,0x0A,0x03,0x00,  /* 00000968    "........" */
+    0x0A,0x1B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000970    "........" */
+    0x03,0x00,0x00,0x00,0x0A,0x1C,0x12,0x0B,  /* 00000978    "........" */
+    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x01,0x00,  /* 00000980    "........" */
+    0x0A,0x1D,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000988    "........" */
+    0x03,0x00,0x0A,0x02,0x00,0x0A,0x1E,0x12,  /* 00000990    "........" */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,  /* 00000998    "........" */
+    0x03,0x00,0x0A,0x1F,0x12,0x0B,0x04,0x0C,  /* 000009A0    "........" */
+    0xFF,0xFF,0x04,0x00,0x00,0x00,0x0A,0x20,  /* 000009A8    "....... " */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 000009B0    "........" */
+    0x01,0x00,0x0A,0x21,0x12,0x0C,0x04,0x0C,  /* 000009B8    "...!...." */
+    0xFF,0xFF,0x04,0x00,0x0A,0x02,0x00,0x0A,  /* 000009C0    "........" */
+    0x22,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x04,  /* 000009C8    ""......." */
+    0x00,0x0A,0x03,0x00,0x0A,0x23,0x12,0x0B,  /* 000009D0    ".....#.." */
+    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x00,0x00,  /* 000009D8    "........" */
+    0x0A,0x24,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000009E0    ".$......" */
+    0x05,0x00,0x01,0x00,0x0A,0x25,0x12,0x0C,  /* 000009E8    ".....%.." */
+    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x02,  /* 000009F0    "........" */
+    0x00,0x0A,0x26,0x12,0x0C,0x04,0x0C,0xFF,  /* 000009F8    "..&....." */
+    0xFF,0x05,0x00,0x0A,0x03,0x00,0x0A,0x27,  /* 00000A00    ".......'" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 00000A08    "........" */
+    0x00,0x00,0x0A,0x28,0x12,0x0B,0x04,0x0C,  /* 00000A10    "...(...." */
+    0xFF,0xFF,0x06,0x00,0x01,0x00,0x0A,0x29,  /* 00000A18    ".......)" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 00000A20    "........" */
+    0x0A,0x02,0x00,0x0A,0x2A,0x12,0x0C,0x04,  /* 00000A28    "....*..." */
+    0x0C,0xFF,0xFF,0x06,0x00,0x0A,0x03,0x00,  /* 00000A30    "........" */
+    0x0A,0x2B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000A38    ".+......" */
+    0x07,0x00,0x00,0x00,0x0A,0x2C,0x12,0x0B,  /* 00000A40    ".....,.." */
+    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x01,0x00,  /* 00000A48    "........" */
+    0x0A,0x2D,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000A50    ".-......" */
+    0x07,0x00,0x0A,0x02,0x00,0x0A,0x2E,0x12,  /* 00000A58    "........" */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,  /* 00000A60    "........" */
+    0x03,0x00,0x0A,0x2F,0x12,0x0B,0x04,0x0C,  /* 00000A68    ".../...." */
+    0xFF,0xFF,0x08,0x00,0x00,0x00,0x0A,0x11,  /* 00000A70    "........" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 00000A78    "........" */
+    0x01,0x00,0x0A,0x12,0x12,0x0C,0x04,0x0C,  /* 00000A80    "........" */
+    0xFF,0xFF,0x08,0x00,0x0A,0x02,0x00,0x0A,  /* 00000A88    "........" */
+    0x13,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x08,  /* 00000A90    "........" */
+    0x00,0x0A,0x03,0x00,0x0A,0x14,0x12,0x0B,  /* 00000A98    "........" */
+    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x00,0x00,  /* 00000AA0    "........" */
+    0x0A,0x15,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000AA8    "........" */
+    0x09,0x00,0x01,0x00,0x0A,0x16,0x12,0x0C,  /* 00000AB0    "........" */
+    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x02,  /* 00000AB8    "........" */
+    0x00,0x0A,0x17,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000AC0    "........" */
+    0xFF,0x09,0x00,0x0A,0x03,0x00,0x0A,0x18,  /* 00000AC8    "........" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000AD0    "........" */
+    0x00,0x00,0x0A,0x19,0x12,0x0B,0x04,0x0C,  /* 00000AD8    "........" */
+    0xFF,0xFF,0x0A,0x00,0x01,0x00,0x0A,0x1A,  /* 00000AE0    "........" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000AE8    "........" */
+    0x0A,0x02,0x00,0x0A,0x1B,0x12,0x0C,0x04,  /* 00000AF0    "........" */
+    0x0C,0xFF,0xFF,0x0A,0x00,0x0A,0x03,0x00,  /* 00000AF8    "........" */
+    0x0A,0x1C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000B00    "........" */
+    0x0B,0x00,0x00,0x00,0x0A,0x1D,0x12,0x0B,  /* 00000B08    "........" */
+    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x01,0x00,  /* 00000B10    "........" */
+    0x0A,0x1E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000B18    "........" */
+    0x0B,0x00,0x0A,0x02,0x00,0x0A,0x1F,0x12,  /* 00000B20    "........" */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,  /* 00000B28    "........" */
+    0x03,0x00,0x0A,0x20,0x12,0x0B,0x04,0x0C,  /* 00000B30    "... ...." */
+    0xFF,0xFF,0x0C,0x00,0x00,0x00,0x0A,0x21,  /* 00000B38    ".......!" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 00000B40    "........" */
+    0x01,0x00,0x0A,0x22,0x12,0x0C,0x04,0x0C,  /* 00000B48    "..."...." */
+    0xFF,0xFF,0x0C,0x00,0x0A,0x02,0x00,0x0A,  /* 00000B50    "........" */
+    0x23,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0C,  /* 00000B58    "#......." */
+    0x00,0x0A,0x03,0x00,0x0A,0x24,0x12,0x0B,  /* 00000B60    ".....$.." */
+    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x00,0x00,  /* 00000B68    "........" */
+    0x0A,0x25,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000B70    ".%......" */
+    0x0D,0x00,0x01,0x00,0x0A,0x26,0x12,0x0C,  /* 00000B78    ".....&.." */
+    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x02,  /* 00000B80    "........" */
+    0x00,0x0A,0x27,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000B88    "..'....." */
+    0xFF,0x0D,0x00,0x0A,0x03,0x00,0x0A,0x28,  /* 00000B90    ".......(" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000B98    "........" */
+    0x00,0x00,0x0A,0x29,0x12,0x0B,0x04,0x0C,  /* 00000BA0    "...)...." */
+    0xFF,0xFF,0x0E,0x00,0x01,0x00,0x0A,0x2A,  /* 00000BA8    ".......*" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000BB0    "........" */
+    0x0A,0x02,0x00,0x0A,0x2B,0x12,0x0C,0x04,  /* 00000BB8    "....+..." */
+    0x0C,0xFF,0xFF,0x0E,0x00,0x0A,0x03,0x00,  /* 00000BC0    "........" */
+    0x0A,0x2C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000BC8    ".,......" */
+    0x0F,0x00,0x00,0x00,0x0A,0x2D,0x12,0x0B,  /* 00000BD0    ".....-.." */
+    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x01,0x00,  /* 00000BD8    "........" */
+    0x0A,0x2E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000BE0    "........" */
+    0x0F,0x00,0x0A,0x02,0x00,0x0A,0x2F,0x12,  /* 00000BE8    "....../." */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,  /* 00000BF0    "........" */
+    0x03,0x00,0x0A,0x10,0x5B,0x82,0x46,0x37,  /* 00000BF8    "....[.F7" */
+    0x49,0x53,0x41,0x5F,0x08,0x5F,0x41,0x44,  /* 00000C00    "ISA_._AD" */
+    0x52,0x0C,0x00,0x00,0x01,0x00,0x5B,0x80,  /* 00000C08    "R.....[." */
+    0x50,0x49,0x52,0x51,0x02,0x0A,0x60,0x0A,  /* 00000C10    "PIRQ..`." */
+    0x04,0x10,0x2E,0x5C,0x00,0x5B,0x81,0x29,  /* 00000C18    "...\.[.)" */
+    0x5C,0x2F,0x04,0x5F,0x53,0x42,0x5F,0x50,  /* 00000C20    "\/._SB_P" */
+    0x43,0x49,0x30,0x49,0x53,0x41,0x5F,0x50,  /* 00000C28    "CI0ISA_P" */
+    0x49,0x52,0x51,0x01,0x50,0x49,0x52,0x41,  /* 00000C30    "IRQ.PIRA" */
+    0x08,0x50,0x49,0x52,0x42,0x08,0x50,0x49,  /* 00000C38    ".PIRB.PI" */
+    0x52,0x43,0x08,0x50,0x49,0x52,0x44,0x08,  /* 00000C40    "RC.PIRD." */
+    0x5B,0x82,0x46,0x0B,0x53,0x59,0x53,0x52,  /* 00000C48    "[.F.SYSR" */
+    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000C50    "._HID.A." */
+    0x0C,0x02,0x08,0x5F,0x55,0x49,0x44,0x01,  /* 00000C58    "..._UID." */
+    0x08,0x43,0x52,0x53,0x5F,0x11,0x4E,0x08,  /* 00000C60    ".CRS_.N." */
+    0x0A,0x8A,0x47,0x01,0x10,0x00,0x10,0x00,  /* 00000C68    "..G....." */
+    0x00,0x10,0x47,0x01,0x22,0x00,0x22,0x00,  /* 00000C70    "..G."."." */
+    0x00,0x0C,0x47,0x01,0x30,0x00,0x30,0x00,  /* 00000C78    "..G.0.0." */
+    0x00,0x10,0x47,0x01,0x44,0x00,0x44,0x00,  /* 00000C80    "..G.D.D." */
+    0x00,0x1C,0x47,0x01,0x62,0x00,0x62,0x00,  /* 00000C88    "..G.b.b." */
+    0x00,0x02,0x47,0x01,0x65,0x00,0x65,0x00,  /* 00000C90    "..G.e.e." */
+    0x00,0x0B,0x47,0x01,0x72,0x00,0x72,0x00,  /* 00000C98    "..G.r.r." */
+    0x00,0x0E,0x47,0x01,0x80,0x00,0x80,0x00,  /* 00000CA0    "..G....." */
+    0x00,0x01,0x47,0x01,0x84,0x00,0x84,0x00,  /* 00000CA8    "..G....." */
+    0x00,0x03,0x47,0x01,0x88,0x00,0x88,0x00,  /* 00000CB0    "..G....." */
+    0x00,0x01,0x47,0x01,0x8C,0x00,0x8C,0x00,  /* 00000CB8    "..G....." */
+    0x00,0x03,0x47,0x01,0x90,0x00,0x90,0x00,  /* 00000CC0    "..G....." */
+    0x00,0x10,0x47,0x01,0xA2,0x00,0xA2,0x00,  /* 00000CC8    "..G....." */
+    0x00,0x1C,0x47,0x01,0xE0,0x00,0xE0,0x00,  /* 00000CD0    "..G....." */
+    0x00,0x10,0x47,0x01,0xA0,0x08,0xA0,0x08,  /* 00000CD8    "..G....." */
+    0x00,0x04,0x47,0x01,0xC0,0x0C,0xC0,0x0C,  /* 00000CE0    "..G....." */
+    0x00,0x10,0x47,0x01,0xD0,0x04,0xD0,0x04,  /* 00000CE8    "..G....." */
+    0x00,0x02,0x79,0x00,0x14,0x0B,0x5F,0x43,  /* 00000CF0    "..y..._C" */
+    0x52,0x53,0x00,0xA4,0x43,0x52,0x53,0x5F,  /* 00000CF8    "RS..CRS_" */
+    0x5B,0x82,0x2B,0x50,0x49,0x43,0x5F,0x08,  /* 00000D00    "[.+PIC_." */
+    0x5F,0x48,0x49,0x44,0x0B,0x41,0xD0,0x08,  /* 00000D08    "_HID.A.." */
+    0x5F,0x43,0x52,0x53,0x11,0x18,0x0A,0x15,  /* 00000D10    "_CRS...." */
+    0x47,0x01,0x20,0x00,0x20,0x00,0x01,0x02,  /* 00000D18    "G. . ..." */
+    0x47,0x01,0xA0,0x00,0xA0,0x00,0x01,0x02,  /* 00000D20    "G......." */
+    0x22,0x04,0x00,0x79,0x00,0x5B,0x82,0x47,  /* 00000D28    ""..y.[.G" */
+    0x05,0x44,0x4D,0x41,0x30,0x08,0x5F,0x48,  /* 00000D30    ".DMA0._H" */
+    0x49,0x44,0x0C,0x41,0xD0,0x02,0x00,0x08,  /* 00000D38    "ID.A...." */
+    0x5F,0x43,0x52,0x53,0x11,0x41,0x04,0x0A,  /* 00000D40    "_CRS.A.." */
+    0x3D,0x2A,0x10,0x04,0x47,0x01,0x00,0x00,  /* 00000D48    "=*..G..." */
+    0x00,0x00,0x00,0x10,0x47,0x01,0x81,0x00,  /* 00000D50    "....G..." */
+    0x81,0x00,0x00,0x03,0x47,0x01,0x87,0x00,  /* 00000D58    "....G..." */
+    0x87,0x00,0x00,0x01,0x47,0x01,0x89,0x00,  /* 00000D60    "....G..." */
+    0x89,0x00,0x00,0x03,0x47,0x01,0x8F,0x00,  /* 00000D68    "....G..." */
+    0x8F,0x00,0x00,0x01,0x47,0x01,0xC0,0x00,  /* 00000D70    "....G..." */
+    0xC0,0x00,0x00,0x20,0x47,0x01,0x80,0x04,  /* 00000D78    "... G..." */
+    0x80,0x04,0x00,0x10,0x79,0x00,0x5B,0x82,  /* 00000D80    "....y.[." */
+    0x25,0x54,0x4D,0x52,0x5F,0x08,0x5F,0x48,  /* 00000D88    "%TMR_._H" */
+    0x49,0x44,0x0C,0x41,0xD0,0x01,0x00,0x08,  /* 00000D90    "ID.A...." */
+    0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,  /* 00000D98    "_CRS...." */
+    0x47,0x01,0x40,0x00,0x40,0x00,0x00,0x04,  /* 00000DA0    "G.@.@..." */
+    0x22,0x01,0x00,0x79,0x00,0x5B,0x82,0x25,  /* 00000DA8    ""..y.[.%" */
+    0x52,0x54,0x43,0x5F,0x08,0x5F,0x48,0x49,  /* 00000DB0    "RTC_._HI" */
+    0x44,0x0C,0x41,0xD0,0x0B,0x00,0x08,0x5F,  /* 00000DB8    "D.A...._" */
+    0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,  /* 00000DC0    "CRS....G" */
+    0x01,0x70,0x00,0x70,0x00,0x00,0x02,0x22,  /* 00000DC8    ".p.p..."" */
+    0x00,0x01,0x79,0x00,0x5B,0x82,0x22,0x53,  /* 00000DD0    "..y.[."S" */
+    0x50,0x4B,0x52,0x08,0x5F,0x48,0x49,0x44,  /* 00000DD8    "PKR._HID" */
+    0x0C,0x41,0xD0,0x08,0x00,0x08,0x5F,0x43,  /* 00000DE0    ".A...._C" */
+    0x52,0x53,0x11,0x0D,0x0A,0x0A,0x47,0x01,  /* 00000DE8    "RS....G." */
+    0x61,0x00,0x61,0x00,0x00,0x01,0x79,0x00,  /* 00000DF0    "a.a...y." */
+    0x5B,0x82,0x31,0x50,0x53,0x32,0x4D,0x08,  /* 00000DF8    "[.1PS2M." */
+    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0F,  /* 00000E00    "_HID.A.." */
+    0x13,0x08,0x5F,0x43,0x49,0x44,0x0C,0x41,  /* 00000E08    ".._CID.A" */
+    0xD0,0x0F,0x13,0x14,0x09,0x5F,0x53,0x54,  /* 00000E10    "....._ST" */
+    0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,  /* 00000E18    "A....._C" */
+    0x52,0x53,0x11,0x08,0x0A,0x05,0x22,0x00,  /* 00000E20    "RS...."." */
+    0x10,0x79,0x00,0x5B,0x82,0x42,0x04,0x50,  /* 00000E28    ".y.[.B.P" */
+    0x53,0x32,0x4B,0x08,0x5F,0x48,0x49,0x44,  /* 00000E30    "S2K._HID" */
+    0x0C,0x41,0xD0,0x03,0x03,0x08,0x5F,0x43,  /* 00000E38    ".A...._C" */
+    0x49,0x44,0x0C,0x41,0xD0,0x03,0x0B,0x14,  /* 00000E40    "ID.A...." */
+    0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,  /* 00000E48    "._STA..." */
+    0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,0x18,  /* 00000E50    ".._CRS.." */
+    0x0A,0x15,0x47,0x01,0x60,0x00,0x60,0x00,  /* 00000E58    "..G.`.`." */
+    0x00,0x01,0x47,0x01,0x64,0x00,0x64,0x00,  /* 00000E60    "..G.d.d." */
+    0x00,0x01,0x22,0x02,0x00,0x79,0x00,0x5B,  /* 00000E68    ".."..y.[" */
+    0x82,0x3A,0x46,0x44,0x43,0x30,0x08,0x5F,  /* 00000E70    ".:FDC0._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x07,0x00,  /* 00000E78    "HID.A..." */
+    0x14,0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,  /* 00000E80    ".._STA.." */
+    0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000E88    "..._CRS." */
+    0x1B,0x0A,0x18,0x47,0x01,0xF0,0x03,0xF0,  /* 00000E90    "...G...." */
+    0x03,0x01,0x06,0x47,0x01,0xF7,0x03,0xF7,  /* 00000E98    "...G...." */
+    0x03,0x01,0x01,0x22,0x40,0x00,0x2A,0x04,  /* 00000EA0    "..."@.*." */
+    0x00,0x79,0x00,0x5B,0x82,0x46,0x04,0x55,  /* 00000EA8    ".y.[.F.U" */
+    0x41,0x52,0x31,0x08,0x5F,0x48,0x49,0x44,  /* 00000EB0    "AR1._HID" */
+    0x0C,0x41,0xD0,0x05,0x01,0x08,0x5F,0x55,  /* 00000EB8    ".A...._U" */
+    0x49,0x44,0x01,0x14,0x19,0x5F,0x53,0x54,  /* 00000EC0    "ID..._ST" */
+    0x41,0x00,0xA0,0x0D,0x93,0x5E,0x5E,0x5E,  /* 00000EC8    "A....^^^" */
+    0x5E,0x55,0x41,0x52,0x31,0x00,0xA4,0x00,  /* 00000ED0    "^UAR1..." */
+    0xA1,0x04,0xA4,0x0A,0x0F,0x08,0x5F,0x43,  /* 00000ED8    "......_C" */
+    0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,0x01,  /* 00000EE0    "RS....G." */
+    0xF8,0x03,0xF8,0x03,0x08,0x08,0x22,0x10,  /* 00000EE8    "......"." */
+    0x00,0x79,0x00,0x5B,0x82,0x47,0x04,0x55,  /* 00000EF0    ".y.[.G.U" */
+    0x41,0x52,0x32,0x08,0x5F,0x48,0x49,0x44,  /* 00000EF8    "AR2._HID" */
+    0x0C,0x41,0xD0,0x05,0x01,0x08,0x5F,0x55,  /* 00000F00    ".A...._U" */
+    0x49,0x44,0x0A,0x02,0x14,0x19,0x5F,0x53,  /* 00000F08    "ID...._S" */
+    0x54,0x41,0x00,0xA0,0x0D,0x93,0x5E,0x5E,  /* 00000F10    "TA....^^" */
+    0x5E,0x5E,0x55,0x41,0x52,0x32,0x00,0xA4,  /* 00000F18    "^^UAR2.." */
+    0x00,0xA1,0x04,0xA4,0x0A,0x0F,0x08,0x5F,  /* 00000F20    "......._" */
+    0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,  /* 00000F28    "CRS....G" */
+    0x01,0xF8,0x02,0xF8,0x02,0x08,0x08,0x22,  /* 00000F30    "......."" */
+    0x08,0x00,0x79,0x00,0x5B,0x82,0x36,0x4C,  /* 00000F38    "..y.[.6L" */
+    0x54,0x50,0x31,0x08,0x5F,0x48,0x49,0x44,  /* 00000F40    "TP1._HID" */
+    0x0C,0x41,0xD0,0x04,0x00,0x08,0x5F,0x55,  /* 00000F48    ".A...._U" */
+    0x49,0x44,0x0A,0x02,0x14,0x09,0x5F,0x53,  /* 00000F50    "ID...._S" */
+    0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,  /* 00000F58    "TA....._" */
+    0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,  /* 00000F60    "CRS....G" */
+    0x01,0x78,0x03,0x78,0x03,0x08,0x08,0x22,  /* 00000F68    ".x.x..."" */
+    0x80,0x00,0x79,0x00,0x5B,0x82,0x4D,0x07,  /* 00000F70    "..y.[.M." */
+    0x53,0x31,0x46,0x30,0x08,0x5F,0x41,0x44,  /* 00000F78    "S1F0._AD" */
+    0x52,0x0C,0x00,0x00,0x06,0x00,0x08,0x5F,  /* 00000F80    "R......_" */
+    0x53,0x55,0x4E,0x01,0x14,0x13,0x5F,0x50,  /* 00000F88    "SUN..._P" */
+    0x53,0x30,0x00,0x70,0x0A,0x80,0x5C,0x2E,  /* 00000F90    "S0.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000F98    "_GPEDPT2" */
+    0x14,0x13,0x5F,0x50,0x53,0x33,0x00,0x70,  /* 00000FA0    ".._PS3.p" */
+    0x0A,0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00000FA8    "..\._GPE" */
+    0x44,0x50,0x54,0x32,0x14,0x1F,0x5F,0x45,  /* 00000FB0    "DPT2.._E" */
+    0x4A,0x30,0x01,0x70,0x0A,0x88,0x5C,0x2E,  /* 00000FB8    "J0.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000FC0    "_GPEDPT2" */
+    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00000FC8    "p.\._GPE" */
+    0x50,0x48,0x50,0x31,0x14,0x1E,0x5F,0x53,  /* 00000FD0    "PHP1.._S" */
+    0x54,0x41,0x00,0x70,0x0A,0x89,0x5C,0x2E,  /* 00000FD8    "TA.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000FE0    "_GPEDPT2" */
+    0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x50,  /* 00000FE8    ".\._GPEP" */
+    0x48,0x50,0x31,0x5B,0x82,0x4E,0x07,0x53,  /* 00000FF0    "HP1[.N.S" */
+    0x32,0x46,0x30,0x08,0x5F,0x41,0x44,0x52,  /* 00000FF8    "2F0._ADR" */
+    0x0C,0x00,0x00,0x07,0x00,0x08,0x5F,0x53,  /* 00001000    "......_S" */
+    0x55,0x4E,0x0A,0x02,0x14,0x13,0x5F,0x50,  /* 00001008    "UN...._P" */
+    0x53,0x30,0x00,0x70,0x0A,0x90,0x5C,0x2E,  /* 00001010    "S0.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001018    "_GPEDPT2" */
+    0x14,0x13,0x5F,0x50,0x53,0x33,0x00,0x70,  /* 00001020    ".._PS3.p" */
+    0x0A,0x93,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001028    "..\._GPE" */
+    0x44,0x50,0x54,0x32,0x14,0x1F,0x5F,0x45,  /* 00001030    "DPT2.._E" */
+    0x4A,0x30,0x01,0x70,0x0A,0x98,0x5C,0x2E,  /* 00001038    "J0.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001040    "_GPEDPT2" */
+    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00001048    "p.\._GPE" */
+    0x50,0x48,0x50,0x32,0x14,0x1E,0x5F,0x53,  /* 00001050    "PHP2.._S" */
+    0x54,0x41,0x00,0x70,0x0A,0x99,0x5C,0x2E,  /* 00001058    "TA.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00001060    "_GPEDPT2" */
+    0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x50,  /* 00001068    ".\._GPEP" */
+    0x48,0x50,0x32,0x10,0x4E,0x0B,0x5F,0x47,  /* 00001070    "HP2.N._G" */
+    0x50,0x45,0x5B,0x80,0x50,0x48,0x50,0x5F,  /* 00001078    "PE[.PHP_" */
+    0x01,0x0B,0xC0,0x10,0x0A,0x03,0x5B,0x81,  /* 00001080    "......[." */
+    0x15,0x50,0x48,0x50,0x5F,0x01,0x50,0x53,  /* 00001088    ".PHP_.PS" */
+    0x54,0x41,0x08,0x50,0x48,0x50,0x31,0x08,  /* 00001090    "TA.PHP1." */
+    0x50,0x48,0x50,0x32,0x08,0x5B,0x80,0x44,  /* 00001098    "PHP2.[.D" */
+    0x47,0x31,0x5F,0x01,0x0B,0x44,0xB0,0x0A,  /* 000010A0    "G1_..D.." */
+    0x04,0x5B,0x81,0x10,0x44,0x47,0x31,0x5F,  /* 000010A8    ".[..DG1_" */
+    0x01,0x44,0x50,0x54,0x31,0x08,0x44,0x50,  /* 000010B0    ".DPT1.DP" */
+    0x54,0x32,0x08,0x14,0x46,0x07,0x5F,0x4C,  /* 000010B8    "T2..F._L" */
+    0x30,0x33,0x00,0x08,0x53,0x4C,0x54,0x5F,  /* 000010C0    "03..SLT_" */
+    0x00,0x08,0x45,0x56,0x54,0x5F,0x00,0x70,  /* 000010C8    "..EVT_.p" */
+    0x50,0x53,0x54,0x41,0x61,0x7A,0x61,0x0A,  /* 000010D0    "PSTAaza." */
+    0x04,0x53,0x4C,0x54,0x5F,0x7B,0x61,0x0A,  /* 000010D8    ".SLT_{a." */
+    0x0F,0x45,0x56,0x54,0x5F,0x70,0x53,0x4C,  /* 000010E0    ".EVT_pSL" */
+    0x54,0x5F,0x44,0x50,0x54,0x31,0x70,0x45,  /* 000010E8    "T_DPT1pE" */
+    0x56,0x54,0x5F,0x44,0x50,0x54,0x32,0xA0,  /* 000010F0    "VT_DPT2." */
+    0x1B,0x93,0x53,0x4C,0x54,0x5F,0x01,0x86,  /* 000010F8    "..SLT_.." */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001100    "\/._SB_P" */
+    0x43,0x49,0x30,0x53,0x31,0x46,0x30,0x45,  /* 00001108    "CI0S1F0E" */
+    0x56,0x54,0x5F,0xA1,0x1E,0xA0,0x1C,0x93,  /* 00001110    "VT_....." */
+    0x53,0x4C,0x54,0x5F,0x0A,0x02,0x86,0x5C,  /* 00001118    "SLT_...\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001120    "/._SB_PC" */
+    0x49,0x30,0x53,0x32,0x46,0x30,0x45,0x56,  /* 00001128    "I0S2F0EV" */
+    0x54,0x5F,
 };
 int DsdtLen=sizeof(AmlCode);
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/firmware/hvmloader/config.h
--- a/tools/firmware/hvmloader/config.h Tue May 20 18:54:09 2008 +0900
+++ b/tools/firmware/hvmloader/config.h Thu May 22 19:42:51 2008 +0900
@@ -23,11 +23,12 @@
 /* Memory map. */
 #define HYPERCALL_PHYSICAL_ADDRESS    0x00080000
 #define VGABIOS_PHYSICAL_ADDRESS      0x000C0000
-#define ETHERBOOT_PHYSICAL_ADDRESS    0x000C8000
+#define ETHERBOOT_PHYSICAL_ADDRESS    0x000D0000
 #define EXTBOOT_PHYSICAL_ADDRESS      0x000DF800
 #define SMBIOS_PHYSICAL_ADDRESS       0x000E9000
 #define SMBIOS_MAXIMUM_SIZE           0x00001000
 #define ACPI_PHYSICAL_ADDRESS         0x000EA000
 #define ROMBIOS_PHYSICAL_ADDRESS      0x000F0000
+#define SCRATCH_PHYSICAL_ADDRESS      0x00010000
 
 #endif /* __HVMLOADER_CONFIG_H__ */
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c      Tue May 20 18:54:09 2008 +0900
+++ b/tools/firmware/hvmloader/hvmloader.c      Thu May 22 19:42:51 2008 +0900
@@ -103,12 +103,7 @@ void create_mp_tables(void);
 void create_mp_tables(void);
 int hvm_write_smbios_tables(void);
 
-static int
-cirrus_check(void)
-{
-    outw(0x3C4, 0x9206);
-    return inb(0x3C5) == 0x12;
-}
+static enum { VGA_none, VGA_std, VGA_cirrus } virtual_vga = VGA_none;
 
 static void
 init_hypercalls(void)
@@ -165,7 +160,7 @@ static void pci_setup(void)
     /* Create a list of device BARs in descending order of size. */
     struct bars {
         uint32_t devfn, bar_reg, bar_sz;
-    } *bars = (struct bars *)0xc0000;
+    } *bars = (struct bars *)SCRATCH_PHYSICAL_ADDRESS;
     unsigned int i, nr_bars = 0;
 
     /* Program PCI-ISA bridge with appropriate link routes. */
@@ -196,12 +191,15 @@ static void pci_setup(void)
 
         switch ( class )
         {
+        case 0x0300:
+            if ( (vendor_id == 0x1234) && (device_id == 0x1111) )
+                virtual_vga = VGA_std;
+            if ( (vendor_id == 0x1013) && (device_id == 0xb8) )
+                virtual_vga = VGA_cirrus;
+            break;
         case 0x0680:
+            /* PIIX4 ACPI PM. Special device with special PCI config space. */
             ASSERT((vendor_id == 0x8086) && (device_id == 0x7113));
-            /*
-             * PIIX4 ACPI PM. Special device with special PCI config space.
-             * No ordinary BARs.
-             */
             pci_writew(devfn, 0x20, 0x0000); /* No smb bus IO enable */
             pci_writew(devfn, 0x22, 0x0000);
             pci_writew(devfn, 0x3c, 0x0009); /* Hardcoded IRQ9 */
@@ -212,42 +210,41 @@ static void pci_setup(void)
             ASSERT((vendor_id == 0x8086) && (device_id == 0x7010));
             pci_writew(devfn, 0x40, 0x8000); /* enable IDE0 */
             pci_writew(devfn, 0x42, 0x8000); /* enable IDE1 */
-            /* fall through */
-        default:
-            /* Default memory mappings. */
-            for ( bar = 0; bar < 7; bar++ )
-            {
-                bar_reg = PCI_BASE_ADDRESS_0 + 4*bar;
-                if ( bar == 6 )
-                    bar_reg = PCI_ROM_ADDRESS;
-
-                bar_data = pci_readl(devfn, bar_reg);
-                pci_writel(devfn, bar_reg, ~0);
-                bar_sz = pci_readl(devfn, bar_reg);
-                pci_writel(devfn, bar_reg, bar_data);
-                if ( bar_sz == 0 )
-                    continue;
-
-                bar_sz &= (((bar_data & PCI_BASE_ADDRESS_SPACE) ==
-                           PCI_BASE_ADDRESS_SPACE_MEMORY) ?
-                           PCI_BASE_ADDRESS_MEM_MASK :
-                           (PCI_BASE_ADDRESS_IO_MASK & 0xffff));
-                bar_sz &= ~(bar_sz - 1);
-
-                for ( i = 0; i < nr_bars; i++ )
-                    if ( bars[i].bar_sz < bar_sz )
-                        break;
-
-                if ( i != nr_bars )
-                    memmove(&bars[i+1], &bars[i], (nr_bars-i) * sizeof(*bars));
-
-                bars[i].devfn   = devfn;
-                bars[i].bar_reg = bar_reg;
-                bars[i].bar_sz  = bar_sz;
-
-                nr_bars++;
-            }
             break;
+        }
+
+        /* Map the I/O memory and port resources. */
+        for ( bar = 0; bar < 7; bar++ )
+        {
+            bar_reg = PCI_BASE_ADDRESS_0 + 4*bar;
+            if ( bar == 6 )
+                bar_reg = PCI_ROM_ADDRESS;
+
+            bar_data = pci_readl(devfn, bar_reg);
+            pci_writel(devfn, bar_reg, ~0);
+            bar_sz = pci_readl(devfn, bar_reg);
+            pci_writel(devfn, bar_reg, bar_data);
+            if ( bar_sz == 0 )
+                continue;
+
+            bar_sz &= (((bar_data & PCI_BASE_ADDRESS_SPACE) ==
+                        PCI_BASE_ADDRESS_SPACE_MEMORY) ?
+                       PCI_BASE_ADDRESS_MEM_MASK :
+                       (PCI_BASE_ADDRESS_IO_MASK & 0xffff));
+            bar_sz &= ~(bar_sz - 1);
+
+            for ( i = 0; i < nr_bars; i++ )
+                if ( bars[i].bar_sz < bar_sz )
+                    break;
+
+            if ( i != nr_bars )
+                memmove(&bars[i+1], &bars[i], (nr_bars-i) * sizeof(*bars));
+
+            bars[i].devfn   = devfn;
+            bars[i].bar_reg = bar_reg;
+            bars[i].bar_sz  = bar_sz;
+
+            nr_bars++;
         }
 
         /* Map the interrupt. */
@@ -464,19 +461,23 @@ int main(void)
     if ( (get_vcpu_nr() > 1) || get_apic_mode() )
         create_mp_tables();
 
-    if ( cirrus_check() )
-    {
+    switch ( virtual_vga )
+    {
+    case VGA_cirrus:
         printf("Loading Cirrus VGABIOS ...\n");
         memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
                vgabios_cirrusvga, sizeof(vgabios_cirrusvga));
         vgabios_sz = sizeof(vgabios_cirrusvga);
-    }
-    else
-    {
+        break;
+    case VGA_std:
         printf("Loading Standard VGABIOS ...\n");
         memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
                vgabios_stdvga, sizeof(vgabios_stdvga));
         vgabios_sz = sizeof(vgabios_stdvga);
+        break;
+    default:
+        printf("No emulated VGA adaptor ...\n");
+        break;
     }
 
     etherboot_sz = scan_etherboot_nic((void*)ETHERBOOT_PHYSICAL_ADDRESS);
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/firmware/hvmloader/smbios.c
--- a/tools/firmware/hvmloader/smbios.c Tue May 20 18:54:09 2008 +0900
+++ b/tools/firmware/hvmloader/smbios.c Thu May 22 19:42:51 2008 +0900
@@ -217,15 +217,16 @@ hvm_write_smbios_tables(void)
 
     xen_version_str[sizeof(xen_version_str)-1] = '\0';
 
-    /* NB. 0xC0000 is a safe large memory area for scratch. */
-    len = write_smbios_tables((void *)0xC0000,
+    /* SCRATCH_PHYSICAL_ADDRESS is a safe large memory area for scratch. */
+    len = write_smbios_tables((void *)SCRATCH_PHYSICAL_ADDRESS,
                               get_vcpu_nr(), get_memsize(),
                               uuid, xen_version_str,
                               xen_major_version, xen_minor_version);
     if ( len > SMBIOS_MAXIMUM_SIZE )
         goto error_out;
     /* Okay, not too large: copy out of scratch to final location. */
-    memcpy((void *)SMBIOS_PHYSICAL_ADDRESS, (void *)0xC0000, len);
+    memcpy((void *)SMBIOS_PHYSICAL_ADDRESS,
+           (void *)SCRATCH_PHYSICAL_ADDRESS, len);
 
     return len;
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c  Tue May 20 18:54:09 2008 +0900
+++ b/tools/firmware/rombios/rombios.c  Thu May 22 19:42:51 2008 +0900
@@ -1843,12 +1843,24 @@ keyboard_panic(status)
   BX_PANIC("Keyboard error:%u\n",status);
 }
 
+
+#define CMOS_SHUTDOWN_S3 0xFE
 //--------------------------------------------------------------------------
 // machine_reset
 //--------------------------------------------------------------------------
   void
 machine_reset()
 {
+ASM_START
+;we must check whether CMOS_SHUTDOWN_S3 is set or not
+;if it is s3 resume, just jmp back to normal Post Entry
+;below port io will prevent s3 resume
+  mov al, #0x0f
+  out 0x70, al
+  in al, 0x71
+  cmp al, #0xFE
+  jz post
+ASM_END
   /* Frob the keyboard reset line to reset the processor */
   outb(0x64, 0x60); /* Map the flags register at data port (0x60) */
   outb(0x60, 0x14); /* Set the flags to system|disable */
@@ -2305,6 +2317,72 @@ debugger_off()
 debugger_off()
 {
   outb(0xfedc, 0x00);
+}
+
+/* according to memory layout defined in acpi_build_tables(),
+   acpi FACS table is located in ACPI_PHYSICAL_ADDRESS(0xEA000) */
+#define ACPI_FACS_ADDRESS 0xEA000
+#define ACPI_FACS_OFFSET 0x10
+/* S3 resume status in CMOS 0Fh shutdown status byte*/
+
+void 
+s3_resume()
+{
+    Bit16u s3_wakeup_vector;
+    extern Bit16u s3_wakeup_ip;
+    extern Bit16u s3_wakeup_cs;
+    extern Bit8u s3_resume_flag;
+
+ASM_START
+    push ds
+    mov ax, #0xF000
+    mov ds, ax
+ASM_END
+
+    if (s3_resume_flag!=CMOS_SHUTDOWN_S3){
+        goto s3_out;
+    }
+    s3_resume_flag = 0;
+
+ASM_START
+    mov ax, #0x0
+    mov ds, ax
+ASM_END
+
+    /* get x_firmware_waking_vector */
+    s3_wakeup_vector = *((Bit16u*)(ACPI_FACS_ADDRESS+ACPI_FACS_OFFSET+24));
+    if (s3_wakeup_vector == 0){
+        /* get firmware_waking_vector */
+        s3_wakeup_vector = *((Bit16u*)(ACPI_FACS_ADDRESS+ACPI_FACS_OFFSET+12));
+        if (s3_wakeup_vector == 0){
+            goto s3_out;
+        }
+    }
+
+    /* setup wakeup vector */
+    s3_wakeup_ip = s3_wakeup_vector & 0xF;
+    s3_wakeup_cs = s3_wakeup_vector >> 4;
+
+ASM_START
+    mov bx, [_s3_wakeup_cs]
+    mov dx, [_s3_wakeup_ip]
+
+    mov ax, #0xF000
+    mov ds, ax
+    mov [_s3_wakeup_cs], bx
+    mov [_s3_wakeup_ip], dx
+    jmpf [_s3_wakeup_ip]
+
+; S3 data
+_s3_wakeup_ip:    dw 0x0a      
+_s3_wakeup_cs:    dw 0x0      
+_s3_resume_flag:  db 0   ; set at POST time by CMOS[0xF] shutdown status
+ASM_END
+
+s3_out:
+ASM_START
+   pop ds 
+ASM_END
 }
 
 #if BX_USE_ATADRV
@@ -9752,6 +9830,18 @@ post:
   ;; Examine CMOS shutdown status.
   mov al, bl
 
+  ;; 0xFE S3 resume
+  cmp AL, #0xFE
+  jnz not_s3_resume
+
+  ;; set S3 resume flag
+  mov dx, #0xF000
+  mov ds, dx
+  mov [_s3_resume_flag], AL
+  jmp normal_post
+
+not_s3_resume:
+
   ;; 0x00, 0x09, 0x0D+ = normal startup
   cmp AL, #0x00
   jz normal_post
@@ -10049,6 +10139,7 @@ post_default_ints:
   ;;
 #endif // BX_ELTORITO_BOOT
 
+  call _s3_resume
   call _interactive_bootkey
 
 #if BX_TCGBIOS
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/firmware/vgabios/clext.c
--- a/tools/firmware/vgabios/clext.c    Tue May 20 18:54:09 2008 +0900
+++ b/tools/firmware/vgabios/clext.c    Thu May 22 19:42:51 2008 +0900
@@ -26,6 +26,7 @@
 #define PM_BIOSMEM_CURRENT_MODE 0x449
 #define PM_BIOSMEM_CRTC_ADDRESS 0x463
 #define PM_BIOSMEM_VBE_MODE 0x4BA
+#define PM_BIOSMEM_VBE_POWER 0x4BC 
 
 typedef struct
 {
@@ -491,7 +492,7 @@ cirrus_vesa:
 #ifdef CIRRUS_DEBUG
   call cirrus_debug_dump
 #endif
-  cmp al, #0x0F
+  cmp al, #0x10
   ja cirrus_vesa_not_handled
   push bx
   xor bx, bx
@@ -682,7 +683,7 @@ c80h_2:
   ret
 
 cirrus_extbios_81h:
-  mov ax, #0x100 ;; XXX
+  mov ax, #0x103 ;; XXX
   ret
 cirrus_extbios_82h:
   push dx
@@ -1175,6 +1176,52 @@ cirrus_vesa_07h_2:
   mov  cx, ax
   pop  dx
   mov  ax, #0x004f
+  ret
+
+cirrus_vesa_10h: ;; Power management functions
+  ;; Set up DS to read stored power info from RAM
+  push ds
+#ifdef CIRRUS_VESA3_PMINFO
+ db 0x2e ;; cs:
+  mov ax, [cirrus_vesa_sel0000_data]
+#else
+  xor ax, ax
+#endif
+  mov  ds, ax
+  ;; Now choose the right function
+  cmp  bl, #0x00
+  ja   cirrus_vesa_10h_01
+  ;;
+  ;; Function 00h: Get capabilities
+  ;;
+  mov  bx, #0x0720 ;; 07: standby/suspend/off, 20: VBE/PM 2.0
+  mov  ax, #0x004f
+  jmp cirrus_vesa_10h_done
+cirrus_vesa_10h_01:
+  cmp  bl, #0x01
+  ja   cirrus_vesa_10h_02
+  ;;
+  ;; Function 01h: Set power state
+  ;; 
+  mov  ax, bx
+  mov  bx, # PM_BIOSMEM_VBE_POWER
+  mov  [bx], ah
+  mov  ax, #0x004f 
+  jmp cirrus_vesa_10h_done
+cirrus_vesa_10h_02:
+  cmp  bl, #0x02
+  ja   cirrus_vesa_10h_unimplemented
+  ;;
+  ;; Function 02h: Get power state
+  ;; 
+  mov  bx, # PM_BIOSMEM_VBE_POWER
+  mov  bh, [bx]
+  mov  ax, #0x004f 
+  jmp cirrus_vesa_10h_done
+cirrus_vesa_10h_unimplemented:
+  mov  ax, #0x014F ;; not implemented
+cirrus_vesa_10h_done:
+  pop ds
   ret
 
 cirrus_vesa_unimplemented:
@@ -1601,7 +1648,8 @@ cirrus_vesa_handlers:
   dw cirrus_vesa_unimplemented
   dw cirrus_vesa_unimplemented
   dw cirrus_vesa_unimplemented
-
+  ;; 10h
+  dw cirrus_vesa_10h
 
 
 ASM_END
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/firmware/vgabios/vgatables.h
--- a/tools/firmware/vgabios/vgatables.h        Tue May 20 18:54:09 2008 +0900
+++ b/tools/firmware/vgabios/vgatables.h        Thu May 22 19:42:51 2008 +0900
@@ -25,6 +25,7 @@
 #define BIOSMEM_VS_POINTER    0xA8
 #define BIOSMEM_VBE_FLAG      0xB9
 #define BIOSMEM_VBE_MODE      0xBA
+#define BIOSMEM_VBE_POWER     0xBC
 
 
 /*
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/ioemu/hw/pc.c
--- a/tools/ioemu/hw/pc.c       Tue May 20 18:54:09 2008 +0900
+++ b/tools/ioemu/hw/pc.c       Thu May 22 19:42:51 2008 +0900
@@ -1121,6 +1121,14 @@ static void pc_init_isa(uint64_t ram_siz
              initrd_filename, 0, NULL);
 }
 
+/* set CMOS shutdown status register (index 0xF) as S3_resume(0xFE)
+   BIOS will read it and start S3 resume at POST Entry*/
+void cmos_set_s3_resume(void)
+{
+    if (rtc_state)
+        rtc_set_memory(rtc_state, 0xF, 0xFE);
+}
+
 QEMUMachine pc_machine = {
     "pc",
     "Standard PC",
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/ioemu/hw/piix4acpi.c
--- a/tools/ioemu/hw/piix4acpi.c        Tue May 20 18:54:09 2008 +0900
+++ b/tools/ioemu/hw/piix4acpi.c        Thu May 22 19:42:51 2008 +0900
@@ -25,6 +25,7 @@
 
 #include "vl.h"
 #include <xen/hvm/ioreq.h>
+#include <xen/hvm/params.h>
 
 /* PM1a_CNT bits, as defined in the ACPI specification. */
 #define SCI_EN            (1 <<  0)
@@ -35,6 +36,7 @@
 /* Sleep state type codes as defined by the \_Sx objects in the DSDT. */
 /* These must be kept in sync with the DSDT (hvmloader/acpi/dsdt.asl) */
 #define SLP_TYP_S4        (6 << 10)
+#define SLP_TYP_S3        (5 << 10)
 #define SLP_TYP_S5        (7 << 10)
 
 #define ACPI_DBG_IO_ADDR  0xb044
@@ -78,6 +80,8 @@ typedef struct PHPSlots {
 } PHPSlots;
 
 PHPSlots php_slots;
+
+int s3_shutdown_flag;
 
 static void piix4acpi_save(QEMUFile *f, void *opaque)
 {
@@ -118,6 +122,13 @@ static void acpi_shutdown(uint32_t val)
         return;
 
     switch (val & SLP_TYP_Sx) {
+    case SLP_TYP_S3:
+        s3_shutdown_flag = 1;
+        qemu_system_reset();
+        s3_shutdown_flag = 0;
+        cmos_set_s3_resume();
+        xc_set_hvm_param(xc_handle, domid, HVM_PARAM_ACPI_S_STATE, 3);
+        break;
     case SLP_TYP_S4:
     case SLP_TYP_S5:
         qemu_system_shutdown_request();
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/ioemu/hw/xenfb.c
--- a/tools/ioemu/hw/xenfb.c    Tue May 20 18:54:09 2008 +0900
+++ b/tools/ioemu/hw/xenfb.c    Thu May 22 19:42:51 2008 +0900
@@ -498,7 +498,7 @@ static int xenfb_configure_fb(struct xen
                        fb_len_lim, fb_len_max);
                fb_len_lim = fb_len_max;
        }
-       if (fb_len > fb_len_lim) {
+       if (fb_len_lim && fb_len > fb_len_lim) {
                fprintf(stderr,
                        "FB: frontend fb size %zu limited to %zu\n",
                        fb_len, fb_len_lim);
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/ioemu/target-i386-dm/helper2.c
--- a/tools/ioemu/target-i386-dm/helper2.c      Tue May 20 18:54:09 2008 +0900
+++ b/tools/ioemu/target-i386-dm/helper2.c      Thu May 22 19:42:51 2008 +0900
@@ -133,8 +133,12 @@ CPUX86State *cpu_x86_init(void)
 /* called from main_cpu_reset */
 void cpu_reset(CPUX86State *env)
 {
+    extern int s3_shutdown_flag;
     int xcHandle;
     int sts;
+ 
+    if (s3_shutdown_flag)
+        return;
 
     xcHandle = xc_interface_open();
     if (xcHandle < 0)
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/ioemu/vl.h
--- a/tools/ioemu/vl.h  Tue May 20 18:54:09 2008 +0900
+++ b/tools/ioemu/vl.h  Thu May 22 19:42:51 2008 +0900
@@ -1181,6 +1181,7 @@ extern int fd_bootchk;
 
 void ioport_set_a20(int enable);
 int ioport_get_a20(void);
+void cmos_set_s3_resume(void);
 
 /* ppc.c */
 extern QEMUMachine prep_machine;
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/libxc/xc_cpuid_x86.c
--- a/tools/libxc/xc_cpuid_x86.c        Tue May 20 18:54:09 2008 +0900
+++ b/tools/libxc/xc_cpuid_x86.c        Thu May 22 19:42:51 2008 +0900
@@ -105,11 +105,14 @@ static void cpuid(const unsigned int *in
 static void cpuid(const unsigned int *input, unsigned int *regs)
 {
     unsigned int count = (input[1] == XEN_CPUID_INPUT_UNUSED) ? 0 : input[1];
-    unsigned int bx_temp;
-    asm ( "mov %%ebx,%4; cpuid; mov %%ebx,%1; mov %4,%%ebx"
-          : "=a" (regs[0]), "=r" (regs[1]),
-          "=c" (regs[2]), "=d" (regs[3]), "=m" (bx_temp)
-          : "0" (input[0]), "2" (count) );
+    asm (
+#ifdef __i386__
+        "push %%ebx; cpuid; mov %%ebx,%1; pop %%ebx"
+#else
+        "push %%rbx; cpuid; mov %%ebx,%1; pop %%rbx"
+#endif
+        : "=a" (regs[0]), "=r" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
+        : "0" (input[0]), "2" (count) );
 }
 
 /* Get the manufacturer brand name of the host processor. */
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/libxc/xc_pm.c
--- a/tools/libxc/xc_pm.c       Tue May 20 18:54:09 2008 +0900
+++ b/tools/libxc/xc_pm.c       Thu May 22 19:42:51 2008 +0900
@@ -99,3 +99,71 @@ int xc_pm_reset_pxstat(int xc_handle, in
 
     return xc_sysctl(xc_handle, &sysctl);
 }
+
+int xc_pm_get_max_cx(int xc_handle, int cpuid, int *max_cx)
+{
+    DECLARE_SYSCTL;
+    int ret = 0;
+
+    sysctl.cmd = XEN_SYSCTL_get_pmstat;
+    sysctl.u.get_pmstat.type = PMSTAT_get_max_cx;
+    sysctl.u.get_pmstat.cpuid = cpuid;
+    if ( (ret = xc_sysctl(xc_handle, &sysctl)) != 0 )
+        return ret;
+
+    *max_cx = sysctl.u.get_pmstat.u.getcx.nr;
+    return ret;
+}
+
+int xc_pm_get_cxstat(int xc_handle, int cpuid, struct xc_cx_stat *cxpt)
+{
+    DECLARE_SYSCTL;
+    int max_cx, ret;
+
+    if( !cxpt || !(cxpt->triggers) || !(cxpt->residencies) )
+        return -EINVAL;
+
+    if ( (ret = xc_pm_get_max_cx(xc_handle, cpuid, &max_cx)) )
+        goto unlock_0;
+
+    if ( (ret = lock_pages(cxpt, sizeof(struct xc_cx_stat))) )
+        goto unlock_0;
+    if ( (ret = lock_pages(cxpt->triggers, max_cx * sizeof(uint64_t))) )
+        goto unlock_1;
+    if ( (ret = lock_pages(cxpt->residencies, max_cx * sizeof(uint64_t))) )
+        goto unlock_2;
+
+    sysctl.cmd = XEN_SYSCTL_get_pmstat;
+    sysctl.u.get_pmstat.type = PMSTAT_get_cxstat;
+    sysctl.u.get_pmstat.cpuid = cpuid;
+    set_xen_guest_handle(sysctl.u.get_pmstat.u.getcx.triggers, cxpt->triggers);
+    set_xen_guest_handle(sysctl.u.get_pmstat.u.getcx.residencies, 
+                         cxpt->residencies);
+
+    if ( (ret = xc_sysctl(xc_handle, &sysctl)) )
+        goto unlock_3;
+
+    cxpt->nr = sysctl.u.get_pmstat.u.getcx.nr;
+    cxpt->last = sysctl.u.get_pmstat.u.getcx.last;
+    cxpt->idle_time = sysctl.u.get_pmstat.u.getcx.idle_time;
+
+unlock_3:
+    unlock_pages(cxpt->residencies, max_cx * sizeof(uint64_t));
+unlock_2:
+    unlock_pages(cxpt->triggers, max_cx * sizeof(uint64_t));
+unlock_1:
+    unlock_pages(cxpt, sizeof(struct xc_cx_stat));
+unlock_0:
+    return ret;
+}
+
+int xc_pm_reset_cxstat(int xc_handle, int cpuid)
+{
+    DECLARE_SYSCTL;
+
+    sysctl.cmd = XEN_SYSCTL_get_pmstat;
+    sysctl.u.get_pmstat.type = PMSTAT_reset_cxstat;
+    sysctl.u.get_pmstat.cpuid = cpuid;
+
+    return xc_sysctl(xc_handle, &sysctl);
+}
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Tue May 20 18:54:09 2008 +0900
+++ b/tools/libxc/xenctrl.h     Thu May 22 19:42:51 2008 +0900
@@ -1053,4 +1053,17 @@ int xc_pm_get_pxstat(int xc_handle, int 
 int xc_pm_get_pxstat(int xc_handle, int cpuid, struct xc_px_stat *pxpt);
 int xc_pm_reset_pxstat(int xc_handle, int cpuid);
 
+struct xc_cx_stat {
+    uint32_t nr;    /* entry nr in triggers & residencies, including C0 */
+    uint32_t last;         /* last Cx state */
+    uint64_t idle_time;    /* idle time from boot */
+    uint64_t *triggers;    /* Cx trigger counts */
+    uint64_t *residencies; /* Cx residencies */
+};
+typedef struct xc_cx_stat xc_cx_stat_t;
+
+int xc_pm_get_max_cx(int xc_handle, int cpuid, int *max_cx);
+int xc_pm_get_cxstat(int xc_handle, int cpuid, struct xc_cx_stat *cxpt);
+int xc_pm_reset_cxstat(int xc_handle, int cpuid);
+
 #endif /* XENCTRL_H */
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/python/xen/util/blkif.py
--- a/tools/python/xen/util/blkif.py    Tue May 20 18:54:09 2008 +0900
+++ b/tools/python/xen/util/blkif.py    Thu May 22 19:42:51 2008 +0900
@@ -1,8 +1,6 @@ import os
 import os
 import re
 import string
-
-from xen.xend.XendLogging import log
 
 def expand_dev_name(name):
     if not name:
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/python/xen/xend/XendConfig.py
--- a/tools/python/xen/xend/XendConfig.py       Tue May 20 18:54:09 2008 +0900
+++ b/tools/python/xen/xend/XendConfig.py       Thu May 22 19:42:51 2008 +0900
@@ -1143,10 +1143,11 @@ class XendConfig(dict):
                 if o_dev_type == 'vbd' or o_dev_type == 'tap':
                     blkdev_file = blkdev_uname_to_file(dev_uname)
                     o_dev_uname = sxp.child_value(o_dev_info, 'uname')
-                    o_blkdev_file = blkdev_uname_to_file(o_dev_uname)
-                    if blkdev_file == o_blkdev_file:
-                        raise XendConfigError('The file "%s" is already used' %
-                                              blkdev_file)
+                    if o_dev_uname != None:
+                        o_blkdev_file = blkdev_uname_to_file(o_dev_uname)
+                        if blkdev_file == o_blkdev_file:
+                            raise XendConfigError('The file "%s" is already 
used' %
+                                                  blkdev_file)
                     o_blkdev_name = sxp.child_value(o_dev_info, 'dev')
                     o_devid = self._blkdev_name_to_number(o_blkdev_name)
                     if o_devid != None and devid == o_devid:
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/python/xen/xend/XendConstants.py
--- a/tools/python/xen/xend/XendConstants.py    Tue May 20 18:54:09 2008 +0900
+++ b/tools/python/xen/xend/XendConstants.py    Thu May 22 19:42:51 2008 +0900
@@ -48,6 +48,7 @@ HVM_PARAM_BUFPIOREQ_PFN = 9
 HVM_PARAM_BUFPIOREQ_PFN = 9
 HVM_PARAM_TIMER_MODE   = 10
 HVM_PARAM_HPET_ENABLED = 11
+HVM_PARAM_ACPI_S_STATE = 14
 
 restart_modes = [
     "restart",
@@ -102,11 +103,13 @@ TRIGGER_NMI   = 0
 TRIGGER_NMI   = 0
 TRIGGER_RESET = 1
 TRIGGER_INIT  = 2
+TRIGGER_S3RESUME = 3
 
 TRIGGER_TYPE = {
     "nmi"   : TRIGGER_NMI,
     "reset" : TRIGGER_RESET,
-    "init"  : TRIGGER_INIT
+    "init"  : TRIGGER_INIT,
+    "s3resume": TRIGGER_S3RESUME
 }
 
 #
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       Tue May 20 18:54:09 2008 +0900
+++ b/tools/python/xen/xend/XendDomain.py       Thu May 22 19:42:51 2008 +0900
@@ -1282,6 +1282,10 @@ class XendDomain:
 
         if dominfo.getDomid() == DOM0_ID:
             raise XendError("Cannot migrate privileged domain %s" % domid)
+        if dominfo._stateGet() != DOM_STATE_RUNNING:
+            raise VMBadState("Domain is not running",
+                             POWER_STATE_NAMES[DOM_STATE_RUNNING],
+                             POWER_STATE_NAMES[dominfo._stateGet()])
 
         """ The following call may raise a XendError exception """
         dominfo.testMigrateDevices(True, dst)
@@ -1653,6 +1657,9 @@ class XendDomain:
             trigger = TRIGGER_TYPE[trigger_name.lower()]
         else:
             raise XendError("Invalid trigger: %s" % trigger_name)
+        if trigger == TRIGGER_S3RESUME:
+            xc.hvm_set_param(dominfo.getDomid(), HVM_PARAM_ACPI_S_STATE, 0)
+            return None
         try:
             return xc.domain_send_trigger(dominfo.getDomid(),
                                           trigger,
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/python/xen/xend/xenstore/xswatch.py
--- a/tools/python/xen/xend/xenstore/xswatch.py Tue May 20 18:54:09 2008 +0900
+++ b/tools/python/xen/xend/xenstore/xswatch.py Thu May 22 19:42:51 2008 +0900
@@ -8,8 +8,6 @@ import errno
 import errno
 import threading
 from xen.xend.xenstore.xsutil import xshandle
-
-from xen.xend.XendLogging import log
 
 
 class xswatch:
@@ -76,7 +74,7 @@ def watchMain():
                     else:
                         raise
         except:
-            log.exception("read_watch failed")
+            pass
             # Ignore this exception -- there's no point throwing it
             # further on because that will just kill the watcher thread,
             # which achieves nothing.
diff -r f04ce41dab84 -r 74d0f17f3fa5 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Tue May 20 18:54:09 2008 +0900
+++ b/tools/python/xen/xm/main.py       Thu May 22 19:42:51 2008 +0900
@@ -143,7 +143,7 @@ SUBCOMMAND_HELP = {
                      'Get/set credit scheduler parameters.'),
     'sysrq'       : ('<Domain> <letter>', 'Send a sysrq to a domain.'),
     'debug-keys'  : ('<Keys>', 'Send debug keys to Xen.'),
-    'trigger'     : ('<Domain> <nmi|reset|init> [<VCPU>]',
+    'trigger'     : ('<Domain> <nmi|reset|init|s3resume> [<VCPU>]',
                      'Send a trigger to a domain.'),
     'vcpu-list'   : ('[Domain, ...]',
                      'List the VCPUs for all/some domains.'),
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/ia64/xen/domain.c        Thu May 22 19:42:51 2008 +0900
@@ -644,10 +644,9 @@ void arch_domain_destroy(struct domain *
        deallocate_rid_range(d);
 }
 
-int arch_vcpu_reset(struct vcpu *v)
+void arch_vcpu_reset(struct vcpu *v)
 {
        /* FIXME: Stub for now */
-       return 0;
 }
 
 /* Here it is assumed that all of the CPUs has same RSE.N_STACKED_PHYS */
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/Makefile
--- a/xen/arch/x86/Makefile     Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/Makefile     Thu May 22 19:42:51 2008 +0900
@@ -50,6 +50,7 @@ obj-y += machine_kexec.o
 obj-y += machine_kexec.o
 obj-y += crash.o
 obj-y += tboot.o
+obj-y += hpet.o
 
 obj-$(crash_debug) += gdbstub.o
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/acpi/cpu_idle.c
--- a/xen/arch/x86/acpi/cpu_idle.c      Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/acpi/cpu_idle.c      Thu May 22 19:42:51 2008 +0900
@@ -37,12 +37,14 @@
 #include <xen/types.h>
 #include <xen/acpi.h>
 #include <xen/smp.h>
+#include <xen/guest_access.h>
+#include <xen/keyhandler.h>
 #include <asm/cache.h>
 #include <asm/io.h>
-#include <xen/guest_access.h>
+#include <asm/hpet.h>
+#include <asm/processor.h>
 #include <public/platform.h>
-#include <asm/processor.h>
-#include <xen/keyhandler.h>
+#include <public/sysctl.h>
 
 #define DEBUG_PM_CX
 
@@ -127,45 +129,29 @@ static void print_acpi_power(uint32_t cp
 {
     uint32_t i;
 
-    printk("saved cpu%d cx acpi info:\n", cpu);
-    printk("\tcurrent state is C%d\n", (power->state)?power->state->type:-1);
-    printk("\tbm_check_timestamp = %"PRId64"\n", power->bm_check_timestamp);
-    printk("\tdefault_state = %d\n", power->default_state);
-    printk("\tbm_activity = 0x%08x\n", power->bm_activity);
-    printk("\tcount = %d\n", power->count);
+    printk("==cpu%d==\n", cpu);
+    printk("active state:\t\tC%d\n", (power->state)?power->state->type:-1);
+    printk("max_cstate:\t\tC%d\n", max_cstate);
+    printk("bus master activity:\t%08x\n", power->bm_activity);
+    printk("states:\n");
     
-    for ( i = 0; i < power->count; i++ )
-    {
-        printk("\tstates[%d]:\n", i);
-        printk("\t\tvalid   = %d\n", power->states[i].valid);
-        printk("\t\ttype    = %d\n", power->states[i].type);
-        printk("\t\taddress = 0x%x\n", power->states[i].address);
-        printk("\t\tspace_id = 0x%x\n", power->states[i].space_id);
-        printk("\t\tlatency = %d\n", power->states[i].latency);
-        printk("\t\tpower   = %d\n", power->states[i].power);
-        printk("\t\tlatency_ticks = %d\n", power->states[i].latency_ticks);
-        printk("\t\tusage   = %d\n", power->states[i].usage);
-        printk("\t\ttime    = %"PRId64"\n", power->states[i].time);
-
-        printk("\t\tpromotion policy:\n");
-        printk("\t\t\tcount    = %d\n", power->states[i].promotion.count);
-        printk("\t\t\tstate    = C%d\n",
-               (power->states[i].promotion.state) ? 
-               power->states[i].promotion.state->type : -1);
-        printk("\t\t\tthreshold.time = %d\n", 
power->states[i].promotion.threshold.time);
-        printk("\t\t\tthreshold.ticks = %d\n", 
power->states[i].promotion.threshold.ticks);
-        printk("\t\t\tthreshold.count = %d\n", 
power->states[i].promotion.threshold.count);
-        printk("\t\t\tthreshold.bm = %d\n", 
power->states[i].promotion.threshold.bm);
-
-        printk("\t\tdemotion policy:\n");
-        printk("\t\t\tcount    = %d\n", power->states[i].demotion.count);
-        printk("\t\t\tstate    = C%d\n",
-               (power->states[i].demotion.state) ? 
-               power->states[i].demotion.state->type : -1);
-        printk("\t\t\tthreshold.time = %d\n", 
power->states[i].demotion.threshold.time);
-        printk("\t\t\tthreshold.ticks = %d\n", 
power->states[i].demotion.threshold.ticks);
-        printk("\t\t\tthreshold.count = %d\n", 
power->states[i].demotion.threshold.count);
-        printk("\t\t\tthreshold.bm = %d\n", 
power->states[i].demotion.threshold.bm);
+    for ( i = 1; i < power->count; i++ )
+    {
+        printk((power->states[i].type == power->state->type) ? "   *" : "    
");
+        printk("C%d:\t\t", i);
+        printk("type[C%d] ", power->states[i].type);
+        if ( power->states[i].promotion.state )
+            printk("promotion[C%d] ", power->states[i].promotion.state->type);
+        else
+            printk("promotion[--] ");
+        if ( power->states[i].demotion.state )
+            printk("demotion[C%d] ", power->states[i].demotion.state->type);
+        else
+            printk("demotion[--] ");
+        printk("latency[%03d]\n ", power->states[i].latency);
+        printk("\t\t\t");
+        printk("usage[%08d] ", power->states[i].usage);
+        printk("duration[%"PRId64"]\n", power->states[i].time);
     }
 }
 
@@ -438,19 +424,19 @@ static void acpi_processor_idle(void)
         t1 = inl(pmtmr_ioport);
 
         /*
-         * FIXME: Before invoking C3, be aware that TSC/APIC timer may be 
+         * Before invoking C3, be aware that TSC/APIC timer may be 
          * stopped by H/W. Without carefully handling of TSC/APIC stop issues,
          * deep C state can't work correctly.
          */
         /* preparing TSC stop */
         cstate_save_tsc();
-        /* placeholder for preparing APIC stop */
-
+        /* preparing APIC stop */
+        hpet_broadcast_enter();
         /* Invoke C3 */
         acpi_idle_do_entry(cx);
 
-        /* placeholder for recovering APIC */
-
+        /* recovering APIC */
+        hpet_broadcast_exit();
         /* recovering TSC */
         cstate_restore_tsc();
 
@@ -955,3 +941,41 @@ long set_cx_pminfo(uint32_t cpu, struct 
         
     return 0;
 }
+
+uint32_t pmstat_get_cx_nr(uint32_t cpuid)
+{
+    return processor_powers[cpuid].count;
+}
+
+int pmstat_get_cx_stat(uint32_t cpuid, struct pm_cx_stat *stat)
+{
+    struct acpi_processor_power *power = &processor_powers[cpuid];
+    struct vcpu *v = idle_vcpu[cpuid];
+    uint64_t usage;
+    int i;
+
+    stat->last = (power->state) ? power->state->type : 0;
+    stat->nr = processor_powers[cpuid].count;
+    stat->idle_time = v->runstate.time[RUNSTATE_running];
+    if ( v->is_running )
+        stat->idle_time += NOW() - v->runstate.state_entry_time;
+
+    for ( i = 0; i < power->count; i++ )
+    {
+        usage = power->states[i].usage;
+        if ( copy_to_guest_offset(stat->triggers, i, &usage, 1) )
+            return -EFAULT;
+    }
+    for ( i = 0; i < power->count; i++ )
+        if ( copy_to_guest_offset(stat->residencies, i, 
+                                  &power->states[i].time, 1) )
+            return -EFAULT;
+
+    return 0;
+}
+
+int pmstat_reset_cx_stat(uint32_t cpuid)
+{
+    return 0;
+}
+
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/acpi/pmstat.c
--- a/xen/arch/x86/acpi/pmstat.c        Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/acpi/pmstat.c        Thu May 22 19:42:51 2008 +0900
@@ -42,6 +42,10 @@
 
 struct pm_px px_statistic_data[NR_CPUS];
 
+extern uint32_t pmstat_get_cx_nr(uint32_t cpuid);
+extern int pmstat_get_cx_stat(uint32_t cpuid, struct pm_cx_stat *stat);
+extern int pmstat_reset_cx_stat(uint32_t cpuid);
+
 int do_get_pm_info(struct xen_sysctl_get_pmstat *op)
 {
     int ret = 0;
@@ -50,7 +54,7 @@ int do_get_pm_info(struct xen_sysctl_get
 
     /* to protect the case when Px was controlled by dom0-kernel */
     /* or when CPU_FREQ not set in which case ACPI Px objects not parsed */
-    if ( !pmpt->perf.init )
+    if ( !pmpt->perf.init && (op->type & PMSTAT_CATEGORY_MASK) == PMSTAT_PX )
         return -EINVAL;
 
     if ( !cpu_online(op->cpuid) )
@@ -100,6 +104,25 @@ int do_get_pm_info(struct xen_sysctl_get
         break;
     }
 
+    case PMSTAT_get_max_cx:
+    {
+        op->u.getcx.nr = pmstat_get_cx_nr(op->cpuid);
+        ret = 0;
+        break;
+    }
+
+    case PMSTAT_get_cxstat:
+    {
+        ret = pmstat_get_cx_stat(op->cpuid, &op->u.getcx);
+        break;
+    }
+
+    case PMSTAT_reset_cxstat:
+    {
+        ret = pmstat_reset_cx_stat(op->cpuid);
+        break;
+    }
+
     default:
         printk("not defined sub-hypercall @ do_get_pm_info\n");
         ret = -ENOSYS;
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/domain.c     Thu May 22 19:42:51 2008 +0900
@@ -823,11 +823,10 @@ int arch_set_info_guest(
 #undef c
 }
 
-int arch_vcpu_reset(struct vcpu *v)
+void arch_vcpu_reset(struct vcpu *v)
 {
     destroy_gdt(v);
     vcpu_destroy_pagetables(v);
-    return 0;
 }
 
 /* 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/domain_build.c
--- a/xen/arch/x86/domain_build.c       Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/domain_build.c       Thu May 22 19:42:51 2008 +0900
@@ -221,9 +221,7 @@ int __init construct_dom0(
 #if CONFIG_PAGING_LEVELS >= 4
     l4_pgentry_t *l4tab = NULL, *l4start = NULL;
 #endif
-#if CONFIG_PAGING_LEVELS >= 3
     l3_pgentry_t *l3tab = NULL, *l3start = NULL;
-#endif
     l2_pgentry_t *l2tab = NULL, *l2start = NULL;
     l1_pgentry_t *l1tab = NULL, *l1start = NULL;
 
@@ -277,13 +275,6 @@ int __init construct_dom0(
     compat32   = 0;
     machine = elf_uval(&elf, elf.ehdr, e_machine);
     switch (CONFIG_PAGING_LEVELS) {
-    case 2: /* x86_32 */
-        if (parms.pae == PAEKERN_bimodal)
-            parms.pae = PAEKERN_no;
-        printk(" Xen  kernel: 32-bit, lsb\n");
-        if (elf_32bit(&elf) && !parms.pae && machine == EM_386)
-            compatible = 1;
-        break;
     case 3: /* x86_32p */
         if (parms.pae == PAEKERN_bimodal)
             parms.pae = PAEKERN_extended_cr3;
@@ -479,7 +470,6 @@ int __init construct_dom0(
     }
 
     /* WARNING: The new domain must have its 'processor' field filled in! */
-#if CONFIG_PAGING_LEVELS == 3
     l3start = l3tab = (l3_pgentry_t *)mpt_alloc; mpt_alloc += PAGE_SIZE;
     l2start = l2tab = (l2_pgentry_t *)mpt_alloc; mpt_alloc += 4*PAGE_SIZE;
     memcpy(l2tab, idle_pg_table_l2, 4*PAGE_SIZE);
@@ -489,13 +479,6 @@ int __init construct_dom0(
             l2e_from_paddr((u32)l2tab + i*PAGE_SIZE, __PAGE_HYPERVISOR);
     }
     v->arch.guest_table = pagetable_from_paddr((unsigned long)l3start);
-#else
-    l2start = l2tab = (l2_pgentry_t *)mpt_alloc; mpt_alloc += PAGE_SIZE;
-    copy_page(l2tab, idle_pg_table);
-    l2tab[LINEAR_PT_VIRT_START >> L2_PAGETABLE_SHIFT] =
-        l2e_from_paddr((unsigned long)l2start, __PAGE_HYPERVISOR);
-    v->arch.guest_table = pagetable_from_paddr((unsigned long)l2start);
-#endif
 
     for ( i = 0; i < PDPT_L2_ENTRIES; i++ )
         l2tab[l2_linear_offset(PERDOMAIN_VIRT_START) + i] =
@@ -539,16 +522,16 @@ int __init construct_dom0(
             if ( !get_page_type(page, PGT_writable_page) )
                 BUG();
 
-#if CONFIG_PAGING_LEVELS == 3
-        switch (count) {
+        switch ( count )
+        {
         case 0:
             page->u.inuse.type_info &= ~PGT_type_mask;
             page->u.inuse.type_info |= PGT_l3_page_table;
             get_page(page, d); /* an extra ref because of readable mapping */
 
             /* Get another ref to L3 page so that it can be pinned. */
-            if ( !get_page_and_type(page, d, PGT_l3_page_table) )
-                BUG();
+            page->u.inuse.type_info++;
+            page->count_info++;
             set_bit(_PGT_pinned, &page->u.inuse.type_info);
             break;
         case 1 ... 4:
@@ -564,38 +547,6 @@ int __init construct_dom0(
             get_page(page, d); /* an extra ref because of readable mapping */
             break;
         }
-#else
-        if ( count == 0 )
-        {
-            page->u.inuse.type_info &= ~PGT_type_mask;
-            page->u.inuse.type_info |= PGT_l2_page_table;
-
-            /*
-             * No longer writable: decrement the type_count.
-             * Installed as CR3: increment both the ref_count and type_count.
-             * Net: just increment the ref_count.
-             */
-            get_page(page, d); /* an extra ref because of readable mapping */
-
-            /* Get another ref to L2 page so that it can be pinned. */
-            if ( !get_page_and_type(page, d, PGT_l2_page_table) )
-                BUG();
-            set_bit(_PGT_pinned, &page->u.inuse.type_info);
-        }
-        else
-        {
-            page->u.inuse.type_info &= ~PGT_type_mask;
-            page->u.inuse.type_info |= PGT_l1_page_table;
-
-            /*
-             * No longer writable: decrement the type_count.
-             * This is an L1 page, installed in a validated L2 page:
-             * increment both the ref_count and type_count.
-             * Net: just increment the ref_count.
-             */
-            get_page(page, d); /* an extra ref because of readable mapping */
-        }
-#endif
         if ( !((unsigned long)++l1tab & (PAGE_SIZE - 1)) )
             l1start = l1tab = (l1_pgentry_t *)(u32)l2e_get_paddr(*++l2tab);
     }
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/hpet.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/arch/x86/hpet.c       Thu May 22 19:42:51 2008 +0900
@@ -0,0 +1,291 @@
+/******************************************************************************
+ * arch/x86/hpet.c
+ * 
+ * HPET management.
+ */
+
+#include <xen/config.h>
+#include <xen/errno.h>
+#include <xen/time.h>
+#include <xen/timer.h>
+#include <xen/smp.h>
+#include <xen/softirq.h>
+#include <asm/fixmap.h>
+#include <asm/div64.h>
+#include <asm/hpet.h>
+
+#define STIME_MAX ((s_time_t)((uint64_t)~0ull>>1))
+
+#define MAX_DELTA_NS MILLISECS(10*1000)
+#define MIN_DELTA_NS MICROSECS(1)
+
+struct hpet_event_channel
+{
+    unsigned long mult;
+    int           shift;
+    s_time_t      next_event;
+    cpumask_t     cpumask;
+    spinlock_t    lock;
+    void          (*event_handler)(struct hpet_event_channel *);
+};
+static struct hpet_event_channel hpet_event;
+
+unsigned long hpet_address;
+
+/*
+ * Calculate a multiplication factor for scaled math, which is used to convert
+ * nanoseconds based values to clock ticks:
+ *
+ * clock_ticks = (nanoseconds * factor) >> shift.
+ *
+ * div_sc is the rearranged equation to calculate a factor from a given clock
+ * ticks / nanoseconds ratio:
+ *
+ * factor = (clock_ticks << shift) / nanoseconds
+ */
+static inline unsigned long div_sc(unsigned long ticks, unsigned long nsec,
+                                   int shift)
+{
+    uint64_t tmp = ((uint64_t)ticks) << shift;
+
+    do_div(tmp, nsec);
+    return (unsigned long) tmp;
+}
+
+/*
+ * Convert nanoseconds based values to clock ticks:
+ *
+ * clock_ticks = (nanoseconds * factor) >> shift.
+ */
+static inline unsigned long ns2ticks(unsigned long nsec, int shift,
+                                     unsigned long factor)
+{
+    uint64_t tmp = ((uint64_t)nsec * factor) >> shift;
+
+    return (unsigned long) tmp;
+}
+
+static int hpet_legacy_next_event(unsigned long delta)
+{
+    unsigned long cnt;
+
+    cnt = hpet_read32(HPET_COUNTER);
+    cnt += delta;
+    hpet_write32(cnt, HPET_T0_CMP);
+
+    return ((long)(hpet_read32(HPET_COUNTER) - cnt) > 0) ? -ETIME : 0;
+}
+
+static int reprogram_hpet_evt_channel(
+    struct hpet_event_channel *ch,
+    s_time_t expire, s_time_t now, int force)
+{
+    int64_t delta;
+    int ret;
+
+    if ( unlikely(expire < 0) )
+    {
+        printk(KERN_DEBUG "reprogram: expire < 0\n");
+        return -ETIME;
+    }
+
+    delta = expire - now;
+    if ( delta <= 0 )
+    {
+        printk(KERN_DEBUG "reprogram: expire(%"PRIx64") < "
+               "now(%"PRIx64")\n", expire, now);
+        if ( !force )
+            return -ETIME;
+    }
+
+    ch->next_event = expire;
+
+    delta = min_t(int64_t, delta, MAX_DELTA_NS);
+    delta = max_t(int64_t, delta, MIN_DELTA_NS);
+    delta = ns2ticks(delta, ch->shift, ch->mult);
+
+    ret = hpet_legacy_next_event(delta);
+    while ( ret && force )
+    {
+        delta += delta;
+        ret = hpet_legacy_next_event(delta);
+    }
+
+    return ret;
+}
+
+static int evt_do_broadcast(cpumask_t mask)
+{
+    int ret = 0, cpu = smp_processor_id();
+
+    if ( cpu_isset(cpu, mask) )
+    {
+        cpu_clear(cpu, mask);
+        raise_softirq(TIMER_SOFTIRQ);
+        ret = 1;
+    }
+
+    if ( !cpus_empty(mask) )
+    {
+       cpumask_raise_softirq(mask, TIMER_SOFTIRQ);
+       ret = 1;
+    }
+    return ret;
+}
+
+static void handle_hpet_broadcast(struct hpet_event_channel *ch)
+{
+    cpumask_t mask;
+    s_time_t now, next_event;
+    int cpu, current_cpu = smp_processor_id();
+
+    spin_lock(&ch->lock);
+
+    if ( cpu_isset(current_cpu, ch->cpumask) )
+        printk(KERN_DEBUG "WARNING: current cpu%d in bc_mask\n", current_cpu);
+again:
+    ch->next_event = STIME_MAX;
+    next_event = STIME_MAX;
+    mask = (cpumask_t)CPU_MASK_NONE;
+    now = NOW();
+
+    /* find all expired events */
+    for_each_cpu_mask(cpu, ch->cpumask)
+    {
+        if ( per_cpu(timer_deadline, cpu) <= now )
+            cpu_set(cpu, mask);
+        else if ( per_cpu(timer_deadline, cpu) < next_event )
+            next_event = per_cpu(timer_deadline, cpu);
+    }
+    if ( per_cpu(timer_deadline, current_cpu) <= now )
+        cpu_set(current_cpu, mask);
+
+    /* wakeup the cpus which have an expired event. */
+    evt_do_broadcast(mask);
+
+    if ( next_event != STIME_MAX )
+    {
+        if ( reprogram_hpet_evt_channel(ch, next_event, now, 0) )
+            goto again;
+    }
+    spin_unlock(&ch->lock);
+}
+
+void hpet_broadcast_init(void)
+{
+    u64 hpet_rate;
+    u32 hpet_id, cfg;
+
+    hpet_rate = hpet_setup();
+    if ( hpet_rate == 0 )
+        return;
+
+    hpet_id = hpet_read32(HPET_ID);
+    if ( !(hpet_id & HPET_ID_LEGSUP) )
+        return;
+
+    /* Start HPET legacy interrupts */
+    cfg = hpet_read32(HPET_CFG);
+    cfg |= HPET_CFG_LEGACY;
+    hpet_write32(cfg, HPET_CFG);
+
+    /* set HPET T0 as oneshot */
+    cfg = hpet_read32(HPET_T0_CFG);
+    cfg &= ~HPET_TN_PERIODIC;
+    cfg |= HPET_TN_ENABLE | HPET_TN_32BIT;
+    hpet_write32(cfg, HPET_T0_CFG);
+
+    /*
+     * The period is a femto seconds value. We need to calculate the scaled
+     * math multiplication factor for nanosecond to hpet tick conversion.
+     */
+    hpet_event.mult = div_sc((unsigned long)hpet_rate, 1000000000ul, 32);
+    hpet_event.shift = 32;
+    hpet_event.next_event = STIME_MAX;
+    hpet_event.event_handler = handle_hpet_broadcast;
+    spin_lock_init(&hpet_event.lock);
+}
+
+void hpet_broadcast_enter(void)
+{
+    struct hpet_event_channel *ch = &hpet_event;
+
+    cpu_set(smp_processor_id(), ch->cpumask);
+
+    spin_lock(&ch->lock);
+
+    /* reprogram if current cpu expire time is nearer */
+    if ( this_cpu(timer_deadline) < ch->next_event )
+        reprogram_hpet_evt_channel(ch, this_cpu(timer_deadline), NOW(), 1);
+
+    spin_unlock(&ch->lock);
+}
+
+void hpet_broadcast_exit(void)
+{
+    struct hpet_event_channel *ch = &hpet_event;
+    int cpu = smp_processor_id();
+
+    if ( cpu_test_and_clear(cpu, ch->cpumask) )
+        reprogram_timer(per_cpu(timer_deadline, cpu));
+}
+
+int hpet_legacy_irq_tick(void)
+{
+    if ( !hpet_event.event_handler )
+        return 0;
+    hpet_event.event_handler(&hpet_event);
+    return 1;
+}
+
+u64 hpet_setup(void)
+{
+    static u64 hpet_rate;
+    static int initialised;
+    u32 hpet_id, hpet_period, cfg;
+    int i;
+
+    if ( initialised )
+        return hpet_rate;
+    initialised = 1;
+
+    if ( hpet_address == 0 )
+        return 0;
+
+    set_fixmap_nocache(FIX_HPET_BASE, hpet_address);
+
+    hpet_id = hpet_read32(HPET_ID);
+    if ( hpet_id == 0 )
+    {
+        printk("BAD HPET vendor id.\n");
+        return 0;
+    }
+
+    /* Check for sane period (100ps <= period <= 100ns). */
+    hpet_period = hpet_read32(HPET_PERIOD);
+    if ( (hpet_period > 100000000) || (hpet_period < 100000) )
+    {
+        printk("BAD HPET period %u.\n", hpet_period);
+        return 0;
+    }
+
+    cfg = hpet_read32(HPET_CFG);
+    cfg &= ~(HPET_CFG_ENABLE | HPET_CFG_LEGACY);
+    hpet_write32(cfg, HPET_CFG);
+
+    for ( i = 0; i <= ((hpet_id >> 8) & 31); i++ )
+    {
+        cfg = hpet_read32(HPET_T0_CFG + i*0x20);
+        cfg &= ~HPET_TN_ENABLE;
+        hpet_write32(cfg & ~HPET_TN_ENABLE, HPET_T0_CFG);
+    }
+
+    cfg = hpet_read32(HPET_CFG);
+    cfg |= HPET_CFG_ENABLE;
+    hpet_write32(cfg, HPET_CFG);
+
+    hpet_rate = 1000000000000000ULL; /* 10^15 */
+    (void)do_div(hpet_rate, hpet_period);
+
+    return hpet_rate;
+}
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/hvm/hpet.c
--- a/xen/arch/x86/hvm/hpet.c   Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/hvm/hpet.c   Thu May 22 19:42:51 2008 +0900
@@ -591,3 +591,8 @@ void hpet_deinit(struct domain *d)
         kill_timer(&h->timers[i]);
 }
 
+void hpet_reset(struct domain *d)
+{
+    hpet_deinit(d);
+    hpet_init(d->vcpu[0]);
+}
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/hvm/hvm.c    Thu May 22 19:42:51 2008 +0900
@@ -2058,6 +2058,118 @@ static int hvmop_set_pci_intx_level(
     return rc;
 }
 
+void hvm_vcpu_reset_state(struct vcpu *v, uint16_t cs, uint16_t ip)
+{
+    struct domain *d = current->domain;
+    struct vcpu_guest_context *ctxt;
+    struct segment_register reg;
+
+    BUG_ON(vcpu_runnable(v));
+
+    domain_lock(d);
+
+    if ( v->is_initialised )
+        goto out;
+
+    ctxt = &v->arch.guest_context;
+    memset(ctxt, 0, sizeof(*ctxt));
+    ctxt->flags = VGCF_online;
+    ctxt->user_regs.eflags = 2;
+    ctxt->user_regs.edx = 0x00000f00;
+    ctxt->user_regs.eip = ip;
+
+    v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_ET;
+    hvm_update_guest_cr(v, 0);
+
+    v->arch.hvm_vcpu.guest_cr[2] = 0;
+    hvm_update_guest_cr(v, 2);
+
+    v->arch.hvm_vcpu.guest_cr[3] = 0;
+    hvm_update_guest_cr(v, 3);
+
+    v->arch.hvm_vcpu.guest_cr[4] = 0;
+    hvm_update_guest_cr(v, 4);
+
+    v->arch.hvm_vcpu.guest_efer = 0;
+    hvm_update_guest_efer(v);
+
+    reg.sel = cs;
+    reg.base = (uint32_t)reg.sel << 4;
+    reg.limit = 0xffff;
+    reg.attr.bytes = 0x09b;
+    hvm_set_segment_register(v, x86_seg_cs, &reg);
+
+    reg.sel = reg.base = 0;
+    reg.limit = 0xffff;
+    reg.attr.bytes = 0x093;
+    hvm_set_segment_register(v, x86_seg_ds, &reg);
+    hvm_set_segment_register(v, x86_seg_es, &reg);
+    hvm_set_segment_register(v, x86_seg_fs, &reg);
+    hvm_set_segment_register(v, x86_seg_gs, &reg);
+    hvm_set_segment_register(v, x86_seg_ss, &reg);
+
+    reg.attr.bytes = 0x82; /* LDT */
+    hvm_set_segment_register(v, x86_seg_ldtr, &reg);
+
+    reg.attr.bytes = 0x8b; /* 32-bit TSS (busy) */
+    hvm_set_segment_register(v, x86_seg_tr, &reg);
+
+    reg.attr.bytes = 0;
+    hvm_set_segment_register(v, x86_seg_gdtr, &reg);
+    hvm_set_segment_register(v, x86_seg_idtr, &reg);
+
+    /* Sync AP's TSC with BSP's. */
+    v->arch.hvm_vcpu.cache_tsc_offset =
+        v->domain->vcpu[0]->arch.hvm_vcpu.cache_tsc_offset;
+    hvm_funcs.set_tsc_offset(v, v->arch.hvm_vcpu.cache_tsc_offset);
+
+    v->arch.flags |= TF_kernel_mode;
+    v->is_initialised = 1;
+    clear_bit(_VPF_down, &v->pause_flags);
+
+ out:
+    domain_unlock(d);
+}
+
+static void hvm_s3_suspend(struct domain *d)
+{
+    struct vcpu *v;
+
+    domain_pause(d);
+    domain_lock(d);
+
+    if ( (d->vcpu[0] == NULL) ||
+         test_and_set_bool(d->arch.hvm_domain.is_s3_suspended) )
+    {
+        domain_unlock(d);
+        domain_unpause(d);
+        return;
+    }
+
+    for_each_vcpu ( d, v )
+    {
+        vlapic_reset(vcpu_vlapic(v));
+        vcpu_reset(v);
+    }
+
+    vpic_reset(d);
+    vioapic_reset(d);
+    pit_reset(d);
+    rtc_reset(d);      
+    pmtimer_reset(d);
+    hpet_reset(d);
+
+    hvm_vcpu_reset_state(d->vcpu[0], 0xf000, 0xfff0);
+
+    domain_unlock(d);
+}
+
+static void hvm_s3_resume(struct domain *d)
+{
+    if ( test_and_clear_bool(d->arch.hvm_domain.is_s3_suspended) )
+        domain_unpause(d);
+}
+
 static int hvmop_set_isa_irq_level(
     XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t) uop)
 {
@@ -2314,6 +2426,21 @@ long do_hvm_op(unsigned long op, XEN_GUE
                 }
                 domain_unpause(d);
                 break;
+            case HVM_PARAM_ACPI_S_STATE:
+                /* Privileged domains only, as we must domain_pause(d). */
+                rc = -EPERM;
+                if ( !IS_PRIV_FOR(current->domain, d) )
+                    break;
+
+                rc = 0;
+                if ( a.value == 3 )
+                    hvm_s3_suspend(d);
+                else if ( a.value == 0 )
+                    hvm_s3_resume(d);
+                else
+                    rc = -EINVAL;
+
+                break;
             }
 
             if ( rc == 0 )
@@ -2321,7 +2448,15 @@ long do_hvm_op(unsigned long op, XEN_GUE
         }
         else
         {
-            a.value = d->arch.hvm_domain.params[a.index];
+            switch ( a.index )
+            {
+            case HVM_PARAM_ACPI_S_STATE:
+                a.value = d->arch.hvm_domain.is_s3_suspended ? 3 : 0;
+                break;
+            default:
+                a.value = d->arch.hvm_domain.params[a.index];
+                break;
+            }
             rc = copy_to_guest(arg, &a, 1) ? -EFAULT : 0;
         }
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/hvm/i8254.c
--- a/xen/arch/x86/hvm/i8254.c  Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/hvm/i8254.c  Thu May 22 19:42:51 2008 +0900
@@ -446,22 +446,16 @@ static int pit_load(struct domain *d, hv
 
 HVM_REGISTER_SAVE_RESTORE(PIT, pit_save, pit_load, 1, HVMSR_PER_DOM);
 
-void pit_init(struct vcpu *v, unsigned long cpu_khz)
-{
-    PITState *pit = vcpu_vpit(v);
+void pit_reset(struct domain *d)
+{
+    PITState *pit = domain_vpit(d);
     struct hvm_hw_pit_channel *s;
     int i;
 
-    spin_lock_init(&pit->lock);
-
-    /* Some sub-functions assert that they are called with the lock held. */
-    spin_lock(&pit->lock);
-
+    destroy_periodic_time(&pit->pt0);
     pit->pt0.source = PTSRC_isa;
 
-    register_portio_handler(v->domain, PIT_BASE, 4, handle_pit_io);
-    register_portio_handler(v->domain, 0x61, 1, handle_speaker_io);
-    ticks_per_sec(v) = cpu_khz * (int64_t)1000;
+    spin_lock(&pit->lock);
 
     for ( i = 0; i < 3; i++ )
     {
@@ -472,6 +466,20 @@ void pit_init(struct vcpu *v, unsigned l
     }
 
     spin_unlock(&pit->lock);
+}
+
+void pit_init(struct vcpu *v, unsigned long cpu_khz)
+{
+    PITState *pit = vcpu_vpit(v);
+
+    spin_lock_init(&pit->lock);
+
+    register_portio_handler(v->domain, PIT_BASE, 4, handle_pit_io);
+    register_portio_handler(v->domain, 0x61, 1, handle_speaker_io);
+
+    ticks_per_sec(v) = cpu_khz * (int64_t)1000;
+
+    pit_reset(v->domain);
 }
 
 void pit_deinit(struct domain *d)
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/hvm/pmtimer.c
--- a/xen/arch/x86/hvm/pmtimer.c        Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/hvm/pmtimer.c        Thu May 22 19:42:51 2008 +0900
@@ -276,3 +276,9 @@ void pmtimer_deinit(struct domain *d)
     PMTState *s = &d->arch.hvm_domain.pl_time.vpmt;
     kill_timer(&s->timer);
 }
+
+void pmtimer_reset(struct domain *d)
+{
+    /* Reset the counter. */
+    d->arch.hvm_domain.pl_time.vpmt.pm.tmr_val = 0;
+}
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/hvm/rtc.c
--- a/xen/arch/x86/hvm/rtc.c    Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/hvm/rtc.c    Thu May 22 19:42:51 2008 +0900
@@ -511,3 +511,9 @@ void rtc_deinit(struct domain *d)
     kill_timer(&s->second_timer);
     kill_timer(&s->second_timer2);
 }
+
+void rtc_reset(struct domain *d)
+{
+    RTCState *s = domain_vrtc(d);
+    destroy_periodic_time(&s->pt);
+}
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/hvm/vioapic.c
--- a/xen/arch/x86/hvm/vioapic.c        Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/hvm/vioapic.c        Thu May 22 19:42:51 2008 +0900
@@ -494,21 +494,25 @@ static int ioapic_load(struct domain *d,
 
 HVM_REGISTER_SAVE_RESTORE(IOAPIC, ioapic_save, ioapic_load, 1, HVMSR_PER_DOM);
 
-int vioapic_init(struct domain *d)
-{
-    struct hvm_vioapic *vioapic;
+void vioapic_reset(struct domain *d)
+{
+    struct hvm_vioapic *vioapic = d->arch.hvm_domain.vioapic;
     int i;
-
-    vioapic = d->arch.hvm_domain.vioapic = xmalloc(struct hvm_vioapic);
-    if ( vioapic == NULL )
-        return -ENOMEM;
-
-    vioapic->domain = d;
 
     memset(&vioapic->hvm_hw_vioapic, 0, sizeof(vioapic->hvm_hw_vioapic));
     for ( i = 0; i < VIOAPIC_NUM_PINS; i++ )
         vioapic->hvm_hw_vioapic.redirtbl[i].fields.mask = 1;
     vioapic->hvm_hw_vioapic.base_address = VIOAPIC_DEFAULT_BASE_ADDRESS;
+}
+
+int vioapic_init(struct domain *d)
+{
+    if ( (d->arch.hvm_domain.vioapic == NULL) &&
+         ((d->arch.hvm_domain.vioapic = xmalloc(struct hvm_vioapic)) == NULL) )
+        return -ENOMEM;
+
+    d->arch.hvm_domain.vioapic->domain = d;
+    vioapic_reset(d);
 
     return 0;
 }
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/hvm/vlapic.c
--- a/xen/arch/x86/hvm/vlapic.c Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/hvm/vlapic.c Thu May 22 19:42:51 2008 +0900
@@ -298,10 +298,6 @@ static int vlapic_accept_init(struct vcp
 
 static int vlapic_accept_sipi(struct vcpu *v, int trampoline_vector)
 {
-    struct domain *d = current->domain;
-    struct vcpu_guest_context *ctxt;
-    struct segment_register reg;
-
     /* If the VCPU is not on its way down we have nothing to do. */
     if ( !test_bit(_VPF_down, &v->pause_flags) )
         return X86EMUL_OKAY;
@@ -309,68 +305,10 @@ static int vlapic_accept_sipi(struct vcp
     if ( !vlapic_vcpu_pause_async(v) )
         return X86EMUL_RETRY;
 
-    domain_lock(d);
-
-    if ( v->is_initialised )
-        goto out;
-
-    ctxt = &v->arch.guest_context;
-    memset(ctxt, 0, sizeof(*ctxt));
-    ctxt->flags = VGCF_online;
-    ctxt->user_regs.eflags = 2;
-
-    v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_ET;
-    hvm_update_guest_cr(v, 0);
-
-    v->arch.hvm_vcpu.guest_cr[2] = 0;
-    hvm_update_guest_cr(v, 2);
-
-    v->arch.hvm_vcpu.guest_cr[3] = 0;
-    hvm_update_guest_cr(v, 3);
-
-    v->arch.hvm_vcpu.guest_cr[4] = 0;
-    hvm_update_guest_cr(v, 4);
-
-    v->arch.hvm_vcpu.guest_efer = 0;
-    hvm_update_guest_efer(v);
-
-    reg.sel = trampoline_vector << 8;
-    reg.base = (uint32_t)reg.sel << 4;
-    reg.limit = 0xffff;
-    reg.attr.bytes = 0x89b;
-    hvm_set_segment_register(v, x86_seg_cs, &reg);
-
-    reg.sel = reg.base = 0;
-    reg.limit = 0xffff;
-    reg.attr.bytes = 0x893;
-    hvm_set_segment_register(v, x86_seg_ds, &reg);
-    hvm_set_segment_register(v, x86_seg_es, &reg);
-    hvm_set_segment_register(v, x86_seg_fs, &reg);
-    hvm_set_segment_register(v, x86_seg_gs, &reg);
-    hvm_set_segment_register(v, x86_seg_ss, &reg);
-
-    reg.attr.bytes = 0x82; /* LDT */
-    hvm_set_segment_register(v, x86_seg_ldtr, &reg);
-
-    reg.attr.bytes = 0x8b; /* 32-bit TSS (busy) */
-    hvm_set_segment_register(v, x86_seg_tr, &reg);
-
-    reg.attr.bytes = 0;
-    hvm_set_segment_register(v, x86_seg_gdtr, &reg);
-    hvm_set_segment_register(v, x86_seg_idtr, &reg);
-
-    /* Sync AP's TSC with BSP's. */
-    v->arch.hvm_vcpu.cache_tsc_offset =
-        v->domain->vcpu[0]->arch.hvm_vcpu.cache_tsc_offset;
-    hvm_funcs.set_tsc_offset(v, v->arch.hvm_vcpu.cache_tsc_offset);
-
-    v->arch.flags |= TF_kernel_mode;
-    v->is_initialised = 1;
-    clear_bit(_VPF_down, &v->pause_flags);
-
- out:
-    domain_unlock(d);
+    hvm_vcpu_reset_state(v, trampoline_vector << 8, 0);
+
     vcpu_unpause(v);
+
     return X86EMUL_OKAY;
 }
 
@@ -1028,23 +966,26 @@ int vlapic_init(struct vcpu *v)
     if ( boot_cpu_data.x86_vendor == X86_VENDOR_INTEL )
         memflags |= MEMF_bits(32);
 #endif
-
-    vlapic->regs_page = alloc_domheap_page(NULL, memflags);
-    if ( vlapic->regs_page == NULL )
-    {
-        dprintk(XENLOG_ERR, "alloc vlapic regs error: %d/%d\n",
-                v->domain->domain_id, v->vcpu_id);
-        return -ENOMEM;
-    }
-
-    vlapic->regs = map_domain_page_global(page_to_mfn(vlapic->regs_page));
-    if ( vlapic->regs == NULL )
-    {
-        dprintk(XENLOG_ERR, "map vlapic regs error: %d/%d\n",
-                v->domain->domain_id, v->vcpu_id);
-        return -ENOMEM;
-    }
-
+    if (vlapic->regs_page == NULL)
+    {
+        vlapic->regs_page = alloc_domheap_page(NULL, memflags);
+        if ( vlapic->regs_page == NULL )
+        {
+            dprintk(XENLOG_ERR, "alloc vlapic regs error: %d/%d\n",
+                    v->domain->domain_id, v->vcpu_id);
+            return -ENOMEM;
+        }
+    }
+    if (vlapic->regs == NULL) 
+    {
+        vlapic->regs = map_domain_page_global(page_to_mfn(vlapic->regs_page));
+        if ( vlapic->regs == NULL )
+        {
+            dprintk(XENLOG_ERR, "map vlapic regs error: %d/%d\n",
+                    v->domain->domain_id, v->vcpu_id);
+            return -ENOMEM;
+        }
+    }
     clear_page(vlapic->regs);
 
     vlapic_reset(vlapic);
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/hvm/vpic.c
--- a/xen/arch/x86/hvm/vpic.c   Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/hvm/vpic.c   Thu May 22 19:42:51 2008 +0900
@@ -395,7 +395,7 @@ static int vpic_load(struct domain *d, h
 
 HVM_REGISTER_SAVE_RESTORE(PIC, vpic_save, vpic_load, 2, HVMSR_PER_DOM);
 
-void vpic_init(struct domain *d)
+void vpic_reset(struct domain *d)
 {
     struct hvm_hw_vpic *vpic;
 
@@ -404,13 +404,20 @@ void vpic_init(struct domain *d)
     memset(vpic, 0, sizeof(*vpic));
     vpic->is_master = 1;
     vpic->elcr      = 1 << 2;
-    register_portio_handler(d, 0x20, 2, vpic_intercept_pic_io);
-    register_portio_handler(d, 0x4d0, 1, vpic_intercept_elcr_io);
 
     /* Slave PIC. */
     vpic++;
     memset(vpic, 0, sizeof(*vpic));
+}
+
+void vpic_init(struct domain *d)
+{
+    vpic_reset(d);
+
+    register_portio_handler(d, 0x20, 2, vpic_intercept_pic_io);
     register_portio_handler(d, 0xa0, 2, vpic_intercept_pic_io);
+
+    register_portio_handler(d, 0x4d0, 1, vpic_intercept_elcr_io);
     register_portio_handler(d, 0x4d1, 1, vpic_intercept_elcr_io);
 }
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/mm/hap/p2m-ept.c
--- a/xen/arch/x86/mm/hap/p2m-ept.c     Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/mm/hap/p2m-ept.c     Thu May 22 19:42:51 2008 +0900
@@ -49,10 +49,35 @@ static void ept_p2m_type_to_flags(ept_en
 
 #define GUEST_TABLE_NORMAL_PAGE 1
 #define GUEST_TABLE_SUPER_PAGE  2
+#define GUEST_TABLE_SPLIT_PAGE  3
+
+static int ept_set_middle_entry(struct domain *d, ept_entry_t *ept_entry)
+{
+    struct page_info *pg;
+
+    pg = d->arch.p2m->alloc_page(d);
+    if ( pg == NULL )
+        return 0;
+
+    pg->count_info = 1;
+    pg->u.inuse.type_info = 1 | PGT_validated;
+    list_add_tail(&pg->list, &d->arch.p2m->pages);
+
+    ept_entry->emt = 0;
+    ept_entry->sp_avail = 0;
+    ept_entry->avail1 = 0;
+    ept_entry->mfn = page_to_mfn(pg);
+    ept_entry->rsvd = 0;
+    ept_entry->avail2 = 0;
+    /* last step */
+    ept_entry->r = ept_entry->w = ept_entry->x = 1;
+
+    return 1;
+}
 
 static int ept_next_level(struct domain *d, bool_t read_only,
                           ept_entry_t **table, unsigned long *gfn_remainder,
-                          u32 shift)
+                          u32 shift, int order)
 {
     ept_entry_t *ept_entry, *next;
     u32 index;
@@ -63,27 +88,11 @@ static int ept_next_level(struct domain 
 
     if ( !(ept_entry->epte & 0x7) )
     {
-        struct page_info *pg;
-
         if ( read_only )
             return 0;
 
-        pg = d->arch.p2m->alloc_page(d);
-        if ( pg == NULL )
+        if ( !ept_set_middle_entry(d, ept_entry) )
             return 0;
-
-        pg->count_info = 1;
-        pg->u.inuse.type_info = 1 | PGT_validated;
-        list_add_tail(&pg->list, &d->arch.p2m->pages);
-
-        ept_entry->emt = 0;
-        ept_entry->sp_avail = 0;
-        ept_entry->avail1 = 0;
-        ept_entry->mfn = page_to_mfn(pg);
-        ept_entry->rsvd = 0;
-        ept_entry->avail2 = 0;
-        /* last step */
-        ept_entry->r = ept_entry->w = ept_entry->x = 1;
     }
 
     if ( !ept_entry->sp_avail )
@@ -95,7 +104,12 @@ static int ept_next_level(struct domain 
         return GUEST_TABLE_NORMAL_PAGE;
     }
     else
-        return GUEST_TABLE_SUPER_PAGE;
+    {
+        if ( order == shift || read_only )
+            return GUEST_TABLE_SUPER_PAGE;
+        else
+            return GUEST_TABLE_SPLIT_PAGE;
+    }
 }
 
 static int
@@ -109,7 +123,9 @@ ept_set_entry(struct domain *d, unsigned
     int i, rv = 0, ret = 0;
     int walk_level = order / EPT_TABLE_ORDER;
 
-    /* Should check if gfn obeys GAW here */
+    /* we only support 4k and 2m pages now */
+
+    BUG_ON(order && order != EPT_TABLE_ORDER);
 
     if (  order != 0 )
         if ( (gfn & ((1UL << order) - 1)) )
@@ -122,10 +138,10 @@ ept_set_entry(struct domain *d, unsigned
     for ( i = EPT_DEFAULT_GAW; i > walk_level; i-- )
     {
         ret = ept_next_level(d, 0, &table, &gfn_remainder,
-          i * EPT_TABLE_ORDER);
+          i * EPT_TABLE_ORDER, order);
         if ( !ret )
             goto out;
-        else if ( ret == GUEST_TABLE_SUPER_PAGE )
+        else if ( ret != GUEST_TABLE_NORMAL_PAGE )
             break;
     }
 
@@ -135,35 +151,87 @@ ept_set_entry(struct domain *d, unsigned
 
     ept_entry = table + index;
 
-    if ( mfn_valid(mfn_x(mfn)) || (p2mt == p2m_mmio_direct) )
-    {
-        /* Track the highest gfn for which we have ever had a valid mapping */
-        if ( gfn > d->arch.p2m->max_mapped_pfn )
-            d->arch.p2m->max_mapped_pfn = gfn;
-
-        ept_entry->emt = EPT_DEFAULT_MT;
-        ept_entry->sp_avail = walk_level ? 1 : 0;
-
-        if ( ret == GUEST_TABLE_SUPER_PAGE )
-        {
-            ept_entry->mfn = mfn_x(mfn) - offset;
-            if ( ept_entry->avail1 == p2m_ram_logdirty &&
-              p2mt == p2m_ram_rw )
-                for ( i = 0; i < 512; i++ )
-                    paging_mark_dirty(d, mfn_x(mfn)-offset+i);
+    if ( ret != GUEST_TABLE_SPLIT_PAGE )
+    {
+        if ( mfn_valid(mfn_x(mfn)) || (p2mt == p2m_mmio_direct) )
+        {
+            /* Track the highest gfn for which we have ever had a valid 
mapping */
+            if ( gfn > d->arch.p2m->max_mapped_pfn )
+                d->arch.p2m->max_mapped_pfn = gfn;
+
+            ept_entry->emt = EPT_DEFAULT_MT;
+            ept_entry->sp_avail = walk_level ? 1 : 0;
+
+            if ( ret == GUEST_TABLE_SUPER_PAGE )
+            {
+                ept_entry->mfn = mfn_x(mfn) - offset;
+                if ( ept_entry->avail1 == p2m_ram_logdirty &&
+                  p2mt == p2m_ram_rw )
+                    for ( i = 0; i < 512; i++ )
+                        paging_mark_dirty(d, mfn_x(mfn)-offset+i);
+            }
+            else
+                ept_entry->mfn = mfn_x(mfn);
+
+            ept_entry->avail1 = p2mt;
+            ept_entry->rsvd = 0;
+            ept_entry->avail2 = 0;
+            /* last step */
+            ept_entry->r = ept_entry->w = ept_entry->x = 1;
+            ept_p2m_type_to_flags(ept_entry, p2mt);
         }
         else
-            ept_entry->mfn = mfn_x(mfn);
-
-        ept_entry->avail1 = p2mt;
-        ept_entry->rsvd = 0;
-        ept_entry->avail2 = 0;
-        /* last step */
-        ept_entry->r = ept_entry->w = ept_entry->x = 1;
-        ept_p2m_type_to_flags(ept_entry, p2mt);
+            ept_entry->epte = 0;
     }
     else
-        ept_entry->epte = 0;
+    {
+        /* It's super page before, now set one of the 4k pages, so
+         * we should split the 2m page to 4k pages now.
+         */
+
+        ept_entry_t *split_table = NULL;
+        ept_entry_t *split_ept_entry = NULL;
+        unsigned long split_mfn = ept_entry->mfn;
+        p2m_type_t split_p2mt = ept_entry->avail1;
+
+        /* alloc new page for new ept middle level entry which is
+         * before a leaf super entry
+         */
+
+        if ( !ept_set_middle_entry(d, ept_entry) )
+            goto out;
+
+        /* split the super page before to 4k pages */
+
+        split_table = map_domain_page(ept_entry->mfn);
+
+        for ( i = 0; i < 512; i++ )
+        {
+            split_ept_entry = split_table + i;
+            split_ept_entry->emt = EPT_DEFAULT_MT;
+            split_ept_entry->sp_avail =  0;
+
+            split_ept_entry->mfn = split_mfn+i;
+
+            split_ept_entry->avail1 = split_p2mt;
+            split_ept_entry->rsvd = 0;
+            split_ept_entry->avail2 = 0;
+            /* last step */
+            split_ept_entry->r = split_ept_entry->w = split_ept_entry->x = 1;
+            ept_p2m_type_to_flags(split_ept_entry, split_p2mt);
+        }
+
+        /* Set the destinated 4k page as normal */
+
+        offset = gfn & ((1 << EPT_TABLE_ORDER) - 1);
+        split_ept_entry = split_table + offset;
+        split_ept_entry->mfn = mfn_x(mfn);
+        split_ept_entry->avail1 = p2mt;
+        ept_p2m_type_to_flags(split_ept_entry, p2mt);
+
+        unmap_domain_page(split_table);
+
+    }
 
     /* Success */
     rv = 1;
@@ -179,22 +247,22 @@ out:
     {
         if ( p2mt == p2m_ram_rw )
         {
-            if ( ret == GUEST_TABLE_SUPER_PAGE )
+            if ( order == EPT_TABLE_ORDER )
             {
                 for ( i = 0; i < 512; i++ )
                     iommu_map_page(d, gfn-offset+i, mfn_x(mfn)-offset+i);
             }
-            else if ( ret )
+            else if ( !order )
                 iommu_map_page(d, gfn, mfn_x(mfn));
         }
         else
         {
-            if ( ret == GUEST_TABLE_SUPER_PAGE )
+            if ( order == EPT_TABLE_ORDER )
             {
                 for ( i = 0; i < 512; i++ )
                     iommu_unmap_page(d, gfn-offset+i);
             }
-            else if ( ret )
+            else if ( !order )
                 iommu_unmap_page(d, gfn);
         }
     }
@@ -230,7 +298,7 @@ static mfn_t ept_get_entry(struct domain
     for ( i = EPT_DEFAULT_GAW; i > 0; i-- )
     {
         ret = ept_next_level(d, 1, &table, &gfn_remainder,
-                             i * EPT_TABLE_ORDER);
+                             i * EPT_TABLE_ORDER, 0);
         if ( !ret )
             goto out;
         else if ( ret == GUEST_TABLE_SUPER_PAGE )
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c     Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/mm/p2m.c     Thu May 22 19:42:51 2008 +0900
@@ -250,7 +250,7 @@ p2m_set_entry(struct domain *d, unsigned
     // XXX -- this might be able to be faster iff current->domain == d
     mfn_t table_mfn = pagetable_get_mfn(d->arch.phys_table);
     void *table =map_domain_page(mfn_x(table_mfn));
-    unsigned long gfn_remainder = gfn;
+    unsigned long i, gfn_remainder = gfn;
     l1_pgentry_t *p2m_entry;
     l1_pgentry_t entry_content;
     l2_pgentry_t l2e_content;
@@ -328,9 +328,11 @@ p2m_set_entry(struct domain *d, unsigned
     if ( iommu_enabled && is_hvm_domain(d) )
     {
         if ( p2mt == p2m_ram_rw )
-            iommu_map_page(d, gfn, mfn_x(mfn));
+            for ( i = 0; i < (1UL << page_order); i++ )
+                iommu_map_page(d, gfn+i, mfn_x(mfn)+i );
         else
-            iommu_unmap_page(d, gfn);
+            for ( int i = 0; i < (1UL << page_order); i++ )
+                iommu_unmap_page(d, gfn+i);
     }
 
     /* Success */
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/time.c
--- a/xen/arch/x86/time.c       Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/time.c       Thu May 22 19:42:51 2008 +0900
@@ -38,7 +38,6 @@ string_param("clocksource", opt_clocksou
 #define EPOCH MILLISECS(1000)
 
 unsigned long cpu_khz;  /* CPU clock frequency in kHz. */
-unsigned long hpet_address;
 DEFINE_SPINLOCK(rtc_lock);
 unsigned long pit0_ticks;
 static u32 wc_sec, wc_nsec; /* UTC time at last 'time update'. */
@@ -68,7 +67,8 @@ struct platform_timesource {
 
 static DEFINE_PER_CPU(struct cpu_time, cpu_time);
 
-static u8 tsc_invariant=0;  /* TSC is invariant upon C state entry */
+/* TSC is invariant on C state entry? */
+static bool_t tsc_invariant;
 
 /*
  * We simulate a 32-bit platform timer from the 16-bit PIT ch2 counter.
@@ -151,6 +151,9 @@ static void timer_interrupt(int irq, voi
 {
     ASSERT(local_irq_is_enabled());
 
+    if ( hpet_legacy_irq_tick() )
+        return;
+
     /* Only for start-of-day interruopt tests in io_apic.c. */
     (*(volatile unsigned long *)&pit0_ticks)++;
 
@@ -347,47 +350,10 @@ static u32 read_hpet_count(void)
 
 static int init_hpet(struct platform_timesource *pts)
 {
-    u64 hpet_rate;
-    u32 hpet_id, hpet_period, cfg;
-    int i;
-
-    if ( hpet_address == 0 )
+    u64 hpet_rate = hpet_setup();
+
+    if ( hpet_rate == 0 )
         return 0;
-
-    set_fixmap_nocache(FIX_HPET_BASE, hpet_address);
-
-    hpet_id = hpet_read32(HPET_ID);
-    if ( hpet_id == 0 )
-    {
-        printk("BAD HPET vendor id.\n");
-        return 0;
-    }
-
-    /* Check for sane period (100ps <= period <= 100ns). */
-    hpet_period = hpet_read32(HPET_PERIOD);
-    if ( (hpet_period > 100000000) || (hpet_period < 100000) )
-    {
-        printk("BAD HPET period %u.\n", hpet_period);
-        return 0;
-    }
-
-    cfg = hpet_read32(HPET_CFG);
-    cfg &= ~(HPET_CFG_ENABLE | HPET_CFG_LEGACY);
-    hpet_write32(cfg, HPET_CFG);
-
-    for ( i = 0; i <= ((hpet_id >> 8) & 31); i++ )
-    {
-        cfg = hpet_read32(HPET_T0_CFG + i*0x20);
-        cfg &= ~HPET_TN_ENABLE;
-        hpet_write32(cfg & ~HPET_TN_ENABLE, HPET_T0_CFG);
-    }
-
-    cfg = hpet_read32(HPET_CFG);
-    cfg |= HPET_CFG_ENABLE;
-    hpet_write32(cfg, HPET_CFG);
-
-    hpet_rate = 1000000000000000ULL; /* 10^15 */
-    (void)do_div(hpet_rate, hpet_period);
 
     pts->name = "HPET";
     pts->frequency = hpet_rate;
@@ -1041,7 +1007,14 @@ static int __init disable_pit_irq(void)
         outb_p(0x30, PIT_MODE);
         outb_p(0, PIT_CH0);
         outb_p(0, PIT_CH0);
-    }
+
+        /*
+         * If we do not rely on PIT CH0 then we can use HPET for one-shot
+         * timer emulation when entering deep C states.
+         */
+        hpet_broadcast_init();
+    }
+
     return 0;
 }
 __initcall(disable_pit_irq);
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/x86_32/entry.S
--- a/xen/arch/x86/x86_32/entry.S       Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/x86_32/entry.S       Thu May 22 19:42:51 2008 +0900
@@ -197,13 +197,12 @@ 1:      sti
 #define SHADOW_BYTES 24 /* 6 shadow parameters */
 #endif
         cmpb  $0,tb_init_done
-        je    tracing_off
+        je    1f
         call  trace_hypercall
         /* Now restore all the registers that trace_hypercall clobbered */
         movl  UREGS_eax+SHADOW_BYTES(%esp),%eax /* Hypercall # */
 #undef SHADOW_BYTES
-tracing_off:
-        call *hypercall_table(,%eax,4)
+1:      call *hypercall_table(,%eax,4)
         addl  $24,%esp     # Discard the shadow parameters
 #ifndef NDEBUG
         /* Deliberately corrupt real parameter regs used by this hypercall. */
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/x86_64/compat/entry.S
--- a/xen/arch/x86/x86_64/compat/entry.S        Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/x86_64/compat/entry.S        Thu May 22 19:42:51 2008 +0900
@@ -59,7 +59,7 @@ ENTRY(compat_hypercall)
 #define SHADOW_BYTES 0  /* No on-stack shadow state */
 #endif
         cmpb  $0,tb_init_done(%rip)
-        je    compat_tracing_off
+        je    1f
         call  trace_hypercall
         /* Now restore all the registers that trace_hypercall clobbered */
         movl  UREGS_rax+SHADOW_BYTES(%rsp),%eax   /* Hypercall #  */
@@ -70,8 +70,7 @@ ENTRY(compat_hypercall)
         movl  UREGS_rdi+SHADOW_BYTES(%rsp),%r8d   /* Arg 5        */
         movl  UREGS_rbp+SHADOW_BYTES(%rsp),%r9d   /* Arg 6        */
 #undef SHADOW_BYTES
-compat_tracing_off:
-        leaq  compat_hypercall_table(%rip),%r10
+1:      leaq  compat_hypercall_table(%rip),%r10
         PERFC_INCR(PERFC_hypercalls, %rax, %rbx)
         callq *(%r10,%rax,8)
 #ifndef NDEBUG
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/arch/x86/x86_64/entry.S
--- a/xen/arch/x86/x86_64/entry.S       Tue May 20 18:54:09 2008 +0900
+++ b/xen/arch/x86/x86_64/entry.S       Thu May 22 19:42:51 2008 +0900
@@ -163,7 +163,7 @@ ENTRY(syscall_enter)
 #define SHADOW_BYTES 0  /* No on-stack shadow state */
 #endif
         cmpb  $0,tb_init_done(%rip)
-        je    tracing_off
+        je    1f
         call  trace_hypercall
         /* Now restore all the registers that trace_hypercall clobbered */
         movq  UREGS_rax+SHADOW_BYTES(%rsp),%rax   /* Hypercall #  */
@@ -174,8 +174,7 @@ ENTRY(syscall_enter)
         movq  UREGS_rdi+SHADOW_BYTES(%rsp),%r8    /* Arg 5        */
         movq  UREGS_rbp+SHADOW_BYTES(%rsp),%r9    /* Arg 6        */
 #undef SHADOW_BYTES
-tracing_off:
-        leaq  hypercall_table(%rip),%r10
+1:      leaq  hypercall_table(%rip),%r10
         PERFC_INCR(PERFC_hypercalls, %rax, %rbx)
         callq *(%r10,%rax,8)
 #ifndef NDEBUG
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/common/domain.c
--- a/xen/common/domain.c       Tue May 20 18:54:09 2008 +0900
+++ b/xen/common/domain.c       Thu May 22 19:42:51 2008 +0900
@@ -633,17 +633,14 @@ int boot_vcpu(struct domain *d, int vcpu
     return arch_set_info_guest(v, ctxt);
 }
 
-int vcpu_reset(struct vcpu *v)
+void vcpu_reset(struct vcpu *v)
 {
     struct domain *d = v->domain;
-    int rc;
 
     domain_pause(d);
     domain_lock(d);
 
-    rc = arch_vcpu_reset(v);
-    if ( rc != 0 )
-        goto out;
+    arch_vcpu_reset(v);
 
     set_bit(_VPF_down, &v->pause_flags);
 
@@ -655,11 +652,8 @@ int vcpu_reset(struct vcpu *v)
     v->nmi_masked      = 0;
     clear_bit(_VPF_blocked, &v->pause_flags);
 
- out:
     domain_unlock(v->domain);
     domain_unpause(d);
-
-    return rc;
 }
 
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/common/domctl.c
--- a/xen/common/domctl.c       Tue May 20 18:54:09 2008 +0900
+++ b/xen/common/domctl.c       Thu May 22 19:42:51 2008 +0900
@@ -218,7 +218,8 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
 
         if ( guest_handle_is_null(op->u.vcpucontext.ctxt) )
         {
-            ret = vcpu_reset(v);
+            vcpu_reset(v);
+            ret = 0;
             goto svc_out;
         }
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/common/timer.c
--- a/xen/common/timer.c        Tue May 20 18:54:09 2008 +0900
+++ b/xen/common/timer.c        Thu May 22 19:42:51 2008 +0900
@@ -35,7 +35,7 @@ struct timers {
 
 static DEFINE_PER_CPU(struct timers, timers);
 
-extern int reprogram_timer(s_time_t timeout);
+DEFINE_PER_CPU(s_time_t, timer_deadline);
 
 /****************************************************************************
  * HEAP OPERATIONS.
@@ -323,8 +323,10 @@ static void timer_softirq_action(void)
         }
 
         ts->running = NULL;
-    }
-    while ( !reprogram_timer(GET_HEAP_SIZE(heap) ? heap[1]->expires : 0) );
+
+        this_cpu(timer_deadline) = GET_HEAP_SIZE(heap) ? heap[1]->expires : 0;
+    }
+    while ( !reprogram_timer(this_cpu(timer_deadline)) );
 
     spin_unlock_irq(&ts->lock);
 }
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/asm-x86/hpet.h
--- a/xen/include/asm-x86/hpet.h        Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/asm-x86/hpet.h        Thu May 22 19:42:51 2008 +0900
@@ -49,4 +49,24 @@
 #define hpet_write32(y,x) \
     (*(volatile u32 *)(fix_to_virt(FIX_HPET_BASE) + (x)) = (y))
 
+/*
+ * Detect and initialise HPET hardware: return counter update frequency.
+ * Return value is zero if HPET is unavailable.
+ */
+u64 hpet_setup(void);
+
+/*
+ * Callback from legacy timer (PIT channel 0) IRQ handler.
+ * Returns 1 if tick originated from HPET; else 0.
+ */
+int hpet_legacy_irq_tick(void);
+
+/*
+ * Temporarily use an HPET event counter for timer interrupt handling,
+ * rather than using the LAPIC timer. Used for Cx state entry.
+ */
+void hpet_broadcast_init(void);
+void hpet_broadcast_enter(void);
+void hpet_broadcast_exit(void);
+
 #endif /* __X86_HPET_H__ */
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/asm-x86/hvm/domain.h
--- a/xen/include/asm-x86/hvm/domain.h  Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/asm-x86/hvm/domain.h  Thu May 22 19:42:51 2008 +0900
@@ -76,6 +76,7 @@ struct hvm_domain {
 
     bool_t                 hap_enabled;
     bool_t                 qemu_mapcache_invalidate;
+    bool_t                 is_s3_suspended;
 
     union {
         struct vmx_domain vmx;
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h     Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/asm-x86/hvm/hvm.h     Thu May 22 19:42:51 2008 +0900
@@ -141,6 +141,7 @@ void hvm_vcpu_down(struct vcpu *v);
 void hvm_vcpu_down(struct vcpu *v);
 int hvm_vcpu_cacheattr_init(struct vcpu *v);
 void hvm_vcpu_cacheattr_destroy(struct vcpu *v);
+void hvm_vcpu_reset_state(struct vcpu *v, uint16_t cs, uint16_t ip);
 
 void hvm_send_assist_req(struct vcpu *v);
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/asm-x86/hvm/vioapic.h
--- a/xen/include/asm-x86/hvm/vioapic.h Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/asm-x86/hvm/vioapic.h Thu May 22 19:42:51 2008 +0900
@@ -63,6 +63,7 @@ struct hvm_vioapic {
 
 int vioapic_init(struct domain *d);
 void vioapic_deinit(struct domain *d);
+void vioapic_reset(struct domain *d);
 void vioapic_irq_positive_edge(struct domain *d, unsigned int irq);
 void vioapic_update_EOI(struct domain *d, int vector);
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/asm-x86/hvm/vpic.h
--- a/xen/include/asm-x86/hvm/vpic.h    Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/asm-x86/hvm/vpic.h    Thu May 22 19:42:51 2008 +0900
@@ -32,6 +32,7 @@ void vpic_irq_positive_edge(struct domai
 void vpic_irq_positive_edge(struct domain *d, int irq);
 void vpic_irq_negative_edge(struct domain *d, int irq);
 void vpic_init(struct domain *d);
+void vpic_reset(struct domain *d);
 int vpic_ack_pending_irq(struct vcpu *v);
 int is_periodic_irq(struct vcpu *v, int irq, int type);
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/asm-x86/hvm/vpt.h
--- a/xen/include/asm-x86/hvm/vpt.h     Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/asm-x86/hvm/vpt.h     Thu May 22 19:42:51 2008 +0900
@@ -166,17 +166,23 @@ void destroy_periodic_time(struct period
 void destroy_periodic_time(struct periodic_time *pt);
 
 int pv_pit_handler(int port, int data, int write);
+void pit_reset(struct domain *d);
+
 void pit_init(struct vcpu *v, unsigned long cpu_khz);
 void pit_stop_channel0_irq(PITState * pit);
 void pit_deinit(struct domain *d);
 void rtc_init(struct vcpu *v, int base);
 void rtc_migrate_timers(struct vcpu *v);
 void rtc_deinit(struct domain *d);
+void rtc_reset(struct domain *d);
+
 void pmtimer_init(struct vcpu *v);
 void pmtimer_deinit(struct domain *d);
+void pmtimer_reset(struct domain *d);
 
 void hpet_migrate_timers(struct vcpu *v);
 void hpet_init(struct vcpu *v);
 void hpet_deinit(struct domain *d);
+void hpet_reset(struct domain *d);
 
 #endif /* __ASM_X86_HVM_VPT_H__ */
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/public/hvm/params.h
--- a/xen/include/public/hvm/params.h   Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/public/hvm/params.h   Thu May 22 19:42:51 2008 +0900
@@ -90,6 +90,9 @@
 /* Device Model domain, defaults to 0. */
 #define HVM_PARAM_DM_DOMAIN    13
 
-#define HVM_NR_PARAMS          14
+/* ACPI S state: currently support S0 and S3 on x86. */
+#define HVM_PARAM_ACPI_S_STATE 14
+
+#define HVM_NR_PARAMS          15
 
 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/public/sysctl.h
--- a/xen/include/public/sysctl.h       Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/public/sysctl.h       Thu May 22 19:42:51 2008 +0900
@@ -233,15 +233,30 @@ typedef struct pm_px_stat pm_px_stat_t;
 typedef struct pm_px_stat pm_px_stat_t;
 DEFINE_XEN_GUEST_HANDLE(pm_px_stat_t);
 
+struct pm_cx_stat {
+    uint32_t nr;    /* entry nr in triggers & residencies, including C0 */
+    uint32_t last;  /* last Cx state */
+    uint64_aligned_t idle_time;                 /* idle time from boot */
+    XEN_GUEST_HANDLE_64(uint64) triggers;    /* Cx trigger counts */
+    XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
+};
+
 struct xen_sysctl_get_pmstat {
-#define PMSTAT_get_max_px   0x11
-#define PMSTAT_get_pxstat   0x12
-#define PMSTAT_reset_pxstat 0x13
+#define PMSTAT_CATEGORY_MASK 0xf0
+#define PMSTAT_PX            0x10
+#define PMSTAT_CX            0x20
+#define PMSTAT_get_max_px    (PMSTAT_PX | 0x1)
+#define PMSTAT_get_pxstat    (PMSTAT_PX | 0x2)
+#define PMSTAT_reset_pxstat  (PMSTAT_PX | 0x3)
+#define PMSTAT_get_max_cx    (PMSTAT_CX | 0x1)
+#define PMSTAT_get_cxstat    (PMSTAT_CX | 0x2)
+#define PMSTAT_reset_cxstat  (PMSTAT_CX | 0x3)
     uint32_t type;
     uint32_t cpuid;
     union {
         struct pm_px_stat getpx;
-        /* other struct for cx, tx, etc */
+        struct pm_cx_stat getcx;
+        /* other struct for tx, etc */
     } u;
 };
 typedef struct xen_sysctl_get_pmstat xen_sysctl_get_pmstat_t;
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/xen/domain.h
--- a/xen/include/xen/domain.h  Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/xen/domain.h  Thu May 22 19:42:51 2008 +0900
@@ -14,7 +14,7 @@ int boot_vcpu(
 int boot_vcpu(
     struct domain *d, int vcpuid, vcpu_guest_context_u ctxt);
 struct vcpu *alloc_idle_vcpu(unsigned int cpu_id);
-int vcpu_reset(struct vcpu *v);
+void vcpu_reset(struct vcpu *v);
 
 struct domain *alloc_domain(domid_t domid);
 void free_domain(struct domain *d);
@@ -55,7 +55,7 @@ void arch_dump_vcpu_info(struct vcpu *v)
 
 void arch_dump_domain_info(struct domain *d);
 
-int arch_vcpu_reset(struct vcpu *v);
+void arch_vcpu_reset(struct vcpu *v);
 
 extern unsigned int xen_processor_pmbits;
 
diff -r f04ce41dab84 -r 74d0f17f3fa5 xen/include/xen/timer.h
--- a/xen/include/xen/timer.h   Tue May 20 18:54:09 2008 +0900
+++ b/xen/include/xen/timer.h   Thu May 22 19:42:51 2008 +0900
@@ -99,6 +99,15 @@ extern void process_pending_timers(void)
  */
 extern void timer_init(void);
 
+/*
+ * Next timer deadline for each CPU.
+ * Modified only by the local CPU and never in interrupt context.
+ */
+DECLARE_PER_CPU(s_time_t, timer_deadline);
+
+/* Arch-defined function to reprogram timer hardware for new deadline. */
+extern int reprogram_timer(s_time_t timeout);
+
 #endif /* _TIMER_H_ */
 
 /*

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


 


Rackspace

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