ia64/xen-unstable

changeset 13151:93667f6c5cc8

[HVM] Emulates HPET in hypervisor and extend ACPI tables.
Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
Signed-off-by: Eddie Dong <eddie.dong@intel.com>
Signed-off-by: Xiaowei Yang <xiaowei.yang@intel.com>
author kfraser@localhost.localdomain
date Thu Dec 21 12:05:34 2006 +0000 (2006-12-21)
parents 105a54bcc5c9
children 628bd9b3fe49
files tools/firmware/hvmloader/acpi/acpi2_0.h tools/firmware/hvmloader/acpi/build.c tools/firmware/hvmloader/acpi/dsdt.asl tools/firmware/hvmloader/acpi/dsdt.c xen/arch/x86/hvm/Makefile xen/arch/x86/hvm/hpet.c xen/arch/x86/hvm/hvm.c xen/arch/x86/hvm/i8254.c xen/arch/x86/hvm/intercept.c xen/include/asm-x86/hvm/vpt.h
line diff
     1.1 --- a/tools/firmware/hvmloader/acpi/acpi2_0.h	Thu Dec 21 11:33:15 2006 +0000
     1.2 +++ b/tools/firmware/hvmloader/acpi/acpi2_0.h	Thu Dec 21 12:05:34 2006 +0000
     1.3 @@ -256,6 +256,22 @@ struct acpi_20_madt {
     1.4  
     1.5  #define ACPI_2_0_MADT_REVISION 0x01
     1.6  
     1.7 +
     1.8 +/*
     1.9 + * HPET Description Table
    1.10 + */
    1.11 +struct acpi_20_hpet {
    1.12 +    struct acpi_header header;
    1.13 +    uint32_t           timer_block_id;
    1.14 +    struct acpi_20_generic_address addr;
    1.15 +    uint8_t            hpet_number;
    1.16 +    uint16_t           min_tick;
    1.17 +    uint8_t            page_protect;
    1.18 +};
    1.19 +
    1.20 +#define ACPI_2_0_HPET_REVISION 0x01
    1.21 +#define ACPI_HPET_ADDRESS 0xFED00000UL
    1.22 +
    1.23  /*
    1.24   * Multiple APIC Flags.
    1.25   */
    1.26 @@ -325,6 +341,7 @@ struct acpi_20_madt_intsrcovr {
    1.27  #define ACPI_2_0_RSDT_SIGNATURE ASCII32('R','S','D','T')
    1.28  #define ACPI_2_0_XSDT_SIGNATURE ASCII32('X','S','D','T')
    1.29  #define ACPI_2_0_TCPA_SIGNATURE ASCII32('T','C','P','A')
    1.30 +#define ACPI_2_0_HPET_SIGNATURE ASCII32('H','P','E','T')
    1.31  
    1.32  #pragma pack ()
    1.33  
     2.1 --- a/tools/firmware/hvmloader/acpi/build.c	Thu Dec 21 11:33:15 2006 +0000
     2.2 +++ b/tools/firmware/hvmloader/acpi/build.c	Thu Dec 21 12:05:34 2006 +0000
     2.3 @@ -110,10 +110,33 @@ int construct_madt(struct acpi_20_madt *
     2.4      return align16(offset);
     2.5  }
     2.6  
     2.7 +int construct_hpet(struct acpi_20_hpet *hpet)
     2.8 +{
     2.9 +    int offset;
    2.10 +
    2.11 +    memset(hpet, 0, sizeof(*hpet));
    2.12 +    hpet->header.signature    = ACPI_2_0_HPET_SIGNATURE;
    2.13 +    hpet->header.revision     = ACPI_2_0_HPET_REVISION;
    2.14 +    strncpy(hpet->header.oem_id, "INTEL ", 6);
    2.15 +    hpet->header.oem_table_id = ACPI_OEM_TABLE_ID;
    2.16 +    hpet->header.oem_revision = ACPI_OEM_REVISION;
    2.17 +    hpet->header.creator_id   = ACPI_CREATOR_ID;
    2.18 +    hpet->header.creator_revision = ACPI_CREATOR_REVISION;
    2.19 +    hpet->timer_block_id      = 0x8086a201;
    2.20 +    hpet->addr.address        = ACPI_HPET_ADDRESS;
    2.21 +    offset = sizeof(*hpet);
    2.22 +
    2.23 +    hpet->header.length = offset;
    2.24 +    set_checksum(hpet, offsetof(struct acpi_header, checksum), offset);
    2.25 +
    2.26 +    return offset;
    2.27 +}
    2.28 +
    2.29  int construct_secondary_tables(uint8_t *buf, unsigned long *table_ptrs)
    2.30  {
    2.31      int offset = 0, nr_tables = 0;
    2.32      struct acpi_20_madt *madt;
    2.33 +    struct acpi_20_hpet *hpet;
    2.34      struct acpi_20_tcpa *tcpa;
    2.35      static const uint16_t tis_signature[] = {0x0001, 0x0001, 0x0001};
    2.36      uint16_t *tis_hdr;
    2.37 @@ -126,6 +149,11 @@ int construct_secondary_tables(uint8_t *
    2.38          table_ptrs[nr_tables++] = (unsigned long)madt;
    2.39      }
    2.40  
    2.41 +    /* HPET. */
    2.42 +    hpet = (struct acpi_20_hpet *)&buf[offset];
    2.43 +    offset += construct_hpet(hpet);
    2.44 +    table_ptrs[nr_tables++] = (unsigned long)hpet;
    2.45 +
    2.46      /* TPM TCPA and SSDT. */
    2.47      tis_hdr = (uint16_t *)0xFED40F00;
    2.48      if ( (tis_hdr[0] == tis_signature[0]) &&
     3.1 --- a/tools/firmware/hvmloader/acpi/dsdt.asl	Thu Dec 21 11:33:15 2006 +0000
     3.2 +++ b/tools/firmware/hvmloader/acpi/dsdt.asl	Thu Dec 21 12:05:34 2006 +0000
     3.3 @@ -280,6 +280,22 @@ DefinitionBlock ("DSDT.aml", "DSDT", 1, 
     3.4                  }
     3.5              }
     3.6  
     3.7 +            Device(HPET) {
     3.8 +                Name(_HID,  EISAID("PNP0103"))
     3.9 +                Name(_UID, 0)
    3.10 +                Name(_CRS, ResourceTemplate() {
    3.11 +                    DWordMemory(
    3.12 +                        ResourceConsumer, PosDecode, MinFixed, MaxFixed,
    3.13 +                        NonCacheable, ReadWrite,
    3.14 +                        0x00000000,
    3.15 +                        0xFED00000,
    3.16 +                        0xFED003FF,
    3.17 +                        0x00000000,
    3.18 +                        0x00000400 /* 1K memory: FED00000 - FED003FF */
    3.19 +                    )
    3.20 +                })
    3.21 +            }
    3.22 +
    3.23              Method(_PRT,0) {
    3.24                  If(PICD) {
    3.25                      Return(PRTA)
     4.1 --- a/tools/firmware/hvmloader/acpi/dsdt.c	Thu Dec 21 11:33:15 2006 +0000
     4.2 +++ b/tools/firmware/hvmloader/acpi/dsdt.c	Thu Dec 21 12:05:34 2006 +0000
     4.3 @@ -1,19 +1,19 @@
     4.4  /*
     4.5   * 
     4.6   * Intel ACPI Component Architecture
     4.7 - * ASL Optimizing Compiler / AML Disassembler version 20050513 [Nov 16 2006]
     4.8 + * ASL Optimizing Compiler / AML Disassembler version 20050513 [Aug 11 2006]
     4.9   * Copyright (C) 2000 - 2005 Intel Corporation
    4.10   * Supports ACPI Specification Revision 3.0
    4.11   * 
    4.12 - * Compilation of "dsdt.asl" - Wed Nov 22 18:26:19 2006
    4.13 + * Compilation of "dsdt.asl" - Thu Dec 21 10:37:33 2006
    4.14   * 
    4.15   * C source code output
    4.16   *
    4.17   */
    4.18  unsigned char AmlCode[] = 
    4.19  {
    4.20 -    0x44,0x53,0x44,0x54,0x9D,0x0D,0x00,0x00,  /* 00000000    "DSDT...." */
    4.21 -    0x01,0x83,0x49,0x4E,0x54,0x45,0x4C,0x00,  /* 00000008    "..INTEL." */
    4.22 +    0x44,0x53,0x44,0x54,0xD9,0x0D,0x00,0x00,  /* 00000000    "DSDT...." */
    4.23 +    0x01,0xED,0x49,0x4E,0x54,0x45,0x4C,0x00,  /* 00000008    "..INTEL." */
    4.24      0x69,0x6E,0x74,0x2D,0x78,0x65,0x6E,0x00,  /* 00000010    "int-xen." */
    4.25      0xD6,0x07,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
    4.26      0x13,0x05,0x05,0x20,0x08,0x50,0x4D,0x42,  /* 00000020    "... .PMB" */
    4.27 @@ -34,7 +34,7 @@ unsigned char AmlCode[] =
    4.28      0x12,0x08,0x04,0x0A,0x07,0x0A,0x07,0x00,  /* 00000098    "........" */
    4.29      0x00,0x08,0x50,0x49,0x43,0x44,0x00,0x14,  /* 000000A0    "..PICD.." */
    4.30      0x0C,0x5F,0x50,0x49,0x43,0x01,0x70,0x68,  /* 000000A8    "._PIC.ph" */
    4.31 -    0x50,0x49,0x43,0x44,0x10,0x48,0xCE,0x5F,  /* 000000B0    "PICD.H._" */
    4.32 +    0x50,0x49,0x43,0x44,0x10,0x44,0xD2,0x5F,  /* 000000B0    "PICD.D._" */
    4.33      0x53,0x42,0x5F,0x5B,0x82,0x49,0x04,0x4D,  /* 000000B8    "SB_[.I.M" */
    4.34      0x45,0x4D,0x30,0x08,0x5F,0x48,0x49,0x44,  /* 000000C0    "EM0._HID" */
    4.35      0x0C,0x41,0xD0,0x0C,0x02,0x08,0x5F,0x43,  /* 000000C8    ".A...._C" */
    4.36 @@ -45,7 +45,7 @@ unsigned char AmlCode[] =
    4.37      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 000000F0    "........" */
    4.38      0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,  /* 000000F8    "........" */
    4.39      0x00,0x00,0x00,0x00,0x79,0x00,0x5B,0x82,  /* 00000100    "....y.[." */
    4.40 -    0x45,0xC9,0x50,0x43,0x49,0x30,0x08,0x5F,  /* 00000108    "E.PCI0._" */
    4.41 +    0x41,0xCD,0x50,0x43,0x49,0x30,0x08,0x5F,  /* 00000108    "A.PCI0._" */
    4.42      0x48,0x49,0x44,0x0C,0x41,0xD0,0x0A,0x03,  /* 00000110    "HID.A..." */
    4.43      0x08,0x5F,0x55,0x49,0x44,0x00,0x08,0x5F,  /* 00000118    "._UID.._" */
    4.44      0x41,0x44,0x52,0x00,0x08,0x5F,0x42,0x42,  /* 00000120    "ADR.._BB" */
    4.45 @@ -140,313 +140,321 @@ unsigned char AmlCode[] =
    4.46      0x5F,0x53,0x52,0x53,0x01,0x8B,0x68,0x01,  /* 000003E8    "_SRS..h." */
    4.47      0x49,0x52,0x51,0x31,0x82,0x49,0x52,0x51,  /* 000003F0    "IRQ1.IRQ" */
    4.48      0x31,0x60,0x76,0x60,0x70,0x60,0x50,0x49,  /* 000003F8    "1`v`p`PI" */
    4.49 -    0x52,0x44,0x14,0x16,0x5F,0x50,0x52,0x54,  /* 00000400    "RD.._PRT" */
    4.50 -    0x00,0xA0,0x0A,0x50,0x49,0x43,0x44,0xA4,  /* 00000408    "...PICD." */
    4.51 -    0x50,0x52,0x54,0x41,0xA4,0x50,0x52,0x54,  /* 00000410    "PRTA.PRT" */
    4.52 -    0x50,0x08,0x50,0x52,0x54,0x50,0x12,0x49,  /* 00000418    "P.PRTP.I" */
    4.53 -    0x36,0x3C,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000420    "6<......" */
    4.54 -    0x01,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000428    "...LNKB." */
    4.55 -    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x01,0x00,  /* 00000430    "........" */
    4.56 -    0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000438    ".LNKC..." */
    4.57 -    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x02,  /* 00000440    "........" */
    4.58 -    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000448    "LNKD...." */
    4.59 -    0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x03,0x4C,  /* 00000450    ".......L" */
    4.60 -    0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,  /* 00000458    "NKA....." */
    4.61 -    0xFF,0xFF,0x02,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000460    ".....LNK" */
    4.62 -    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000468    "C......." */
    4.63 -    0x02,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000470    "...LNKD." */
    4.64 -    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 00000478    "........" */
    4.65 -    0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000480    "..LNKA.." */
    4.66 -    0x0E,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,  /* 00000488    "........" */
    4.67 -    0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,  /* 00000490    ".LNKB..." */
    4.68 -    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x00,0x4C,  /* 00000498    ".......L" */
    4.69 -    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 000004A0    "NKD....." */
    4.70 -    0xFF,0xFF,0x03,0x00,0x01,0x4C,0x4E,0x4B,  /* 000004A8    ".....LNK" */
    4.71 -    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 000004B0    "A......." */
    4.72 -    0x03,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,  /* 000004B8    "....LNKB" */
    4.73 -    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x03,  /* 000004C0    "........" */
    4.74 -    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,  /* 000004C8    "...LNKC." */
    4.75 -    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 000004D0    "........" */
    4.76 -    0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 000004D8    ".LNKA..." */
    4.77 -    0x04,0x0C,0xFF,0xFF,0x04,0x00,0x01,0x4C,  /* 000004E0    ".......L" */
    4.78 -    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 000004E8    "NKB....." */
    4.79 -    0xFF,0xFF,0x04,0x00,0x0A,0x02,0x4C,0x4E,  /* 000004F0    "......LN" */
    4.80 -    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000004F8    "KC......" */
    4.81 -    0xFF,0x04,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 00000500    ".....LNK" */
    4.82 -    0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000508    "D......." */
    4.83 -    0x05,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000510    "...LNKB." */
    4.84 -    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x05,0x00,  /* 00000518    "........" */
    4.85 -    0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000520    ".LNKC..." */
    4.86 -    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x02,  /* 00000528    "........" */
    4.87 -    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000530    "LNKD...." */
    4.88 -    0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x03,0x4C,  /* 00000538    ".......L" */
    4.89 -    0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,  /* 00000540    "NKA....." */
    4.90 -    0xFF,0xFF,0x06,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000548    ".....LNK" */
    4.91 -    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000550    "C......." */
    4.92 -    0x06,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000558    "...LNKD." */
    4.93 -    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 00000560    "........" */
    4.94 -    0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000568    "..LNKA.." */
    4.95 -    0x0E,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,  /* 00000570    "........" */
    4.96 -    0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,  /* 00000578    ".LNKB..." */
    4.97 -    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x00,0x4C,  /* 00000580    ".......L" */
    4.98 -    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 00000588    "NKD....." */
    4.99 -    0xFF,0xFF,0x07,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000590    ".....LNK" */
   4.100 -    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000598    "A......." */
   4.101 -    0x07,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,  /* 000005A0    "....LNKB" */
   4.102 -    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x07,  /* 000005A8    "........" */
   4.103 -    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,  /* 000005B0    "...LNKC." */
   4.104 -    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 000005B8    "........" */
   4.105 -    0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 000005C0    ".LNKA..." */
   4.106 -    0x04,0x0C,0xFF,0xFF,0x08,0x00,0x01,0x4C,  /* 000005C8    ".......L" */
   4.107 -    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 000005D0    "NKB....." */
   4.108 -    0xFF,0xFF,0x08,0x00,0x0A,0x02,0x4C,0x4E,  /* 000005D8    "......LN" */
   4.109 -    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000005E0    "KC......" */
   4.110 -    0xFF,0x08,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 000005E8    ".....LNK" */
   4.111 -    0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000005F0    "D......." */
   4.112 -    0x09,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,  /* 000005F8    "...LNKB." */
   4.113 -    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x09,0x00,  /* 00000600    "........" */
   4.114 -    0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 00000608    ".LNKC..." */
   4.115 -    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x02,  /* 00000610    "........" */
   4.116 -    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000618    "LNKD...." */
   4.117 -    0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x03,0x4C,  /* 00000620    ".......L" */
   4.118 -    0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,  /* 00000628    "NKA....." */
   4.119 -    0xFF,0xFF,0x0A,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000630    ".....LNK" */
   4.120 -    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000638    "C......." */
   4.121 -    0x0A,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000640    "...LNKD." */
   4.122 -    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000648    "........" */
   4.123 -    0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000650    "..LNKA.." */
   4.124 -    0x0E,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,  /* 00000658    "........" */
   4.125 -    0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,  /* 00000660    ".LNKB..." */
   4.126 -    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x00,0x4C,  /* 00000668    ".......L" */
   4.127 -    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 00000670    "NKD....." */
   4.128 -    0xFF,0xFF,0x0B,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000678    ".....LNK" */
   4.129 -    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000680    "A......." */
   4.130 -    0x0B,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,  /* 00000688    "....LNKB" */
   4.131 -    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0B,  /* 00000690    "........" */
   4.132 -    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000698    "...LNKC." */
   4.133 -    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 000006A0    "........" */
   4.134 -    0x00,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0D,  /* 000006A8    ".LNKA..." */
   4.135 -    0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x01,0x4C,  /* 000006B0    ".......L" */
   4.136 -    0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,0x0C,  /* 000006B8    "NKB....." */
   4.137 -    0xFF,0xFF,0x0C,0x00,0x0A,0x02,0x4C,0x4E,  /* 000006C0    "......LN" */
   4.138 -    0x4B,0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000006C8    "KC......" */
   4.139 -    0xFF,0x0C,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 000006D0    ".....LNK" */
   4.140 -    0x44,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000006D8    "D......." */
   4.141 -    0x0D,0x00,0x00,0x4C,0x4E,0x4B,0x42,0x00,  /* 000006E0    "...LNKB." */
   4.142 -    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0D,0x00,  /* 000006E8    "........" */
   4.143 -    0x01,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0E,  /* 000006F0    ".LNKC..." */
   4.144 -    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x02,  /* 000006F8    "........" */
   4.145 -    0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,  /* 00000700    "LNKD...." */
   4.146 -    0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x03,0x4C,  /* 00000708    ".......L" */
   4.147 -    0x4E,0x4B,0x41,0x00,0x12,0x0D,0x04,0x0C,  /* 00000710    "NKA....." */
   4.148 -    0xFF,0xFF,0x0E,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000718    ".....LNK" */
   4.149 -    0x43,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000720    "C......." */
   4.150 -    0x0E,0x00,0x01,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000728    "...LNKD." */
   4.151 -    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000730    "........" */
   4.152 -    0x0A,0x02,0x4C,0x4E,0x4B,0x41,0x00,0x12,  /* 00000738    "..LNKA.." */
   4.153 -    0x0E,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,  /* 00000740    "........" */
   4.154 -    0x03,0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0D,  /* 00000748    ".LNKB..." */
   4.155 -    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x00,0x4C,  /* 00000750    ".......L" */
   4.156 -    0x4E,0x4B,0x44,0x00,0x12,0x0D,0x04,0x0C,  /* 00000758    "NKD....." */
   4.157 -    0xFF,0xFF,0x0F,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000760    ".....LNK" */
   4.158 -    0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000768    "A......." */
   4.159 -    0x0F,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x42,  /* 00000770    "....LNKB" */
   4.160 -    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0F,  /* 00000778    "........" */
   4.161 -    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x43,0x00,  /* 00000780    "...LNKC." */
   4.162 -    0x08,0x50,0x52,0x54,0x41,0x12,0x41,0x2F,  /* 00000788    ".PRTA.A/" */
   4.163 -    0x3C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x01,  /* 00000790    "<......." */
   4.164 -    0x00,0x00,0x00,0x0A,0x14,0x12,0x0B,0x04,  /* 00000798    "........" */
   4.165 -    0x0C,0xFF,0xFF,0x01,0x00,0x01,0x00,0x0A,  /* 000007A0    "........" */
   4.166 -    0x15,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x01,  /* 000007A8    "........" */
   4.167 -    0x00,0x0A,0x02,0x00,0x0A,0x16,0x12,0x0C,  /* 000007B0    "........" */
   4.168 -    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x03,  /* 000007B8    "........" */
   4.169 -    0x00,0x0A,0x17,0x12,0x0B,0x04,0x0C,0xFF,  /* 000007C0    "........" */
   4.170 -    0xFF,0x02,0x00,0x00,0x00,0x0A,0x18,0x12,  /* 000007C8    "........" */
   4.171 -    0x0B,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x01,  /* 000007D0    "........" */
   4.172 -    0x00,0x0A,0x19,0x12,0x0C,0x04,0x0C,0xFF,  /* 000007D8    "........" */
   4.173 -    0xFF,0x02,0x00,0x0A,0x02,0x00,0x0A,0x1A,  /* 000007E0    "........" */
   4.174 -    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 000007E8    "........" */
   4.175 -    0x0A,0x03,0x00,0x0A,0x1B,0x12,0x0B,0x04,  /* 000007F0    "........" */
   4.176 -    0x0C,0xFF,0xFF,0x03,0x00,0x00,0x00,0x0A,  /* 000007F8    "........" */
   4.177 -    0x1C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000800    "........" */
   4.178 -    0x00,0x01,0x00,0x0A,0x1D,0x12,0x0C,0x04,  /* 00000808    "........" */
   4.179 -    0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x02,0x00,  /* 00000810    "........" */
   4.180 -    0x0A,0x1E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000818    "........" */
   4.181 -    0x03,0x00,0x0A,0x03,0x00,0x0A,0x1F,0x12,  /* 00000820    "........" */
   4.182 -    0x0B,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x00,  /* 00000828    "........" */
   4.183 -    0x00,0x0A,0x20,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000830    ".. ....." */
   4.184 -    0xFF,0x04,0x00,0x01,0x00,0x0A,0x21,0x12,  /* 00000838    "......!." */
   4.185 -    0x0C,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,  /* 00000840    "........" */
   4.186 -    0x02,0x00,0x0A,0x22,0x12,0x0C,0x04,0x0C,  /* 00000848    "..."...." */
   4.187 -    0xFF,0xFF,0x04,0x00,0x0A,0x03,0x00,0x0A,  /* 00000850    "........" */
   4.188 -    0x23,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x05,  /* 00000858    "#......." */
   4.189 -    0x00,0x00,0x00,0x0A,0x24,0x12,0x0B,0x04,  /* 00000860    "....$..." */
   4.190 -    0x0C,0xFF,0xFF,0x05,0x00,0x01,0x00,0x0A,  /* 00000868    "........" */
   4.191 -    0x25,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x05,  /* 00000870    "%......." */
   4.192 -    0x00,0x0A,0x02,0x00,0x0A,0x26,0x12,0x0C,  /* 00000878    ".....&.." */
   4.193 -    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x03,  /* 00000880    "........" */
   4.194 -    0x00,0x0A,0x27,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000888    "..'....." */
   4.195 -    0xFF,0x06,0x00,0x00,0x00,0x0A,0x28,0x12,  /* 00000890    "......(." */
   4.196 -    0x0B,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x01,  /* 00000898    "........" */
   4.197 -    0x00,0x0A,0x29,0x12,0x0C,0x04,0x0C,0xFF,  /* 000008A0    "..)....." */
   4.198 -    0xFF,0x06,0x00,0x0A,0x02,0x00,0x0A,0x2A,  /* 000008A8    ".......*" */
   4.199 -    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 000008B0    "........" */
   4.200 -    0x0A,0x03,0x00,0x0A,0x2B,0x12,0x0B,0x04,  /* 000008B8    "....+..." */
   4.201 -    0x0C,0xFF,0xFF,0x07,0x00,0x00,0x00,0x0A,  /* 000008C0    "........" */
   4.202 -    0x2C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x07,  /* 000008C8    ",......." */
   4.203 -    0x00,0x01,0x00,0x0A,0x2D,0x12,0x0C,0x04,  /* 000008D0    "....-..." */
   4.204 -    0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x02,0x00,  /* 000008D8    "........" */
   4.205 -    0x0A,0x2E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 000008E0    "........" */
   4.206 -    0x07,0x00,0x0A,0x03,0x00,0x0A,0x2F,0x12,  /* 000008E8    "....../." */
   4.207 -    0x0B,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x00,  /* 000008F0    "........" */
   4.208 -    0x00,0x0A,0x11,0x12,0x0B,0x04,0x0C,0xFF,  /* 000008F8    "........" */
   4.209 -    0xFF,0x08,0x00,0x01,0x00,0x0A,0x12,0x12,  /* 00000900    "........" */
   4.210 -    0x0C,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,  /* 00000908    "........" */
   4.211 -    0x02,0x00,0x0A,0x13,0x12,0x0C,0x04,0x0C,  /* 00000910    "........" */
   4.212 -    0xFF,0xFF,0x08,0x00,0x0A,0x03,0x00,0x0A,  /* 00000918    "........" */
   4.213 -    0x14,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x09,  /* 00000920    "........" */
   4.214 -    0x00,0x00,0x00,0x0A,0x15,0x12,0x0B,0x04,  /* 00000928    "........" */
   4.215 -    0x0C,0xFF,0xFF,0x09,0x00,0x01,0x00,0x0A,  /* 00000930    "........" */
   4.216 -    0x16,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x09,  /* 00000938    "........" */
   4.217 -    0x00,0x0A,0x02,0x00,0x0A,0x17,0x12,0x0C,  /* 00000940    "........" */
   4.218 -    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x03,  /* 00000948    "........" */
   4.219 -    0x00,0x0A,0x18,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000950    "........" */
   4.220 -    0xFF,0x0A,0x00,0x00,0x00,0x0A,0x19,0x12,  /* 00000958    "........" */
   4.221 -    0x0B,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x01,  /* 00000960    "........" */
   4.222 -    0x00,0x0A,0x1A,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000968    "........" */
   4.223 -    0xFF,0x0A,0x00,0x0A,0x02,0x00,0x0A,0x1B,  /* 00000970    "........" */
   4.224 -    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000978    "........" */
   4.225 -    0x0A,0x03,0x00,0x0A,0x1C,0x12,0x0B,0x04,  /* 00000980    "........" */
   4.226 -    0x0C,0xFF,0xFF,0x0B,0x00,0x00,0x00,0x0A,  /* 00000988    "........" */
   4.227 -    0x1D,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0B,  /* 00000990    "........" */
   4.228 -    0x00,0x01,0x00,0x0A,0x1E,0x12,0x0C,0x04,  /* 00000998    "........" */
   4.229 -    0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x02,0x00,  /* 000009A0    "........" */
   4.230 -    0x0A,0x1F,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 000009A8    "........" */
   4.231 -    0x0B,0x00,0x0A,0x03,0x00,0x0A,0x20,0x12,  /* 000009B0    "...... ." */
   4.232 -    0x0B,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x00,  /* 000009B8    "........" */
   4.233 -    0x00,0x0A,0x21,0x12,0x0B,0x04,0x0C,0xFF,  /* 000009C0    "..!....." */
   4.234 -    0xFF,0x0C,0x00,0x01,0x00,0x0A,0x22,0x12,  /* 000009C8    "......"." */
   4.235 -    0x0C,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,  /* 000009D0    "........" */
   4.236 -    0x02,0x00,0x0A,0x23,0x12,0x0C,0x04,0x0C,  /* 000009D8    "...#...." */
   4.237 -    0xFF,0xFF,0x0C,0x00,0x0A,0x03,0x00,0x0A,  /* 000009E0    "........" */
   4.238 -    0x24,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0D,  /* 000009E8    "$......." */
   4.239 -    0x00,0x00,0x00,0x0A,0x25,0x12,0x0B,0x04,  /* 000009F0    "....%..." */
   4.240 -    0x0C,0xFF,0xFF,0x0D,0x00,0x01,0x00,0x0A,  /* 000009F8    "........" */
   4.241 -    0x26,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0D,  /* 00000A00    "&......." */
   4.242 -    0x00,0x0A,0x02,0x00,0x0A,0x27,0x12,0x0C,  /* 00000A08    ".....'.." */
   4.243 -    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x03,  /* 00000A10    "........" */
   4.244 -    0x00,0x0A,0x28,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000A18    "..(....." */
   4.245 -    0xFF,0x0E,0x00,0x00,0x00,0x0A,0x29,0x12,  /* 00000A20    "......)." */
   4.246 -    0x0B,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x01,  /* 00000A28    "........" */
   4.247 -    0x00,0x0A,0x2A,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000A30    "..*....." */
   4.248 -    0xFF,0x0E,0x00,0x0A,0x02,0x00,0x0A,0x2B,  /* 00000A38    ".......+" */
   4.249 -    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000A40    "........" */
   4.250 -    0x0A,0x03,0x00,0x0A,0x2C,0x12,0x0B,0x04,  /* 00000A48    "....,..." */
   4.251 -    0x0C,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x0A,  /* 00000A50    "........" */
   4.252 -    0x2D,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0F,  /* 00000A58    "-......." */
   4.253 -    0x00,0x01,0x00,0x0A,0x2E,0x12,0x0C,0x04,  /* 00000A60    "........" */
   4.254 -    0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x02,0x00,  /* 00000A68    "........" */
   4.255 -    0x0A,0x2F,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000A70    "./......" */
   4.256 -    0x0F,0x00,0x0A,0x03,0x00,0x0A,0x10,0x5B,  /* 00000A78    ".......[" */
   4.257 -    0x82,0x4C,0x31,0x49,0x53,0x41,0x5F,0x08,  /* 00000A80    ".L1ISA_." */
   4.258 -    0x5F,0x41,0x44,0x52,0x0C,0x00,0x00,0x01,  /* 00000A88    "_ADR...." */
   4.259 -    0x00,0x5B,0x80,0x50,0x49,0x52,0x51,0x02,  /* 00000A90    ".[.PIRQ." */
   4.260 -    0x0A,0x60,0x0A,0x04,0x10,0x2E,0x5C,0x00,  /* 00000A98    ".`....\." */
   4.261 -    0x5B,0x81,0x29,0x5C,0x2F,0x04,0x5F,0x53,  /* 00000AA0    "[.)\/._S" */
   4.262 -    0x42,0x5F,0x50,0x43,0x49,0x30,0x49,0x53,  /* 00000AA8    "B_PCI0IS" */
   4.263 -    0x41,0x5F,0x50,0x49,0x52,0x51,0x01,0x50,  /* 00000AB0    "A_PIRQ.P" */
   4.264 -    0x49,0x52,0x41,0x08,0x50,0x49,0x52,0x42,  /* 00000AB8    "IRA.PIRB" */
   4.265 -    0x08,0x50,0x49,0x52,0x43,0x08,0x50,0x49,  /* 00000AC0    ".PIRC.PI" */
   4.266 -    0x52,0x44,0x08,0x5B,0x82,0x46,0x0B,0x53,  /* 00000AC8    "RD.[.F.S" */
   4.267 -    0x59,0x53,0x52,0x08,0x5F,0x48,0x49,0x44,  /* 00000AD0    "YSR._HID" */
   4.268 -    0x0C,0x41,0xD0,0x0C,0x02,0x08,0x5F,0x55,  /* 00000AD8    ".A...._U" */
   4.269 -    0x49,0x44,0x01,0x08,0x43,0x52,0x53,0x5F,  /* 00000AE0    "ID..CRS_" */
   4.270 -    0x11,0x4E,0x08,0x0A,0x8A,0x47,0x01,0x10,  /* 00000AE8    ".N...G.." */
   4.271 -    0x00,0x10,0x00,0x00,0x10,0x47,0x01,0x22,  /* 00000AF0    ".....G."" */
   4.272 -    0x00,0x22,0x00,0x00,0x0C,0x47,0x01,0x30,  /* 00000AF8    "."...G.0" */
   4.273 -    0x00,0x30,0x00,0x00,0x10,0x47,0x01,0x44,  /* 00000B00    ".0...G.D" */
   4.274 -    0x00,0x44,0x00,0x00,0x1C,0x47,0x01,0x62,  /* 00000B08    ".D...G.b" */
   4.275 -    0x00,0x62,0x00,0x00,0x02,0x47,0x01,0x65,  /* 00000B10    ".b...G.e" */
   4.276 -    0x00,0x65,0x00,0x00,0x0B,0x47,0x01,0x72,  /* 00000B18    ".e...G.r" */
   4.277 -    0x00,0x72,0x00,0x00,0x0E,0x47,0x01,0x80,  /* 00000B20    ".r...G.." */
   4.278 -    0x00,0x80,0x00,0x00,0x01,0x47,0x01,0x84,  /* 00000B28    ".....G.." */
   4.279 -    0x00,0x84,0x00,0x00,0x03,0x47,0x01,0x88,  /* 00000B30    ".....G.." */
   4.280 -    0x00,0x88,0x00,0x00,0x01,0x47,0x01,0x8C,  /* 00000B38    ".....G.." */
   4.281 -    0x00,0x8C,0x00,0x00,0x03,0x47,0x01,0x90,  /* 00000B40    ".....G.." */
   4.282 -    0x00,0x90,0x00,0x00,0x10,0x47,0x01,0xA2,  /* 00000B48    ".....G.." */
   4.283 -    0x00,0xA2,0x00,0x00,0x1C,0x47,0x01,0xE0,  /* 00000B50    ".....G.." */
   4.284 -    0x00,0xE0,0x00,0x00,0x10,0x47,0x01,0xA0,  /* 00000B58    ".....G.." */
   4.285 -    0x08,0xA0,0x08,0x00,0x04,0x47,0x01,0xC0,  /* 00000B60    ".....G.." */
   4.286 -    0x0C,0xC0,0x0C,0x00,0x10,0x47,0x01,0xD0,  /* 00000B68    ".....G.." */
   4.287 -    0x04,0xD0,0x04,0x00,0x02,0x79,0x00,0x14,  /* 00000B70    ".....y.." */
   4.288 -    0x0B,0x5F,0x43,0x52,0x53,0x00,0xA4,0x43,  /* 00000B78    "._CRS..C" */
   4.289 -    0x52,0x53,0x5F,0x5B,0x82,0x2B,0x50,0x49,  /* 00000B80    "RS_[.+PI" */
   4.290 -    0x43,0x5F,0x08,0x5F,0x48,0x49,0x44,0x0B,  /* 00000B88    "C_._HID." */
   4.291 -    0x41,0xD0,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000B90    "A.._CRS." */
   4.292 -    0x18,0x0A,0x15,0x47,0x01,0x20,0x00,0x20,  /* 00000B98    "...G. . " */
   4.293 -    0x00,0x01,0x02,0x47,0x01,0xA0,0x00,0xA0,  /* 00000BA0    "...G...." */
   4.294 -    0x00,0x01,0x02,0x22,0x04,0x00,0x79,0x00,  /* 00000BA8    "..."..y." */
   4.295 -    0x5B,0x82,0x47,0x05,0x44,0x4D,0x41,0x30,  /* 00000BB0    "[.G.DMA0" */
   4.296 -    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000BB8    "._HID.A." */
   4.297 -    0x02,0x00,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000BC0    "..._CRS." */
   4.298 -    0x41,0x04,0x0A,0x3D,0x2A,0x10,0x04,0x47,  /* 00000BC8    "A..=*..G" */
   4.299 -    0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x47,  /* 00000BD0    ".......G" */
   4.300 -    0x01,0x81,0x00,0x81,0x00,0x00,0x03,0x47,  /* 00000BD8    ".......G" */
   4.301 -    0x01,0x87,0x00,0x87,0x00,0x00,0x01,0x47,  /* 00000BE0    ".......G" */
   4.302 -    0x01,0x89,0x00,0x89,0x00,0x00,0x03,0x47,  /* 00000BE8    ".......G" */
   4.303 -    0x01,0x8F,0x00,0x8F,0x00,0x00,0x01,0x47,  /* 00000BF0    ".......G" */
   4.304 -    0x01,0xC0,0x00,0xC0,0x00,0x00,0x20,0x47,  /* 00000BF8    "...... G" */
   4.305 -    0x01,0x80,0x04,0x80,0x04,0x00,0x10,0x79,  /* 00000C00    ".......y" */
   4.306 -    0x00,0x5B,0x82,0x25,0x54,0x4D,0x52,0x5F,  /* 00000C08    ".[.%TMR_" */
   4.307 -    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000C10    "._HID.A." */
   4.308 -    0x01,0x00,0x08,0x5F,0x43,0x52,0x53,0x11,  /* 00000C18    "..._CRS." */
   4.309 -    0x10,0x0A,0x0D,0x47,0x01,0x40,0x00,0x40,  /* 00000C20    "...G.@.@" */
   4.310 -    0x00,0x00,0x04,0x22,0x01,0x00,0x79,0x00,  /* 00000C28    "..."..y." */
   4.311 -    0x5B,0x82,0x25,0x52,0x54,0x43,0x5F,0x08,  /* 00000C30    "[.%RTC_." */
   4.312 -    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0B,  /* 00000C38    "_HID.A.." */
   4.313 -    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x10,  /* 00000C40    ".._CRS.." */
   4.314 -    0x0A,0x0D,0x47,0x01,0x70,0x00,0x70,0x00,  /* 00000C48    "..G.p.p." */
   4.315 -    0x00,0x02,0x22,0x00,0x01,0x79,0x00,0x5B,  /* 00000C50    ".."..y.[" */
   4.316 -    0x82,0x22,0x53,0x50,0x4B,0x52,0x08,0x5F,  /* 00000C58    "."SPKR._" */
   4.317 -    0x48,0x49,0x44,0x0C,0x41,0xD0,0x08,0x00,  /* 00000C60    "HID.A..." */
   4.318 -    0x08,0x5F,0x43,0x52,0x53,0x11,0x0D,0x0A,  /* 00000C68    "._CRS..." */
   4.319 -    0x0A,0x47,0x01,0x61,0x00,0x61,0x00,0x00,  /* 00000C70    ".G.a.a.." */
   4.320 -    0x01,0x79,0x00,0x5B,0x82,0x31,0x50,0x53,  /* 00000C78    ".y.[.1PS" */
   4.321 -    0x32,0x4D,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000C80    "2M._HID." */
   4.322 -    0x41,0xD0,0x0F,0x13,0x08,0x5F,0x43,0x49,  /* 00000C88    "A...._CI" */
   4.323 -    0x44,0x0C,0x41,0xD0,0x0F,0x13,0x14,0x09,  /* 00000C90    "D.A....." */
   4.324 -    0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,  /* 00000C98    "_STA...." */
   4.325 -    0x08,0x5F,0x43,0x52,0x53,0x11,0x08,0x0A,  /* 00000CA0    "._CRS..." */
   4.326 -    0x05,0x22,0x00,0x10,0x79,0x00,0x5B,0x82,  /* 00000CA8    "."..y.[." */
   4.327 -    0x42,0x04,0x50,0x53,0x32,0x4B,0x08,0x5F,  /* 00000CB0    "B.PS2K._" */
   4.328 -    0x48,0x49,0x44,0x0C,0x41,0xD0,0x03,0x03,  /* 00000CB8    "HID.A..." */
   4.329 -    0x08,0x5F,0x43,0x49,0x44,0x0C,0x41,0xD0,  /* 00000CC0    "._CID.A." */
   4.330 -    0x03,0x0B,0x14,0x09,0x5F,0x53,0x54,0x41,  /* 00000CC8    "...._STA" */
   4.331 -    0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,  /* 00000CD0    "....._CR" */
   4.332 -    0x53,0x11,0x18,0x0A,0x15,0x47,0x01,0x60,  /* 00000CD8    "S....G.`" */
   4.333 -    0x00,0x60,0x00,0x00,0x01,0x47,0x01,0x64,  /* 00000CE0    ".`...G.d" */
   4.334 -    0x00,0x64,0x00,0x00,0x01,0x22,0x02,0x00,  /* 00000CE8    ".d...".." */
   4.335 -    0x79,0x00,0x5B,0x82,0x3A,0x46,0x44,0x43,  /* 00000CF0    "y.[.:FDC" */
   4.336 -    0x30,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000CF8    "0._HID.A" */
   4.337 -    0xD0,0x07,0x00,0x14,0x09,0x5F,0x53,0x54,  /* 00000D00    "....._ST" */
   4.338 -    0x41,0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,  /* 00000D08    "A....._C" */
   4.339 -    0x52,0x53,0x11,0x1B,0x0A,0x18,0x47,0x01,  /* 00000D10    "RS....G." */
   4.340 -    0xF0,0x03,0xF0,0x03,0x01,0x06,0x47,0x01,  /* 00000D18    "......G." */
   4.341 -    0xF7,0x03,0xF7,0x03,0x01,0x01,0x22,0x40,  /* 00000D20    "......"@" */
   4.342 -    0x00,0x2A,0x04,0x00,0x79,0x00,0x5B,0x82,  /* 00000D28    ".*..y.[." */
   4.343 -    0x35,0x55,0x41,0x52,0x31,0x08,0x5F,0x48,  /* 00000D30    "5UAR1._H" */
   4.344 -    0x49,0x44,0x0C,0x41,0xD0,0x05,0x01,0x08,  /* 00000D38    "ID.A...." */
   4.345 -    0x5F,0x55,0x49,0x44,0x01,0x14,0x09,0x5F,  /* 00000D40    "_UID..._" */
   4.346 -    0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,  /* 00000D48    "STA....." */
   4.347 -    0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,  /* 00000D50    "_CRS...." */
   4.348 -    0x47,0x01,0xF8,0x03,0xF8,0x03,0x01,0x08,  /* 00000D58    "G......." */
   4.349 -    0x22,0x10,0x00,0x79,0x00,0x5B,0x82,0x36,  /* 00000D60    ""..y.[.6" */
   4.350 -    0x4C,0x54,0x50,0x31,0x08,0x5F,0x48,0x49,  /* 00000D68    "LTP1._HI" */
   4.351 -    0x44,0x0C,0x41,0xD0,0x04,0x00,0x08,0x5F,  /* 00000D70    "D.A...._" */
   4.352 -    0x55,0x49,0x44,0x0A,0x02,0x14,0x09,0x5F,  /* 00000D78    "UID...._" */
   4.353 -    0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x08,  /* 00000D80    "STA....." */
   4.354 -    0x5F,0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,  /* 00000D88    "_CRS...." */
   4.355 -    0x47,0x01,0x78,0x03,0x78,0x03,0x08,0x08,  /* 00000D90    "G.x.x..." */
   4.356 -    0x22,0x80,0x00,0x79,0x00,
   4.357 +    0x52,0x44,0x5B,0x82,0x3A,0x48,0x50,0x45,  /* 00000400    "RD[.:HPE" */
   4.358 +    0x54,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000408    "T._HID.A" */
   4.359 +    0xD0,0x01,0x03,0x08,0x5F,0x55,0x49,0x44,  /* 00000410    "...._UID" */
   4.360 +    0x00,0x08,0x5F,0x43,0x52,0x53,0x11,0x1F,  /* 00000418    ".._CRS.." */
   4.361 +    0x0A,0x1C,0x87,0x17,0x00,0x00,0x0D,0x01,  /* 00000420    "........" */
   4.362 +    0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0xFE,  /* 00000428    "........" */
   4.363 +    0xFF,0x03,0xD0,0xFE,0x00,0x00,0x00,0x00,  /* 00000430    "........" */
   4.364 +    0x00,0x04,0x00,0x00,0x79,0x00,0x14,0x16,  /* 00000438    "....y..." */
   4.365 +    0x5F,0x50,0x52,0x54,0x00,0xA0,0x0A,0x50,  /* 00000440    "_PRT...P" */
   4.366 +    0x49,0x43,0x44,0xA4,0x50,0x52,0x54,0x41,  /* 00000448    "ICD.PRTA" */
   4.367 +    0xA4,0x50,0x52,0x54,0x50,0x08,0x50,0x52,  /* 00000450    ".PRTP.PR" */
   4.368 +    0x54,0x50,0x12,0x49,0x36,0x3C,0x12,0x0D,  /* 00000458    "TP.I6<.." */
   4.369 +    0x04,0x0C,0xFF,0xFF,0x01,0x00,0x00,0x4C,  /* 00000460    ".......L" */
   4.370 +    0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,  /* 00000468    "NKB....." */
   4.371 +    0xFF,0xFF,0x01,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000470    ".....LNK" */
   4.372 +    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000478    "C......." */
   4.373 +    0x01,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,  /* 00000480    "....LNKD" */
   4.374 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x01,  /* 00000488    "........" */
   4.375 +    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,  /* 00000490    "...LNKA." */
   4.376 +    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x02,0x00,  /* 00000498    "........" */
   4.377 +    0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,  /* 000004A0    ".LNKC..." */
   4.378 +    0x04,0x0C,0xFF,0xFF,0x02,0x00,0x01,0x4C,  /* 000004A8    ".......L" */
   4.379 +    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 000004B0    "NKD....." */
   4.380 +    0xFF,0xFF,0x02,0x00,0x0A,0x02,0x4C,0x4E,  /* 000004B8    "......LN" */
   4.381 +    0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000004C0    "KA......" */
   4.382 +    0xFF,0x02,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 000004C8    ".....LNK" */
   4.383 +    0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000004D0    "B......." */
   4.384 +    0x03,0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,  /* 000004D8    "...LNKD." */
   4.385 +    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x03,0x00,  /* 000004E0    "........" */
   4.386 +    0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000004E8    ".LNKA..." */
   4.387 +    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x02,  /* 000004F0    "........" */
   4.388 +    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,  /* 000004F8    "LNKB...." */
   4.389 +    0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x03,0x4C,  /* 00000500    ".......L" */
   4.390 +    0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,  /* 00000508    "NKC....." */
   4.391 +    0xFF,0xFF,0x04,0x00,0x00,0x4C,0x4E,0x4B,  /* 00000510    ".....LNK" */
   4.392 +    0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000518    "A......." */
   4.393 +    0x04,0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000520    "...LNKB." */
   4.394 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 00000528    "........" */
   4.395 +    0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000530    "..LNKC.." */
   4.396 +    0x0E,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x0A,  /* 00000538    "........" */
   4.397 +    0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,  /* 00000540    ".LNKD..." */
   4.398 +    0x04,0x0C,0xFF,0xFF,0x05,0x00,0x00,0x4C,  /* 00000548    ".......L" */
   4.399 +    0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,  /* 00000550    "NKB....." */
   4.400 +    0xFF,0xFF,0x05,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000558    ".....LNK" */
   4.401 +    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000560    "C......." */
   4.402 +    0x05,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,  /* 00000568    "....LNKD" */
   4.403 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x05,  /* 00000570    "........" */
   4.404 +    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,  /* 00000578    "...LNKA." */
   4.405 +    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x06,0x00,  /* 00000580    "........" */
   4.406 +    0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,  /* 00000588    ".LNKC..." */
   4.407 +    0x04,0x0C,0xFF,0xFF,0x06,0x00,0x01,0x4C,  /* 00000590    ".......L" */
   4.408 +    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 00000598    "NKD....." */
   4.409 +    0xFF,0xFF,0x06,0x00,0x0A,0x02,0x4C,0x4E,  /* 000005A0    "......LN" */
   4.410 +    0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 000005A8    "KA......" */
   4.411 +    0xFF,0x06,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 000005B0    ".....LNK" */
   4.412 +    0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000005B8    "B......." */
   4.413 +    0x07,0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,  /* 000005C0    "...LNKD." */
   4.414 +    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x07,0x00,  /* 000005C8    "........" */
   4.415 +    0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000005D0    ".LNKA..." */
   4.416 +    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x02,  /* 000005D8    "........" */
   4.417 +    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,  /* 000005E0    "LNKB...." */
   4.418 +    0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x03,0x4C,  /* 000005E8    ".......L" */
   4.419 +    0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,  /* 000005F0    "NKC....." */
   4.420 +    0xFF,0xFF,0x08,0x00,0x00,0x4C,0x4E,0x4B,  /* 000005F8    ".....LNK" */
   4.421 +    0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000600    "A......." */
   4.422 +    0x08,0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,  /* 00000608    "...LNKB." */
   4.423 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 00000610    "........" */
   4.424 +    0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000618    "..LNKC.." */
   4.425 +    0x0E,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x0A,  /* 00000620    "........" */
   4.426 +    0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,  /* 00000628    ".LNKD..." */
   4.427 +    0x04,0x0C,0xFF,0xFF,0x09,0x00,0x00,0x4C,  /* 00000630    ".......L" */
   4.428 +    0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,  /* 00000638    "NKB....." */
   4.429 +    0xFF,0xFF,0x09,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000640    ".....LNK" */
   4.430 +    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000648    "C......." */
   4.431 +    0x09,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,  /* 00000650    "....LNKD" */
   4.432 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x09,  /* 00000658    "........" */
   4.433 +    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,  /* 00000660    "...LNKA." */
   4.434 +    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0A,0x00,  /* 00000668    "........" */
   4.435 +    0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,  /* 00000670    ".LNKC..." */
   4.436 +    0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x01,0x4C,  /* 00000678    ".......L" */
   4.437 +    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 00000680    "NKD....." */
   4.438 +    0xFF,0xFF,0x0A,0x00,0x0A,0x02,0x4C,0x4E,  /* 00000688    "......LN" */
   4.439 +    0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000690    "KA......" */
   4.440 +    0xFF,0x0A,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 00000698    ".....LNK" */
   4.441 +    0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000006A0    "B......." */
   4.442 +    0x0B,0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,  /* 000006A8    "...LNKD." */
   4.443 +    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0B,0x00,  /* 000006B0    "........" */
   4.444 +    0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000006B8    ".LNKA..." */
   4.445 +    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x02,  /* 000006C0    "........" */
   4.446 +    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,  /* 000006C8    "LNKB...." */
   4.447 +    0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x03,0x4C,  /* 000006D0    ".......L" */
   4.448 +    0x4E,0x4B,0x43,0x00,0x12,0x0D,0x04,0x0C,  /* 000006D8    "NKC....." */
   4.449 +    0xFF,0xFF,0x0C,0x00,0x00,0x4C,0x4E,0x4B,  /* 000006E0    ".....LNK" */
   4.450 +    0x41,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 000006E8    "A......." */
   4.451 +    0x0C,0x00,0x01,0x4C,0x4E,0x4B,0x42,0x00,  /* 000006F0    "...LNKB." */
   4.452 +    0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 000006F8    "........" */
   4.453 +    0x0A,0x02,0x4C,0x4E,0x4B,0x43,0x00,0x12,  /* 00000700    "..LNKC.." */
   4.454 +    0x0E,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x0A,  /* 00000708    "........" */
   4.455 +    0x03,0x4C,0x4E,0x4B,0x44,0x00,0x12,0x0D,  /* 00000710    ".LNKD..." */
   4.456 +    0x04,0x0C,0xFF,0xFF,0x0D,0x00,0x00,0x4C,  /* 00000718    ".......L" */
   4.457 +    0x4E,0x4B,0x42,0x00,0x12,0x0D,0x04,0x0C,  /* 00000720    "NKB....." */
   4.458 +    0xFF,0xFF,0x0D,0x00,0x01,0x4C,0x4E,0x4B,  /* 00000728    ".....LNK" */
   4.459 +    0x43,0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,  /* 00000730    "C......." */
   4.460 +    0x0D,0x00,0x0A,0x02,0x4C,0x4E,0x4B,0x44,  /* 00000738    "....LNKD" */
   4.461 +    0x00,0x12,0x0E,0x04,0x0C,0xFF,0xFF,0x0D,  /* 00000740    "........" */
   4.462 +    0x00,0x0A,0x03,0x4C,0x4E,0x4B,0x41,0x00,  /* 00000748    "...LNKA." */
   4.463 +    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0E,0x00,  /* 00000750    "........" */
   4.464 +    0x00,0x4C,0x4E,0x4B,0x43,0x00,0x12,0x0D,  /* 00000758    ".LNKC..." */
   4.465 +    0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x01,0x4C,  /* 00000760    ".......L" */
   4.466 +    0x4E,0x4B,0x44,0x00,0x12,0x0E,0x04,0x0C,  /* 00000768    "NKD....." */
   4.467 +    0xFF,0xFF,0x0E,0x00,0x0A,0x02,0x4C,0x4E,  /* 00000770    "......LN" */
   4.468 +    0x4B,0x41,0x00,0x12,0x0E,0x04,0x0C,0xFF,  /* 00000778    "KA......" */
   4.469 +    0xFF,0x0E,0x00,0x0A,0x03,0x4C,0x4E,0x4B,  /* 00000780    ".....LNK" */
   4.470 +    0x42,0x00,0x12,0x0D,0x04,0x0C,0xFF,0xFF,  /* 00000788    "B......." */
   4.471 +    0x0F,0x00,0x00,0x4C,0x4E,0x4B,0x44,0x00,  /* 00000790    "...LNKD." */
   4.472 +    0x12,0x0D,0x04,0x0C,0xFF,0xFF,0x0F,0x00,  /* 00000798    "........" */
   4.473 +    0x01,0x4C,0x4E,0x4B,0x41,0x00,0x12,0x0E,  /* 000007A0    ".LNKA..." */
   4.474 +    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x02,  /* 000007A8    "........" */
   4.475 +    0x4C,0x4E,0x4B,0x42,0x00,0x12,0x0E,0x04,  /* 000007B0    "LNKB...." */
   4.476 +    0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x03,0x4C,  /* 000007B8    ".......L" */
   4.477 +    0x4E,0x4B,0x43,0x00,0x08,0x50,0x52,0x54,  /* 000007C0    "NKC..PRT" */
   4.478 +    0x41,0x12,0x41,0x2F,0x3C,0x12,0x0B,0x04,  /* 000007C8    "A.A/<..." */
   4.479 +    0x0C,0xFF,0xFF,0x01,0x00,0x00,0x00,0x0A,  /* 000007D0    "........" */
   4.480 +    0x14,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x01,  /* 000007D8    "........" */
   4.481 +    0x00,0x01,0x00,0x0A,0x15,0x12,0x0C,0x04,  /* 000007E0    "........" */
   4.482 +    0x0C,0xFF,0xFF,0x01,0x00,0x0A,0x02,0x00,  /* 000007E8    "........" */
   4.483 +    0x0A,0x16,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 000007F0    "........" */
   4.484 +    0x01,0x00,0x0A,0x03,0x00,0x0A,0x17,0x12,  /* 000007F8    "........" */
   4.485 +    0x0B,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x00,  /* 00000800    "........" */
   4.486 +    0x00,0x0A,0x18,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000808    "........" */
   4.487 +    0xFF,0x02,0x00,0x01,0x00,0x0A,0x19,0x12,  /* 00000810    "........" */
   4.488 +    0x0C,0x04,0x0C,0xFF,0xFF,0x02,0x00,0x0A,  /* 00000818    "........" */
   4.489 +    0x02,0x00,0x0A,0x1A,0x12,0x0C,0x04,0x0C,  /* 00000820    "........" */
   4.490 +    0xFF,0xFF,0x02,0x00,0x0A,0x03,0x00,0x0A,  /* 00000828    "........" */
   4.491 +    0x1B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000830    "........" */
   4.492 +    0x00,0x00,0x00,0x0A,0x1C,0x12,0x0B,0x04,  /* 00000838    "........" */
   4.493 +    0x0C,0xFF,0xFF,0x03,0x00,0x01,0x00,0x0A,  /* 00000840    "........" */
   4.494 +    0x1D,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x03,  /* 00000848    "........" */
   4.495 +    0x00,0x0A,0x02,0x00,0x0A,0x1E,0x12,0x0C,  /* 00000850    "........" */
   4.496 +    0x04,0x0C,0xFF,0xFF,0x03,0x00,0x0A,0x03,  /* 00000858    "........" */
   4.497 +    0x00,0x0A,0x1F,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000860    "........" */
   4.498 +    0xFF,0x04,0x00,0x00,0x00,0x0A,0x20,0x12,  /* 00000868    "...... ." */
   4.499 +    0x0B,0x04,0x0C,0xFF,0xFF,0x04,0x00,0x01,  /* 00000870    "........" */
   4.500 +    0x00,0x0A,0x21,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000878    "..!....." */
   4.501 +    0xFF,0x04,0x00,0x0A,0x02,0x00,0x0A,0x22,  /* 00000880    "......."" */
   4.502 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x04,0x00,  /* 00000888    "........" */
   4.503 +    0x0A,0x03,0x00,0x0A,0x23,0x12,0x0B,0x04,  /* 00000890    "....#..." */
   4.504 +    0x0C,0xFF,0xFF,0x05,0x00,0x00,0x00,0x0A,  /* 00000898    "........" */
   4.505 +    0x24,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x05,  /* 000008A0    "$......." */
   4.506 +    0x00,0x01,0x00,0x0A,0x25,0x12,0x0C,0x04,  /* 000008A8    "....%..." */
   4.507 +    0x0C,0xFF,0xFF,0x05,0x00,0x0A,0x02,0x00,  /* 000008B0    "........" */
   4.508 +    0x0A,0x26,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 000008B8    ".&......" */
   4.509 +    0x05,0x00,0x0A,0x03,0x00,0x0A,0x27,0x12,  /* 000008C0    "......'." */
   4.510 +    0x0B,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x00,  /* 000008C8    "........" */
   4.511 +    0x00,0x0A,0x28,0x12,0x0B,0x04,0x0C,0xFF,  /* 000008D0    "..(....." */
   4.512 +    0xFF,0x06,0x00,0x01,0x00,0x0A,0x29,0x12,  /* 000008D8    "......)." */
   4.513 +    0x0C,0x04,0x0C,0xFF,0xFF,0x06,0x00,0x0A,  /* 000008E0    "........" */
   4.514 +    0x02,0x00,0x0A,0x2A,0x12,0x0C,0x04,0x0C,  /* 000008E8    "...*...." */
   4.515 +    0xFF,0xFF,0x06,0x00,0x0A,0x03,0x00,0x0A,  /* 000008F0    "........" */
   4.516 +    0x2B,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x07,  /* 000008F8    "+......." */
   4.517 +    0x00,0x00,0x00,0x0A,0x2C,0x12,0x0B,0x04,  /* 00000900    "....,..." */
   4.518 +    0x0C,0xFF,0xFF,0x07,0x00,0x01,0x00,0x0A,  /* 00000908    "........" */
   4.519 +    0x2D,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x07,  /* 00000910    "-......." */
   4.520 +    0x00,0x0A,0x02,0x00,0x0A,0x2E,0x12,0x0C,  /* 00000918    "........" */
   4.521 +    0x04,0x0C,0xFF,0xFF,0x07,0x00,0x0A,0x03,  /* 00000920    "........" */
   4.522 +    0x00,0x0A,0x2F,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000928    "../....." */
   4.523 +    0xFF,0x08,0x00,0x00,0x00,0x0A,0x11,0x12,  /* 00000930    "........" */
   4.524 +    0x0B,0x04,0x0C,0xFF,0xFF,0x08,0x00,0x01,  /* 00000938    "........" */
   4.525 +    0x00,0x0A,0x12,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000940    "........" */
   4.526 +    0xFF,0x08,0x00,0x0A,0x02,0x00,0x0A,0x13,  /* 00000948    "........" */
   4.527 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x08,0x00,  /* 00000950    "........" */
   4.528 +    0x0A,0x03,0x00,0x0A,0x14,0x12,0x0B,0x04,  /* 00000958    "........" */
   4.529 +    0x0C,0xFF,0xFF,0x09,0x00,0x00,0x00,0x0A,  /* 00000960    "........" */
   4.530 +    0x15,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x09,  /* 00000968    "........" */
   4.531 +    0x00,0x01,0x00,0x0A,0x16,0x12,0x0C,0x04,  /* 00000970    "........" */
   4.532 +    0x0C,0xFF,0xFF,0x09,0x00,0x0A,0x02,0x00,  /* 00000978    "........" */
   4.533 +    0x0A,0x17,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000980    "........" */
   4.534 +    0x09,0x00,0x0A,0x03,0x00,0x0A,0x18,0x12,  /* 00000988    "........" */
   4.535 +    0x0B,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x00,  /* 00000990    "........" */
   4.536 +    0x00,0x0A,0x19,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000998    "........" */
   4.537 +    0xFF,0x0A,0x00,0x01,0x00,0x0A,0x1A,0x12,  /* 000009A0    "........" */
   4.538 +    0x0C,0x04,0x0C,0xFF,0xFF,0x0A,0x00,0x0A,  /* 000009A8    "........" */
   4.539 +    0x02,0x00,0x0A,0x1B,0x12,0x0C,0x04,0x0C,  /* 000009B0    "........" */
   4.540 +    0xFF,0xFF,0x0A,0x00,0x0A,0x03,0x00,0x0A,  /* 000009B8    "........" */
   4.541 +    0x1C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0B,  /* 000009C0    "........" */
   4.542 +    0x00,0x00,0x00,0x0A,0x1D,0x12,0x0B,0x04,  /* 000009C8    "........" */
   4.543 +    0x0C,0xFF,0xFF,0x0B,0x00,0x01,0x00,0x0A,  /* 000009D0    "........" */
   4.544 +    0x1E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0B,  /* 000009D8    "........" */
   4.545 +    0x00,0x0A,0x02,0x00,0x0A,0x1F,0x12,0x0C,  /* 000009E0    "........" */
   4.546 +    0x04,0x0C,0xFF,0xFF,0x0B,0x00,0x0A,0x03,  /* 000009E8    "........" */
   4.547 +    0x00,0x0A,0x20,0x12,0x0B,0x04,0x0C,0xFF,  /* 000009F0    ".. ....." */
   4.548 +    0xFF,0x0C,0x00,0x00,0x00,0x0A,0x21,0x12,  /* 000009F8    "......!." */
   4.549 +    0x0B,0x04,0x0C,0xFF,0xFF,0x0C,0x00,0x01,  /* 00000A00    "........" */
   4.550 +    0x00,0x0A,0x22,0x12,0x0C,0x04,0x0C,0xFF,  /* 00000A08    ".."....." */
   4.551 +    0xFF,0x0C,0x00,0x0A,0x02,0x00,0x0A,0x23,  /* 00000A10    ".......#" */
   4.552 +    0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0C,0x00,  /* 00000A18    "........" */
   4.553 +    0x0A,0x03,0x00,0x0A,0x24,0x12,0x0B,0x04,  /* 00000A20    "....$..." */
   4.554 +    0x0C,0xFF,0xFF,0x0D,0x00,0x00,0x00,0x0A,  /* 00000A28    "........" */
   4.555 +    0x25,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0D,  /* 00000A30    "%......." */
   4.556 +    0x00,0x01,0x00,0x0A,0x26,0x12,0x0C,0x04,  /* 00000A38    "....&..." */
   4.557 +    0x0C,0xFF,0xFF,0x0D,0x00,0x0A,0x02,0x00,  /* 00000A40    "........" */
   4.558 +    0x0A,0x27,0x12,0x0C,0x04,0x0C,0xFF,0xFF,  /* 00000A48    ".'......" */
   4.559 +    0x0D,0x00,0x0A,0x03,0x00,0x0A,0x28,0x12,  /* 00000A50    "......(." */
   4.560 +    0x0B,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x00,  /* 00000A58    "........" */
   4.561 +    0x00,0x0A,0x29,0x12,0x0B,0x04,0x0C,0xFF,  /* 00000A60    "..)....." */
   4.562 +    0xFF,0x0E,0x00,0x01,0x00,0x0A,0x2A,0x12,  /* 00000A68    "......*." */
   4.563 +    0x0C,0x04,0x0C,0xFF,0xFF,0x0E,0x00,0x0A,  /* 00000A70    "........" */
   4.564 +    0x02,0x00,0x0A,0x2B,0x12,0x0C,0x04,0x0C,  /* 00000A78    "...+...." */
   4.565 +    0xFF,0xFF,0x0E,0x00,0x0A,0x03,0x00,0x0A,  /* 00000A80    "........" */
   4.566 +    0x2C,0x12,0x0B,0x04,0x0C,0xFF,0xFF,0x0F,  /* 00000A88    ",......." */
   4.567 +    0x00,0x00,0x00,0x0A,0x2D,0x12,0x0B,0x04,  /* 00000A90    "....-..." */
   4.568 +    0x0C,0xFF,0xFF,0x0F,0x00,0x01,0x00,0x0A,  /* 00000A98    "........" */
   4.569 +    0x2E,0x12,0x0C,0x04,0x0C,0xFF,0xFF,0x0F,  /* 00000AA0    "........" */
   4.570 +    0x00,0x0A,0x02,0x00,0x0A,0x2F,0x12,0x0C,  /* 00000AA8    "...../.." */
   4.571 +    0x04,0x0C,0xFF,0xFF,0x0F,0x00,0x0A,0x03,  /* 00000AB0    "........" */
   4.572 +    0x00,0x0A,0x10,0x5B,0x82,0x4C,0x31,0x49,  /* 00000AB8    "...[.L1I" */
   4.573 +    0x53,0x41,0x5F,0x08,0x5F,0x41,0x44,0x52,  /* 00000AC0    "SA_._ADR" */
   4.574 +    0x0C,0x00,0x00,0x01,0x00,0x5B,0x80,0x50,  /* 00000AC8    ".....[.P" */
   4.575 +    0x49,0x52,0x51,0x02,0x0A,0x60,0x0A,0x04,  /* 00000AD0    "IRQ..`.." */
   4.576 +    0x10,0x2E,0x5C,0x00,0x5B,0x81,0x29,0x5C,  /* 00000AD8    "..\.[.)\" */
   4.577 +    0x2F,0x04,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00000AE0    "/._SB_PC" */
   4.578 +    0x49,0x30,0x49,0x53,0x41,0x5F,0x50,0x49,  /* 00000AE8    "I0ISA_PI" */
   4.579 +    0x52,0x51,0x01,0x50,0x49,0x52,0x41,0x08,  /* 00000AF0    "RQ.PIRA." */
   4.580 +    0x50,0x49,0x52,0x42,0x08,0x50,0x49,0x52,  /* 00000AF8    "PIRB.PIR" */
   4.581 +    0x43,0x08,0x50,0x49,0x52,0x44,0x08,0x5B,  /* 00000B00    "C.PIRD.[" */
   4.582 +    0x82,0x46,0x0B,0x53,0x59,0x53,0x52,0x08,  /* 00000B08    ".F.SYSR." */
   4.583 +    0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,  /* 00000B10    "_HID.A.." */
   4.584 +    0x02,0x08,0x5F,0x55,0x49,0x44,0x01,0x08,  /* 00000B18    ".._UID.." */
   4.585 +    0x43,0x52,0x53,0x5F,0x11,0x4E,0x08,0x0A,  /* 00000B20    "CRS_.N.." */
   4.586 +    0x8A,0x47,0x01,0x10,0x00,0x10,0x00,0x00,  /* 00000B28    ".G......" */
   4.587 +    0x10,0x47,0x01,0x22,0x00,0x22,0x00,0x00,  /* 00000B30    ".G.".".." */
   4.588 +    0x0C,0x47,0x01,0x30,0x00,0x30,0x00,0x00,  /* 00000B38    ".G.0.0.." */
   4.589 +    0x10,0x47,0x01,0x44,0x00,0x44,0x00,0x00,  /* 00000B40    ".G.D.D.." */
   4.590 +    0x1C,0x47,0x01,0x62,0x00,0x62,0x00,0x00,  /* 00000B48    ".G.b.b.." */
   4.591 +    0x02,0x47,0x01,0x65,0x00,0x65,0x00,0x00,  /* 00000B50    ".G.e.e.." */
   4.592 +    0x0B,0x47,0x01,0x72,0x00,0x72,0x00,0x00,  /* 00000B58    ".G.r.r.." */
   4.593 +    0x0E,0x47,0x01,0x80,0x00,0x80,0x00,0x00,  /* 00000B60    ".G......" */
   4.594 +    0x01,0x47,0x01,0x84,0x00,0x84,0x00,0x00,  /* 00000B68    ".G......" */
   4.595 +    0x03,0x47,0x01,0x88,0x00,0x88,0x00,0x00,  /* 00000B70    ".G......" */
   4.596 +    0x01,0x47,0x01,0x8C,0x00,0x8C,0x00,0x00,  /* 00000B78    ".G......" */
   4.597 +    0x03,0x47,0x01,0x90,0x00,0x90,0x00,0x00,  /* 00000B80    ".G......" */
   4.598 +    0x10,0x47,0x01,0xA2,0x00,0xA2,0x00,0x00,  /* 00000B88    ".G......" */
   4.599 +    0x1C,0x47,0x01,0xE0,0x00,0xE0,0x00,0x00,  /* 00000B90    ".G......" */
   4.600 +    0x10,0x47,0x01,0xA0,0x08,0xA0,0x08,0x00,  /* 00000B98    ".G......" */
   4.601 +    0x04,0x47,0x01,0xC0,0x0C,0xC0,0x0C,0x00,  /* 00000BA0    ".G......" */
   4.602 +    0x10,0x47,0x01,0xD0,0x04,0xD0,0x04,0x00,  /* 00000BA8    ".G......" */
   4.603 +    0x02,0x79,0x00,0x14,0x0B,0x5F,0x43,0x52,  /* 00000BB0    ".y..._CR" */
   4.604 +    0x53,0x00,0xA4,0x43,0x52,0x53,0x5F,0x5B,  /* 00000BB8    "S..CRS_[" */
   4.605 +    0x82,0x2B,0x50,0x49,0x43,0x5F,0x08,0x5F,  /* 00000BC0    ".+PIC_._" */
   4.606 +    0x48,0x49,0x44,0x0B,0x41,0xD0,0x08,0x5F,  /* 00000BC8    "HID.A.._" */
   4.607 +    0x43,0x52,0x53,0x11,0x18,0x0A,0x15,0x47,  /* 00000BD0    "CRS....G" */
   4.608 +    0x01,0x20,0x00,0x20,0x00,0x01,0x02,0x47,  /* 00000BD8    ". . ...G" */
   4.609 +    0x01,0xA0,0x00,0xA0,0x00,0x01,0x02,0x22,  /* 00000BE0    "......."" */
   4.610 +    0x04,0x00,0x79,0x00,0x5B,0x82,0x47,0x05,  /* 00000BE8    "..y.[.G." */
   4.611 +    0x44,0x4D,0x41,0x30,0x08,0x5F,0x48,0x49,  /* 00000BF0    "DMA0._HI" */
   4.612 +    0x44,0x0C,0x41,0xD0,0x02,0x00,0x08,0x5F,  /* 00000BF8    "D.A...._" */
   4.613 +    0x43,0x52,0x53,0x11,0x41,0x04,0x0A,0x3D,  /* 00000C00    "CRS.A..=" */
   4.614 +    0x2A,0x10,0x04,0x47,0x01,0x00,0x00,0x00,  /* 00000C08    "*..G...." */
   4.615 +    0x00,0x00,0x10,0x47,0x01,0x81,0x00,0x81,  /* 00000C10    "...G...." */
   4.616 +    0x00,0x00,0x03,0x47,0x01,0x87,0x00,0x87,  /* 00000C18    "...G...." */
   4.617 +    0x00,0x00,0x01,0x47,0x01,0x89,0x00,0x89,  /* 00000C20    "...G...." */
   4.618 +    0x00,0x00,0x03,0x47,0x01,0x8F,0x00,0x8F,  /* 00000C28    "...G...." */
   4.619 +    0x00,0x00,0x01,0x47,0x01,0xC0,0x00,0xC0,  /* 00000C30    "...G...." */
   4.620 +    0x00,0x00,0x20,0x47,0x01,0x80,0x04,0x80,  /* 00000C38    ".. G...." */
   4.621 +    0x04,0x00,0x10,0x79,0x00,0x5B,0x82,0x25,  /* 00000C40    "...y.[.%" */
   4.622 +    0x54,0x4D,0x52,0x5F,0x08,0x5F,0x48,0x49,  /* 00000C48    "TMR_._HI" */
   4.623 +    0x44,0x0C,0x41,0xD0,0x01,0x00,0x08,0x5F,  /* 00000C50    "D.A...._" */
   4.624 +    0x43,0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,  /* 00000C58    "CRS....G" */
   4.625 +    0x01,0x40,0x00,0x40,0x00,0x00,0x04,0x22,  /* 00000C60    ".@.@..."" */
   4.626 +    0x01,0x00,0x79,0x00,0x5B,0x82,0x25,0x52,  /* 00000C68    "..y.[.%R" */
   4.627 +    0x54,0x43,0x5F,0x08,0x5F,0x48,0x49,0x44,  /* 00000C70    "TC_._HID" */
   4.628 +    0x0C,0x41,0xD0,0x0B,0x00,0x08,0x5F,0x43,  /* 00000C78    ".A...._C" */
   4.629 +    0x52,0x53,0x11,0x10,0x0A,0x0D,0x47,0x01,  /* 00000C80    "RS....G." */
   4.630 +    0x70,0x00,0x70,0x00,0x00,0x02,0x22,0x00,  /* 00000C88    "p.p..."." */
   4.631 +    0x01,0x79,0x00,0x5B,0x82,0x22,0x53,0x50,  /* 00000C90    ".y.[."SP" */
   4.632 +    0x4B,0x52,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000C98    "KR._HID." */
   4.633 +    0x41,0xD0,0x08,0x00,0x08,0x5F,0x43,0x52,  /* 00000CA0    "A...._CR" */
   4.634 +    0x53,0x11,0x0D,0x0A,0x0A,0x47,0x01,0x61,  /* 00000CA8    "S....G.a" */
   4.635 +    0x00,0x61,0x00,0x00,0x01,0x79,0x00,0x5B,  /* 00000CB0    ".a...y.[" */
   4.636 +    0x82,0x31,0x50,0x53,0x32,0x4D,0x08,0x5F,  /* 00000CB8    ".1PS2M._" */
   4.637 +    0x48,0x49,0x44,0x0C,0x41,0xD0,0x0F,0x13,  /* 00000CC0    "HID.A..." */
   4.638 +    0x08,0x5F,0x43,0x49,0x44,0x0C,0x41,0xD0,  /* 00000CC8    "._CID.A." */
   4.639 +    0x0F,0x13,0x14,0x09,0x5F,0x53,0x54,0x41,  /* 00000CD0    "...._STA" */
   4.640 +    0x00,0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,  /* 00000CD8    "....._CR" */
   4.641 +    0x53,0x11,0x08,0x0A,0x05,0x22,0x00,0x10,  /* 00000CE0    "S....".." */
   4.642 +    0x79,0x00,0x5B,0x82,0x42,0x04,0x50,0x53,  /* 00000CE8    "y.[.B.PS" */
   4.643 +    0x32,0x4B,0x08,0x5F,0x48,0x49,0x44,0x0C,  /* 00000CF0    "2K._HID." */
   4.644 +    0x41,0xD0,0x03,0x03,0x08,0x5F,0x43,0x49,  /* 00000CF8    "A...._CI" */
   4.645 +    0x44,0x0C,0x41,0xD0,0x03,0x0B,0x14,0x09,  /* 00000D00    "D.A....." */
   4.646 +    0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,  /* 00000D08    "_STA...." */
   4.647 +    0x08,0x5F,0x43,0x52,0x53,0x11,0x18,0x0A,  /* 00000D10    "._CRS..." */
   4.648 +    0x15,0x47,0x01,0x60,0x00,0x60,0x00,0x00,  /* 00000D18    ".G.`.`.." */
   4.649 +    0x01,0x47,0x01,0x64,0x00,0x64,0x00,0x00,  /* 00000D20    ".G.d.d.." */
   4.650 +    0x01,0x22,0x02,0x00,0x79,0x00,0x5B,0x82,  /* 00000D28    "."..y.[." */
   4.651 +    0x3A,0x46,0x44,0x43,0x30,0x08,0x5F,0x48,  /* 00000D30    ":FDC0._H" */
   4.652 +    0x49,0x44,0x0C,0x41,0xD0,0x07,0x00,0x14,  /* 00000D38    "ID.A...." */
   4.653 +    0x09,0x5F,0x53,0x54,0x41,0x00,0xA4,0x0A,  /* 00000D40    "._STA..." */
   4.654 +    0x0F,0x08,0x5F,0x43,0x52,0x53,0x11,0x1B,  /* 00000D48    ".._CRS.." */
   4.655 +    0x0A,0x18,0x47,0x01,0xF0,0x03,0xF0,0x03,  /* 00000D50    "..G....." */
   4.656 +    0x01,0x06,0x47,0x01,0xF7,0x03,0xF7,0x03,  /* 00000D58    "..G....." */
   4.657 +    0x01,0x01,0x22,0x40,0x00,0x2A,0x04,0x00,  /* 00000D60    ".."@.*.." */
   4.658 +    0x79,0x00,0x5B,0x82,0x35,0x55,0x41,0x52,  /* 00000D68    "y.[.5UAR" */
   4.659 +    0x31,0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,  /* 00000D70    "1._HID.A" */
   4.660 +    0xD0,0x05,0x01,0x08,0x5F,0x55,0x49,0x44,  /* 00000D78    "...._UID" */
   4.661 +    0x01,0x14,0x09,0x5F,0x53,0x54,0x41,0x00,  /* 00000D80    "..._STA." */
   4.662 +    0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,  /* 00000D88    "...._CRS" */
   4.663 +    0x11,0x10,0x0A,0x0D,0x47,0x01,0xF8,0x03,  /* 00000D90    "....G..." */
   4.664 +    0xF8,0x03,0x01,0x08,0x22,0x10,0x00,0x79,  /* 00000D98    "...."..y" */
   4.665 +    0x00,0x5B,0x82,0x36,0x4C,0x54,0x50,0x31,  /* 00000DA0    ".[.6LTP1" */
   4.666 +    0x08,0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,  /* 00000DA8    "._HID.A." */
   4.667 +    0x04,0x00,0x08,0x5F,0x55,0x49,0x44,0x0A,  /* 00000DB0    "..._UID." */
   4.668 +    0x02,0x14,0x09,0x5F,0x53,0x54,0x41,0x00,  /* 00000DB8    "..._STA." */
   4.669 +    0xA4,0x0A,0x0F,0x08,0x5F,0x43,0x52,0x53,  /* 00000DC0    "...._CRS" */
   4.670 +    0x11,0x10,0x0A,0x0D,0x47,0x01,0x78,0x03,  /* 00000DC8    "....G.x." */
   4.671 +    0x78,0x03,0x08,0x08,0x22,0x80,0x00,0x79,  /* 00000DD0    "x..."..y" */
   4.672 +    0x00,
   4.673  };
   4.674  int DsdtLen=sizeof(AmlCode);
     5.1 --- a/xen/arch/x86/hvm/Makefile	Thu Dec 21 11:33:15 2006 +0000
     5.2 +++ b/xen/arch/x86/hvm/Makefile	Thu Dec 21 12:05:34 2006 +0000
     5.3 @@ -10,6 +10,7 @@ obj-y += irq.o
     5.4  obj-y += platform.o
     5.5  obj-y += pmtimer.o
     5.6  obj-y += rtc.o
     5.7 +obj-y += hpet.o
     5.8  obj-y += vpt.o
     5.9  obj-y += vioapic.o
    5.10  obj-y += vlapic.o
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/xen/arch/x86/hvm/hpet.c	Thu Dec 21 12:05:34 2006 +0000
     6.3 @@ -0,0 +1,584 @@
     6.4 +/*
     6.5 + * hpet.c: emulating HPET in Xen
     6.6 + * Copyright (c) 2006, Intel Corporation.
     6.7 + *
     6.8 + * This program is free software; you can redistribute it and/or modify it
     6.9 + * under the terms and conditions of the GNU General Public License,
    6.10 + * version 2, as published by the Free Software Foundation.
    6.11 + *
    6.12 + * This program is distributed in the hope it will be useful, but WITHOUT
    6.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    6.14 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
    6.15 + * more details.
    6.16 + *
    6.17 + * You should have received a copy of the GNU General Public License along with
    6.18 + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
    6.19 + * Place - Suite 330, Boston, MA 02111-1307 USA.
    6.20 + */
    6.21 +
    6.22 +#include <asm/hvm/vpt.h>
    6.23 +#include <asm/hvm/io.h>
    6.24 +#include <asm/hvm/support.h>
    6.25 +#include <asm/current.h>
    6.26 +#include <xen/sched.h>
    6.27 +#include <xen/event.h>
    6.28 +
    6.29 +#define HPET_BASE_ADDRESS   0xfed00000ULL
    6.30 +#define HPET_MMAP_SIZE      1024
    6.31 +#define S_TO_NS  1000000000ULL           /* 1s  = 10^9  ns */
    6.32 +#define S_TO_FS  1000000000000000ULL     /* 1s  = 10^15 fs */
    6.33 +
    6.34 +#define HPET_ID         0x000
    6.35 +#define HPET_PERIOD     0x004
    6.36 +#define HPET_CFG        0x010
    6.37 +#define HPET_STATUS     0x020
    6.38 +#define HPET_COUNTER    0x0f0
    6.39 +#define HPET_T0_CFG     0x100
    6.40 +#define HPET_T0_CMP     0x108
    6.41 +#define HPET_T0_ROUTE   0x110
    6.42 +#define HPET_T1_CFG     0x120
    6.43 +#define HPET_T1_CMP     0x128
    6.44 +#define HPET_T1_ROUTE   0x130
    6.45 +#define HPET_T2_CFG     0x140
    6.46 +#define HPET_T2_CMP     0x148
    6.47 +#define HPET_T2_ROUTE   0x150
    6.48 +#define HPET_T3_CFG     0x158 /* not supported now*/
    6.49 +
    6.50 +#define HPET_REV                0x01ULL
    6.51 +#define HPET_NUMBER            0x200ULL /* 3 timers */
    6.52 +#define HPET_COUNTER_SIZE_CAP 0x2000ULL
    6.53 +#define HPET_LEG_RT_CAP       0x8000ULL
    6.54 +#define HPET_VENDOR_8086  0x80860000ULL
    6.55 +
    6.56 +/* 64bit main counter; 3 timers supported now;
    6.57 +   LegacyReplacemen Route supported.           */
    6.58 +#define HPET_CAP_ID_REG \
    6.59 +    (HPET_REV | HPET_NUMBER | HPET_COUNTER_SIZE_CAP | \
    6.60 +     HPET_LEG_RT_CAP | HPET_VENDOR_8086)
    6.61 +
    6.62 +#define HPET_CFG_ENABLE          0x001
    6.63 +#define HPET_CFG_LEGACY          0x002
    6.64 +
    6.65 +#define HPET_TN_INT_TYPE_LEVEL   0x002
    6.66 +#define HPET_TN_ENABLE           0x004
    6.67 +#define HPET_TN_PERIODIC         0x008
    6.68 +#define HPET_TN_PERIODIC_CAP     0x010
    6.69 +#define HPET_TN_SETVAL           0x040
    6.70 +#define HPET_TN_32BIT            0x100
    6.71 +#define HPET_TN_INT_ROUTE_MASK  0x3e00
    6.72 +#define HPET_TN_INT_ROUTE_SHIFT      9
    6.73 +#define HPET_TN_INT_ROUTE_CAP_SHIFT 32
    6.74 +#define HPET_TN_CFG_BITS_READONLY_OR_RESERVED 0xffff80b1U
    6.75 +
    6.76 +/* can be routed to IOAPIC.redirect_table[23..20] */
    6.77 +#define HPET_TN_INT_ROUTE_CAP      (0x00f00000ULL \
    6.78 +                    << HPET_TN_INT_ROUTE_CAP_SHIFT) 
    6.79 +
    6.80 +#define HPET_TN_INT_ROUTE_CAP_MASK (0xffffffffULL \
    6.81 +                    << HPET_TN_INT_ROUTE_CAP_SHIFT)
    6.82 +
    6.83 +#define HPET_TIMER_CMP32_DEFAULT 0xffffffffULL
    6.84 +#define HPET_TIMER_CMP64_DEFAULT 0xffffffffffffffffULL
    6.85 +#define HPET_TN_SIZE_CAP         (1 << 5)
    6.86 +
    6.87 +#define hpet_tick_to_ns(h, tick) ((s_time_t)(tick)*S_TO_NS/h->tsc_freq)
    6.88 +#define timer_config(h, n)       (h->hpet.timers[n].config)
    6.89 +#define timer_enabled(h, n)      (timer_config(h, n) & HPET_TN_ENABLE)
    6.90 +#define timer_is_periodic(h, n)  (timer_config(h, n) & HPET_TN_PERIODIC)
    6.91 +#define timer_is_32bit(h, n)     (timer_config(h, n) & HPET_TN_32BIT)
    6.92 +#define timer_period_cap(h, n)   (timer_config(h, n) & HPET_TN_PERIODIC_CAP)
    6.93 +#define hpet_enabled(h)          (h->hpet.config & HPET_CFG_ENABLE)
    6.94 +#define timer_level(h, n)        (timer_config(h, n) & HPET_TN_INT_TYPE_LEVEL)
    6.95 +
    6.96 +#define timer_int_route(h, n)   \
    6.97 +    ((timer_config(h, n) & HPET_TN_INT_ROUTE_MASK) >> HPET_TN_INT_ROUTE_SHIFT)
    6.98 +
    6.99 +#define timer_int_route_cap(h, n)   \
   6.100 +    ((timer_config(h, n) & HPET_TN_INT_ROUTE_CAP_MASK) \
   6.101 +        >> HPET_TN_INT_ROUTE_CAP_SHIFT)
   6.102 +
   6.103 +#define timer_int_route_valid(h, n)  \
   6.104 +    (timer_int_route_cap(h, n) & (1 << timer_int_route(h, n)))    
   6.105 + 
   6.106 +#define hpet_time_after(a, b)   ((int32_t)(b) -(int32_t)(a) < 0)
   6.107 +#define hpet_time_after64(a, b)   ((int64_t)(b) -(int64_t)(a) < 0)
   6.108 +
   6.109 +static inline uint32_t hpet_read32(HPETState *h, unsigned long addr)
   6.110 +{
   6.111 +    unsigned long p = ((unsigned long)&h->hpet) + addr;
   6.112 +    return  *((uint32_t*)p);
   6.113 +}
   6.114 +
   6.115 +static inline void hpet_write32(HPETState *h, unsigned long addr, uint32_t val)
   6.116 +{
   6.117 +    unsigned long p = ((unsigned long)&h->hpet) + addr;
   6.118 +    *((uint32_t*)p) = val;
   6.119 +}
   6.120 +
   6.121 +static int hpet_check_access_length(unsigned long addr, unsigned long len)
   6.122 +{
   6.123 +    if ( (len != 4) && (len != 8) )
   6.124 +    {
   6.125 +        gdprintk(XENLOG_ERR, "HPET: access with len=%lu\n", len);
   6.126 +        goto fail;
   6.127 +    }
   6.128 +
   6.129 +    if ( addr & (len-1) )
   6.130 +    {
   6.131 +        gdprintk(XENLOG_ERR, "HPET: access across register boundary\n");
   6.132 +        goto fail;
   6.133 +    }
   6.134 +
   6.135 +    return 0;
   6.136 +
   6.137 + fail:
   6.138 +    domain_crash(current->domain);
   6.139 +    return -EINVAL;
   6.140 +}
   6.141 +
   6.142 +static int hpet_check_access_offset(unsigned long addr)
   6.143 +{
   6.144 +    if ( addr >= HPET_T3_CFG )
   6.145 +    {
   6.146 +        gdprintk(XENLOG_ERR, "HPET: only 3 timers supported now\n");
   6.147 +        goto fail;
   6.148 +    }
   6.149 +
   6.150 +    if ( (addr == HPET_T0_ROUTE) || (addr == HPET_T0_ROUTE+4) ||
   6.151 +         (addr == HPET_T1_ROUTE) || (addr == HPET_T1_ROUTE+4) ||
   6.152 +         (addr == HPET_T2_ROUTE) || (addr == HPET_T2_ROUTE+4) )
   6.153 +    {
   6.154 +        gdprintk(XENLOG_ERR, "HPET: FSB interrupt route not supported now\n");
   6.155 +        goto fail;
   6.156 +    }
   6.157 +
   6.158 +    return 0;
   6.159 +
   6.160 + fail:
   6.161 +    domain_crash(current->domain);
   6.162 +    return -EINVAL;
   6.163 +}
   6.164 +
   6.165 +static void hpet_level_triggered_interrupt_not_supported(void)
   6.166 +{
   6.167 +    /* It's hard to support level triggered interrupt in HPET. */
   6.168 +    /* Now we haven't found any OS uses this kind of interrupt of HPET. */
   6.169 +    gdprintk(XENLOG_ERR,
   6.170 +             "HPET: level triggered interrupt not supported now\n");
   6.171 +    domain_crash(current->domain);
   6.172 +}
   6.173 +
   6.174 +static uint64_t hpet_update_maincounter(HPETState *h)
   6.175 +{
   6.176 +    if ( hpet_enabled(h) )
   6.177 +        return hvm_get_guest_time(h->vcpu) + h->mc_offset;
   6.178 +    else 
   6.179 +        return h->hpet.mc64;
   6.180 +}
   6.181 +
   6.182 +static unsigned long hpet_read(
   6.183 +    struct vcpu *v, unsigned long addr, unsigned long length)
   6.184 +{
   6.185 +    HPETState *h = &v->domain->arch.hvm_domain.pl_time.vhpet;
   6.186 +    uint64_t mc, result;
   6.187 +
   6.188 +    addr &= HPET_MMAP_SIZE-1;
   6.189 +
   6.190 +    if ( hpet_check_access_length(addr, length) != 0 )
   6.191 +        goto fail;
   6.192 +
   6.193 +    if ( length == 8 )
   6.194 +    {
   6.195 +        /* TODO: no OS is found to use length=8 now. 
   6.196 +         * Windows 2000/XP/2003 doesn't use HPET; all of Linux 
   6.197 +         * and 32bit/64bit Vista use 4-byte-length access.
   6.198 +         * Besides, section 2.4.7 of HPET spec gives a note saying
   6.199 +         * 64bit read may be inaccurate in some platforms. */
   6.200 +        gdprintk(XENLOG_ERR, "HPET: hpet_read with len=8 not implementated\n");
   6.201 +        domain_crash(v->domain);
   6.202 +        goto fail;
   6.203 +    }
   6.204 +
   6.205 +    switch ( addr )
   6.206 +    {
   6.207 +    case HPET_COUNTER:
   6.208 +        mc = hpet_update_maincounter(h);
   6.209 +        result = mc & 0xffffffffU;
   6.210 +        break;
   6.211 +    case HPET_COUNTER + 4:
   6.212 +        mc = hpet_update_maincounter(h);
   6.213 +        result = (mc >> 32);
   6.214 +        break;
   6.215 +    case HPET_T0_CMP:
   6.216 +        result = hpet_read32(h, addr);
   6.217 +        break;
   6.218 +    case HPET_T0_CMP + 4:
   6.219 +        result = timer_is_32bit(h, 0) ? 0 : hpet_read32(h, addr);
   6.220 +        break;
   6.221 +    default:
   6.222 +        if ( hpet_check_access_offset(addr) != 0 )
   6.223 +            goto fail;
   6.224 +        result = hpet_read32(h, addr);
   6.225 +        break;
   6.226 +    }
   6.227 +
   6.228 +    return result;
   6.229 +
   6.230 + fail:
   6.231 +    return ~0UL;
   6.232 +}
   6.233 +
   6.234 +static void hpet_stop_timer(HPETState *h, unsigned int tn)
   6.235 +{
   6.236 +    ASSERT( tn < HPET_TIMER_NUM );
   6.237 +    stop_timer(&h->timers[tn]);
   6.238 +}
   6.239 +
   6.240 +static void hpet_set_timer(HPETState *h, unsigned int tn)
   6.241 +{
   6.242 +    uint64_t tn_cmp;
   6.243 +    uint32_t cur_tick;
   6.244 +
   6.245 +    ASSERT(tn < HPET_TIMER_NUM);
   6.246 +    
   6.247 +    if ( !hpet_enabled(h) || !timer_enabled(h, tn) )
   6.248 +        return;
   6.249 +
   6.250 +    switch ( tn )
   6.251 +    {
   6.252 +    case 0:
   6.253 +        if ( !(h->hpet.config & HPET_CFG_LEGACY) )
   6.254 +        {
   6.255 +            gdprintk(XENLOG_INFO,
   6.256 +                     "HPET: LegacyReplacementRoute not set for timer0\n");
   6.257 +        }
   6.258 +        else
   6.259 +        {
   6.260 +            /* HPET specification requires PIT shouldn't generate
   6.261 +             * interrupts if LegacyReplacementRoute is set for timer0 */
   6.262 +            PITState *pit = &h->vcpu->domain->arch.hvm_domain.pl_time.vpit;
   6.263 +            pit_stop_channel0_irq(pit);
   6.264 +        }
   6.265 +        if ( timer_is_32bit(h, 0) )
   6.266 +            h->t0_period = hpet_tick_to_ns(h, (uint32_t)h->t0_initial_cnt);
   6.267 +        else
   6.268 +            h->t0_period = hpet_tick_to_ns(h, h->t0_initial_cnt);
   6.269 +        h->t0_period = hpet_tick_to_ns(h, h->t0_initial_cnt);
   6.270 +        set_timer(&h->timers[0], NOW() + h->t0_period);
   6.271 +        break;
   6.272 +    case 1:
   6.273 +    case 2: /* only support 32bit timer1 & timer 2 now */
   6.274 +        tn_cmp = h->hpet.timers[tn].c64 & 0xffffffffULL;
   6.275 +        cur_tick = hpet_update_maincounter(h);
   6.276 +        if ( tn_cmp > cur_tick )
   6.277 +            set_timer(&h->timers[tn], NOW() +
   6.278 +                      hpet_tick_to_ns(h, tn_cmp-cur_tick));
   6.279 +        else /* handle the overflow case */
   6.280 +            set_timer(&h->timers[tn], NOW() +
   6.281 +                      hpet_tick_to_ns(h, 0xffffffff-cur_tick+tn_cmp));
   6.282 +        break;
   6.283 +    }
   6.284 +}
   6.285 +
   6.286 +static void hpet_write(
   6.287 +    struct vcpu *v, unsigned long addr,
   6.288 +    unsigned long length, unsigned long val)
   6.289 +{
   6.290 +    HPETState *h = &v->domain->arch.hvm_domain.pl_time.vhpet;
   6.291 +    unsigned long old_val;
   6.292 +    int tn, i;
   6.293 +
   6.294 +    addr &= HPET_MMAP_SIZE-1;
   6.295 +
   6.296 +    if ( hpet_check_access_length(addr, length) != 0 )
   6.297 +        return;
   6.298 +
   6.299 +    if ( length == 8 )
   6.300 +    {
   6.301 +        gdprintk(XENLOG_ERR, "HPET: hpet_write with len=8 not implemented\n");
   6.302 +        domain_crash(v->domain);
   6.303 +        return;
   6.304 +    }
   6.305 +
   6.306 +    switch ( addr )
   6.307 +    {
   6.308 +    case HPET_ID: 
   6.309 +    case HPET_ID + 4: 
   6.310 +        gdprintk(XENLOG_WARNING,
   6.311 +                 "HPET: Capabilities and ID register is readonly\n");
   6.312 +        break;
   6.313 +    case HPET_CFG: 
   6.314 +        old_val = h->hpet.config;
   6.315 +        h->hpet.config = val;
   6.316 +
   6.317 +        if ( !(old_val & HPET_CFG_ENABLE) && (val & HPET_CFG_ENABLE) )
   6.318 +        {
   6.319 +            /* enable main counter & interrupt generating */
   6.320 +            h->mc_offset = h->hpet.mc64 - hvm_get_guest_time(h->vcpu);
   6.321 +            for ( i = 0; i < HPET_TIMER_NUM; i++ )
   6.322 +                hpet_set_timer(h, i); 
   6.323 +        }
   6.324 +        else if ( (old_val & HPET_CFG_ENABLE) && !(val & HPET_CFG_ENABLE) )
   6.325 +        {
   6.326 +            /* halt main counter & disable interrupt generating */
   6.327 +            h->hpet.mc64 = h->mc_offset + hvm_get_guest_time(h->vcpu);
   6.328 +            for ( i = 0; i < HPET_TIMER_NUM; i++ )
   6.329 +                hpet_stop_timer(h, i);
   6.330 +        }
   6.331 +        break;
   6.332 +    case HPET_STATUS:
   6.333 +        hpet_level_triggered_interrupt_not_supported();
   6.334 +        break;
   6.335 +    case HPET_COUNTER:
   6.336 +    case HPET_COUNTER + 4:
   6.337 +        if ( hpet_enabled(h) )
   6.338 +            gdprintk(XENLOG_WARNING, 
   6.339 +                     "HPET: writing main counter but it's not halted!\n");
   6.340 +        hpet_write32(h, addr, val);
   6.341 +        break;
   6.342 +    default:
   6.343 +        if ( hpet_check_access_offset(addr) != 0 )
   6.344 +            break;
   6.345 +
   6.346 +        if ( (addr < HPET_T0_CFG) || (addr >= HPET_T2_ROUTE) )
   6.347 +        {
   6.348 +            gdprintk(XENLOG_WARNING,
   6.349 +                     "HPET: writing reserved addr=0x%lx, ignored\n", addr);
   6.350 +            break;
   6.351 +        }
   6.352 +
   6.353 +        tn = (addr - HPET_T0_CFG) / 0x20;
   6.354 +        if ( (addr == HPET_T0_CMP + 0x20*tn) || 
   6.355 +             (addr == HPET_T0_CMP + 0x20*tn+4) )
   6.356 +        {
   6.357 +            hpet_write32(h, addr, val);
   6.358 +            if ( addr == HPET_T0_CMP )
   6.359 +                *((uint32_t*)&(h->t0_initial_cnt)) = val;
   6.360 +            else if ( addr == HPET_T0_CMP + 4 )
   6.361 +                *(((uint32_t*)&(h->t0_initial_cnt))+1) = val;
   6.362 +            if( hpet_enabled(h) && timer_enabled(h, tn) )
   6.363 +                hpet_set_timer(h, tn);
   6.364 +        }
   6.365 +        else /* HPET_Tn_CFG or HPET_Tn_CFG+4 */
   6.366 +        {
   6.367 +            if ( addr == (HPET_T0_CFG + 0x20*tn + 4) )
   6.368 +            {
   6.369 +                gdprintk(XENLOG_WARNING,
   6.370 +                         "HPET:  Timer%d_CFG[63..32] is readonly\n", tn);
   6.371 +            }
   6.372 +            else
   6.373 +            {
   6.374 +                old_val = timer_config(h, tn);
   6.375 +                if( (old_val & HPET_TN_CFG_BITS_READONLY_OR_RESERVED) !=
   6.376 +                    (val & HPET_TN_CFG_BITS_READONLY_OR_RESERVED) )
   6.377 +                {
   6.378 +                    gdprintk(XENLOG_ERR,
   6.379 +                             "HPET: TN_CFG writing incorrect value\n");
   6.380 +                    domain_crash(v->domain);
   6.381 +                    break;
   6.382 +                }
   6.383 +                hpet_write32(h, addr, val);
   6.384 +
   6.385 +                if ( timer_level(h, tn) )
   6.386 +                {
   6.387 +                    hpet_level_triggered_interrupt_not_supported();
   6.388 +                    break;
   6.389 +                }
   6.390 +
   6.391 +                if ( !(old_val & HPET_TN_ENABLE) &&
   6.392 +                     (val & HPET_TN_ENABLE) )
   6.393 +                    hpet_set_timer(h, tn);
   6.394 +                else if ( (old_val & HPET_TN_ENABLE) &&
   6.395 +                          !(val & HPET_TN_ENABLE) )
   6.396 +                    hpet_stop_timer(h, tn); 
   6.397 +            }
   6.398 +        }
   6.399 +        break;
   6.400 +    }
   6.401 +}
   6.402 +
   6.403 +static int hpet_range(struct vcpu *v, unsigned long addr)
   6.404 +{
   6.405 +    return ((addr >= HPET_BASE_ADDRESS) &&
   6.406 +            (addr < (HPET_BASE_ADDRESS + HPET_MMAP_SIZE)));
   6.407 +}
   6.408 +
   6.409 +struct hvm_mmio_handler hpet_mmio_handler = {
   6.410 +    .check_handler = hpet_range,
   6.411 +    .read_handler = hpet_read,
   6.412 +    .write_handler = hpet_write
   6.413 +};
   6.414 +
   6.415 +static void hpet_irq_assert(struct domain *d, 
   6.416 +                            unsigned int isa_irq, unsigned int intr)
   6.417 +{
   6.418 +    struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
   6.419 +
   6.420 +    spin_lock(&hvm_irq->lock);
   6.421 +
   6.422 +    if ( !__test_and_set_bit(isa_irq, &hvm_irq->isa_irq) &&
   6.423 +         (hvm_irq->gsi_assert_count[isa_irq]++ == 0) )
   6.424 +    {
   6.425 +        vioapic_irq_positive_edge(d, intr);
   6.426 +        vpic_irq_positive_edge(d, isa_irq);
   6.427 +    }
   6.428 +
   6.429 +    spin_unlock(&hvm_irq->lock);
   6.430 +}
   6.431 +
   6.432 +static void hpet_irq_deassert(struct domain *d,
   6.433 +                unsigned int isa_irq, unsigned int intr)
   6.434 +{
   6.435 +    hvm_isa_irq_deassert(d, isa_irq);
   6.436 +}
   6.437 +
   6.438 +static void hpet_set_irq(struct domain *d, int hpet_tn)
   6.439 +{
   6.440 +    int irq, intr;
   6.441 +
   6.442 +    if ( (hpet_tn != 0) && (hpet_tn != 1) )
   6.443 +        return;
   6.444 +
   6.445 +    /* if LegacyReplacementRoute bit is set, HPET specification requires
   6.446 +       timer0 be routed to IRQ0 in NON-APIC or IRQ2 in the I/O APIC,
   6.447 +       timer1 be routed to IRQ8 in NON-APIC or IRQ8 in the I/O APIC.
   6.448 +       It's hard to distinguish NON-APIC and I/O APIC, so we set both PIC
   6.449 +       and I/O APIC here. Guest OS shall make proper mask setting to ensure
   6.450 +       only one interrupt is injected into it. */
   6.451 +    if ( hpet_tn == 0 )
   6.452 +    {
   6.453 +        irq  = 0;
   6.454 +        intr = 2;
   6.455 +    }
   6.456 +    else
   6.457 +    {
   6.458 +        irq = intr = 8;
   6.459 +    }
   6.460 +    
   6.461 +    hpet_irq_deassert(d, irq, intr);
   6.462 +    hpet_irq_assert(d, irq, intr);
   6.463 +}
   6.464 +
   6.465 +static void hpet_route_interrupt(HPETState *h, unsigned int tn)
   6.466 +{
   6.467 +    unsigned int tn_int_route = timer_int_route(h, tn);
   6.468 +    struct domain *d = h->vcpu->domain;
   6.469 +    struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
   6.470 +
   6.471 +    if ( (tn_int_route >= VIOAPIC_NUM_PINS) || !timer_int_route_valid(h, tn) )
   6.472 +    {
   6.473 +        gdprintk(XENLOG_ERR,
   6.474 +                 "HPET: timer%u: invalid interrupt route config\n", tn);
   6.475 +        domain_crash(d);
   6.476 +        return;
   6.477 +    }
   6.478 +
   6.479 +    /* We only support edge-triggered interrupt now  */
   6.480 +    spin_lock(&hvm_irq->lock);
   6.481 +    vioapic_irq_positive_edge(d, tn_int_route);
   6.482 +    spin_unlock(&hvm_irq->lock);
   6.483 +}
   6.484 +
   6.485 +static void hpet_timer_fn(void *opaque)
   6.486 +{
   6.487 +    struct HPET_timer_fn_info *htfi = opaque;
   6.488 +    HPETState *h = htfi->hs;
   6.489 +    unsigned int tn = htfi->tn;
   6.490 +
   6.491 +    if ( !hpet_enabled(h) || !timer_enabled(h, tn) )
   6.492 +        return;
   6.493 +    
   6.494 +    if ( timer_level(h, tn) )
   6.495 +    {
   6.496 +        hpet_level_triggered_interrupt_not_supported();
   6.497 +        return;
   6.498 +    }
   6.499 +
   6.500 +    switch ( tn )
   6.501 +    {
   6.502 +        case 0:
   6.503 +        case 1:
   6.504 +            if ( h->hpet.config & HPET_CFG_LEGACY )
   6.505 +                hpet_set_irq(h->vcpu->domain, tn);
   6.506 +            else
   6.507 +                hpet_route_interrupt(h, tn);
   6.508 +
   6.509 +            if ( (tn == 0) && timer_is_periodic(h, tn) )
   6.510 +            {
   6.511 +                uint64_t mc = hpet_update_maincounter(h);
   6.512 +                if ( timer_is_32bit(h, 0) )
   6.513 +                {
   6.514 +                    while ( hpet_time_after(mc, h->hpet.timers[0].c32) )
   6.515 +                        h->hpet.timers[0].c32 += h->t0_initial_cnt;
   6.516 +                }
   6.517 +                else
   6.518 +                {
   6.519 +                    while ( hpet_time_after64(mc, h->hpet.timers[0].c64) )
   6.520 +                        h->hpet.timers[0].c64 += h->t0_initial_cnt;
   6.521 +                }
   6.522 +                set_timer(&h->timers[tn], NOW() + h->t0_period);
   6.523 +            }
   6.524 +            break;
   6.525 +        case 2:
   6.526 +            hpet_route_interrupt(h, tn);
   6.527 +            break;
   6.528 +        default:
   6.529 +            gdprintk(XENLOG_WARNING,
   6.530 +                     "HPET: timer%u is not supported now\n", tn);
   6.531 +            break;
   6.532 +    }
   6.533 +
   6.534 +    vcpu_kick(h->vcpu);    
   6.535 +}
   6.536 +
   6.537 +void hpet_migrate_timers(struct vcpu *v)
   6.538 +{
   6.539 +    struct HPETState *h = &v->domain->arch.hvm_domain.pl_time.vhpet;
   6.540 +    int i;
   6.541 +
   6.542 +    for ( i = 0; i < HPET_TIMER_NUM; i++ )
   6.543 +        migrate_timer(&h->timers[i], v->processor);
   6.544 +}
   6.545 +
   6.546 +void hpet_init(struct vcpu *v)
   6.547 +{
   6.548 +    HPETState *h = &v->domain->arch.hvm_domain.pl_time.vhpet;
   6.549 +    int i;
   6.550 +
   6.551 +    memset(h, 0, sizeof(HPETState));
   6.552 +
   6.553 +    h->vcpu = v;
   6.554 +    h->tsc_freq = ticks_per_sec(v);
   6.555 +    h->hpet.capability = HPET_CAP_ID_REG;
   6.556 +
   6.557 +    /* This is the number of femptoseconds per HPET tick. */
   6.558 +    /* Here we define HPET's frequency as tsc's. */
   6.559 +    h->hpet.capability |= ((S_TO_FS/h->tsc_freq) << 32);
   6.560 +
   6.561 +    h->hpet.timers[0].config = HPET_TN_INT_ROUTE_CAP | 
   6.562 +                        HPET_TN_SIZE_CAP | HPET_TN_PERIODIC_CAP;
   6.563 +    h->hpet.timers[0].c64 = HPET_TIMER_CMP64_DEFAULT;
   6.564 +
   6.565 +    h->hpet.timers[1].config = HPET_TN_INT_ROUTE_CAP;
   6.566 +    h->hpet.timers[1].c32 = HPET_TIMER_CMP32_DEFAULT;
   6.567 +    h->hpet.timers[2].config = HPET_TN_INT_ROUTE_CAP;
   6.568 +    h->hpet.timers[2].c32 = HPET_TIMER_CMP32_DEFAULT;
   6.569 +
   6.570 +    for ( i = 0; i < HPET_TIMER_NUM; i++ )
   6.571 +    {
   6.572 +        h->timer_fn_info[i].hs = h;
   6.573 +        h->timer_fn_info[i].tn = i;
   6.574 +        init_timer(&h->timers[i], hpet_timer_fn, &h->timer_fn_info[i],
   6.575 +                   v->processor);
   6.576 +    }
   6.577 +}
   6.578 +
   6.579 +void hpet_deinit(struct domain *d)
   6.580 +{
   6.581 +    int i;
   6.582 +    HPETState *h = &d->arch.hvm_domain.pl_time.vhpet;
   6.583 +
   6.584 +    for ( i = 0; i < HPET_TIMER_NUM; i++ )
   6.585 +        kill_timer(&h->timers[i]);
   6.586 +}
   6.587 +
     7.1 --- a/xen/arch/x86/hvm/hvm.c	Thu Dec 21 11:33:15 2006 +0000
     7.2 +++ b/xen/arch/x86/hvm/hvm.c	Thu Dec 21 12:05:34 2006 +0000
     7.3 @@ -86,6 +86,7 @@ void hvm_migrate_timers(struct vcpu *v)
     7.4  {
     7.5      pit_migrate_timers(v);
     7.6      rtc_migrate_timers(v);
     7.7 +    hpet_migrate_timers(v);
     7.8      pmtimer_migrate_timers(v);
     7.9      if ( vcpu_vlapic(v)->pt.enabled )
    7.10          migrate_timer(&vcpu_vlapic(v)->pt.timer, v->processor);
    7.11 @@ -151,6 +152,7 @@ void hvm_domain_destroy(struct domain *d
    7.12      pit_deinit(d);
    7.13      rtc_deinit(d);
    7.14      pmtimer_deinit(d);
    7.15 +    hpet_deinit(d);
    7.16  
    7.17      if ( d->arch.hvm_domain.shared_page_va )
    7.18          unmap_domain_page_global(
    7.19 @@ -186,6 +188,7 @@ int hvm_vcpu_initialise(struct vcpu *v)
    7.20  
    7.21      rtc_init(v, RTC_PORT(0), RTC_IRQ);
    7.22      pmtimer_init(v, ACPI_PM_TMR_BLK_ADDRESS);
    7.23 +    hpet_init(v);
    7.24  
    7.25      /* Init guest TSC to start from zero. */
    7.26      hvm_set_guest_time(v, 0);
     8.1 --- a/xen/arch/x86/hvm/i8254.c	Thu Dec 21 11:33:15 2006 +0000
     8.2 +++ b/xen/arch/x86/hvm/i8254.c	Thu Dec 21 12:05:34 2006 +0000
     8.3 @@ -352,6 +352,12 @@ static uint32_t pit_ioport_read(void *op
     8.4      return ret;
     8.5  }
     8.6  
     8.7 +void pit_stop_channel0_irq(PITState * pit)
     8.8 +{
     8.9 +    PITChannelState *s = &pit->channels[0];
    8.10 +    destroy_periodic_time(&s->pt);
    8.11 +}
    8.12 +
    8.13  static void pit_reset(void *opaque)
    8.14  {
    8.15      PITState *pit = opaque;
     9.1 --- a/xen/arch/x86/hvm/intercept.c	Thu Dec 21 11:33:15 2006 +0000
     9.2 +++ b/xen/arch/x86/hvm/intercept.c	Thu Dec 21 12:05:34 2006 +0000
     9.3 @@ -31,13 +31,15 @@
     9.4  #include <xen/event.h>
     9.5  
     9.6  
     9.7 +extern struct hvm_mmio_handler hpet_mmio_handler;
     9.8  extern struct hvm_mmio_handler vlapic_mmio_handler;
     9.9  extern struct hvm_mmio_handler vioapic_mmio_handler;
    9.10  
    9.11 -#define HVM_MMIO_HANDLER_NR 2
    9.12 +#define HVM_MMIO_HANDLER_NR 3
    9.13  
    9.14  static struct hvm_mmio_handler *hvm_mmio_handlers[HVM_MMIO_HANDLER_NR] =
    9.15  {
    9.16 +    &hpet_mmio_handler,
    9.17      &vlapic_mmio_handler,
    9.18      &vioapic_mmio_handler
    9.19  };
    10.1 --- a/xen/include/asm-x86/hvm/vpt.h	Thu Dec 21 11:33:15 2006 +0000
    10.2 +++ b/xen/include/asm-x86/hvm/vpt.h	Thu Dec 21 12:05:34 2006 +0000
    10.3 @@ -30,8 +30,47 @@
    10.4  #include <xen/list.h>
    10.5  #include <asm/hvm/vpic.h>
    10.6  
    10.7 -#define PIT_FREQ 1193181
    10.8 -#define PIT_BASE 0x40
    10.9 +
   10.10 +#define HPET_TIMER_NUM     3    /* 3 timers supported now */
   10.11 +struct HPET {
   10.12 +    uint64_t capability;        /* capabilities */
   10.13 +    uint64_t res0;              /* reserved */
   10.14 +    uint64_t config;            /* configuration */
   10.15 +    uint64_t res1;              /* reserved */
   10.16 +    uint64_t isr;               /* interrupt status reg */
   10.17 +    uint64_t res2[25];          /* reserved */
   10.18 +    union {                     /* main counter */
   10.19 +        uint64_t mc64;
   10.20 +        uint32_t mc32;
   10.21 +    };
   10.22 +    uint64_t res3;              /* reserved */
   10.23 +    struct {                    /* timers */
   10.24 +        uint64_t config;        /* configuration/cap */
   10.25 +        union {                 /* timer compare register */
   10.26 +            uint64_t c64;
   10.27 +            uint32_t c32;
   10.28 +        };
   10.29 +        uint64_t hpet_fsb[2];   /* FSB route, not supported now */
   10.30 +    } timers[HPET_TIMER_NUM];
   10.31 +};
   10.32 +
   10.33 +struct HPETState;
   10.34 +struct HPET_timer_fn_info {
   10.35 +    struct HPETState       *hs;
   10.36 +    unsigned int    tn;
   10.37 +};
   10.38 +
   10.39 +typedef struct HPETState {
   10.40 +    struct HPET     hpet;
   10.41 +    struct vcpu     *vcpu;
   10.42 +    uint64_t        tsc_freq;
   10.43 +    uint64_t        mc_offset;
   10.44 +    uint64_t        t0_initial_cnt;
   10.45 +    uint64_t        t0_period;
   10.46 +    struct timer timers[HPET_TIMER_NUM];
   10.47 +    struct HPET_timer_fn_info timer_fn_info[HPET_TIMER_NUM]; 
   10.48 +} HPETState;
   10.49 +
   10.50  
   10.51  /*
   10.52   * Abstract layer of periodic time, one short time.
   10.53 @@ -54,6 +93,10 @@ struct periodic_time {
   10.54      void *priv;                 /* ponit back to platform time source */
   10.55  };
   10.56  
   10.57 +
   10.58 +#define PIT_FREQ 1193181
   10.59 +#define PIT_BASE 0x40
   10.60 +
   10.61  typedef struct PITChannelState {
   10.62      int count; /* can be 65536 */
   10.63      u16 latched_count;
   10.64 @@ -103,6 +146,7 @@ typedef struct PMTState {
   10.65  struct pl_time {    /* platform time */
   10.66      struct PITState  vpit;
   10.67      struct RTCState  vrtc;
   10.68 +    struct HPETState vhpet;
   10.69      struct PMTState  vpmt;
   10.70  };
   10.71  
   10.72 @@ -121,6 +165,7 @@ void destroy_periodic_time(struct period
   10.73  
   10.74  int pv_pit_handler(int port, int data, int write);
   10.75  void pit_init(struct vcpu *v, unsigned long cpu_khz);
   10.76 +void pit_stop_channel0_irq(PITState * pit);
   10.77  void pit_migrate_timers(struct vcpu *v);
   10.78  void pit_deinit(struct domain *d);
   10.79  void rtc_init(struct vcpu *v, int base, int irq);
   10.80 @@ -131,4 +176,8 @@ void pmtimer_init(struct vcpu *v, int ba
   10.81  void pmtimer_migrate_timers(struct vcpu *v);
   10.82  void pmtimer_deinit(struct domain *d);
   10.83  
   10.84 +void hpet_migrate_timers(struct vcpu *v);
   10.85 +void hpet_init(struct vcpu *v);
   10.86 +void hpet_deinit(struct domain *d);
   10.87 +
   10.88  #endif /* __ASM_X86_HVM_VPT_H__ */