Home | History | Annotate | Line # | Download | only in disassembler
dmbuffer.c revision 1.4
      1  1.1    jruoho /*******************************************************************************
      2  1.1    jruoho  *
      3  1.1    jruoho  * Module Name: dmbuffer - AML disassembler, buffer and string support
      4  1.1    jruoho  *
      5  1.1    jruoho  ******************************************************************************/
      6  1.1    jruoho 
      7  1.2  christos /*
      8  1.4  christos  * Copyright (C) 2000 - 2016, Intel Corp.
      9  1.1    jruoho  * All rights reserved.
     10  1.1    jruoho  *
     11  1.2  christos  * Redistribution and use in source and binary forms, with or without
     12  1.2  christos  * modification, are permitted provided that the following conditions
     13  1.2  christos  * are met:
     14  1.2  christos  * 1. Redistributions of source code must retain the above copyright
     15  1.2  christos  *    notice, this list of conditions, and the following disclaimer,
     16  1.2  christos  *    without modification.
     17  1.2  christos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  1.2  christos  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  1.2  christos  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  1.2  christos  *    including a substantially similar Disclaimer requirement for further
     21  1.2  christos  *    binary redistribution.
     22  1.2  christos  * 3. Neither the names of the above-listed copyright holders nor the names
     23  1.2  christos  *    of any contributors may be used to endorse or promote products derived
     24  1.2  christos  *    from this software without specific prior written permission.
     25  1.2  christos  *
     26  1.2  christos  * Alternatively, this software may be distributed under the terms of the
     27  1.2  christos  * GNU General Public License ("GPL") version 2 as published by the Free
     28  1.2  christos  * Software Foundation.
     29  1.2  christos  *
     30  1.2  christos  * NO WARRANTY
     31  1.2  christos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  1.2  christos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  1.2  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  1.2  christos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  1.2  christos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  1.2  christos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  1.2  christos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  1.2  christos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  1.2  christos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  1.2  christos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  1.2  christos  * POSSIBILITY OF SUCH DAMAGES.
     42  1.2  christos  */
     43  1.1    jruoho 
     44  1.1    jruoho #include "acpi.h"
     45  1.1    jruoho #include "accommon.h"
     46  1.2  christos #include "acutils.h"
     47  1.1    jruoho #include "acdisasm.h"
     48  1.1    jruoho #include "acparser.h"
     49  1.1    jruoho #include "amlcode.h"
     50  1.2  christos #include "acinterp.h"
     51  1.1    jruoho 
     52  1.1    jruoho 
     53  1.1    jruoho #define _COMPONENT          ACPI_CA_DEBUGGER
     54  1.1    jruoho         ACPI_MODULE_NAME    ("dmbuffer")
     55  1.1    jruoho 
     56  1.1    jruoho /* Local prototypes */
     57  1.1    jruoho 
     58  1.1    jruoho static void
     59  1.2  christos AcpiDmUuid (
     60  1.2  christos     ACPI_PARSE_OBJECT       *Op);
     61  1.2  christos 
     62  1.2  christos static void
     63  1.1    jruoho AcpiDmUnicode (
     64  1.1    jruoho     ACPI_PARSE_OBJECT       *Op);
     65  1.1    jruoho 
     66  1.1    jruoho static void
     67  1.2  christos AcpiDmGetHardwareIdType (
     68  1.1    jruoho     ACPI_PARSE_OBJECT       *Op);
     69  1.1    jruoho 
     70  1.2  christos static void
     71  1.2  christos AcpiDmPldBuffer (
     72  1.2  christos     UINT32                  Level,
     73  1.2  christos     UINT8                   *ByteData,
     74  1.2  christos     UINT32                  ByteCount);
     75  1.2  christos 
     76  1.2  christos 
     77  1.2  christos #define ACPI_BUFFER_BYTES_PER_LINE      8
     78  1.2  christos 
     79  1.2  christos 
     80  1.2  christos /* Strings for ToPld */
     81  1.2  christos 
     82  1.2  christos static const char *DmPanelList[] =
     83  1.2  christos {
     84  1.2  christos     "TOP",
     85  1.2  christos     "BOTTOM",
     86  1.2  christos     "LEFT",
     87  1.2  christos     "RIGHT",
     88  1.2  christos     "FRONT",
     89  1.2  christos     "BACK",
     90  1.2  christos     "UNKNOWN",
     91  1.2  christos     NULL
     92  1.2  christos };
     93  1.2  christos 
     94  1.2  christos static const char *DmVerticalPositionList[] =
     95  1.2  christos {
     96  1.2  christos     "UPPER",
     97  1.2  christos     "CENTER",
     98  1.2  christos     "LOWER",
     99  1.2  christos     NULL
    100  1.2  christos };
    101  1.2  christos 
    102  1.2  christos static const char *DmHorizontalPositionList[] =
    103  1.2  christos {
    104  1.2  christos     "LEFT",
    105  1.2  christos     "CENTER",
    106  1.2  christos     "RIGHT",
    107  1.2  christos     NULL
    108  1.2  christos };
    109  1.2  christos 
    110  1.2  christos static const char *DmShapeList[] =
    111  1.2  christos {
    112  1.2  christos     "ROUND",
    113  1.2  christos     "OVAL",
    114  1.2  christos     "SQUARE",
    115  1.2  christos     "VERTICALRECTANGLE",
    116  1.2  christos     "HORIZONTALRECTANGLE",
    117  1.2  christos     "VERTICALTRAPEZOID",
    118  1.2  christos     "HORIZONTALTRAPEZOID",
    119  1.2  christos     "UNKNOWN",
    120  1.2  christos     "CHAMFERED",
    121  1.2  christos     NULL
    122  1.2  christos };
    123  1.2  christos 
    124  1.1    jruoho 
    125  1.1    jruoho /*******************************************************************************
    126  1.1    jruoho  *
    127  1.1    jruoho  * FUNCTION:    AcpiDmDisasmByteList
    128  1.1    jruoho  *
    129  1.1    jruoho  * PARAMETERS:  Level               - Current source code indentation level
    130  1.1    jruoho  *              ByteData            - Pointer to the byte list
    131  1.1    jruoho  *              ByteCount           - Length of the byte list
    132  1.1    jruoho  *
    133  1.1    jruoho  * RETURN:      None
    134  1.1    jruoho  *
    135  1.1    jruoho  * DESCRIPTION: Dump an AML "ByteList" in Hex format. 8 bytes per line, prefixed
    136  1.1    jruoho  *              with the hex buffer offset.
    137  1.1    jruoho  *
    138  1.1    jruoho  ******************************************************************************/
    139  1.1    jruoho 
    140  1.1    jruoho void
    141  1.1    jruoho AcpiDmDisasmByteList (
    142  1.1    jruoho     UINT32                  Level,
    143  1.1    jruoho     UINT8                   *ByteData,
    144  1.1    jruoho     UINT32                  ByteCount)
    145  1.1    jruoho {
    146  1.1    jruoho     UINT32                  i;
    147  1.2  christos     UINT32                  j;
    148  1.2  christos     UINT32                  CurrentIndex;
    149  1.2  christos     UINT8                   BufChar;
    150  1.1    jruoho 
    151  1.1    jruoho 
    152  1.1    jruoho     if (!ByteCount)
    153  1.1    jruoho     {
    154  1.1    jruoho         return;
    155  1.1    jruoho     }
    156  1.1    jruoho 
    157  1.2  christos     for (i = 0; i < ByteCount; i += ACPI_BUFFER_BYTES_PER_LINE)
    158  1.2  christos     {
    159  1.2  christos         /* Line indent and offset prefix for each new line */
    160  1.2  christos 
    161  1.2  christos         AcpiDmIndent (Level);
    162  1.2  christos         if (ByteCount > ACPI_BUFFER_BYTES_PER_LINE)
    163  1.2  christos         {
    164  1.2  christos             AcpiOsPrintf ("/* %04X */ ", i);
    165  1.2  christos         }
    166  1.1    jruoho 
    167  1.2  christos         /* Dump the actual hex values */
    168  1.1    jruoho 
    169  1.2  christos         for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++)
    170  1.1    jruoho         {
    171  1.2  christos             CurrentIndex = i + j;
    172  1.2  christos             if (CurrentIndex >= ByteCount)
    173  1.1    jruoho             {
    174  1.2  christos                 /* Dump fill spaces */
    175  1.2  christos 
    176  1.2  christos                 AcpiOsPrintf ("      ");
    177  1.2  christos                 continue;
    178  1.1    jruoho             }
    179  1.1    jruoho 
    180  1.2  christos             AcpiOsPrintf (" 0x%2.2X", ByteData[CurrentIndex]);
    181  1.2  christos 
    182  1.2  christos             /* Add comma if there are more bytes to display */
    183  1.2  christos 
    184  1.2  christos             if (CurrentIndex < (ByteCount - 1))
    185  1.1    jruoho             {
    186  1.2  christos                 AcpiOsPrintf (",");
    187  1.2  christos             }
    188  1.2  christos             else
    189  1.2  christos             {
    190  1.2  christos                 AcpiOsPrintf (" ");
    191  1.1    jruoho             }
    192  1.1    jruoho         }
    193  1.1    jruoho 
    194  1.2  christos         /* Dump the ASCII equivalents within a comment */
    195  1.1    jruoho 
    196  1.2  christos         AcpiOsPrintf ("  /* ");
    197  1.2  christos         for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++)
    198  1.2  christos         {
    199  1.2  christos             CurrentIndex = i + j;
    200  1.2  christos             if (CurrentIndex >= ByteCount)
    201  1.2  christos             {
    202  1.2  christos                 break;
    203  1.2  christos             }
    204  1.1    jruoho 
    205  1.2  christos             BufChar = ByteData[CurrentIndex];
    206  1.3  christos             if (isprint (BufChar))
    207  1.2  christos             {
    208  1.2  christos                 AcpiOsPrintf ("%c", BufChar);
    209  1.2  christos             }
    210  1.2  christos             else
    211  1.2  christos             {
    212  1.2  christos                 AcpiOsPrintf (".");
    213  1.2  christos             }
    214  1.1    jruoho         }
    215  1.1    jruoho 
    216  1.2  christos         /* Finished with this line */
    217  1.2  christos 
    218  1.2  christos         AcpiOsPrintf (" */\n");
    219  1.1    jruoho     }
    220  1.1    jruoho }
    221  1.1    jruoho 
    222  1.1    jruoho 
    223  1.1    jruoho /*******************************************************************************
    224  1.1    jruoho  *
    225  1.1    jruoho  * FUNCTION:    AcpiDmByteList
    226  1.1    jruoho  *
    227  1.1    jruoho  * PARAMETERS:  Info            - Parse tree walk info
    228  1.1    jruoho  *              Op              - Byte list op
    229  1.1    jruoho  *
    230  1.1    jruoho  * RETURN:      None
    231  1.1    jruoho  *
    232  1.1    jruoho  * DESCRIPTION: Dump a buffer byte list, handling the various types of buffers.
    233  1.1    jruoho  *              Buffer type must be already set in the Op DisasmOpcode.
    234  1.1    jruoho  *
    235  1.1    jruoho  ******************************************************************************/
    236  1.1    jruoho 
    237  1.1    jruoho void
    238  1.1    jruoho AcpiDmByteList (
    239  1.1    jruoho     ACPI_OP_WALK_INFO       *Info,
    240  1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    241  1.1    jruoho {
    242  1.1    jruoho     UINT8                   *ByteData;
    243  1.1    jruoho     UINT32                  ByteCount;
    244  1.1    jruoho 
    245  1.1    jruoho 
    246  1.1    jruoho     ByteData = Op->Named.Data;
    247  1.1    jruoho     ByteCount = (UINT32) Op->Common.Value.Integer;
    248  1.1    jruoho 
    249  1.1    jruoho     /*
    250  1.1    jruoho      * The byte list belongs to a buffer, and can be produced by either
    251  1.1    jruoho      * a ResourceTemplate, Unicode, quoted string, or a plain byte list.
    252  1.1    jruoho      */
    253  1.1    jruoho     switch (Op->Common.Parent->Common.DisasmOpcode)
    254  1.1    jruoho     {
    255  1.1    jruoho     case ACPI_DASM_RESOURCE:
    256  1.1    jruoho 
    257  1.4  christos         AcpiDmResourceTemplate (
    258  1.4  christos             Info, Op->Common.Parent, ByteData, ByteCount);
    259  1.1    jruoho         break;
    260  1.1    jruoho 
    261  1.1    jruoho     case ACPI_DASM_STRING:
    262  1.1    jruoho 
    263  1.1    jruoho         AcpiDmIndent (Info->Level);
    264  1.2  christos         AcpiUtPrintString ((char *) ByteData, ACPI_UINT16_MAX);
    265  1.1    jruoho         AcpiOsPrintf ("\n");
    266  1.1    jruoho         break;
    267  1.1    jruoho 
    268  1.2  christos     case ACPI_DASM_UUID:
    269  1.2  christos 
    270  1.2  christos         AcpiDmUuid (Op);
    271  1.2  christos         break;
    272  1.2  christos 
    273  1.1    jruoho     case ACPI_DASM_UNICODE:
    274  1.1    jruoho 
    275  1.1    jruoho         AcpiDmUnicode (Op);
    276  1.1    jruoho         break;
    277  1.1    jruoho 
    278  1.2  christos     case ACPI_DASM_PLD_METHOD:
    279  1.2  christos #if 0
    280  1.2  christos         AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount);
    281  1.2  christos #endif
    282  1.2  christos         AcpiDmPldBuffer (Info->Level, ByteData, ByteCount);
    283  1.2  christos         break;
    284  1.2  christos 
    285  1.1    jruoho     case ACPI_DASM_BUFFER:
    286  1.1    jruoho     default:
    287  1.1    jruoho         /*
    288  1.1    jruoho          * Not a resource, string, or unicode string.
    289  1.1    jruoho          * Just dump the buffer
    290  1.1    jruoho          */
    291  1.1    jruoho         AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount);
    292  1.1    jruoho         break;
    293  1.1    jruoho     }
    294  1.1    jruoho }
    295  1.1    jruoho 
    296  1.1    jruoho 
    297  1.1    jruoho /*******************************************************************************
    298  1.1    jruoho  *
    299  1.2  christos  * FUNCTION:    AcpiDmIsUuidBuffer
    300  1.2  christos  *
    301  1.2  christos  * PARAMETERS:  Op              - Buffer Object to be examined
    302  1.2  christos  *
    303  1.2  christos  * RETURN:      TRUE if buffer contains a UUID
    304  1.2  christos  *
    305  1.2  christos  * DESCRIPTION: Determine if a buffer Op contains a UUID
    306  1.2  christos  *
    307  1.2  christos  * To help determine whether the buffer is a UUID versus a raw data buffer,
    308  1.2  christos  * there a are a couple bytes we can look at:
    309  1.2  christos  *
    310  1.2  christos  *    xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
    311  1.2  christos  *
    312  1.2  christos  * The variant covered by the UUID specification is indicated by the two most
    313  1.2  christos  * significant bits of N being 1 0 (i.e., the hexadecimal N will always be
    314  1.2  christos  * 8, 9, A, or B).
    315  1.2  christos  *
    316  1.2  christos  * The variant covered by the UUID specification has five versions. For this
    317  1.2  christos  * variant, the four bits of M indicates the UUID version (i.e., the
    318  1.2  christos  * hexadecimal M will be either 1, 2, 3, 4, or 5).
    319  1.2  christos  *
    320  1.2  christos  ******************************************************************************/
    321  1.2  christos 
    322  1.2  christos BOOLEAN
    323  1.2  christos AcpiDmIsUuidBuffer (
    324  1.2  christos     ACPI_PARSE_OBJECT       *Op)
    325  1.2  christos {
    326  1.2  christos     UINT8                   *ByteData;
    327  1.2  christos     UINT32                  ByteCount;
    328  1.2  christos     ACPI_PARSE_OBJECT       *SizeOp;
    329  1.2  christos     ACPI_PARSE_OBJECT       *NextOp;
    330  1.2  christos 
    331  1.2  christos 
    332  1.2  christos     /* Buffer size is the buffer argument */
    333  1.2  christos 
    334  1.2  christos     SizeOp = Op->Common.Value.Arg;
    335  1.2  christos 
    336  1.2  christos     /* Next, the initializer byte list to examine */
    337  1.2  christos 
    338  1.2  christos     NextOp = SizeOp->Common.Next;
    339  1.2  christos     if (!NextOp)
    340  1.2  christos     {
    341  1.2  christos         return (FALSE);
    342  1.2  christos     }
    343  1.2  christos 
    344  1.2  christos     /* Extract the byte list info */
    345  1.2  christos 
    346  1.2  christos     ByteData = NextOp->Named.Data;
    347  1.2  christos     ByteCount = (UINT32) NextOp->Common.Value.Integer;
    348  1.2  christos 
    349  1.2  christos     /* Byte count must be exactly 16 */
    350  1.2  christos 
    351  1.2  christos     if (ByteCount != UUID_BUFFER_LENGTH)
    352  1.2  christos     {
    353  1.2  christos         return (FALSE);
    354  1.2  christos     }
    355  1.2  christos 
    356  1.2  christos     /* Check for valid "M" and "N" values (see function header above) */
    357  1.2  christos 
    358  1.2  christos     if (((ByteData[7] & 0xF0) == 0x00) || /* M={1,2,3,4,5} */
    359  1.2  christos         ((ByteData[7] & 0xF0) > 0x50)  ||
    360  1.2  christos         ((ByteData[8] & 0xF0) < 0x80)  || /* N={8,9,A,B} */
    361  1.2  christos         ((ByteData[8] & 0xF0) > 0xB0))
    362  1.2  christos     {
    363  1.2  christos         return (FALSE);
    364  1.2  christos     }
    365  1.2  christos 
    366  1.2  christos     /* Ignore the Size argument in the disassembly of this buffer op */
    367  1.2  christos 
    368  1.2  christos     SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    369  1.2  christos     return (TRUE);
    370  1.2  christos }
    371  1.2  christos 
    372  1.2  christos 
    373  1.2  christos /*******************************************************************************
    374  1.2  christos  *
    375  1.2  christos  * FUNCTION:    AcpiDmUuid
    376  1.2  christos  *
    377  1.2  christos  * PARAMETERS:  Op              - Byte List op containing a UUID
    378  1.2  christos  *
    379  1.2  christos  * RETURN:      None
    380  1.2  christos  *
    381  1.2  christos  * DESCRIPTION: Dump a buffer containing a UUID as a standard ASCII string.
    382  1.2  christos  *
    383  1.2  christos  * Output Format:
    384  1.2  christos  * In its canonical form, the UUID is represented by a string containing 32
    385  1.2  christos  * lowercase hexadecimal digits, displayed in 5 groups separated by hyphens.
    386  1.2  christos  * The complete form is 8-4-4-4-12 for a total of 36 characters (32
    387  1.2  christos  * alphanumeric characters representing hex digits and 4 hyphens). In bytes,
    388  1.2  christos  * 4-2-2-2-6. Example:
    389  1.2  christos  *
    390  1.2  christos  *    ToUUID ("107ededd-d381-4fd7-8da9-08e9a6c79644")
    391  1.2  christos  *
    392  1.2  christos  ******************************************************************************/
    393  1.2  christos 
    394  1.2  christos static void
    395  1.2  christos AcpiDmUuid (
    396  1.2  christos     ACPI_PARSE_OBJECT       *Op)
    397  1.2  christos {
    398  1.2  christos     UINT8                   *Data;
    399  1.2  christos     const char              *Description;
    400  1.2  christos 
    401  1.2  christos 
    402  1.2  christos     Data = ACPI_CAST_PTR (UINT8, Op->Named.Data);
    403  1.2  christos 
    404  1.2  christos     /* Emit the 36-byte UUID string in the proper format/order */
    405  1.2  christos 
    406  1.2  christos     AcpiOsPrintf (
    407  1.2  christos         "\"%2.2x%2.2x%2.2x%2.2x-"
    408  1.2  christos         "%2.2x%2.2x-"
    409  1.2  christos         "%2.2x%2.2x-"
    410  1.2  christos         "%2.2x%2.2x-"
    411  1.2  christos         "%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x\")",
    412  1.2  christos         Data[3], Data[2], Data[1], Data[0],
    413  1.2  christos         Data[5], Data[4],
    414  1.2  christos         Data[7], Data[6],
    415  1.2  christos         Data[8], Data[9],
    416  1.2  christos         Data[10], Data[11], Data[12], Data[13], Data[14], Data[15]);
    417  1.2  christos 
    418  1.2  christos     /* Dump the UUID description string if available */
    419  1.2  christos 
    420  1.2  christos     Description = AcpiAhMatchUuid (Data);
    421  1.2  christos     if (Description)
    422  1.2  christos     {
    423  1.2  christos         AcpiOsPrintf (" /* %s */", Description);
    424  1.2  christos     }
    425  1.2  christos }
    426  1.2  christos 
    427  1.2  christos 
    428  1.2  christos /*******************************************************************************
    429  1.2  christos  *
    430  1.1    jruoho  * FUNCTION:    AcpiDmIsUnicodeBuffer
    431  1.1    jruoho  *
    432  1.1    jruoho  * PARAMETERS:  Op              - Buffer Object to be examined
    433  1.1    jruoho  *
    434  1.1    jruoho  * RETURN:      TRUE if buffer contains a UNICODE string
    435  1.1    jruoho  *
    436  1.1    jruoho  * DESCRIPTION: Determine if a buffer Op contains a Unicode string
    437  1.1    jruoho  *
    438  1.1    jruoho  ******************************************************************************/
    439  1.1    jruoho 
    440  1.1    jruoho BOOLEAN
    441  1.1    jruoho AcpiDmIsUnicodeBuffer (
    442  1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    443  1.1    jruoho {
    444  1.1    jruoho     UINT8                   *ByteData;
    445  1.1    jruoho     UINT32                  ByteCount;
    446  1.1    jruoho     UINT32                  WordCount;
    447  1.1    jruoho     ACPI_PARSE_OBJECT       *SizeOp;
    448  1.1    jruoho     ACPI_PARSE_OBJECT       *NextOp;
    449  1.1    jruoho     UINT32                  i;
    450  1.1    jruoho 
    451  1.1    jruoho 
    452  1.1    jruoho     /* Buffer size is the buffer argument */
    453  1.1    jruoho 
    454  1.1    jruoho     SizeOp = Op->Common.Value.Arg;
    455  1.1    jruoho 
    456  1.1    jruoho     /* Next, the initializer byte list to examine */
    457  1.1    jruoho 
    458  1.1    jruoho     NextOp = SizeOp->Common.Next;
    459  1.1    jruoho     if (!NextOp)
    460  1.1    jruoho     {
    461  1.1    jruoho         return (FALSE);
    462  1.1    jruoho     }
    463  1.1    jruoho 
    464  1.1    jruoho     /* Extract the byte list info */
    465  1.1    jruoho 
    466  1.1    jruoho     ByteData = NextOp->Named.Data;
    467  1.1    jruoho     ByteCount = (UINT32) NextOp->Common.Value.Integer;
    468  1.1    jruoho     WordCount = ACPI_DIV_2 (ByteCount);
    469  1.1    jruoho 
    470  1.1    jruoho     /*
    471  1.1    jruoho      * Unicode string must have an even number of bytes and last
    472  1.1    jruoho      * word must be zero
    473  1.1    jruoho      */
    474  1.1    jruoho     if ((!ByteCount)     ||
    475  1.1    jruoho          (ByteCount < 4) ||
    476  1.1    jruoho          (ByteCount & 1) ||
    477  1.1    jruoho         ((UINT16 *) (void *) ByteData)[WordCount - 1] != 0)
    478  1.1    jruoho     {
    479  1.1    jruoho         return (FALSE);
    480  1.1    jruoho     }
    481  1.1    jruoho 
    482  1.2  christos     /* For each word, 1st byte must be ascii (1-0x7F), 2nd byte must be zero */
    483  1.1    jruoho 
    484  1.1    jruoho     for (i = 0; i < (ByteCount - 2); i += 2)
    485  1.1    jruoho     {
    486  1.2  christos         if ((ByteData[i] == 0) ||
    487  1.2  christos             (ByteData[i] > 0x7F) ||
    488  1.1    jruoho             (ByteData[(ACPI_SIZE) i + 1] != 0))
    489  1.1    jruoho         {
    490  1.1    jruoho             return (FALSE);
    491  1.1    jruoho         }
    492  1.1    jruoho     }
    493  1.1    jruoho 
    494  1.1    jruoho     /* Ignore the Size argument in the disassembly of this buffer op */
    495  1.1    jruoho 
    496  1.1    jruoho     SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    497  1.1    jruoho     return (TRUE);
    498  1.1    jruoho }
    499  1.1    jruoho 
    500  1.1    jruoho 
    501  1.1    jruoho /*******************************************************************************
    502  1.1    jruoho  *
    503  1.1    jruoho  * FUNCTION:    AcpiDmIsStringBuffer
    504  1.1    jruoho  *
    505  1.1    jruoho  * PARAMETERS:  Op              - Buffer Object to be examined
    506  1.1    jruoho  *
    507  1.1    jruoho  * RETURN:      TRUE if buffer contains a ASCII string, FALSE otherwise
    508  1.1    jruoho  *
    509  1.1    jruoho  * DESCRIPTION: Determine if a buffer Op contains a ASCII string
    510  1.1    jruoho  *
    511  1.1    jruoho  ******************************************************************************/
    512  1.1    jruoho 
    513  1.1    jruoho BOOLEAN
    514  1.1    jruoho AcpiDmIsStringBuffer (
    515  1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    516  1.1    jruoho {
    517  1.1    jruoho     UINT8                   *ByteData;
    518  1.1    jruoho     UINT32                  ByteCount;
    519  1.1    jruoho     ACPI_PARSE_OBJECT       *SizeOp;
    520  1.1    jruoho     ACPI_PARSE_OBJECT       *NextOp;
    521  1.1    jruoho     UINT32                  i;
    522  1.1    jruoho 
    523  1.1    jruoho 
    524  1.1    jruoho     /* Buffer size is the buffer argument */
    525  1.1    jruoho 
    526  1.1    jruoho     SizeOp = Op->Common.Value.Arg;
    527  1.1    jruoho 
    528  1.1    jruoho     /* Next, the initializer byte list to examine */
    529  1.1    jruoho 
    530  1.1    jruoho     NextOp = SizeOp->Common.Next;
    531  1.1    jruoho     if (!NextOp)
    532  1.1    jruoho     {
    533  1.1    jruoho         return (FALSE);
    534  1.1    jruoho     }
    535  1.1    jruoho 
    536  1.1    jruoho     /* Extract the byte list info */
    537  1.1    jruoho 
    538  1.1    jruoho     ByteData = NextOp->Named.Data;
    539  1.1    jruoho     ByteCount = (UINT32) NextOp->Common.Value.Integer;
    540  1.1    jruoho 
    541  1.1    jruoho     /* Last byte must be the null terminator */
    542  1.1    jruoho 
    543  1.1    jruoho     if ((!ByteCount)     ||
    544  1.1    jruoho          (ByteCount < 2) ||
    545  1.1    jruoho          (ByteData[ByteCount-1] != 0))
    546  1.1    jruoho     {
    547  1.1    jruoho         return (FALSE);
    548  1.1    jruoho     }
    549  1.1    jruoho 
    550  1.1    jruoho     for (i = 0; i < (ByteCount - 1); i++)
    551  1.1    jruoho     {
    552  1.1    jruoho         /* TBD: allow some escapes (non-ascii chars).
    553  1.1    jruoho          * they will be handled in the string output routine
    554  1.1    jruoho          */
    555  1.1    jruoho 
    556  1.3  christos         if (!isprint (ByteData[i]))
    557  1.1    jruoho         {
    558  1.1    jruoho             return (FALSE);
    559  1.1    jruoho         }
    560  1.1    jruoho     }
    561  1.1    jruoho 
    562  1.1    jruoho     return (TRUE);
    563  1.1    jruoho }
    564  1.1    jruoho 
    565  1.1    jruoho 
    566  1.1    jruoho /*******************************************************************************
    567  1.1    jruoho  *
    568  1.2  christos  * FUNCTION:    AcpiDmIsPldBuffer
    569  1.2  christos  *
    570  1.2  christos  * PARAMETERS:  Op                  - Buffer Object to be examined
    571  1.2  christos  *
    572  1.2  christos  * RETURN:      TRUE if buffer contains a ASCII string, FALSE otherwise
    573  1.2  christos  *
    574  1.2  christos  * DESCRIPTION: Determine if a buffer Op contains a _PLD structure
    575  1.2  christos  *
    576  1.2  christos  ******************************************************************************/
    577  1.2  christos 
    578  1.2  christos BOOLEAN
    579  1.2  christos AcpiDmIsPldBuffer (
    580  1.2  christos     ACPI_PARSE_OBJECT       *Op)
    581  1.2  christos {
    582  1.2  christos     ACPI_NAMESPACE_NODE     *Node;
    583  1.2  christos     ACPI_PARSE_OBJECT       *SizeOp;
    584  1.2  christos     ACPI_PARSE_OBJECT       *ParentOp;
    585  1.2  christos 
    586  1.2  christos 
    587  1.2  christos     /* Buffer size is the buffer argument */
    588  1.2  christos 
    589  1.2  christos     SizeOp = Op->Common.Value.Arg;
    590  1.2  christos 
    591  1.2  christos     ParentOp = Op->Common.Parent;
    592  1.2  christos     if (!ParentOp)
    593  1.2  christos     {
    594  1.2  christos         return (FALSE);
    595  1.2  christos     }
    596  1.2  christos 
    597  1.2  christos     /* Check for form: Name(_PLD, Buffer() {}). Not legal, however */
    598  1.2  christos 
    599  1.2  christos     if (ParentOp->Common.AmlOpcode == AML_NAME_OP)
    600  1.2  christos     {
    601  1.2  christos         Node = ParentOp->Common.Node;
    602  1.2  christos 
    603  1.2  christos         if (ACPI_COMPARE_NAME (Node->Name.Ascii, METHOD_NAME__PLD))
    604  1.2  christos         {
    605  1.2  christos             /* Ignore the Size argument in the disassembly of this buffer op */
    606  1.2  christos 
    607  1.2  christos             SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    608  1.2  christos             return (TRUE);
    609  1.2  christos         }
    610  1.2  christos 
    611  1.2  christos         return (FALSE);
    612  1.2  christos     }
    613  1.2  christos 
    614  1.2  christos     /* Check for proper form: Name(_PLD, Package() {Buffer() {}}) */
    615  1.2  christos 
    616  1.2  christos     if (ParentOp->Common.AmlOpcode == AML_PACKAGE_OP)
    617  1.2  christos     {
    618  1.2  christos         ParentOp = ParentOp->Common.Parent;
    619  1.2  christos         if (!ParentOp)
    620  1.2  christos         {
    621  1.2  christos             return (FALSE);
    622  1.2  christos         }
    623  1.2  christos 
    624  1.2  christos         if (ParentOp->Common.AmlOpcode == AML_NAME_OP)
    625  1.2  christos         {
    626  1.2  christos             Node = ParentOp->Common.Node;
    627  1.2  christos 
    628  1.2  christos             if (ACPI_COMPARE_NAME (Node->Name.Ascii, METHOD_NAME__PLD))
    629  1.2  christos             {
    630  1.2  christos                 /* Ignore the Size argument in the disassembly of this buffer op */
    631  1.2  christos 
    632  1.2  christos                 SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    633  1.2  christos                 return (TRUE);
    634  1.2  christos             }
    635  1.2  christos         }
    636  1.2  christos     }
    637  1.2  christos 
    638  1.2  christos     return (FALSE);
    639  1.2  christos }
    640  1.2  christos 
    641  1.2  christos 
    642  1.2  christos /*******************************************************************************
    643  1.2  christos  *
    644  1.2  christos  * FUNCTION:    AcpiDmFindNameByIndex
    645  1.2  christos  *
    646  1.2  christos  * PARAMETERS:  Index               - Index of array to check
    647  1.2  christos  *              List                - Array to reference
    648  1.2  christos  *
    649  1.2  christos  * RETURN:      String from List or empty string
    650  1.2  christos  *
    651  1.2  christos  * DESCRIPTION: Finds and returns the char string located at the given index
    652  1.2  christos  *              position in List.
    653  1.2  christos  *
    654  1.2  christos  ******************************************************************************/
    655  1.2  christos 
    656  1.2  christos static const char *
    657  1.2  christos AcpiDmFindNameByIndex (
    658  1.2  christos     UINT64                  Index,
    659  1.2  christos     const char            **List)
    660  1.2  christos {
    661  1.2  christos     const char              *Str;
    662  1.2  christos     UINT32                   i;
    663  1.2  christos 
    664  1.2  christos 
    665  1.2  christos     /* Bounds check */
    666  1.2  christos 
    667  1.2  christos     Str = List[0];
    668  1.2  christos     i = 0;
    669  1.2  christos 
    670  1.2  christos     while(Str)
    671  1.2  christos     {
    672  1.2  christos         i++;
    673  1.2  christos         Str = List[i];
    674  1.2  christos     }
    675  1.2  christos 
    676  1.2  christos     if (Index >= i)
    677  1.2  christos     {
    678  1.2  christos         /* TBD: Add error msg */
    679  1.2  christos 
    680  1.2  christos         return ("");
    681  1.2  christos     }
    682  1.2  christos 
    683  1.2  christos     return (List[Index]);
    684  1.2  christos }
    685  1.2  christos 
    686  1.2  christos 
    687  1.2  christos /*******************************************************************************
    688  1.2  christos  *
    689  1.2  christos  * FUNCTION:    AcpiDmPldBuffer
    690  1.2  christos  *
    691  1.2  christos  * PARAMETERS:  Level               - Current source code indentation level
    692  1.2  christos  *              ByteData            - Pointer to the byte list
    693  1.2  christos  *              ByteCount           - Length of the byte list
    694  1.2  christos  *
    695  1.2  christos  * RETURN:      None
    696  1.2  christos  *
    697  1.2  christos  * DESCRIPTION: Dump and format the contents of a _PLD buffer object
    698  1.2  christos  *
    699  1.2  christos  ******************************************************************************/
    700  1.2  christos 
    701  1.2  christos #define ACPI_PLD_OUTPUT08   "%*.s%-18s = 0x%X,\n", ACPI_MUL_4 (Level), " "
    702  1.2  christos #define ACPI_PLD_OUTPUT08P  "%*.s%-18s = 0x%X)\n", ACPI_MUL_4 (Level), " "
    703  1.2  christos #define ACPI_PLD_OUTPUT16   "%*.s%-18s = 0x%X,\n", ACPI_MUL_4 (Level), " "
    704  1.2  christos #define ACPI_PLD_OUTPUT16P  "%*.s%-18s = 0x%X)\n", ACPI_MUL_4 (Level), " "
    705  1.2  christos #define ACPI_PLD_OUTPUT24   "%*.s%-18s = 0x%X,\n", ACPI_MUL_4 (Level), " "
    706  1.2  christos #define ACPI_PLD_OUTPUTSTR  "%*.s%-18s = \"%s\",\n", ACPI_MUL_4 (Level), " "
    707  1.2  christos 
    708  1.2  christos static void
    709  1.2  christos AcpiDmPldBuffer (
    710  1.2  christos     UINT32                  Level,
    711  1.2  christos     UINT8                   *ByteData,
    712  1.2  christos     UINT32                  ByteCount)
    713  1.2  christos {
    714  1.2  christos     ACPI_PLD_INFO           *PldInfo;
    715  1.2  christos     ACPI_STATUS             Status;
    716  1.2  christos 
    717  1.2  christos 
    718  1.2  christos     /* Check for valid byte count */
    719  1.2  christos 
    720  1.2  christos     if (ByteCount < ACPI_PLD_REV1_BUFFER_SIZE)
    721  1.2  christos     {
    722  1.2  christos         return;
    723  1.2  christos     }
    724  1.2  christos 
    725  1.2  christos     /* Convert _PLD buffer to local _PLD struct */
    726  1.2  christos 
    727  1.2  christos     Status = AcpiDecodePldBuffer (ByteData, ByteCount, &PldInfo);
    728  1.2  christos     if (ACPI_FAILURE (Status))
    729  1.2  christos     {
    730  1.2  christos         return;
    731  1.2  christos     }
    732  1.2  christos 
    733  1.2  christos     AcpiOsPrintf ("\n");
    734  1.2  christos 
    735  1.2  christos     /* First 32-bit dword */
    736  1.2  christos 
    737  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Revision", PldInfo->Revision);
    738  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_IgnoreColor", PldInfo->IgnoreColor);
    739  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Red", PldInfo->Red);
    740  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Green", PldInfo->Green);
    741  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Blue", PldInfo->Blue);
    742  1.2  christos 
    743  1.2  christos     /* Second 32-bit dword */
    744  1.2  christos 
    745  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT16,  "PLD_Width", PldInfo->Width);
    746  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT16,  "PLD_Height", PldInfo->Height);
    747  1.2  christos 
    748  1.2  christos     /* Third 32-bit dword */
    749  1.2  christos 
    750  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_UserVisible", PldInfo->UserVisible);
    751  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Dock", PldInfo->Dock);
    752  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Lid", PldInfo->Lid);
    753  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_Panel",
    754  1.2  christos         AcpiDmFindNameByIndex(PldInfo->Panel, DmPanelList));
    755  1.4  christos 
    756  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_VerticalPosition",
    757  1.2  christos         AcpiDmFindNameByIndex(PldInfo->VerticalPosition, DmVerticalPositionList));
    758  1.4  christos 
    759  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_HorizontalPosition",
    760  1.2  christos         AcpiDmFindNameByIndex(PldInfo->HorizontalPosition, DmHorizontalPositionList));
    761  1.4  christos 
    762  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_Shape",
    763  1.2  christos         AcpiDmFindNameByIndex(PldInfo->Shape, DmShapeList));
    764  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_GroupOrientation", PldInfo->GroupOrientation);
    765  1.4  christos 
    766  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_GroupToken", PldInfo->GroupToken);
    767  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_GroupPosition", PldInfo->GroupPosition);
    768  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Bay", PldInfo->Bay);
    769  1.2  christos 
    770  1.2  christos     /* Fourth 32-bit dword */
    771  1.2  christos 
    772  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Ejectable", PldInfo->Ejectable);
    773  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_EjectRequired", PldInfo->OspmEjectRequired);
    774  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_CabinetNumber", PldInfo->CabinetNumber);
    775  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_CardCageNumber", PldInfo->CardCageNumber);
    776  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Reference", PldInfo->Reference);
    777  1.2  christos     AcpiOsPrintf (ACPI_PLD_OUTPUT08,  "PLD_Rotation", PldInfo->Rotation);
    778  1.2  christos 
    779  1.4  christos     if (ByteCount >= ACPI_PLD_REV2_BUFFER_SIZE)
    780  1.2  christos     {
    781  1.2  christos         AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Order", PldInfo->Order);
    782  1.2  christos 
    783  1.4  christos         /* Fifth 32-bit dword */
    784  1.2  christos 
    785  1.4  christos         AcpiOsPrintf (ACPI_PLD_OUTPUT16,  "PLD_VerticalOffset", PldInfo->VerticalOffset);
    786  1.4  christos         AcpiOsPrintf (ACPI_PLD_OUTPUT16P, "PLD_HorizontalOffset", PldInfo->HorizontalOffset);
    787  1.4  christos     }
    788  1.4  christos     else /* Rev 1 buffer */
    789  1.2  christos     {
    790  1.4  christos         AcpiOsPrintf (ACPI_PLD_OUTPUT08P, "PLD_Order", PldInfo->Order);
    791  1.2  christos     }
    792  1.2  christos 
    793  1.2  christos     ACPI_FREE (PldInfo);
    794  1.2  christos }
    795  1.2  christos 
    796  1.2  christos 
    797  1.2  christos /*******************************************************************************
    798  1.2  christos  *
    799  1.1    jruoho  * FUNCTION:    AcpiDmUnicode
    800  1.1    jruoho  *
    801  1.1    jruoho  * PARAMETERS:  Op              - Byte List op containing Unicode string
    802  1.1    jruoho  *
    803  1.1    jruoho  * RETURN:      None
    804  1.1    jruoho  *
    805  1.2  christos  * DESCRIPTION: Dump Unicode string as a standard ASCII string. (Remove
    806  1.1    jruoho  *              the extra zero bytes).
    807  1.1    jruoho  *
    808  1.1    jruoho  ******************************************************************************/
    809  1.1    jruoho 
    810  1.1    jruoho static void
    811  1.1    jruoho AcpiDmUnicode (
    812  1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    813  1.1    jruoho {
    814  1.1    jruoho     UINT16                  *WordData;
    815  1.1    jruoho     UINT32                  WordCount;
    816  1.1    jruoho     UINT32                  i;
    817  1.2  christos     int                     OutputValue;
    818  1.1    jruoho 
    819  1.1    jruoho 
    820  1.1    jruoho     /* Extract the buffer info as a WORD buffer */
    821  1.1    jruoho 
    822  1.1    jruoho     WordData = ACPI_CAST_PTR (UINT16, Op->Named.Data);
    823  1.1    jruoho     WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Integer));
    824  1.1    jruoho 
    825  1.2  christos     /* Write every other byte as an ASCII character */
    826  1.1    jruoho 
    827  1.1    jruoho     AcpiOsPrintf ("\"");
    828  1.2  christos     for (i = 0; i < (WordCount - 1); i++)
    829  1.2  christos     {
    830  1.2  christos         OutputValue = (int) WordData[i];
    831  1.1    jruoho 
    832  1.2  christos         /* Handle values that must be escaped */
    833  1.1    jruoho 
    834  1.2  christos         if ((OutputValue == '\"') ||
    835  1.2  christos             (OutputValue == '\\'))
    836  1.2  christos         {
    837  1.2  christos             AcpiOsPrintf ("\\%c", OutputValue);
    838  1.2  christos         }
    839  1.3  christos         else if (!isprint (OutputValue))
    840  1.2  christos         {
    841  1.2  christos             AcpiOsPrintf ("\\x%2.2X", OutputValue);
    842  1.2  christos         }
    843  1.2  christos         else
    844  1.2  christos         {
    845  1.2  christos             AcpiOsPrintf ("%c", OutputValue);
    846  1.2  christos         }
    847  1.1    jruoho     }
    848  1.1    jruoho 
    849  1.1    jruoho     AcpiOsPrintf ("\")");
    850  1.1    jruoho }
    851  1.1    jruoho 
    852  1.1    jruoho 
    853  1.1    jruoho /*******************************************************************************
    854  1.1    jruoho  *
    855  1.2  christos  * FUNCTION:    AcpiDmGetHardwareIdType
    856  1.1    jruoho  *
    857  1.1    jruoho  * PARAMETERS:  Op              - Op to be examined
    858  1.1    jruoho  *
    859  1.1    jruoho  * RETURN:      None
    860  1.1    jruoho  *
    861  1.2  christos  * DESCRIPTION: Determine the type of the argument to a _HID or _CID
    862  1.2  christos  *              1) Strings are allowed
    863  1.2  christos  *              2) If Integer, determine if it is a valid EISAID
    864  1.1    jruoho  *
    865  1.1    jruoho  ******************************************************************************/
    866  1.1    jruoho 
    867  1.1    jruoho static void
    868  1.2  christos AcpiDmGetHardwareIdType (
    869  1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    870  1.1    jruoho {
    871  1.1    jruoho     UINT32                  BigEndianId;
    872  1.1    jruoho     UINT32                  Prefix[3];
    873  1.1    jruoho     UINT32                  i;
    874  1.1    jruoho 
    875  1.1    jruoho 
    876  1.2  christos     switch (Op->Common.AmlOpcode)
    877  1.2  christos     {
    878  1.2  christos     case AML_STRING_OP:
    879  1.2  christos 
    880  1.2  christos         /* Mark this string as an _HID/_CID string */
    881  1.2  christos 
    882  1.2  christos         Op->Common.DisasmOpcode = ACPI_DASM_HID_STRING;
    883  1.2  christos         break;
    884  1.2  christos 
    885  1.2  christos     case AML_WORD_OP:
    886  1.2  christos     case AML_DWORD_OP:
    887  1.1    jruoho 
    888  1.2  christos         /* Determine if a Word/Dword is a valid encoded EISAID */
    889  1.1    jruoho 
    890  1.2  christos         /* Swap from little-endian to big-endian to simplify conversion */
    891  1.1    jruoho 
    892  1.2  christos         BigEndianId = AcpiUtDwordByteSwap ((UINT32) Op->Common.Value.Integer);
    893  1.1    jruoho 
    894  1.2  christos         /* Create the 3 leading ASCII letters */
    895  1.1    jruoho 
    896  1.2  christos         Prefix[0] = ((BigEndianId >> 26) & 0x1F) + 0x40;
    897  1.2  christos         Prefix[1] = ((BigEndianId >> 21) & 0x1F) + 0x40;
    898  1.2  christos         Prefix[2] = ((BigEndianId >> 16) & 0x1F) + 0x40;
    899  1.1    jruoho 
    900  1.2  christos         /* Verify that all 3 are ascii and alpha */
    901  1.1    jruoho 
    902  1.2  christos         for (i = 0; i < 3; i++)
    903  1.1    jruoho         {
    904  1.2  christos             if (!ACPI_IS_ASCII (Prefix[i]) ||
    905  1.3  christos                 !isalpha (Prefix[i]))
    906  1.2  christos             {
    907  1.2  christos                 return;
    908  1.2  christos             }
    909  1.1    jruoho         }
    910  1.1    jruoho 
    911  1.2  christos         /* Mark this node as convertable to an EISA ID string */
    912  1.2  christos 
    913  1.2  christos         Op->Common.DisasmOpcode = ACPI_DASM_EISAID;
    914  1.2  christos         break;
    915  1.1    jruoho 
    916  1.2  christos     default:
    917  1.2  christos         break;
    918  1.2  christos     }
    919  1.1    jruoho }
    920  1.1    jruoho 
    921  1.1    jruoho 
    922  1.1    jruoho /*******************************************************************************
    923  1.1    jruoho  *
    924  1.2  christos  * FUNCTION:    AcpiDmCheckForHardwareId
    925  1.1    jruoho  *
    926  1.1    jruoho  * PARAMETERS:  Op              - Op to be examined
    927  1.1    jruoho  *
    928  1.1    jruoho  * RETURN:      None
    929  1.1    jruoho  *
    930  1.2  christos  * DESCRIPTION: Determine if a Name() Op is a _HID/_CID.
    931  1.1    jruoho  *
    932  1.1    jruoho  ******************************************************************************/
    933  1.1    jruoho 
    934  1.1    jruoho void
    935  1.2  christos AcpiDmCheckForHardwareId (
    936  1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    937  1.1    jruoho {
    938  1.1    jruoho     UINT32                  Name;
    939  1.1    jruoho     ACPI_PARSE_OBJECT       *NextOp;
    940  1.1    jruoho 
    941  1.1    jruoho 
    942  1.1    jruoho     /* Get the NameSegment */
    943  1.1    jruoho 
    944  1.1    jruoho     Name = AcpiPsGetName (Op);
    945  1.1    jruoho     if (!Name)
    946  1.1    jruoho     {
    947  1.1    jruoho         return;
    948  1.1    jruoho     }
    949  1.1    jruoho 
    950  1.1    jruoho     NextOp = AcpiPsGetDepthNext (NULL, Op);
    951  1.1    jruoho     if (!NextOp)
    952  1.1    jruoho     {
    953  1.1    jruoho         return;
    954  1.1    jruoho     }
    955  1.1    jruoho 
    956  1.1    jruoho     /* Check for _HID - has one argument */
    957  1.1    jruoho 
    958  1.1    jruoho     if (ACPI_COMPARE_NAME (&Name, METHOD_NAME__HID))
    959  1.1    jruoho     {
    960  1.2  christos         AcpiDmGetHardwareIdType (NextOp);
    961  1.1    jruoho         return;
    962  1.1    jruoho     }
    963  1.1    jruoho 
    964  1.1    jruoho     /* Exit if not _CID */
    965  1.1    jruoho 
    966  1.1    jruoho     if (!ACPI_COMPARE_NAME (&Name, METHOD_NAME__CID))
    967  1.1    jruoho     {
    968  1.1    jruoho         return;
    969  1.1    jruoho     }
    970  1.1    jruoho 
    971  1.1    jruoho     /* _CID can contain a single argument or a package */
    972  1.1    jruoho 
    973  1.1    jruoho     if (NextOp->Common.AmlOpcode != AML_PACKAGE_OP)
    974  1.1    jruoho     {
    975  1.2  christos         AcpiDmGetHardwareIdType (NextOp);
    976  1.1    jruoho         return;
    977  1.1    jruoho     }
    978  1.1    jruoho 
    979  1.2  christos     /* _CID with Package: get the package length, check all elements */
    980  1.1    jruoho 
    981  1.1    jruoho     NextOp = AcpiPsGetDepthNext (NULL, NextOp);
    982  1.2  christos     if (!NextOp)
    983  1.2  christos     {
    984  1.2  christos         return;
    985  1.2  christos     }
    986  1.1    jruoho 
    987  1.1    jruoho     /* Don't need to use the length, just walk the peer list */
    988  1.1    jruoho 
    989  1.1    jruoho     NextOp = NextOp->Common.Next;
    990  1.1    jruoho     while (NextOp)
    991  1.1    jruoho     {
    992  1.2  christos         AcpiDmGetHardwareIdType (NextOp);
    993  1.1    jruoho         NextOp = NextOp->Common.Next;
    994  1.1    jruoho     }
    995  1.1    jruoho }
    996  1.1    jruoho 
    997  1.1    jruoho 
    998  1.1    jruoho /*******************************************************************************
    999  1.1    jruoho  *
   1000  1.2  christos  * FUNCTION:    AcpiDmDecompressEisaId
   1001  1.1    jruoho  *
   1002  1.1    jruoho  * PARAMETERS:  EncodedId       - Raw encoded EISA ID.
   1003  1.1    jruoho  *
   1004  1.1    jruoho  * RETURN:      None
   1005  1.1    jruoho  *
   1006  1.2  christos  * DESCRIPTION: Convert an encoded EISAID back to the original ASCII String
   1007  1.2  christos  *              and emit the correct ASL statement. If the ID is known, emit
   1008  1.2  christos  *              a description of the ID as a comment.
   1009  1.1    jruoho  *
   1010  1.1    jruoho  ******************************************************************************/
   1011  1.1    jruoho 
   1012  1.1    jruoho void
   1013  1.2  christos AcpiDmDecompressEisaId (
   1014  1.1    jruoho     UINT32                  EncodedId)
   1015  1.1    jruoho {
   1016  1.2  christos     char                    IdBuffer[ACPI_EISAID_STRING_SIZE];
   1017  1.2  christos     const AH_DEVICE_ID      *Info;
   1018  1.1    jruoho 
   1019  1.1    jruoho 
   1020  1.2  christos     /* Convert EISAID to a string an emit the statement */
   1021  1.1    jruoho 
   1022  1.2  christos     AcpiExEisaIdToString (IdBuffer, EncodedId);
   1023  1.2  christos     AcpiOsPrintf ("EisaId (\"%s\")", IdBuffer);
   1024  1.1    jruoho 
   1025  1.2  christos     /* If we know about the ID, emit the description */
   1026  1.1    jruoho 
   1027  1.2  christos     Info = AcpiAhMatchHardwareId (IdBuffer);
   1028  1.2  christos     if (Info)
   1029  1.2  christos     {
   1030  1.2  christos         AcpiOsPrintf (" /* %s */", Info->Description);
   1031  1.2  christos     }
   1032  1.1    jruoho }
   1033