All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH][HVM] pass-through PCI device hotplug support
@ 2008-01-23 15:52 Zhai, Edwin
  2008-01-24 17:57 ` Keir Fraser
  2008-01-24 18:06 ` Daniel P. Berrange
  0 siblings, 2 replies; 17+ messages in thread
From: Zhai, Edwin @ 2008-01-23 15:52 UTC (permalink / raw)
  To: Keir; +Cc: xen-devel

[-- Attachment #1: Type: text/plain, Size: 1060 bytes --]

All,

This patch enables HVM guest VT-d device hotplug via a simple ACPI hotplug 
device model. Pls. have a look.

On VT-d side, it's very useful as you can dynamically assign VT-d device to a 
guest as long as it support ACPI hotplug(Linux 2.6, 2000, 2003, XP... pass the 
test).

* Usage is very simple.
Three new commands are added:
"xm dpci-list domid" show the current assigned vtd device, like:
ID  domain   bus   slot   func
0      0x0  0x02   0x00    0x0

"xm dpci-remove" hot remove the specified vtd device by the ID, like:
xm dpci-remove EdwinHVMDomainVtd 0

"xm dpci-insert" hot add a new vtd device, like '03:00.0':
xm dpci-insert EdwinHVMDomainVtd 3 0 0

* Currently only 2 virtual pci slots are made as being capable of hotplug, so 
more than 2 vtd dev can't be hotplugged, but we can easily extend it in future.

* I reuse the pci PV driver configuration but untouch the code path since there 
may be HVM pci PV driver in future. I'm not sure if the python changes are okay, 
maybe you guys have some good idea.
 
Thanks,

-- 
best rgds,
edwin

[-- Attachment #2: pass_through_hotplug_r16728.patch --]
[-- Type: text/plain, Size: 125596 bytes --]

Enable VTd device hotplug in HVM guest via a simple ACPI hotplug device model

Signed-off-by: Edwin Zhai <edwin.zhai@intel.com>

diff -r 929210166e3f -r d1f20fa87c60 tools/firmware/hvmloader/acpi/dsdt.asl
--- a/tools/firmware/hvmloader/acpi/dsdt.asl	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/firmware/hvmloader/acpi/dsdt.asl	Wed Jan 23 22:10:59 2008 +0800
@@ -75,6 +75,12 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
            Name (_UID, 0x00)
            Name (_ADR, 0x00)
            Name (_BBN, 0x00)
+           Method (_HPP, 0)
+           {
+               Store (0x99, \_GPE.DPT1)
+               Return (Package(0x4){0x10, 0x40, 0x00, 0x00})
+           }
+
  
            Method (_CRS, 0, NotSerialized)
            {
@@ -691,6 +697,100 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
                     })
                 } 
             }
+
+            Device (S1F0)
+            {
+                Name (_ADR, 0x00060000) /* Dev 6, Func 0 */
+                Name (_SUN, 0x00000001)
+
+                Method (_PS0, 0)
+                {
+                    Store (0x80, \_GPE.DPT2)
+                }
+
+                Method (_PS3, 0)
+                {
+                    Store (0x83, \_GPE.DPT2)
+                }
+
+                Method (_EJ0, 1)
+                {
+                    Store (0x88, \_GPE.DPT2)
+                    Store (0x1, \_GPE.PHP1) /* eject php slot 1*/
+                }
+
+                Method (_STA, 0)
+                {
+                    Store (0x89, \_GPE.DPT2)
+                    Return ( \_GPE.PHP1 )   /* IN status as the _STA */
+                }
+            }
+
+            Device (S2F0)
+            {
+                Name (_ADR, 0x00070000) /* Dev 7, Func 0 */
+                Name (_SUN, 0x00000002)
+
+                Method (_PS0, 0)
+                {
+                    Store (0x90, \_GPE.DPT2)
+                }
+
+                Method (_PS3, 0)
+                {
+                    Store (0x93, \_GPE.DPT2)
+                }
+
+                Method (_EJ0, 1)
+                {
+                    Store (0x98, \_GPE.DPT2)
+                    Store (0x1, \_GPE.PHP2) /* eject php slot 1*/
+                }
+
+                Method (_STA, 0)
+                {
+                    Store (0x99, \_GPE.DPT2)
+                    Return ( \_GPE.PHP2 )   /* IN status as the _STA */
+                }
+            }
+        }
+    }
+    Scope (\_GPE)
+    {
+        OperationRegion (PHP, SystemIO, 0x10c0, 0x03)
+        Field (PHP, ByteAcc, NoLock, Preserve)
+        {
+            PSTA,   8, /* hotplug controller status reg */
+            PHP1,   8, /* hotplug slot 1 control reg */
+            PHP2,   8  /* hotplug slot 2 control reg */
+        }
+        OperationRegion (DG1, SystemIO, 0xb044, 0x04)
+        Field (DG1, ByteAcc, NoLock, Preserve)
+        {
+            DPT1,   8,
+            DPT2,   8
+        }
+        Method (_L03, 0, NotSerialized)
+        {
+            /* detect slot and event(remove/add) */
+            Name (SLT, 0x0)
+            Name (EVT, 0x0)
+            Store (PSTA, Local1)
+            ShiftRight (Local1, 0x4, SLT)
+            And (Local1, 0xf, EVT)
+
+            /* debug */
+            Store (SLT, DPT1)
+            Store (EVT, DPT2)
+
+            If ( LEqual(SLT, 0x1) )
+            {
+                Notify (\_SB.PCI0.S1F0, EVT)
+            }
+            ElseIf ( LEqual(SLT, 0x2) )
+            {
+                Notify (\_SB.PCI0.S2F0, EVT)
+            }
         }
     }
 }
diff -r 929210166e3f -r d1f20fa87c60 tools/firmware/hvmloader/acpi/dsdt.c
--- a/tools/firmware/hvmloader/acpi/dsdt.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/firmware/hvmloader/acpi/dsdt.c	Wed Jan 23 22:10:59 2008 +0800
@@ -1,22 +1,22 @@
 /*
  * 
  * Intel ACPI Component Architecture
- * ASL Optimizing Compiler version 20060707 [Feb 16 2007]
- * Copyright (C) 2000 - 2006 Intel Corporation
- * Supports ACPI Specification Revision 3.0a
+ * ASL Optimizing Compiler / AML Disassembler version 20050309 [Mar 17 2005]
+ * Copyright (C) 2000 - 2005 Intel Corporation
+ * Supports ACPI Specification Revision 3.0
  * 
- * Compilation of "dsdt.asl" - Tue Sep 11 16:12:28 2007
+ * Compilation of "dsdt.asl" - Wed Jan 23 19:09:27 2008
  * 
  * C source code output
  *
  */
-unsigned char AmlCode[] =
+unsigned char AmlCode[] = 
 {
-    0x44,0x53,0x44,0x54,0x19,0x0E,0x00,0x00,  /* 00000000    "DSDT...." */
-    0x02,0x6A,0x58,0x65,0x6E,0x00,0x00,0x00,  /* 00000008    ".jXen..." */
+    0x44,0x53,0x44,0x54,0xF5,0x0F,0x00,0x00,  /* 00000000    "DSDT...." */
+    0x02,0xB8,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" */
+    0x09,0x03,0x05,0x20,0x08,0x50,0x4D,0x42,  /* 00000020    "... .PMB" */
     0x53,0x0B,0x00,0x0C,0x08,0x50,0x4D,0x4C,  /* 00000028    "S....PML" */
     0x4E,0x0A,0x08,0x08,0x49,0x4F,0x42,0x31,  /* 00000030    "N...IOB1" */
     0x00,0x08,0x49,0x4F,0x4C,0x31,0x00,0x08,  /* 00000038    "..IOL1.." */
@@ -27,7 +27,7 @@ unsigned char AmlCode[] =
     0x04,0x0A,0x07,0x0A,0x07,0x00,0x00,0x08,  /* 00000060    "........" */
     0x50,0x49,0x43,0x44,0x00,0x14,0x0C,0x5F,  /* 00000068    "PICD..._" */
     0x50,0x49,0x43,0x01,0x70,0x68,0x50,0x49,  /* 00000070    "PIC.phPI" */
-    0x43,0x44,0x10,0x4E,0xD9,0x5F,0x53,0x42,  /* 00000078    "CD.N._SB" */
+    0x43,0x44,0x10,0x4B,0xEB,0x5F,0x53,0x42,  /* 00000078    "CD.K._SB" */
     0x5F,0x5B,0x80,0x42,0x49,0x4F,0x53,0x00,  /* 00000080    "_[.BIOS." */
     0x0C,0x00,0xA0,0x0E,0x00,0x0A,0x10,0x5B,  /* 00000088    ".......[" */
     0x81,0x10,0x42,0x49,0x4F,0x53,0x01,0x55,  /* 00000090    "..BIOS.U" */
@@ -41,428 +41,487 @@ unsigned char AmlCode[] =
     0x00,0x00,0xFF,0xFF,0x09,0x00,0x00,0x00,  /* 000000D0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000D8    "........" */
     0x00,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,  /* 000000E0    "........" */
-    0x00,0x00,0x79,0x00,0x5B,0x82,0x4B,0xD2,  /* 000000E8    "..y.[.K." */
+    0x00,0x00,0x79,0x00,0x5B,0x82,0x48,0xE4,  /* 000000E8    "..y.[.H." */
     0x50,0x43,0x49,0x30,0x08,0x5F,0x48,0x49,  /* 000000F0    "PCI0._HI" */
     0x44,0x0C,0x41,0xD0,0x0A,0x03,0x08,0x5F,  /* 000000F8    "D.A...._" */
     0x55,0x49,0x44,0x00,0x08,0x5F,0x41,0x44,  /* 00000100    "UID.._AD" */
     0x52,0x00,0x08,0x5F,0x42,0x42,0x4E,0x00,  /* 00000108    "R.._BBN." */
-    0x14,0x44,0x08,0x5F,0x43,0x52,0x53,0x00,  /* 00000110    ".D._CRS." */
-    0x08,0x50,0x52,0x54,0x30,0x11,0x42,0x07,  /* 00000118    ".PRT0.B." */
-    0x0A,0x6E,0x88,0x0D,0x00,0x02,0x0F,0x00,  /* 00000120    ".n......" */
-    0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,  /* 00000128    "........" */
-    0x00,0x01,0x47,0x01,0xF8,0x0C,0xF8,0x0C,  /* 00000130    "..G....." */
-    0x01,0x08,0x88,0x0D,0x00,0x01,0x0C,0x03,  /* 00000138    "........" */
-    0x00,0x00,0x00,0x00,0xF7,0x0C,0x00,0x00,  /* 00000140    "........" */
-    0xF8,0x0C,0x88,0x0D,0x00,0x01,0x0C,0x03,  /* 00000148    "........" */
-    0x00,0x00,0x00,0x0D,0xFF,0xFF,0x00,0x00,  /* 00000150    "........" */
-    0x00,0xF3,0x87,0x17,0x00,0x00,0x0C,0x03,  /* 00000158    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,  /* 00000160    "........" */
-    0xFF,0xFF,0x0B,0x00,0x00,0x00,0x00,0x00,  /* 00000168    "........" */
-    0x00,0x00,0x02,0x00,0x87,0x17,0x00,0x00,  /* 00000170    "........" */
-    0x0D,0x03,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000178    "........" */
-    0x00,0xF0,0xFF,0xFF,0xFF,0xF4,0x00,0x00,  /* 00000180    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x05,0x79,0x00,  /* 00000188    "......y." */
-    0xA4,0x50,0x52,0x54,0x30,0x08,0x42,0x55,  /* 00000190    ".PRT0.BU" */
-    0x46,0x41,0x11,0x09,0x0A,0x06,0x23,0x20,  /* 00000198    "FA....# " */
-    0x0C,0x18,0x79,0x00,0x08,0x42,0x55,0x46,  /* 000001A0    "..y..BUF" */
-    0x42,0x11,0x09,0x0A,0x06,0x23,0x00,0x00,  /* 000001A8    "B....#.." */
-    0x18,0x79,0x00,0x8B,0x42,0x55,0x46,0x42,  /* 000001B0    ".y..BUFB" */
-    0x01,0x49,0x52,0x51,0x56,0x5B,0x82,0x48,  /* 000001B8    ".IRQV[.H" */
-    0x08,0x4C,0x4E,0x4B,0x41,0x08,0x5F,0x48,  /* 000001C0    ".LNKA._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,  /* 000001C8    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x01,0x14,0x1C,0x5F,  /* 000001D0    "_UID..._" */
-    0x53,0x54,0x41,0x00,0x7B,0x50,0x49,0x52,  /* 000001D8    "STA.{PIR" */
-    0x41,0x0A,0x80,0x60,0xA0,0x08,0x93,0x60,  /* 000001E0    "A..`...`" */
-    0x0A,0x80,0xA4,0x0A,0x09,0xA1,0x04,0xA4,  /* 000001E8    "........" */
-    0x0A,0x0B,0x14,0x0B,0x5F,0x50,0x52,0x53,  /* 000001F0    "...._PRS" */
-    0x00,0xA4,0x42,0x55,0x46,0x41,0x14,0x11,  /* 000001F8    "..BUFA.." */
-    0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,0x49,  /* 00000200    "_DIS.}PI" */
-    0x52,0x41,0x0A,0x80,0x50,0x49,0x52,0x41,  /* 00000208    "RA..PIRA" */
-    0x14,0x1A,0x5F,0x43,0x52,0x53,0x00,0x7B,  /* 00000210    ".._CRS.{" */
-    0x50,0x49,0x52,0x41,0x0A,0x0F,0x60,0x79,  /* 00000218    "PIRA..`y" */
-    0x01,0x60,0x49,0x52,0x51,0x56,0xA4,0x42,  /* 00000220    ".`IRQV.B" */
-    0x55,0x46,0x42,0x14,0x1B,0x5F,0x53,0x52,  /* 00000228    "UFB.._SR" */
-    0x53,0x01,0x8B,0x68,0x01,0x49,0x52,0x51,  /* 00000230    "S..h.IRQ" */
-    0x31,0x82,0x49,0x52,0x51,0x31,0x60,0x76,  /* 00000238    "1.IRQ1`v" */
-    0x60,0x70,0x60,0x50,0x49,0x52,0x41,0x5B,  /* 00000240    "`p`PIRA[" */
-    0x82,0x49,0x08,0x4C,0x4E,0x4B,0x42,0x08,  /* 00000248    ".I.LNKB." */
-    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,  /* 00000250    "_HID.A.." */
-    0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,0x02,  /* 00000258    ".._UID.." */
-    0x14,0x1C,0x5F,0x53,0x54,0x41,0x00,0x7B,  /* 00000260    ".._STA.{" */
-    0x50,0x49,0x52,0x42,0x0A,0x80,0x60,0xA0,  /* 00000268    "PIRB..`." */
-    0x08,0x93,0x60,0x0A,0x80,0xA4,0x0A,0x09,  /* 00000270    "..`....." */
-    0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x0B,0x5F,  /* 00000278    "......._" */
-    0x50,0x52,0x53,0x00,0xA4,0x42,0x55,0x46,  /* 00000280    "PRS..BUF" */
-    0x41,0x14,0x11,0x5F,0x44,0x49,0x53,0x00,  /* 00000288    "A.._DIS." */
-    0x7D,0x50,0x49,0x52,0x42,0x0A,0x80,0x50,  /* 00000290    "}PIRB..P" */
-    0x49,0x52,0x42,0x14,0x1A,0x5F,0x43,0x52,  /* 00000298    "IRB.._CR" */
-    0x53,0x00,0x7B,0x50,0x49,0x52,0x42,0x0A,  /* 000002A0    "S.{PIRB." */
-    0x0F,0x60,0x79,0x01,0x60,0x49,0x52,0x51,  /* 000002A8    ".`y.`IRQ" */
-    0x56,0xA4,0x42,0x55,0x46,0x42,0x14,0x1B,  /* 000002B0    "V.BUFB.." */
-    0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,0x01,  /* 000002B8    "_SRS..h." */
-    0x49,0x52,0x51,0x31,0x82,0x49,0x52,0x51,  /* 000002C0    "IRQ1.IRQ" */
-    0x31,0x60,0x76,0x60,0x70,0x60,0x50,0x49,  /* 000002C8    "1`v`p`PI" */
-    0x52,0x42,0x5B,0x82,0x49,0x08,0x4C,0x4E,  /* 000002D0    "RB[.I.LN" */
-    0x4B,0x43,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 000002D8    "KC._HID." */
-    0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49,  /* 000002E0    "A...._UI" */
-    0x44,0x0A,0x03,0x14,0x1C,0x5F,0x53,0x54,  /* 000002E8    "D...._ST" */
-    0x41,0x00,0x7B,0x50,0x49,0x52,0x43,0x0A,  /* 000002F0    "A.{PIRC." */
-    0x80,0x60,0xA0,0x08,0x93,0x60,0x0A,0x80,  /* 000002F8    ".`...`.." */
-    0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,0x0B,  /* 00000300    "........" */
-    0x14,0x0B,0x5F,0x50,0x52,0x53,0x00,0xA4,  /* 00000308    ".._PRS.." */
-    0x42,0x55,0x46,0x41,0x14,0x11,0x5F,0x44,  /* 00000310    "BUFA.._D" */
-    0x49,0x53,0x00,0x7D,0x50,0x49,0x52,0x43,  /* 00000318    "IS.}PIRC" */
-    0x0A,0x80,0x50,0x49,0x52,0x43,0x14,0x1A,  /* 00000320    "..PIRC.." */
-    0x5F,0x43,0x52,0x53,0x00,0x7B,0x50,0x49,  /* 00000328    "_CRS.{PI" */
-    0x52,0x43,0x0A,0x0F,0x60,0x79,0x01,0x60,  /* 00000330    "RC..`y.`" */
-    0x49,0x52,0x51,0x56,0xA4,0x42,0x55,0x46,  /* 00000338    "IRQV.BUF" */
-    0x42,0x14,0x1B,0x5F,0x53,0x52,0x53,0x01,  /* 00000340    "B.._SRS." */
-    0x8B,0x68,0x01,0x49,0x52,0x51,0x31,0x82,  /* 00000348    ".h.IRQ1." */
-    0x49,0x52,0x51,0x31,0x60,0x76,0x60,0x70,  /* 00000350    "IRQ1`v`p" */
-    0x60,0x50,0x49,0x52,0x43,0x5B,0x82,0x49,  /* 00000358    "`PIRC[.I" */
-    0x08,0x4C,0x4E,0x4B,0x44,0x08,0x5F,0x48,  /* 00000360    ".LNKD._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,  /* 00000368    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x0A,0x04,0x14,0x1C,  /* 00000370    "_UID...." */
-    0x5F,0x53,0x54,0x41,0x00,0x7B,0x50,0x49,  /* 00000378    "_STA.{PI" */
-    0x52,0x44,0x0A,0x80,0x60,0xA0,0x08,0x93,  /* 00000380    "RD..`..." */
-    0x60,0x0A,0x80,0xA4,0x0A,0x09,0xA1,0x04,  /* 00000388    "`......." */
-    0xA4,0x0A,0x0B,0x14,0x0B,0x5F,0x50,0x52,  /* 00000390    "....._PR" */
-    0x53,0x00,0xA4,0x42,0x55,0x46,0x41,0x14,  /* 00000398    "S..BUFA." */
-    0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,  /* 000003A0    "._DIS.}P" */
-    0x49,0x52,0x44,0x0A,0x80,0x50,0x49,0x52,  /* 000003A8    "IRD..PIR" */
-    0x44,0x14,0x1A,0x5F,0x43,0x52,0x53,0x00,  /* 000003B0    "D.._CRS." */
-    0x7B,0x50,0x49,0x52,0x44,0x0A,0x0F,0x60,  /* 000003B8    "{PIRD..`" */
-    0x79,0x01,0x60,0x49,0x52,0x51,0x56,0xA4,  /* 000003C0    "y.`IRQV." */
-    0x42,0x55,0x46,0x42,0x14,0x1B,0x5F,0x53,  /* 000003C8    "BUFB.._S" */
-    0x52,0x53,0x01,0x8B,0x68,0x01,0x49,0x52,  /* 000003D0    "RS..h.IR" */
-    0x51,0x31,0x82,0x49,0x52,0x51,0x31,0x60,  /* 000003D8    "Q1.IRQ1`" */
-    0x76,0x60,0x70,0x60,0x50,0x49,0x52,0x44,  /* 000003E0    "v`p`PIRD" */
-    0x5B,0x82,0x3A,0x48,0x50,0x45,0x54,0x08,  /* 000003E8    "[.:HPET." */
-    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x01,  /* 000003F0    "_HID.A.." */
-    0x03,0x08,0x5F,0x55,0x49,0x44,0x00,0x08,  /* 000003F8    ".._UID.." */
-    0x5F,0x43,0x52,0x53,0x11,0x1F,0x0A,0x1C,  /* 00000400    "_CRS...." */
-    0x87,0x17,0x00,0x00,0x0D,0x01,0x00,0x00,  /* 00000408    "........" */
-    0x00,0x00,0x00,0x00,0xD0,0xFE,0xFF,0x03,  /* 00000410    "........" */
-    0xD0,0xFE,0x00,0x00,0x00,0x00,0x00,0x04,  /* 00000418    "........" */
-    0x00,0x00,0x79,0x00,0x14,0x16,0x5F,0x50,  /* 00000420    "..y..._P" */
-    0x52,0x54,0x00,0xA0,0x0A,0x50,0x49,0x43,  /* 00000428    "RT...PIC" */
-    0x44,0xA4,0x50,0x52,0x54,0x41,0xA4,0x50,  /* 00000430    "D.PRTA.P" */
-    0x52,0x54,0x50,0x08,0x50,0x52,0x54,0x50,  /* 00000438    "RTP.PRTP" */
-    0x12,0x49,0x36,0x3C,0x12,0x0D,0x04,0x0C,  /* 00000440    ".I6<...." */
-    0xFF,0xFF,0x01,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000448    ".....LNK" */
-    0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000450    "B......." */
-    0x01,0x00,0x01,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000458    "...LNKC." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 00000460    "........" */
-    0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000468    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,  /* 00000470    "........" */
-    0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 00000478    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x02,0x00,0x00,0x4C,  /* 00000480    ".......L" */
-    0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,  /* 00000488    "NKC....." */
-    0xFF,0xFF,0x02,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000490    ".....LNK" */
-    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000498    "D......." */
-    0x02,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x41,  /* 000004A0    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x02,  /* 000004A8    "........" */
-    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,0x00,  /* 000004B0    "...LNKB." */
-    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x03,0x00,  /* 000004B8    "........" */
-    0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,  /* 000004C0    ".LNKD..." */
-    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x01,0x4C,  /* 000004C8    ".......L" */
-    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 000004D0    "NKA....." */
-    0xFF,0xFF,0x03,0x00,0x0A,0x02,0x4C,0x4E,  /* 000004D8    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000004E0    "KB......" */
-    0xFF,0x03,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 000004E8    ".....LNK" */
-    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000004F0    "C......." */
-    0x04,0x00,0x00,0x4C,0x4E,0x4B,0x41,0x00,  /* 000004F8    "...LNKA." */
-    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 00000500    "........" */
-    0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 00000508    ".LNKB..." */
-    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,0x02,  /* 00000510    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 00000518    "LNKC...." */
-    0x0C,0xFF,0xFF,0x04,0x00,0x0A,0x03,0x4C,  /* 00000520    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 00000528    "NKD....." */
-    0xFF,0xFF,0x05,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000530    ".....LNK" */
-    0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000538    "B......." */
-    0x05,0x00,0x01,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000540    "...LNKC." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 00000548    "........" */
-    0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000550    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,  /* 00000558    "........" */
-    0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 00000560    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x06,0x00,0x00,0x4C,  /* 00000568    ".......L" */
-    0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,  /* 00000570    "NKC....." */
-    0xFF,0xFF,0x06,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000578    ".....LNK" */
-    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000580    "D......." */
-    0x06,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x41,  /* 00000588    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x06,  /* 00000590    "........" */
-    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000598    "...LNKB." */
-    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x07,0x00,  /* 000005A0    "........" */
-    0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,  /* 000005A8    ".LNKD..." */
-    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x01,0x4C,  /* 000005B0    ".......L" */
-    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 000005B8    "NKA....." */
-    0xFF,0xFF,0x07,0x00,0x0A,0x02,0x4C,0x4E,  /* 000005C0    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000005C8    "KB......" */
-    0xFF,0x07,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 000005D0    ".....LNK" */
-    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000005D8    "C......." */
-    0x08,0x00,0x00,0x4C,0x4E,0x4B,0x41,0x00,  /* 000005E0    "...LNKA." */
-    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 000005E8    "........" */
-    0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 000005F0    ".LNKB..." */
-    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,0x02,  /* 000005F8    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 00000600    "LNKC...." */
-    0x0C,0xFF,0xFF,0x08,0x00,0x0A,0x03,0x4C,  /* 00000608    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 00000610    "NKD....." */
-    0xFF,0xFF,0x09,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000618    ".....LNK" */
-    0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000620    "B......." */
-    0x09,0x00,0x01,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000628    "...LNKC." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 00000630    "........" */
-    0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000638    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,  /* 00000640    "........" */
-    0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 00000648    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x00,0x4C,  /* 00000650    ".......L" */
-    0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,  /* 00000658    "NKC....." */
-    0xFF,0xFF,0x0A,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000660    ".....LNK" */
-    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000668    "D......." */
-    0x0A,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x41,  /* 00000670    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0A,  /* 00000678    "........" */
-    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000680    "...LNKB." */
-    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0B,0x00,  /* 00000688    "........" */
-    0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,  /* 00000690    ".LNKD..." */
-    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x01,0x4C,  /* 00000698    ".......L" */
-    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 000006A0    "NKA....." */
-    0xFF,0xFF,0x0B,0x00,0x0A,0x02,0x4C,0x4E,  /* 000006A8    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000006B0    "KB......" */
-    0xFF,0x0B,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 000006B8    ".....LNK" */
-    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000006C0    "C......." */
-    0x0C,0x00,0x00,0x4C,0x4E,0x4B,0x41,0x00,  /* 000006C8    "...LNKA." */
-    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 000006D0    "........" */
-    0x01,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 000006D8    ".LNKB..." */
-    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,0x02,  /* 000006E0    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 000006E8    "LNKC...." */
-    0x0C,0xFF,0xFF,0x0C,0x00,0x0A,0x03,0x4C,  /* 000006F0    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 000006F8    "NKD....." */
-    0xFF,0xFF,0x0D,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000700    ".....LNK" */
-    0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000708    "B......." */
-    0x0D,0x00,0x01,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000710    "...LNKC." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 00000718    "........" */
-    0x0A,0x02,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000720    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,  /* 00000728    "........" */
-    0x03,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 00000730    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x00,0x4C,  /* 00000738    ".......L" */
-    0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,  /* 00000740    "NKC....." */
-    0xFF,0xFF,0x0E,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000748    ".....LNK" */
-    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000750    "D......." */
-    0x0E,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x41,  /* 00000758    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0E,  /* 00000760    "........" */
-    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000768    "...LNKB." */
-    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0F,0x00,  /* 00000770    "........" */
-    0x00,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,  /* 00000778    ".LNKD..." */
-    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x01,0x4C,  /* 00000780    ".......L" */
-    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 00000788    "NKA....." */
-    0xFF,0xFF,0x0F,0x00,0x0A,0x02,0x4C,0x4E,  /* 00000790    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000798    "KB......" */
-    0xFF,0x0F,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 000007A0    ".....LNK" */
-    0x43,0x00,0x08,0x50,0x52,0x54,0x41,0x12,  /* 000007A8    "C..PRTA." */
-    0x41,0x2F,0x3C,0x12,0x0B,0x04,0x0C,0xFF,  /* 000007B0    "A/<....." */
-    0xFF,0x01,0x00,0x00,0x00,0x0A,0x14,0x12,  /* 000007B8    "........" */
-    0x0B,0x04,0x0C,0xFF,0xFF,0x01,0x00,0x01,  /* 000007C0    "........" */
-    0x00,0x0A,0x15,0x12,0x0C,0x04,0x0C,0xFF,  /* 000007C8    "........" */
-    0xFF,0x01,0x00,0x0A,0x02,0x00,0x0A,0x16,  /* 000007D0    "........" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 000007D8    "........" */
-    0x0A,0x03,0x00,0x0A,0x17,0x12,0x0B,0x04,  /* 000007E0    "........" */
-    0x0C,0xFF,0xFF,0x02,0x00,0x00,0x00,0x0A,  /* 000007E8    "........" */
-    0x18,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x02,  /* 000007F0    "........" */
-    0x00,0x01,0x00,0x0A,0x19,0x12,0x0C,0x04,  /* 000007F8    "........" */
-    0x0C,0xFF,0xFF,0x02,0x00,0x0A,0x02,0x00,  /* 00000800    "........" */
-    0x0A,0x1A,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000808    "........" */
-    0x02,0x00,0x0A,0x03,0x00,0x0A,0x1B,0x12,  /* 00000810    "........" */
-    0x0B,0x04,0x0C,0xFF,0xFF,0x03,0x00,0x00,  /* 00000818    "........" */
-    0x00,0x0A,0x1C,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000820    "........" */
-    0xFF,0x03,0x00,0x01,0x00,0x0A,0x1D,0x12,  /* 00000828    "........" */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,  /* 00000830    "........" */
-    0x02,0x00,0x0A,0x1E,0x12,0x0C,0x04,0x0C,  /* 00000838    "........" */
-    0xFF,0xFF,0x03,0x00,0x0A,0x03,0x00,0x0A,  /* 00000840    "........" */
-    0x1F,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x04,  /* 00000848    "........" */
-    0x00,0x00,0x00,0x0A,0x20,0x12,0x0B,0x04,  /* 00000850    ".... ..." */
-    0x0C,0xFF,0xFF,0x04,0x00,0x01,0x00,0x0A,  /* 00000858    "........" */
-    0x21,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x04,  /* 00000860    "!......." */
-    0x00,0x0A,0x02,0x00,0x0A,0x22,0x12,0x0C,  /* 00000868    ".....".." */
-    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,0x03,  /* 00000870    "........" */
-    0x00,0x0A,0x23,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000878    "..#....." */
-    0xFF,0x05,0x00,0x00,0x00,0x0A,0x24,0x12,  /* 00000880    "......$." */
-    0x0B,0x04,0x0C,0xFF,0xFF,0x05,0x00,0x01,  /* 00000888    "........" */
-    0x00,0x0A,0x25,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000890    "..%....." */
-    0xFF,0x05,0x00,0x0A,0x02,0x00,0x0A,0x26,  /* 00000898    ".......&" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 000008A0    "........" */
-    0x0A,0x03,0x00,0x0A,0x27,0x12,0x0B,0x04,  /* 000008A8    "....'..." */
-    0x0C,0xFF,0xFF,0x06,0x00,0x00,0x00,0x0A,  /* 000008B0    "........" */
-    0x28,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x06,  /* 000008B8    "(......." */
-    0x00,0x01,0x00,0x0A,0x29,0x12,0x0C,0x04,  /* 000008C0    "....)..." */
-    0x0C,0xFF,0xFF,0x06,0x00,0x0A,0x02,0x00,  /* 000008C8    "........" */
-    0x0A,0x2A,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 000008D0    ".*......" */
-    0x06,0x00,0x0A,0x03,0x00,0x0A,0x2B,0x12,  /* 000008D8    "......+." */
-    0x0B,0x04,0x0C,0xFF,0xFF,0x07,0x00,0x00,  /* 000008E0    "........" */
-    0x00,0x0A,0x2C,0x12,0x0B,0x04,0x0C,0xFF,  /* 000008E8    "..,....." */
-    0xFF,0x07,0x00,0x01,0x00,0x0A,0x2D,0x12,  /* 000008F0    "......-." */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,  /* 000008F8    "........" */
-    0x02,0x00,0x0A,0x2E,0x12,0x0C,0x04,0x0C,  /* 00000900    "........" */
-    0xFF,0xFF,0x07,0x00,0x0A,0x03,0x00,0x0A,  /* 00000908    "........" */
-    0x2F,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x08,  /* 00000910    "/......." */
-    0x00,0x00,0x00,0x0A,0x11,0x12,0x0B,0x04,  /* 00000918    "........" */
-    0x0C,0xFF,0xFF,0x08,0x00,0x01,0x00,0x0A,  /* 00000920    "........" */
-    0x12,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x08,  /* 00000928    "........" */
-    0x00,0x0A,0x02,0x00,0x0A,0x13,0x12,0x0C,  /* 00000930    "........" */
-    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,0x03,  /* 00000938    "........" */
-    0x00,0x0A,0x14,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000940    "........" */
-    0xFF,0x09,0x00,0x00,0x00,0x0A,0x15,0x12,  /* 00000948    "........" */
-    0x0B,0x04,0x0C,0xFF,0xFF,0x09,0x00,0x01,  /* 00000950    "........" */
-    0x00,0x0A,0x16,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000958    "........" */
-    0xFF,0x09,0x00,0x0A,0x02,0x00,0x0A,0x17,  /* 00000960    "........" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 00000968    "........" */
-    0x0A,0x03,0x00,0x0A,0x18,0x12,0x0B,0x04,  /* 00000970    "........" */
-    0x0C,0xFF,0xFF,0x0A,0x00,0x00,0x00,0x0A,  /* 00000978    "........" */
-    0x19,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0A,  /* 00000980    "........" */
-    0x00,0x01,0x00,0x0A,0x1A,0x12,0x0C,0x04,  /* 00000988    "........" */
-    0x0C,0xFF,0xFF,0x0A,0x00,0x0A,0x02,0x00,  /* 00000990    "........" */
-    0x0A,0x1B,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000998    "........" */
-    0x0A,0x00,0x0A,0x03,0x00,0x0A,0x1C,0x12,  /* 000009A0    "........" */
-    0x0B,0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x00,  /* 000009A8    "........" */
-    0x00,0x0A,0x1D,0x12,0x0B,0x04,0x0C,0xFF,  /* 000009B0    "........" */
-    0xFF,0x0B,0x00,0x01,0x00,0x0A,0x1E,0x12,  /* 000009B8    "........" */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,  /* 000009C0    "........" */
-    0x02,0x00,0x0A,0x1F,0x12,0x0C,0x04,0x0C,  /* 000009C8    "........" */
-    0xFF,0xFF,0x0B,0x00,0x0A,0x03,0x00,0x0A,  /* 000009D0    "........" */
-    0x20,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0C,  /* 000009D8    " ......." */
-    0x00,0x00,0x00,0x0A,0x21,0x12,0x0B,0x04,  /* 000009E0    "....!..." */
-    0x0C,0xFF,0xFF,0x0C,0x00,0x01,0x00,0x0A,  /* 000009E8    "........" */
-    0x22,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0C,  /* 000009F0    ""......." */
-    0x00,0x0A,0x02,0x00,0x0A,0x23,0x12,0x0C,  /* 000009F8    ".....#.." */
-    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,0x03,  /* 00000A00    "........" */
-    0x00,0x0A,0x24,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000A08    "..$....." */
-    0xFF,0x0D,0x00,0x00,0x00,0x0A,0x25,0x12,  /* 00000A10    "......%." */
-    0x0B,0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x01,  /* 00000A18    "........" */
-    0x00,0x0A,0x26,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000A20    "..&....." */
-    0xFF,0x0D,0x00,0x0A,0x02,0x00,0x0A,0x27,  /* 00000A28    ".......'" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 00000A30    "........" */
-    0x0A,0x03,0x00,0x0A,0x28,0x12,0x0B,0x04,  /* 00000A38    "....(..." */
-    0x0C,0xFF,0xFF,0x0E,0x00,0x00,0x00,0x0A,  /* 00000A40    "........" */
-    0x29,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0E,  /* 00000A48    ")......." */
-    0x00,0x01,0x00,0x0A,0x2A,0x12,0x0C,0x04,  /* 00000A50    "....*..." */
-    0x0C,0xFF,0xFF,0x0E,0x00,0x0A,0x02,0x00,  /* 00000A58    "........" */
-    0x0A,0x2B,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000A60    ".+......" */
-    0x0E,0x00,0x0A,0x03,0x00,0x0A,0x2C,0x12,  /* 00000A68    "......,." */
-    0x0B,0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x00,  /* 00000A70    "........" */
-    0x00,0x0A,0x2D,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000A78    "..-....." */
-    0xFF,0x0F,0x00,0x01,0x00,0x0A,0x2E,0x12,  /* 00000A80    "........" */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,  /* 00000A88    "........" */
-    0x02,0x00,0x0A,0x2F,0x12,0x0C,0x04,0x0C,  /* 00000A90    ".../...." */
-    0xFF,0xFF,0x0F,0x00,0x0A,0x03,0x00,0x0A,  /* 00000A98    "........" */
-    0x10,0x5B,0x82,0x46,0x37,0x49,0x53,0x41,  /* 00000AA0    ".[.F7ISA" */
-    0x5F,0x08,0x5F,0x41,0x44,0x52,0x0C,0x00,  /* 00000AA8    "_._ADR.." */
-    0x00,0x01,0x00,0x5B,0x80,0x50,0x49,0x52,  /* 00000AB0    "...[.PIR" */
-    0x51,0x02,0x0A,0x60,0x0A,0x04,0x10,0x2E,  /* 00000AB8    "Q..`...." */
-    0x5C,0x00,0x5B,0x81,0x29,0x5C,0x2F,0x04,  /* 00000AC0    "\.[.)\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00000AC8    "_SB_PCI0" */
-    0x49,0x53,0x41,0x5F,0x50,0x49,0x52,0x51,  /* 00000AD0    "ISA_PIRQ" */
-    0x01,0x50,0x49,0x52,0x41,0x08,0x50,0x49,  /* 00000AD8    ".PIRA.PI" */
-    0x52,0x42,0x08,0x50,0x49,0x52,0x43,0x08,  /* 00000AE0    "RB.PIRC." */
-    0x50,0x49,0x52,0x44,0x08,0x5B,0x82,0x46,  /* 00000AE8    "PIRD.[.F" */
-    0x0B,0x53,0x59,0x53,0x52,0x08,0x5F,0x48,  /* 00000AF0    ".SYSR._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x0C,0x02,0x08,  /* 00000AF8    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x01,0x08,0x43,0x52,  /* 00000B00    "_UID..CR" */
-    0x53,0x5F,0x11,0x4E,0x08,0x0A,0x8A,0x47,  /* 00000B08    "S_.N...G" */
-    0x01,0x10,0x00,0x10,0x00,0x00,0x10,0x47,  /* 00000B10    ".......G" */
-    0x01,0x22,0x00,0x22,0x00,0x00,0x0C,0x47,  /* 00000B18    "."."...G" */
-    0x01,0x30,0x00,0x30,0x00,0x00,0x10,0x47,  /* 00000B20    ".0.0...G" */
-    0x01,0x44,0x00,0x44,0x00,0x00,0x1C,0x47,  /* 00000B28    ".D.D...G" */
-    0x01,0x62,0x00,0x62,0x00,0x00,0x02,0x47,  /* 00000B30    ".b.b...G" */
-    0x01,0x65,0x00,0x65,0x00,0x00,0x0B,0x47,  /* 00000B38    ".e.e...G" */
-    0x01,0x72,0x00,0x72,0x00,0x00,0x0E,0x47,  /* 00000B40    ".r.r...G" */
-    0x01,0x80,0x00,0x80,0x00,0x00,0x01,0x47,  /* 00000B48    ".......G" */
-    0x01,0x84,0x00,0x84,0x00,0x00,0x03,0x47,  /* 00000B50    ".......G" */
-    0x01,0x88,0x00,0x88,0x00,0x00,0x01,0x47,  /* 00000B58    ".......G" */
-    0x01,0x8C,0x00,0x8C,0x00,0x00,0x03,0x47,  /* 00000B60    ".......G" */
-    0x01,0x90,0x00,0x90,0x00,0x00,0x10,0x47,  /* 00000B68    ".......G" */
-    0x01,0xA2,0x00,0xA2,0x00,0x00,0x1C,0x47,  /* 00000B70    ".......G" */
-    0x01,0xE0,0x00,0xE0,0x00,0x00,0x10,0x47,  /* 00000B78    ".......G" */
-    0x01,0xA0,0x08,0xA0,0x08,0x00,0x04,0x47,  /* 00000B80    ".......G" */
-    0x01,0xC0,0x0C,0xC0,0x0C,0x00,0x10,0x47,  /* 00000B88    ".......G" */
-    0x01,0xD0,0x04,0xD0,0x04,0x00,0x02,0x79,  /* 00000B90    ".......y" */
-    0x00,0x14,0x0B,0x5F,0x43,0x52,0x53,0x00,  /* 00000B98    "..._CRS." */
-    0xA4,0x43,0x52,0x53,0x5F,0x5B,0x82,0x2B,  /* 00000BA0    ".CRS_[.+" */
-    0x50,0x49,0x43,0x5F,0x08,0x5F,0x48,0x49,  /* 00000BA8    "PIC_._HI" */
-    0x44,0x0B,0x41,0xD0,0x08,0x5F,0x43,0x52,  /* 00000BB0    "D.A.._CR" */
-    0x53,0x11,0x18,0x0A,0x15,0x47,0x01,0x20,  /* 00000BB8    "S....G. " */
-    0x00,0x20,0x00,0x01,0x02,0x47,0x01,0xA0,  /* 00000BC0    ". ...G.." */
-    0x00,0xA0,0x00,0x01,0x02,0x22,0x04,0x00,  /* 00000BC8    ".....".." */
-    0x79,0x00,0x5B,0x82,0x47,0x05,0x44,0x4D,  /* 00000BD0    "y.[.G.DM" */
-    0x41,0x30,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000BD8    "A0._HID." */
-    0x41,0xD0,0x02,0x00,0x08,0x5F,0x43,0x52,  /* 00000BE0    "A...._CR" */
-    0x53,0x11,0x41,0x04,0x0A,0x3D,0x2A,0x10,  /* 00000BE8    "S.A..=*." */
-    0x04,0x47,0x01,0x00,0x00,0x00,0x00,0x00,  /* 00000BF0    ".G......" */
-    0x10,0x47,0x01,0x81,0x00,0x81,0x00,0x00,  /* 00000BF8    ".G......" */
-    0x03,0x47,0x01,0x87,0x00,0x87,0x00,0x00,  /* 00000C00    ".G......" */
-    0x01,0x47,0x01,0x89,0x00,0x89,0x00,0x00,  /* 00000C08    ".G......" */
-    0x03,0x47,0x01,0x8F,0x00,0x8F,0x00,0x00,  /* 00000C10    ".G......" */
-    0x01,0x47,0x01,0xC0,0x00,0xC0,0x00,0x00,  /* 00000C18    ".G......" */
-    0x20,0x47,0x01,0x80,0x04,0x80,0x04,0x00,  /* 00000C20    " G......" */
-    0x10,0x79,0x00,0x5B,0x82,0x25,0x54,0x4D,  /* 00000C28    ".y.[.%TM" */
-    0x52,0x5F,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000C30    "R_._HID." */
-    0x41,0xD0,0x01,0x00,0x08,0x5F,0x43,0x52,  /* 00000C38    "A...._CR" */
-    0x53,0x11,0x10,0x0A,0x0D,0x47,0x01,0x40,  /* 00000C40    "S....G.@" */
-    0x00,0x40,0x00,0x00,0x04,0x22,0x01,0x00,  /* 00000C48    ".@...".." */
-    0x79,0x00,0x5B,0x82,0x25,0x52,0x54,0x43,  /* 00000C50    "y.[.%RTC" */
-    0x5F,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000C58    "_._HID.A" */
-    0xD0,0x0B,0x00,0x08,0x5F,0x43,0x52,0x53,  /* 00000C60    "...._CRS" */
-    0x11,0x10,0x0A,0x0D,0x47,0x01,0x70,0x00,  /* 00000C68    "....G.p." */
-    0x70,0x00,0x00,0x02,0x22,0x00,0x01,0x79,  /* 00000C70    "p..."..y" */
-    0x00,0x5B,0x82,0x22,0x53,0x50,0x4B,0x52,  /* 00000C78    ".[."SPKR" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000C80    "._HID.A." */
-    0x08,0x00,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000C88    "..._CRS." */
-    0x0D,0x0A,0x0A,0x47,0x01,0x61,0x00,0x61,  /* 00000C90    "...G.a.a" */
-    0x00,0x00,0x01,0x79,0x00,0x5B,0x82,0x31,  /* 00000C98    "...y.[.1" */
-    0x50,0x53,0x32,0x4D,0x08,0x5F,0x48,0x49,  /* 00000CA0    "PS2M._HI" */
-    0x44,0x0C,0x41,0xD0,0x0F,0x13,0x08,0x5F,  /* 00000CA8    "D.A...._" */
-    0x43,0x49,0x44,0x0C,0x41,0xD0,0x0F,0x13,  /* 00000CB0    "CID.A..." */
-    0x14,0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,  /* 00000CB8    ".._STA.." */
-    0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000CC0    "..._CRS." */
-    0x08,0x0A,0x05,0x22,0x00,0x10,0x79,0x00,  /* 00000CC8    "..."..y." */
-    0x5B,0x82,0x42,0x04,0x50,0x53,0x32,0x4B,  /* 00000CD0    "[.B.PS2K" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000CD8    "._HID.A." */
-    0x03,0x03,0x08,0x5F,0x43,0x49,0x44,0x0C,  /* 00000CE0    "..._CID." */
-    0x41,0xD0,0x03,0x0B,0x14,0x09,0x5F,0x53,  /* 00000CE8    "A....._S" */
-    0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,  /* 00000CF0    "TA....._" */
-    0x43,0x52,0x53,0x11,0x18,0x0A,0x15,0x47,  /* 00000CF8    "CRS....G" */
-    0x01,0x60,0x00,0x60,0x00,0x00,0x01,0x47,  /* 00000D00    ".`.`...G" */
-    0x01,0x64,0x00,0x64,0x00,0x00,0x01,0x22,  /* 00000D08    ".d.d..."" */
-    0x02,0x00,0x79,0x00,0x5B,0x82,0x3A,0x46,  /* 00000D10    "..y.[.:F" */
-    0x44,0x43,0x30,0x08,0x5F,0x48,0x49,0x44,  /* 00000D18    "DC0._HID" */
-    0x0C,0x41,0xD0,0x07,0x00,0x14,0x09,0x5F,  /* 00000D20    ".A....._" */
-    0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,  /* 00000D28    "STA....." */
-    0x5F,0x43,0x52,0x53,0x11,0x1B,0x0A,0x18,  /* 00000D30    "_CRS...." */
-    0x47,0x01,0xF0,0x03,0xF0,0x03,0x01,0x06,  /* 00000D38    "G......." */
-    0x47,0x01,0xF7,0x03,0xF7,0x03,0x01,0x01,  /* 00000D40    "G......." */
-    0x22,0x40,0x00,0x2A,0x04,0x00,0x79,0x00,  /* 00000D48    ""@.*..y." */
-    0x5B,0x82,0x46,0x04,0x55,0x41,0x52,0x31,  /* 00000D50    "[.F.UAR1" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000D58    "._HID.A." */
-    0x05,0x01,0x08,0x5F,0x55,0x49,0x44,0x01,  /* 00000D60    "..._UID." */
-    0x14,0x19,0x5F,0x53,0x54,0x41,0x00,0xA0,  /* 00000D68    ".._STA.." */
-    0x0D,0x93,0x5E,0x5E,0x5E,0x5E,0x55,0x41,  /* 00000D70    "..^^^^UA" */
-    0x52,0x31,0x00,0xA4,0x00,0xA1,0x04,0xA4,  /* 00000D78    "R1......" */
-    0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000D80    "..._CRS." */
-    0x10,0x0A,0x0D,0x47,0x01,0xF8,0x03,0xF8,  /* 00000D88    "...G...." */
-    0x03,0x08,0x08,0x22,0x10,0x00,0x79,0x00,  /* 00000D90    "..."..y." */
-    0x5B,0x82,0x47,0x04,0x55,0x41,0x52,0x32,  /* 00000D98    "[.G.UAR2" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000DA0    "._HID.A." */
-    0x05,0x01,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 00000DA8    "..._UID." */
-    0x02,0x14,0x19,0x5F,0x53,0x54,0x41,0x00,  /* 00000DB0    "..._STA." */
-    0xA0,0x0D,0x93,0x5E,0x5E,0x5E,0x5E,0x55,  /* 00000DB8    "...^^^^U" */
-    0x41,0x52,0x32,0x00,0xA4,0x00,0xA1,0x04,  /* 00000DC0    "AR2....." */
-    0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,  /* 00000DC8    "...._CRS" */
-    0x11,0x10,0x0A,0x0D,0x47,0x01,0xF8,0x02,  /* 00000DD0    "....G..." */
-    0xF8,0x02,0x08,0x08,0x22,0x08,0x00,0x79,  /* 00000DD8    "...."..y" */
-    0x00,0x5B,0x82,0x36,0x4C,0x54,0x50,0x31,  /* 00000DE0    ".[.6LTP1" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000DE8    "._HID.A." */
-    0x04,0x00,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 00000DF0    "..._UID." */
-    0x02,0x14,0x09,0x5F,0x53,0x54,0x41,0x00,  /* 00000DF8    "..._STA." */
-    0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,  /* 00000E00    "...._CRS" */
-    0x11,0x10,0x0A,0x0D,0x47,0x01,0x78,0x03,  /* 00000E08    "....G.x." */
-    0x78,0x03,0x08,0x08,0x22,0x80,0x00,0x79,  /* 00000E10    "x..."..y" */
-    0x00,
+    0x14,0x1D,0x5F,0x48,0x50,0x50,0x00,0x70,  /* 00000110    ".._HPP.p" */
+    0x0A,0x99,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00000118    "..\._GPE" */
+    0x44,0x50,0x54,0x31,0xA4,0x12,0x08,0x04,  /* 00000120    "DPT1...." */
+    0x0A,0x10,0x0A,0x40,0x00,0x00,0x14,0x44,  /* 00000128    "...@...D" */
+    0x08,0x5F,0x43,0x52,0x53,0x00,0x08,0x50,  /* 00000130    "._CRS..P" */
+    0x52,0x54,0x30,0x11,0x42,0x07,0x0A,0x6E,  /* 00000138    "RT0.B..n" */
+    0x88,0x0D,0x00,0x02,0x0F,0x00,0x00,0x00,  /* 00000140    "........" */
+    0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x01,  /* 00000148    "........" */
+    0x47,0x01,0xF8,0x0C,0xF8,0x0C,0x01,0x08,  /* 00000150    "G......." */
+    0x88,0x0D,0x00,0x01,0x0C,0x03,0x00,0x00,  /* 00000158    "........" */
+    0x00,0x00,0xF7,0x0C,0x00,0x00,0xF8,0x0C,  /* 00000160    "........" */
+    0x88,0x0D,0x00,0x01,0x0C,0x03,0x00,0x00,  /* 00000168    "........" */
+    0x00,0x0D,0xFF,0xFF,0x00,0x00,0x00,0xF3,  /* 00000170    "........" */
+    0x87,0x17,0x00,0x00,0x0C,0x03,0x00,0x00,  /* 00000178    "........" */
+    0x00,0x00,0x00,0x00,0x0A,0x00,0xFF,0xFF,  /* 00000180    "........" */
+    0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000188    "........" */
+    0x02,0x00,0x87,0x17,0x00,0x00,0x0D,0x03,  /* 00000190    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,  /* 00000198    "........" */
+    0xFF,0xFF,0xFF,0xF4,0x00,0x00,0x00,0x00,  /* 000001A0    "........" */
+    0x00,0x00,0x00,0x05,0x79,0x00,0xA4,0x50,  /* 000001A8    "....y..P" */
+    0x52,0x54,0x30,0x08,0x42,0x55,0x46,0x41,  /* 000001B0    "RT0.BUFA" */
+    0x11,0x09,0x0A,0x06,0x23,0x20,0x0C,0x18,  /* 000001B8    "....# .." */
+    0x79,0x00,0x08,0x42,0x55,0x46,0x42,0x11,  /* 000001C0    "y..BUFB." */
+    0x09,0x0A,0x06,0x23,0x00,0x00,0x18,0x79,  /* 000001C8    "...#...y" */
+    0x00,0x8B,0x42,0x55,0x46,0x42,0x01,0x49,  /* 000001D0    "..BUFB.I" */
+    0x52,0x51,0x56,0x5B,0x82,0x48,0x08,0x4C,  /* 000001D8    "RQV[.H.L" */
+    0x4E,0x4B,0x41,0x08,0x5F,0x48,0x49,0x44,  /* 000001E0    "NKA._HID" */
+    0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,  /* 000001E8    ".A...._U" */
+    0x49,0x44,0x01,0x14,0x1C,0x5F,0x53,0x54,  /* 000001F0    "ID..._ST" */
+    0x41,0x00,0x7B,0x50,0x49,0x52,0x41,0x0A,  /* 000001F8    "A.{PIRA." */
+    0x80,0x60,0xA0,0x08,0x93,0x60,0x0A,0x80,  /* 00000200    ".`...`.." */
+    0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,0x0B,  /* 00000208    "........" */
+    0x14,0x0B,0x5F,0x50,0x52,0x53,0x00,0xA4,  /* 00000210    ".._PRS.." */
+    0x42,0x55,0x46,0x41,0x14,0x11,0x5F,0x44,  /* 00000218    "BUFA.._D" */
+    0x49,0x53,0x00,0x7D,0x50,0x49,0x52,0x41,  /* 00000220    "IS.}PIRA" */
+    0x0A,0x80,0x50,0x49,0x52,0x41,0x14,0x1A,  /* 00000228    "..PIRA.." */
+    0x5F,0x43,0x52,0x53,0x00,0x7B,0x50,0x49,  /* 00000230    "_CRS.{PI" */
+    0x52,0x41,0x0A,0x0F,0x60,0x79,0x01,0x60,  /* 00000238    "RA..`y.`" */
+    0x49,0x52,0x51,0x56,0xA4,0x42,0x55,0x46,  /* 00000240    "IRQV.BUF" */
+    0x42,0x14,0x1B,0x5F,0x53,0x52,0x53,0x01,  /* 00000248    "B.._SRS." */
+    0x8B,0x68,0x01,0x49,0x52,0x51,0x31,0x82,  /* 00000250    ".h.IRQ1." */
+    0x49,0x52,0x51,0x31,0x60,0x76,0x60,0x70,  /* 00000258    "IRQ1`v`p" */
+    0x60,0x50,0x49,0x52,0x41,0x5B,0x82,0x49,  /* 00000260    "`PIRA[.I" */
+    0x08,0x4C,0x4E,0x4B,0x42,0x08,0x5F,0x48,  /* 00000268    ".LNKB._H" */
+    0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,  /* 00000270    "ID.A...." */
+    0x5F,0x55,0x49,0x44,0x0A,0x02,0x14,0x1C,  /* 00000278    "_UID...." */
+    0x5F,0x53,0x54,0x41,0x00,0x7B,0x50,0x49,  /* 00000280    "_STA.{PI" */
+    0x52,0x42,0x0A,0x80,0x60,0xA0,0x08,0x93,  /* 00000288    "RB..`..." */
+    0x60,0x0A,0x80,0xA4,0x0A,0x09,0xA1,0x04,  /* 00000290    "`......." */
+    0xA4,0x0A,0x0B,0x14,0x0B,0x5F,0x50,0x52,  /* 00000298    "....._PR" */
+    0x53,0x00,0xA4,0x42,0x55,0x46,0x41,0x14,  /* 000002A0    "S..BUFA." */
+    0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,  /* 000002A8    "._DIS.}P" */
+    0x49,0x52,0x42,0x0A,0x80,0x50,0x49,0x52,  /* 000002B0    "IRB..PIR" */
+    0x42,0x14,0x1A,0x5F,0x43,0x52,0x53,0x00,  /* 000002B8    "B.._CRS." */
+    0x7B,0x50,0x49,0x52,0x42,0x0A,0x0F,0x60,  /* 000002C0    "{PIRB..`" */
+    0x79,0x01,0x60,0x49,0x52,0x51,0x56,0xA4,  /* 000002C8    "y.`IRQV." */
+    0x42,0x55,0x46,0x42,0x14,0x1B,0x5F,0x53,  /* 000002D0    "BUFB.._S" */
+    0x52,0x53,0x01,0x8B,0x68,0x01,0x49,0x52,  /* 000002D8    "RS..h.IR" */
+    0x51,0x31,0x82,0x49,0x52,0x51,0x31,0x60,  /* 000002E0    "Q1.IRQ1`" */
+    0x76,0x60,0x70,0x60,0x50,0x49,0x52,0x42,  /* 000002E8    "v`p`PIRB" */
+    0x5B,0x82,0x49,0x08,0x4C,0x4E,0x4B,0x43,  /* 000002F0    "[.I.LNKC" */
+    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 000002F8    "._HID.A." */
+    0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 00000300    "..._UID." */
+    0x03,0x14,0x1C,0x5F,0x53,0x54,0x41,0x00,  /* 00000308    "..._STA." */
+    0x7B,0x50,0x49,0x52,0x43,0x0A,0x80,0x60,  /* 00000310    "{PIRC..`" */
+    0xA0,0x08,0x93,0x60,0x0A,0x80,0xA4,0x0A,  /* 00000318    "...`...." */
+    0x09,0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x0B,  /* 00000320    "........" */
+    0x5F,0x50,0x52,0x53,0x00,0xA4,0x42,0x55,  /* 00000328    "_PRS..BU" */
+    0x46,0x41,0x14,0x11,0x5F,0x44,0x49,0x53,  /* 00000330    "FA.._DIS" */
+    0x00,0x7D,0x50,0x49,0x52,0x43,0x0A,0x80,  /* 00000338    ".}PIRC.." */
+    0x50,0x49,0x52,0x43,0x14,0x1A,0x5F,0x43,  /* 00000340    "PIRC.._C" */
+    0x52,0x53,0x00,0x7B,0x50,0x49,0x52,0x43,  /* 00000348    "RS.{PIRC" */
+    0x0A,0x0F,0x60,0x79,0x01,0x60,0x49,0x52,  /* 00000350    "..`y.`IR" */
+    0x51,0x56,0xA4,0x42,0x55,0x46,0x42,0x14,  /* 00000358    "QV.BUFB." */
+    0x1B,0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,  /* 00000360    "._SRS..h" */
+    0x01,0x49,0x52,0x51,0x31,0x82,0x49,0x52,  /* 00000368    ".IRQ1.IR" */
+    0x51,0x31,0x60,0x76,0x60,0x70,0x60,0x50,  /* 00000370    "Q1`v`p`P" */
+    0x49,0x52,0x43,0x5B,0x82,0x49,0x08,0x4C,  /* 00000378    "IRC[.I.L" */
+    0x4E,0x4B,0x44,0x08,0x5F,0x48,0x49,0x44,  /* 00000380    "NKD._HID" */
+    0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,  /* 00000388    ".A...._U" */
+    0x49,0x44,0x0A,0x04,0x14,0x1C,0x5F,0x53,  /* 00000390    "ID...._S" */
+    0x54,0x41,0x00,0x7B,0x50,0x49,0x52,0x44,  /* 00000398    "TA.{PIRD" */
+    0x0A,0x80,0x60,0xA0,0x08,0x93,0x60,0x0A,  /* 000003A0    "..`...`." */
+    0x80,0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,  /* 000003A8    "........" */
+    0x0B,0x14,0x0B,0x5F,0x50,0x52,0x53,0x00,  /* 000003B0    "..._PRS." */
+    0xA4,0x42,0x55,0x46,0x41,0x14,0x11,0x5F,  /* 000003B8    ".BUFA.._" */
+    0x44,0x49,0x53,0x00,0x7D,0x50,0x49,0x52,  /* 000003C0    "DIS.}PIR" */
+    0x44,0x0A,0x80,0x50,0x49,0x52,0x44,0x14,  /* 000003C8    "D..PIRD." */
+    0x1A,0x5F,0x43,0x52,0x53,0x00,0x7B,0x50,  /* 000003D0    "._CRS.{P" */
+    0x49,0x52,0x44,0x0A,0x0F,0x60,0x79,0x01,  /* 000003D8    "IRD..`y." */
+    0x60,0x49,0x52,0x51,0x56,0xA4,0x42,0x55,  /* 000003E0    "`IRQV.BU" */
+    0x46,0x42,0x14,0x1B,0x5F,0x53,0x52,0x53,  /* 000003E8    "FB.._SRS" */
+    0x01,0x8B,0x68,0x01,0x49,0x52,0x51,0x31,  /* 000003F0    "..h.IRQ1" */
+    0x82,0x49,0x52,0x51,0x31,0x60,0x76,0x60,  /* 000003F8    ".IRQ1`v`" */
+    0x70,0x60,0x50,0x49,0x52,0x44,0x5B,0x82,  /* 00000400    "p`PIRD[." */
+    0x3A,0x48,0x50,0x45,0x54,0x08,0x5F,0x48,  /* 00000408    ":HPET._H" */
+    0x49,0x44,0x0C,0x41,0xD0,0x01,0x03,0x08,  /* 00000410    "ID.A...." */
+    0x5F,0x55,0x49,0x44,0x00,0x08,0x5F,0x43,  /* 00000418    "_UID.._C" */
+    0x52,0x53,0x11,0x1F,0x0A,0x1C,0x87,0x17,  /* 00000420    "RS......" */
+    0x00,0x00,0x0D,0x01,0x00,0x00,0x00,0x00,  /* 00000428    "........" */
+    0x00,0x00,0xD0,0xFE,0xFF,0x03,0xD0,0xFE,  /* 00000430    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,  /* 00000438    "........" */
+    0x79,0x00,0x14,0x16,0x5F,0x50,0x52,0x54,  /* 00000440    "y..._PRT" */
+    0x00,0xA0,0x0A,0x50,0x49,0x43,0x44,0xA4,  /* 00000448    "...PICD." */
+    0x50,0x52,0x54,0x41,0xA4,0x50,0x52,0x54,  /* 00000450    "PRTA.PRT" */
+    0x50,0x08,0x50,0x52,0x54,0x50,0x12,0x49,  /* 00000458    "P.PRTP.I" */
+    0x36,0x3C,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000460    "6<......" */
+    0x01,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000468    "...LNKB." */
+    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 00000470    "........" */
+    0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000478    ".LNKC..." */
+    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x02,  /* 00000480    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000488    "LNKD...." */
+    0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x03,0x4C,  /* 00000490    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,  /* 00000498    "NKA....." */
+    0xFF,0xFF,0x02,0x00,0x00,0x4C,0x4E,0x4B,  /* 000004A0    ".....LNK" */
+    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000004A8    "C......." */
+    0x02,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,  /* 000004B0    "...LNKD." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 000004B8    "........" */
+    0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 000004C0    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,  /* 000004C8    "........" */
+    0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,  /* 000004D0    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x00,0x4C,  /* 000004D8    ".......L" */
+    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 000004E0    "NKD....." */
+    0xFF,0xFF,0x03,0x00,0x01,0x4C,0x4E,0x4B,  /* 000004E8    ".....LNK" */
+    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000004F0    "A......." */
+    0x03,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,  /* 000004F8    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000500    "........" */
+    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000508    "...LNKC." */
+    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 00000510    "........" */
+    0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 00000518    ".LNKA..." */
+    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x01,0x4C,  /* 00000520    ".......L" */
+    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000528    "NKB....." */
+    0xFF,0xFF,0x04,0x00,0x0A,0x02,0x4C,0x4E,  /* 00000530    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000538    "KC......" */
+    0xFF,0x04,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 00000540    ".....LNK" */
+    0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000548    "D......." */
+    0x05,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000550    "...LNKB." */
+    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 00000558    "........" */
+    0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000560    ".LNKC..." */
+    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x02,  /* 00000568    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000570    "LNKD...." */
+    0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x03,0x4C,  /* 00000578    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,  /* 00000580    "NKA....." */
+    0xFF,0xFF,0x06,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000588    ".....LNK" */
+    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000590    "C......." */
+    0x06,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000598    "...LNKD." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 000005A0    "........" */
+    0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 000005A8    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,  /* 000005B0    "........" */
+    0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,  /* 000005B8    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x00,0x4C,  /* 000005C0    ".......L" */
+    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 000005C8    "NKD....." */
+    0xFF,0xFF,0x07,0x00,0x01,0x4C,0x4E,0x4B,  /* 000005D0    ".....LNK" */
+    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000005D8    "A......." */
+    0x07,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,  /* 000005E0    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x07,  /* 000005E8    "........" */
+    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,  /* 000005F0    "...LNKC." */
+    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 000005F8    "........" */
+    0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 00000600    ".LNKA..." */
+    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x01,0x4C,  /* 00000608    ".......L" */
+    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 00000610    "NKB....." */
+    0xFF,0xFF,0x08,0x00,0x0A,0x02,0x4C,0x4E,  /* 00000618    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000620    "KC......" */
+    0xFF,0x08,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 00000628    ".....LNK" */
+    0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000630    "D......." */
+    0x09,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000638    "...LNKB." */
+    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 00000640    "........" */
+    0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000648    ".LNKC..." */
+    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x02,  /* 00000650    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000658    "LNKD...." */
+    0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x03,0x4C,  /* 00000660    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,  /* 00000668    "NKA....." */
+    0xFF,0xFF,0x0A,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000670    ".....LNK" */
+    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000678    "C......." */
+    0x0A,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000680    "...LNKD." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000688    "........" */
+    0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000690    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,  /* 00000698    "........" */
+    0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,  /* 000006A0    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x00,0x4C,  /* 000006A8    ".......L" */
+    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 000006B0    "NKD....." */
+    0xFF,0xFF,0x0B,0x00,0x01,0x4C,0x4E,0x4B,  /* 000006B8    ".....LNK" */
+    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000006C0    "A......." */
+    0x0B,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,  /* 000006C8    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0B,  /* 000006D0    "........" */
+    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,  /* 000006D8    "...LNKC." */
+    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 000006E0    "........" */
+    0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 000006E8    ".LNKA..." */
+    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x01,0x4C,  /* 000006F0    ".......L" */
+    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 000006F8    "NKB....." */
+    0xFF,0xFF,0x0C,0x00,0x0A,0x02,0x4C,0x4E,  /* 00000700    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000708    "KC......" */
+    0xFF,0x0C,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 00000710    ".....LNK" */
+    0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000718    "D......." */
+    0x0D,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000720    "...LNKB." */
+    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 00000728    "........" */
+    0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000730    ".LNKC..." */
+    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x02,  /* 00000738    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000740    "LNKD...." */
+    0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x03,0x4C,  /* 00000748    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,  /* 00000750    "NKA....." */
+    0xFF,0xFF,0x0E,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000758    ".....LNK" */
+    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000760    "C......." */
+    0x0E,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000768    "...LNKD." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000770    "........" */
+    0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000778    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,  /* 00000780    "........" */
+    0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,  /* 00000788    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x00,0x4C,  /* 00000790    ".......L" */
+    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 00000798    "NKD....." */
+    0xFF,0xFF,0x0F,0x00,0x01,0x4C,0x4E,0x4B,  /* 000007A0    ".....LNK" */
+    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000007A8    "A......." */
+    0x0F,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,  /* 000007B0    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0F,  /* 000007B8    "........" */
+    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,  /* 000007C0    "...LNKC." */
+    0x08,0x50,0x52,0x54,0x41,0x12,0x41,0x2F,  /* 000007C8    ".PRTA.A/" */
+    0x3C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x01,  /* 000007D0    "<......." */
+    0x00,0x00,0x00,0x0A,0x14,0x12,0x0B,0x04,  /* 000007D8    "........" */
+    0x0C,0xFF,0xFF,0x01,0x00,0x01,0x00,0x0A,  /* 000007E0    "........" */
+    0x15,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x01,  /* 000007E8    "........" */
+    0x00,0x0A,0x02,0x00,0x0A,0x16,0x12,0x0C,  /* 000007F0    "........" */
+    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x03,  /* 000007F8    "........" */
+    0x00,0x0A,0x17,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000800    "........" */
+    0xFF,0x02,0x00,0x00,0x00,0x0A,0x18,0x12,  /* 00000808    "........" */
+    0x0B,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x01,  /* 00000810    "........" */
+    0x00,0x0A,0x19,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000818    "........" */
+    0xFF,0x02,0x00,0x0A,0x02,0x00,0x0A,0x1A,  /* 00000820    "........" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 00000828    "........" */
+    0x0A,0x03,0x00,0x0A,0x1B,0x12,0x0B,0x04,  /* 00000830    "........" */
+    0x0C,0xFF,0xFF,0x03,0x00,0x00,0x00,0x0A,  /* 00000838    "........" */
+    0x1C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000840    "........" */
+    0x00,0x01,0x00,0x0A,0x1D,0x12,0x0C,0x04,  /* 00000848    "........" */
+    0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x02,0x00,  /* 00000850    "........" */
+    0x0A,0x1E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000858    "........" */
+    0x03,0x00,0x0A,0x03,0x00,0x0A,0x1F,0x12,  /* 00000860    "........" */
+    0x0B,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x00,  /* 00000868    "........" */
+    0x00,0x0A,0x20,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000870    ".. ....." */
+    0xFF,0x04,0x00,0x01,0x00,0x0A,0x21,0x12,  /* 00000878    "......!." */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,  /* 00000880    "........" */
+    0x02,0x00,0x0A,0x22,0x12,0x0C,0x04,0x0C,  /* 00000888    "..."...." */
+    0xFF,0xFF,0x04,0x00,0x0A,0x03,0x00,0x0A,  /* 00000890    "........" */
+    0x23,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x05,  /* 00000898    "#......." */
+    0x00,0x00,0x00,0x0A,0x24,0x12,0x0B,0x04,  /* 000008A0    "....$..." */
+    0x0C,0xFF,0xFF,0x05,0x00,0x01,0x00,0x0A,  /* 000008A8    "........" */
+    0x25,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x05,  /* 000008B0    "%......." */
+    0x00,0x0A,0x02,0x00,0x0A,0x26,0x12,0x0C,  /* 000008B8    ".....&.." */
+    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x03,  /* 000008C0    "........" */
+    0x00,0x0A,0x27,0x12,0x0B,0x04,0x0C,0xFF,  /* 000008C8    "..'....." */
+    0xFF,0x06,0x00,0x00,0x00,0x0A,0x28,0x12,  /* 000008D0    "......(." */
+    0x0B,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x01,  /* 000008D8    "........" */
+    0x00,0x0A,0x29,0x12,0x0C,0x04,0x0C,0xFF,  /* 000008E0    "..)....." */
+    0xFF,0x06,0x00,0x0A,0x02,0x00,0x0A,0x2A,  /* 000008E8    ".......*" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 000008F0    "........" */
+    0x0A,0x03,0x00,0x0A,0x2B,0x12,0x0B,0x04,  /* 000008F8    "....+..." */
+    0x0C,0xFF,0xFF,0x07,0x00,0x00,0x00,0x0A,  /* 00000900    "........" */
+    0x2C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x07,  /* 00000908    ",......." */
+    0x00,0x01,0x00,0x0A,0x2D,0x12,0x0C,0x04,  /* 00000910    "....-..." */
+    0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x02,0x00,  /* 00000918    "........" */
+    0x0A,0x2E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000920    "........" */
+    0x07,0x00,0x0A,0x03,0x00,0x0A,0x2F,0x12,  /* 00000928    "....../." */
+    0x0B,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x00,  /* 00000930    "........" */
+    0x00,0x0A,0x11,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000938    "........" */
+    0xFF,0x08,0x00,0x01,0x00,0x0A,0x12,0x12,  /* 00000940    "........" */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,  /* 00000948    "........" */
+    0x02,0x00,0x0A,0x13,0x12,0x0C,0x04,0x0C,  /* 00000950    "........" */
+    0xFF,0xFF,0x08,0x00,0x0A,0x03,0x00,0x0A,  /* 00000958    "........" */
+    0x14,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x09,  /* 00000960    "........" */
+    0x00,0x00,0x00,0x0A,0x15,0x12,0x0B,0x04,  /* 00000968    "........" */
+    0x0C,0xFF,0xFF,0x09,0x00,0x01,0x00,0x0A,  /* 00000970    "........" */
+    0x16,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x09,  /* 00000978    "........" */
+    0x00,0x0A,0x02,0x00,0x0A,0x17,0x12,0x0C,  /* 00000980    "........" */
+    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x03,  /* 00000988    "........" */
+    0x00,0x0A,0x18,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000990    "........" */
+    0xFF,0x0A,0x00,0x00,0x00,0x0A,0x19,0x12,  /* 00000998    "........" */
+    0x0B,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x01,  /* 000009A0    "........" */
+    0x00,0x0A,0x1A,0x12,0x0C,0x04,0x0C,0xFF,  /* 000009A8    "........" */
+    0xFF,0x0A,0x00,0x0A,0x02,0x00,0x0A,0x1B,  /* 000009B0    "........" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 000009B8    "........" */
+    0x0A,0x03,0x00,0x0A,0x1C,0x12,0x0B,0x04,  /* 000009C0    "........" */
+    0x0C,0xFF,0xFF,0x0B,0x00,0x00,0x00,0x0A,  /* 000009C8    "........" */
+    0x1D,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0B,  /* 000009D0    "........" */
+    0x00,0x01,0x00,0x0A,0x1E,0x12,0x0C,0x04,  /* 000009D8    "........" */
+    0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x02,0x00,  /* 000009E0    "........" */
+    0x0A,0x1F,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 000009E8    "........" */
+    0x0B,0x00,0x0A,0x03,0x00,0x0A,0x20,0x12,  /* 000009F0    "...... ." */
+    0x0B,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x00,  /* 000009F8    "........" */
+    0x00,0x0A,0x21,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000A00    "..!....." */
+    0xFF,0x0C,0x00,0x01,0x00,0x0A,0x22,0x12,  /* 00000A08    "......"." */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,  /* 00000A10    "........" */
+    0x02,0x00,0x0A,0x23,0x12,0x0C,0x04,0x0C,  /* 00000A18    "...#...." */
+    0xFF,0xFF,0x0C,0x00,0x0A,0x03,0x00,0x0A,  /* 00000A20    "........" */
+    0x24,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0D,  /* 00000A28    "$......." */
+    0x00,0x00,0x00,0x0A,0x25,0x12,0x0B,0x04,  /* 00000A30    "....%..." */
+    0x0C,0xFF,0xFF,0x0D,0x00,0x01,0x00,0x0A,  /* 00000A38    "........" */
+    0x26,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0D,  /* 00000A40    "&......." */
+    0x00,0x0A,0x02,0x00,0x0A,0x27,0x12,0x0C,  /* 00000A48    ".....'.." */
+    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x03,  /* 00000A50    "........" */
+    0x00,0x0A,0x28,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000A58    "..(....." */
+    0xFF,0x0E,0x00,0x00,0x00,0x0A,0x29,0x12,  /* 00000A60    "......)." */
+    0x0B,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x01,  /* 00000A68    "........" */
+    0x00,0x0A,0x2A,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000A70    "..*....." */
+    0xFF,0x0E,0x00,0x0A,0x02,0x00,0x0A,0x2B,  /* 00000A78    ".......+" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000A80    "........" */
+    0x0A,0x03,0x00,0x0A,0x2C,0x12,0x0B,0x04,  /* 00000A88    "....,..." */
+    0x0C,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x0A,  /* 00000A90    "........" */
+    0x2D,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0F,  /* 00000A98    "-......." */
+    0x00,0x01,0x00,0x0A,0x2E,0x12,0x0C,0x04,  /* 00000AA0    "........" */
+    0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x02,0x00,  /* 00000AA8    "........" */
+    0x0A,0x2F,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000AB0    "./......" */
+    0x0F,0x00,0x0A,0x03,0x00,0x0A,0x10,0x5B,  /* 00000AB8    ".......[" */
+    0x82,0x46,0x37,0x49,0x53,0x41,0x5F,0x08,  /* 00000AC0    ".F7ISA_." */
+    0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,0x01,  /* 00000AC8    "_ADR...." */
+    0x00,0x5B,0x80,0x50,0x49,0x52,0x51,0x02,  /* 00000AD0    ".[.PIRQ." */
+    0x0A,0x60,0x0A,0x04,0x10,0x2E,0x5C,0x00,  /* 00000AD8    ".`....\." */
+    0x5B,0x81,0x29,0x5C,0x2F,0x04,0x5F,0x53,  /* 00000AE0    "[.)\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x49,0x53,  /* 00000AE8    "B_PCI0IS" */
+    0x41,0x5F,0x50,0x49,0x52,0x51,0x01,0x50,  /* 00000AF0    "A_PIRQ.P" */
+    0x49,0x52,0x41,0x08,0x50,0x49,0x52,0x42,  /* 00000AF8    "IRA.PIRB" */
+    0x08,0x50,0x49,0x52,0x43,0x08,0x50,0x49,  /* 00000B00    ".PIRC.PI" */
+    0x52,0x44,0x08,0x5B,0x82,0x46,0x0B,0x53,  /* 00000B08    "RD.[.F.S" */
+    0x59,0x53,0x52,0x08,0x5F,0x48,0x49,0x44,  /* 00000B10    "YSR._HID" */
+    0x0C,0x41,0xD0,0x0C,0x02,0x08,0x5F,0x55,  /* 00000B18    ".A...._U" */
+    0x49,0x44,0x01,0x08,0x43,0x52,0x53,0x5F,  /* 00000B20    "ID..CRS_" */
+    0x11,0x4E,0x08,0x0A,0x8A,0x47,0x01,0x10,  /* 00000B28    ".N...G.." */
+    0x00,0x10,0x00,0x00,0x10,0x47,0x01,0x22,  /* 00000B30    ".....G."" */
+    0x00,0x22,0x00,0x00,0x0C,0x47,0x01,0x30,  /* 00000B38    "."...G.0" */
+    0x00,0x30,0x00,0x00,0x10,0x47,0x01,0x44,  /* 00000B40    ".0...G.D" */
+    0x00,0x44,0x00,0x00,0x1C,0x47,0x01,0x62,  /* 00000B48    ".D...G.b" */
+    0x00,0x62,0x00,0x00,0x02,0x47,0x01,0x65,  /* 00000B50    ".b...G.e" */
+    0x00,0x65,0x00,0x00,0x0B,0x47,0x01,0x72,  /* 00000B58    ".e...G.r" */
+    0x00,0x72,0x00,0x00,0x0E,0x47,0x01,0x80,  /* 00000B60    ".r...G.." */
+    0x00,0x80,0x00,0x00,0x01,0x47,0x01,0x84,  /* 00000B68    ".....G.." */
+    0x00,0x84,0x00,0x00,0x03,0x47,0x01,0x88,  /* 00000B70    ".....G.." */
+    0x00,0x88,0x00,0x00,0x01,0x47,0x01,0x8C,  /* 00000B78    ".....G.." */
+    0x00,0x8C,0x00,0x00,0x03,0x47,0x01,0x90,  /* 00000B80    ".....G.." */
+    0x00,0x90,0x00,0x00,0x10,0x47,0x01,0xA2,  /* 00000B88    ".....G.." */
+    0x00,0xA2,0x00,0x00,0x1C,0x47,0x01,0xE0,  /* 00000B90    ".....G.." */
+    0x00,0xE0,0x00,0x00,0x10,0x47,0x01,0xA0,  /* 00000B98    ".....G.." */
+    0x08,0xA0,0x08,0x00,0x04,0x47,0x01,0xC0,  /* 00000BA0    ".....G.." */
+    0x0C,0xC0,0x0C,0x00,0x10,0x47,0x01,0xD0,  /* 00000BA8    ".....G.." */
+    0x04,0xD0,0x04,0x00,0x02,0x79,0x00,0x14,  /* 00000BB0    ".....y.." */
+    0x0B,0x5F,0x43,0x52,0x53,0x00,0xA4,0x43,  /* 00000BB8    "._CRS..C" */
+    0x52,0x53,0x5F,0x5B,0x82,0x2B,0x50,0x49,  /* 00000BC0    "RS_[.+PI" */
+    0x43,0x5F,0x08,0x5F,0x48,0x49,0x44,0x0B,  /* 00000BC8    "C_._HID." */
+    0x41,0xD0,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000BD0    "A.._CRS." */
+    0x18,0x0A,0x15,0x47,0x01,0x20,0x00,0x20,  /* 00000BD8    "...G. . " */
+    0x00,0x01,0x02,0x47,0x01,0xA0,0x00,0xA0,  /* 00000BE0    "...G...." */
+    0x00,0x01,0x02,0x22,0x04,0x00,0x79,0x00,  /* 00000BE8    "..."..y." */
+    0x5B,0x82,0x47,0x05,0x44,0x4D,0x41,0x30,  /* 00000BF0    "[.G.DMA0" */
+    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000BF8    "._HID.A." */
+    0x02,0x00,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000C00    "..._CRS." */
+    0x41,0x04,0x0A,0x3D,0x2A,0x10,0x04,0x47,  /* 00000C08    "A..=*..G" */
+    0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x47,  /* 00000C10    ".......G" */
+    0x01,0x81,0x00,0x81,0x00,0x00,0x03,0x47,  /* 00000C18    ".......G" */
+    0x01,0x87,0x00,0x87,0x00,0x00,0x01,0x47,  /* 00000C20    ".......G" */
+    0x01,0x89,0x00,0x89,0x00,0x00,0x03,0x47,  /* 00000C28    ".......G" */
+    0x01,0x8F,0x00,0x8F,0x00,0x00,0x01,0x47,  /* 00000C30    ".......G" */
+    0x01,0xC0,0x00,0xC0,0x00,0x00,0x20,0x47,  /* 00000C38    "...... G" */
+    0x01,0x80,0x04,0x80,0x04,0x00,0x10,0x79,  /* 00000C40    ".......y" */
+    0x00,0x5B,0x82,0x25,0x54,0x4D,0x52,0x5F,  /* 00000C48    ".[.%TMR_" */
+    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000C50    "._HID.A." */
+    0x01,0x00,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000C58    "..._CRS." */
+    0x10,0x0A,0x0D,0x47,0x01,0x40,0x00,0x40,  /* 00000C60    "...G.@.@" */
+    0x00,0x00,0x04,0x22,0x01,0x00,0x79,0x00,  /* 00000C68    "..."..y." */
+    0x5B,0x82,0x25,0x52,0x54,0x43,0x5F,0x08,  /* 00000C70    "[.%RTC_." */
+    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0B,  /* 00000C78    "_HID.A.." */
+    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x10,  /* 00000C80    ".._CRS.." */
+    0x0A,0x0D,0x47,0x01,0x70,0x00,0x70,0x00,  /* 00000C88    "..G.p.p." */
+    0x00,0x02,0x22,0x00,0x01,0x79,0x00,0x5B,  /* 00000C90    ".."..y.[" */
+    0x82,0x22,0x53,0x50,0x4B,0x52,0x08,0x5F,  /* 00000C98    "."SPKR._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x08,0x00,  /* 00000CA0    "HID.A..." */
+    0x08,0x5F,0x43,0x52,0x53,0x11,0x0D,0x0A,  /* 00000CA8    "._CRS..." */
+    0x0A,0x47,0x01,0x61,0x00,0x61,0x00,0x00,  /* 00000CB0    ".G.a.a.." */
+    0x01,0x79,0x00,0x5B,0x82,0x31,0x50,0x53,  /* 00000CB8    ".y.[.1PS" */
+    0x32,0x4D,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000CC0    "2M._HID." */
+    0x41,0xD0,0x0F,0x13,0x08,0x5F,0x43,0x49,  /* 00000CC8    "A...._CI" */
+    0x44,0x0C,0x41,0xD0,0x0F,0x13,0x14,0x09,  /* 00000CD0    "D.A....." */
+    0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,  /* 00000CD8    "_STA...." */
+    0x08,0x5F,0x43,0x52,0x53,0x11,0x08,0x0A,  /* 00000CE0    "._CRS..." */
+    0x05,0x22,0x00,0x10,0x79,0x00,0x5B,0x82,  /* 00000CE8    "."..y.[." */
+    0x42,0x04,0x50,0x53,0x32,0x4B,0x08,0x5F,  /* 00000CF0    "B.PS2K._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x03,0x03,  /* 00000CF8    "HID.A..." */
+    0x08,0x5F,0x43,0x49,0x44,0x0C,0x41,0xD0,  /* 00000D00    "._CID.A." */
+    0x03,0x0B,0x14,0x09,0x5F,0x53,0x54,0x41,  /* 00000D08    "...._STA" */
+    0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,  /* 00000D10    "....._CR" */
+    0x53,0x11,0x18,0x0A,0x15,0x47,0x01,0x60,  /* 00000D18    "S....G.`" */
+    0x00,0x60,0x00,0x00,0x01,0x47,0x01,0x64,  /* 00000D20    ".`...G.d" */
+    0x00,0x64,0x00,0x00,0x01,0x22,0x02,0x00,  /* 00000D28    ".d...".." */
+    0x79,0x00,0x5B,0x82,0x3A,0x46,0x44,0x43,  /* 00000D30    "y.[.:FDC" */
+    0x30,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000D38    "0._HID.A" */
+    0xD0,0x07,0x00,0x14,0x09,0x5F,0x53,0x54,  /* 00000D40    "....._ST" */
+    0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,  /* 00000D48    "A....._C" */
+    0x52,0x53,0x11,0x1B,0x0A,0x18,0x47,0x01,  /* 00000D50    "RS....G." */
+    0xF0,0x03,0xF0,0x03,0x01,0x06,0x47,0x01,  /* 00000D58    "......G." */
+    0xF7,0x03,0xF7,0x03,0x01,0x01,0x22,0x40,  /* 00000D60    "......"@" */
+    0x00,0x2A,0x04,0x00,0x79,0x00,0x5B,0x82,  /* 00000D68    ".*..y.[." */
+    0x46,0x04,0x55,0x41,0x52,0x31,0x08,0x5F,  /* 00000D70    "F.UAR1._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x05,0x01,  /* 00000D78    "HID.A..." */
+    0x08,0x5F,0x55,0x49,0x44,0x01,0x14,0x19,  /* 00000D80    "._UID..." */
+    0x5F,0x53,0x54,0x41,0x00,0xA0,0x0D,0x93,  /* 00000D88    "_STA...." */
+    0x5E,0x5E,0x5E,0x5E,0x55,0x41,0x52,0x31,  /* 00000D90    "^^^^UAR1" */
+    0x00,0xA4,0x00,0xA1,0x04,0xA4,0x0A,0x0F,  /* 00000D98    "........" */
+    0x08,0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,  /* 00000DA0    "._CRS..." */
+    0x0D,0x47,0x01,0xF8,0x03,0xF8,0x03,0x08,  /* 00000DA8    ".G......" */
+    0x08,0x22,0x10,0x00,0x79,0x00,0x5B,0x82,  /* 00000DB0    "."..y.[." */
+    0x47,0x04,0x55,0x41,0x52,0x32,0x08,0x5F,  /* 00000DB8    "G.UAR2._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x05,0x01,  /* 00000DC0    "HID.A..." */
+    0x08,0x5F,0x55,0x49,0x44,0x0A,0x02,0x14,  /* 00000DC8    "._UID..." */
+    0x19,0x5F,0x53,0x54,0x41,0x00,0xA0,0x0D,  /* 00000DD0    "._STA..." */
+    0x93,0x5E,0x5E,0x5E,0x5E,0x55,0x41,0x52,  /* 00000DD8    ".^^^^UAR" */
+    0x32,0x00,0xA4,0x00,0xA1,0x04,0xA4,0x0A,  /* 00000DE0    "2......." */
+    0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,0x10,  /* 00000DE8    ".._CRS.." */
+    0x0A,0x0D,0x47,0x01,0xF8,0x02,0xF8,0x02,  /* 00000DF0    "..G....." */
+    0x08,0x08,0x22,0x08,0x00,0x79,0x00,0x5B,  /* 00000DF8    ".."..y.[" */
+    0x82,0x36,0x4C,0x54,0x50,0x31,0x08,0x5F,  /* 00000E00    ".6LTP1._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x04,0x00,  /* 00000E08    "HID.A..." */
+    0x08,0x5F,0x55,0x49,0x44,0x0A,0x02,0x14,  /* 00000E10    "._UID..." */
+    0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,  /* 00000E18    "._STA..." */
+    0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,0x10,  /* 00000E20    ".._CRS.." */
+    0x0A,0x0D,0x47,0x01,0x78,0x03,0x78,0x03,  /* 00000E28    "..G.x.x." */
+    0x08,0x08,0x22,0x80,0x00,0x79,0x00,0x5B,  /* 00000E30    ".."..y.[" */
+    0x82,0x4D,0x07,0x53,0x31,0x46,0x30,0x08,  /* 00000E38    ".M.S1F0." */
+    0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,0x06,  /* 00000E40    "_ADR...." */
+    0x00,0x08,0x5F,0x53,0x55,0x4E,0x01,0x14,  /* 00000E48    ".._SUN.." */
+    0x13,0x5F,0x50,0x53,0x30,0x00,0x70,0x0A,  /* 00000E50    "._PS0.p." */
+    0x80,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00000E58    ".\._GPED" */
+    0x50,0x54,0x32,0x14,0x13,0x5F,0x50,0x53,  /* 00000E60    "PT2.._PS" */
+    0x33,0x00,0x70,0x0A,0x83,0x5C,0x2E,0x5F,  /* 00000E68    "3.p..\._" */
+    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00000E70    "GPEDPT2." */
+    0x1F,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00000E78    "._EJ0.p." */
+    0x88,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00000E80    ".\._GPED" */
+    0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,0x5F,  /* 00000E88    "PT2p.\._" */
+    0x47,0x50,0x45,0x50,0x48,0x50,0x31,0x14,  /* 00000E90    "GPEPHP1." */
+    0x1E,0x5F,0x53,0x54,0x41,0x00,0x70,0x0A,  /* 00000E98    "._STA.p." */
+    0x89,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00000EA0    ".\._GPED" */
+    0x50,0x54,0x32,0xA4,0x5C,0x2E,0x5F,0x47,  /* 00000EA8    "PT2.\._G" */
+    0x50,0x45,0x50,0x48,0x50,0x31,0x5B,0x82,  /* 00000EB0    "PEPHP1[." */
+    0x4E,0x07,0x53,0x32,0x46,0x30,0x08,0x5F,  /* 00000EB8    "N.S2F0._" */
+    0x41,0x44,0x52,0x0C,0x00,0x00,0x07,0x00,  /* 00000EC0    "ADR....." */
+    0x08,0x5F,0x53,0x55,0x4E,0x0A,0x02,0x14,  /* 00000EC8    "._SUN..." */
+    0x13,0x5F,0x50,0x53,0x30,0x00,0x70,0x0A,  /* 00000ED0    "._PS0.p." */
+    0x90,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00000ED8    ".\._GPED" */
+    0x50,0x54,0x32,0x14,0x13,0x5F,0x50,0x53,  /* 00000EE0    "PT2.._PS" */
+    0x33,0x00,0x70,0x0A,0x93,0x5C,0x2E,0x5F,  /* 00000EE8    "3.p..\._" */
+    0x47,0x50,0x45,0x44,0x50,0x54,0x32,0x14,  /* 00000EF0    "GPEDPT2." */
+    0x1F,0x5F,0x45,0x4A,0x30,0x01,0x70,0x0A,  /* 00000EF8    "._EJ0.p." */
+    0x98,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00000F00    ".\._GPED" */
+    0x50,0x54,0x32,0x70,0x01,0x5C,0x2E,0x5F,  /* 00000F08    "PT2p.\._" */
+    0x47,0x50,0x45,0x50,0x48,0x50,0x32,0x14,  /* 00000F10    "GPEPHP2." */
+    0x1E,0x5F,0x53,0x54,0x41,0x00,0x70,0x0A,  /* 00000F18    "._STA.p." */
+    0x99,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x44,  /* 00000F20    ".\._GPED" */
+    0x50,0x54,0x32,0xA4,0x5C,0x2E,0x5F,0x47,  /* 00000F28    "PT2.\._G" */
+    0x50,0x45,0x50,0x48,0x50,0x32,0x10,0x4E,  /* 00000F30    "PEPHP2.N" */
+    0x0B,0x5F,0x47,0x50,0x45,0x5B,0x80,0x50,  /* 00000F38    "._GPE[.P" */
+    0x48,0x50,0x5F,0x01,0x0B,0xC0,0x10,0x0A,  /* 00000F40    "HP_....." */
+    0x03,0x5B,0x81,0x15,0x50,0x48,0x50,0x5F,  /* 00000F48    ".[..PHP_" */
+    0x01,0x50,0x53,0x54,0x41,0x08,0x50,0x48,  /* 00000F50    ".PSTA.PH" */
+    0x50,0x31,0x08,0x50,0x48,0x50,0x32,0x08,  /* 00000F58    "P1.PHP2." */
+    0x5B,0x80,0x44,0x47,0x31,0x5F,0x01,0x0B,  /* 00000F60    "[.DG1_.." */
+    0x44,0xB0,0x0A,0x04,0x5B,0x81,0x10,0x44,  /* 00000F68    "D...[..D" */
+    0x47,0x31,0x5F,0x01,0x44,0x50,0x54,0x31,  /* 00000F70    "G1_.DPT1" */
+    0x08,0x44,0x50,0x54,0x32,0x08,0x14,0x46,  /* 00000F78    ".DPT2..F" */
+    0x07,0x5F,0x4C,0x30,0x33,0x00,0x08,0x53,  /* 00000F80    "._L03..S" */
+    0x4C,0x54,0x5F,0x00,0x08,0x45,0x56,0x54,  /* 00000F88    "LT_..EVT" */
+    0x5F,0x00,0x70,0x50,0x53,0x54,0x41,0x61,  /* 00000F90    "_.pPSTAa" */
+    0x7A,0x61,0x0A,0x04,0x53,0x4C,0x54,0x5F,  /* 00000F98    "za..SLT_" */
+    0x7B,0x61,0x0A,0x0F,0x45,0x56,0x54,0x5F,  /* 00000FA0    "{a..EVT_" */
+    0x70,0x53,0x4C,0x54,0x5F,0x44,0x50,0x54,  /* 00000FA8    "pSLT_DPT" */
+    0x31,0x70,0x45,0x56,0x54,0x5F,0x44,0x50,  /* 00000FB0    "1pEVT_DP" */
+    0x54,0x32,0xA0,0x1B,0x93,0x53,0x4C,0x54,  /* 00000FB8    "T2...SLT" */
+    0x5F,0x01,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00000FC0    "_..\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00000FC8    "B_PCI0S1" */
+    0x46,0x30,0x45,0x56,0x54,0x5F,0xA1,0x1E,  /* 00000FD0    "F0EVT_.." */
+    0xA0,0x1C,0x93,0x53,0x4C,0x54,0x5F,0x0A,  /* 00000FD8    "...SLT_." */
+    0x02,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00000FE0    "..\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x46,  /* 00000FE8    "_PCI0S2F" */
+    0x30,0x45,0x56,0x54,0x5F,
 };
 int DsdtLen=sizeof(AmlCode);
diff -r 929210166e3f -r d1f20fa87c60 tools/firmware/hvmloader/acpi/static_tables.c
--- a/tools/firmware/hvmloader/acpi/static_tables.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/firmware/hvmloader/acpi/static_tables.c	Wed Jan 23 22:10:59 2008 +0800
@@ -59,9 +59,11 @@ struct acpi_20_fadt Fadt = {
     .pm1a_evt_blk = ACPI_PM1A_EVT_BLK_ADDRESS,
     .pm1a_cnt_blk = ACPI_PM1A_CNT_BLK_ADDRESS,
     .pm_tmr_blk = ACPI_PM_TMR_BLK_ADDRESS,
+    .gpe0_blk = ACPI_GPE0_BLK_ADDRESS,
     .pm1_evt_len = ACPI_PM1A_EVT_BLK_BIT_WIDTH / 8,
     .pm1_cnt_len = ACPI_PM1A_CNT_BLK_BIT_WIDTH / 8,
     .pm_tmr_len = ACPI_PM_TMR_BLK_BIT_WIDTH / 8,
+    .gpe0_blk_len = ACPI_GPE0_BLK_LEN,
 
     .p_lvl2_lat = 0x0fff, /* >100,  means we do not support C2 state */
     .p_lvl3_lat = 0x0fff, /* >1000, means we do not support C3 state */
diff -r 929210166e3f -r d1f20fa87c60 tools/ioemu/hw/pass-through.c
--- a/tools/ioemu/hw/pass-through.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/ioemu/hw/pass-through.c	Wed Jan 23 22:10:59 2008 +0800
@@ -29,6 +29,22 @@
 
 extern FILE *logfile;
 
+struct php_dev {
+    struct pt_dev *pt_dev;
+    uint8_t valid;
+    uint8_t r_bus;
+    uint8_t r_dev;
+    uint8_t r_func;
+};
+struct dpci_infos {
+
+    struct php_dev php_devs[PHP_SLOT_LEN];
+
+    PCIBus *e_bus;
+    struct pci_access *pci_access;
+
+} dpci_infos;
+
 static int token_value(char *token)
 {
     token = strchr(token, 'x') + 1;
@@ -54,6 +70,63 @@ static int next_bdf(char **str, int *seg
     *str = token ? token + 1 : NULL;
 
     return 1;
+}
+
+static inline int __insert_to_free_slot(int bus, int dev, int func)
+{
+    int i;
+    for ( i = 0; i < PHP_SLOT_LEN; i++ )
+    {
+        if ( !dpci_infos.php_devs[i].valid )
+        {
+            dpci_infos.php_devs[i].valid  = 1;
+            dpci_infos.php_devs[i].r_bus  = bus;
+            dpci_infos.php_devs[i].r_dev  = dev;
+            dpci_infos.php_devs[i].r_func = func;
+            return i;
+        }
+    }
+
+    return -1;
+}
+
+/* find a virtual free pci hotplug slot for a new pass-through device with specific BDF */
+int insert_to_free_slot(char *bdf_str)
+{
+    int seg, bus, dev, func;
+
+    if ( !next_bdf(&bdf_str, &seg, &bus, &dev, &func))
+    {
+        return -1;
+    }
+
+    return __insert_to_free_slot(bus, dev, func);
+
+}
+
+/* find the pci slot for pass-through dev with specified BDF */
+int bdf_to_slot(char *bdf_str)
+{
+    int seg, bus, dev, func, i;
+
+    if ( !next_bdf(&bdf_str, &seg, &bus, &dev, &func))
+    {
+        return -1;
+    }
+
+    /* locate the virtual pci slot for this VTd device */
+    for ( i = 0; i < PHP_SLOT_LEN; i++ )
+    {
+        if ( dpci_infos.php_devs[i].valid &&
+           dpci_infos.php_devs[i].r_bus == bus &&
+           dpci_infos.php_devs[i].r_dev  == dev &&
+           dpci_infos.php_devs[i].r_func == func )
+        {
+            return i;
+        }
+    }
+
+    return -1;
 }
 
 uint8_t find_cap_offset(struct pci_dev *pci_dev, uint8_t cap)
@@ -323,11 +396,12 @@ struct pt_dev * register_real_device(PCI
         const char *e_dev_name, int e_devfn, uint8_t r_bus, uint8_t r_dev,
         uint8_t r_func, uint32_t machine_irq, struct pci_access *pci_access)
 {
-    int rc, i;
+    int rc = -1, i;
     struct pt_dev *assigned_device = NULL;
     struct pci_dev *pci_dev;
     uint8_t e_device, e_intx;
     struct pci_config_cf8 machine_bdf;
+    int free_php_slot = -1;
 
     PT_LOG("Assigning real physical device %02x:%02x.%x ...\n",
         r_bus, r_dev, r_func);
@@ -344,6 +418,15 @@ struct pt_dev * register_real_device(PCI
     {
         PT_LOG("Error: couldn't locate device in libpci structures\n");
         return NULL;
+    }
+
+    if ( e_devfn == PT_VIRT_DEVFN_AUTO ) {
+        /* find a free PCI hot plug slot */
+        free_php_slot = __insert_to_free_slot(r_bus, r_dev, r_func);
+        if ( free_php_slot != -1 )
+            e_devfn = (free_php_slot + PHP_SLOT_START) << 3;
+        else
+            PT_LOG("Error: no free virtual PCI hot plug slot, thus no live migration.\n");
     }
 
     /* Register device */
@@ -356,7 +439,11 @@ struct pt_dev * register_real_device(PCI
         return NULL;
     }
 
+    if ( free_php_slot != -1 )
+        dpci_infos.php_devs[free_php_slot].pt_dev = assigned_device;
+
     assigned_device->pci_dev = pci_dev;
+
 
     /* Issue PCIe FLR */
     pdev_flr(pci_dev);
@@ -408,6 +495,86 @@ struct pt_dev * register_real_device(PCI
     return assigned_device;
 }
 
+int unregister_real_device(int php_slot)
+{
+    struct php_dev *php_dev;
+    struct pci_dev *pci_dev;
+    uint8_t e_device, e_intx;
+    struct pt_dev *assigned_device = NULL;
+    uint32_t machine_irq;
+    uint32_t bdf = 0;
+    int rc = -1;
+
+    if ( php_slot < 0 || php_slot >= PHP_SLOT_LEN )
+       return -1;
+
+    php_dev = &dpci_infos.php_devs[php_slot];
+    assigned_device = php_dev->pt_dev;
+
+    if ( !assigned_device || !php_dev->valid )
+        return -1;
+
+    pci_dev = assigned_device->pci_dev;
+
+    /* hide pci dev from qemu */
+    pci_hide_device((PCIDevice*)assigned_device);
+
+    /* Unbind interrupt */
+    e_device = (assigned_device->dev.devfn >> 3) & 0x1f;
+    e_intx = assigned_device->dev.config[0x3d]-1;
+    machine_irq = pci_dev->irq;
+
+    if ( machine_irq != 0 ) {
+        rc = xc_domain_unbind_pt_irq(xc_handle, domid, machine_irq, PT_IRQ_TYPE_PCI, 0,
+                                       e_device, e_intx, 0);
+        if ( rc < 0 )
+        {
+            /* TBD: unregister device in case of an error */
+            PT_LOG("Error: Unbinding of interrupt failed! rc=%d\n", rc);
+        }
+    }
+    
+    /* deassign the dev to dom0 */
+    bdf |= (pci_dev->bus  & 0xff) << 16;
+    bdf |= (pci_dev->dev  & 0x1f) << 11;
+    bdf |= (pci_dev->func & 0x1f) << 8;
+    if ( (rc = xc_deassign_device(xc_handle, domid, bdf)) != 0)
+        PT_LOG("Error: Revoking the device failed! rc=%d\n", rc);
+
+    /* mark this slot as free */
+    php_dev->valid = 0;
+    php_dev->pt_dev = NULL;
+    qemu_free(assigned_device);
+
+    return 0;
+}
+
+int power_on_php_slot(int php_slot)
+{
+    struct php_dev *php_dev = &dpci_infos.php_devs[php_slot];
+    int pci_slot = php_slot + PHP_SLOT_START;
+    struct pt_dev *pt_dev;
+    pt_dev = 
+        register_real_device(dpci_infos.e_bus,
+            "DIRECT PCI",
+            pci_slot << 3,
+            php_dev->r_bus,
+            php_dev->r_dev,
+            php_dev->r_func,
+            PT_MACHINE_IRQ_AUTO,
+            dpci_infos.pci_access);
+
+    php_dev->pt_dev = pt_dev;
+
+    return 0;
+
+}
+
+int power_off_php_slot(int php_slot)
+{
+    return unregister_real_device(php_slot);
+}
+
 int pt_init(PCIBus *e_bus, char *direct_pci)
 {
     int seg, b, d, f;
@@ -423,6 +590,14 @@ int pt_init(PCIBus *e_bus, char *direct_
     }
     pci_init(pci_access);
     pci_scan_bus(pci_access);
+
+    memset(&dpci_infos, 0, sizeof(struct dpci_infos));
+    dpci_infos.pci_access = pci_access;
+    dpci_infos.e_bus      = e_bus;
+
+    if ( !direct_pci ) {
+        return 0;
+    }
 
     /* Assign given devices to guest */
     while ( next_bdf(&direct_pci, &seg, &b, &d, &f) )
@@ -440,3 +615,15 @@ int pt_init(PCIBus *e_bus, char *direct_
     /* Success */
     return 0;
 }
+
+void pt_uninit(void)
+{
+    struct pci_access *access;
+
+    /* clean up the libpci */
+    access = dpci_infos.pci_access;
+    if ( access ) {
+        pci_cleanup(access);
+    }
+
+}
diff -r 929210166e3f -r d1f20fa87c60 tools/ioemu/hw/pc.c
--- a/tools/ioemu/hw/pc.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/ioemu/hw/pc.c	Wed Jan 23 22:10:59 2008 +0800
@@ -667,8 +667,10 @@ static void pc_init1(uint64_t ram_size, 
     }
 
 #ifdef CONFIG_PASSTHROUGH
-    /* Pass-through Initialization */
-    if ( pci_enabled && direct_pci )
+    /* Pass-through Initialization
+     * init libpci even direct_pci is null, as can hotplug a dev runtime
+     */
+    if ( pci_enabled )
     {
         rc = pt_init(pci_bus, direct_pci); 
         if ( rc < 0 )
diff -r 929210166e3f -r d1f20fa87c60 tools/ioemu/hw/pci.c
--- a/tools/ioemu/hw/pci.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/ioemu/hw/pci.c	Wed Jan 23 22:10:59 2008 +0800
@@ -107,7 +107,8 @@ PCIDevice *pci_register_device(PCIBus *b
     
     if (devfn < 0) {
         for(devfn = bus->devfn_min ; devfn < 256; devfn += 8) {
-            if (!bus->devices[devfn])
+            if ( !bus->devices[devfn] &&
+                 !( devfn >= PHP_DEVFN_START && devfn < PHP_DEVFN_END ) )
                 goto found;
         }
         return NULL;
@@ -130,6 +131,12 @@ PCIDevice *pci_register_device(PCIBus *b
     pci_dev->irq_index = pci_irq_index++;
     bus->devices[devfn] = pci_dev;
     return pci_dev;
+}
+
+void pci_hide_device(PCIDevice *pci_dev)
+{
+    PCIBus *bus = pci_dev->bus;
+    bus->devices[pci_dev->devfn] = NULL;
 }
 
 void pci_register_io_region(PCIDevice *pci_dev, int region_num, 
diff -r 929210166e3f -r d1f20fa87c60 tools/ioemu/hw/piix4acpi.c
--- a/tools/ioemu/hw/piix4acpi.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/ioemu/hw/piix4acpi.c	Wed Jan 23 22:10:59 2008 +0800
@@ -24,6 +24,7 @@
  */
 
 #include "vl.h"
+#include <xen/hvm/ioreq.h>
 
 /* PM1a_CNT bits, as defined in the ACPI specification. */
 #define SCI_EN            (1 <<  0)
@@ -35,6 +36,19 @@
 /* These must be kept in sync with the DSDT (hvmloader/acpi/dsdt.asl) */
 #define SLP_TYP_S5        (7 << 10)
 
+#define ACPI_DBG_IO_ADDR  0xb044
+#define ACPI_PHP_IO_ADDR  0x10c0
+
+#define PHP_EVT_ADD     0x0
+#define PHP_EVT_REMOVE  0x3
+
+#define ACPI_SCI_IRQ 9
+
+/* The bit in GPE0_STS/EN to notify the pci hotplug event */
+#define ACPI_PHP_GPE_BIT 3
+
+#define ACPI_PHP_SLOT_NUM PHP_SLOT_LEN
+
 typedef struct AcpiDeviceState AcpiDeviceState;
 AcpiDeviceState *acpi_device_table;
 
@@ -42,6 +56,28 @@ typedef struct PCIAcpiState {
     PCIDevice dev;
     uint16_t pm1_control; /* pm1a_ECNT_BLK */
 } PCIAcpiState;
+
+typedef struct GPEState {
+    /* GPE0 block */
+    uint8_t gpe0_sts[ACPI_GPE0_BLK_LEN / 2];
+    uint8_t gpe0_en[ACPI_GPE0_BLK_LEN / 2];
+
+    /* SCI IRQ level */
+    uint8_t sci_asserted;
+
+} GPEState;
+
+GPEState gpe_state;
+
+typedef struct PHPSlots {
+    struct {
+        uint8_t status;    /* Apaptor stats */
+        uint32_t pci_addr; /* Dev & Func for this slot */
+    } slot[ACPI_PHP_SLOT_NUM];
+    uint8_t plug_evt;      /* slot|event slot:0-no event;1-1st. event:0-remove;1-add */
+} PHPSlots;
+
+PHPSlots php_slots;
 
 static void piix4acpi_save(QEMUFile *f, void *opaque)
 {
@@ -127,6 +163,302 @@ static void acpi_map(PCIDevice *pci_dev,
     /* Word access */
     register_ioport_write(addr + 4, 2, 2, acpiPm1Control_writew, d);
     register_ioport_read(addr + 4, 2, 2, acpiPm1Control_readw, d);
+}
+
+static inline int test_bit(uint8_t *map, int bit)
+{
+    return ( map[bit / 8] & (1 << (bit % 8)) );
+}
+
+static inline void set_bit(uint8_t *map, int bit)
+{
+    map[bit / 8] |= (1 << (bit % 8));
+}
+
+static inline void clear_bit(uint8_t *map, int bit)
+{
+    map[bit / 8] &= ~(1 << (bit % 8));
+}
+
+extern FILE *logfile;
+static void acpi_dbg_writel(void *opaque, uint32_t addr, uint32_t val)
+{
+#if defined(DEBUG)
+    printf("ACPI: DBG: 0x%08x\n", val);
+#endif
+    fprintf(logfile, "ACPI:debug: write addr=0x%x, val=0x%x.\n", addr, val);
+}
+
+/*
+ * simple PCI hotplug controller IO 
+ * ACPI_PHP_IO_ADDR + :
+ * 0 - the hotplug description: slot(|event(remove/add); 
+ * 1 - 1st php slot ctr/sts reg
+ * 2 - 2nd php slot ctr/sts reg
+ * ......
+ */
+static uint32_t acpi_php_readb(void *opaque, uint32_t addr)
+{
+    PHPSlots *hotplug_slots = opaque;
+    int num;
+    uint32_t val; 
+
+    switch (addr)
+    {
+        case ACPI_PHP_IO_ADDR:
+            val = hotplug_slots->plug_evt;
+            break;
+        default:
+            num = addr - ACPI_PHP_IO_ADDR - 1;
+            val = hotplug_slots->slot[num].status;
+    }
+
+    fprintf(logfile, "ACPI PCI hotplug: read addr=0x%x, val=0x%x.\n", addr, val);
+    return val;
+}
+
+static void acpi_php_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+    PHPSlots *hotplug_slots = opaque;
+    int php_slot;
+    fprintf(logfile, "ACPI PCI hotplug: write addr=0x%x, val=0x%x.\n", addr, val);
+
+    switch (addr)
+    {
+        case ACPI_PHP_IO_ADDR:
+            break;
+        default:
+            php_slot = addr - ACPI_PHP_IO_ADDR - 1;
+            if ( val == 0x1 ) { /* Eject command */
+                /* make _STA of the slot 0 */
+                hotplug_slots->slot[php_slot].status = 0;
+
+                /* clear the hotplug event */
+                hotplug_slots->plug_evt = 0;
+
+                /* power off the slot */
+                power_off_php_slot(php_slot);
+
+                /* signal the CP ACPI hot remove done. */
+                xenstore_record_dm_state("pci-removed");
+            }
+    }
+}
+
+static void pcislots_save(QEMUFile* f, void* opaque)
+{
+    PHPSlots *s = (PHPSlots*)opaque;
+    int i;
+    for ( i = 0; i < ACPI_PHP_SLOT_NUM; i++ ) {
+        qemu_put_8s( f, &s->slot[i].status);
+        qemu_put_be32s(f, &s->slot[i].pci_addr);
+    }
+    qemu_put_8s(f, &s->plug_evt);
+}
+
+static int pcislots_load(QEMUFile* f, void* opaque, int version_id)
+{
+    PHPSlots *s = (PHPSlots*)opaque;
+    int i;
+    if (version_id != 1)
+        return -EINVAL;
+    for ( i = 0; i < ACPI_PHP_SLOT_NUM; i++ ) {
+        qemu_get_8s( f, &s->slot[i].status);
+        qemu_get_be32s(f, &s->slot[i].pci_addr);
+    }
+    qemu_get_8s(f, &s->plug_evt);
+    return 0;
+}
+
+static void php_slots_init(void)
+{
+    PHPSlots *slots = &php_slots;
+    memset(slots, 0, sizeof(PHPSlots));
+
+    /* fixed slot for PCI hotplug */
+    slots->slot[0].pci_addr = 0x00060000; /* Dev 6, Func 0 */
+    slots->slot[0].status = 0xf; /* Present, UI... */
+
+    /* ACPI PCI hotplug controller */
+    register_ioport_read(ACPI_PHP_IO_ADDR, ACPI_PHP_SLOT_NUM + 1, 1, acpi_php_readb, slots);
+    register_ioport_write(ACPI_PHP_IO_ADDR, ACPI_PHP_SLOT_NUM + 1, 1, acpi_php_writeb, slots);
+    register_savevm("pcislots", 0, 1, pcislots_save, pcislots_load, slots);
+}
+
+/* GPEx_STS occupy 1st half of the block, while GPEx_EN 2nd half */
+static uint32_t gpe_sts_read(void *opaque, uint32_t addr)
+{
+    GPEState *s = opaque;
+
+    return s->gpe0_sts[addr - ACPI_GPE0_BLK_ADDRESS];
+}
+
+/* write 1 to clear specific GPE bits */
+static void gpe_sts_write(void *opaque, uint32_t addr, uint32_t val)
+{
+    GPEState *s = opaque;
+    int hotplugged = 0;
+
+    fprintf(logfile, "gpe_sts_write: addr=0x%x, val=0x%x.\n", addr, val);
+
+    hotplugged = test_bit(&s->gpe0_sts[0], ACPI_PHP_GPE_BIT);
+    s->gpe0_sts[addr - ACPI_GPE0_BLK_ADDRESS] &= ~val;
+    if ( s->sci_asserted &&
+         hotplugged &&
+         !test_bit(&s->gpe0_sts[0], ACPI_PHP_GPE_BIT)) {
+        fprintf(logfile, "Clear the GPE0_STS bit for ACPI hotplug & deassert the IRQ.\n");
+        pic_set_irq(ACPI_SCI_IRQ, 0);
+    }
+
+}
+
+static uint32_t gpe_en_read(void *opaque, uint32_t addr)
+{
+    GPEState *s = opaque;
+
+    return s->gpe0_en[addr - (ACPI_GPE0_BLK_ADDRESS + ACPI_GPE0_BLK_LEN / 2)];
+}
+
+/* write 0 to clear en bit */
+static void gpe_en_write(void *opaque, uint32_t addr, uint32_t val)
+{
+    GPEState *s = opaque;
+    int reg_count;
+
+    fprintf(logfile, "gpe_en_write: addr=0x%x, val=0x%x.\n", addr, val);
+    reg_count = addr - (ACPI_GPE0_BLK_ADDRESS + ACPI_GPE0_BLK_LEN / 2);
+    s->gpe0_en[reg_count] = val;
+    /* If disable GPE bit right after generating SCI on it, 
+     * need deassert the intr to avoid redundant intrs
+     */
+    if ( s->sci_asserted &&
+            reg_count == (ACPI_PHP_GPE_BIT / 8) &&
+            !(val & (1 << (ACPI_PHP_GPE_BIT % 8))) ) {
+        fprintf(logfile, "deassert due to disable GPE bit.\n");
+        s->sci_asserted = 0;
+        pic_set_irq(ACPI_SCI_IRQ, 0);
+    }
+
+}
+
+static void gpe_save(QEMUFile* f, void* opaque)
+{
+    GPEState *s = (GPEState*)opaque;
+    int i;
+
+    for ( i = 0; i < ACPI_GPE0_BLK_LEN / 2; i++ ) {
+        qemu_put_8s(f, &s->gpe0_sts[i]);
+        qemu_put_8s(f, &s->gpe0_en[i]);
+    }
+
+    qemu_put_8s(f, &s->sci_asserted);
+    if ( s->sci_asserted ) {
+        fprintf(logfile, "gpe_save with sci asserted!\n");
+    }
+}
+
+static int gpe_load(QEMUFile* f, void* opaque, int version_id)
+{
+    GPEState *s = (GPEState*)opaque;
+    int i;
+    if (version_id != 1)
+        return -EINVAL;
+
+    for ( i = 0; i < ACPI_GPE0_BLK_LEN / 2; i++ ) {
+        qemu_get_8s(f, &s->gpe0_sts[i]);
+        qemu_get_8s(f, &s->gpe0_en[i]);
+    }
+
+    qemu_get_8s(f, &s->sci_asserted);
+    return 0;
+}
+
+static void gpe_acpi_init(void)
+{
+    GPEState *s = &gpe_state;
+    memset(s, 0, sizeof(GPEState));
+
+    register_ioport_read(ACPI_GPE0_BLK_ADDRESS,
+            ACPI_GPE0_BLK_LEN / 2,
+            1,
+            gpe_sts_read,
+            s);
+    register_ioport_read(ACPI_GPE0_BLK_ADDRESS + ACPI_GPE0_BLK_LEN / 2,
+            ACPI_GPE0_BLK_LEN / 2,
+            1,
+            gpe_en_read,
+            s);
+
+    register_ioport_write(ACPI_GPE0_BLK_ADDRESS,
+            ACPI_GPE0_BLK_LEN / 2,
+            1,
+            gpe_sts_write,
+            s);
+    register_ioport_write(ACPI_GPE0_BLK_ADDRESS + ACPI_GPE0_BLK_LEN / 2,
+            ACPI_GPE0_BLK_LEN / 2,
+            1,
+            gpe_en_write,
+            s);
+
+    register_savevm("gpe", 0, 1, gpe_save, gpe_load, s);
+}
+
+static void acpi_sci_intr(GPEState *s)
+{
+    if ( !test_bit(&s->gpe0_sts[0], ACPI_PHP_GPE_BIT) &&
+            test_bit(&s->gpe0_en[0], ACPI_PHP_GPE_BIT) ) {
+
+        set_bit(&s->gpe0_sts[0], ACPI_PHP_GPE_BIT);
+        s->sci_asserted = 1;
+        pic_set_irq(ACPI_SCI_IRQ, 1);
+        fprintf(logfile, "generate a sci for PHP.\n");
+    }
+}
+
+extern FILE *logfile;
+void acpi_php_del(int php_slot)
+{
+    GPEState *s = &gpe_state;
+    PHPSlots *hotplug_slots = &php_slots;
+    int pci_slot = php_slot + PHP_SLOT_START;
+
+    if ( php_slot > PHP_SLOT_LEN || php_slot < 0 ) {
+        fprintf(logfile, "hot add pci slot %d exceed.\n", pci_slot);
+        return;
+    }
+
+    /* update the php controller status */
+    hotplug_slots->plug_evt = (((php_slot+1) << 4) | PHP_EVT_REMOVE);
+
+    /* generate a SCI interrupt */
+    acpi_sci_intr(s);
+}
+
+void acpi_php_add(int php_slot)
+{
+    GPEState *s = &gpe_state;
+    PHPSlots *hotplug_slots = &php_slots;
+    int pci_slot = php_slot + PHP_SLOT_START;
+
+    if ( php_slot > PHP_SLOT_LEN || php_slot < 0 ) {
+        fprintf(logfile, "hot add pci slot %d exceed.\n", pci_slot);
+        return;
+    }
+
+    /* update the php controller status */
+    hotplug_slots->plug_evt = (((php_slot+1) << 4) | PHP_EVT_ADD);
+
+    /* update the slot status as present */
+    hotplug_slots->slot[php_slot].status = 0xf;
+
+    /* power on the slot */
+    power_on_php_slot(php_slot);
+
+    /* signal the CP ACPI hot remove done */
+    xenstore_record_dm_state("pci-inserted");
+
+    /* generate a SCI interrupt */
+    acpi_sci_intr(s);
 }
 
 /* PIIX4 acpi pci configuration space, func 2 */
@@ -168,5 +500,12 @@ void pci_piix4_acpi_init(PCIBus *bus, in
 
     acpi_map((PCIDevice *)d, 0, 0x1f40, 0x10, PCI_ADDRESS_SPACE_IO);
 
+    gpe_acpi_init();
+
+    php_slots_init();
+
+    /* for ACPI debug */
+    register_ioport_write(ACPI_DBG_IO_ADDR, 4, 4, acpi_dbg_writel, d);
+
     register_savevm("piix4acpi", 0, 1, piix4acpi_save, piix4acpi_load, d);
 }
diff -r 929210166e3f -r d1f20fa87c60 tools/ioemu/monitor.c
--- a/tools/ioemu/monitor.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/ioemu/monitor.c	Wed Jan 23 22:10:59 2008 +0800
@@ -1288,6 +1288,10 @@ static term_cmd_t term_cmds[] = {
       "device", "add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')" },
     { "usb_del", "s", do_usb_del,
       "device", "remove USB device 'bus.addr'" },
+    { "pci_add", "s", do_pci_add,
+      "device", "insert PCI pass-through device by BDF,e.g. (dom, bus, dev, func) by hex '0x0, 0x3, 0x0, 0x0'" },
+    { "pci_del", "s", do_pci_del,
+      "device", "remove PCI pass-through device by BDF,e.g. (dom, bus, dev, func) by hex '0x0, 0x3, 0x0, 0x0'" },
 #ifndef CONFIG_DM
     { "cpu", "i", do_cpu_set, 
       "index", "set the default CPU" },
diff -r 929210166e3f -r d1f20fa87c60 tools/ioemu/vl.c
--- a/tools/ioemu/vl.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/ioemu/vl.c	Wed Jan 23 22:10:59 2008 +0800
@@ -285,7 +285,8 @@ int register_ioport_read(int start, int 
     for(i = start; i < start + length; i += size) {
         ioport_read_table[bsize][i] = func;
         if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
-            hw_error("register_ioport_write: invalid opaque");
+            hw_error("register_ioport_read: invalid opaque:start=0x%x, len=%d, size=%d, func=%p",
+                    start, length, size, func);
         ioport_opaque[i] = opaque;
     }
     return 0;
@@ -310,7 +311,8 @@ int register_ioport_write(int start, int
     for(i = start; i < start + length; i += size) {
         ioport_write_table[bsize][i] = func;
         if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
-            hw_error("register_ioport_write: invalid opaque");
+            hw_error("register_ioport_write: invalid opaque:start=0x%x, len=%d, size=%d, func=%p",
+                    start, length, size, func);
         ioport_opaque[i] = opaque;
     }
     return 0;
@@ -4333,6 +4335,25 @@ void usb_info(void)
                     0, dev->addr, speed_str, dev->devname);
     }
 }
+
+void do_pci_del(char *devname)
+{
+    int php_slot;
+    php_slot = bdf_to_slot(devname);
+
+    if ( php_slot != -1 )
+        acpi_php_del(php_slot);
+}
+
+void do_pci_add(char *devname)
+{
+    int php_slot;
+    php_slot = insert_to_free_slot(devname);
+
+    if ( php_slot != -1 )
+        acpi_php_add(php_slot);
+}
+
 
 /***********************************************************/
 /* pid file */
@@ -7896,5 +7917,6 @@ int main(int argc, char **argv)
 
     main_loop();
     quit_timers();
+    pt_uninit();
     return 0;
 }
diff -r 929210166e3f -r d1f20fa87c60 tools/ioemu/vl.h
--- a/tools/ioemu/vl.h	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/ioemu/vl.h	Wed Jan 23 22:10:59 2008 +0800
@@ -819,6 +819,8 @@ PCIDevice *pci_register_device(PCIBus *b
                                PCIConfigReadFunc *config_read, 
                                PCIConfigWriteFunc *config_write);
 
+void pci_hide_device(PCIDevice *pci_dev);
+
 void pci_register_io_region(PCIDevice *pci_dev, int region_num, 
                             uint32_t size, int type, 
                             PCIMapIORegionFunc *map_func);
@@ -846,6 +848,19 @@ void pci_info(void);
 void pci_info(void);
 PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint32_t id,
                         pci_map_irq_fn map_irq, const char *name);
+
+/* PCI slot 6~7 support ACPI PCI hot plug */
+#define PHP_SLOT_START  (6)
+#define PHP_SLOT_END    (8)
+#define PHP_SLOT_LEN    (PHP_SLOT_END - PHP_SLOT_START)
+#define PHP_DEVFN_START (PHP_SLOT_START << 3)
+#define PHP_DEVFN_END   (PHP_SLOT_END << 3)
+
+int insert_to_free_slot(char*);
+int bdf_to_slot(char*);
+int power_on_php_slot(int);
+int power_off_php_slot(int);
+void pt_uninit(void);
 
 /* prep_pci.c */
 PCIBus *pci_prep_init(void);
@@ -1111,6 +1126,9 @@ void tpm_tis_init(SetIRQFunc *set_irq, v
 
 /* piix4acpi.c */
 extern void pci_piix4_acpi_init(PCIBus *bus, int devfn);
+void acpi_php_add(int);
+void acpi_php_del(int);
+
 
 /* pc.c */
 extern QEMUMachine pc_machine;
@@ -1311,6 +1329,9 @@ void do_usb_del(const char *devname);
 void do_usb_del(const char *devname);
 void usb_info(void);
 
+void do_pci_add(char *devname);
+void do_pci_del(char *devname);
+
 /* scsi-disk.c */
 enum scsi_reason {
     SCSI_REASON_DONE, /* Command complete.  */
diff -r 929210166e3f -r d1f20fa87c60 tools/ioemu/xenstore.c
--- a/tools/ioemu/xenstore.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/ioemu/xenstore.c	Wed Jan 23 22:10:59 2008 +0800
@@ -372,7 +372,7 @@ void xenstore_process_logdirty_event(voi
 /* Accept state change commands from the control tools */
 static void xenstore_process_dm_command_event(void)
 {
-    char *path = NULL, *command = NULL;
+    char *path = NULL, *command = NULL, *par = NULL;
     unsigned int len;
     extern int suspend_requested;
 
@@ -391,6 +391,32 @@ static void xenstore_process_dm_command_
     } else if (!strncmp(command, "continue", len)) {
         fprintf(logfile, "dm-command: continue after state save\n");
         suspend_requested = 0;
+    } else if (!strncmp(command, "pci-rem", len)) {
+        fprintf(logfile, "dm-command: hot remove pass-through pci dev \n");
+
+        if (pasprintf(&path, 
+                      "/local/domain/0/device-model/%u/parameter", domid) == -1) {
+            fprintf(logfile, "out of memory reading dm command parameter\n");
+            goto out;
+        }
+        par = xs_read(xsh, XBT_NULL, path, &len);
+        if (!par)
+            goto out;
+
+        do_pci_del(par);
+    } else if (!strncmp(command, "pci-ins", len)) {
+        fprintf(logfile, "dm-command: hot insert pass-through pci dev \n");
+
+        if (pasprintf(&path, 
+                      "/local/domain/0/device-model/%u/parameter", domid) == -1) {
+            fprintf(logfile, "out of memory reading dm command parameter\n");
+            goto out;
+        }
+        par = xs_read(xsh, XBT_NULL, path, &len);
+        if (!par)
+            goto out;
+
+        do_pci_add(par);
     } else {
         fprintf(logfile, "dm-command: unknown command\"%*s\"\n", len, command);
     }
diff -r 929210166e3f -r d1f20fa87c60 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/libxc/xc_domain.c	Wed Jan 23 22:10:59 2008 +0800
@@ -777,6 +777,20 @@ int xc_test_assign_device(
     return do_domctl(xc_handle, &domctl);
 }
 
+int xc_deassign_device(
+    int xc_handle,
+    uint32_t domid,
+    uint32_t machine_bdf)
+{
+    DECLARE_DOMCTL;
+
+    domctl.cmd = XEN_DOMCTL_deassign_device;
+    domctl.domain = domid;
+    domctl.u.assign_device.machine_bdf = machine_bdf;
+ 
+    return do_domctl(xc_handle, &domctl);
+}
+
 /* Pass-through: binds machine irq to guests irq */
 int xc_domain_bind_pt_irq(
     int xc_handle,
@@ -812,6 +826,36 @@ int xc_domain_bind_pt_irq(
     return rc;
 }
 
+int xc_domain_unbind_pt_irq(
+    int xc_handle,
+    uint32_t domid,
+    uint8_t machine_irq,
+    uint8_t irq_type,
+    uint8_t bus,
+    uint8_t device,
+    uint8_t intx,
+    uint8_t isa_irq)
+{
+    int rc;
+    xen_domctl_bind_pt_irq_t * bind;
+    DECLARE_DOMCTL;
+
+    domctl.cmd = XEN_DOMCTL_unbind_pt_irq;
+    domctl.domain = (domid_t)domid;
+
+    bind = &(domctl.u.bind_pt_irq);
+    bind->hvm_domid = domid;
+    bind->irq_type = irq_type;
+    bind->machine_irq = machine_irq;
+    bind->u.pci.bus = bus;
+    bind->u.pci.device = device;    
+    bind->u.pci.intx = intx;
+    bind->u.isa.isa_irq = isa_irq;
+    
+    rc = do_domctl(xc_handle, &domctl);
+    return rc;
+}
+
 int xc_domain_bind_pt_pci_irq(
     int xc_handle,
     uint32_t domid,
diff -r 929210166e3f -r d1f20fa87c60 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/libxc/xenctrl.h	Wed Jan 23 22:10:59 2008 +0800
@@ -918,6 +918,10 @@ int xc_test_assign_device(int xc_handle,
                           uint32_t domid,
                           uint32_t machine_bdf);
 
+int xc_deassign_device(int xc_handle,
+                     uint32_t domid,
+                     uint32_t machine_bdf);
+
 int xc_domain_memory_mapping(int xc_handle,
                              uint32_t domid,
                              unsigned long first_gfn,
@@ -941,6 +945,15 @@ int xc_domain_bind_pt_irq(int xc_handle,
                           uint8_t intx,
                           uint8_t isa_irq);
 
+int xc_domain_unbind_pt_irq(int xc_handle,
+                          uint32_t domid,
+                          uint8_t machine_irq,
+                          uint8_t irq_type,
+                          uint8_t bus,
+                          uint8_t device,
+                          uint8_t intx,
+                          uint8_t isa_irq);
+
 int xc_domain_bind_pt_pci_irq(int xc_handle,
                               uint32_t domid,
                               uint8_t machine_irq,
diff -r 929210166e3f -r d1f20fa87c60 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/python/xen/xend/XendDomainInfo.py	Wed Jan 23 22:10:59 2008 +0800
@@ -517,6 +517,48 @@ class XendDomainInfo:
         asserts.isCharConvertible(key)
         self.storeDom("control/sysrq", '%c' % key)
 
+    def passthrough_device_create(self, dev_config):
+        log.debug("XendDomainInfo.passthrough_device_create: %s" % scrub_password(dev_config))
+
+        #all the PCI devs share one conf node
+        devid = '0'
+
+        dev_type = sxp.name(dev_config)
+        new_devs = sxp.child_value(dev_config, 'devs')
+        pci_dev = new_devs[0]
+        dev_info = self._getDeviceInfo_pci(devid)#from self.info['devices']
+
+        bdf_str = "%s, %s, %s, %s" % (pci_dev['domain'], pci_dev['bus'], pci_dev['slot'], pci_dev['func'])
+        self.image.signalDeviceModel('pci-ins', 'pci-inserted', bdf_str)
+
+        if dev_info is None:
+            # create a new one from scrach
+            dev_cfg_sxp = [dev_type,
+                ['dev',
+                  ['domain', pci_dev['domain']],
+                  ['bus',    pci_dev['bus']],
+                  ['slot',   pci_dev['slot']],
+                  ['func',   pci_dev['func']]
+                ]]
+            dev_uuid = self.info.device_add(dev_type, cfg_sxp = dev_cfg_sxp)
+            dev_config_dict = self.info['devices'][dev_uuid][1]
+            try:
+                dev_config_dict['devid'] = devid = \
+                    self._createDevice(dev_type, dev_config_dict)
+                self._waitForDevice(dev_type, devid)
+            except VmError, ex:
+                raise ex
+        else:
+            # update the pci config to add the new dev
+            log.debug("")
+            dev_uuid = sxp.child_value(dev_info, 'uuid')
+            pci_conf = self.info['devices'][dev_uuid][1]
+            pci_devs = pci_conf['devs']
+            pci_devs.extend(new_devs)
+            self._reconfigureDevice('pci', devid, pci_conf)
+
+        return self.getDeviceController('pci').sxpr(devid)
+
     def device_create(self, dev_config):
         """Create a new device.
 
@@ -525,6 +567,15 @@ class XendDomainInfo:
         """
         log.debug("XendDomainInfo.device_create: %s" % scrub_password(dev_config))
         dev_type = sxp.name(dev_config)
+
+        # for HVM guest, 
+        hvm = self.info.is_hvm()
+        if dev_type == 'dpci' and hvm:
+            #change the dpci to pci
+            dev_config[0] = 'pci'
+            rc = self.passthrough_device_create(dev_config)
+            return rc
+
         dev_uuid = self.info.device_add(dev_type, cfg_sxp = dev_config)
         dev_config_dict = self.info['devices'][dev_uuid][1]
         log.debug("XendDomainInfo.device_create: %s" % scrub_password(dev_config_dict))
@@ -580,9 +631,52 @@ class XendDomainInfo:
         for devclass in XendDevices.valid_devices():
             self.getDeviceController(devclass).waitForDevices()
 
+    def destroyPassthroughDevice(self, devnum):
+        log.debug("destroyPassthroughDevice called %s", devnum)
+
+        #all the PCI devs share one conf node
+        devid = '0'
+        devnum = int(devnum)
+        dev_info = self._getDeviceInfo_pci('0')#from self.info['devices']
+        dev_uuid = sxp.child_value(dev_info, 'uuid')
+
+        #delete the pci bdf config under the pci device
+        pci_conf = self.info['devices'][dev_uuid][1]
+        pci_len = len(pci_conf['devs'])
+        if devnum >= pci_len:
+            raise VmError("Device %s doesn't exist, total %d." % (devnum, pci_len))
+        pci_dev = pci_conf['devs'][devnum]
+        bdf_str = "%s, %s, %s, %s" % (pci_dev['domain'], pci_dev['bus'], pci_dev['slot'], pci_dev['func'])
+        log.info("destroyPassthroughDevice:%s:%s!", pci_dev, bdf_str)
+
+        self.image.signalDeviceModel('pci-rem', 'pci-removed', bdf_str)
+
+        if pci_len > 1:
+            del pci_conf['devs'][devnum]
+            self._reconfigureDevice('pci', devid, pci_conf)
+        else:
+            self.getDeviceController('pci').destroyDevice(devid, True)
+            del self.info['devices'][dev_uuid]
+            platform = self.info['platform']
+            orig_dev_num = len(platform['pci'])
+
+            #need remove the pci config, or still get a vtd dev in qemu when restore
+            #TODO:can use this to keep some info to ask high level management tools to hot insert a new passthrough dev after migration
+            if orig_dev_num != 0:
+#                platform['pci'] = ["%dDEVs" % orig_dev_num]
+                platform['pci'] = []
+
+        return 0
+
     def destroyDevice(self, deviceClass, devid, force = False, rm_cfg = False):
         log.debug("XendDomainInfo.destroyDevice: deviceClass = %s, device = %s",
                   deviceClass, devid)
+
+        # for HVM guest, 
+        hvm = self.info.is_hvm()
+        if deviceClass == 'dpci' and hvm:
+            rc = self.destroyPassthroughDevice(devid)
+            return rc
 
         if rm_cfg:
             # Convert devid to device number.  A device number is
@@ -643,6 +737,14 @@ class XendDomainInfo:
         return rc
 
     def getDeviceSxprs(self, deviceClass):
+        if deviceClass == 'dpci':
+            dev_info = self._getDeviceInfo_pci('0')#from self.info['devices']
+            if dev_info is None:
+                return []
+            dev_uuid = sxp.child_value(dev_info, 'uuid')
+            pci_devs = self.info['devices'][dev_uuid][1]['devs']
+            pci_len = len(pci_devs)
+            return pci_devs
         if self._stateGet() in (DOM_STATE_RUNNING, DOM_STATE_PAUSED):
             return self.getDeviceController(deviceClass).sxprs()
         else:
@@ -679,6 +781,12 @@ class XendDomainInfo:
             if devid == dev:
                 return dev_info
 
+    def _getDeviceInfo_pci(self, devid):
+        for dev_type, dev_info in self.info.all_devices_sxpr():
+            if dev_type != 'pci':
+                continue
+            return dev_info
+        return None
 
     def setMemoryTarget(self, target):
         """Set the memory target of this domain.
diff -r 929210166e3f -r d1f20fa87c60 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/python/xen/xend/image.py	Wed Jan 23 22:10:59 2008 +0800
@@ -286,23 +286,42 @@ class ImageHandler:
         self.vm.storeDom("image/device-model-pid", self.pid)
         log.info("device model pid: %d", self.pid)
 
-    def saveDeviceModel(self):
+    def signalDeviceModel(self, cmd, ret, par = None):
         if self.device_model is None:
             return
-        # Signal the device model to pause itself and save its state
+        # Signal the device model to for action
+        if cmd is '' or ret is '':
+            raise VmError('need valid command and result when signal device model')
+
+        orig_state = xstransact.Read("/local/domain/0/device-model/%i/state"
+                                % self.vm.getDomid())
+
+        if par is not None:
+            xstransact.Store("/local/domain/0/device-model/%i"
+                             % self.vm.getDomid(), ('parameter', par))
+
         xstransact.Store("/local/domain/0/device-model/%i"
-                         % self.vm.getDomid(), ('command', 'save'))
+                         % self.vm.getDomid(), ('command', cmd))
         # Wait for confirmation.  Could do this with a watch but we'd
         # still end up spinning here waiting for the watch to fire. 
         state = ''
         count = 0
-        while state != 'paused':
+        while state != ret:
             state = xstransact.Read("/local/domain/0/device-model/%i/state"
                                     % self.vm.getDomid())
             time.sleep(0.1)
             count += 1
             if count > 100:
                 raise VmError('Timed out waiting for device model to save')
+
+        #resotre orig state
+        xstransact.Store("/local/domain/0/device-model/%i"
+                         % self.vm.getDomid(), ('state', orig_state))
+        log.info("signalDeviceModel:restore dm state to %s", orig_state)
+
+    def saveDeviceModel(self):
+        # Signal the device model to pause itself and save its state
+        self.signalDeviceModel('save', 'paused')
 
     def resumeDeviceModel(self):
         if self.device_model is None:
diff -r 929210166e3f -r d1f20fa87c60 tools/python/xen/xend/server/DevController.py
--- a/tools/python/xen/xend/server/DevController.py	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/python/xen/xend/server/DevController.py	Wed Jan 23 22:10:59 2008 +0800
@@ -411,6 +411,14 @@ class DevController:
         return result
 
 
+    def removeBackend(self, devid, *args):
+        frontpath = self.frontendPath(devid)
+        backpath = xstransact.Read(frontpath, "backend")
+        if backpath:
+            return xstransact.Remove(backpath, *args)
+        else:
+            raise VmError("Device %s not connected" % devid)
+
     def readBackend(self, devid, *args):
         frontpath = self.frontendPath(devid)
         backpath = xstransact.Read(frontpath, "backend")
diff -r 929210166e3f -r d1f20fa87c60 tools/python/xen/xend/server/pciif.py
--- a/tools/python/xen/xend/server/pciif.py	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/python/xen/xend/server/pciif.py	Wed Jan 23 22:10:59 2008 +0800
@@ -18,6 +18,7 @@
 
 
 import types
+import time
 
 from xen.xend import sxp
 from xen.xend.XendError import VmError
@@ -76,6 +77,25 @@ class PciController(DevController):
         back['uuid'] = config.get('uuid','')
         return (0, back, {})
 
+    def reconfigureDevice(self, _, config):
+        """@see DevController.reconfigureDevice"""
+        #currently only support config changes by hot insert/remove pass-through dev
+        #delete all the devices in xenstore
+        (devid, new_back, new_front) = self.getDeviceDetails(config)
+        num_devs = self.readBackend(devid, 'num_devs')
+        for i in range(int(num_devs)):
+            self.removeBackend(devid, 'dev-%d' % i)
+        self.removeBackend(devid, 'num_devs')
+
+        #create new devices config
+        num_devs = new_back['num_devs']
+        for i in range(int(num_devs)):
+            dev_no = 'dev-%d' % i
+            self.writeBackend(devid, dev_no, new_back[dev_no])
+        self.writeBackend(devid, 'num_devs', num_devs)
+
+        return new_back.get('uuid')
+
     def getDeviceConfiguration(self, devid, transaction = None):
         result = DevController.getDeviceConfiguration(self, devid, transaction)
         num_devs = self.readBackend(devid, 'num_devs')
diff -r 929210166e3f -r d1f20fa87c60 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py	Wed Jan 23 17:16:36 2008 +0800
+++ b/tools/python/xen/xm/main.py	Wed Jan 23 22:10:59 2008 +0800
@@ -175,6 +175,12 @@ SUBCOMMAND_HELP = {
     'vnet-delete'   :  ('<VnetId>', 'Delete a Vnet.'),
     'vnet-list'     :  ('[-l|--long]', 'List Vnets.'),
     'vtpm-list'     :  ('<Domain> [--long]', 'List virtual TPM devices.'),
+    'dpci-insert'   :  ('<Domain> <bus> <slot> <func> [pci-domain]',
+                        'Insert a new pass-through pci device.'),
+    'dpci-remove'   :  ('<Domain> <Id>',
+                        'Remove a domain\'s pass-through pci device.'),
+    'dpci-list'     :  ('<Domain> [--long]',
+                        'List pass-through pci devices for a domain.'),
 
     # security
 
@@ -335,6 +341,9 @@ device_commands = [
     "network-detach",
     "network-list",
     "vtpm-list",
+    "dpci-insert",
+    "dpci-remove",
+    "dpci-list",
     ]
 
 vnet_commands = [
@@ -2054,6 +2063,33 @@ def xm_vtpm_list(args):
                    % ni)
 
 
+def xm_dpci_list(args):
+    (use_long, params) = arg_check_for_resource_list(args, "dpci-list")
+
+    dom = params[0]
+
+    #if serverType == SERVER_XEN_API:
+    #else:
+    devs = server.xend.domain.getDeviceSxprs(dom, 'dpci')
+
+    if use_long:
+        map(PrettyPrint.prettyprint, devs)
+    else:
+        hdr = 0
+        id = 0
+        for x in devs:
+            if hdr == 0:
+                print 'ID  domain   bus   slot   func'
+                hdr = 1
+            x['idx'] = id
+            print ("%(idx)-3s    "
+                   "%(domain)-3s  "
+                   "%(bus)-3s   "
+                   "%(slot)-3s    "
+                   "%(func)-3s    "
+                   % x)
+            id += 1
+
 def parse_block_configuration(args):
     dom = args[0]
 
@@ -2201,6 +2237,33 @@ def xm_network_attach(args):
             vif.append(vif_param)
         server.xend.domain.device_create(dom, vif)
 
+def parse_dpci_configuration(args):
+    dom = args[0]
+
+    cls = 'dpci'
+    if len(args) == 5:
+        pcidom = args[4]
+    else:
+        pcidom = '0x0'
+
+    print "0x%x,0x%x,0x%x" % (int(args[1], 16), int(args[2], 16), int(args[3], 16))
+    pci = [cls,
+          ['devs',
+            [{'domain': pcidom,
+              'bus':    "0x%x" % int(args[1], 16),
+              'slot':   "0x%x" % int(args[2], 16),
+              'func':   "0x%x" % int(args[3], 16)}]
+          ]]
+
+    return (dom, pci)
+
+def xm_dpci_insert(args):
+    arg_check(args, 'xm_dpci_insert', 4, 5)
+    if serverType == SERVER_XEN_API:
+        dom   = args[0]
+    else:
+        (dom, pci) = parse_dpci_configuration(args)
+        server.xend.domain.device_create(dom, pci)
 
 def detach(args, deviceClass):
     rm_cfg = True
@@ -2265,6 +2328,15 @@ def xm_network_detach(args):
         arg_check(args, 'network-detach', 2, 3)
         detach(args, 'vif')
 
+
+def xm_dpci_remove(args):
+    if serverType == SERVER_XEN_API:
+        arg_check(args, 'xm_dpci_remove', 2, 2)
+    else:
+        arg_check(args, 'xm_dpci_remove', 2, 2)
+        dom = args[0]
+        dev = args[1]
+        server.xend.domain.destroyDevice(dom, 'dpci', dev)
 
 def xm_vnet_list(args):
     xenapi_unsupported()
@@ -2455,6 +2527,10 @@ commands = {
     "vnet-delete": xm_vnet_delete,
     # vtpm
     "vtpm-list": xm_vtpm_list,
+    #direct pci
+    "dpci-insert": xm_dpci_insert,
+    "dpci-remove": xm_dpci_remove,
+    "dpci-list": xm_dpci_list,
     }
 
 ## The commands supported by a separate argument parser in xend.xm.
diff -r 929210166e3f -r d1f20fa87c60 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/xen/arch/x86/domctl.c	Wed Jan 23 22:10:59 2008 +0800
@@ -580,6 +580,34 @@ long arch_do_domctl(
     }
     break;
 
+    case XEN_DOMCTL_deassign_device:
+    {
+        struct domain *d;
+        u8 bus, devfn;
+
+        ret = -EINVAL;
+        if ( !vtd_enabled )
+            break;
+
+        if ( unlikely((d = get_domain_by_id(domctl->domain)) == NULL) )
+        {
+            gdprintk(XENLOG_ERR,
+                "XEN_DOMCTL_deassign_device: get_domain_by_id() failed\n"); 
+            break;
+        }
+        bus = (domctl->u.assign_device.machine_bdf >> 16) & 0xff;
+        devfn = (domctl->u.assign_device.machine_bdf >> 8) & 0xff;
+
+        if ( !device_assigned(bus, devfn) )
+            break;
+
+        reassign_device_ownership(d, dom0, bus, devfn);
+        gdprintk(XENLOG_INFO, "XEN_DOMCTL_deassign_device: bdf = %x:%x:%x\n",
+            bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+        put_domain(d);
+    }
+    break;
+
     case XEN_DOMCTL_bind_pt_irq:
     {
         struct domain * d;
@@ -593,6 +621,23 @@ long arch_do_domctl(
             ret = pt_irq_create_bind_vtd(d, bind);
         if (ret < 0)
             gdprintk(XENLOG_ERR, "pt_irq_create_bind failed!\n");
+        rcu_unlock_domain(d);
+    }
+    break;    
+
+    case XEN_DOMCTL_unbind_pt_irq:
+    {
+        struct domain * d;
+        xen_domctl_bind_pt_irq_t * bind;
+
+        ret = -ESRCH;
+        if ( (d = rcu_lock_domain_by_id(domctl->domain)) == NULL )
+            break;
+        bind = &(domctl->u.bind_pt_irq);
+        if ( vtd_enabled )
+            ret = pt_irq_destroy_bind_vtd(d, bind);
+        if ( ret < 0 )
+            gdprintk(XENLOG_ERR, "pt_irq_destroy_bind failed!\n");
         rcu_unlock_domain(d);
     }
     break;
diff -r 929210166e3f -r d1f20fa87c60 xen/arch/x86/hvm/irq.c
--- a/xen/arch/x86/hvm/irq.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/xen/arch/x86/hvm/irq.c	Wed Jan 23 22:10:59 2008 +0800
@@ -211,7 +211,7 @@ void hvm_set_pci_link_route(struct domai
             clear_bit(old_isa_irq, &hvm_irq->dpci->isairq_map);
 
         for ( i = 0; i < NR_LINK; i++ )
-            if ( test_bit(i, &hvm_irq->dpci->link_map) &&
+            if ( hvm_irq->dpci->link_cnt[i] > 0 &&
                  hvm_irq->pci_link.route[i] )
                 set_bit(hvm_irq->pci_link.route[i],
                         &hvm_irq->dpci->isairq_map);
diff -r 929210166e3f -r d1f20fa87c60 xen/arch/x86/hvm/vmx/vtd/io.c
--- a/xen/arch/x86/hvm/vmx/vtd/io.c	Wed Jan 23 17:16:36 2008 +0800
+++ b/xen/arch/x86/hvm/vmx/vtd/io.c	Wed Jan 23 22:10:59 2008 +0800
@@ -101,7 +101,7 @@ int pt_irq_create_bind_vtd(
     intx = pt_irq_bind->u.pci.intx;
     guest_gsi = hvm_pci_intx_gsi(device, intx);
     link = hvm_pci_intx_link(device, intx);
-    set_bit(link, hvm_irq_dpci->link_map);
+    hvm_irq_dpci->link_cnt[link]++;
 
     digl = xmalloc(struct dev_intx_gsi_link);
     if ( !digl )
@@ -134,6 +134,65 @@ int pt_irq_create_bind_vtd(
     gdprintk(XENLOG_INFO VTDPREFIX,
              "VT-d irq bind: m_irq = %x device = %x intx = %x\n",
              machine_gsi, device, intx);
+    return 0;
+}
+
+int pt_irq_destroy_bind_vtd(
+    struct domain *d, xen_domctl_bind_pt_irq_t *pt_irq_bind)
+{
+    struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
+    uint32_t machine_gsi, guest_gsi;
+    uint32_t device, intx, link;
+    struct list_head *digl_list, *tmp;
+    struct dev_intx_gsi_link *digl;
+
+    if ( hvm_irq_dpci == NULL )
+        return 0;
+
+    machine_gsi = pt_irq_bind->machine_irq;
+    device = pt_irq_bind->u.pci.device;
+    intx = pt_irq_bind->u.pci.intx;
+    guest_gsi = hvm_pci_intx_gsi(device, intx);
+    link = hvm_pci_intx_link(device, intx);
+    hvm_irq_dpci->link_cnt[link]--;
+
+    gdprintk(XENLOG_INFO,
+            "pt_irq_destroy_bind_vtd: machine_gsi=%d, guest_gsi=%d, device=%d, intx=%d.\n",
+            machine_gsi, guest_gsi, device, intx);
+    memset(&hvm_irq_dpci->girq[guest_gsi], 0, sizeof(struct hvm_girq_dpci_mapping));
+
+    /* clear the mirq info */
+    if ( hvm_irq_dpci->mirq[machine_gsi].valid )
+    {
+
+        list_for_each_safe ( digl_list, tmp,
+                &hvm_irq_dpci->mirq[machine_gsi].digl_list )
+        {
+            digl = list_entry(digl_list,
+                    struct dev_intx_gsi_link, list);
+            if ( digl->device == device &&
+                 digl->intx   == intx &&
+                 digl->link   == link &&
+                 digl->gsi    == guest_gsi )
+            {
+                list_del(&digl->list);
+                xfree(digl);
+            }
+        }
+
+        if ( list_empty(&hvm_irq_dpci->mirq[machine_gsi].digl_list) )
+        {
+            pirq_guest_unbind(d, machine_gsi);
+            kill_timer(&hvm_irq_dpci->hvm_timer[irq_to_vector(machine_gsi)]);
+            hvm_irq_dpci->mirq[machine_gsi].dom   = NULL;
+            hvm_irq_dpci->mirq[machine_gsi].valid = 0;
+        }
+    }
+
+    gdprintk(XENLOG_INFO,
+             "XEN_DOMCTL_irq_unmapping: m_irq = %x device = %x intx = %x\n",
+             machine_gsi, device, intx);
+
     return 0;
 }
 
diff -r 929210166e3f -r d1f20fa87c60 xen/include/asm-x86/hvm/irq.h
--- a/xen/include/asm-x86/hvm/irq.h	Wed Jan 23 17:16:36 2008 +0800
+++ b/xen/include/asm-x86/hvm/irq.h	Wed Jan 23 22:10:59 2008 +0800
@@ -64,7 +64,7 @@ struct hvm_irq_dpci {
     /* Record of mapped ISA IRQs */
     DECLARE_BITMAP(isairq_map, NR_ISAIRQS);
     /* Record of mapped Links */
-    DECLARE_BITMAP(link_map, NR_LINK);
+    uint8_t link_cnt[NR_LINK];
     struct timer hvm_timer[NR_IRQS];
 };
 
diff -r 929210166e3f -r d1f20fa87c60 xen/include/asm-x86/iommu.h
--- a/xen/include/asm-x86/iommu.h	Wed Jan 23 17:16:36 2008 +0800
+++ b/xen/include/asm-x86/iommu.h	Wed Jan 23 22:10:59 2008 +0800
@@ -68,6 +68,9 @@ void iommu_domain_destroy(struct domain 
 void iommu_domain_destroy(struct domain *d);
 int device_assigned(u8 bus, u8 devfn);
 int assign_device(struct domain *d, u8 bus, u8 devfn);
+void reassign_device_ownership( struct domain *source,
+    struct domain *target,
+    u8 bus, u8 devfn);
 int iommu_map_page(struct domain *d, dma_addr_t gfn, dma_addr_t mfn);
 int iommu_unmap_page(struct domain *d, dma_addr_t gfn);
 void iommu_flush(struct domain *d, dma_addr_t gfn, u64 *p2m_entry);
@@ -77,6 +80,8 @@ int dpci_ioport_intercept(ioreq_t *p);
 int dpci_ioport_intercept(ioreq_t *p);
 int pt_irq_create_bind_vtd(struct domain *d,
                            xen_domctl_bind_pt_irq_t *pt_irq_bind);
+int pt_irq_destroy_bind_vtd(struct domain *d,
+                           xen_domctl_bind_pt_irq_t *pt_irq_bind);
 
 #define PT_IRQ_TIME_OUT MILLISECS(8)
 #define VTDPREFIX "[VT-D]"
diff -r 929210166e3f -r d1f20fa87c60 xen/include/public/domctl.h
--- a/xen/include/public/domctl.h	Wed Jan 23 17:16:36 2008 +0800
+++ b/xen/include/public/domctl.h	Wed Jan 23 22:10:59 2008 +0800
@@ -436,6 +436,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_sendt
 /* Assign PCI device to HVM guest. Sets up IOMMU structures. */
 #define XEN_DOMCTL_assign_device      37
 #define XEN_DOMCTL_test_assign_device 45
+#define XEN_DOMCTL_deassign_device 46
 struct xen_domctl_assign_device {
     uint32_t  machine_bdf;   /* machine PCI ID of assigned device */
 };
@@ -445,6 +446,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_assig
 
 /* Pass-through interrupts: bind real irq -> hvm devfn. */
 #define XEN_DOMCTL_bind_pt_irq       38
+#define XEN_DOMCTL_unbind_pt_irq     47
 typedef enum pt_irq_type_e {
     PT_IRQ_TYPE_PCI,
     PT_IRQ_TYPE_ISA
diff -r 929210166e3f -r d1f20fa87c60 xen/include/public/hvm/ioreq.h
--- a/xen/include/public/hvm/ioreq.h	Wed Jan 23 17:16:36 2008 +0800
+++ b/xen/include/public/hvm/ioreq.h	Wed Jan 23 22:10:59 2008 +0800
@@ -118,6 +118,11 @@ struct buffered_piopage {
 #define ACPI_PM1A_EVT_BLK_ADDRESS           0x0000000000001f40
 #define ACPI_PM1A_CNT_BLK_ADDRESS           (ACPI_PM1A_EVT_BLK_ADDRESS + 0x04)
 #define ACPI_PM_TMR_BLK_ADDRESS             (ACPI_PM1A_EVT_BLK_ADDRESS + 0x08)
+
+#define ACPI_GPE0_BLK_ADDRESS               (ACPI_PM_TMR_BLK_ADDRESS + 0x20)
+
+#define ACPI_GPE0_BLK_LEN                   0x08
+
 #endif /* defined(__i386__) || defined(__x86_64__) */
 
 #endif /* _IOREQ_H_ */

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-01-23 15:52 Zhai, Edwin
@ 2008-01-24 17:57 ` Keir Fraser
  2008-01-24 18:06 ` Daniel P. Berrange
  1 sibling, 0 replies; 17+ messages in thread
From: Keir Fraser @ 2008-01-24 17:57 UTC (permalink / raw)
  To: Zhai, Edwin; +Cc: xen-devel

Please add more comments to your DSDT changes so it's clear what the changes
are actually for. A paragraph or two distributed around your changes would
be good, including references to the ACPI specification document where that
is useful.

Apart from that I expect the patch is fine. You can send the DSDT comments
as an incremental patch on top of this one.

 -- Keir


On 23/1/08 15:52, "Zhai, Edwin" <edwin.zhai@intel.com> wrote:

> All,
> 
> This patch enables HVM guest VT-d device hotplug via a simple ACPI hotplug
> device model. Pls. have a look.
> 
> On VT-d side, it's very useful as you can dynamically assign VT-d device to a
> guest as long as it support ACPI hotplug(Linux 2.6, 2000, 2003, XP... pass the
> test).
> 
> * Usage is very simple.
> Three new commands are added:
> "xm dpci-list domid" show the current assigned vtd device, like:
> ID  domain   bus   slot   func
> 0      0x0  0x02   0x00    0x0
> 
> "xm dpci-remove" hot remove the specified vtd device by the ID, like:
> xm dpci-remove EdwinHVMDomainVtd 0
> 
> "xm dpci-insert" hot add a new vtd device, like '03:00.0':
> xm dpci-insert EdwinHVMDomainVtd 3 0 0
> 
> * Currently only 2 virtual pci slots are made as being capable of hotplug, so
> more than 2 vtd dev can't be hotplugged, but we can easily extend it in
> future.
> 
> * I reuse the pci PV driver configuration but untouch the code path since
> there 
> may be HVM pci PV driver in future. I'm not sure if the python changes are
> okay, 
> maybe you guys have some good idea.
>  
> Thanks,

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-01-23 15:52 Zhai, Edwin
  2008-01-24 17:57 ` Keir Fraser
@ 2008-01-24 18:06 ` Daniel P. Berrange
  2008-01-24 18:08   ` Keir Fraser
  2008-01-25  1:31   ` Zhai, Edwin
  1 sibling, 2 replies; 17+ messages in thread
From: Daniel P. Berrange @ 2008-01-24 18:06 UTC (permalink / raw)
  To: Zhai, Edwin; +Cc: xen-devel

On Wed, Jan 23, 2008 at 11:52:09PM +0800, Zhai, Edwin wrote:
> All,
> 
> This patch enables HVM guest VT-d device hotplug via a simple ACPI hotplug 
> device model. Pls. have a look.
> 
> On VT-d side, it's very useful as you can dynamically assign VT-d device to a 
> guest as long as it support ACPI hotplug(Linux 2.6, 2000, 2003, XP... pass the 
> test).
> 
> * Usage is very simple.
> Three new commands are added:
> "xm dpci-list domid" show the current assigned vtd device, like:
> ID  domain   bus   slot   func
> 0      0x0  0x02   0x00    0x0
> 
> "xm dpci-remove" hot remove the specified vtd device by the ID, like:
> xm dpci-remove EdwinHVMDomainVtd 0
> 
> "xm dpci-insert" hot add a new vtd device, like '03:00.0':
> xm dpci-insert EdwinHVMDomainVtd 3 0 0

IMHO we shouldn't have a 'd' on the front of the command names. VT-d is a 
vendor specific implementation whose nomenculture doesn't need to be exposed
to users. In addition the existing block & network hotplug commands use
'attach' and 'detach' for their command names. So for sake of consistency
I'd recommend command names of:

  pci-list
  pci-attach
  pci-detach

I think it is useful to use the same unique naming & data for both attach and
detach operations. So if we use a (bus,slot,func) triple for attachment, I
think we should use the same (bus,slot,func) triple for detachment too,
rather than having to make apps / users lookup the dynamically-allocated
'ID' value for the device.

Regards,
Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-01-24 18:06 ` Daniel P. Berrange
@ 2008-01-24 18:08   ` Keir Fraser
  2008-01-25  1:31   ` Zhai, Edwin
  1 sibling, 0 replies; 17+ messages in thread
From: Keir Fraser @ 2008-01-24 18:08 UTC (permalink / raw)
  To: Daniel P. Berrange, Zhai, Edwin; +Cc: xen-devel

On 24/1/08 18:06, "Daniel P. Berrange" <berrange@redhat.com> wrote:

> IMHO we shouldn't have a 'd' on the front of the command names. VT-d is a
> vendor specific implementation whose nomenculture doesn't need to be exposed
> to users. In addition the existing block & network hotplug commands use
> 'attach' and 'detach' for their command names. So for sake of consistency
> I'd recommend command names of:
> 
>   pci-list
>   pci-attach
>   pci-detach
> 
> I think it is useful to use the same unique naming & data for both attach and
> detach operations. So if we use a (bus,slot,func) triple for attachment, I
> think we should use the same (bus,slot,func) triple for detachment too,
> rather than having to make apps / users lookup the dynamically-allocated
> 'ID' value for the device.

Seconded.

 -- Keir

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-01-24 18:06 ` Daniel P. Berrange
  2008-01-24 18:08   ` Keir Fraser
@ 2008-01-25  1:31   ` Zhai, Edwin
  2008-01-25  1:40     ` Daniel P. Berrange
  2008-01-25  7:41     ` Keir Fraser
  1 sibling, 2 replies; 17+ messages in thread
From: Zhai, Edwin @ 2008-01-25  1:31 UTC (permalink / raw)
  To: Daniel P. Berrange; +Cc: xen-devel, Zhai, Edwin

On Thu, Jan 24, 2008 at 06:06:56PM +0000, Daniel P. Berrange wrote:
> > 
> > "xm dpci-remove" hot remove the specified vtd device by the ID, like:
> > xm dpci-remove EdwinHVMDomainVtd 0
> > 
> > "xm dpci-insert" hot add a new vtd device, like '03:00.0':
> > xm dpci-insert EdwinHVMDomainVtd 3 0 0
> 
> IMHO we shouldn't have a 'd' on the front of the command names. VT-d is a 
> vendor specific implementation whose nomenculture doesn't need to be exposed

'd' means directly assigned device, which is generic including VT-d and other 
pass-through device..

Anyway, it's not so important.

> to users. In addition the existing block & network hotplug commands use
> 'attach' and 'detach' for their command names. So for sake of consistency
> I'd recommend command names of:
> 
>   pci-list
>   pci-attach
>   pci-detach

I had the same idea at the beginning, but change mind due to some concerns:

xxx-attach/detach are used for _PV_ driver, but dpci is not the case.
If pci PV driver support hotplug in future, we get a complicated code path to 
handle both PV and dpci's hotplug.

So do we have plan to support PCI PV driver hotplug? If no, we can use 
pci-attach/detach.

> 
> I think it is useful to use the same unique naming & data for both attach and
> detach operations. So if we use a (bus,slot,func) triple for attachment, I
> think we should use the same (bus,slot,func) triple for detachment too,
> rather than having to make apps / users lookup the dynamically-allocated
> 'ID' value for the device.

yes, dynamical ID is not easily for use.
How about using some fixed 'ID' for hot remove, just like vbd/vnif(they also use 
different naming&data for attach/detach)?


> 
> Regards,
> Dan.
> -- 
> |=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
> |=-           Perl modules: http://search.cpan.org/~danberr/              -=|
> |=-               Projects: http://freshmeat.net/~danielpb/               -=|
> |=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
> 

-- 
best rgds,
edwin

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-01-25  1:31   ` Zhai, Edwin
@ 2008-01-25  1:40     ` Daniel P. Berrange
  2008-01-25  3:06       ` Zhai, Edwin
  2008-01-25  7:41     ` Keir Fraser
  1 sibling, 1 reply; 17+ messages in thread
From: Daniel P. Berrange @ 2008-01-25  1:40 UTC (permalink / raw)
  To: Zhai, Edwin; +Cc: xen-devel

On Fri, Jan 25, 2008 at 09:31:34AM +0800, Zhai, Edwin wrote:
> On Thu, Jan 24, 2008 at 06:06:56PM +0000, Daniel P. Berrange wrote:
> > > 
> > > "xm dpci-remove" hot remove the specified vtd device by the ID, like:
> > > xm dpci-remove EdwinHVMDomainVtd 0
> > > 
> > > "xm dpci-insert" hot add a new vtd device, like '03:00.0':
> > > xm dpci-insert EdwinHVMDomainVtd 3 0 0
> > 
> > IMHO we shouldn't have a 'd' on the front of the command names. VT-d is a 
> > vendor specific implementation whose nomenculture doesn't need to be exposed
> 
> 'd' means directly assigned device, which is generic including VT-d and other 
> pass-through device..
> 
> Anyway, it's not so important.
> 
> > to users. In addition the existing block & network hotplug commands use
> > 'attach' and 'detach' for their command names. So for sake of consistency
> > I'd recommend command names of:
> > 
> >   pci-list
> >   pci-attach
> >   pci-detach
> 
> I had the same idea at the beginning, but change mind due to some concerns:
> 
> xxx-attach/detach are used for _PV_ driver, but dpci is not the case.
> If pci PV driver support hotplug in future, we get a complicated code path to 
> handle both PV and dpci's hotplug.

I don't buy that argument. You can still just have completely separate
codepaths inside XenD if you really need to - just switch on different
impls in the main RPC dispatcher...

 def pci_attach()
    if dom.is_hvm():
       pci_attach_hvm()
    else
       pci_attach_pv()

Every part of Xen where we expose the user to a difference between HVM
vs PV is a point of pain. We should ensure that use of HVM & PV is as 
near as possible, identical from a user's view.

> So do we have plan to support PCI PV driver hotplug? If no, we can use 
> pci-attach/detach.

>From the user's point of view they are attaching & detaching PCI devices, 
and they should not have to use separate commands to do the same operation
for PV vs HVM.

Regards,
Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-01-25  1:40     ` Daniel P. Berrange
@ 2008-01-25  3:06       ` Zhai, Edwin
  0 siblings, 0 replies; 17+ messages in thread
From: Zhai, Edwin @ 2008-01-25  3:06 UTC (permalink / raw)
  To: Daniel P. Berrange; +Cc: xen-devel, Zhai, Edwin

On Fri, Jan 25, 2008 at 01:40:54AM +0000, Daniel P. Berrange wrote:
> > 
> > I had the same idea at the beginning, but change mind due to some concerns:
> > 
> > xxx-attach/detach are used for _PV_ driver, but dpci is not the case.
> > If pci PV driver support hotplug in future, we get a complicated code path to 
> > handle both PV and dpci's hotplug.
> 
> I don't buy that argument. You can still just have completely separate
> codepaths inside XenD if you really need to - just switch on different
> impls in the main RPC dispatcher...
> 
>  def pci_attach()
>     if dom.is_hvm():
>        pci_attach_hvm()
>     else
>        pci_attach_pv()
> 
> Every part of Xen where we expose the user to a difference between HVM
> vs PV is a point of pain. We should ensure that use of HVM & PV is as 
> near as possible, identical from a user's view.

If we support PV driver in HVM guest with hotplug, the code path become more 
complicated:(

Anyway it's a trade off. I can change to pci_attach/detach for a simple user 
interface with complicated implementation.


> 
> > So do we have plan to support PCI PV driver hotplug? If no, we can use 
> > pci-attach/detach.
> 
> >From the user's point of view they are attaching & detaching PCI devices, 
> and they should not have to use separate commands to do the same operation
> for PV vs HVM.
> 
> Regards,
> Dan.
> -- 
> |=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
> |=-           Perl modules: http://search.cpan.org/~danberr/              -=|
> |=-               Projects: http://freshmeat.net/~danielpb/               -=|
> |=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
> 

-- 
best rgds,
edwin

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-01-25  1:31   ` Zhai, Edwin
  2008-01-25  1:40     ` Daniel P. Berrange
@ 2008-01-25  7:41     ` Keir Fraser
  1 sibling, 0 replies; 17+ messages in thread
From: Keir Fraser @ 2008-01-25  7:41 UTC (permalink / raw)
  To: Zhai, Edwin, Daniel P. Berrange; +Cc: xen-devel

On 25/1/08 01:31, "Zhai, Edwin" <edwin.zhai@intel.com> wrote:

>> to users. In addition the existing block & network hotplug commands use
>> 'attach' and 'detach' for their command names. So for sake of consistency
>> I'd recommend command names of:
>> 
>>   pci-list
>>   pci-attach
>>   pci-detach
> 
> I had the same idea at the beginning, but change mind due to some concerns:
> 
> xxx-attach/detach are used for _PV_ driver, but dpci is not the case.
> If pci PV driver support hotplug in future, we get a complicated code path to
> handle both PV and dpci's hotplug.
> 
> So do we have plan to support PCI PV driver hotplug? If no, we can use
> pci-attach/detach.

That's a hideously bad argument.

 -- Keir

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH][HVM] pass-through PCI device hotplug support
@ 2008-02-15 13:32 Zhai, Edwin
  2008-02-15 14:36 ` Keir Fraser
  2008-02-18 12:53 ` Yosuke Iwamatsu
  0 siblings, 2 replies; 17+ messages in thread
From: Zhai, Edwin @ 2008-02-15 13:32 UTC (permalink / raw)
  To: Keir; +Cc: xen-devel, Zhai, Edwin

[-- Attachment #1: Type: text/plain, Size: 961 bytes --]

Keir,

This patch is the new version against 17051 to enable HVM guest VT-d device 
hotplug.


** Currently only 2 virtual pci slots(6~7) are made as being capable of hotplug, 
so more than 2 vtd dev can't be hotplugged, but we can easily extend it in 
future.

Three new commands are added:
"xm pci-list domid" show the current assigned vtd device, like:
VSlt  domain   bus   slot   func
0x6      0x0  0x02   0x00    0x0

"xm pci-detach" hot remove the specified vtd device by the virtual slot, like:
xm pci-detach EdwinHVMDomainVtd 6

"xm pci-attach DomainID dom bus dev func [vslot]" hot add a new vtd device in 
the vslot. If no vslot specified, a free slot will be picked up. e.g. to insert 
'0000:03:00.0':
xm pci-attach EdwinHVMDomainVtd 0 3 0 0

** guest pci hotplug
linux: pls. use 2.6.X and enable ACPI PCI hotplug ( Bus options=> PCI hotplug => 
ACPI PCI hotplug driver)
windows: 2000/xp/2003/vista are all okay


Thanks a lot.

-- 
best rgds,
edwin

[-- Attachment #2: vtd_php_r17051_v2.patch --]
[-- Type: text/plain, Size: 144728 bytes --]

# HG changeset patch
# User Edwin Zhai <edwin.zhai@intel.com>
# Date 1203080965 -28800
# Node ID 9f83f4f3eb5e4581136a80fdb22d6c0f7a84f04b
# Parent  bac4536f5e840a52626f0c938ed5c88e8d444fbc
Enable HVM guest VT-d device hotplug via a simple ACPI hotplug 
device model.

Signed-off-by: Zhai Edwin <edwin.zhai@intel.com>


diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/firmware/hvmloader/acpi/dsdt.asl
--- a/tools/firmware/hvmloader/acpi/dsdt.asl	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/firmware/hvmloader/acpi/dsdt.asl	Fri Feb 15 21:09:25 2008 +0800
@@ -79,6 +79,12 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
            Name (_UID, 0x00)
            Name (_ADR, 0x00)
            Name (_BBN, 0x00)
+           Method (_HPP, 0)
+           {
+               Store (0x99, \_GPE.DPT1)
+               Return (Package(0x4){0x10, 0x40, 0x00, 0x00})
+           }
+
  
            Method (_CRS, 0, NotSerialized)
            {
@@ -713,6 +719,118 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, 
                     })
                 } 
             }
+
+            /*********************************************************************
+             * Each PCI hotplug slot need at least 2 methods to handle ACPI event:
+             * _EJ0: eject a device
+             * _STA: return a device's status, e.g. enabled or removed
+             * other methods are optional: 
+             * _PS0/3, _HPP... put them here for debug purpose
+             * 
+             * Eject button would generate a general-purpose event, then the
+             * control method for this event uses Notify() to inform OSPM which
+             * action happen on which device.
+             *
+             * Pls. refer "6.3 Device Insertion, Removal, and Status Objects"
+             * in ACPI spec 3.0b for details.
+             *
+             * QEMU provides a simple hotplug controller with some I/O to handle
+             * the hotplug action and status, which is beyond the ACPI scope.
+             */
+
+            Device (S1F0)
+            {
+                Name (_ADR, 0x00060000) /* Dev 6, Func 0 */
+                Name (_SUN, 0x00000001)
+
+                Method (_PS0, 0)
+                {
+                    Store (0x80, \_GPE.DPT2)
+                }
+
+                Method (_PS3, 0)
+                {
+                    Store (0x83, \_GPE.DPT2)
+                }
+
+                Method (_EJ0, 1)
+                {
+                    Store (0x88, \_GPE.DPT2)
+                    Store (0x1, \_GPE.PHP1) /* eject php slot 1*/
+                }
+
+                Method (_STA, 0)
+                {
+                    Store (0x89, \_GPE.DPT2)
+                    Return ( \_GPE.PHP1 )   /* IN status as the _STA */
+                }
+            }
+
+            Device (S2F0)
+            {
+                Name (_ADR, 0x00070000) /* Dev 7, Func 0 */
+                Name (_SUN, 0x00000002)
+
+                Method (_PS0, 0)
+                {
+                    Store (0x90, \_GPE.DPT2)
+                }
+
+                Method (_PS3, 0)
+                {
+                    Store (0x93, \_GPE.DPT2)
+                }
+
+                Method (_EJ0, 1)
+                {
+                    Store (0x98, \_GPE.DPT2)
+                    Store (0x1, \_GPE.PHP2) /* eject php slot 1*/
+                }
+
+                Method (_STA, 0)
+                {
+                    Store (0x99, \_GPE.DPT2)
+                    Return ( \_GPE.PHP2 )   /* IN status as the _STA */
+                }
+            }
+        }
+    }
+    Scope (\_GPE)
+    {
+        OperationRegion (PHP, SystemIO, 0x10c0, 0x03)
+        Field (PHP, ByteAcc, NoLock, Preserve)
+        {
+            PSTA,   8, /* hotplug controller status reg */
+            PHP1,   8, /* hotplug slot 1 control reg */
+            PHP2,   8  /* hotplug slot 2 control reg */
+        }
+        OperationRegion (DG1, SystemIO, 0xb044, 0x04)
+        Field (DG1, ByteAcc, NoLock, Preserve)
+        {
+            DPT1,   8,
+            DPT2,   8
+        }
+        Method (_L03, 0, NotSerialized)
+        {
+            /* detect slot and event(remove/add) */
+            Name (SLT, 0x0)
+            Name (EVT, 0x0)
+            Store (PSTA, Local1)
+            ShiftRight (Local1, 0x4, SLT)
+            And (Local1, 0xf, EVT)
+
+            /* debug */
+            Store (SLT, DPT1)
+            Store (EVT, DPT2)
+
+            If ( LEqual(SLT, 0x1) )
+            {
+                Notify (\_SB.PCI0.S1F0, EVT)
+            }
+            ElseIf ( LEqual(SLT, 0x2) )
+            {
+                Notify (\_SB.PCI0.S2F0, EVT)
+            }
         }
     }
 }
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/firmware/hvmloader/acpi/dsdt.c
--- a/tools/firmware/hvmloader/acpi/dsdt.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/firmware/hvmloader/acpi/dsdt.c	Fri Feb 15 21:09:25 2008 +0800
@@ -1,22 +1,22 @@
 /*
  * 
  * Intel ACPI Component Architecture
- * ASL Optimizing Compiler version 20060707 [Feb 16 2007]
- * Copyright (C) 2000 - 2006 Intel Corporation
- * Supports ACPI Specification Revision 3.0a
+ * ASL Optimizing Compiler / AML Disassembler version 20050309 [Mar 17 2005]
+ * Copyright (C) 2000 - 2005 Intel Corporation
+ * Supports ACPI Specification Revision 3.0
  * 
- * Compilation of "dsdt.asl" - Mon Feb 11 13:31:53 2008
+ * Compilation of "dsdt.asl" - Fri Feb 15 15:25:17 2008
  * 
  * C source code output
  *
  */
-unsigned char AmlCode[] =
+unsigned char AmlCode[] = 
 {
-    0x44,0x53,0x44,0x54,0x8E,0x0E,0x00,0x00,  /* 00000000    "DSDT...." */
-    0x02,0x6E,0x58,0x65,0x6E,0x00,0x00,0x00,  /* 00000008    ".nXen..." */
+    0x44,0x53,0x44,0x54,0x6A,0x10,0x00,0x00,  /* 00000000    "DSDTj..." */
+    0x02,0xBB,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" */
+    0x09,0x03,0x05,0x20,0x08,0x50,0x4D,0x42,  /* 00000020    "... .PMB" */
     0x53,0x0B,0x00,0x0C,0x08,0x50,0x4D,0x4C,  /* 00000028    "S....PML" */
     0x4E,0x0A,0x08,0x08,0x49,0x4F,0x42,0x31,  /* 00000030    "N...IOB1" */
     0x00,0x08,0x49,0x4F,0x4C,0x31,0x00,0x08,  /* 00000038    "..IOL1.." */
@@ -27,7 +27,7 @@ unsigned char AmlCode[] =
     0x04,0x0A,0x07,0x0A,0x07,0x00,0x00,0x08,  /* 00000060    "........" */
     0x50,0x49,0x43,0x44,0x00,0x14,0x0C,0x5F,  /* 00000068    "PICD..._" */
     0x50,0x49,0x43,0x01,0x70,0x68,0x50,0x49,  /* 00000070    "PIC.phPI" */
-    0x43,0x44,0x10,0x43,0xE1,0x5F,0x53,0x42,  /* 00000078    "CD.C._SB" */
+    0x43,0x44,0x10,0x40,0xF3,0x5F,0x53,0x42,  /* 00000078    "CD.@._SB" */
     0x5F,0x5B,0x80,0x42,0x49,0x4F,0x53,0x00,  /* 00000080    "_[.BIOS." */
     0x0C,0x00,0xA0,0x0E,0x00,0x0A,0x10,0x5B,  /* 00000088    ".......[" */
     0x81,0x21,0x42,0x49,0x4F,0x53,0x01,0x55,  /* 00000090    ".!BIOS.U" */
@@ -43,440 +43,500 @@ unsigned char AmlCode[] =
     0x00,0x00,0x00,0xFF,0xFF,0x09,0x00,0x00,  /* 000000E0    "........" */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000E8    "........" */
     0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x00,  /* 000000F0    "........" */
-    0x00,0x00,0x00,0x79,0x00,0x5B,0x82,0x4F,  /* 000000F8    "...y.[.O" */
-    0xD8,0x50,0x43,0x49,0x30,0x08,0x5F,0x48,  /* 00000100    ".PCI0._H" */
+    0x00,0x00,0x00,0x79,0x00,0x5B,0x82,0x4C,  /* 000000F8    "...y.[.L" */
+    0xEA,0x50,0x43,0x49,0x30,0x08,0x5F,0x48,  /* 00000100    ".PCI0._H" */
     0x49,0x44,0x0C,0x41,0xD0,0x0A,0x03,0x08,  /* 00000108    "ID.A...." */
     0x5F,0x55,0x49,0x44,0x00,0x08,0x5F,0x41,  /* 00000110    "_UID.._A" */
     0x44,0x52,0x00,0x08,0x5F,0x42,0x42,0x4E,  /* 00000118    "DR.._BBN" */
-    0x00,0x14,0x4E,0x0C,0x5F,0x43,0x52,0x53,  /* 00000120    "..N._CRS" */
-    0x00,0x08,0x50,0x52,0x54,0x30,0x11,0x42,  /* 00000128    "..PRT0.B" */
-    0x07,0x0A,0x6E,0x88,0x0D,0x00,0x02,0x0E,  /* 00000130    "..n....." */
-    0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,  /* 00000138    "........" */
-    0x00,0x00,0x01,0x47,0x01,0xF8,0x0C,0xF8,  /* 00000140    "...G...." */
-    0x0C,0x01,0x08,0x88,0x0D,0x00,0x01,0x0C,  /* 00000148    "........" */
-    0x03,0x00,0x00,0x00,0x00,0xF7,0x0C,0x00,  /* 00000150    "........" */
-    0x00,0xF8,0x0C,0x88,0x0D,0x00,0x01,0x0C,  /* 00000158    "........" */
-    0x03,0x00,0x00,0x00,0x0D,0xFF,0xFF,0x00,  /* 00000160    "........" */
-    0x00,0x00,0xF3,0x87,0x17,0x00,0x00,0x0C,  /* 00000168    "........" */
-    0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,  /* 00000170    "........" */
-    0x00,0xFF,0xFF,0x0B,0x00,0x00,0x00,0x00,  /* 00000178    "........" */
-    0x00,0x00,0x00,0x02,0x00,0x87,0x17,0x00,  /* 00000180    "........" */
-    0x00,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,  /* 00000188    "........" */
-    0x00,0x00,0xF0,0xFF,0xFF,0xFF,0xF4,0x00,  /* 00000190    "........" */
-    0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x79,  /* 00000198    ".......y" */
-    0x00,0x8A,0x50,0x52,0x54,0x30,0x0A,0x5C,  /* 000001A0    "..PRT0.\" */
-    0x4D,0x4D,0x49,0x4E,0x8A,0x50,0x52,0x54,  /* 000001A8    "MMIN.PRT" */
-    0x30,0x0A,0x60,0x4D,0x4D,0x41,0x58,0x8A,  /* 000001B0    "0.`MMAX." */
-    0x50,0x52,0x54,0x30,0x0A,0x68,0x4D,0x4C,  /* 000001B8    "PRT0.hML" */
-    0x45,0x4E,0x70,0x50,0x4D,0x49,0x4E,0x4D,  /* 000001C0    "ENpPMINM" */
-    0x4D,0x49,0x4E,0x70,0x50,0x4C,0x45,0x4E,  /* 000001C8    "MINpPLEN" */
-    0x4D,0x4C,0x45,0x4E,0x72,0x4D,0x4D,0x49,  /* 000001D0    "MLENrMMI" */
-    0x4E,0x4D,0x4C,0x45,0x4E,0x4D,0x4D,0x41,  /* 000001D8    "NMLENMMA" */
-    0x58,0x74,0x4D,0x4D,0x41,0x58,0x01,0x4D,  /* 000001E0    "XtMMAX.M" */
-    0x4D,0x41,0x58,0xA4,0x50,0x52,0x54,0x30,  /* 000001E8    "MAX.PRT0" */
-    0x08,0x42,0x55,0x46,0x41,0x11,0x09,0x0A,  /* 000001F0    ".BUFA..." */
-    0x06,0x23,0x20,0x0C,0x18,0x79,0x00,0x08,  /* 000001F8    ".# ..y.." */
-    0x42,0x55,0x46,0x42,0x11,0x09,0x0A,0x06,  /* 00000200    "BUFB...." */
-    0x23,0x00,0x00,0x18,0x79,0x00,0x8B,0x42,  /* 00000208    "#...y..B" */
-    0x55,0x46,0x42,0x01,0x49,0x52,0x51,0x56,  /* 00000210    "UFB.IRQV" */
-    0x5B,0x82,0x48,0x08,0x4C,0x4E,0x4B,0x41,  /* 00000218    "[.H.LNKA" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000220    "._HID.A." */
-    0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x01,  /* 00000228    "..._UID." */
-    0x14,0x1C,0x5F,0x53,0x54,0x41,0x00,0x7B,  /* 00000230    ".._STA.{" */
-    0x50,0x49,0x52,0x41,0x0A,0x80,0x60,0xA0,  /* 00000238    "PIRA..`." */
-    0x08,0x93,0x60,0x0A,0x80,0xA4,0x0A,0x09,  /* 00000240    "..`....." */
-    0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x0B,0x5F,  /* 00000248    "......._" */
-    0x50,0x52,0x53,0x00,0xA4,0x42,0x55,0x46,  /* 00000250    "PRS..BUF" */
-    0x41,0x14,0x11,0x5F,0x44,0x49,0x53,0x00,  /* 00000258    "A.._DIS." */
-    0x7D,0x50,0x49,0x52,0x41,0x0A,0x80,0x50,  /* 00000260    "}PIRA..P" */
-    0x49,0x52,0x41,0x14,0x1A,0x5F,0x43,0x52,  /* 00000268    "IRA.._CR" */
-    0x53,0x00,0x7B,0x50,0x49,0x52,0x41,0x0A,  /* 00000270    "S.{PIRA." */
-    0x0F,0x60,0x79,0x01,0x60,0x49,0x52,0x51,  /* 00000278    ".`y.`IRQ" */
-    0x56,0xA4,0x42,0x55,0x46,0x42,0x14,0x1B,  /* 00000280    "V.BUFB.." */
-    0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,0x01,  /* 00000288    "_SRS..h." */
-    0x49,0x52,0x51,0x31,0x82,0x49,0x52,0x51,  /* 00000290    "IRQ1.IRQ" */
-    0x31,0x60,0x76,0x60,0x70,0x60,0x50,0x49,  /* 00000298    "1`v`p`PI" */
-    0x52,0x41,0x5B,0x82,0x49,0x08,0x4C,0x4E,  /* 000002A0    "RA[.I.LN" */
-    0x4B,0x42,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 000002A8    "KB._HID." */
-    0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,0x49,  /* 000002B0    "A...._UI" */
-    0x44,0x0A,0x02,0x14,0x1C,0x5F,0x53,0x54,  /* 000002B8    "D...._ST" */
-    0x41,0x00,0x7B,0x50,0x49,0x52,0x42,0x0A,  /* 000002C0    "A.{PIRB." */
-    0x80,0x60,0xA0,0x08,0x93,0x60,0x0A,0x80,  /* 000002C8    ".`...`.." */
-    0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,0x0B,  /* 000002D0    "........" */
-    0x14,0x0B,0x5F,0x50,0x52,0x53,0x00,0xA4,  /* 000002D8    ".._PRS.." */
-    0x42,0x55,0x46,0x41,0x14,0x11,0x5F,0x44,  /* 000002E0    "BUFA.._D" */
-    0x49,0x53,0x00,0x7D,0x50,0x49,0x52,0x42,  /* 000002E8    "IS.}PIRB" */
-    0x0A,0x80,0x50,0x49,0x52,0x42,0x14,0x1A,  /* 000002F0    "..PIRB.." */
-    0x5F,0x43,0x52,0x53,0x00,0x7B,0x50,0x49,  /* 000002F8    "_CRS.{PI" */
-    0x52,0x42,0x0A,0x0F,0x60,0x79,0x01,0x60,  /* 00000300    "RB..`y.`" */
-    0x49,0x52,0x51,0x56,0xA4,0x42,0x55,0x46,  /* 00000308    "IRQV.BUF" */
-    0x42,0x14,0x1B,0x5F,0x53,0x52,0x53,0x01,  /* 00000310    "B.._SRS." */
-    0x8B,0x68,0x01,0x49,0x52,0x51,0x31,0x82,  /* 00000318    ".h.IRQ1." */
-    0x49,0x52,0x51,0x31,0x60,0x76,0x60,0x70,  /* 00000320    "IRQ1`v`p" */
-    0x60,0x50,0x49,0x52,0x42,0x5B,0x82,0x49,  /* 00000328    "`PIRB[.I" */
-    0x08,0x4C,0x4E,0x4B,0x43,0x08,0x5F,0x48,  /* 00000330    ".LNKC._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,0x08,  /* 00000338    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x0A,0x03,0x14,0x1C,  /* 00000340    "_UID...." */
-    0x5F,0x53,0x54,0x41,0x00,0x7B,0x50,0x49,  /* 00000348    "_STA.{PI" */
-    0x52,0x43,0x0A,0x80,0x60,0xA0,0x08,0x93,  /* 00000350    "RC..`..." */
-    0x60,0x0A,0x80,0xA4,0x0A,0x09,0xA1,0x04,  /* 00000358    "`......." */
-    0xA4,0x0A,0x0B,0x14,0x0B,0x5F,0x50,0x52,  /* 00000360    "....._PR" */
-    0x53,0x00,0xA4,0x42,0x55,0x46,0x41,0x14,  /* 00000368    "S..BUFA." */
-    0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,  /* 00000370    "._DIS.}P" */
-    0x49,0x52,0x43,0x0A,0x80,0x50,0x49,0x52,  /* 00000378    "IRC..PIR" */
-    0x43,0x14,0x1A,0x5F,0x43,0x52,0x53,0x00,  /* 00000380    "C.._CRS." */
-    0x7B,0x50,0x49,0x52,0x43,0x0A,0x0F,0x60,  /* 00000388    "{PIRC..`" */
-    0x79,0x01,0x60,0x49,0x52,0x51,0x56,0xA4,  /* 00000390    "y.`IRQV." */
-    0x42,0x55,0x46,0x42,0x14,0x1B,0x5F,0x53,  /* 00000398    "BUFB.._S" */
-    0x52,0x53,0x01,0x8B,0x68,0x01,0x49,0x52,  /* 000003A0    "RS..h.IR" */
-    0x51,0x31,0x82,0x49,0x52,0x51,0x31,0x60,  /* 000003A8    "Q1.IRQ1`" */
-    0x76,0x60,0x70,0x60,0x50,0x49,0x52,0x43,  /* 000003B0    "v`p`PIRC" */
-    0x5B,0x82,0x49,0x08,0x4C,0x4E,0x4B,0x44,  /* 000003B8    "[.I.LNKD" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 000003C0    "._HID.A." */
-    0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 000003C8    "..._UID." */
-    0x04,0x14,0x1C,0x5F,0x53,0x54,0x41,0x00,  /* 000003D0    "..._STA." */
-    0x7B,0x50,0x49,0x52,0x44,0x0A,0x80,0x60,  /* 000003D8    "{PIRD..`" */
-    0xA0,0x08,0x93,0x60,0x0A,0x80,0xA4,0x0A,  /* 000003E0    "...`...." */
-    0x09,0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x0B,  /* 000003E8    "........" */
-    0x5F,0x50,0x52,0x53,0x00,0xA4,0x42,0x55,  /* 000003F0    "_PRS..BU" */
-    0x46,0x41,0x14,0x11,0x5F,0x44,0x49,0x53,  /* 000003F8    "FA.._DIS" */
-    0x00,0x7D,0x50,0x49,0x52,0x44,0x0A,0x80,  /* 00000400    ".}PIRD.." */
-    0x50,0x49,0x52,0x44,0x14,0x1A,0x5F,0x43,  /* 00000408    "PIRD.._C" */
-    0x52,0x53,0x00,0x7B,0x50,0x49,0x52,0x44,  /* 00000410    "RS.{PIRD" */
-    0x0A,0x0F,0x60,0x79,0x01,0x60,0x49,0x52,  /* 00000418    "..`y.`IR" */
-    0x51,0x56,0xA4,0x42,0x55,0x46,0x42,0x14,  /* 00000420    "QV.BUFB." */
-    0x1B,0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,  /* 00000428    "._SRS..h" */
-    0x01,0x49,0x52,0x51,0x31,0x82,0x49,0x52,  /* 00000430    ".IRQ1.IR" */
-    0x51,0x31,0x60,0x76,0x60,0x70,0x60,0x50,  /* 00000438    "Q1`v`p`P" */
-    0x49,0x52,0x44,0x5B,0x82,0x44,0x05,0x48,  /* 00000440    "IRD[.D.H" */
-    0x50,0x45,0x54,0x08,0x5F,0x48,0x49,0x44,  /* 00000448    "PET._HID" */
-    0x0C,0x41,0xD0,0x01,0x03,0x08,0x5F,0x55,  /* 00000450    ".A...._U" */
-    0x49,0x44,0x00,0x14,0x18,0x5F,0x53,0x54,  /* 00000458    "ID..._ST" */
-    0x41,0x00,0xA0,0x0C,0x93,0x5E,0x5E,0x5E,  /* 00000460    "A....^^^" */
-    0x48,0x50,0x45,0x54,0x00,0xA4,0x00,0xA1,  /* 00000468    "HPET...." */
-    0x04,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,  /* 00000470    "....._CR" */
-    0x53,0x11,0x1F,0x0A,0x1C,0x87,0x17,0x00,  /* 00000478    "S......." */
-    0x00,0x0D,0x01,0x00,0x00,0x00,0x00,0x00,  /* 00000480    "........" */
-    0x00,0xD0,0xFE,0xFF,0x03,0xD0,0xFE,0x00,  /* 00000488    "........" */
-    0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x79,  /* 00000490    ".......y" */
-    0x00,0x14,0x16,0x5F,0x50,0x52,0x54,0x00,  /* 00000498    "..._PRT." */
-    0xA0,0x0A,0x50,0x49,0x43,0x44,0xA4,0x50,  /* 000004A0    "..PICD.P" */
-    0x52,0x54,0x41,0xA4,0x50,0x52,0x54,0x50,  /* 000004A8    "RTA.PRTP" */
-    0x08,0x50,0x52,0x54,0x50,0x12,0x49,0x36,  /* 000004B0    ".PRTP.I6" */
-    0x3C,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x01,  /* 000004B8    "<......." */
-    0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 000004C0    "..LNKB.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x01,0x00,0x01,  /* 000004C8    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 000004D0    "LNKC...." */
-    0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x02,0x4C,  /* 000004D8    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 000004E0    "NKD....." */
-    0xFF,0xFF,0x01,0x00,0x0A,0x03,0x4C,0x4E,  /* 000004E8    "......LN" */
-    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000004F0    "KA......" */
-    0xFF,0x02,0x00,0x00,0x4C,0x4E,0x4B,0x43,  /* 000004F8    "....LNKC" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x02,  /* 00000500    "........" */
-    0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000508    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,  /* 00000510    "........" */
-    0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 00000518    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,0x03,  /* 00000520    "........" */
-    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 00000528    "LNKB...." */
-    0x0C,0xFF,0xFF,0x03,0x00,0x00,0x4C,0x4E,  /* 00000530    "......LN" */
-    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000538    "KD......" */
-    0xFF,0x03,0x00,0x01,0x4C,0x4E,0x4B,0x41,  /* 00000540    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000548    "........" */
-    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000550    "...LNKB." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x03,0x00,  /* 00000558    "........" */
-    0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000560    "..LNKC.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x00,  /* 00000568    "........" */
-    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 00000570    "LNKA...." */
-    0x0C,0xFF,0xFF,0x04,0x00,0x01,0x4C,0x4E,  /* 00000578    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000580    "KB......" */
-    0xFF,0x04,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000588    ".....LNK" */
-    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000590    "C......." */
-    0x04,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x44,  /* 00000598    "....LNKD" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x05,  /* 000005A0    "........" */
-    0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 000005A8    "..LNKB.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x05,0x00,0x01,  /* 000005B0    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 000005B8    "LNKC...." */
-    0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x02,0x4C,  /* 000005C0    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 000005C8    "NKD....." */
-    0xFF,0xFF,0x05,0x00,0x0A,0x03,0x4C,0x4E,  /* 000005D0    "......LN" */
-    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000005D8    "KA......" */
-    0xFF,0x06,0x00,0x00,0x4C,0x4E,0x4B,0x43,  /* 000005E0    "....LNKC" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x06,  /* 000005E8    "........" */
-    0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 000005F0    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,  /* 000005F8    "........" */
-    0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 00000600    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,0x03,  /* 00000608    "........" */
-    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 00000610    "LNKB...." */
-    0x0C,0xFF,0xFF,0x07,0x00,0x00,0x4C,0x4E,  /* 00000618    "......LN" */
-    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000620    "KD......" */
-    0xFF,0x07,0x00,0x01,0x4C,0x4E,0x4B,0x41,  /* 00000628    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x07,  /* 00000630    "........" */
-    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000638    "...LNKB." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x07,0x00,  /* 00000640    "........" */
-    0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000648    "..LNKC.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x00,  /* 00000650    "........" */
-    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 00000658    "LNKA...." */
-    0x0C,0xFF,0xFF,0x08,0x00,0x01,0x4C,0x4E,  /* 00000660    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000668    "KB......" */
-    0xFF,0x08,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000670    ".....LNK" */
-    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000678    "C......." */
-    0x08,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x44,  /* 00000680    "....LNKD" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x09,  /* 00000688    "........" */
-    0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000690    "..LNKB.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x09,0x00,0x01,  /* 00000698    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 000006A0    "LNKC...." */
-    0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x02,0x4C,  /* 000006A8    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 000006B0    "NKD....." */
-    0xFF,0xFF,0x09,0x00,0x0A,0x03,0x4C,0x4E,  /* 000006B8    "......LN" */
-    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000006C0    "KA......" */
-    0xFF,0x0A,0x00,0x00,0x4C,0x4E,0x4B,0x43,  /* 000006C8    "....LNKC" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0A,  /* 000006D0    "........" */
-    0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 000006D8    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,  /* 000006E0    "........" */
-    0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000006E8    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,0x03,  /* 000006F0    "........" */
-    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 000006F8    "LNKB...." */
-    0x0C,0xFF,0xFF,0x0B,0x00,0x00,0x4C,0x4E,  /* 00000700    "......LN" */
-    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000708    "KD......" */
-    0xFF,0x0B,0x00,0x01,0x4C,0x4E,0x4B,0x41,  /* 00000710    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0B,  /* 00000718    "........" */
-    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000720    "...LNKB." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0B,0x00,  /* 00000728    "........" */
-    0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000730    "..LNKC.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x00,  /* 00000738    "........" */
-    0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,  /* 00000740    "LNKA...." */
-    0x0C,0xFF,0xFF,0x0C,0x00,0x01,0x4C,0x4E,  /* 00000748    "......LN" */
-    0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000750    "KB......" */
-    0xFF,0x0C,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 00000758    ".....LNK" */
-    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000760    "C......." */
-    0x0C,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x44,  /* 00000768    "....LNKD" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0D,  /* 00000770    "........" */
-    0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,0x12,  /* 00000778    "..LNKB.." */
-    0x0D,0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x01,  /* 00000780    "........" */
-    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,0x04,  /* 00000788    "LNKC...." */
-    0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x02,0x4C,  /* 00000790    ".......L" */
-    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 00000798    "NKD....." */
-    0xFF,0xFF,0x0D,0x00,0x0A,0x03,0x4C,0x4E,  /* 000007A0    "......LN" */
-    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000007A8    "KA......" */
-    0xFF,0x0E,0x00,0x00,0x4C,0x4E,0x4B,0x43,  /* 000007B0    "....LNKC" */
-    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0E,  /* 000007B8    "........" */
-    0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 000007C0    "..LNKD.." */
-    0x0E,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,  /* 000007C8    "........" */
-    0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000007D0    ".LNKA..." */
-    0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,0x03,  /* 000007D8    "........" */
-    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 000007E0    "LNKB...." */
-    0x0C,0xFF,0xFF,0x0F,0x00,0x00,0x4C,0x4E,  /* 000007E8    "......LN" */
-    0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 000007F0    "KD......" */
-    0xFF,0x0F,0x00,0x01,0x4C,0x4E,0x4B,0x41,  /* 000007F8    "....LNKA" */
-    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0F,  /* 00000800    "........" */
-    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000808    "...LNKB." */
-    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0F,0x00,  /* 00000810    "........" */
-    0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,0x08,  /* 00000818    "..LNKC.." */
-    0x50,0x52,0x54,0x41,0x12,0x41,0x2F,0x3C,  /* 00000820    "PRTA.A/<" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 00000828    "........" */
-    0x00,0x00,0x0A,0x14,0x12,0x0B,0x04,0x0C,  /* 00000830    "........" */
-    0xFF,0xFF,0x01,0x00,0x01,0x00,0x0A,0x15,  /* 00000838    "........" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 00000840    "........" */
-    0x0A,0x02,0x00,0x0A,0x16,0x12,0x0C,0x04,  /* 00000848    "........" */
-    0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x03,0x00,  /* 00000850    "........" */
-    0x0A,0x17,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000858    "........" */
-    0x02,0x00,0x00,0x00,0x0A,0x18,0x12,0x0B,  /* 00000860    "........" */
-    0x04,0x0C,0xFF,0xFF,0x02,0x00,0x01,0x00,  /* 00000868    "........" */
-    0x0A,0x19,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000870    "........" */
-    0x02,0x00,0x0A,0x02,0x00,0x0A,0x1A,0x12,  /* 00000878    "........" */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,  /* 00000880    "........" */
-    0x03,0x00,0x0A,0x1B,0x12,0x0B,0x04,0x0C,  /* 00000888    "........" */
-    0xFF,0xFF,0x03,0x00,0x00,0x00,0x0A,0x1C,  /* 00000890    "........" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x03,0x00,  /* 00000898    "........" */
-    0x01,0x00,0x0A,0x1D,0x12,0x0C,0x04,0x0C,  /* 000008A0    "........" */
-    0xFF,0xFF,0x03,0x00,0x0A,0x02,0x00,0x0A,  /* 000008A8    "........" */
-    0x1E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x03,  /* 000008B0    "........" */
-    0x00,0x0A,0x03,0x00,0x0A,0x1F,0x12,0x0B,  /* 000008B8    "........" */
-    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x00,0x00,  /* 000008C0    "........" */
-    0x0A,0x20,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000008C8    ". ......" */
-    0x04,0x00,0x01,0x00,0x0A,0x21,0x12,0x0C,  /* 000008D0    ".....!.." */
-    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,0x02,  /* 000008D8    "........" */
-    0x00,0x0A,0x22,0x12,0x0C,0x04,0x0C,0xFF,  /* 000008E0    ".."....." */
-    0xFF,0x04,0x00,0x0A,0x03,0x00,0x0A,0x23,  /* 000008E8    ".......#" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 000008F0    "........" */
-    0x00,0x00,0x0A,0x24,0x12,0x0B,0x04,0x0C,  /* 000008F8    "...$...." */
-    0xFF,0xFF,0x05,0x00,0x01,0x00,0x0A,0x25,  /* 00000900    ".......%" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 00000908    "........" */
-    0x0A,0x02,0x00,0x0A,0x26,0x12,0x0C,0x04,  /* 00000910    "....&..." */
-    0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x03,0x00,  /* 00000918    "........" */
-    0x0A,0x27,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000920    ".'......" */
-    0x06,0x00,0x00,0x00,0x0A,0x28,0x12,0x0B,  /* 00000928    ".....(.." */
-    0x04,0x0C,0xFF,0xFF,0x06,0x00,0x01,0x00,  /* 00000930    "........" */
-    0x0A,0x29,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000938    ".)......" */
-    0x06,0x00,0x0A,0x02,0x00,0x0A,0x2A,0x12,  /* 00000940    "......*." */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,  /* 00000948    "........" */
-    0x03,0x00,0x0A,0x2B,0x12,0x0B,0x04,0x0C,  /* 00000950    "...+...." */
-    0xFF,0xFF,0x07,0x00,0x00,0x00,0x0A,0x2C,  /* 00000958    ".......," */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x07,0x00,  /* 00000960    "........" */
-    0x01,0x00,0x0A,0x2D,0x12,0x0C,0x04,0x0C,  /* 00000968    "...-...." */
-    0xFF,0xFF,0x07,0x00,0x0A,0x02,0x00,0x0A,  /* 00000970    "........" */
-    0x2E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x07,  /* 00000978    "........" */
-    0x00,0x0A,0x03,0x00,0x0A,0x2F,0x12,0x0B,  /* 00000980    "...../.." */
-    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x00,0x00,  /* 00000988    "........" */
-    0x0A,0x11,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000990    "........" */
-    0x08,0x00,0x01,0x00,0x0A,0x12,0x12,0x0C,  /* 00000998    "........" */
-    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,0x02,  /* 000009A0    "........" */
-    0x00,0x0A,0x13,0x12,0x0C,0x04,0x0C,0xFF,  /* 000009A8    "........" */
-    0xFF,0x08,0x00,0x0A,0x03,0x00,0x0A,0x14,  /* 000009B0    "........" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 000009B8    "........" */
-    0x00,0x00,0x0A,0x15,0x12,0x0B,0x04,0x0C,  /* 000009C0    "........" */
-    0xFF,0xFF,0x09,0x00,0x01,0x00,0x0A,0x16,  /* 000009C8    "........" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 000009D0    "........" */
-    0x0A,0x02,0x00,0x0A,0x17,0x12,0x0C,0x04,  /* 000009D8    "........" */
-    0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x03,0x00,  /* 000009E0    "........" */
-    0x0A,0x18,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000009E8    "........" */
-    0x0A,0x00,0x00,0x00,0x0A,0x19,0x12,0x0B,  /* 000009F0    "........" */
-    0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x01,0x00,  /* 000009F8    "........" */
-    0x0A,0x1A,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000A00    "........" */
-    0x0A,0x00,0x0A,0x02,0x00,0x0A,0x1B,0x12,  /* 00000A08    "........" */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,  /* 00000A10    "........" */
-    0x03,0x00,0x0A,0x1C,0x12,0x0B,0x04,0x0C,  /* 00000A18    "........" */
-    0xFF,0xFF,0x0B,0x00,0x00,0x00,0x0A,0x1D,  /* 00000A20    "........" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0B,0x00,  /* 00000A28    "........" */
-    0x01,0x00,0x0A,0x1E,0x12,0x0C,0x04,0x0C,  /* 00000A30    "........" */
-    0xFF,0xFF,0x0B,0x00,0x0A,0x02,0x00,0x0A,  /* 00000A38    "........" */
-    0x1F,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0B,  /* 00000A40    "........" */
-    0x00,0x0A,0x03,0x00,0x0A,0x20,0x12,0x0B,  /* 00000A48    "..... .." */
-    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x00,0x00,  /* 00000A50    "........" */
-    0x0A,0x21,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000A58    ".!......" */
-    0x0C,0x00,0x01,0x00,0x0A,0x22,0x12,0x0C,  /* 00000A60    ".....".." */
-    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,0x02,  /* 00000A68    "........" */
-    0x00,0x0A,0x23,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000A70    "..#....." */
-    0xFF,0x0C,0x00,0x0A,0x03,0x00,0x0A,0x24,  /* 00000A78    ".......$" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 00000A80    "........" */
-    0x00,0x00,0x0A,0x25,0x12,0x0B,0x04,0x0C,  /* 00000A88    "...%...." */
-    0xFF,0xFF,0x0D,0x00,0x01,0x00,0x0A,0x26,  /* 00000A90    ".......&" */
-    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 00000A98    "........" */
-    0x0A,0x02,0x00,0x0A,0x27,0x12,0x0C,0x04,  /* 00000AA0    "....'..." */
-    0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x03,0x00,  /* 00000AA8    "........" */
-    0x0A,0x28,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000AB0    ".(......" */
-    0x0E,0x00,0x00,0x00,0x0A,0x29,0x12,0x0B,  /* 00000AB8    ".....).." */
-    0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x01,0x00,  /* 00000AC0    "........" */
-    0x0A,0x2A,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000AC8    ".*......" */
-    0x0E,0x00,0x0A,0x02,0x00,0x0A,0x2B,0x12,  /* 00000AD0    "......+." */
-    0x0C,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,  /* 00000AD8    "........" */
-    0x03,0x00,0x0A,0x2C,0x12,0x0B,0x04,0x0C,  /* 00000AE0    "...,...." */
-    0xFF,0xFF,0x0F,0x00,0x00,0x00,0x0A,0x2D,  /* 00000AE8    ".......-" */
-    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0F,0x00,  /* 00000AF0    "........" */
-    0x01,0x00,0x0A,0x2E,0x12,0x0C,0x04,0x0C,  /* 00000AF8    "........" */
-    0xFF,0xFF,0x0F,0x00,0x0A,0x02,0x00,0x0A,  /* 00000B00    "........" */
-    0x2F,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0F,  /* 00000B08    "/......." */
-    0x00,0x0A,0x03,0x00,0x0A,0x10,0x5B,0x82,  /* 00000B10    "......[." */
-    0x46,0x37,0x49,0x53,0x41,0x5F,0x08,0x5F,  /* 00000B18    "F7ISA_._" */
-    0x41,0x44,0x52,0x0C,0x00,0x00,0x01,0x00,  /* 00000B20    "ADR....." */
-    0x5B,0x80,0x50,0x49,0x52,0x51,0x02,0x0A,  /* 00000B28    "[.PIRQ.." */
-    0x60,0x0A,0x04,0x10,0x2E,0x5C,0x00,0x5B,  /* 00000B30    "`....\.[" */
-    0x81,0x29,0x5C,0x2F,0x04,0x5F,0x53,0x42,  /* 00000B38    ".)\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x49,0x53,0x41,  /* 00000B40    "_PCI0ISA" */
-    0x5F,0x50,0x49,0x52,0x51,0x01,0x50,0x49,  /* 00000B48    "_PIRQ.PI" */
-    0x52,0x41,0x08,0x50,0x49,0x52,0x42,0x08,  /* 00000B50    "RA.PIRB." */
-    0x50,0x49,0x52,0x43,0x08,0x50,0x49,0x52,  /* 00000B58    "PIRC.PIR" */
-    0x44,0x08,0x5B,0x82,0x46,0x0B,0x53,0x59,  /* 00000B60    "D.[.F.SY" */
-    0x53,0x52,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000B68    "SR._HID." */
-    0x41,0xD0,0x0C,0x02,0x08,0x5F,0x55,0x49,  /* 00000B70    "A...._UI" */
-    0x44,0x01,0x08,0x43,0x52,0x53,0x5F,0x11,  /* 00000B78    "D..CRS_." */
-    0x4E,0x08,0x0A,0x8A,0x47,0x01,0x10,0x00,  /* 00000B80    "N...G..." */
-    0x10,0x00,0x00,0x10,0x47,0x01,0x22,0x00,  /* 00000B88    "....G."." */
-    0x22,0x00,0x00,0x0C,0x47,0x01,0x30,0x00,  /* 00000B90    ""...G.0." */
-    0x30,0x00,0x00,0x10,0x47,0x01,0x44,0x00,  /* 00000B98    "0...G.D." */
-    0x44,0x00,0x00,0x1C,0x47,0x01,0x62,0x00,  /* 00000BA0    "D...G.b." */
-    0x62,0x00,0x00,0x02,0x47,0x01,0x65,0x00,  /* 00000BA8    "b...G.e." */
-    0x65,0x00,0x00,0x0B,0x47,0x01,0x72,0x00,  /* 00000BB0    "e...G.r." */
-    0x72,0x00,0x00,0x0E,0x47,0x01,0x80,0x00,  /* 00000BB8    "r...G..." */
-    0x80,0x00,0x00,0x01,0x47,0x01,0x84,0x00,  /* 00000BC0    "....G..." */
-    0x84,0x00,0x00,0x03,0x47,0x01,0x88,0x00,  /* 00000BC8    "....G..." */
-    0x88,0x00,0x00,0x01,0x47,0x01,0x8C,0x00,  /* 00000BD0    "....G..." */
-    0x8C,0x00,0x00,0x03,0x47,0x01,0x90,0x00,  /* 00000BD8    "....G..." */
-    0x90,0x00,0x00,0x10,0x47,0x01,0xA2,0x00,  /* 00000BE0    "....G..." */
-    0xA2,0x00,0x00,0x1C,0x47,0x01,0xE0,0x00,  /* 00000BE8    "....G..." */
-    0xE0,0x00,0x00,0x10,0x47,0x01,0xA0,0x08,  /* 00000BF0    "....G..." */
-    0xA0,0x08,0x00,0x04,0x47,0x01,0xC0,0x0C,  /* 00000BF8    "....G..." */
-    0xC0,0x0C,0x00,0x10,0x47,0x01,0xD0,0x04,  /* 00000C00    "....G..." */
-    0xD0,0x04,0x00,0x02,0x79,0x00,0x14,0x0B,  /* 00000C08    "....y..." */
-    0x5F,0x43,0x52,0x53,0x00,0xA4,0x43,0x52,  /* 00000C10    "_CRS..CR" */
-    0x53,0x5F,0x5B,0x82,0x2B,0x50,0x49,0x43,  /* 00000C18    "S_[.+PIC" */
-    0x5F,0x08,0x5F,0x48,0x49,0x44,0x0B,0x41,  /* 00000C20    "_._HID.A" */
-    0xD0,0x08,0x5F,0x43,0x52,0x53,0x11,0x18,  /* 00000C28    ".._CRS.." */
-    0x0A,0x15,0x47,0x01,0x20,0x00,0x20,0x00,  /* 00000C30    "..G. . ." */
-    0x01,0x02,0x47,0x01,0xA0,0x00,0xA0,0x00,  /* 00000C38    "..G....." */
-    0x01,0x02,0x22,0x04,0x00,0x79,0x00,0x5B,  /* 00000C40    ".."..y.[" */
-    0x82,0x47,0x05,0x44,0x4D,0x41,0x30,0x08,  /* 00000C48    ".G.DMA0." */
-    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x02,  /* 00000C50    "_HID.A.." */
-    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x41,  /* 00000C58    ".._CRS.A" */
-    0x04,0x0A,0x3D,0x2A,0x10,0x04,0x47,0x01,  /* 00000C60    "..=*..G." */
-    0x00,0x00,0x00,0x00,0x00,0x10,0x47,0x01,  /* 00000C68    "......G." */
-    0x81,0x00,0x81,0x00,0x00,0x03,0x47,0x01,  /* 00000C70    "......G." */
-    0x87,0x00,0x87,0x00,0x00,0x01,0x47,0x01,  /* 00000C78    "......G." */
-    0x89,0x00,0x89,0x00,0x00,0x03,0x47,0x01,  /* 00000C80    "......G." */
-    0x8F,0x00,0x8F,0x00,0x00,0x01,0x47,0x01,  /* 00000C88    "......G." */
-    0xC0,0x00,0xC0,0x00,0x00,0x20,0x47,0x01,  /* 00000C90    "..... G." */
-    0x80,0x04,0x80,0x04,0x00,0x10,0x79,0x00,  /* 00000C98    "......y." */
-    0x5B,0x82,0x25,0x54,0x4D,0x52,0x5F,0x08,  /* 00000CA0    "[.%TMR_." */
-    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x01,  /* 00000CA8    "_HID.A.." */
-    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x10,  /* 00000CB0    ".._CRS.." */
-    0x0A,0x0D,0x47,0x01,0x40,0x00,0x40,0x00,  /* 00000CB8    "..G.@.@." */
-    0x00,0x04,0x22,0x01,0x00,0x79,0x00,0x5B,  /* 00000CC0    ".."..y.[" */
-    0x82,0x25,0x52,0x54,0x43,0x5F,0x08,0x5F,  /* 00000CC8    ".%RTC_._" */
-    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0B,0x00,  /* 00000CD0    "HID.A..." */
-    0x08,0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,  /* 00000CD8    "._CRS..." */
-    0x0D,0x47,0x01,0x70,0x00,0x70,0x00,0x00,  /* 00000CE0    ".G.p.p.." */
-    0x02,0x22,0x00,0x01,0x79,0x00,0x5B,0x82,  /* 00000CE8    "."..y.[." */
-    0x22,0x53,0x50,0x4B,0x52,0x08,0x5F,0x48,  /* 00000CF0    ""SPKR._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x08,0x00,0x08,  /* 00000CF8    "ID.A...." */
-    0x5F,0x43,0x52,0x53,0x11,0x0D,0x0A,0x0A,  /* 00000D00    "_CRS...." */
-    0x47,0x01,0x61,0x00,0x61,0x00,0x00,0x01,  /* 00000D08    "G.a.a..." */
-    0x79,0x00,0x5B,0x82,0x31,0x50,0x53,0x32,  /* 00000D10    "y.[.1PS2" */
-    0x4D,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000D18    "M._HID.A" */
-    0xD0,0x0F,0x13,0x08,0x5F,0x43,0x49,0x44,  /* 00000D20    "...._CID" */
-    0x0C,0x41,0xD0,0x0F,0x13,0x14,0x09,0x5F,  /* 00000D28    ".A....._" */
-    0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,  /* 00000D30    "STA....." */
-    0x5F,0x43,0x52,0x53,0x11,0x08,0x0A,0x05,  /* 00000D38    "_CRS...." */
-    0x22,0x00,0x10,0x79,0x00,0x5B,0x82,0x42,  /* 00000D40    ""..y.[.B" */
-    0x04,0x50,0x53,0x32,0x4B,0x08,0x5F,0x48,  /* 00000D48    ".PS2K._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x03,0x03,0x08,  /* 00000D50    "ID.A...." */
-    0x5F,0x43,0x49,0x44,0x0C,0x41,0xD0,0x03,  /* 00000D58    "_CID.A.." */
-    0x0B,0x14,0x09,0x5F,0x53,0x54,0x41,0x00,  /* 00000D60    "..._STA." */
-    0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,  /* 00000D68    "...._CRS" */
-    0x11,0x18,0x0A,0x15,0x47,0x01,0x60,0x00,  /* 00000D70    "....G.`." */
-    0x60,0x00,0x00,0x01,0x47,0x01,0x64,0x00,  /* 00000D78    "`...G.d." */
-    0x64,0x00,0x00,0x01,0x22,0x02,0x00,0x79,  /* 00000D80    "d..."..y" */
-    0x00,0x5B,0x82,0x3A,0x46,0x44,0x43,0x30,  /* 00000D88    ".[.:FDC0" */
-    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000D90    "._HID.A." */
-    0x07,0x00,0x14,0x09,0x5F,0x53,0x54,0x41,  /* 00000D98    "...._STA" */
-    0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,  /* 00000DA0    "....._CR" */
-    0x53,0x11,0x1B,0x0A,0x18,0x47,0x01,0xF0,  /* 00000DA8    "S....G.." */
-    0x03,0xF0,0x03,0x01,0x06,0x47,0x01,0xF7,  /* 00000DB0    ".....G.." */
-    0x03,0xF7,0x03,0x01,0x01,0x22,0x40,0x00,  /* 00000DB8    "....."@." */
-    0x2A,0x04,0x00,0x79,0x00,0x5B,0x82,0x46,  /* 00000DC0    "*..y.[.F" */
-    0x04,0x55,0x41,0x52,0x31,0x08,0x5F,0x48,  /* 00000DC8    ".UAR1._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x05,0x01,0x08,  /* 00000DD0    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x01,0x14,0x19,0x5F,  /* 00000DD8    "_UID..._" */
-    0x53,0x54,0x41,0x00,0xA0,0x0D,0x93,0x5E,  /* 00000DE0    "STA....^" */
-    0x5E,0x5E,0x5E,0x55,0x41,0x52,0x31,0x00,  /* 00000DE8    "^^^UAR1." */
-    0xA4,0x00,0xA1,0x04,0xA4,0x0A,0x0F,0x08,  /* 00000DF0    "........" */
-    0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,  /* 00000DF8    "_CRS...." */
-    0x47,0x01,0xF8,0x03,0xF8,0x03,0x08,0x08,  /* 00000E00    "G......." */
-    0x22,0x10,0x00,0x79,0x00,0x5B,0x82,0x47,  /* 00000E08    ""..y.[.G" */
-    0x04,0x55,0x41,0x52,0x32,0x08,0x5F,0x48,  /* 00000E10    ".UAR2._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x05,0x01,0x08,  /* 00000E18    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x0A,0x02,0x14,0x19,  /* 00000E20    "_UID...." */
-    0x5F,0x53,0x54,0x41,0x00,0xA0,0x0D,0x93,  /* 00000E28    "_STA...." */
-    0x5E,0x5E,0x5E,0x5E,0x55,0x41,0x52,0x32,  /* 00000E30    "^^^^UAR2" */
-    0x00,0xA4,0x00,0xA1,0x04,0xA4,0x0A,0x0F,  /* 00000E38    "........" */
-    0x08,0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,  /* 00000E40    "._CRS..." */
-    0x0D,0x47,0x01,0xF8,0x02,0xF8,0x02,0x08,  /* 00000E48    ".G......" */
-    0x08,0x22,0x08,0x00,0x79,0x00,0x5B,0x82,  /* 00000E50    "."..y.[." */
-    0x36,0x4C,0x54,0x50,0x31,0x08,0x5F,0x48,  /* 00000E58    "6LTP1._H" */
-    0x49,0x44,0x0C,0x41,0xD0,0x04,0x00,0x08,  /* 00000E60    "ID.A...." */
-    0x5F,0x55,0x49,0x44,0x0A,0x02,0x14,0x09,  /* 00000E68    "_UID...." */
-    0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,  /* 00000E70    "_STA...." */
-    0x08,0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,  /* 00000E78    "._CRS..." */
-    0x0D,0x47,0x01,0x78,0x03,0x78,0x03,0x08,  /* 00000E80    ".G.x.x.." */
-    0x08,0x22,0x80,0x00,0x79,0x00,
+    0x00,0x14,0x1D,0x5F,0x48,0x50,0x50,0x00,  /* 00000120    "..._HPP." */
+    0x70,0x0A,0x99,0x5C,0x2E,0x5F,0x47,0x50,  /* 00000128    "p..\._GP" */
+    0x45,0x44,0x50,0x54,0x31,0xA4,0x12,0x08,  /* 00000130    "EDPT1..." */
+    0x04,0x0A,0x10,0x0A,0x40,0x00,0x00,0x14,  /* 00000138    "....@..." */
+    0x4E,0x0C,0x5F,0x43,0x52,0x53,0x00,0x08,  /* 00000140    "N._CRS.." */
+    0x50,0x52,0x54,0x30,0x11,0x42,0x07,0x0A,  /* 00000148    "PRT0.B.." */
+    0x6E,0x88,0x0D,0x00,0x02,0x0E,0x00,0x00,  /* 00000150    "n......." */
+    0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,  /* 00000158    "........" */
+    0x01,0x47,0x01,0xF8,0x0C,0xF8,0x0C,0x01,  /* 00000160    ".G......" */
+    0x08,0x88,0x0D,0x00,0x01,0x0C,0x03,0x00,  /* 00000168    "........" */
+    0x00,0x00,0x00,0xF7,0x0C,0x00,0x00,0xF8,  /* 00000170    "........" */
+    0x0C,0x88,0x0D,0x00,0x01,0x0C,0x03,0x00,  /* 00000178    "........" */
+    0x00,0x00,0x0D,0xFF,0xFF,0x00,0x00,0x00,  /* 00000180    "........" */
+    0xF3,0x87,0x17,0x00,0x00,0x0C,0x03,0x00,  /* 00000188    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0xFF,  /* 00000190    "........" */
+    0xFF,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000198    "........" */
+    0x00,0x02,0x00,0x87,0x17,0x00,0x00,0x0C,  /* 000001A0    "........" */
+    0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000001A8    "........" */
+    0xF0,0xFF,0xFF,0xFF,0xF4,0x00,0x00,0x00,  /* 000001B0    "........" */
+    0x00,0x00,0x00,0x00,0x05,0x79,0x00,0x8A,  /* 000001B8    ".....y.." */
+    0x50,0x52,0x54,0x30,0x0A,0x5C,0x4D,0x4D,  /* 000001C0    "PRT0.\MM" */
+    0x49,0x4E,0x8A,0x50,0x52,0x54,0x30,0x0A,  /* 000001C8    "IN.PRT0." */
+    0x60,0x4D,0x4D,0x41,0x58,0x8A,0x50,0x52,  /* 000001D0    "`MMAX.PR" */
+    0x54,0x30,0x0A,0x68,0x4D,0x4C,0x45,0x4E,  /* 000001D8    "T0.hMLEN" */
+    0x70,0x50,0x4D,0x49,0x4E,0x4D,0x4D,0x49,  /* 000001E0    "pPMINMMI" */
+    0x4E,0x70,0x50,0x4C,0x45,0x4E,0x4D,0x4C,  /* 000001E8    "NpPLENML" */
+    0x45,0x4E,0x72,0x4D,0x4D,0x49,0x4E,0x4D,  /* 000001F0    "ENrMMINM" */
+    0x4C,0x45,0x4E,0x4D,0x4D,0x41,0x58,0x74,  /* 000001F8    "LENMMAXt" */
+    0x4D,0x4D,0x41,0x58,0x01,0x4D,0x4D,0x41,  /* 00000200    "MMAX.MMA" */
+    0x58,0xA4,0x50,0x52,0x54,0x30,0x08,0x42,  /* 00000208    "X.PRT0.B" */
+    0x55,0x46,0x41,0x11,0x09,0x0A,0x06,0x23,  /* 00000210    "UFA....#" */
+    0x20,0x0C,0x18,0x79,0x00,0x08,0x42,0x55,  /* 00000218    " ..y..BU" */
+    0x46,0x42,0x11,0x09,0x0A,0x06,0x23,0x00,  /* 00000220    "FB....#." */
+    0x00,0x18,0x79,0x00,0x8B,0x42,0x55,0x46,  /* 00000228    "..y..BUF" */
+    0x42,0x01,0x49,0x52,0x51,0x56,0x5B,0x82,  /* 00000230    "B.IRQV[." */
+    0x48,0x08,0x4C,0x4E,0x4B,0x41,0x08,0x5F,  /* 00000238    "H.LNKA._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,  /* 00000240    "HID.A..." */
+    0x08,0x5F,0x55,0x49,0x44,0x01,0x14,0x1C,  /* 00000248    "._UID..." */
+    0x5F,0x53,0x54,0x41,0x00,0x7B,0x50,0x49,  /* 00000250    "_STA.{PI" */
+    0x52,0x41,0x0A,0x80,0x60,0xA0,0x08,0x93,  /* 00000258    "RA..`..." */
+    0x60,0x0A,0x80,0xA4,0x0A,0x09,0xA1,0x04,  /* 00000260    "`......." */
+    0xA4,0x0A,0x0B,0x14,0x0B,0x5F,0x50,0x52,  /* 00000268    "....._PR" */
+    0x53,0x00,0xA4,0x42,0x55,0x46,0x41,0x14,  /* 00000270    "S..BUFA." */
+    0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,0x50,  /* 00000278    "._DIS.}P" */
+    0x49,0x52,0x41,0x0A,0x80,0x50,0x49,0x52,  /* 00000280    "IRA..PIR" */
+    0x41,0x14,0x1A,0x5F,0x43,0x52,0x53,0x00,  /* 00000288    "A.._CRS." */
+    0x7B,0x50,0x49,0x52,0x41,0x0A,0x0F,0x60,  /* 00000290    "{PIRA..`" */
+    0x79,0x01,0x60,0x49,0x52,0x51,0x56,0xA4,  /* 00000298    "y.`IRQV." */
+    0x42,0x55,0x46,0x42,0x14,0x1B,0x5F,0x53,  /* 000002A0    "BUFB.._S" */
+    0x52,0x53,0x01,0x8B,0x68,0x01,0x49,0x52,  /* 000002A8    "RS..h.IR" */
+    0x51,0x31,0x82,0x49,0x52,0x51,0x31,0x60,  /* 000002B0    "Q1.IRQ1`" */
+    0x76,0x60,0x70,0x60,0x50,0x49,0x52,0x41,  /* 000002B8    "v`p`PIRA" */
+    0x5B,0x82,0x49,0x08,0x4C,0x4E,0x4B,0x42,  /* 000002C0    "[.I.LNKB" */
+    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 000002C8    "._HID.A." */
+    0x0C,0x0F,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 000002D0    "..._UID." */
+    0x02,0x14,0x1C,0x5F,0x53,0x54,0x41,0x00,  /* 000002D8    "..._STA." */
+    0x7B,0x50,0x49,0x52,0x42,0x0A,0x80,0x60,  /* 000002E0    "{PIRB..`" */
+    0xA0,0x08,0x93,0x60,0x0A,0x80,0xA4,0x0A,  /* 000002E8    "...`...." */
+    0x09,0xA1,0x04,0xA4,0x0A,0x0B,0x14,0x0B,  /* 000002F0    "........" */
+    0x5F,0x50,0x52,0x53,0x00,0xA4,0x42,0x55,  /* 000002F8    "_PRS..BU" */
+    0x46,0x41,0x14,0x11,0x5F,0x44,0x49,0x53,  /* 00000300    "FA.._DIS" */
+    0x00,0x7D,0x50,0x49,0x52,0x42,0x0A,0x80,  /* 00000308    ".}PIRB.." */
+    0x50,0x49,0x52,0x42,0x14,0x1A,0x5F,0x43,  /* 00000310    "PIRB.._C" */
+    0x52,0x53,0x00,0x7B,0x50,0x49,0x52,0x42,  /* 00000318    "RS.{PIRB" */
+    0x0A,0x0F,0x60,0x79,0x01,0x60,0x49,0x52,  /* 00000320    "..`y.`IR" */
+    0x51,0x56,0xA4,0x42,0x55,0x46,0x42,0x14,  /* 00000328    "QV.BUFB." */
+    0x1B,0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,  /* 00000330    "._SRS..h" */
+    0x01,0x49,0x52,0x51,0x31,0x82,0x49,0x52,  /* 00000338    ".IRQ1.IR" */
+    0x51,0x31,0x60,0x76,0x60,0x70,0x60,0x50,  /* 00000340    "Q1`v`p`P" */
+    0x49,0x52,0x42,0x5B,0x82,0x49,0x08,0x4C,  /* 00000348    "IRB[.I.L" */
+    0x4E,0x4B,0x43,0x08,0x5F,0x48,0x49,0x44,  /* 00000350    "NKC._HID" */
+    0x0C,0x41,0xD0,0x0C,0x0F,0x08,0x5F,0x55,  /* 00000358    ".A...._U" */
+    0x49,0x44,0x0A,0x03,0x14,0x1C,0x5F,0x53,  /* 00000360    "ID...._S" */
+    0x54,0x41,0x00,0x7B,0x50,0x49,0x52,0x43,  /* 00000368    "TA.{PIRC" */
+    0x0A,0x80,0x60,0xA0,0x08,0x93,0x60,0x0A,  /* 00000370    "..`...`." */
+    0x80,0xA4,0x0A,0x09,0xA1,0x04,0xA4,0x0A,  /* 00000378    "........" */
+    0x0B,0x14,0x0B,0x5F,0x50,0x52,0x53,0x00,  /* 00000380    "..._PRS." */
+    0xA4,0x42,0x55,0x46,0x41,0x14,0x11,0x5F,  /* 00000388    ".BUFA.._" */
+    0x44,0x49,0x53,0x00,0x7D,0x50,0x49,0x52,  /* 00000390    "DIS.}PIR" */
+    0x43,0x0A,0x80,0x50,0x49,0x52,0x43,0x14,  /* 00000398    "C..PIRC." */
+    0x1A,0x5F,0x43,0x52,0x53,0x00,0x7B,0x50,  /* 000003A0    "._CRS.{P" */
+    0x49,0x52,0x43,0x0A,0x0F,0x60,0x79,0x01,  /* 000003A8    "IRC..`y." */
+    0x60,0x49,0x52,0x51,0x56,0xA4,0x42,0x55,  /* 000003B0    "`IRQV.BU" */
+    0x46,0x42,0x14,0x1B,0x5F,0x53,0x52,0x53,  /* 000003B8    "FB.._SRS" */
+    0x01,0x8B,0x68,0x01,0x49,0x52,0x51,0x31,  /* 000003C0    "..h.IRQ1" */
+    0x82,0x49,0x52,0x51,0x31,0x60,0x76,0x60,  /* 000003C8    ".IRQ1`v`" */
+    0x70,0x60,0x50,0x49,0x52,0x43,0x5B,0x82,  /* 000003D0    "p`PIRC[." */
+    0x49,0x08,0x4C,0x4E,0x4B,0x44,0x08,0x5F,  /* 000003D8    "I.LNKD._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0F,  /* 000003E0    "HID.A..." */
+    0x08,0x5F,0x55,0x49,0x44,0x0A,0x04,0x14,  /* 000003E8    "._UID..." */
+    0x1C,0x5F,0x53,0x54,0x41,0x00,0x7B,0x50,  /* 000003F0    "._STA.{P" */
+    0x49,0x52,0x44,0x0A,0x80,0x60,0xA0,0x08,  /* 000003F8    "IRD..`.." */
+    0x93,0x60,0x0A,0x80,0xA4,0x0A,0x09,0xA1,  /* 00000400    ".`......" */
+    0x04,0xA4,0x0A,0x0B,0x14,0x0B,0x5F,0x50,  /* 00000408    "......_P" */
+    0x52,0x53,0x00,0xA4,0x42,0x55,0x46,0x41,  /* 00000410    "RS..BUFA" */
+    0x14,0x11,0x5F,0x44,0x49,0x53,0x00,0x7D,  /* 00000418    ".._DIS.}" */
+    0x50,0x49,0x52,0x44,0x0A,0x80,0x50,0x49,  /* 00000420    "PIRD..PI" */
+    0x52,0x44,0x14,0x1A,0x5F,0x43,0x52,0x53,  /* 00000428    "RD.._CRS" */
+    0x00,0x7B,0x50,0x49,0x52,0x44,0x0A,0x0F,  /* 00000430    ".{PIRD.." */
+    0x60,0x79,0x01,0x60,0x49,0x52,0x51,0x56,  /* 00000438    "`y.`IRQV" */
+    0xA4,0x42,0x55,0x46,0x42,0x14,0x1B,0x5F,  /* 00000440    ".BUFB.._" */
+    0x53,0x52,0x53,0x01,0x8B,0x68,0x01,0x49,  /* 00000448    "SRS..h.I" */
+    0x52,0x51,0x31,0x82,0x49,0x52,0x51,0x31,  /* 00000450    "RQ1.IRQ1" */
+    0x60,0x76,0x60,0x70,0x60,0x50,0x49,0x52,  /* 00000458    "`v`p`PIR" */
+    0x44,0x5B,0x82,0x44,0x05,0x48,0x50,0x45,  /* 00000460    "D[.D.HPE" */
+    0x54,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000468    "T._HID.A" */
+    0xD0,0x01,0x03,0x08,0x5F,0x55,0x49,0x44,  /* 00000470    "...._UID" */
+    0x00,0x14,0x18,0x5F,0x53,0x54,0x41,0x00,  /* 00000478    "..._STA." */
+    0xA0,0x0C,0x93,0x5E,0x5E,0x5E,0x48,0x50,  /* 00000480    "...^^^HP" */
+    0x45,0x54,0x00,0xA4,0x00,0xA1,0x04,0xA4,  /* 00000488    "ET......" */
+    0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000490    "..._CRS." */
+    0x1F,0x0A,0x1C,0x87,0x17,0x00,0x00,0x0D,  /* 00000498    "........" */
+    0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,  /* 000004A0    "........" */
+    0xFE,0xFF,0x03,0xD0,0xFE,0x00,0x00,0x00,  /* 000004A8    "........" */
+    0x00,0x00,0x04,0x00,0x00,0x79,0x00,0x14,  /* 000004B0    ".....y.." */
+    0x16,0x5F,0x50,0x52,0x54,0x00,0xA0,0x0A,  /* 000004B8    "._PRT..." */
+    0x50,0x49,0x43,0x44,0xA4,0x50,0x52,0x54,  /* 000004C0    "PICD.PRT" */
+    0x41,0xA4,0x50,0x52,0x54,0x50,0x08,0x50,  /* 000004C8    "A.PRTP.P" */
+    0x52,0x54,0x50,0x12,0x49,0x36,0x3C,0x12,  /* 000004D0    "RTP.I6<." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x01,0x00,0x00,  /* 000004D8    "........" */
+    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 000004E0    "LNKB...." */
+    0x0C,0xFF,0xFF,0x01,0x00,0x01,0x4C,0x4E,  /* 000004E8    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000004F0    "KC......" */
+    0xFF,0x01,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 000004F8    ".....LNK" */
+    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000500    "D......." */
+    0x01,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,  /* 00000508    "....LNKA" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x02,  /* 00000510    "........" */
+    0x00,0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000518    "..LNKC.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x01,  /* 00000520    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000528    "LNKD...." */
+    0x0C,0xFF,0xFF,0x02,0x00,0x0A,0x02,0x4C,  /* 00000530    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 00000538    "NKA....." */
+    0xFF,0xFF,0x02,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000540    "......LN" */
+    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000548    "KB......" */
+    0xFF,0x03,0x00,0x00,0x4C,0x4E,0x4B,0x44,  /* 00000550    "....LNKD" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000558    "........" */
+    0x00,0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000560    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,  /* 00000568    "........" */
+    0x02,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 00000570    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x03,  /* 00000578    "........" */
+    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000580    "LNKC...." */
+    0x0C,0xFF,0xFF,0x04,0x00,0x00,0x4C,0x4E,  /* 00000588    "......LN" */
+    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000590    "KA......" */
+    0xFF,0x04,0x00,0x01,0x4C,0x4E,0x4B,0x42,  /* 00000598    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x04,  /* 000005A0    "........" */
+    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,  /* 000005A8    "...LNKC." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 000005B0    "........" */
+    0x0A,0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 000005B8    "..LNKD.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x05,0x00,0x00,  /* 000005C0    "........" */
+    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 000005C8    "LNKB...." */
+    0x0C,0xFF,0xFF,0x05,0x00,0x01,0x4C,0x4E,  /* 000005D0    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000005D8    "KC......" */
+    0xFF,0x05,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 000005E0    ".....LNK" */
+    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000005E8    "D......." */
+    0x05,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,  /* 000005F0    "....LNKA" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x06,  /* 000005F8    "........" */
+    0x00,0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000600    "..LNKC.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x01,  /* 00000608    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000610    "LNKD...." */
+    0x0C,0xFF,0xFF,0x06,0x00,0x0A,0x02,0x4C,  /* 00000618    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 00000620    "NKA....." */
+    0xFF,0xFF,0x06,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000628    "......LN" */
+    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000630    "KB......" */
+    0xFF,0x07,0x00,0x00,0x4C,0x4E,0x4B,0x44,  /* 00000638    "....LNKD" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x07,  /* 00000640    "........" */
+    0x00,0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000648    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,  /* 00000650    "........" */
+    0x02,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 00000658    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x03,  /* 00000660    "........" */
+    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000668    "LNKC...." */
+    0x0C,0xFF,0xFF,0x08,0x00,0x00,0x4C,0x4E,  /* 00000670    "......LN" */
+    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000678    "KA......" */
+    0xFF,0x08,0x00,0x01,0x4C,0x4E,0x4B,0x42,  /* 00000680    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x08,  /* 00000688    "........" */
+    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000690    "...LNKC." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 00000698    "........" */
+    0x0A,0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 000006A0    "..LNKD.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x09,0x00,0x00,  /* 000006A8    "........" */
+    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 000006B0    "LNKB...." */
+    0x0C,0xFF,0xFF,0x09,0x00,0x01,0x4C,0x4E,  /* 000006B8    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000006C0    "KC......" */
+    0xFF,0x09,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 000006C8    ".....LNK" */
+    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000006D0    "D......." */
+    0x09,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,  /* 000006D8    "....LNKA" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0A,  /* 000006E0    "........" */
+    0x00,0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 000006E8    "..LNKC.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x01,  /* 000006F0    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 000006F8    "LNKD...." */
+    0x0C,0xFF,0xFF,0x0A,0x00,0x0A,0x02,0x4C,  /* 00000700    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 00000708    "NKA....." */
+    0xFF,0xFF,0x0A,0x00,0x0A,0x03,0x4C,0x4E,  /* 00000710    "......LN" */
+    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000718    "KB......" */
+    0xFF,0x0B,0x00,0x00,0x4C,0x4E,0x4B,0x44,  /* 00000720    "....LNKD" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0B,  /* 00000728    "........" */
+    0x00,0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000730    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,  /* 00000738    "........" */
+    0x02,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 00000740    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x03,  /* 00000748    "........" */
+    0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,  /* 00000750    "LNKC...." */
+    0x0C,0xFF,0xFF,0x0C,0x00,0x00,0x4C,0x4E,  /* 00000758    "......LN" */
+    0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000760    "KA......" */
+    0xFF,0x0C,0x00,0x01,0x4C,0x4E,0x4B,0x42,  /* 00000768    "....LNKB" */
+    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0C,  /* 00000770    "........" */
+    0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000778    "...LNKC." */
+    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 00000780    "........" */
+    0x0A,0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,  /* 00000788    "..LNKD.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x00,  /* 00000790    "........" */
+    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,  /* 00000798    "LNKB...." */
+    0x0C,0xFF,0xFF,0x0D,0x00,0x01,0x4C,0x4E,  /* 000007A0    "......LN" */
+    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000007A8    "KC......" */
+    0xFF,0x0D,0x00,0x0A,0x02,0x4C,0x4E,0x4B,  /* 000007B0    ".....LNK" */
+    0x44,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000007B8    "D......." */
+    0x0D,0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,  /* 000007C0    "....LNKA" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0E,  /* 000007C8    "........" */
+    0x00,0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 000007D0    "..LNKC.." */
+    0x0D,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x01,  /* 000007D8    "........" */
+    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 000007E0    "LNKD...." */
+    0x0C,0xFF,0xFF,0x0E,0x00,0x0A,0x02,0x4C,  /* 000007E8    ".......L" */
+    0x4E,0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,  /* 000007F0    "NKA....." */
+    0xFF,0xFF,0x0E,0x00,0x0A,0x03,0x4C,0x4E,  /* 000007F8    "......LN" */
+    0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,  /* 00000800    "KB......" */
+    0xFF,0x0F,0x00,0x00,0x4C,0x4E,0x4B,0x44,  /* 00000808    "....LNKD" */
+    0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0F,  /* 00000810    "........" */
+    0x00,0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000818    "..LNKA.." */
+    0x0E,0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,  /* 00000820    "........" */
+    0x02,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,  /* 00000828    ".LNKB..." */
+    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x03,  /* 00000830    "........" */
+    0x4C,0x4E,0x4B,0x43,0x00,0x08,0x50,0x52,  /* 00000838    "LNKC..PR" */
+    0x54,0x41,0x12,0x41,0x2F,0x3C,0x12,0x0B,  /* 00000840    "TA.A/<.." */
+    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x00,0x00,  /* 00000848    "........" */
+    0x0A,0x14,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000850    "........" */
+    0x01,0x00,0x01,0x00,0x0A,0x15,0x12,0x0C,  /* 00000858    "........" */
+    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x02,  /* 00000860    "........" */
+    0x00,0x0A,0x16,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000868    "........" */
+    0xFF,0x01,0x00,0x0A,0x03,0x00,0x0A,0x17,  /* 00000870    "........" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 00000878    "........" */
+    0x00,0x00,0x0A,0x18,0x12,0x0B,0x04,0x0C,  /* 00000880    "........" */
+    0xFF,0xFF,0x02,0x00,0x01,0x00,0x0A,0x19,  /* 00000888    "........" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 00000890    "........" */
+    0x0A,0x02,0x00,0x0A,0x1A,0x12,0x0C,0x04,  /* 00000898    "........" */
+    0x0C,0xFF,0xFF,0x02,0x00,0x0A,0x03,0x00,  /* 000008A0    "........" */
+    0x0A,0x1B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000008A8    "........" */
+    0x03,0x00,0x00,0x00,0x0A,0x1C,0x12,0x0B,  /* 000008B0    "........" */
+    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x01,0x00,  /* 000008B8    "........" */
+    0x0A,0x1D,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 000008C0    "........" */
+    0x03,0x00,0x0A,0x02,0x00,0x0A,0x1E,0x12,  /* 000008C8    "........" */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,  /* 000008D0    "........" */
+    0x03,0x00,0x0A,0x1F,0x12,0x0B,0x04,0x0C,  /* 000008D8    "........" */
+    0xFF,0xFF,0x04,0x00,0x00,0x00,0x0A,0x20,  /* 000008E0    "....... " */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 000008E8    "........" */
+    0x01,0x00,0x0A,0x21,0x12,0x0C,0x04,0x0C,  /* 000008F0    "...!...." */
+    0xFF,0xFF,0x04,0x00,0x0A,0x02,0x00,0x0A,  /* 000008F8    "........" */
+    0x22,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x04,  /* 00000900    ""......." */
+    0x00,0x0A,0x03,0x00,0x0A,0x23,0x12,0x0B,  /* 00000908    ".....#.." */
+    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x00,0x00,  /* 00000910    "........" */
+    0x0A,0x24,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000918    ".$......" */
+    0x05,0x00,0x01,0x00,0x0A,0x25,0x12,0x0C,  /* 00000920    ".....%.." */
+    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x02,  /* 00000928    "........" */
+    0x00,0x0A,0x26,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000930    "..&....." */
+    0xFF,0x05,0x00,0x0A,0x03,0x00,0x0A,0x27,  /* 00000938    ".......'" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 00000940    "........" */
+    0x00,0x00,0x0A,0x28,0x12,0x0B,0x04,0x0C,  /* 00000948    "...(...." */
+    0xFF,0xFF,0x06,0x00,0x01,0x00,0x0A,0x29,  /* 00000950    ".......)" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 00000958    "........" */
+    0x0A,0x02,0x00,0x0A,0x2A,0x12,0x0C,0x04,  /* 00000960    "....*..." */
+    0x0C,0xFF,0xFF,0x06,0x00,0x0A,0x03,0x00,  /* 00000968    "........" */
+    0x0A,0x2B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000970    ".+......" */
+    0x07,0x00,0x00,0x00,0x0A,0x2C,0x12,0x0B,  /* 00000978    ".....,.." */
+    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x01,0x00,  /* 00000980    "........" */
+    0x0A,0x2D,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000988    ".-......" */
+    0x07,0x00,0x0A,0x02,0x00,0x0A,0x2E,0x12,  /* 00000990    "........" */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,  /* 00000998    "........" */
+    0x03,0x00,0x0A,0x2F,0x12,0x0B,0x04,0x0C,  /* 000009A0    ".../...." */
+    0xFF,0xFF,0x08,0x00,0x00,0x00,0x0A,0x11,  /* 000009A8    "........" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 000009B0    "........" */
+    0x01,0x00,0x0A,0x12,0x12,0x0C,0x04,0x0C,  /* 000009B8    "........" */
+    0xFF,0xFF,0x08,0x00,0x0A,0x02,0x00,0x0A,  /* 000009C0    "........" */
+    0x13,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x08,  /* 000009C8    "........" */
+    0x00,0x0A,0x03,0x00,0x0A,0x14,0x12,0x0B,  /* 000009D0    "........" */
+    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x00,0x00,  /* 000009D8    "........" */
+    0x0A,0x15,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 000009E0    "........" */
+    0x09,0x00,0x01,0x00,0x0A,0x16,0x12,0x0C,  /* 000009E8    "........" */
+    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x02,  /* 000009F0    "........" */
+    0x00,0x0A,0x17,0x12,0x0C,0x04,0x0C,0xFF,  /* 000009F8    "........" */
+    0xFF,0x09,0x00,0x0A,0x03,0x00,0x0A,0x18,  /* 00000A00    "........" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000A08    "........" */
+    0x00,0x00,0x0A,0x19,0x12,0x0B,0x04,0x0C,  /* 00000A10    "........" */
+    0xFF,0xFF,0x0A,0x00,0x01,0x00,0x0A,0x1A,  /* 00000A18    "........" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000A20    "........" */
+    0x0A,0x02,0x00,0x0A,0x1B,0x12,0x0C,0x04,  /* 00000A28    "........" */
+    0x0C,0xFF,0xFF,0x0A,0x00,0x0A,0x03,0x00,  /* 00000A30    "........" */
+    0x0A,0x1C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000A38    "........" */
+    0x0B,0x00,0x00,0x00,0x0A,0x1D,0x12,0x0B,  /* 00000A40    "........" */
+    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x01,0x00,  /* 00000A48    "........" */
+    0x0A,0x1E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000A50    "........" */
+    0x0B,0x00,0x0A,0x02,0x00,0x0A,0x1F,0x12,  /* 00000A58    "........" */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,  /* 00000A60    "........" */
+    0x03,0x00,0x0A,0x20,0x12,0x0B,0x04,0x0C,  /* 00000A68    "... ...." */
+    0xFF,0xFF,0x0C,0x00,0x00,0x00,0x0A,0x21,  /* 00000A70    ".......!" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 00000A78    "........" */
+    0x01,0x00,0x0A,0x22,0x12,0x0C,0x04,0x0C,  /* 00000A80    "..."...." */
+    0xFF,0xFF,0x0C,0x00,0x0A,0x02,0x00,0x0A,  /* 00000A88    "........" */
+    0x23,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0C,  /* 00000A90    "#......." */
+    0x00,0x0A,0x03,0x00,0x0A,0x24,0x12,0x0B,  /* 00000A98    ".....$.." */
+    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x00,0x00,  /* 00000AA0    "........" */
+    0x0A,0x25,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000AA8    ".%......" */
+    0x0D,0x00,0x01,0x00,0x0A,0x26,0x12,0x0C,  /* 00000AB0    ".....&.." */
+    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x02,  /* 00000AB8    "........" */
+    0x00,0x0A,0x27,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000AC0    "..'....." */
+    0xFF,0x0D,0x00,0x0A,0x03,0x00,0x0A,0x28,  /* 00000AC8    ".......(" */
+    0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000AD0    "........" */
+    0x00,0x00,0x0A,0x29,0x12,0x0B,0x04,0x0C,  /* 00000AD8    "...)...." */
+    0xFF,0xFF,0x0E,0x00,0x01,0x00,0x0A,0x2A,  /* 00000AE0    ".......*" */
+    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000AE8    "........" */
+    0x0A,0x02,0x00,0x0A,0x2B,0x12,0x0C,0x04,  /* 00000AF0    "....+..." */
+    0x0C,0xFF,0xFF,0x0E,0x00,0x0A,0x03,0x00,  /* 00000AF8    "........" */
+    0x0A,0x2C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,  /* 00000B00    ".,......" */
+    0x0F,0x00,0x00,0x00,0x0A,0x2D,0x12,0x0B,  /* 00000B08    ".....-.." */
+    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x01,0x00,  /* 00000B10    "........" */
+    0x0A,0x2E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000B18    "........" */
+    0x0F,0x00,0x0A,0x02,0x00,0x0A,0x2F,0x12,  /* 00000B20    "....../." */
+    0x0C,0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,  /* 00000B28    "........" */
+    0x03,0x00,0x0A,0x10,0x5B,0x82,0x46,0x37,  /* 00000B30    "....[.F7" */
+    0x49,0x53,0x41,0x5F,0x08,0x5F,0x41,0x44,  /* 00000B38    "ISA_._AD" */
+    0x52,0x0C,0x00,0x00,0x01,0x00,0x5B,0x80,  /* 00000B40    "R.....[." */
+    0x50,0x49,0x52,0x51,0x02,0x0A,0x60,0x0A,  /* 00000B48    "PIRQ..`." */
+    0x04,0x10,0x2E,0x5C,0x00,0x5B,0x81,0x29,  /* 00000B50    "...\.[.)" */
+    0x5C,0x2F,0x04,0x5F,0x53,0x42,0x5F,0x50,  /* 00000B58    "\/._SB_P" */
+    0x43,0x49,0x30,0x49,0x53,0x41,0x5F,0x50,  /* 00000B60    "CI0ISA_P" */
+    0x49,0x52,0x51,0x01,0x50,0x49,0x52,0x41,  /* 00000B68    "IRQ.PIRA" */
+    0x08,0x50,0x49,0x52,0x42,0x08,0x50,0x49,  /* 00000B70    ".PIRB.PI" */
+    0x52,0x43,0x08,0x50,0x49,0x52,0x44,0x08,  /* 00000B78    "RC.PIRD." */
+    0x5B,0x82,0x46,0x0B,0x53,0x59,0x53,0x52,  /* 00000B80    "[.F.SYSR" */
+    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000B88    "._HID.A." */
+    0x0C,0x02,0x08,0x5F,0x55,0x49,0x44,0x01,  /* 00000B90    "..._UID." */
+    0x08,0x43,0x52,0x53,0x5F,0x11,0x4E,0x08,  /* 00000B98    ".CRS_.N." */
+    0x0A,0x8A,0x47,0x01,0x10,0x00,0x10,0x00,  /* 00000BA0    "..G....." */
+    0x00,0x10,0x47,0x01,0x22,0x00,0x22,0x00,  /* 00000BA8    "..G."."." */
+    0x00,0x0C,0x47,0x01,0x30,0x00,0x30,0x00,  /* 00000BB0    "..G.0.0." */
+    0x00,0x10,0x47,0x01,0x44,0x00,0x44,0x00,  /* 00000BB8    "..G.D.D." */
+    0x00,0x1C,0x47,0x01,0x62,0x00,0x62,0x00,  /* 00000BC0    "..G.b.b." */
+    0x00,0x02,0x47,0x01,0x65,0x00,0x65,0x00,  /* 00000BC8    "..G.e.e." */
+    0x00,0x0B,0x47,0x01,0x72,0x00,0x72,0x00,  /* 00000BD0    "..G.r.r." */
+    0x00,0x0E,0x47,0x01,0x80,0x00,0x80,0x00,  /* 00000BD8    "..G....." */
+    0x00,0x01,0x47,0x01,0x84,0x00,0x84,0x00,  /* 00000BE0    "..G....." */
+    0x00,0x03,0x47,0x01,0x88,0x00,0x88,0x00,  /* 00000BE8    "..G....." */
+    0x00,0x01,0x47,0x01,0x8C,0x00,0x8C,0x00,  /* 00000BF0    "..G....." */
+    0x00,0x03,0x47,0x01,0x90,0x00,0x90,0x00,  /* 00000BF8    "..G....." */
+    0x00,0x10,0x47,0x01,0xA2,0x00,0xA2,0x00,  /* 00000C00    "..G....." */
+    0x00,0x1C,0x47,0x01,0xE0,0x00,0xE0,0x00,  /* 00000C08    "..G....." */
+    0x00,0x10,0x47,0x01,0xA0,0x08,0xA0,0x08,  /* 00000C10    "..G....." */
+    0x00,0x04,0x47,0x01,0xC0,0x0C,0xC0,0x0C,  /* 00000C18    "..G....." */
+    0x00,0x10,0x47,0x01,0xD0,0x04,0xD0,0x04,  /* 00000C20    "..G....." */
+    0x00,0x02,0x79,0x00,0x14,0x0B,0x5F,0x43,  /* 00000C28    "..y..._C" */
+    0x52,0x53,0x00,0xA4,0x43,0x52,0x53,0x5F,  /* 00000C30    "RS..CRS_" */
+    0x5B,0x82,0x2B,0x50,0x49,0x43,0x5F,0x08,  /* 00000C38    "[.+PIC_." */
+    0x5F,0x48,0x49,0x44,0x0B,0x41,0xD0,0x08,  /* 00000C40    "_HID.A.." */
+    0x5F,0x43,0x52,0x53,0x11,0x18,0x0A,0x15,  /* 00000C48    "_CRS...." */
+    0x47,0x01,0x20,0x00,0x20,0x00,0x01,0x02,  /* 00000C50    "G. . ..." */
+    0x47,0x01,0xA0,0x00,0xA0,0x00,0x01,0x02,  /* 00000C58    "G......." */
+    0x22,0x04,0x00,0x79,0x00,0x5B,0x82,0x47,  /* 00000C60    ""..y.[.G" */
+    0x05,0x44,0x4D,0x41,0x30,0x08,0x5F,0x48,  /* 00000C68    ".DMA0._H" */
+    0x49,0x44,0x0C,0x41,0xD0,0x02,0x00,0x08,  /* 00000C70    "ID.A...." */
+    0x5F,0x43,0x52,0x53,0x11,0x41,0x04,0x0A,  /* 00000C78    "_CRS.A.." */
+    0x3D,0x2A,0x10,0x04,0x47,0x01,0x00,0x00,  /* 00000C80    "=*..G..." */
+    0x00,0x00,0x00,0x10,0x47,0x01,0x81,0x00,  /* 00000C88    "....G..." */
+    0x81,0x00,0x00,0x03,0x47,0x01,0x87,0x00,  /* 00000C90    "....G..." */
+    0x87,0x00,0x00,0x01,0x47,0x01,0x89,0x00,  /* 00000C98    "....G..." */
+    0x89,0x00,0x00,0x03,0x47,0x01,0x8F,0x00,  /* 00000CA0    "....G..." */
+    0x8F,0x00,0x00,0x01,0x47,0x01,0xC0,0x00,  /* 00000CA8    "....G..." */
+    0xC0,0x00,0x00,0x20,0x47,0x01,0x80,0x04,  /* 00000CB0    "... G..." */
+    0x80,0x04,0x00,0x10,0x79,0x00,0x5B,0x82,  /* 00000CB8    "....y.[." */
+    0x25,0x54,0x4D,0x52,0x5F,0x08,0x5F,0x48,  /* 00000CC0    "%TMR_._H" */
+    0x49,0x44,0x0C,0x41,0xD0,0x01,0x00,0x08,  /* 00000CC8    "ID.A...." */
+    0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,  /* 00000CD0    "_CRS...." */
+    0x47,0x01,0x40,0x00,0x40,0x00,0x00,0x04,  /* 00000CD8    "G.@.@..." */
+    0x22,0x01,0x00,0x79,0x00,0x5B,0x82,0x25,  /* 00000CE0    ""..y.[.%" */
+    0x52,0x54,0x43,0x5F,0x08,0x5F,0x48,0x49,  /* 00000CE8    "RTC_._HI" */
+    0x44,0x0C,0x41,0xD0,0x0B,0x00,0x08,0x5F,  /* 00000CF0    "D.A...._" */
+    0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,  /* 00000CF8    "CRS....G" */
+    0x01,0x70,0x00,0x70,0x00,0x00,0x02,0x22,  /* 00000D00    ".p.p..."" */
+    0x00,0x01,0x79,0x00,0x5B,0x82,0x22,0x53,  /* 00000D08    "..y.[."S" */
+    0x50,0x4B,0x52,0x08,0x5F,0x48,0x49,0x44,  /* 00000D10    "PKR._HID" */
+    0x0C,0x41,0xD0,0x08,0x00,0x08,0x5F,0x43,  /* 00000D18    ".A...._C" */
+    0x52,0x53,0x11,0x0D,0x0A,0x0A,0x47,0x01,  /* 00000D20    "RS....G." */
+    0x61,0x00,0x61,0x00,0x00,0x01,0x79,0x00,  /* 00000D28    "a.a...y." */
+    0x5B,0x82,0x31,0x50,0x53,0x32,0x4D,0x08,  /* 00000D30    "[.1PS2M." */
+    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0F,  /* 00000D38    "_HID.A.." */
+    0x13,0x08,0x5F,0x43,0x49,0x44,0x0C,0x41,  /* 00000D40    ".._CID.A" */
+    0xD0,0x0F,0x13,0x14,0x09,0x5F,0x53,0x54,  /* 00000D48    "....._ST" */
+    0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,  /* 00000D50    "A....._C" */
+    0x52,0x53,0x11,0x08,0x0A,0x05,0x22,0x00,  /* 00000D58    "RS...."." */
+    0x10,0x79,0x00,0x5B,0x82,0x42,0x04,0x50,  /* 00000D60    ".y.[.B.P" */
+    0x53,0x32,0x4B,0x08,0x5F,0x48,0x49,0x44,  /* 00000D68    "S2K._HID" */
+    0x0C,0x41,0xD0,0x03,0x03,0x08,0x5F,0x43,  /* 00000D70    ".A...._C" */
+    0x49,0x44,0x0C,0x41,0xD0,0x03,0x0B,0x14,  /* 00000D78    "ID.A...." */
+    0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,  /* 00000D80    "._STA..." */
+    0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,0x18,  /* 00000D88    ".._CRS.." */
+    0x0A,0x15,0x47,0x01,0x60,0x00,0x60,0x00,  /* 00000D90    "..G.`.`." */
+    0x00,0x01,0x47,0x01,0x64,0x00,0x64,0x00,  /* 00000D98    "..G.d.d." */
+    0x00,0x01,0x22,0x02,0x00,0x79,0x00,0x5B,  /* 00000DA0    ".."..y.[" */
+    0x82,0x3A,0x46,0x44,0x43,0x30,0x08,0x5F,  /* 00000DA8    ".:FDC0._" */
+    0x48,0x49,0x44,0x0C,0x41,0xD0,0x07,0x00,  /* 00000DB0    "HID.A..." */
+    0x14,0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,  /* 00000DB8    ".._STA.." */
+    0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000DC0    "..._CRS." */
+    0x1B,0x0A,0x18,0x47,0x01,0xF0,0x03,0xF0,  /* 00000DC8    "...G...." */
+    0x03,0x01,0x06,0x47,0x01,0xF7,0x03,0xF7,  /* 00000DD0    "...G...." */
+    0x03,0x01,0x01,0x22,0x40,0x00,0x2A,0x04,  /* 00000DD8    "..."@.*." */
+    0x00,0x79,0x00,0x5B,0x82,0x46,0x04,0x55,  /* 00000DE0    ".y.[.F.U" */
+    0x41,0x52,0x31,0x08,0x5F,0x48,0x49,0x44,  /* 00000DE8    "AR1._HID" */
+    0x0C,0x41,0xD0,0x05,0x01,0x08,0x5F,0x55,  /* 00000DF0    ".A...._U" */
+    0x49,0x44,0x01,0x14,0x19,0x5F,0x53,0x54,  /* 00000DF8    "ID..._ST" */
+    0x41,0x00,0xA0,0x0D,0x93,0x5E,0x5E,0x5E,  /* 00000E00    "A....^^^" */
+    0x5E,0x55,0x41,0x52,0x31,0x00,0xA4,0x00,  /* 00000E08    "^UAR1..." */
+    0xA1,0x04,0xA4,0x0A,0x0F,0x08,0x5F,0x43,  /* 00000E10    "......_C" */
+    0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,0x01,  /* 00000E18    "RS....G." */
+    0xF8,0x03,0xF8,0x03,0x08,0x08,0x22,0x10,  /* 00000E20    "......"." */
+    0x00,0x79,0x00,0x5B,0x82,0x47,0x04,0x55,  /* 00000E28    ".y.[.G.U" */
+    0x41,0x52,0x32,0x08,0x5F,0x48,0x49,0x44,  /* 00000E30    "AR2._HID" */
+    0x0C,0x41,0xD0,0x05,0x01,0x08,0x5F,0x55,  /* 00000E38    ".A...._U" */
+    0x49,0x44,0x0A,0x02,0x14,0x19,0x5F,0x53,  /* 00000E40    "ID...._S" */
+    0x54,0x41,0x00,0xA0,0x0D,0x93,0x5E,0x5E,  /* 00000E48    "TA....^^" */
+    0x5E,0x5E,0x55,0x41,0x52,0x32,0x00,0xA4,  /* 00000E50    "^^UAR2.." */
+    0x00,0xA1,0x04,0xA4,0x0A,0x0F,0x08,0x5F,  /* 00000E58    "......._" */
+    0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,  /* 00000E60    "CRS....G" */
+    0x01,0xF8,0x02,0xF8,0x02,0x08,0x08,0x22,  /* 00000E68    "......."" */
+    0x08,0x00,0x79,0x00,0x5B,0x82,0x36,0x4C,  /* 00000E70    "..y.[.6L" */
+    0x54,0x50,0x31,0x08,0x5F,0x48,0x49,0x44,  /* 00000E78    "TP1._HID" */
+    0x0C,0x41,0xD0,0x04,0x00,0x08,0x5F,0x55,  /* 00000E80    ".A...._U" */
+    0x49,0x44,0x0A,0x02,0x14,0x09,0x5F,0x53,  /* 00000E88    "ID...._S" */
+    0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,  /* 00000E90    "TA....._" */
+    0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,  /* 00000E98    "CRS....G" */
+    0x01,0x78,0x03,0x78,0x03,0x08,0x08,0x22,  /* 00000EA0    ".x.x..."" */
+    0x80,0x00,0x79,0x00,0x5B,0x82,0x4D,0x07,  /* 00000EA8    "..y.[.M." */
+    0x53,0x31,0x46,0x30,0x08,0x5F,0x41,0x44,  /* 00000EB0    "S1F0._AD" */
+    0x52,0x0C,0x00,0x00,0x06,0x00,0x08,0x5F,  /* 00000EB8    "R......_" */
+    0x53,0x55,0x4E,0x01,0x14,0x13,0x5F,0x50,  /* 00000EC0    "SUN..._P" */
+    0x53,0x30,0x00,0x70,0x0A,0x80,0x5C,0x2E,  /* 00000EC8    "S0.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000ED0    "_GPEDPT2" */
+    0x14,0x13,0x5F,0x50,0x53,0x33,0x00,0x70,  /* 00000ED8    ".._PS3.p" */
+    0x0A,0x83,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00000EE0    "..\._GPE" */
+    0x44,0x50,0x54,0x32,0x14,0x1F,0x5F,0x45,  /* 00000EE8    "DPT2.._E" */
+    0x4A,0x30,0x01,0x70,0x0A,0x88,0x5C,0x2E,  /* 00000EF0    "J0.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000EF8    "_GPEDPT2" */
+    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00000F00    "p.\._GPE" */
+    0x50,0x48,0x50,0x31,0x14,0x1E,0x5F,0x53,  /* 00000F08    "PHP1.._S" */
+    0x54,0x41,0x00,0x70,0x0A,0x89,0x5C,0x2E,  /* 00000F10    "TA.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000F18    "_GPEDPT2" */
+    0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x50,  /* 00000F20    ".\._GPEP" */
+    0x48,0x50,0x31,0x5B,0x82,0x4E,0x07,0x53,  /* 00000F28    "HP1[.N.S" */
+    0x32,0x46,0x30,0x08,0x5F,0x41,0x44,0x52,  /* 00000F30    "2F0._ADR" */
+    0x0C,0x00,0x00,0x07,0x00,0x08,0x5F,0x53,  /* 00000F38    "......_S" */
+    0x55,0x4E,0x0A,0x02,0x14,0x13,0x5F,0x50,  /* 00000F40    "UN...._P" */
+    0x53,0x30,0x00,0x70,0x0A,0x90,0x5C,0x2E,  /* 00000F48    "S0.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000F50    "_GPEDPT2" */
+    0x14,0x13,0x5F,0x50,0x53,0x33,0x00,0x70,  /* 00000F58    ".._PS3.p" */
+    0x0A,0x93,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00000F60    "..\._GPE" */
+    0x44,0x50,0x54,0x32,0x14,0x1F,0x5F,0x45,  /* 00000F68    "DPT2.._E" */
+    0x4A,0x30,0x01,0x70,0x0A,0x98,0x5C,0x2E,  /* 00000F70    "J0.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000F78    "_GPEDPT2" */
+    0x70,0x01,0x5C,0x2E,0x5F,0x47,0x50,0x45,  /* 00000F80    "p.\._GPE" */
+    0x50,0x48,0x50,0x32,0x14,0x1E,0x5F,0x53,  /* 00000F88    "PHP2.._S" */
+    0x54,0x41,0x00,0x70,0x0A,0x99,0x5C,0x2E,  /* 00000F90    "TA.p..\." */
+    0x5F,0x47,0x50,0x45,0x44,0x50,0x54,0x32,  /* 00000F98    "_GPEDPT2" */
+    0xA4,0x5C,0x2E,0x5F,0x47,0x50,0x45,0x50,  /* 00000FA0    ".\._GPEP" */
+    0x48,0x50,0x32,0x10,0x4E,0x0B,0x5F,0x47,  /* 00000FA8    "HP2.N._G" */
+    0x50,0x45,0x5B,0x80,0x50,0x48,0x50,0x5F,  /* 00000FB0    "PE[.PHP_" */
+    0x01,0x0B,0xC0,0x10,0x0A,0x03,0x5B,0x81,  /* 00000FB8    "......[." */
+    0x15,0x50,0x48,0x50,0x5F,0x01,0x50,0x53,  /* 00000FC0    ".PHP_.PS" */
+    0x54,0x41,0x08,0x50,0x48,0x50,0x31,0x08,  /* 00000FC8    "TA.PHP1." */
+    0x50,0x48,0x50,0x32,0x08,0x5B,0x80,0x44,  /* 00000FD0    "PHP2.[.D" */
+    0x47,0x31,0x5F,0x01,0x0B,0x44,0xB0,0x0A,  /* 00000FD8    "G1_..D.." */
+    0x04,0x5B,0x81,0x10,0x44,0x47,0x31,0x5F,  /* 00000FE0    ".[..DG1_" */
+    0x01,0x44,0x50,0x54,0x31,0x08,0x44,0x50,  /* 00000FE8    ".DPT1.DP" */
+    0x54,0x32,0x08,0x14,0x46,0x07,0x5F,0x4C,  /* 00000FF0    "T2..F._L" */
+    0x30,0x33,0x00,0x08,0x53,0x4C,0x54,0x5F,  /* 00000FF8    "03..SLT_" */
+    0x00,0x08,0x45,0x56,0x54,0x5F,0x00,0x70,  /* 00001000    "..EVT_.p" */
+    0x50,0x53,0x54,0x41,0x61,0x7A,0x61,0x0A,  /* 00001008    "PSTAaza." */
+    0x04,0x53,0x4C,0x54,0x5F,0x7B,0x61,0x0A,  /* 00001010    ".SLT_{a." */
+    0x0F,0x45,0x56,0x54,0x5F,0x70,0x53,0x4C,  /* 00001018    ".EVT_pSL" */
+    0x54,0x5F,0x44,0x50,0x54,0x31,0x70,0x45,  /* 00001020    "T_DPT1pE" */
+    0x56,0x54,0x5F,0x44,0x50,0x54,0x32,0xA0,  /* 00001028    "VT_DPT2." */
+    0x1B,0x93,0x53,0x4C,0x54,0x5F,0x01,0x86,  /* 00001030    "..SLT_.." */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001038    "\/._SB_P" */
+    0x43,0x49,0x30,0x53,0x31,0x46,0x30,0x45,  /* 00001040    "CI0S1F0E" */
+    0x56,0x54,0x5F,0xA1,0x1E,0xA0,0x1C,0x93,  /* 00001048    "VT_....." */
+    0x53,0x4C,0x54,0x5F,0x0A,0x02,0x86,0x5C,  /* 00001050    "SLT_...\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001058    "/._SB_PC" */
+    0x49,0x30,0x53,0x32,0x46,0x30,0x45,0x56,  /* 00001060    "I0S2F0EV" */
+    0x54,0x5F,
 };
 int DsdtLen=sizeof(AmlCode);
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/firmware/hvmloader/acpi/static_tables.c
--- a/tools/firmware/hvmloader/acpi/static_tables.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/firmware/hvmloader/acpi/static_tables.c	Fri Feb 15 21:09:25 2008 +0800
@@ -59,9 +59,11 @@ struct acpi_20_fadt Fadt = {
     .pm1a_evt_blk = ACPI_PM1A_EVT_BLK_ADDRESS,
     .pm1a_cnt_blk = ACPI_PM1A_CNT_BLK_ADDRESS,
     .pm_tmr_blk = ACPI_PM_TMR_BLK_ADDRESS,
+    .gpe0_blk = ACPI_GPE0_BLK_ADDRESS,
     .pm1_evt_len = ACPI_PM1A_EVT_BLK_BIT_WIDTH / 8,
     .pm1_cnt_len = ACPI_PM1A_CNT_BLK_BIT_WIDTH / 8,
     .pm_tmr_len = ACPI_PM_TMR_BLK_BIT_WIDTH / 8,
+    .gpe0_blk_len = ACPI_GPE0_BLK_LEN,
 
     .p_lvl2_lat = 0x0fff, /* >100,  means we do not support C2 state */
     .p_lvl3_lat = 0x0fff, /* >1000, means we do not support C3 state */
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/ioemu/hw/pass-through.c
--- a/tools/ioemu/hw/pass-through.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/ioemu/hw/pass-through.c	Fri Feb 15 21:09:25 2008 +0800
@@ -29,31 +29,159 @@
 
 extern FILE *logfile;
 
+struct php_dev {
+    struct pt_dev *pt_dev;
+    uint8_t valid;
+    uint8_t r_bus;
+    uint8_t r_dev;
+    uint8_t r_func;
+};
+struct dpci_infos {
+
+    struct php_dev php_devs[PHP_SLOT_LEN];
+
+    PCIBus *e_bus;
+    struct pci_access *pci_access;
+
+} dpci_infos;
+
 static int token_value(char *token)
 {
-    token = strchr(token, 'x') + 1;
     return strtol(token, NULL, 16);
 }
 
 static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func)
 {
-    char *token;
-
-    if ( !(*str) || !strchr(*str, ',') )
+    char *token, *delim = ":.-";
+
+    if ( !(*str) ||
+          ( !strchr(*str, ':') && !strchr(*str, '.')) )
         return 0;
 
-    token = *str;
-    *seg  = token_value(token);
-    token = strchr(token, ',') + 1;
+    token  = strsep(str, delim);
+    *seg = token_value(token);
+
+    token  = strsep(str, delim);
     *bus  = token_value(token);
-    token = strchr(token, ',') + 1;
+
+    token  = strsep(str, delim);
     *dev  = token_value(token);
-    token = strchr(token, ',') + 1;
+
+    token  = strsep(str, delim);
     *func  = token_value(token);
-    token = strchr(token, ',');
-    *str = token ? token + 1 : NULL;
 
     return 1;
+}
+
+/* Insert a new pass-through device into a specific pci slot.
+ * input  dom:bus:dev.func@slot, chose free one if slot == 0
+ * return -1: required slot not available
+ *         0: no free hotplug slots, but normal slot should okay
+ *        >0: the new hotplug slot
+ */
+static int __insert_to_pci_slot(int bus, int dev, int func, int slot)
+{
+    int i, php_slot;
+
+    /* preferred virt pci slot */
+    if ( slot >= PHP_SLOT_START && slot < PHP_SLOT_END )
+    {
+        php_slot = PCI_TO_PHP_SLOT(slot);
+        if ( !dpci_infos.php_devs[php_slot].valid )
+        {
+            goto found;
+        }
+        else
+            return -1;
+    }
+
+    if ( slot != 0 )
+        return -1;
+
+    /* slot == 0, pick up a free one */
+    for ( i = 0; i < PHP_SLOT_LEN; i++ )
+    {
+        if ( !dpci_infos.php_devs[i].valid )
+        {
+            php_slot = i;
+            goto found;
+        }
+    }
+
+    /* not found */
+    return 0;
+
+found:
+    dpci_infos.php_devs[php_slot].valid  = 1;
+    dpci_infos.php_devs[php_slot].r_bus  = bus;
+    dpci_infos.php_devs[php_slot].r_dev  = dev;
+    dpci_infos.php_devs[php_slot].r_func = func;
+    return PHP_TO_PCI_SLOT(php_slot);
+}
+
+/* Insert a new pass-through device into a specific pci slot.
+ * input  dom:bus:dev.func@slot
+ */
+int insert_to_pci_slot(char *bdf_slt)
+{
+    int seg, bus, dev, func, slot;
+    char *bdf_str, *slt_str, *delim="@";
+
+    bdf_str = strsep(&bdf_slt, delim);
+    slt_str = bdf_slt;
+    slot = token_value(slt_str);
+
+    if ( !next_bdf(&bdf_str, &seg, &bus, &dev, &func))
+    {
+        return -1;
+    }
+
+    return __insert_to_pci_slot(bus, dev, func, slot);
+
+}
+
+/* Test if a pci slot has a device
+ * 1:  present
+ * 0:  not present
+ * -1: invalide pci slot input
+ */
+int test_pci_slot(int slot)
+{
+    int php_slot;
+
+    if ( slot < PHP_SLOT_START || slot >= PHP_SLOT_END )
+        return -1;
+
+    php_slot = PCI_TO_PHP_SLOT(slot);
+    if ( dpci_infos.php_devs[php_slot].valid )
+        return 1;
+    else
+        return 0;
+}
+
+/* find the pci slot for pass-through dev with specified BDF */
+int bdf_to_slot(char *bdf_str)
+{
+    int seg, bus, dev, func, i;
+
+    if ( !next_bdf(&bdf_str, &seg, &bus, &dev, &func))
+    {
+        return -1;
+    }
+
+    /* locate the virtual pci slot for this VTd device */
+    for ( i = 0; i < PHP_SLOT_LEN; i++ )
+    {
+        if ( dpci_infos.php_devs[i].valid &&
+           dpci_infos.php_devs[i].r_bus == bus &&
+           dpci_infos.php_devs[i].r_dev  == dev &&
+           dpci_infos.php_devs[i].r_func == func )
+        {
+            return PHP_TO_PCI_SLOT(i);
+        }
+    }
+
+    return -1;
 }
 
 /* Being called each time a mmio region has been updated */
@@ -269,15 +397,64 @@ static int pt_register_regions(struct pt
     return 0;
 }
 
+static int pt_unregister_regions(struct pt_dev *assigned_device)
+{
+    int i, type, ret;
+    uint32_t e_size;
+    PCIDevice *d = (PCIDevice*)assigned_device;
+
+    for ( i = 0; i < PCI_NUM_REGIONS; i++ )
+    {
+        e_size = assigned_device->bases[i].e_size;
+        if ( e_size == 0 )
+            continue;
+
+        type = d->io_regions[i].type;
+
+        if ( type == PCI_ADDRESS_SPACE_MEM ||
+             type == PCI_ADDRESS_SPACE_MEM_PREFETCH )
+        {
+            ret = xc_domain_memory_mapping(xc_handle, domid,
+                    assigned_device->bases[i].e_physbase >> XC_PAGE_SHIFT,
+                    assigned_device->bases[i].access.maddr >> XC_PAGE_SHIFT,
+                    (e_size+XC_PAGE_SIZE-1) >> XC_PAGE_SHIFT,
+                    DPCI_REMOVE_MAPPING);
+            if ( ret != 0 )
+            {
+                PT_LOG("Error: remove old mem mapping failed!\n");
+                continue;
+            }
+
+        }
+        else if ( type == PCI_ADDRESS_SPACE_IO )
+        {
+            ret = xc_domain_ioport_mapping(xc_handle, domid,
+                        assigned_device->bases[i].e_physbase,
+                        assigned_device->bases[i].access.pio_base,
+                        e_size,
+                        DPCI_REMOVE_MAPPING);
+            if ( ret != 0 )
+            {
+                PT_LOG("Error: remove old io mapping failed!\n");
+                continue;
+            }
+
+        }
+        
+    }
+
+}
+
 struct pt_dev * register_real_device(PCIBus *e_bus,
         const char *e_dev_name, int e_devfn, uint8_t r_bus, uint8_t r_dev,
         uint8_t r_func, uint32_t machine_irq, struct pci_access *pci_access)
 {
-    int rc, i;
+    int rc = -1, i;
     struct pt_dev *assigned_device = NULL;
     struct pci_dev *pci_dev;
     uint8_t e_device, e_intx;
     struct pci_config_cf8 machine_bdf;
+    int free_pci_slot = -1;
 
     PT_LOG("Assigning real physical device %02x:%02x.%x ...\n",
         r_bus, r_dev, r_func);
@@ -294,6 +471,15 @@ struct pt_dev * register_real_device(PCI
     {
         PT_LOG("Error: couldn't locate device in libpci structures\n");
         return NULL;
+    }
+
+    if ( e_devfn == PT_VIRT_DEVFN_AUTO ) {
+        /*indicate a static assignment(not hotplug), so find a free PCI hot plug slot */
+        free_pci_slot = __insert_to_pci_slot(r_bus, r_dev, r_func, 0);
+        if ( free_pci_slot > 0 )
+            e_devfn = free_pci_slot  << 3;
+        else
+            PT_LOG("Error: no free virtual PCI hot plug slot, thus no live migration.\n");
     }
 
     /* Register device */
@@ -306,7 +492,11 @@ struct pt_dev * register_real_device(PCI
         return NULL;
     }
 
+    if ( free_pci_slot > 0 )
+        dpci_infos.php_devs[PCI_TO_PHP_SLOT(free_pci_slot)].pt_dev = assigned_device;
+
     assigned_device->pci_dev = pci_dev;
+
 
     /* Assign device */
     machine_bdf.reg = 0;
@@ -355,11 +545,96 @@ struct pt_dev * register_real_device(PCI
     return assigned_device;
 }
 
+int unregister_real_device(int php_slot)
+{
+    struct php_dev *php_dev;
+    struct pci_dev *pci_dev;
+    uint8_t e_device, e_intx;
+    struct pt_dev *assigned_device = NULL;
+    uint32_t machine_irq;
+    uint32_t bdf = 0;
+    int rc = -1;
+
+    if ( php_slot < 0 || php_slot >= PHP_SLOT_LEN )
+       return -1;
+
+    php_dev = &dpci_infos.php_devs[php_slot];
+    assigned_device = php_dev->pt_dev;
+
+    if ( !assigned_device || !php_dev->valid )
+        return -1;
+
+    pci_dev = assigned_device->pci_dev;
+
+    /* hide pci dev from qemu */
+    pci_hide_device((PCIDevice*)assigned_device);
+
+    /* Unbind interrupt */
+    e_device = (assigned_device->dev.devfn >> 3) & 0x1f;
+    e_intx = assigned_device->dev.config[0x3d]-1;
+    machine_irq = pci_dev->irq;
+
+    if ( machine_irq != 0 ) {
+        rc = xc_domain_unbind_pt_irq(xc_handle, domid, machine_irq, PT_IRQ_TYPE_PCI, 0,
+                                       e_device, e_intx, 0);
+        if ( rc < 0 )
+        {
+            /* TBD: unregister device in case of an error */
+            PT_LOG("Error: Unbinding of interrupt failed! rc=%d\n", rc);
+        }
+    }
+
+    /* unregister real device's MMIO/PIO BARs */
+    pt_unregister_regions(assigned_device);
+    
+    /* deassign the dev to dom0 */
+    bdf |= (pci_dev->bus  & 0xff) << 16;
+    bdf |= (pci_dev->dev  & 0x1f) << 11;
+    bdf |= (pci_dev->func & 0x1f) << 8;
+    if ( (rc = xc_deassign_device(xc_handle, domid, bdf)) != 0)
+        PT_LOG("Error: Revoking the device failed! rc=%d\n", rc);
+
+    /* mark this slot as free */
+    php_dev->valid = 0;
+    php_dev->pt_dev = NULL;
+    qemu_free(assigned_device);
+
+    return 0;
+}
+
+int power_on_php_slot(int php_slot)
+{
+    struct php_dev *php_dev = &dpci_infos.php_devs[php_slot];
+    int pci_slot = php_slot + PHP_SLOT_START;
+    struct pt_dev *pt_dev;
+    pt_dev = 
+        register_real_device(dpci_infos.e_bus,
+            "DIRECT PCI",
+            pci_slot << 3,
+            php_dev->r_bus,
+            php_dev->r_dev,
+            php_dev->r_func,
+            PT_MACHINE_IRQ_AUTO,
+            dpci_infos.pci_access);
+
+    php_dev->pt_dev = pt_dev;
+
+    return 0;
+
+}
+
+int power_off_php_slot(int php_slot)
+{
+    return unregister_real_device(php_slot);
+}
+
 int pt_init(PCIBus *e_bus, char *direct_pci)
 {
-    int seg, b, d, f;
+    int seg, b, d, f, php_slot = 0;
     struct pt_dev *pt_dev;
     struct pci_access *pci_access;
+    char *vslots;
+    char slot_str[8];
 
     /* Initialize libpci */
     pci_access = pci_alloc();
@@ -370,6 +645,19 @@ int pt_init(PCIBus *e_bus, char *direct_
     }
     pci_init(pci_access);
     pci_scan_bus(pci_access);
+
+    memset(&dpci_infos, 0, sizeof(struct dpci_infos));
+    dpci_infos.pci_access = pci_access;
+    dpci_infos.e_bus      = e_bus;
+
+    if ( strlen(direct_pci) == 0 ) {
+        return 0;
+    }
+
+    /* the virtual pci slots of all pass-through devs
+     * with hex format: xx;xx...;
+     */
+    vslots = qemu_mallocz ( strlen(direct_pci) / 3 );
 
     /* Assign given devices to guest */
     while ( next_bdf(&direct_pci, &seg, &b, &d, &f) )
@@ -382,8 +670,37 @@ int pt_init(PCIBus *e_bus, char *direct_
             PT_LOG("Error: Registration failed (%02x:%02x.%x)\n", b, d, f);
             return -1;
         }
-    }
+
+        /* Record the virtual slot info */
+        if ( php_slot < PHP_SLOT_LEN &&
+              dpci_infos.php_devs[php_slot].pt_dev == pt_dev )
+        {
+            sprintf(slot_str, "0x%x;", PHP_TO_PCI_SLOT(php_slot));
+        }
+        else
+            sprintf(slot_str, "0x%x;", 0);
+
+        strcat(vslots, slot_str);
+        php_slot++;
+    }
+
+    /* Write virtual slots info to xenstore for Control panel use */
+    xenstore_write_vslots(vslots);
+
+    qemu_free(vslots);
 
     /* Success */
     return 0;
 }
+
+void pt_uninit(void)
+{
+    struct pci_access *access;
+
+    /* clean up the libpci */
+    access = dpci_infos.pci_access;
+    if ( access ) {
+        pci_cleanup(access);
+    }
+
+}
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/ioemu/hw/pc.c
--- a/tools/ioemu/hw/pc.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/ioemu/hw/pc.c	Fri Feb 15 21:09:25 2008 +0800
@@ -945,8 +945,10 @@ static void pc_init1(uint64_t ram_size, 
     }
 
 #ifdef CONFIG_PASSTHROUGH
-    /* Pass-through Initialization */
-    if ( pci_enabled && direct_pci )
+    /* Pass-through Initialization
+     * init libpci even direct_pci is null, as can hotplug a dev runtime
+     */
+    if ( pci_enabled )
     {
         rc = pt_init(pci_bus, direct_pci); 
         if ( rc < 0 )
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/ioemu/hw/pci.c
--- a/tools/ioemu/hw/pci.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/ioemu/hw/pci.c	Fri Feb 15 21:09:25 2008 +0800
@@ -107,7 +107,8 @@ PCIDevice *pci_register_device(PCIBus *b
     
     if (devfn < 0) {
         for(devfn = bus->devfn_min ; devfn < 256; devfn += 8) {
-            if (!bus->devices[devfn])
+            if ( !bus->devices[devfn] &&
+                 !( devfn >= PHP_DEVFN_START && devfn < PHP_DEVFN_END ) )
                 goto found;
         }
         return NULL;
@@ -130,6 +131,12 @@ PCIDevice *pci_register_device(PCIBus *b
     pci_dev->irq_index = pci_irq_index++;
     bus->devices[devfn] = pci_dev;
     return pci_dev;
+}
+
+void pci_hide_device(PCIDevice *pci_dev)
+{
+    PCIBus *bus = pci_dev->bus;
+    bus->devices[pci_dev->devfn] = NULL;
 }
 
 void pci_register_io_region(PCIDevice *pci_dev, int region_num, 
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/ioemu/hw/piix4acpi.c
--- a/tools/ioemu/hw/piix4acpi.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/ioemu/hw/piix4acpi.c	Fri Feb 15 21:09:25 2008 +0800
@@ -24,6 +24,7 @@
  */
 
 #include "vl.h"
+#include <xen/hvm/ioreq.h>
 
 /* PM1a_CNT bits, as defined in the ACPI specification. */
 #define SCI_EN            (1 <<  0)
@@ -35,6 +36,19 @@
 /* These must be kept in sync with the DSDT (hvmloader/acpi/dsdt.asl) */
 #define SLP_TYP_S5        (7 << 10)
 
+#define ACPI_DBG_IO_ADDR  0xb044
+#define ACPI_PHP_IO_ADDR  0x10c0
+
+#define PHP_EVT_ADD     0x0
+#define PHP_EVT_REMOVE  0x3
+
+#define ACPI_SCI_IRQ 9
+
+/* The bit in GPE0_STS/EN to notify the pci hotplug event */
+#define ACPI_PHP_GPE_BIT 3
+
+#define ACPI_PHP_SLOT_NUM PHP_SLOT_LEN
+
 typedef struct AcpiDeviceState AcpiDeviceState;
 AcpiDeviceState *acpi_device_table;
 
@@ -42,6 +56,27 @@ typedef struct PCIAcpiState {
     PCIDevice dev;
     uint16_t pm1_control; /* pm1a_ECNT_BLK */
 } PCIAcpiState;
+
+typedef struct GPEState {
+    /* GPE0 block */
+    uint8_t gpe0_sts[ACPI_GPE0_BLK_LEN / 2];
+    uint8_t gpe0_en[ACPI_GPE0_BLK_LEN / 2];
+
+    /* SCI IRQ level */
+    uint8_t sci_asserted;
+
+} GPEState;
+
+GPEState gpe_state;
+
+typedef struct PHPSlots {
+    struct {
+        uint8_t status;    /* Apaptor stats */
+    } slot[ACPI_PHP_SLOT_NUM];
+    uint8_t plug_evt;      /* slot|event slot:0-no event;1-1st. event:0-remove;1-add */
+} PHPSlots;
+
+PHPSlots php_slots;
 
 static void piix4acpi_save(QEMUFile *f, void *opaque)
 {
@@ -127,6 +162,318 @@ static void acpi_map(PCIDevice *pci_dev,
     /* Word access */
     register_ioport_write(addr + 4, 2, 2, acpiPm1Control_writew, d);
     register_ioport_read(addr + 4, 2, 2, acpiPm1Control_readw, d);
+}
+
+static inline int test_bit(uint8_t *map, int bit)
+{
+    return ( map[bit / 8] & (1 << (bit % 8)) );
+}
+
+static inline void set_bit(uint8_t *map, int bit)
+{
+    map[bit / 8] |= (1 << (bit % 8));
+}
+
+static inline void clear_bit(uint8_t *map, int bit)
+{
+    map[bit / 8] &= ~(1 << (bit % 8));
+}
+
+extern FILE *logfile;
+static void acpi_dbg_writel(void *opaque, uint32_t addr, uint32_t val)
+{
+#if defined(DEBUG)
+    printf("ACPI: DBG: 0x%08x\n", val);
+#endif
+    fprintf(logfile, "ACPI:debug: write addr=0x%x, val=0x%x.\n", addr, val);
+}
+
+/*
+ * simple PCI hotplug controller IO 
+ * ACPI_PHP_IO_ADDR + :
+ * 0 - the hotplug description: slot(|event(remove/add); 
+ * 1 - 1st php slot ctr/sts reg
+ * 2 - 2nd php slot ctr/sts reg
+ * ......
+ */
+static uint32_t acpi_php_readb(void *opaque, uint32_t addr)
+{
+    PHPSlots *hotplug_slots = opaque;
+    int num;
+    uint32_t val; 
+
+    switch (addr)
+    {
+        case ACPI_PHP_IO_ADDR:
+            val = hotplug_slots->plug_evt;
+            break;
+        default:
+            num = addr - ACPI_PHP_IO_ADDR - 1;
+            val = hotplug_slots->slot[num].status;
+    }
+
+    fprintf(logfile, "ACPI PCI hotplug: read addr=0x%x, val=0x%x.\n", addr, val);
+    return val;
+}
+
+static void acpi_php_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+    PHPSlots *hotplug_slots = opaque;
+    int php_slot;
+    fprintf(logfile, "ACPI PCI hotplug: write addr=0x%x, val=0x%x.\n", addr, val);
+
+    switch (addr)
+    {
+        case ACPI_PHP_IO_ADDR:
+            break;
+        default:
+            php_slot = addr - ACPI_PHP_IO_ADDR - 1;
+            if ( val == 0x1 ) { /* Eject command */
+                /* make _STA of the slot 0 */
+                hotplug_slots->slot[php_slot].status = 0;
+
+                /* clear the hotplug event */
+                hotplug_slots->plug_evt = 0;
+
+                /* power off the slot */
+                power_off_php_slot(php_slot);
+
+                /* signal the CP ACPI hot remove done. */
+                xenstore_record_dm_state("pci-removed");
+            }
+    }
+}
+
+static void pcislots_save(QEMUFile* f, void* opaque)
+{
+    PHPSlots *s = (PHPSlots*)opaque;
+    int i;
+    for ( i = 0; i < ACPI_PHP_SLOT_NUM; i++ ) {
+        qemu_put_8s( f, &s->slot[i].status);
+    }
+    qemu_put_8s(f, &s->plug_evt);
+}
+
+static int pcislots_load(QEMUFile* f, void* opaque, int version_id)
+{
+    PHPSlots *s = (PHPSlots*)opaque;
+    int i;
+    if (version_id != 1)
+        return -EINVAL;
+    for ( i = 0; i < ACPI_PHP_SLOT_NUM; i++ ) {
+        qemu_get_8s( f, &s->slot[i].status);
+    }
+    qemu_get_8s(f, &s->plug_evt);
+    return 0;
+}
+
+static void php_slots_init(void)
+{
+    PHPSlots *slots = &php_slots;
+    int i;
+    memset(slots, 0, sizeof(PHPSlots));
+
+    /* update the pci slot status */
+    for ( i = 0; i < PHP_SLOT_LEN; i++ ) {
+        if ( test_pci_slot( PHP_TO_PCI_SLOT(i) ) == 1 )
+            slots->slot[i].status = 0xf;
+    }
+
+
+    /* ACPI PCI hotplug controller */
+    register_ioport_read(ACPI_PHP_IO_ADDR, ACPI_PHP_SLOT_NUM + 1, 1, acpi_php_readb, slots);
+    register_ioport_write(ACPI_PHP_IO_ADDR, ACPI_PHP_SLOT_NUM + 1, 1, acpi_php_writeb, slots);
+    register_savevm("pcislots", 0, 1, pcislots_save, pcislots_load, slots);
+}
+
+/* GPEx_STS occupy 1st half of the block, while GPEx_EN 2nd half */
+static uint32_t gpe_sts_read(void *opaque, uint32_t addr)
+{
+    GPEState *s = opaque;
+
+    return s->gpe0_sts[addr - ACPI_GPE0_BLK_ADDRESS];
+}
+
+/* write 1 to clear specific GPE bits */
+static void gpe_sts_write(void *opaque, uint32_t addr, uint32_t val)
+{
+    GPEState *s = opaque;
+    int hotplugged = 0;
+
+    fprintf(logfile, "gpe_sts_write: addr=0x%x, val=0x%x.\n", addr, val);
+
+    hotplugged = test_bit(&s->gpe0_sts[0], ACPI_PHP_GPE_BIT);
+    s->gpe0_sts[addr - ACPI_GPE0_BLK_ADDRESS] &= ~val;
+    if ( s->sci_asserted &&
+         hotplugged &&
+         !test_bit(&s->gpe0_sts[0], ACPI_PHP_GPE_BIT)) {
+        fprintf(logfile, "Clear the GPE0_STS bit for ACPI hotplug & deassert the IRQ.\n");
+        pic_set_irq(ACPI_SCI_IRQ, 0);
+    }
+
+}
+
+static uint32_t gpe_en_read(void *opaque, uint32_t addr)
+{
+    GPEState *s = opaque;
+
+    return s->gpe0_en[addr - (ACPI_GPE0_BLK_ADDRESS + ACPI_GPE0_BLK_LEN / 2)];
+}
+
+/* write 0 to clear en bit */
+static void gpe_en_write(void *opaque, uint32_t addr, uint32_t val)
+{
+    GPEState *s = opaque;
+    int reg_count;
+
+    fprintf(logfile, "gpe_en_write: addr=0x%x, val=0x%x.\n", addr, val);
+    reg_count = addr - (ACPI_GPE0_BLK_ADDRESS + ACPI_GPE0_BLK_LEN / 2);
+    s->gpe0_en[reg_count] = val;
+    /* If disable GPE bit right after generating SCI on it, 
+     * need deassert the intr to avoid redundant intrs
+     */
+    if ( s->sci_asserted &&
+            reg_count == (ACPI_PHP_GPE_BIT / 8) &&
+            !(val & (1 << (ACPI_PHP_GPE_BIT % 8))) ) {
+        fprintf(logfile, "deassert due to disable GPE bit.\n");
+        s->sci_asserted = 0;
+        pic_set_irq(ACPI_SCI_IRQ, 0);
+    }
+
+}
+
+static void gpe_save(QEMUFile* f, void* opaque)
+{
+    GPEState *s = (GPEState*)opaque;
+    int i;
+
+    for ( i = 0; i < ACPI_GPE0_BLK_LEN / 2; i++ ) {
+        qemu_put_8s(f, &s->gpe0_sts[i]);
+        qemu_put_8s(f, &s->gpe0_en[i]);
+    }
+
+    qemu_put_8s(f, &s->sci_asserted);
+    if ( s->sci_asserted ) {
+        fprintf(logfile, "gpe_save with sci asserted!\n");
+    }
+}
+
+static int gpe_load(QEMUFile* f, void* opaque, int version_id)
+{
+    GPEState *s = (GPEState*)opaque;
+    int i;
+    if (version_id != 1)
+        return -EINVAL;
+
+    for ( i = 0; i < ACPI_GPE0_BLK_LEN / 2; i++ ) {
+        qemu_get_8s(f, &s->gpe0_sts[i]);
+        qemu_get_8s(f, &s->gpe0_en[i]);
+    }
+
+    qemu_get_8s(f, &s->sci_asserted);
+    return 0;
+}
+
+static void gpe_acpi_init(void)
+{
+    GPEState *s = &gpe_state;
+    memset(s, 0, sizeof(GPEState));
+
+    register_ioport_read(ACPI_GPE0_BLK_ADDRESS,
+            ACPI_GPE0_BLK_LEN / 2,
+            1,
+            gpe_sts_read,
+            s);
+    register_ioport_read(ACPI_GPE0_BLK_ADDRESS + ACPI_GPE0_BLK_LEN / 2,
+            ACPI_GPE0_BLK_LEN / 2,
+            1,
+            gpe_en_read,
+            s);
+
+    register_ioport_write(ACPI_GPE0_BLK_ADDRESS,
+            ACPI_GPE0_BLK_LEN / 2,
+            1,
+            gpe_sts_write,
+            s);
+    register_ioport_write(ACPI_GPE0_BLK_ADDRESS + ACPI_GPE0_BLK_LEN / 2,
+            ACPI_GPE0_BLK_LEN / 2,
+            1,
+            gpe_en_write,
+            s);
+
+    register_savevm("gpe", 0, 1, gpe_save, gpe_load, s);
+}
+
+static void acpi_sci_intr(GPEState *s)
+{
+    if ( !test_bit(&s->gpe0_sts[0], ACPI_PHP_GPE_BIT) &&
+            test_bit(&s->gpe0_en[0], ACPI_PHP_GPE_BIT) ) {
+
+        set_bit(&s->gpe0_sts[0], ACPI_PHP_GPE_BIT);
+        s->sci_asserted = 1;
+        pic_set_irq(ACPI_SCI_IRQ, 1);
+        fprintf(logfile, "generate a sci for PHP.\n");
+    }
+}
+
+void acpi_php_del(int pci_slot)
+{
+    GPEState *s = &gpe_state;
+    PHPSlots *hotplug_slots = &php_slots;
+    int php_slot = PCI_TO_PHP_SLOT(pci_slot);
+
+    if ( pci_slot < PHP_SLOT_START || pci_slot >= PHP_SLOT_END ) {
+        fprintf(logfile, "not find the pci slot %d when hot remove.\n", pci_slot);
+
+        return;
+    }
+
+    /* update the php controller status */
+    hotplug_slots->plug_evt = (((php_slot+1) << 4) | PHP_EVT_REMOVE);
+
+    /* generate a SCI interrupt */
+    acpi_sci_intr(s);
+}
+
+void acpi_php_add(int pci_slot)
+{
+    GPEState *s = &gpe_state;
+    PHPSlots *hotplug_slots = &php_slots;
+    int php_slot = PCI_TO_PHP_SLOT(pci_slot);
+    char ret_str[30];
+
+    if ( pci_slot < PHP_SLOT_START || pci_slot >= PHP_SLOT_END ) {
+        fprintf(logfile, "hot add pci slot %d exceed.\n", pci_slot);
+
+        if ( pci_slot == 0 )
+            sprintf(ret_str, "no free hotplug slots");
+        else if ( pci_slot == -1 )
+            sprintf(ret_str, "wrong bdf or vslot");
+
+        if ( strlen(ret_str) > 0 )
+            xenstore_record_dm("parameter", ret_str);
+
+        return;
+    }
+
+    /* update the php controller status */
+    hotplug_slots->plug_evt = (((php_slot+1) << 4) | PHP_EVT_ADD);
+
+    /* update the slot status as present */
+    hotplug_slots->slot[php_slot].status = 0xf;
+
+    /* power on the slot */
+    power_on_php_slot(php_slot);
+
+    /* tell Control panel which slot for the new pass-throgh dev */
+    sprintf(ret_str, "0x%x", pci_slot);
+    xenstore_record_dm("parameter", ret_str);
+
+    /* signal the CP ACPI hot insert done */
+    xenstore_record_dm_state("pci-inserted");
+
+    /* generate a SCI interrupt */
+    acpi_sci_intr(s);
 }
 
 /* PIIX4 acpi pci configuration space, func 2 */
@@ -168,5 +515,12 @@ void pci_piix4_acpi_init(PCIBus *bus, in
 
     acpi_map((PCIDevice *)d, 0, 0x1f40, 0x10, PCI_ADDRESS_SPACE_IO);
 
+    gpe_acpi_init();
+
+    php_slots_init();
+
+    /* for ACPI debug */
+    register_ioport_write(ACPI_DBG_IO_ADDR, 4, 4, acpi_dbg_writel, d);
+
     register_savevm("piix4acpi", 0, 1, piix4acpi_save, piix4acpi_load, d);
 }
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/ioemu/monitor.c
--- a/tools/ioemu/monitor.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/ioemu/monitor.c	Fri Feb 15 21:09:25 2008 +0800
@@ -1288,6 +1288,12 @@ static term_cmd_t term_cmds[] = {
       "device", "add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')" },
     { "usb_del", "s", do_usb_del,
       "device", "remove USB device 'bus.addr'" },
+#ifdef CONFIG_PHP_DEBUG
+    { "pci_add", "s", do_pci_add,
+      "device", "insert PCI pass-through device by BDF,e.g. (dom, bus, dev, func) by hex '0x0, 0x3, 0x0, 0x0'" },
+    { "pci_del", "s", do_pci_del,
+      "device", "remove PCI pass-through device by BDF,e.g. (dom, bus, dev, func) by hex '0x0, 0x3, 0x0, 0x0'" },
+#endif
 #ifndef CONFIG_DM
     { "cpu", "i", do_cpu_set, 
       "index", "set the default CPU" },
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/ioemu/vl.c
--- a/tools/ioemu/vl.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/ioemu/vl.c	Fri Feb 15 21:09:25 2008 +0800
@@ -4382,6 +4382,24 @@ void usb_info(void)
     }
 }
 
+void do_pci_del(char *devname)
+{
+    int pci_slot;
+    pci_slot = bdf_to_slot(devname);
+
+    acpi_php_del(pci_slot);
+}
+
+void do_pci_add(char *devname)
+{
+    int pci_slot;
+
+    pci_slot = insert_to_pci_slot(devname);
+
+    acpi_php_add(pci_slot);
+}
+
+
 /***********************************************************/
 /* pid file */
 
@@ -7067,7 +7085,7 @@ int main(int argc, char **argv)
 #endif
     sigset_t set;
     char qemu_dm_logfilename[128];
-    const char *direct_pci = NULL;
+    const char *direct_pci = direct_pci_str;
 
 #if !defined(__sun__) && !defined(CONFIG_STUBDOM)
     /* Maximise rlimits. Needed where default constraints are tight (*BSD). */
@@ -7590,9 +7608,6 @@ int main(int argc, char **argv)
             case QEMU_OPTION_vncunused:
                 vncunused++;
                 break;
-            case QEMU_OPTION_pci:
-                direct_pci = optarg;
-                break;
             }
         }
     }
@@ -7970,5 +7985,6 @@ int main(int argc, char **argv)
 
     main_loop();
     quit_timers();
+    pt_uninit();
     return 0;
 }
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/ioemu/vl.h
--- a/tools/ioemu/vl.h	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/ioemu/vl.h	Fri Feb 15 21:09:25 2008 +0800
@@ -817,10 +817,14 @@ struct PCIDevice {
     int irq_state[4];
 };
 
+extern char direct_pci_str[];
+
 PCIDevice *pci_register_device(PCIBus *bus, const char *name,
                                int instance_size, int devfn,
                                PCIConfigReadFunc *config_read, 
                                PCIConfigWriteFunc *config_write);
+
+void pci_hide_device(PCIDevice *pci_dev);
 
 void pci_register_io_region(PCIDevice *pci_dev, int region_num, 
                             uint32_t size, int type, 
@@ -849,6 +853,22 @@ void pci_info(void);
 void pci_info(void);
 PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint32_t id,
                         pci_map_irq_fn map_irq, const char *name);
+
+/* PCI slot 6~7 support ACPI PCI hot plug */
+#define PHP_SLOT_START  (6)
+#define PHP_SLOT_END    (8)
+#define PHP_SLOT_LEN    (PHP_SLOT_END - PHP_SLOT_START)
+#define PHP_TO_PCI_SLOT(x) (x + PHP_SLOT_START)
+#define PCI_TO_PHP_SLOT(x) (x - PHP_SLOT_START)
+#define PHP_DEVFN_START (PHP_SLOT_START << 3)
+#define PHP_DEVFN_END   (PHP_SLOT_END << 3)
+
+int insert_to_pci_slot(char*);
+int test_pci_slot(int);
+int bdf_to_slot(char*);
+int power_on_php_slot(int);
+int power_off_php_slot(int);
+void pt_uninit(void);
 
 /* prep_pci.c */
 PCIBus *pci_prep_init(void);
@@ -1120,6 +1140,9 @@ void tpm_tis_init(SetIRQFunc *set_irq, v
 
 /* piix4acpi.c */
 extern void pci_piix4_acpi_init(PCIBus *bus, int devfn);
+void acpi_php_add(int);
+void acpi_php_del(int);
+
 
 /* pc.c */
 extern QEMUMachine pc_machine;
@@ -1320,6 +1343,9 @@ void do_usb_del(const char *devname);
 void do_usb_del(const char *devname);
 void usb_info(void);
 
+void do_pci_add(char *devname);
+void do_pci_del(char *devname);
+
 /* scsi-disk.c */
 enum scsi_reason {
     SCSI_REASON_DONE, /* Command complete.  */
@@ -1466,10 +1492,12 @@ void xenstore_parse_domain_config(int do
 void xenstore_parse_domain_config(int domid);
 int xenstore_fd(void);
 void xenstore_process_event(void *opaque);
+void xenstore_record_dm(char *subpath, char *state);
 void xenstore_record_dm_state(char *state);
 void xenstore_check_new_media_present(int timeout);
 void xenstore_write_vncport(int vnc_display);
 void xenstore_read_vncpasswd(int domid, char *pwbuf, size_t pwbuflen);
+void xenstore_write_vslots(char *vslots);
 
 int xenstore_domain_has_devtype(struct xs_handle *handle,
                                 const char *devtype);
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/ioemu/xenstore.c
--- a/tools/ioemu/xenstore.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/ioemu/xenstore.c	Fri Feb 15 21:09:25 2008 +0800
@@ -79,6 +79,8 @@ static void waitForDevice(char *fn)
     return;
 }
 
+#define DIRECT_PCI_STR_LEN 160
+char direct_pci_str[DIRECT_PCI_STR_LEN];
 void xenstore_parse_domain_config(int domid)
 {
     char **e = NULL;
@@ -86,7 +88,7 @@ void xenstore_parse_domain_config(int do
     char *fpath = NULL, *bpath = NULL,
         *dev = NULL, *params = NULL, *type = NULL, *drv = NULL;
     int i, is_scsi, is_hdN = 0;
-    unsigned int len, num, hd_index;
+    unsigned int len, num, hd_index, pci_devid = 0;
     BlockDriverState *bs;
 
     for(i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++)
@@ -250,6 +252,38 @@ void xenstore_parse_domain_config(int do
         fprintf(logfile, "Watching %s\n", buf);
     }
 
+    /* get the pci pass-through parameter */
+    if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/num_devs",
+                  domid, pci_devid) == -1)
+        goto out;
+
+    free(params);
+    params = xs_read(xsh, XBT_NULL, buf, &len);
+    if (params == NULL)
+        goto out;
+    num = atoi(params);
+
+    for ( i = 0; i < num; i++ ) {
+        if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/dev-%d",
+                    domid, pci_devid, i) != -1) {
+            free(dev);
+            dev = xs_read(xsh, XBT_NULL, buf, &len);
+
+            if ( strlen(dev) + strlen(direct_pci_str) > DIRECT_PCI_STR_LEN ) {
+                fprintf(stderr, "qemu: too many pci pass-through devices\n");
+                memset(direct_pci_str, 0, DIRECT_PCI_STR_LEN);
+                goto out;
+            }
+
+            /* append to direct_pci_str */
+            if ( dev ) {
+                strcat(direct_pci_str, dev);
+                strcat(direct_pci_str, "-");
+            }
+        }
+    }
+
+
  out:
     free(type);
     free(params);
@@ -388,7 +422,7 @@ void xenstore_process_logdirty_event(voi
 /* Accept state change commands from the control tools */
 static void xenstore_process_dm_command_event(void)
 {
-    char *path = NULL, *command = NULL;
+    char *path = NULL, *command = NULL, *par = NULL;
     unsigned int len;
     extern int suspend_requested;
 
@@ -407,6 +441,34 @@ static void xenstore_process_dm_command_
     } else if (!strncmp(command, "continue", len)) {
         fprintf(logfile, "dm-command: continue after state save\n");
         suspend_requested = 0;
+    } else if (!strncmp(command, "pci-rem", len)) {
+        fprintf(logfile, "dm-command: hot remove pass-through pci dev \n");
+
+        if (pasprintf(&path, 
+                      "/local/domain/0/device-model/%u/parameter", domid) == -1) {
+            fprintf(logfile, "out of memory reading dm command parameter\n");
+            goto out;
+        }
+        par = xs_read(xsh, XBT_NULL, path, &len);
+        if (!par)
+            goto out;
+
+        do_pci_del(par);
+        free(par);
+    } else if (!strncmp(command, "pci-ins", len)) {
+        fprintf(logfile, "dm-command: hot insert pass-through pci dev \n");
+
+        if (pasprintf(&path, 
+                      "/local/domain/0/device-model/%u/parameter", domid) == -1) {
+            fprintf(logfile, "out of memory reading dm command parameter\n");
+            goto out;
+        }
+        par = xs_read(xsh, XBT_NULL, path, &len);
+        if (!par)
+            goto out;
+
+        do_pci_add(par);
+        free(par);
     } else {
         fprintf(logfile, "dm-command: unknown command\"%*s\"\n", len, command);
     }
@@ -416,20 +478,25 @@ static void xenstore_process_dm_command_
     free(command);
 }
 
+void xenstore_record_dm(char *subpath, char *state)
+{
+    char *path = NULL;
+
+    if (pasprintf(&path, 
+                  "/local/domain/0/device-model/%u/%s", domid, subpath) == -1) {
+        fprintf(logfile, "out of memory recording dm \n");
+        goto out;
+    }
+    if (!xs_write(xsh, XBT_NULL, path, state, strlen(state)))
+        fprintf(logfile, "error recording dm \n");
+
+ out:
+    free(path);
+}
+
 void xenstore_record_dm_state(char *state)
 {
-    char *path = NULL;
-
-    if (pasprintf(&path, 
-                  "/local/domain/0/device-model/%u/state", domid) == -1) {
-        fprintf(logfile, "out of memory recording dm state\n");
-        goto out;
-    }
-    if (!xs_write(xsh, XBT_NULL, path, state, strlen(state)))
-        fprintf(logfile, "error recording dm state\n");
-
- out:
-    free(path);
+    xenstore_record_dm("state", state);
 }
 
 void xenstore_process_event(void *opaque)
@@ -520,6 +587,23 @@ void xenstore_write_vncport(int display)
  out:
     free(portstr);
     free(buf);
+}
+
+void xenstore_write_vslots(char *vslots)
+{
+    char *path = NULL;
+    int pci_devid = 0;
+
+    if (pasprintf(&path, 
+                  "/local/domain/0/backend/pci/%u/%u/vslots", domid, pci_devid) == -1) {
+        fprintf(logfile, "out of memory when updating vslots.\n");
+        goto out;
+    }
+    if (!xs_write(xsh, XBT_NULL, path, vslots, strlen(vslots)))
+        fprintf(logfile, "error updating vslots \n");
+
+ out:
+    free(path);
 }
 
 void xenstore_read_vncpasswd(int domid, char *pwbuf, size_t pwbuflen)
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/libxc/xc_domain.c	Fri Feb 15 21:09:25 2008 +0800
@@ -762,6 +762,20 @@ int xc_test_assign_device(
     return do_domctl(xc_handle, &domctl);
 }
 
+int xc_deassign_device(
+    int xc_handle,
+    uint32_t domid,
+    uint32_t machine_bdf)
+{
+    DECLARE_DOMCTL;
+
+    domctl.cmd = XEN_DOMCTL_deassign_device;
+    domctl.domain = domid;
+    domctl.u.assign_device.machine_bdf = machine_bdf;
+ 
+    return do_domctl(xc_handle, &domctl);
+}
+
 /* Pass-through: binds machine irq to guests irq */
 int xc_domain_bind_pt_irq(
     int xc_handle,
@@ -797,6 +811,36 @@ int xc_domain_bind_pt_irq(
     return rc;
 }
 
+int xc_domain_unbind_pt_irq(
+    int xc_handle,
+    uint32_t domid,
+    uint8_t machine_irq,
+    uint8_t irq_type,
+    uint8_t bus,
+    uint8_t device,
+    uint8_t intx,
+    uint8_t isa_irq)
+{
+    int rc;
+    xen_domctl_bind_pt_irq_t * bind;
+    DECLARE_DOMCTL;
+
+    domctl.cmd = XEN_DOMCTL_unbind_pt_irq;
+    domctl.domain = (domid_t)domid;
+
+    bind = &(domctl.u.bind_pt_irq);
+    bind->hvm_domid = domid;
+    bind->irq_type = irq_type;
+    bind->machine_irq = machine_irq;
+    bind->u.pci.bus = bus;
+    bind->u.pci.device = device;    
+    bind->u.pci.intx = intx;
+    bind->u.isa.isa_irq = isa_irq;
+    
+    rc = do_domctl(xc_handle, &domctl);
+    return rc;
+}
+
 int xc_domain_bind_pt_pci_irq(
     int xc_handle,
     uint32_t domid,
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/libxc/xenctrl.h	Fri Feb 15 21:09:25 2008 +0800
@@ -914,6 +914,10 @@ int xc_test_assign_device(int xc_handle,
                           uint32_t domid,
                           uint32_t machine_bdf);
 
+int xc_deassign_device(int xc_handle,
+                     uint32_t domid,
+                     uint32_t machine_bdf);
+
 int xc_domain_memory_mapping(int xc_handle,
                              uint32_t domid,
                              unsigned long first_gfn,
@@ -937,6 +941,15 @@ int xc_domain_bind_pt_irq(int xc_handle,
                           uint8_t intx,
                           uint8_t isa_irq);
 
+int xc_domain_unbind_pt_irq(int xc_handle,
+                          uint32_t domid,
+                          uint8_t machine_irq,
+                          uint8_t irq_type,
+                          uint8_t bus,
+                          uint8_t device,
+                          uint8_t intx,
+                          uint8_t isa_irq);
+
 int xc_domain_bind_pt_pci_irq(int xc_handle,
                               uint32_t domid,
                               uint8_t machine_irq,
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/python/xen/xend/XendDomainInfo.py	Fri Feb 15 21:09:25 2008 +0800
@@ -516,6 +516,131 @@ class XendDomainInfo:
         asserts.isCharConvertible(key)
         self.storeDom("control/sysrq", '%c' % key)
 
+    def sync_pcidev_info(self):
+
+        if not self.info.is_hvm():
+            return
+
+        devid = '0'
+        dev_info = self._getDeviceInfo_pci(devid)
+        if dev_info is None:
+            return
+
+        # get the virtual slot info from xenstore
+        dev_uuid = sxp.child_value(dev_info, 'uuid')
+        pci_conf = self.info['devices'][dev_uuid][1]
+        pci_devs = pci_conf['devs']
+
+        count = 0
+        vslots = None
+        while vslots is None and count < 20:
+            vslots = xstransact.Read("/local/domain/0/backend/pci/%u/%s/vslots"
+                              % (self.getDomid(), devid))
+            time.sleep(0.1)
+            count += 1
+        if vslots is None:
+            log.error("Device model didn't tell the vslots for PCI device")
+            return
+
+        #delete last delim
+        if vslots[-1] == ";":
+            vslots = vslots[:-1]
+
+        slot_list = vslots.split(';')
+        if len(slot_list) != len(pci_devs):
+            log.error("Device model's pci dev num dismatch")
+            return
+
+        #update the vslot info
+        count = 0;
+        for x in pci_devs:
+            x['vslt'] = slot_list[count]
+            count += 1
+
+
+    def pci_device_create(self, dev_config):
+        log.debug("XendDomainInfo.pci_device_create: %s" % scrub_password(dev_config))
+
+        if not self.info.is_hvm():
+            raise VmError("only HVM guest support pci attach")
+
+        #all the PCI devs share one conf node
+        devid = '0'
+
+        dev_type = sxp.name(dev_config)
+        new_devs = sxp.child_value(dev_config, 'devs')
+        new_dev = new_devs[0]
+        dev_info = self._getDeviceInfo_pci(devid)#from self.info['devices']
+
+        #check conflict before trigger hotplug event
+        if dev_info is not None:
+            dev_uuid = sxp.child_value(dev_info, 'uuid')
+            pci_conf = self.info['devices'][dev_uuid][1]
+            pci_devs = pci_conf['devs']
+            for x in pci_devs:
+                if (int(x['vslt'], 16) == int(new_dev['vslt'], 16) and
+                   int(x['vslt'], 16) != 0 ):
+                    raise VmError("vslot %s already have a device." % (new_dev['vslt']))
+
+                if (int(x['domain'], 16) == int(new_dev['domain'], 16) and
+                   int(x['bus'], 16)    == int(new_dev['bus'], 16) and
+                   int(x['slot'], 16)   == int(new_dev['slot'], 16) and
+                   int(x['func'], 16)   == int(new_dev['func'], 16) ):
+                    raise VmError("device is already inserted")
+
+        # Test whether the devices can be assigned with VT-d
+        pci_str = "%s, %s, %s, %s" % (new_dev['domain'],
+                new_dev['bus'],
+                new_dev['slot'],
+                new_dev['func'])
+        bdf = xc.test_assign_device(self.domid, pci_str)
+        if bdf != 0:
+            bus = (bdf >> 16) & 0xff
+            devfn = (bdf >> 8) & 0xff
+            dev = (devfn >> 3) & 0x1f
+            func = devfn & 0x7
+            raise VmError("Fail to hot insert device(%x:%x.%x): maybe VT-d is "
+                          "not enabled, or the device is not exist, or it "
+                          "has already been assigned to other domain"
+                          % (bus, dev, func))
+
+        bdf_str = "%s:%s:%s.%s@%s" % (new_dev['domain'],
+                new_dev['bus'],
+                new_dev['slot'],
+                new_dev['func'],
+                new_dev['vslt'])
+        self.image.signalDeviceModel('pci-ins', 'pci-inserted', bdf_str)
+
+        # update the virtual pci slot
+        vslt = xstransact.Read("/local/domain/0/device-model/%i/parameter"
+                          % self.getDomid())
+        new_dev['vslt'] = vslt
+
+        if dev_info is None:
+            # create a new one from scrach
+            dev_cfg_sxp = [dev_type,
+                ['dev',
+                  ['domain', new_dev['domain']],
+                  ['bus',    new_dev['bus']],
+                  ['slot',   new_dev['slot']],
+                  ['func',   new_dev['func']],
+                  ['vslt',   new_dev['vslt']]
+                ]]
+            dev_uuid = self.info.device_add(dev_type, cfg_sxp = dev_cfg_sxp)
+            dev_config_dict = self.info['devices'][dev_uuid][1]
+            try:
+                dev_config_dict['devid'] = devid = \
+                    self._createDevice(dev_type, dev_config_dict)
+                self._waitForDevice(dev_type, devid)
+            except VmError, ex:
+                raise ex
+        else:
+            # update the pci config to add the new dev
+            pci_devs.extend(new_devs)
+            self._reconfigureDevice('pci', devid, pci_conf)
+
+        return self.getDeviceController('pci').sxpr(devid)
+
     def device_create(self, dev_config):
         """Create a new device.
 
@@ -524,6 +649,11 @@ class XendDomainInfo:
         """
         log.debug("XendDomainInfo.device_create: %s" % scrub_password(dev_config))
         dev_type = sxp.name(dev_config)
+
+        if dev_type == 'pci':
+            rc = self.pci_device_create(dev_config)
+            return rc
+
         dev_uuid = self.info.device_add(dev_type, cfg_sxp = dev_config)
         dev_config_dict = self.info['devices'][dev_uuid][1]
         log.debug("XendDomainInfo.device_create: %s" % scrub_password(dev_config_dict))
@@ -584,9 +714,64 @@ class XendDomainInfo:
         for devclass in XendDevices.valid_devices():
             self.getDeviceController(devclass).waitForDevices()
 
+    def destroyPCIDevice(self, vslot):
+        log.debug("destroyPCIDevice called %s", vslot)
+
+        if not self.info.is_hvm():
+            raise VmError("only HVM guest support pci detach")
+
+        #all the PCI devs share one conf node
+        devid = '0'
+        vslot = int(vslot)
+        dev_info = self._getDeviceInfo_pci('0')#from self.info['devices']
+        dev_uuid = sxp.child_value(dev_info, 'uuid')
+
+        #delete the pci bdf config under the pci device
+        pci_conf = self.info['devices'][dev_uuid][1]
+        pci_len = len(pci_conf['devs'])
+
+        #find the pass-through device with the virtual slot
+        devnum = 0
+        for x in pci_conf['devs']:
+            if int(x['vslt'], 16) == vslot:
+                break
+            devnum += 1
+
+        if devnum >= pci_len:
+            raise VmError("Device @ vslot 0x%x doesn't exist." % (vslot))
+
+        if vslot == 0:
+            raise VmError("Device @ vslot 0x%x do not support hotplug." % (vslot))
+
+        bdf_str = "%s:%s:%s.%s" % (x['domain'], x['bus'], x['slot'], x['func'])
+        log.info("destroyPCIDevice:%s:%s!", x, bdf_str)
+
+        self.image.signalDeviceModel('pci-rem', 'pci-removed', bdf_str)
+
+        if pci_len > 1:
+            del pci_conf['devs'][devnum]
+            self._reconfigureDevice('pci', devid, pci_conf)
+        else:
+            self.getDeviceController('pci').destroyDevice(devid, True)
+            del self.info['devices'][dev_uuid]
+            platform = self.info['platform']
+            orig_dev_num = len(platform['pci'])
+
+            #need remove the pci config
+            #TODO:can use this to keep some info to ask high level management tools to hot insert a new passthrough dev after migration
+            if orig_dev_num != 0:
+#                platform['pci'] = ["%dDEVs" % orig_dev_num]
+                platform['pci'] = []
+
+        return 0
+
     def destroyDevice(self, deviceClass, devid, force = False, rm_cfg = False):
         log.debug("XendDomainInfo.destroyDevice: deviceClass = %s, device = %s",
                   deviceClass, devid)
+
+        if deviceClass == 'dpci':
+            rc = self.destroyPCIDevice(devid)
+            return rc
 
         if rm_cfg:
             # Convert devid to device number.  A device number is
@@ -647,6 +832,14 @@ class XendDomainInfo:
         return rc
 
     def getDeviceSxprs(self, deviceClass):
+        if deviceClass == 'pci':
+            dev_info = self._getDeviceInfo_pci('0')#from self.info['devices']
+            if dev_info is None:
+                return []
+            dev_uuid = sxp.child_value(dev_info, 'uuid')
+            pci_devs = self.info['devices'][dev_uuid][1]['devs']
+            pci_len = len(pci_devs)
+            return pci_devs
         if self._stateGet() in (DOM_STATE_RUNNING, DOM_STATE_PAUSED, DOM_STATE_CRASHED):
             return self.getDeviceController(deviceClass).sxprs()
         else:
@@ -683,6 +876,12 @@ class XendDomainInfo:
             if devid == dev:
                 return dev_info
 
+    def _getDeviceInfo_pci(self, devid):
+        for dev_type, dev_info in self.info.all_devices_sxpr():
+            if dev_type != 'pci':
+                continue
+            return dev_info
+        return None
 
     def setMemoryTarget(self, target):
         """Set the memory target of this domain.
@@ -1542,6 +1741,9 @@ class XendDomainInfo:
 
         if self.image:
             self.image.createDeviceModel()
+
+        #if have pass-through devs, need the virtual pci slots info from qemu
+        self.sync_pcidev_info()
 
     def _releaseDevices(self, suspend = False):
         """Release all domain's devices.  Nothrow guarantee."""
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/python/xen/xend/image.py	Fri Feb 15 21:09:25 2008 +0800
@@ -300,23 +300,42 @@ class ImageHandler:
         self.vm.storeDom("image/device-model-pid", self.pid)
         log.info("device model pid: %d", self.pid)
 
-    def saveDeviceModel(self):
+    def signalDeviceModel(self, cmd, ret, par = None):
         if self.device_model is None:
             return
-        # Signal the device model to pause itself and save its state
+        # Signal the device model to for action
+        if cmd is '' or ret is '':
+            raise VmError('need valid command and result when signal device model')
+
+        orig_state = xstransact.Read("/local/domain/0/device-model/%i/state"
+                                % self.vm.getDomid())
+
+        if par is not None:
+            xstransact.Store("/local/domain/0/device-model/%i"
+                             % self.vm.getDomid(), ('parameter', par))
+
         xstransact.Store("/local/domain/0/device-model/%i"
-                         % self.vm.getDomid(), ('command', 'save'))
+                         % self.vm.getDomid(), ('command', cmd))
         # Wait for confirmation.  Could do this with a watch but we'd
         # still end up spinning here waiting for the watch to fire. 
         state = ''
         count = 0
-        while state != 'paused':
+        while state != ret:
             state = xstransact.Read("/local/domain/0/device-model/%i/state"
                                     % self.vm.getDomid())
             time.sleep(0.1)
             count += 1
             if count > 100:
-                raise VmError('Timed out waiting for device model to save')
+                raise VmError('Timed out waiting for device model action')
+
+        #resotre orig state
+        xstransact.Store("/local/domain/0/device-model/%i"
+                         % self.vm.getDomid(), ('state', orig_state))
+        log.info("signalDeviceModel:restore dm state to %s", orig_state)
+
+    def saveDeviceModel(self):
+        # Signal the device model to pause itself and save its state
+        self.signalDeviceModel('save', 'paused')
 
     def resumeDeviceModel(self):
         if self.device_model is None:
@@ -479,7 +498,7 @@ class HVMImageHandler(ImageHandler):
 
         dmargs = [ 'boot', 'fda', 'fdb', 'soundhw',
                    'localtime', 'serial', 'stdvga', 'isa',
-                   'acpi', 'usb', 'usbdevice', 'pci' ]
+                   'acpi', 'usb', 'usbdevice' ]
 
         for a in dmargs:
             v = vmConfig['platform'].get(a)
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/python/xen/xend/server/DevController.py
--- a/tools/python/xen/xend/server/DevController.py	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/python/xen/xend/server/DevController.py	Fri Feb 15 21:09:25 2008 +0800
@@ -412,6 +412,14 @@ class DevController:
         return result
 
 
+    def removeBackend(self, devid, *args):
+        frontpath = self.frontendPath(devid)
+        backpath = xstransact.Read(frontpath, "backend")
+        if backpath:
+            return xstransact.Remove(backpath, *args)
+        else:
+            raise VmError("Device %s not connected" % devid)
+
     def readBackend(self, devid, *args):
         frontpath = self.frontendPath(devid)
         backpath = xstransact.Read(frontpath, "backend")
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/python/xen/xend/server/pciif.py
--- a/tools/python/xen/xend/server/pciif.py	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/python/xen/xend/server/pciif.py	Fri Feb 15 21:09:25 2008 +0800
@@ -18,6 +18,7 @@
 
 
 import types
+import time
 
 from xen.xend import sxp
 from xen.xend.XendError import VmError
@@ -62,25 +63,62 @@ class PciController(DevController):
             
         back = {}
         pcidevid = 0
+        vslots = ""
         for pci_config in config.get('devs', []):
             domain = parse_hex(pci_config.get('domain', 0))
             bus = parse_hex(pci_config.get('bus', 0))
             slot = parse_hex(pci_config.get('slot', 0))
             func = parse_hex(pci_config.get('func', 0))            
+
+            vslt = pci_config.get('vslt')
+            if vslt is not None:
+                vslots = vslots + vslt + ";"
+
             self.setupDevice(domain, bus, slot, func)
             back['dev-%i' % pcidevid] = "%04x:%02x:%02x.%02x" % \
                                         (domain, bus, slot, func)
             pcidevid += 1
 
+        if vslots != "":
+            back['vslots'] = vslots
+
         back['num_devs']=str(pcidevid)
         back['uuid'] = config.get('uuid','')
         return (0, back, {})
+
+    def reconfigureDevice(self, _, config):
+        """@see DevController.reconfigureDevice"""
+        #currently only support config changes by hot insert/remove pass-through dev
+        #delete all the devices in xenstore
+        (devid, new_back, new_front) = self.getDeviceDetails(config)
+        num_devs = self.readBackend(devid, 'num_devs')
+        for i in range(int(num_devs)):
+            self.removeBackend(devid, 'dev-%d' % i)
+        self.removeBackend(devid, 'num_devs')
+
+        #create new devices config
+        num_devs = new_back['num_devs']
+        for i in range(int(num_devs)):
+            dev_no = 'dev-%d' % i
+            self.writeBackend(devid, dev_no, new_back[dev_no])
+        self.writeBackend(devid, 'num_devs', num_devs)
+
+        if new_back['vslots'] is not None:
+            self.writeBackend(devid, 'vslots', new_back['vslots'])
+
+        return new_back.get('uuid')
 
     def getDeviceConfiguration(self, devid, transaction = None):
         result = DevController.getDeviceConfiguration(self, devid, transaction)
         num_devs = self.readBackend(devid, 'num_devs')
         pci_devs = []
         
+        vslots = self.readBackend(devid, 'vslots')
+        if vslots is not None:
+            if vslots[-1] == ";":
+                vslots = vslots[:-1]
+            slot_list = vslots.split(';')
+
         for i in range(int(num_devs)):
             dev_config = self.readBackend(devid, 'dev-%d' % i)
 
@@ -91,10 +129,16 @@ class PciController(DevController):
             
             if pci_match!=None:
                 pci_dev_info = pci_match.groupdict()
-                pci_devs.append({'domain': '0x%(domain)s' % pci_dev_info,
+                dev_dict = {'domain': '0x%(domain)s' % pci_dev_info,
                                  'bus': '0x%(bus)s' % pci_dev_info,
                                  'slot': '0x%(slot)s' % pci_dev_info,
-                                 'func': '0x%(func)s' % pci_dev_info})
+                                 'func': '0x%(func)s' % pci_dev_info}
+
+                #append vslot info
+                if vslots is not None:
+                    dev_dict['vslt'] = slot_list[i]
+
+                pci_devs.append(dev_dict)
 
         result['devs'] = pci_devs
         result['uuid'] = self.readBackend(devid, 'uuid')
diff -r bac4536f5e84 -r 9f83f4f3eb5e tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py	Fri Feb 15 10:58:36 2008 +0800
+++ b/tools/python/xen/xm/main.py	Fri Feb 15 21:09:25 2008 +0800
@@ -175,6 +175,12 @@ SUBCOMMAND_HELP = {
     'vnet-delete'   :  ('<VnetId>', 'Delete a Vnet.'),
     'vnet-list'     :  ('[-l|--long]', 'List Vnets.'),
     'vtpm-list'     :  ('<Domain> [--long]', 'List virtual TPM devices.'),
+    'pci-attach '   :  ('<Domain> <dom> <bus> <slot> <func> [virtual slot]',
+                        'Insert a new pass-through pci device.'),
+    'pci-detach '   :  ('<Domain> <virtual slot>',
+                        'Remove a domain\'s pass-through pci device.'),
+    'pci-list'     :  ('<Domain>',
+                        'List pass-through pci devices for a domain.'),
 
     # security
 
@@ -335,6 +341,9 @@ device_commands = [
     "network-detach",
     "network-list",
     "vtpm-list",
+    "pci-attach",
+    "pci-detach",
+    "pci-list",
     ]
 
 vnet_commands = [
@@ -2051,6 +2060,31 @@ def xm_vtpm_list(args):
                    % ni)
 
 
+def xm_pci_list(args):
+    (use_long, params) = arg_check_for_resource_list(args, "pci-list")
+
+    dom = params[0]
+
+    devs = server.xend.domain.getDeviceSxprs(dom, 'pci')
+
+    if len(devs) == 0:
+        return
+
+    has_vslt = devs[0].has_key('vslt')
+    if has_vslt:
+        hdr_str = 'VSlt domain   bus   slot   func'
+        fmt_str =  "%(vslt)-3s    %(domain)-3s  %(bus)-3s   %(slot)-3s    %(func)-3s    "
+    else:
+        hdr_str = 'domain   bus   slot   func'
+        fmt_str =  "%(domain)-3s  %(bus)-3s   %(slot)-3s    %(func)-3s    "
+    hdr = 0
+
+    for x in devs:
+        if hdr == 0:
+            print (hdr_str)
+            hdr = 1
+        print ( fmt_str % x )
+
 def parse_block_configuration(args):
     dom = args[0]
 
@@ -2198,6 +2232,29 @@ def xm_network_attach(args):
             vif.append(vif_param)
         server.xend.domain.device_create(dom, vif)
 
+def parse_pci_configuration(args):
+    dom = args[0]
+
+    if len(args) == 6:
+        vslt = args[5]
+    else:
+        vslt = '0x0' #chose a free virtual PCI slot
+
+    pci = ['pci',
+          ['devs',
+            [{'domain': "0x%x" % int(args[1], 16),
+              'bus':    "0x%x" % int(args[2], 16),
+              'slot':   "0x%x" % int(args[3], 16),
+              'func':   "0x%x" % int(args[4], 16),
+              'vslt':   "0x%x" % int(vslt,    16)}]
+          ]]
+
+    return (dom, pci)
+
+def xm_pci_attach(args):
+    arg_check(args, 'xm_pci_attach', 5, 6)
+    (dom, pci) = parse_pci_configuration(args)
+    server.xend.domain.device_create(dom, pci)
 
 def detach(args, deviceClass):
     rm_cfg = True
@@ -2262,6 +2319,12 @@ def xm_network_detach(args):
         arg_check(args, 'network-detach', 2, 3)
         detach(args, 'vif')
 
+
+def xm_pci_detach(args):
+    arg_check(args, 'xm_pci_detach', 2, 2)
+    dom = args[0]
+    dev = args[1]
+    server.xend.domain.destroyDevice(dom, 'dpci', dev)
 
 def xm_vnet_list(args):
     xenapi_unsupported()
@@ -2452,6 +2515,10 @@ commands = {
     "vnet-delete": xm_vnet_delete,
     # vtpm
     "vtpm-list": xm_vtpm_list,
+    #pci
+    "pci-attach": xm_pci_attach,
+    "pci-detach": xm_pci_detach,
+    "pci-list": xm_pci_list,
     }
 
 ## The commands supported by a separate argument parser in xend.xm.
diff -r bac4536f5e84 -r 9f83f4f3eb5e xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/xen/arch/x86/domctl.c	Fri Feb 15 21:09:25 2008 +0800
@@ -580,6 +580,34 @@ long arch_do_domctl(
     }
     break;
 
+    case XEN_DOMCTL_deassign_device:
+    {
+        struct domain *d;
+        u8 bus, devfn;
+
+        ret = -EINVAL;
+        if ( !vtd_enabled )
+            break;
+
+        if ( unlikely((d = get_domain_by_id(domctl->domain)) == NULL) )
+        {
+            gdprintk(XENLOG_ERR,
+                "XEN_DOMCTL_deassign_device: get_domain_by_id() failed\n"); 
+            break;
+        }
+        bus = (domctl->u.assign_device.machine_bdf >> 16) & 0xff;
+        devfn = (domctl->u.assign_device.machine_bdf >> 8) & 0xff;
+
+        if ( !device_assigned(bus, devfn) )
+            break;
+
+        reassign_device_ownership(d, dom0, bus, devfn);
+        gdprintk(XENLOG_INFO, "XEN_DOMCTL_deassign_device: bdf = %x:%x:%x\n",
+            bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+        put_domain(d);
+    }
+    break;
+
     case XEN_DOMCTL_bind_pt_irq:
     {
         struct domain * d;
@@ -593,6 +621,23 @@ long arch_do_domctl(
             ret = pt_irq_create_bind_vtd(d, bind);
         if ( ret < 0 )
             gdprintk(XENLOG_ERR, "pt_irq_create_bind failed!\n");
+        rcu_unlock_domain(d);
+    }
+    break;    
+
+    case XEN_DOMCTL_unbind_pt_irq:
+    {
+        struct domain * d;
+        xen_domctl_bind_pt_irq_t * bind;
+
+        ret = -ESRCH;
+        if ( (d = rcu_lock_domain_by_id(domctl->domain)) == NULL )
+            break;
+        bind = &(domctl->u.bind_pt_irq);
+        if ( vtd_enabled )
+            ret = pt_irq_destroy_bind_vtd(d, bind);
+        if ( ret < 0 )
+            gdprintk(XENLOG_ERR, "pt_irq_destroy_bind failed!\n");
         rcu_unlock_domain(d);
     }
     break;
diff -r bac4536f5e84 -r 9f83f4f3eb5e xen/arch/x86/hvm/irq.c
--- a/xen/arch/x86/hvm/irq.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/xen/arch/x86/hvm/irq.c	Fri Feb 15 21:09:25 2008 +0800
@@ -211,7 +211,7 @@ void hvm_set_pci_link_route(struct domai
             clear_bit(old_isa_irq, &hvm_irq->dpci->isairq_map);
 
         for ( i = 0; i < NR_LINK; i++ )
-            if ( test_bit(i, &hvm_irq->dpci->link_map) &&
+            if ( hvm_irq->dpci->link_cnt[i] > 0 &&
                  hvm_irq->pci_link.route[i] )
                 set_bit(hvm_irq->pci_link.route[i],
                         &hvm_irq->dpci->isairq_map);
diff -r bac4536f5e84 -r 9f83f4f3eb5e xen/arch/x86/hvm/vmx/vtd/intel-iommu.c
--- a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c	Fri Feb 15 21:09:25 2008 +0800
@@ -1441,6 +1441,8 @@ void reassign_device_ownership(
              bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
              source->domain_id, target->domain_id);
 
+    pdev_flr(bus, devfn);
+
     for_each_pdev( source, pdev )
     {
         if ( (pdev->bus != bus) || (pdev->devfn != devfn) )
@@ -1476,7 +1478,6 @@ void return_devices_to_dom0(struct domai
         dprintk(XENLOG_INFO VTDPREFIX,
                 "return_devices_to_dom0: bdf = %x:%x:%x\n",
                 pdev->bus, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
-        pdev_flr(pdev->bus, pdev->devfn);
         reassign_device_ownership(d, dom0, pdev->bus, pdev->devfn);
     }
 
@@ -1930,7 +1931,6 @@ int intel_iommu_assign_device(struct dom
              "assign_device: bus = %x dev = %x func = %x\n",
              bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
 
-    pdev_flr(bus, devfn);
     reassign_device_ownership(dom0, d, bus, devfn);
 
     /* Setup rmrr identify mapping */
diff -r bac4536f5e84 -r 9f83f4f3eb5e xen/arch/x86/hvm/vmx/vtd/io.c
--- a/xen/arch/x86/hvm/vmx/vtd/io.c	Fri Feb 15 10:58:36 2008 +0800
+++ b/xen/arch/x86/hvm/vmx/vtd/io.c	Fri Feb 15 21:09:25 2008 +0800
@@ -101,7 +101,7 @@ int pt_irq_create_bind_vtd(
     intx = pt_irq_bind->u.pci.intx;
     guest_gsi = hvm_pci_intx_gsi(device, intx);
     link = hvm_pci_intx_link(device, intx);
-    set_bit(link, hvm_irq_dpci->link_map);
+    hvm_irq_dpci->link_cnt[link]++;
 
     digl = xmalloc(struct dev_intx_gsi_link);
     if ( !digl )
@@ -134,6 +134,65 @@ int pt_irq_create_bind_vtd(
     gdprintk(XENLOG_INFO VTDPREFIX,
              "VT-d irq bind: m_irq = %x device = %x intx = %x\n",
              machine_gsi, device, intx);
+    return 0;
+}
+
+int pt_irq_destroy_bind_vtd(
+    struct domain *d, xen_domctl_bind_pt_irq_t *pt_irq_bind)
+{
+    struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
+    uint32_t machine_gsi, guest_gsi;
+    uint32_t device, intx, link;
+    struct list_head *digl_list, *tmp;
+    struct dev_intx_gsi_link *digl;
+
+    if ( hvm_irq_dpci == NULL )
+        return 0;
+
+    machine_gsi = pt_irq_bind->machine_irq;
+    device = pt_irq_bind->u.pci.device;
+    intx = pt_irq_bind->u.pci.intx;
+    guest_gsi = hvm_pci_intx_gsi(device, intx);
+    link = hvm_pci_intx_link(device, intx);
+    hvm_irq_dpci->link_cnt[link]--;
+
+    gdprintk(XENLOG_INFO,
+            "pt_irq_destroy_bind_vtd: machine_gsi=%d, guest_gsi=%d, device=%d, intx=%d.\n",
+            machine_gsi, guest_gsi, device, intx);
+    memset(&hvm_irq_dpci->girq[guest_gsi], 0, sizeof(struct hvm_girq_dpci_mapping));
+
+    /* clear the mirq info */
+    if ( hvm_irq_dpci->mirq[machine_gsi].valid )
+    {
+
+        list_for_each_safe ( digl_list, tmp,
+                &hvm_irq_dpci->mirq[machine_gsi].digl_list )
+        {
+            digl = list_entry(digl_list,
+                    struct dev_intx_gsi_link, list);
+            if ( digl->device == device &&
+                 digl->intx   == intx &&
+                 digl->link   == link &&
+                 digl->gsi    == guest_gsi )
+            {
+                list_del(&digl->list);
+                xfree(digl);
+            }
+        }
+
+        if ( list_empty(&hvm_irq_dpci->mirq[machine_gsi].digl_list) )
+        {
+            pirq_guest_unbind(d, machine_gsi);
+            kill_timer(&hvm_irq_dpci->hvm_timer[irq_to_vector(machine_gsi)]);
+            hvm_irq_dpci->mirq[machine_gsi].dom   = NULL;
+            hvm_irq_dpci->mirq[machine_gsi].valid = 0;
+        }
+    }
+
+    gdprintk(XENLOG_INFO,
+             "XEN_DOMCTL_irq_unmapping: m_irq = %x device = %x intx = %x\n",
+             machine_gsi, device, intx);
+
     return 0;
 }
 
diff -r bac4536f5e84 -r 9f83f4f3eb5e xen/include/asm-x86/hvm/irq.h
--- a/xen/include/asm-x86/hvm/irq.h	Fri Feb 15 10:58:36 2008 +0800
+++ b/xen/include/asm-x86/hvm/irq.h	Fri Feb 15 21:09:25 2008 +0800
@@ -64,7 +64,7 @@ struct hvm_irq_dpci {
     /* Record of mapped ISA IRQs */
     DECLARE_BITMAP(isairq_map, NR_ISAIRQS);
     /* Record of mapped Links */
-    DECLARE_BITMAP(link_map, NR_LINK);
+    uint8_t link_cnt[NR_LINK];
     struct timer hvm_timer[NR_IRQS];
 };
 
diff -r bac4536f5e84 -r 9f83f4f3eb5e xen/include/asm-x86/iommu.h
--- a/xen/include/asm-x86/iommu.h	Fri Feb 15 10:58:36 2008 +0800
+++ b/xen/include/asm-x86/iommu.h	Fri Feb 15 21:09:25 2008 +0800
@@ -74,6 +74,9 @@ void iommu_domain_destroy(struct domain 
 void iommu_domain_destroy(struct domain *d);
 int device_assigned(u8 bus, u8 devfn);
 int assign_device(struct domain *d, u8 bus, u8 devfn);
+void reassign_device_ownership(struct domain *source,
+                               struct domain *target,
+                               u8 bus, u8 devfn);
 int iommu_map_page(struct domain *d, unsigned long gfn, unsigned long mfn);
 int iommu_unmap_page(struct domain *d, unsigned long gfn);
 void iommu_flush(struct domain *d, unsigned long gfn, u64 *p2m_entry);
@@ -83,6 +86,8 @@ int dpci_ioport_intercept(ioreq_t *p);
 int dpci_ioport_intercept(ioreq_t *p);
 int pt_irq_create_bind_vtd(struct domain *d,
                            xen_domctl_bind_pt_irq_t *pt_irq_bind);
+int pt_irq_destroy_bind_vtd(struct domain *d,
+                            xen_domctl_bind_pt_irq_t *pt_irq_bind);
 unsigned int io_apic_read_remap_rte(
     unsigned int apic, unsigned int reg);
 void io_apic_write_remap_rte(unsigned int apic,
diff -r bac4536f5e84 -r 9f83f4f3eb5e xen/include/public/domctl.h
--- a/xen/include/public/domctl.h	Fri Feb 15 10:58:36 2008 +0800
+++ b/xen/include/public/domctl.h	Fri Feb 15 21:09:25 2008 +0800
@@ -439,6 +439,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_sendt
 /* Assign PCI device to HVM guest. Sets up IOMMU structures. */
 #define XEN_DOMCTL_assign_device      37
 #define XEN_DOMCTL_test_assign_device 45
+#define XEN_DOMCTL_deassign_device 47
 struct xen_domctl_assign_device {
     uint32_t  machine_bdf;   /* machine PCI ID of assigned device */
 };
@@ -448,6 +449,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_assig
 
 /* Pass-through interrupts: bind real irq -> hvm devfn. */
 #define XEN_DOMCTL_bind_pt_irq       38
+#define XEN_DOMCTL_unbind_pt_irq     48
 typedef enum pt_irq_type_e {
     PT_IRQ_TYPE_PCI,
     PT_IRQ_TYPE_ISA
diff -r bac4536f5e84 -r 9f83f4f3eb5e xen/include/public/hvm/ioreq.h
--- a/xen/include/public/hvm/ioreq.h	Fri Feb 15 10:58:36 2008 +0800
+++ b/xen/include/public/hvm/ioreq.h	Fri Feb 15 21:09:25 2008 +0800
@@ -118,6 +118,11 @@ struct buffered_piopage {
 #define ACPI_PM1A_EVT_BLK_ADDRESS           0x0000000000001f40
 #define ACPI_PM1A_CNT_BLK_ADDRESS           (ACPI_PM1A_EVT_BLK_ADDRESS + 0x04)
 #define ACPI_PM_TMR_BLK_ADDRESS             (ACPI_PM1A_EVT_BLK_ADDRESS + 0x08)
+
+#define ACPI_GPE0_BLK_ADDRESS               (ACPI_PM_TMR_BLK_ADDRESS + 0x20)
+
+#define ACPI_GPE0_BLK_LEN                   0x08
+
 #endif /* defined(__i386__) || defined(__x86_64__) */
 
 #endif /* _IOREQ_H_ */

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-02-15 13:32 [PATCH][HVM] pass-through PCI device hotplug support Zhai, Edwin
@ 2008-02-15 14:36 ` Keir Fraser
  2008-02-15 17:19   ` Wei Wang2
  2008-02-17 15:34   ` Zhai, Edwin
  2008-02-18 12:53 ` Yosuke Iwamatsu
  1 sibling, 2 replies; 17+ messages in thread
From: Keir Fraser @ 2008-02-15 14:36 UTC (permalink / raw)
  To: Zhai, Edwin; +Cc: xen-devel

On 15/2/08 13:32, "Zhai, Edwin" <edwin.zhai@intel.com> wrote:

> This patch is the new version against 17051 to enable HVM guest VT-d device
> hotplug.
> 
> ** Currently only 2 virtual pci slots(6~7) are made as being capable of
> hotplug, 
> so more than 2 vtd dev can't be hotplugged, but we can easily extend it in
> future.

Now applied, but perhaps too hastily. I found it broke the
!CONFIG_PASSTHROUGH build and in fixing that I noticed that you dumped code
in a bunch of random places in qemu. Perhaps all passthrough stuff should be
gathered in one place? Alternatively at least the device model changes (in
piix4acpi.c) should be decoupled a bit from the backend logic in
passthrough.c, so the former can cleanly build without the latter. I also
killed pt_uninit() because I couldn't even find where pci_cleanup() was
defined. No passthrough function should be in vl.c: I #ifdef'ed in the for
now but the functions should probably be moved. And you did a big dump of
random crap into vl.h.

 -- Keir

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-02-15 14:36 ` Keir Fraser
@ 2008-02-15 17:19   ` Wei Wang2
  2008-02-15 17:33     ` Wei Wang2
  2008-02-17 15:34   ` Zhai, Edwin
  1 sibling, 1 reply; 17+ messages in thread
From: Wei Wang2 @ 2008-02-15 17:19 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel, Zhai, Edwin

[-- Attachment #1: Type: text/plain, Size: 1876 bytes --]

Keir,
c/s 17056 also works for AMD-IOMMU, attached patch introduces a new
vendor independent interface for device detachment. 
Thanks,

Wei
-- 
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy 

On Fri, 2008-02-15 at 14:36 +0000, Keir Fraser wrote:
> On 15/2/08 13:32, "Zhai, Edwin" <edwin.zhai@intel.com> wrote:
> 
> > This patch is the new version against 17051 to enable HVM guest VT-d device
> > hotplug.
> > 
> > ** Currently only 2 virtual pci slots(6~7) are made as being capable of
> > hotplug, 
> > so more than 2 vtd dev can't be hotplugged, but we can easily extend it in
> > future.
> 
> Now applied, but perhaps too hastily. I found it broke the
> !CONFIG_PASSTHROUGH build and in fixing that I noticed that you dumped code
> in a bunch of random places in qemu. Perhaps all passthrough stuff should be
> gathered in one place? Alternatively at least the device model changes (in
> piix4acpi.c) should be decoupled a bit from the backend logic in
> passthrough.c, so the former can cleanly build without the latter. I also
> killed pt_uninit() because I couldn't even find where pci_cleanup() was
> defined. No passthrough function should be in vl.c: I #ifdef'ed in the for
> now but the functions should probably be moved. And you did a big dump of
> random crap into vl.h.
> 
>  -- Keir
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
> 
> 

[-- Attachment #2: hotplugin.patch --]
[-- Type: text/plain, Size: 3237 bytes --]

diff -r 1cb8d51b4d77 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/arch/x86/domctl.c	Fri Feb 15 18:15:46 2008 +0100
@@ -601,7 +601,7 @@ long arch_do_domctl(
         if ( !device_assigned(bus, devfn) )
             break;
 
-        reassign_device_ownership(d, dom0, bus, devfn);
+        deassign_device(d, bus, devfn);
         gdprintk(XENLOG_INFO, "XEN_DOMCTL_deassign_device: bdf = %x:%x:%x\n",
             bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
         put_domain(d);
diff -r 1cb8d51b4d77 xen/arch/x86/hvm/iommu.c
--- a/xen/arch/x86/hvm/iommu.c	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/arch/x86/hvm/iommu.c	Fri Feb 15 18:15:46 2008 +0100
@@ -133,3 +133,13 @@ int iommu_unmap_page(struct domain *d, u
 
     return hd->platform_ops->unmap_page(d, gfn);
 }
+
+void deassign_device(struct domain *d, u8 bus, u8 devfn)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops)
+        return;
+
+    return hd->platform_ops->reassign_device(d, dom0, bus, devfn);
+}
diff -r 1cb8d51b4d77 xen/arch/x86/hvm/svm/amd_iommu/pci-amd-iommu.c
--- a/xen/arch/x86/hvm/svm/amd_iommu/pci-amd-iommu.c	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/arch/x86/hvm/svm/amd_iommu/pci-amd-iommu.c	Fri Feb 15 18:15:46 2008 +0100
@@ -562,10 +562,17 @@ void amd_iommu_domain_destroy(struct dom
     release_domain_devices(d);
 }
 
+void amd_iommu_return_device(struct domain *s, struct domain *t, u8 bus, u8 devfn)
+{
+    pdev_flr(bus, devfn);
+    reassign_device(s, t, bus, devfn);
+}
+
 struct iommu_ops amd_iommu_ops = {
     .init = amd_iommu_domain_init,
     .assign_device  = amd_iommu_assign_device,
     .teardown = amd_iommu_domain_destroy,
     .map_page = amd_iommu_map_page,
     .unmap_page = amd_iommu_unmap_page,
+    .reassign_device = amd_iommu_return_device,
 };
diff -r 1cb8d51b4d77 xen/arch/x86/hvm/vmx/vtd/intel-iommu.c
--- a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c	Fri Feb 15 18:15:46 2008 +0100
@@ -2164,6 +2164,7 @@ struct iommu_ops intel_iommu_ops = {
     .teardown = iommu_domain_teardown,
     .map_page = intel_iommu_map_page,
     .unmap_page = intel_iommu_unmap_page,
+    .reassign_device = reassign_device_ownership,
 };
 
 /*
diff -r 1cb8d51b4d77 xen/include/asm-x86/iommu.h
--- a/xen/include/asm-x86/iommu.h	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/include/asm-x86/iommu.h	Fri Feb 15 18:15:46 2008 +0100
@@ -74,6 +74,7 @@ void iommu_domain_destroy(struct domain 
 void iommu_domain_destroy(struct domain *d);
 int device_assigned(u8 bus, u8 devfn);
 int assign_device(struct domain *d, u8 bus, u8 devfn);
+void deassign_device(struct domain *d, u8 bus, u8 devfn);
 void reassign_device_ownership(struct domain *source,
                                struct domain *target,
                                u8 bus, u8 devfn);
@@ -102,6 +103,7 @@ struct iommu_ops {
     void (*teardown)(struct domain *d);
     int (*map_page)(struct domain *d, unsigned long gfn, unsigned long mfn);
     int (*unmap_page)(struct domain *d, unsigned long gfn);
+    void (*reassign_device)(struct domain *s, struct domain *t, u8 bus, u8 devfn);
 };
 
 #endif /* _IOMMU_H_ */

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-02-15 17:19   ` Wei Wang2
@ 2008-02-15 17:33     ` Wei Wang2
  0 siblings, 0 replies; 17+ messages in thread
From: Wei Wang2 @ 2008-02-15 17:33 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel, Zhai, Edwin

[-- Attachment #1: Type: text/plain, Size: 863 bytes --]

Adding a signed off line.

Signed-off-by: Wei Wang <wei.wang2@amd.com>
--
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy

On Fri, 2008-02-15 at 18:19 +0100, Wei Wang2 wrote:
> Keir,
> c/s 17056 also works for AMD-IOMMU, attached patch introduces a new
> vendor independent interface for device detachment. 
> Thanks,
> 
> Wei
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

[-- Attachment #2: hotplugin.patch --]
[-- Type: text/plain, Size: 3237 bytes --]

diff -r 1cb8d51b4d77 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/arch/x86/domctl.c	Fri Feb 15 18:15:46 2008 +0100
@@ -601,7 +601,7 @@ long arch_do_domctl(
         if ( !device_assigned(bus, devfn) )
             break;
 
-        reassign_device_ownership(d, dom0, bus, devfn);
+        deassign_device(d, bus, devfn);
         gdprintk(XENLOG_INFO, "XEN_DOMCTL_deassign_device: bdf = %x:%x:%x\n",
             bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
         put_domain(d);
diff -r 1cb8d51b4d77 xen/arch/x86/hvm/iommu.c
--- a/xen/arch/x86/hvm/iommu.c	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/arch/x86/hvm/iommu.c	Fri Feb 15 18:15:46 2008 +0100
@@ -133,3 +133,13 @@ int iommu_unmap_page(struct domain *d, u
 
     return hd->platform_ops->unmap_page(d, gfn);
 }
+
+void deassign_device(struct domain *d, u8 bus, u8 devfn)
+{
+    struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+    if ( !iommu_enabled || !hd->platform_ops)
+        return;
+
+    return hd->platform_ops->reassign_device(d, dom0, bus, devfn);
+}
diff -r 1cb8d51b4d77 xen/arch/x86/hvm/svm/amd_iommu/pci-amd-iommu.c
--- a/xen/arch/x86/hvm/svm/amd_iommu/pci-amd-iommu.c	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/arch/x86/hvm/svm/amd_iommu/pci-amd-iommu.c	Fri Feb 15 18:15:46 2008 +0100
@@ -562,10 +562,17 @@ void amd_iommu_domain_destroy(struct dom
     release_domain_devices(d);
 }
 
+void amd_iommu_return_device(struct domain *s, struct domain *t, u8 bus, u8 devfn)
+{
+    pdev_flr(bus, devfn);
+    reassign_device(s, t, bus, devfn);
+}
+
 struct iommu_ops amd_iommu_ops = {
     .init = amd_iommu_domain_init,
     .assign_device  = amd_iommu_assign_device,
     .teardown = amd_iommu_domain_destroy,
     .map_page = amd_iommu_map_page,
     .unmap_page = amd_iommu_unmap_page,
+    .reassign_device = amd_iommu_return_device,
 };
diff -r 1cb8d51b4d77 xen/arch/x86/hvm/vmx/vtd/intel-iommu.c
--- a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c	Fri Feb 15 18:15:46 2008 +0100
@@ -2164,6 +2164,7 @@ struct iommu_ops intel_iommu_ops = {
     .teardown = iommu_domain_teardown,
     .map_page = intel_iommu_map_page,
     .unmap_page = intel_iommu_unmap_page,
+    .reassign_device = reassign_device_ownership,
 };
 
 /*
diff -r 1cb8d51b4d77 xen/include/asm-x86/iommu.h
--- a/xen/include/asm-x86/iommu.h	Fri Feb 15 14:31:20 2008 +0000
+++ b/xen/include/asm-x86/iommu.h	Fri Feb 15 18:15:46 2008 +0100
@@ -74,6 +74,7 @@ void iommu_domain_destroy(struct domain 
 void iommu_domain_destroy(struct domain *d);
 int device_assigned(u8 bus, u8 devfn);
 int assign_device(struct domain *d, u8 bus, u8 devfn);
+void deassign_device(struct domain *d, u8 bus, u8 devfn);
 void reassign_device_ownership(struct domain *source,
                                struct domain *target,
                                u8 bus, u8 devfn);
@@ -102,6 +103,7 @@ struct iommu_ops {
     void (*teardown)(struct domain *d);
     int (*map_page)(struct domain *d, unsigned long gfn, unsigned long mfn);
     int (*unmap_page)(struct domain *d, unsigned long gfn);
+    void (*reassign_device)(struct domain *s, struct domain *t, u8 bus, u8 devfn);
 };
 
 #endif /* _IOMMU_H_ */

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-02-15 14:36 ` Keir Fraser
  2008-02-15 17:19   ` Wei Wang2
@ 2008-02-17 15:34   ` Zhai, Edwin
  2008-02-17 16:43     ` Keir Fraser
  1 sibling, 1 reply; 17+ messages in thread
From: Zhai, Edwin @ 2008-02-17 15:34 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel, Zhai, Edwin

On Fri, Feb 15, 2008 at 02:36:49PM +0000, Keir Fraser wrote:
> On 15/2/08 13:32, "Zhai, Edwin" <edwin.zhai@intel.com> wrote:
> 
> > This patch is the new version against 17051 to enable HVM guest VT-d device
> > hotplug.
> > 
> > ** Currently only 2 virtual pci slots(6~7) are made as being capable of
> > hotplug, 
> > so more than 2 vtd dev can't be hotplugged, but we can easily extend it in
> > future.
> 
> Now applied, but perhaps too hastily. I found it broke the
> !CONFIG_PASSTHROUGH build and in fixing that I noticed that you dumped code

I assumed CONFIG_PASSTHROUGH is always on by default:(
So maybe need more #ifdef.

> in a bunch of random places in qemu. Perhaps all passthrough stuff should be
> gathered in one place? Alternatively at least the device model changes (in
> piix4acpi.c) should be decoupled a bit from the backend logic in

Agree with you. passthrough.c manage all the pass-through device info, while
piix4acpi.c manage GPE & hotplug controller and call into passthough.c in some 
condition(say a IO indicating hot removal arrive). 

So at least one pair of passthrough function should be in the piix4acpi and 
ifdef'ed, but we can move all the xenstore logic to it as you said.


> passthrough.c, so the former can cleanly build without the latter. I also
> killed pt_uninit() because I couldn't even find where pci_cleanup() was

pci_cleanup() is in the libpci, which should be called for clean up in theory.  
But things goes well without it.

> defined. No passthrough function should be in vl.c: I #ifdef'ed in the for

Our plan is making this hotplug generic besides passthough device, even for 
virtual PCI device on native QEMU. So leaving do_pci_add/del in vl.c should be 
okay like do_usb_xxx.

> now but the functions should probably be moved. And you did a big dump of
> random crap into vl.h.
> 
>  -- Keir
> 
> 

-- 
best rgds,
edwin

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-02-17 15:34   ` Zhai, Edwin
@ 2008-02-17 16:43     ` Keir Fraser
  0 siblings, 0 replies; 17+ messages in thread
From: Keir Fraser @ 2008-02-17 16:43 UTC (permalink / raw)
  To: Zhai, Edwin; +Cc: xen-devel

On 17/2/08 15:34, "Zhai, Edwin" <edwin.zhai@intel.com> wrote:

>> passthrough.c, so the former can cleanly build without the latter. I also
>> killed pt_uninit() because I couldn't even find where pci_cleanup() was
> 
> pci_cleanup() is in the libpci, which should be called for clean up in theory.
> But things goes well without it.

Well, you can add it back in then.

>> defined. No passthrough function should be in vl.c: I #ifdef'ed in the for
> 
> Our plan is making this hotplug generic besides passthough device, even for
> virtual PCI device on native QEMU. So leaving do_pci_add/del in vl.c should be
> okay like do_usb_xxx.

Isn't there a generic pci source file where they might more sensibly belong?

 -- Keir

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-02-15 13:32 [PATCH][HVM] pass-through PCI device hotplug support Zhai, Edwin
  2008-02-15 14:36 ` Keir Fraser
@ 2008-02-18 12:53 ` Yosuke Iwamatsu
  2008-02-20  3:56   ` Zhai, Edwin
  1 sibling, 1 reply; 17+ messages in thread
From: Yosuke Iwamatsu @ 2008-02-18 12:53 UTC (permalink / raw)
  To: Zhai, Edwin; +Cc: xen-devel

Hi,

Just for your information,
I have been working on pass-through PCI device hotplug for PV domains,
and now pci-attach/detach for PV domains worked successfully.
I think I can submit an RFC patch in a few days.

Thanks,
-----------------
Yosuke Iwamatsu
  NEC Corporation


Zhai, Edwin wrote:
> Keir,
> 
> This patch is the new version against 17051 to enable HVM guest VT-d device 
> hotplug.
> 
> 
> ** Currently only 2 virtual pci slots(6~7) are made as being capable of hotplug, 
> so more than 2 vtd dev can't be hotplugged, but we can easily extend it in 
> future.
> 
> Three new commands are added:
> "xm pci-list domid" show the current assigned vtd device, like:
> VSlt  domain   bus   slot   func
> 0x6      0x0  0x02   0x00    0x0
> 
> "xm pci-detach" hot remove the specified vtd device by the virtual slot, like:
> xm pci-detach EdwinHVMDomainVtd 6
> 
> "xm pci-attach DomainID dom bus dev func [vslot]" hot add a new vtd device in 
> the vslot. If no vslot specified, a free slot will be picked up. e.g. to insert 
> '0000:03:00.0':
> xm pci-attach EdwinHVMDomainVtd 0 3 0 0
> 
> ** guest pci hotplug
> linux: pls. use 2.6.X and enable ACPI PCI hotplug ( Bus options=> PCI hotplug => 
> ACPI PCI hotplug driver)
> windows: 2000/xp/2003/vista are all okay
> 
> 
> Thanks a lot.
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH][HVM] pass-through PCI device hotplug support
  2008-02-18 12:53 ` Yosuke Iwamatsu
@ 2008-02-20  3:56   ` Zhai, Edwin
  2008-02-20  4:45     ` Yosuke Iwamatsu
  0 siblings, 1 reply; 17+ messages in thread
From: Zhai, Edwin @ 2008-02-20  3:56 UTC (permalink / raw)
  To: Yosuke Iwamatsu; +Cc: xen-devel, Zhai, Edwin

Thanks for you info.

Did you change the PCI dev config in xend, which is not friendly to hotplug?
(only one dev node for all pass-through devices)

Do you have a HVM PV driver for pass-through device?


Thanks,


On Mon, Feb 18, 2008 at 09:53:22PM +0900, Yosuke Iwamatsu wrote:
> Hi,
> 
> Just for your information,
> I have been working on pass-through PCI device hotplug for PV domains,
> and now pci-attach/detach for PV domains worked successfully.
> I think I can submit an RFC patch in a few days.
> 
> Thanks,
> -----------------
> Yosuke Iwamatsu
>   NEC Corporation
> 
> 
> Zhai, Edwin wrote:
> > Keir,
> > 
> > This patch is the new version against 17051 to enable HVM guest VT-d device 
> > hotplug.
> > 
> > 
> > ** Currently only 2 virtual pci slots(6~7) are made as being capable of hotplug, 
> > so more than 2 vtd dev can't be hotplugged, but we can easily extend it in 
> > future.
> > 
> > Three new commands are added:
> > "xm pci-list domid" show the current assigned vtd device, like:
> > VSlt  domain   bus   slot   func
> > 0x6      0x0  0x02   0x00    0x0
> > 
> > "xm pci-detach" hot remove the specified vtd device by the virtual slot, like:
> > xm pci-detach EdwinHVMDomainVtd 6
> > 
> > "xm pci-attach DomainID dom bus dev func [vslot]" hot add a new vtd device in 
> > the vslot. If no vslot specified, a free slot will be picked up. e.g. to insert 
> > '0000:03:00.0':
> > xm pci-attach EdwinHVMDomainVtd 0 3 0 0
> > 
> > ** guest pci hotplug
> > linux: pls. use 2.6.X and enable ACPI PCI hotplug ( Bus options=> PCI hotplug => 
> > ACPI PCI hotplug driver)
> > windows: 2000/xp/2003/vista are all okay
> > 
> > 
> > Thanks a lot.
> > 
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
> 

-- 
best rgds,
edwin

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH][HVM] pass-through PCI device hotplug support
  2008-02-20  3:56   ` Zhai, Edwin
@ 2008-02-20  4:45     ` Yosuke Iwamatsu
  0 siblings, 0 replies; 17+ messages in thread
From: Yosuke Iwamatsu @ 2008-02-20  4:45 UTC (permalink / raw)
  To: Zhai, Edwin; +Cc: xen-devel

Zhai, Edwin wrote:
> Thanks for you info.
> 
> Did you change the PCI dev config in xend, which is not friendly to hotplug?
> (only one dev node for all pass-through devices)

No, I left it as it was.

> 
> Do you have a HVM PV driver for pass-through device?

No, I included hotplug handling methods in pcifront driver
which work only on PV linux.

Thanks,
----------
     Yosuke

> 
> 
> Thanks,
> 
> 
> On Mon, Feb 18, 2008 at 09:53:22PM +0900, Yosuke Iwamatsu wrote:
>> Hi,
>>
>> Just for your information,
>> I have been working on pass-through PCI device hotplug for PV domains,
>> and now pci-attach/detach for PV domains worked successfully.
>> I think I can submit an RFC patch in a few days.
>>
>> Thanks,
>> -----------------
>> Yosuke Iwamatsu
>>   NEC Corporation
>>
>>
>> Zhai, Edwin wrote:
>>> Keir,
>>>
>>> This patch is the new version against 17051 to enable HVM guest VT-d device 
>>> hotplug.
>>>
>>>
>>> ** Currently only 2 virtual pci slots(6~7) are made as being capable of hotplug, 
>>> so more than 2 vtd dev can't be hotplugged, but we can easily extend it in 
>>> future.
>>>
>>> Three new commands are added:
>>> "xm pci-list domid" show the current assigned vtd device, like:
>>> VSlt  domain   bus   slot   func
>>> 0x6      0x0  0x02   0x00    0x0
>>>
>>> "xm pci-detach" hot remove the specified vtd device by the virtual slot, like:
>>> xm pci-detach EdwinHVMDomainVtd 6
>>>
>>> "xm pci-attach DomainID dom bus dev func [vslot]" hot add a new vtd device in 
>>> the vslot. If no vslot specified, a free slot will be picked up. e.g. to insert 
>>> '0000:03:00.0':
>>> xm pci-attach EdwinHVMDomainVtd 0 3 0 0
>>>
>>> ** guest pci hotplug
>>> linux: pls. use 2.6.X and enable ACPI PCI hotplug ( Bus options=> PCI hotplug => 
>>> ACPI PCI hotplug driver)
>>> windows: 2000/xp/2003/vista are all okay
>>>
>>>
>>> Thanks a lot.
>>>
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> Xen-devel mailing list
>>> Xen-devel@lists.xensource.com
>>> http://lists.xensource.com/xen-devel
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>>
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2008-02-20  4:45 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-02-15 13:32 [PATCH][HVM] pass-through PCI device hotplug support Zhai, Edwin
2008-02-15 14:36 ` Keir Fraser
2008-02-15 17:19   ` Wei Wang2
2008-02-15 17:33     ` Wei Wang2
2008-02-17 15:34   ` Zhai, Edwin
2008-02-17 16:43     ` Keir Fraser
2008-02-18 12:53 ` Yosuke Iwamatsu
2008-02-20  3:56   ` Zhai, Edwin
2008-02-20  4:45     ` Yosuke Iwamatsu
  -- strict thread matches above, loose matches on Subject: below --
2008-01-23 15:52 Zhai, Edwin
2008-01-24 17:57 ` Keir Fraser
2008-01-24 18:06 ` Daniel P. Berrange
2008-01-24 18:08   ` Keir Fraser
2008-01-25  1:31   ` Zhai, Edwin
2008-01-25  1:40     ` Daniel P. Berrange
2008-01-25  3:06       ` Zhai, Edwin
2008-01-25  7:41     ` Keir Fraser

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.