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_ */