Home | History | Annotate | Line # | Download | only in disassembler
dmopcode.c revision 1.1.1.3
      1      1.1    jruoho /*******************************************************************************
      2      1.1    jruoho  *
      3      1.1    jruoho  * Module Name: dmopcode - AML disassembler, specific AML opcodes
      4      1.1    jruoho  *
      5      1.1    jruoho  ******************************************************************************/
      6      1.1    jruoho 
      7  1.1.1.2    jruoho /*
      8  1.1.1.3  christos  * Copyright (C) 2000 - 2013, Intel Corp.
      9      1.1    jruoho  * All rights reserved.
     10      1.1    jruoho  *
     11  1.1.1.2    jruoho  * Redistribution and use in source and binary forms, with or without
     12  1.1.1.2    jruoho  * modification, are permitted provided that the following conditions
     13  1.1.1.2    jruoho  * are met:
     14  1.1.1.2    jruoho  * 1. Redistributions of source code must retain the above copyright
     15  1.1.1.2    jruoho  *    notice, this list of conditions, and the following disclaimer,
     16  1.1.1.2    jruoho  *    without modification.
     17  1.1.1.2    jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  1.1.1.2    jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  1.1.1.2    jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  1.1.1.2    jruoho  *    including a substantially similar Disclaimer requirement for further
     21  1.1.1.2    jruoho  *    binary redistribution.
     22  1.1.1.2    jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     23  1.1.1.2    jruoho  *    of any contributors may be used to endorse or promote products derived
     24  1.1.1.2    jruoho  *    from this software without specific prior written permission.
     25  1.1.1.2    jruoho  *
     26  1.1.1.2    jruoho  * Alternatively, this software may be distributed under the terms of the
     27  1.1.1.2    jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     28  1.1.1.2    jruoho  * Software Foundation.
     29  1.1.1.2    jruoho  *
     30  1.1.1.2    jruoho  * NO WARRANTY
     31  1.1.1.2    jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  1.1.1.2    jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  1.1.1.2    jruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  1.1.1.2    jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  1.1.1.2    jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  1.1.1.2    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  1.1.1.2    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  1.1.1.2    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  1.1.1.2    jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  1.1.1.2    jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  1.1.1.2    jruoho  * POSSIBILITY OF SUCH DAMAGES.
     42  1.1.1.2    jruoho  */
     43      1.1    jruoho 
     44      1.1    jruoho #include "acpi.h"
     45      1.1    jruoho #include "accommon.h"
     46      1.1    jruoho #include "acparser.h"
     47      1.1    jruoho #include "amlcode.h"
     48      1.1    jruoho #include "acdisasm.h"
     49      1.1    jruoho 
     50      1.1    jruoho #ifdef ACPI_DISASSEMBLER
     51      1.1    jruoho 
     52      1.1    jruoho #define _COMPONENT          ACPI_CA_DEBUGGER
     53      1.1    jruoho         ACPI_MODULE_NAME    ("dmopcode")
     54      1.1    jruoho 
     55      1.1    jruoho /* Local prototypes */
     56      1.1    jruoho 
     57      1.1    jruoho static void
     58      1.1    jruoho AcpiDmMatchKeyword (
     59      1.1    jruoho     ACPI_PARSE_OBJECT       *Op);
     60      1.1    jruoho 
     61      1.1    jruoho 
     62      1.1    jruoho /*******************************************************************************
     63      1.1    jruoho  *
     64  1.1.1.3  christos  * FUNCTION:    AcpiDmPredefinedDescription
     65  1.1.1.3  christos  *
     66  1.1.1.3  christos  * PARAMETERS:  Op              - Name() parse object
     67  1.1.1.3  christos  *
     68  1.1.1.3  christos  * RETURN:      None
     69  1.1.1.3  christos  *
     70  1.1.1.3  christos  * DESCRIPTION: Emit a description comment for a predefined ACPI name.
     71  1.1.1.3  christos  *              Used for iASL compiler only.
     72  1.1.1.3  christos  *
     73  1.1.1.3  christos  ******************************************************************************/
     74  1.1.1.3  christos 
     75  1.1.1.3  christos void
     76  1.1.1.3  christos AcpiDmPredefinedDescription (
     77  1.1.1.3  christos     ACPI_PARSE_OBJECT       *Op)
     78  1.1.1.3  christos {
     79  1.1.1.3  christos #ifdef ACPI_ASL_COMPILER
     80  1.1.1.3  christos     const AH_PREDEFINED_NAME    *Info;
     81  1.1.1.3  christos     char                        *NameString;
     82  1.1.1.3  christos     int                         LastCharIsDigit;
     83  1.1.1.3  christos     int                         LastCharsAreHex;
     84  1.1.1.3  christos 
     85  1.1.1.3  christos 
     86  1.1.1.3  christos     if (!Op)
     87  1.1.1.3  christos     {
     88  1.1.1.3  christos         return;
     89  1.1.1.3  christos     }
     90  1.1.1.3  christos 
     91  1.1.1.3  christos     /* Ensure that the comment field is emitted only once */
     92  1.1.1.3  christos 
     93  1.1.1.3  christos     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
     94  1.1.1.3  christos     {
     95  1.1.1.3  christos         return;
     96  1.1.1.3  christos     }
     97  1.1.1.3  christos     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
     98  1.1.1.3  christos 
     99  1.1.1.3  christos     /* Predefined name must start with an underscore */
    100  1.1.1.3  christos 
    101  1.1.1.3  christos     NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
    102  1.1.1.3  christos     if (NameString[0] != '_')
    103  1.1.1.3  christos     {
    104  1.1.1.3  christos         return;
    105  1.1.1.3  christos     }
    106  1.1.1.3  christos 
    107  1.1.1.3  christos     /*
    108  1.1.1.3  christos      * Check for the special ACPI names:
    109  1.1.1.3  christos      * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
    110  1.1.1.3  christos      * (where d=decimal_digit, x=hex_digit, a=anything)
    111  1.1.1.3  christos      *
    112  1.1.1.3  christos      * Convert these to the generic name for table lookup.
    113  1.1.1.3  christos      * Note: NameString is guaranteed to be upper case here.
    114  1.1.1.3  christos      */
    115  1.1.1.3  christos     LastCharIsDigit =
    116  1.1.1.3  christos         (ACPI_IS_DIGIT (NameString[3]));    /* d */
    117  1.1.1.3  christos     LastCharsAreHex =
    118  1.1.1.3  christos         (ACPI_IS_XDIGIT (NameString[2]) &&  /* xx */
    119  1.1.1.3  christos          ACPI_IS_XDIGIT (NameString[3]));
    120  1.1.1.3  christos 
    121  1.1.1.3  christos     switch (NameString[1])
    122  1.1.1.3  christos     {
    123  1.1.1.3  christos     case 'A':
    124  1.1.1.3  christos 
    125  1.1.1.3  christos         if ((NameString[2] == 'C') && (LastCharIsDigit))
    126  1.1.1.3  christos         {
    127  1.1.1.3  christos             NameString = "_ACx";
    128  1.1.1.3  christos         }
    129  1.1.1.3  christos         else if ((NameString[2] == 'L') && (LastCharIsDigit))
    130  1.1.1.3  christos         {
    131  1.1.1.3  christos             NameString = "_ALx";
    132  1.1.1.3  christos         }
    133  1.1.1.3  christos         break;
    134  1.1.1.3  christos 
    135  1.1.1.3  christos     case 'E':
    136  1.1.1.3  christos 
    137  1.1.1.3  christos         if ((NameString[2] == 'J') && (LastCharIsDigit))
    138  1.1.1.3  christos         {
    139  1.1.1.3  christos             NameString = "_EJx";
    140  1.1.1.3  christos         }
    141  1.1.1.3  christos         else if (LastCharsAreHex)
    142  1.1.1.3  christos         {
    143  1.1.1.3  christos             NameString = "_Exx";
    144  1.1.1.3  christos         }
    145  1.1.1.3  christos         break;
    146  1.1.1.3  christos 
    147  1.1.1.3  christos     case 'L':
    148  1.1.1.3  christos 
    149  1.1.1.3  christos         if (LastCharsAreHex)
    150  1.1.1.3  christos         {
    151  1.1.1.3  christos             NameString = "_Lxx";
    152  1.1.1.3  christos         }
    153  1.1.1.3  christos         break;
    154  1.1.1.3  christos 
    155  1.1.1.3  christos     case 'Q':
    156  1.1.1.3  christos 
    157  1.1.1.3  christos         if (LastCharsAreHex)
    158  1.1.1.3  christos         {
    159  1.1.1.3  christos             NameString = "_Qxx";
    160  1.1.1.3  christos         }
    161  1.1.1.3  christos         break;
    162  1.1.1.3  christos 
    163  1.1.1.3  christos     case 'T':
    164  1.1.1.3  christos 
    165  1.1.1.3  christos         if (NameString[2] == '_')
    166  1.1.1.3  christos         {
    167  1.1.1.3  christos             NameString = "_T_x";
    168  1.1.1.3  christos         }
    169  1.1.1.3  christos         break;
    170  1.1.1.3  christos 
    171  1.1.1.3  christos     case 'W':
    172  1.1.1.3  christos 
    173  1.1.1.3  christos         if (LastCharsAreHex)
    174  1.1.1.3  christos         {
    175  1.1.1.3  christos             NameString = "_Wxx";
    176  1.1.1.3  christos         }
    177  1.1.1.3  christos         break;
    178  1.1.1.3  christos 
    179  1.1.1.3  christos     default:
    180  1.1.1.3  christos 
    181  1.1.1.3  christos         break;
    182  1.1.1.3  christos     }
    183  1.1.1.3  christos 
    184  1.1.1.3  christos     /* Match the name in the info table */
    185  1.1.1.3  christos 
    186  1.1.1.3  christos     for (Info = AslPredefinedInfo; Info->Name; Info++)
    187  1.1.1.3  christos     {
    188  1.1.1.3  christos         if (ACPI_COMPARE_NAME (NameString, Info->Name))
    189  1.1.1.3  christos         {
    190  1.1.1.3  christos             AcpiOsPrintf ("  // %4.4s: %s",
    191  1.1.1.3  christos                 NameString, ACPI_CAST_PTR (char, Info->Description));
    192  1.1.1.3  christos             return;
    193  1.1.1.3  christos         }
    194  1.1.1.3  christos     }
    195  1.1.1.3  christos 
    196  1.1.1.3  christos #endif
    197  1.1.1.3  christos     return;
    198  1.1.1.3  christos }
    199  1.1.1.3  christos 
    200  1.1.1.3  christos 
    201  1.1.1.3  christos /*******************************************************************************
    202  1.1.1.3  christos  *
    203  1.1.1.3  christos  * FUNCTION:    AcpiDmFieldPredefinedDescription
    204  1.1.1.3  christos  *
    205  1.1.1.3  christos  * PARAMETERS:  Op              - Parse object
    206  1.1.1.3  christos  *
    207  1.1.1.3  christos  * RETURN:      None
    208  1.1.1.3  christos  *
    209  1.1.1.3  christos  * DESCRIPTION: Emit a description comment for a resource descriptor tag
    210  1.1.1.3  christos  *              (which is a predefined ACPI name.) Used for iASL compiler only.
    211  1.1.1.3  christos  *
    212  1.1.1.3  christos  ******************************************************************************/
    213  1.1.1.3  christos 
    214  1.1.1.3  christos void
    215  1.1.1.3  christos AcpiDmFieldPredefinedDescription (
    216  1.1.1.3  christos     ACPI_PARSE_OBJECT       *Op)
    217  1.1.1.3  christos {
    218  1.1.1.3  christos #ifdef ACPI_ASL_COMPILER
    219  1.1.1.3  christos     ACPI_PARSE_OBJECT       *IndexOp;
    220  1.1.1.3  christos     char                    *Tag;
    221  1.1.1.3  christos     const ACPI_OPCODE_INFO  *OpInfo;
    222  1.1.1.3  christos     const AH_PREDEFINED_NAME *Info;
    223  1.1.1.3  christos 
    224  1.1.1.3  christos 
    225  1.1.1.3  christos     if (!Op)
    226  1.1.1.3  christos     {
    227  1.1.1.3  christos         return;
    228  1.1.1.3  christos     }
    229  1.1.1.3  christos 
    230  1.1.1.3  christos     /* Ensure that the comment field is emitted only once */
    231  1.1.1.3  christos 
    232  1.1.1.3  christos     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
    233  1.1.1.3  christos     {
    234  1.1.1.3  christos         return;
    235  1.1.1.3  christos     }
    236  1.1.1.3  christos     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
    237  1.1.1.3  christos 
    238  1.1.1.3  christos     /*
    239  1.1.1.3  christos      * Op must be one of the Create* operators: CreateField, CreateBitField,
    240  1.1.1.3  christos      * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
    241  1.1.1.3  christos      */
    242  1.1.1.3  christos     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
    243  1.1.1.3  christos     if (!(OpInfo->Flags & AML_CREATE))
    244  1.1.1.3  christos     {
    245  1.1.1.3  christos         return;
    246  1.1.1.3  christos     }
    247  1.1.1.3  christos 
    248  1.1.1.3  christos     /* Second argument is the Index argument */
    249  1.1.1.3  christos 
    250  1.1.1.3  christos     IndexOp = Op->Common.Value.Arg;
    251  1.1.1.3  christos     IndexOp = IndexOp->Common.Next;
    252  1.1.1.3  christos 
    253  1.1.1.3  christos     /* Index argument must be a namepath */
    254  1.1.1.3  christos 
    255  1.1.1.3  christos     if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
    256  1.1.1.3  christos     {
    257  1.1.1.3  christos         return;
    258  1.1.1.3  christos     }
    259  1.1.1.3  christos 
    260  1.1.1.3  christos     /* Major cheat: We previously put the Tag ptr in the Node field */
    261  1.1.1.3  christos 
    262  1.1.1.3  christos     Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
    263  1.1.1.3  christos     if (!Tag)
    264  1.1.1.3  christos     {
    265  1.1.1.3  christos         return;
    266  1.1.1.3  christos     }
    267  1.1.1.3  christos 
    268  1.1.1.3  christos     /* Match the name in the info table */
    269  1.1.1.3  christos 
    270  1.1.1.3  christos     for (Info = AslPredefinedInfo; Info->Name; Info++)
    271  1.1.1.3  christos     {
    272  1.1.1.3  christos         if (ACPI_COMPARE_NAME (Tag, Info->Name))
    273  1.1.1.3  christos         {
    274  1.1.1.3  christos             AcpiOsPrintf ("  // %4.4s: %s", Tag,
    275  1.1.1.3  christos                 ACPI_CAST_PTR (char, Info->Description));
    276  1.1.1.3  christos             return;
    277  1.1.1.3  christos         }
    278  1.1.1.3  christos     }
    279  1.1.1.3  christos 
    280  1.1.1.3  christos #endif
    281  1.1.1.3  christos     return;
    282  1.1.1.3  christos }
    283  1.1.1.3  christos 
    284  1.1.1.3  christos 
    285  1.1.1.3  christos /*******************************************************************************
    286  1.1.1.3  christos  *
    287      1.1    jruoho  * FUNCTION:    AcpiDmMethodFlags
    288      1.1    jruoho  *
    289      1.1    jruoho  * PARAMETERS:  Op              - Method Object to be examined
    290      1.1    jruoho  *
    291      1.1    jruoho  * RETURN:      None
    292      1.1    jruoho  *
    293      1.1    jruoho  * DESCRIPTION: Decode control method flags
    294      1.1    jruoho  *
    295      1.1    jruoho  ******************************************************************************/
    296      1.1    jruoho 
    297      1.1    jruoho void
    298      1.1    jruoho AcpiDmMethodFlags (
    299      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    300      1.1    jruoho {
    301      1.1    jruoho     UINT32                  Flags;
    302      1.1    jruoho     UINT32                  Args;
    303      1.1    jruoho 
    304      1.1    jruoho 
    305      1.1    jruoho     /* The next Op contains the flags */
    306      1.1    jruoho 
    307      1.1    jruoho     Op = AcpiPsGetDepthNext (NULL, Op);
    308      1.1    jruoho     Flags = (UINT8) Op->Common.Value.Integer;
    309      1.1    jruoho     Args = Flags & 0x07;
    310      1.1    jruoho 
    311      1.1    jruoho     /* Mark the Op as completed */
    312      1.1    jruoho 
    313      1.1    jruoho     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    314      1.1    jruoho 
    315      1.1    jruoho     /* 1) Method argument count */
    316      1.1    jruoho 
    317      1.1    jruoho     AcpiOsPrintf (", %u, ", Args);
    318      1.1    jruoho 
    319      1.1    jruoho     /* 2) Serialize rule */
    320      1.1    jruoho 
    321      1.1    jruoho     if (!(Flags & 0x08))
    322      1.1    jruoho     {
    323      1.1    jruoho         AcpiOsPrintf ("Not");
    324      1.1    jruoho     }
    325      1.1    jruoho 
    326      1.1    jruoho     AcpiOsPrintf ("Serialized");
    327      1.1    jruoho 
    328      1.1    jruoho     /* 3) SyncLevel */
    329      1.1    jruoho 
    330      1.1    jruoho     if (Flags & 0xF0)
    331      1.1    jruoho     {
    332      1.1    jruoho         AcpiOsPrintf (", %u", Flags >> 4);
    333      1.1    jruoho     }
    334      1.1    jruoho }
    335      1.1    jruoho 
    336      1.1    jruoho 
    337      1.1    jruoho /*******************************************************************************
    338      1.1    jruoho  *
    339      1.1    jruoho  * FUNCTION:    AcpiDmFieldFlags
    340      1.1    jruoho  *
    341      1.1    jruoho  * PARAMETERS:  Op              - Field Object to be examined
    342      1.1    jruoho  *
    343      1.1    jruoho  * RETURN:      None
    344      1.1    jruoho  *
    345      1.1    jruoho  * DESCRIPTION: Decode Field definition flags
    346      1.1    jruoho  *
    347      1.1    jruoho  ******************************************************************************/
    348      1.1    jruoho 
    349      1.1    jruoho void
    350      1.1    jruoho AcpiDmFieldFlags (
    351      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    352      1.1    jruoho {
    353      1.1    jruoho     UINT32                  Flags;
    354      1.1    jruoho 
    355      1.1    jruoho 
    356      1.1    jruoho     Op = Op->Common.Next;
    357      1.1    jruoho     Flags = (UINT8) Op->Common.Value.Integer;
    358      1.1    jruoho 
    359      1.1    jruoho     /* Mark the Op as completed */
    360      1.1    jruoho 
    361      1.1    jruoho     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    362      1.1    jruoho 
    363      1.1    jruoho     AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]);
    364      1.1    jruoho     AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
    365      1.1    jruoho     AcpiOsPrintf ("%s)",  AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
    366      1.1    jruoho }
    367      1.1    jruoho 
    368      1.1    jruoho 
    369      1.1    jruoho /*******************************************************************************
    370      1.1    jruoho  *
    371      1.1    jruoho  * FUNCTION:    AcpiDmAddressSpace
    372      1.1    jruoho  *
    373      1.1    jruoho  * PARAMETERS:  SpaceId         - ID to be translated
    374      1.1    jruoho  *
    375      1.1    jruoho  * RETURN:      None
    376      1.1    jruoho  *
    377      1.1    jruoho  * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
    378      1.1    jruoho  *
    379      1.1    jruoho  ******************************************************************************/
    380      1.1    jruoho 
    381      1.1    jruoho void
    382      1.1    jruoho AcpiDmAddressSpace (
    383      1.1    jruoho     UINT8                   SpaceId)
    384      1.1    jruoho {
    385      1.1    jruoho 
    386      1.1    jruoho     if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
    387      1.1    jruoho     {
    388      1.1    jruoho         if (SpaceId == 0x7F)
    389      1.1    jruoho         {
    390      1.1    jruoho             AcpiOsPrintf ("FFixedHW, ");
    391      1.1    jruoho         }
    392      1.1    jruoho         else
    393      1.1    jruoho         {
    394      1.1    jruoho             AcpiOsPrintf ("0x%.2X, ", SpaceId);
    395      1.1    jruoho         }
    396      1.1    jruoho     }
    397      1.1    jruoho     else
    398      1.1    jruoho     {
    399      1.1    jruoho         AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
    400      1.1    jruoho     }
    401      1.1    jruoho }
    402      1.1    jruoho 
    403      1.1    jruoho 
    404      1.1    jruoho /*******************************************************************************
    405      1.1    jruoho  *
    406      1.1    jruoho  * FUNCTION:    AcpiDmRegionFlags
    407      1.1    jruoho  *
    408      1.1    jruoho  * PARAMETERS:  Op              - Object to be examined
    409      1.1    jruoho  *
    410      1.1    jruoho  * RETURN:      None
    411      1.1    jruoho  *
    412      1.1    jruoho  * DESCRIPTION: Decode OperationRegion flags
    413      1.1    jruoho  *
    414      1.1    jruoho  ******************************************************************************/
    415      1.1    jruoho 
    416      1.1    jruoho void
    417      1.1    jruoho AcpiDmRegionFlags (
    418      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    419      1.1    jruoho {
    420      1.1    jruoho 
    421      1.1    jruoho 
    422      1.1    jruoho     /* The next Op contains the SpaceId */
    423      1.1    jruoho 
    424      1.1    jruoho     Op = AcpiPsGetDepthNext (NULL, Op);
    425      1.1    jruoho 
    426      1.1    jruoho     /* Mark the Op as completed */
    427      1.1    jruoho 
    428      1.1    jruoho     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    429      1.1    jruoho 
    430      1.1    jruoho     AcpiOsPrintf (", ");
    431      1.1    jruoho     AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
    432      1.1    jruoho }
    433      1.1    jruoho 
    434      1.1    jruoho 
    435      1.1    jruoho /*******************************************************************************
    436      1.1    jruoho  *
    437      1.1    jruoho  * FUNCTION:    AcpiDmMatchOp
    438      1.1    jruoho  *
    439      1.1    jruoho  * PARAMETERS:  Op              - Match Object to be examined
    440      1.1    jruoho  *
    441      1.1    jruoho  * RETURN:      None
    442      1.1    jruoho  *
    443      1.1    jruoho  * DESCRIPTION: Decode Match opcode operands
    444      1.1    jruoho  *
    445      1.1    jruoho  ******************************************************************************/
    446      1.1    jruoho 
    447      1.1    jruoho void
    448      1.1    jruoho AcpiDmMatchOp (
    449      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    450      1.1    jruoho {
    451      1.1    jruoho     ACPI_PARSE_OBJECT       *NextOp;
    452      1.1    jruoho 
    453      1.1    jruoho 
    454      1.1    jruoho     NextOp = AcpiPsGetDepthNext (NULL, Op);
    455      1.1    jruoho     NextOp = NextOp->Common.Next;
    456      1.1    jruoho 
    457      1.1    jruoho     if (!NextOp)
    458      1.1    jruoho     {
    459      1.1    jruoho         /* Handle partial tree during single-step */
    460      1.1    jruoho 
    461      1.1    jruoho         return;
    462      1.1    jruoho     }
    463      1.1    jruoho 
    464      1.1    jruoho     /* Mark the two nodes that contain the encoding for the match keywords */
    465      1.1    jruoho 
    466      1.1    jruoho     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
    467      1.1    jruoho 
    468      1.1    jruoho     NextOp = NextOp->Common.Next;
    469      1.1    jruoho     NextOp = NextOp->Common.Next;
    470      1.1    jruoho     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
    471      1.1    jruoho }
    472      1.1    jruoho 
    473      1.1    jruoho 
    474      1.1    jruoho /*******************************************************************************
    475      1.1    jruoho  *
    476      1.1    jruoho  * FUNCTION:    AcpiDmMatchKeyword
    477      1.1    jruoho  *
    478      1.1    jruoho  * PARAMETERS:  Op              - Match Object to be examined
    479      1.1    jruoho  *
    480      1.1    jruoho  * RETURN:      None
    481      1.1    jruoho  *
    482      1.1    jruoho  * DESCRIPTION: Decode Match opcode operands
    483      1.1    jruoho  *
    484      1.1    jruoho  ******************************************************************************/
    485      1.1    jruoho 
    486      1.1    jruoho static void
    487      1.1    jruoho AcpiDmMatchKeyword (
    488      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    489      1.1    jruoho {
    490      1.1    jruoho 
    491      1.1    jruoho 
    492      1.1    jruoho     if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE)
    493      1.1    jruoho     {
    494      1.1    jruoho         AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
    495      1.1    jruoho     }
    496      1.1    jruoho     else
    497      1.1    jruoho     {
    498      1.1    jruoho         AcpiOsPrintf ("%s", ACPI_CAST_PTR (char,
    499      1.1    jruoho             AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]));
    500      1.1    jruoho     }
    501      1.1    jruoho }
    502      1.1    jruoho 
    503      1.1    jruoho 
    504      1.1    jruoho /*******************************************************************************
    505      1.1    jruoho  *
    506      1.1    jruoho  * FUNCTION:    AcpiDmDisassembleOneOp
    507      1.1    jruoho  *
    508      1.1    jruoho  * PARAMETERS:  WalkState           - Current walk info
    509      1.1    jruoho  *              Info                - Parse tree walk info
    510      1.1    jruoho  *              Op                  - Op that is to be printed
    511      1.1    jruoho  *
    512      1.1    jruoho  * RETURN:      None
    513      1.1    jruoho  *
    514      1.1    jruoho  * DESCRIPTION: Disassemble a single AML opcode
    515      1.1    jruoho  *
    516      1.1    jruoho  ******************************************************************************/
    517      1.1    jruoho 
    518      1.1    jruoho void
    519      1.1    jruoho AcpiDmDisassembleOneOp (
    520      1.1    jruoho     ACPI_WALK_STATE         *WalkState,
    521      1.1    jruoho     ACPI_OP_WALK_INFO       *Info,
    522      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    523      1.1    jruoho {
    524      1.1    jruoho     const ACPI_OPCODE_INFO  *OpInfo = NULL;
    525      1.1    jruoho     UINT32                  Offset;
    526      1.1    jruoho     UINT32                  Length;
    527      1.1    jruoho     ACPI_PARSE_OBJECT       *Child;
    528      1.1    jruoho     ACPI_STATUS             Status;
    529  1.1.1.3  christos     UINT8                   *Aml;
    530      1.1    jruoho 
    531      1.1    jruoho 
    532      1.1    jruoho     if (!Op)
    533      1.1    jruoho     {
    534      1.1    jruoho         AcpiOsPrintf ("<NULL OP PTR>");
    535      1.1    jruoho         return;
    536      1.1    jruoho     }
    537      1.1    jruoho 
    538      1.1    jruoho     switch (Op->Common.DisasmOpcode)
    539      1.1    jruoho     {
    540      1.1    jruoho     case ACPI_DASM_MATCHOP:
    541      1.1    jruoho 
    542      1.1    jruoho         AcpiDmMatchKeyword (Op);
    543      1.1    jruoho         return;
    544      1.1    jruoho 
    545      1.1    jruoho     case ACPI_DASM_LNOT_SUFFIX:
    546  1.1.1.3  christos 
    547      1.1    jruoho         switch (Op->Common.AmlOpcode)
    548      1.1    jruoho         {
    549      1.1    jruoho         case AML_LEQUAL_OP:
    550  1.1.1.3  christos 
    551      1.1    jruoho             AcpiOsPrintf ("LNotEqual");
    552      1.1    jruoho             break;
    553      1.1    jruoho 
    554      1.1    jruoho         case AML_LGREATER_OP:
    555  1.1.1.3  christos 
    556      1.1    jruoho             AcpiOsPrintf ("LLessEqual");
    557      1.1    jruoho             break;
    558      1.1    jruoho 
    559      1.1    jruoho         case AML_LLESS_OP:
    560  1.1.1.3  christos 
    561      1.1    jruoho             AcpiOsPrintf ("LGreaterEqual");
    562      1.1    jruoho             break;
    563      1.1    jruoho 
    564      1.1    jruoho         default:
    565  1.1.1.3  christos 
    566      1.1    jruoho             break;
    567      1.1    jruoho         }
    568      1.1    jruoho         Op->Common.DisasmOpcode = 0;
    569      1.1    jruoho         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    570      1.1    jruoho         return;
    571      1.1    jruoho 
    572      1.1    jruoho     default:
    573      1.1    jruoho         break;
    574      1.1    jruoho     }
    575      1.1    jruoho 
    576      1.1    jruoho 
    577      1.1    jruoho     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
    578      1.1    jruoho 
    579      1.1    jruoho     /* The op and arguments */
    580      1.1    jruoho 
    581      1.1    jruoho     switch (Op->Common.AmlOpcode)
    582      1.1    jruoho     {
    583      1.1    jruoho     case AML_LNOT_OP:
    584      1.1    jruoho 
    585      1.1    jruoho         Child = Op->Common.Value.Arg;
    586      1.1    jruoho         if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) ||
    587      1.1    jruoho             (Child->Common.AmlOpcode == AML_LGREATER_OP) ||
    588      1.1    jruoho             (Child->Common.AmlOpcode == AML_LLESS_OP))
    589      1.1    jruoho         {
    590      1.1    jruoho             Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;
    591      1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
    592      1.1    jruoho         }
    593      1.1    jruoho         else
    594      1.1    jruoho         {
    595      1.1    jruoho             AcpiOsPrintf ("%s", OpInfo->Name);
    596      1.1    jruoho         }
    597      1.1    jruoho         break;
    598      1.1    jruoho 
    599      1.1    jruoho     case AML_BYTE_OP:
    600      1.1    jruoho 
    601      1.1    jruoho         AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
    602      1.1    jruoho         break;
    603      1.1    jruoho 
    604      1.1    jruoho     case AML_WORD_OP:
    605      1.1    jruoho 
    606      1.1    jruoho         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
    607      1.1    jruoho         {
    608      1.1    jruoho             AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
    609      1.1    jruoho         }
    610      1.1    jruoho         else
    611      1.1    jruoho         {
    612      1.1    jruoho             AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
    613      1.1    jruoho         }
    614      1.1    jruoho         break;
    615      1.1    jruoho 
    616      1.1    jruoho     case AML_DWORD_OP:
    617      1.1    jruoho 
    618      1.1    jruoho         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
    619      1.1    jruoho         {
    620      1.1    jruoho             AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
    621      1.1    jruoho         }
    622      1.1    jruoho         else
    623      1.1    jruoho         {
    624      1.1    jruoho             AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
    625      1.1    jruoho         }
    626      1.1    jruoho         break;
    627      1.1    jruoho 
    628      1.1    jruoho     case AML_QWORD_OP:
    629      1.1    jruoho 
    630      1.1    jruoho         AcpiOsPrintf ("0x%8.8X%8.8X",
    631      1.1    jruoho             ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
    632      1.1    jruoho         break;
    633      1.1    jruoho 
    634      1.1    jruoho     case AML_STRING_OP:
    635      1.1    jruoho 
    636  1.1.1.3  christos         AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX);
    637      1.1    jruoho         break;
    638      1.1    jruoho 
    639      1.1    jruoho     case AML_BUFFER_OP:
    640      1.1    jruoho         /*
    641  1.1.1.3  christos          * Determine the type of buffer. We can have one of the following:
    642      1.1    jruoho          *
    643      1.1    jruoho          * 1) ResourceTemplate containing Resource Descriptors.
    644      1.1    jruoho          * 2) Unicode String buffer
    645      1.1    jruoho          * 3) ASCII String buffer
    646      1.1    jruoho          * 4) Raw data buffer (if none of the above)
    647      1.1    jruoho          *
    648      1.1    jruoho          * Since there are no special AML opcodes to differentiate these
    649      1.1    jruoho          * types of buffers, we have to closely look at the data in the
    650      1.1    jruoho          * buffer to determine the type.
    651      1.1    jruoho          */
    652  1.1.1.3  christos         if (!AcpiGbl_NoResourceDisassembly)
    653      1.1    jruoho         {
    654  1.1.1.3  christos             Status = AcpiDmIsResourceTemplate (WalkState, Op);
    655  1.1.1.3  christos             if (ACPI_SUCCESS (Status))
    656  1.1.1.3  christos             {
    657  1.1.1.3  christos                 Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
    658  1.1.1.3  christos                 AcpiOsPrintf ("ResourceTemplate");
    659  1.1.1.3  christos                 break;
    660  1.1.1.3  christos             }
    661  1.1.1.3  christos             else if (Status == AE_AML_NO_RESOURCE_END_TAG)
    662  1.1.1.3  christos             {
    663  1.1.1.3  christos                 AcpiOsPrintf ("/**** Is ResourceTemplate, but EndTag not at buffer end ****/ ");
    664  1.1.1.3  christos             }
    665      1.1    jruoho         }
    666      1.1    jruoho 
    667      1.1    jruoho         if (AcpiDmIsUnicodeBuffer (Op))
    668      1.1    jruoho         {
    669      1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
    670      1.1    jruoho             AcpiOsPrintf ("Unicode (");
    671      1.1    jruoho         }
    672      1.1    jruoho         else if (AcpiDmIsStringBuffer (Op))
    673      1.1    jruoho         {
    674      1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_STRING;
    675      1.1    jruoho             AcpiOsPrintf ("Buffer");
    676      1.1    jruoho         }
    677  1.1.1.3  christos         else if (AcpiDmIsPldBuffer (Op))
    678  1.1.1.3  christos         {
    679  1.1.1.3  christos             Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD;
    680  1.1.1.3  christos             AcpiOsPrintf ("Buffer");
    681  1.1.1.3  christos         }
    682      1.1    jruoho         else
    683      1.1    jruoho         {
    684      1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
    685      1.1    jruoho             AcpiOsPrintf ("Buffer");
    686      1.1    jruoho         }
    687      1.1    jruoho         break;
    688      1.1    jruoho 
    689      1.1    jruoho     case AML_INT_STATICSTRING_OP:
    690      1.1    jruoho 
    691      1.1    jruoho         if (Op->Common.Value.String)
    692      1.1    jruoho         {
    693      1.1    jruoho             AcpiOsPrintf ("%s", Op->Common.Value.String);
    694      1.1    jruoho         }
    695      1.1    jruoho         else
    696      1.1    jruoho         {
    697      1.1    jruoho             AcpiOsPrintf ("\"<NULL STATIC STRING PTR>\"");
    698      1.1    jruoho         }
    699      1.1    jruoho         break;
    700      1.1    jruoho 
    701      1.1    jruoho     case AML_INT_NAMEPATH_OP:
    702      1.1    jruoho 
    703      1.1    jruoho         AcpiDmNamestring (Op->Common.Value.Name);
    704      1.1    jruoho         break;
    705      1.1    jruoho 
    706      1.1    jruoho     case AML_INT_NAMEDFIELD_OP:
    707      1.1    jruoho 
    708      1.1    jruoho         Length = AcpiDmDumpName (Op->Named.Name);
    709      1.1    jruoho         AcpiOsPrintf (",%*.s  %u", (unsigned) (5 - Length), " ",
    710      1.1    jruoho             (UINT32) Op->Common.Value.Integer);
    711      1.1    jruoho         AcpiDmCommaIfFieldMember (Op);
    712      1.1    jruoho 
    713      1.1    jruoho         Info->BitOffset += (UINT32) Op->Common.Value.Integer;
    714      1.1    jruoho         break;
    715      1.1    jruoho 
    716      1.1    jruoho     case AML_INT_RESERVEDFIELD_OP:
    717      1.1    jruoho 
    718      1.1    jruoho         /* Offset() -- Must account for previous offsets */
    719      1.1    jruoho 
    720      1.1    jruoho         Offset = (UINT32) Op->Common.Value.Integer;
    721      1.1    jruoho         Info->BitOffset += Offset;
    722      1.1    jruoho 
    723      1.1    jruoho         if (Info->BitOffset % 8 == 0)
    724      1.1    jruoho         {
    725  1.1.1.3  christos             AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
    726      1.1    jruoho         }
    727      1.1    jruoho         else
    728      1.1    jruoho         {
    729      1.1    jruoho             AcpiOsPrintf ("    ,   %u", Offset);
    730      1.1    jruoho         }
    731      1.1    jruoho 
    732      1.1    jruoho         AcpiDmCommaIfFieldMember (Op);
    733      1.1    jruoho         break;
    734      1.1    jruoho 
    735      1.1    jruoho     case AML_INT_ACCESSFIELD_OP:
    736  1.1.1.3  christos     case AML_INT_EXTACCESSFIELD_OP:
    737  1.1.1.3  christos 
    738  1.1.1.3  christos         AcpiOsPrintf ("AccessAs (%s, ",
    739  1.1.1.3  christos             AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]);
    740  1.1.1.3  christos 
    741  1.1.1.3  christos         AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8));
    742      1.1    jruoho 
    743  1.1.1.3  christos         if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP)
    744  1.1.1.3  christos         {
    745  1.1.1.3  christos             AcpiOsPrintf (" (0x%2.2X)", (unsigned) ((Op->Common.Value.Integer >> 16) & 0xFF));
    746  1.1.1.3  christos         }
    747      1.1    jruoho 
    748      1.1    jruoho         AcpiOsPrintf (")");
    749      1.1    jruoho         AcpiDmCommaIfFieldMember (Op);
    750      1.1    jruoho         break;
    751      1.1    jruoho 
    752  1.1.1.3  christos     case AML_INT_CONNECTION_OP:
    753  1.1.1.3  christos         /*
    754  1.1.1.3  christos          * Two types of Connection() - one with a buffer object, the
    755  1.1.1.3  christos          * other with a namestring that points to a buffer object.
    756  1.1.1.3  christos          */
    757  1.1.1.3  christos         AcpiOsPrintf ("Connection (");
    758  1.1.1.3  christos         Child = Op->Common.Value.Arg;
    759  1.1.1.3  christos 
    760  1.1.1.3  christos         if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
    761  1.1.1.3  christos         {
    762  1.1.1.3  christos             AcpiOsPrintf ("\n");
    763  1.1.1.3  christos 
    764  1.1.1.3  christos             Aml = Child->Named.Data;
    765  1.1.1.3  christos             Length = (UINT32) Child->Common.Value.Integer;
    766  1.1.1.3  christos 
    767  1.1.1.3  christos             Info->Level += 1;
    768  1.1.1.3  christos             Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
    769  1.1.1.3  christos             AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length);
    770  1.1.1.3  christos 
    771  1.1.1.3  christos             Info->Level -= 1;
    772  1.1.1.3  christos             AcpiDmIndent (Info->Level);
    773  1.1.1.3  christos         }
    774  1.1.1.3  christos         else
    775  1.1.1.3  christos         {
    776  1.1.1.3  christos             AcpiDmNamestring (Child->Common.Value.Name);
    777  1.1.1.3  christos         }
    778  1.1.1.3  christos 
    779  1.1.1.3  christos         AcpiOsPrintf (")");
    780  1.1.1.3  christos         AcpiDmCommaIfFieldMember (Op);
    781  1.1.1.3  christos         AcpiOsPrintf ("\n");
    782  1.1.1.3  christos 
    783  1.1.1.3  christos         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */
    784  1.1.1.3  christos         Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    785  1.1.1.3  christos         break;
    786      1.1    jruoho 
    787      1.1    jruoho     case AML_INT_BYTELIST_OP:
    788      1.1    jruoho 
    789      1.1    jruoho         AcpiDmByteList (Info, Op);
    790      1.1    jruoho         break;
    791      1.1    jruoho 
    792      1.1    jruoho     case AML_INT_METHODCALL_OP:
    793      1.1    jruoho 
    794      1.1    jruoho         Op = AcpiPsGetDepthNext (NULL, Op);
    795      1.1    jruoho         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    796      1.1    jruoho 
    797      1.1    jruoho         AcpiDmNamestring (Op->Common.Value.Name);
    798      1.1    jruoho         break;
    799      1.1    jruoho 
    800      1.1    jruoho     default:
    801      1.1    jruoho 
    802      1.1    jruoho         /* Just get the opcode name and print it */
    803      1.1    jruoho 
    804      1.1    jruoho         AcpiOsPrintf ("%s", OpInfo->Name);
    805      1.1    jruoho 
    806      1.1    jruoho 
    807      1.1    jruoho #ifdef ACPI_DEBUGGER
    808      1.1    jruoho 
    809      1.1    jruoho         if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
    810      1.1    jruoho             (WalkState) &&
    811      1.1    jruoho             (WalkState->Results) &&
    812      1.1    jruoho             (WalkState->ResultCount))
    813      1.1    jruoho         {
    814      1.1    jruoho             AcpiDmDecodeInternalObject (
    815      1.1    jruoho                 WalkState->Results->Results.ObjDesc [
    816      1.1    jruoho                     (WalkState->ResultCount - 1) %
    817      1.1    jruoho                         ACPI_RESULTS_FRAME_OBJ_NUM]);
    818      1.1    jruoho         }
    819      1.1    jruoho #endif
    820      1.1    jruoho 
    821      1.1    jruoho         break;
    822      1.1    jruoho     }
    823      1.1    jruoho }
    824      1.1    jruoho 
    825      1.1    jruoho #endif  /* ACPI_DISASSEMBLER */
    826