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