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