From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Zhai, Edwin" Subject: [PATCH][HVM] pass-through PCI device hotplug support Date: Wed, 23 Jan 2008 23:52:09 +0800 Message-ID: <20080123155208.GA21201@edwin-srv.sh.intel.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="s/l3CgOIzMHHjg/5" Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Keir Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org --s/l3CgOIzMHHjg/5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 --s/l3CgOIzMHHjg/5 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="pass_through_hotplug_r16728.patch" Enable VTd device hotplug in HVM guest via a simple ACPI hotplug device model Signed-off-by: Edwin Zhai 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 /* 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' : ('', 'Delete a Vnet.'), 'vnet-list' : ('[-l|--long]', 'List Vnets.'), 'vtpm-list' : (' [--long]', 'List virtual TPM devices.'), + 'dpci-insert' : (' [pci-domain]', + 'Insert a new pass-through pci device.'), + 'dpci-remove' : (' ', + 'Remove a domain\'s pass-through pci device.'), + 'dpci-list' : (' [--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_ */ --s/l3CgOIzMHHjg/5 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --s/l3CgOIzMHHjg/5--