Home | History | Annotate | Line # | Download | only in disassembler
dmopcode.c revision 1.1.1.4.2.6
      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.4.2.3     skrll  * Copyright (C) 2000 - 2016, 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.1.4  christos #include "acinterp.h"
     49      1.1.1.4  christos #include "acnamesp.h"
     50  1.1.1.4.2.2     skrll #include "acdebug.h"
     51          1.1    jruoho 
     52          1.1    jruoho 
     53          1.1    jruoho #define _COMPONENT          ACPI_CA_DEBUGGER
     54          1.1    jruoho         ACPI_MODULE_NAME    ("dmopcode")
     55          1.1    jruoho 
     56  1.1.1.4.2.1     skrll 
     57          1.1    jruoho /* Local prototypes */
     58          1.1    jruoho 
     59          1.1    jruoho static void
     60          1.1    jruoho AcpiDmMatchKeyword (
     61          1.1    jruoho     ACPI_PARSE_OBJECT       *Op);
     62          1.1    jruoho 
     63  1.1.1.4.2.3     skrll static void
     64  1.1.1.4.2.3     skrll AcpiDmConvertToElseIf (
     65  1.1.1.4.2.3     skrll     ACPI_PARSE_OBJECT       *Op);
     66  1.1.1.4.2.3     skrll 
     67  1.1.1.4.2.6     skrll static void
     68  1.1.1.4.2.6     skrll AcpiDmPromoteSubtree (
     69  1.1.1.4.2.6     skrll     ACPI_PARSE_OBJECT       *StartOp);
     70  1.1.1.4.2.6     skrll 
     71          1.1    jruoho 
     72          1.1    jruoho /*******************************************************************************
     73          1.1    jruoho  *
     74      1.1.1.4  christos  * FUNCTION:    AcpiDmDisplayTargetPathname
     75      1.1.1.4  christos  *
     76      1.1.1.4  christos  * PARAMETERS:  Op              - Parse object
     77      1.1.1.4  christos  *
     78      1.1.1.4  christos  * RETURN:      None
     79      1.1.1.4  christos  *
     80      1.1.1.4  christos  * DESCRIPTION: For AML opcodes that have a target operand, display the full
     81      1.1.1.4  christos  *              pathname for the target, in a comment field. Handles Return()
     82      1.1.1.4  christos  *              statements also.
     83      1.1.1.4  christos  *
     84      1.1.1.4  christos  ******************************************************************************/
     85      1.1.1.4  christos 
     86      1.1.1.4  christos void
     87      1.1.1.4  christos AcpiDmDisplayTargetPathname (
     88      1.1.1.4  christos     ACPI_PARSE_OBJECT       *Op)
     89      1.1.1.4  christos {
     90      1.1.1.4  christos     ACPI_PARSE_OBJECT       *NextOp;
     91      1.1.1.4  christos     ACPI_PARSE_OBJECT       *PrevOp = NULL;
     92      1.1.1.4  christos     char                    *Pathname;
     93      1.1.1.4  christos     const ACPI_OPCODE_INFO  *OpInfo;
     94      1.1.1.4  christos 
     95      1.1.1.4  christos 
     96      1.1.1.4  christos     if (Op->Common.AmlOpcode == AML_RETURN_OP)
     97      1.1.1.4  christos     {
     98      1.1.1.4  christos         PrevOp = Op->Asl.Value.Arg;
     99      1.1.1.4  christos     }
    100      1.1.1.4  christos     else
    101      1.1.1.4  christos     {
    102      1.1.1.4  christos         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
    103      1.1.1.4  christos         if (!(OpInfo->Flags & AML_HAS_TARGET))
    104      1.1.1.4  christos         {
    105      1.1.1.4  christos             return;
    106      1.1.1.4  christos         }
    107      1.1.1.4  christos 
    108      1.1.1.4  christos         /* Target is the last Op in the arg list */
    109      1.1.1.4  christos 
    110      1.1.1.4  christos         NextOp = Op->Asl.Value.Arg;
    111      1.1.1.4  christos         while (NextOp)
    112      1.1.1.4  christos         {
    113      1.1.1.4  christos             PrevOp = NextOp;
    114      1.1.1.4  christos             NextOp = PrevOp->Asl.Next;
    115      1.1.1.4  christos         }
    116      1.1.1.4  christos     }
    117      1.1.1.4  christos 
    118      1.1.1.4  christos     if (!PrevOp)
    119      1.1.1.4  christos     {
    120      1.1.1.4  christos         return;
    121      1.1.1.4  christos     }
    122      1.1.1.4  christos 
    123      1.1.1.4  christos     /* We must have a namepath AML opcode */
    124      1.1.1.4  christos 
    125      1.1.1.4  christos     if (PrevOp->Asl.AmlOpcode != AML_INT_NAMEPATH_OP)
    126      1.1.1.4  christos     {
    127      1.1.1.4  christos         return;
    128      1.1.1.4  christos     }
    129      1.1.1.4  christos 
    130      1.1.1.4  christos     /* A null string is the "no target specified" case */
    131      1.1.1.4  christos 
    132      1.1.1.4  christos     if (!PrevOp->Asl.Value.String)
    133      1.1.1.4  christos     {
    134      1.1.1.4  christos         return;
    135      1.1.1.4  christos     }
    136      1.1.1.4  christos 
    137      1.1.1.4  christos     /* No node means "unresolved external reference" */
    138      1.1.1.4  christos 
    139      1.1.1.4  christos     if (!PrevOp->Asl.Node)
    140      1.1.1.4  christos     {
    141      1.1.1.4  christos         AcpiOsPrintf (" /* External reference */");
    142      1.1.1.4  christos         return;
    143      1.1.1.4  christos     }
    144      1.1.1.4  christos 
    145      1.1.1.4  christos     /* Ignore if path is already from the root */
    146      1.1.1.4  christos 
    147      1.1.1.4  christos     if (*PrevOp->Asl.Value.String == '\\')
    148      1.1.1.4  christos     {
    149      1.1.1.4  christos         return;
    150      1.1.1.4  christos     }
    151      1.1.1.4  christos 
    152      1.1.1.4  christos     /* Now: we can get the full pathname */
    153      1.1.1.4  christos 
    154      1.1.1.4  christos     Pathname = AcpiNsGetExternalPathname (PrevOp->Asl.Node);
    155      1.1.1.4  christos     if (!Pathname)
    156      1.1.1.4  christos     {
    157      1.1.1.4  christos         return;
    158      1.1.1.4  christos     }
    159      1.1.1.4  christos 
    160      1.1.1.4  christos     AcpiOsPrintf (" /* %s */", Pathname);
    161      1.1.1.4  christos     ACPI_FREE (Pathname);
    162      1.1.1.4  christos }
    163      1.1.1.4  christos 
    164      1.1.1.4  christos 
    165      1.1.1.4  christos /*******************************************************************************
    166      1.1.1.4  christos  *
    167      1.1.1.4  christos  * FUNCTION:    AcpiDmNotifyDescription
    168      1.1.1.4  christos  *
    169      1.1.1.4  christos  * PARAMETERS:  Op              - Name() parse object
    170      1.1.1.4  christos  *
    171      1.1.1.4  christos  * RETURN:      None
    172      1.1.1.4  christos  *
    173      1.1.1.4  christos  * DESCRIPTION: Emit a description comment for the value associated with a
    174      1.1.1.4  christos  *              Notify() operator.
    175      1.1.1.4  christos  *
    176      1.1.1.4  christos  ******************************************************************************/
    177      1.1.1.4  christos 
    178      1.1.1.4  christos void
    179      1.1.1.4  christos AcpiDmNotifyDescription (
    180      1.1.1.4  christos     ACPI_PARSE_OBJECT       *Op)
    181      1.1.1.4  christos {
    182      1.1.1.4  christos     ACPI_PARSE_OBJECT       *NextOp;
    183      1.1.1.4  christos     ACPI_NAMESPACE_NODE     *Node;
    184      1.1.1.4  christos     UINT8                   NotifyValue;
    185      1.1.1.4  christos     UINT8                   Type = ACPI_TYPE_ANY;
    186      1.1.1.4  christos 
    187      1.1.1.4  christos 
    188      1.1.1.4  christos     /* The notify value is the second argument */
    189      1.1.1.4  christos 
    190      1.1.1.4  christos     NextOp = Op->Asl.Value.Arg;
    191      1.1.1.4  christos     NextOp = NextOp->Asl.Next;
    192      1.1.1.4  christos 
    193      1.1.1.4  christos     switch (NextOp->Common.AmlOpcode)
    194      1.1.1.4  christos     {
    195      1.1.1.4  christos     case AML_ZERO_OP:
    196      1.1.1.4  christos     case AML_ONE_OP:
    197      1.1.1.4  christos 
    198      1.1.1.4  christos         NotifyValue = (UINT8) NextOp->Common.AmlOpcode;
    199      1.1.1.4  christos         break;
    200      1.1.1.4  christos 
    201      1.1.1.4  christos     case AML_BYTE_OP:
    202      1.1.1.4  christos 
    203      1.1.1.4  christos         NotifyValue = (UINT8) NextOp->Asl.Value.Integer;
    204      1.1.1.4  christos         break;
    205      1.1.1.4  christos 
    206      1.1.1.4  christos     default:
    207      1.1.1.4  christos         return;
    208      1.1.1.4  christos     }
    209      1.1.1.4  christos 
    210      1.1.1.4  christos     /*
    211      1.1.1.4  christos      * Attempt to get the namespace node so we can determine the object type.
    212      1.1.1.4  christos      * Some notify values are dependent on the object type (Device, Thermal,
    213      1.1.1.4  christos      * or Processor).
    214      1.1.1.4  christos      */
    215      1.1.1.4  christos     Node = Op->Asl.Node;
    216      1.1.1.4  christos     if (Node)
    217      1.1.1.4  christos     {
    218      1.1.1.4  christos         Type = Node->Type;
    219      1.1.1.4  christos     }
    220      1.1.1.4  christos 
    221      1.1.1.4  christos     AcpiOsPrintf (" // %s", AcpiUtGetNotifyName (NotifyValue, Type));
    222      1.1.1.4  christos }
    223      1.1.1.4  christos 
    224      1.1.1.4  christos 
    225      1.1.1.4  christos /*******************************************************************************
    226      1.1.1.4  christos  *
    227      1.1.1.3  christos  * FUNCTION:    AcpiDmPredefinedDescription
    228      1.1.1.3  christos  *
    229      1.1.1.3  christos  * PARAMETERS:  Op              - Name() parse object
    230      1.1.1.3  christos  *
    231      1.1.1.3  christos  * RETURN:      None
    232      1.1.1.3  christos  *
    233      1.1.1.3  christos  * DESCRIPTION: Emit a description comment for a predefined ACPI name.
    234      1.1.1.3  christos  *              Used for iASL compiler only.
    235      1.1.1.3  christos  *
    236      1.1.1.3  christos  ******************************************************************************/
    237      1.1.1.3  christos 
    238      1.1.1.3  christos void
    239      1.1.1.3  christos AcpiDmPredefinedDescription (
    240      1.1.1.3  christos     ACPI_PARSE_OBJECT       *Op)
    241      1.1.1.3  christos {
    242      1.1.1.3  christos #ifdef ACPI_ASL_COMPILER
    243      1.1.1.3  christos     const AH_PREDEFINED_NAME    *Info;
    244      1.1.1.3  christos     char                        *NameString;
    245      1.1.1.3  christos     int                         LastCharIsDigit;
    246      1.1.1.3  christos     int                         LastCharsAreHex;
    247      1.1.1.3  christos 
    248      1.1.1.3  christos 
    249      1.1.1.3  christos     if (!Op)
    250      1.1.1.3  christos     {
    251      1.1.1.3  christos         return;
    252      1.1.1.3  christos     }
    253      1.1.1.3  christos 
    254      1.1.1.3  christos     /* Ensure that the comment field is emitted only once */
    255      1.1.1.3  christos 
    256  1.1.1.4.2.4     skrll     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
    257      1.1.1.3  christos     {
    258      1.1.1.3  christos         return;
    259      1.1.1.3  christos     }
    260  1.1.1.4.2.4     skrll     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
    261      1.1.1.3  christos 
    262      1.1.1.3  christos     /* Predefined name must start with an underscore */
    263      1.1.1.3  christos 
    264      1.1.1.3  christos     NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
    265      1.1.1.3  christos     if (NameString[0] != '_')
    266      1.1.1.3  christos     {
    267      1.1.1.3  christos         return;
    268      1.1.1.3  christos     }
    269      1.1.1.3  christos 
    270      1.1.1.3  christos     /*
    271      1.1.1.3  christos      * Check for the special ACPI names:
    272      1.1.1.3  christos      * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
    273      1.1.1.3  christos      * (where d=decimal_digit, x=hex_digit, a=anything)
    274      1.1.1.3  christos      *
    275      1.1.1.3  christos      * Convert these to the generic name for table lookup.
    276      1.1.1.3  christos      * Note: NameString is guaranteed to be upper case here.
    277      1.1.1.3  christos      */
    278      1.1.1.3  christos     LastCharIsDigit =
    279  1.1.1.4.2.2     skrll         (isdigit ((int) NameString[3]));    /* d */
    280      1.1.1.3  christos     LastCharsAreHex =
    281  1.1.1.4.2.2     skrll         (isxdigit ((int) NameString[2]) &&  /* xx */
    282  1.1.1.4.2.2     skrll          isxdigit ((int) NameString[3]));
    283      1.1.1.3  christos 
    284      1.1.1.3  christos     switch (NameString[1])
    285      1.1.1.3  christos     {
    286      1.1.1.3  christos     case 'A':
    287      1.1.1.3  christos 
    288      1.1.1.3  christos         if ((NameString[2] == 'C') && (LastCharIsDigit))
    289      1.1.1.3  christos         {
    290      1.1.1.3  christos             NameString = "_ACx";
    291      1.1.1.3  christos         }
    292      1.1.1.3  christos         else if ((NameString[2] == 'L') && (LastCharIsDigit))
    293      1.1.1.3  christos         {
    294      1.1.1.3  christos             NameString = "_ALx";
    295      1.1.1.3  christos         }
    296      1.1.1.3  christos         break;
    297      1.1.1.3  christos 
    298      1.1.1.3  christos     case 'E':
    299      1.1.1.3  christos 
    300      1.1.1.3  christos         if ((NameString[2] == 'J') && (LastCharIsDigit))
    301      1.1.1.3  christos         {
    302      1.1.1.3  christos             NameString = "_EJx";
    303      1.1.1.3  christos         }
    304      1.1.1.3  christos         else if (LastCharsAreHex)
    305      1.1.1.3  christos         {
    306      1.1.1.3  christos             NameString = "_Exx";
    307      1.1.1.3  christos         }
    308      1.1.1.3  christos         break;
    309      1.1.1.3  christos 
    310      1.1.1.3  christos     case 'L':
    311      1.1.1.3  christos 
    312      1.1.1.3  christos         if (LastCharsAreHex)
    313      1.1.1.3  christos         {
    314      1.1.1.3  christos             NameString = "_Lxx";
    315      1.1.1.3  christos         }
    316      1.1.1.3  christos         break;
    317      1.1.1.3  christos 
    318      1.1.1.3  christos     case 'Q':
    319      1.1.1.3  christos 
    320      1.1.1.3  christos         if (LastCharsAreHex)
    321      1.1.1.3  christos         {
    322      1.1.1.3  christos             NameString = "_Qxx";
    323      1.1.1.3  christos         }
    324      1.1.1.3  christos         break;
    325      1.1.1.3  christos 
    326      1.1.1.3  christos     case 'T':
    327      1.1.1.3  christos 
    328      1.1.1.3  christos         if (NameString[2] == '_')
    329      1.1.1.3  christos         {
    330      1.1.1.3  christos             NameString = "_T_x";
    331      1.1.1.3  christos         }
    332      1.1.1.3  christos         break;
    333      1.1.1.3  christos 
    334      1.1.1.3  christos     case 'W':
    335      1.1.1.3  christos 
    336      1.1.1.3  christos         if (LastCharsAreHex)
    337      1.1.1.3  christos         {
    338      1.1.1.3  christos             NameString = "_Wxx";
    339      1.1.1.3  christos         }
    340      1.1.1.3  christos         break;
    341      1.1.1.3  christos 
    342      1.1.1.3  christos     default:
    343      1.1.1.3  christos 
    344      1.1.1.3  christos         break;
    345      1.1.1.3  christos     }
    346      1.1.1.3  christos 
    347      1.1.1.3  christos     /* Match the name in the info table */
    348      1.1.1.3  christos 
    349      1.1.1.4  christos     Info = AcpiAhMatchPredefinedName (NameString);
    350      1.1.1.4  christos     if (Info)
    351      1.1.1.3  christos     {
    352      1.1.1.4  christos         AcpiOsPrintf ("  // %4.4s: %s",
    353      1.1.1.4  christos             NameString, ACPI_CAST_PTR (char, Info->Description));
    354      1.1.1.3  christos     }
    355      1.1.1.3  christos 
    356      1.1.1.3  christos #endif
    357      1.1.1.3  christos     return;
    358      1.1.1.3  christos }
    359      1.1.1.3  christos 
    360      1.1.1.3  christos 
    361      1.1.1.3  christos /*******************************************************************************
    362      1.1.1.3  christos  *
    363      1.1.1.3  christos  * FUNCTION:    AcpiDmFieldPredefinedDescription
    364      1.1.1.3  christos  *
    365      1.1.1.3  christos  * PARAMETERS:  Op              - Parse object
    366      1.1.1.3  christos  *
    367      1.1.1.3  christos  * RETURN:      None
    368      1.1.1.3  christos  *
    369      1.1.1.3  christos  * DESCRIPTION: Emit a description comment for a resource descriptor tag
    370      1.1.1.3  christos  *              (which is a predefined ACPI name.) Used for iASL compiler only.
    371      1.1.1.3  christos  *
    372      1.1.1.3  christos  ******************************************************************************/
    373      1.1.1.3  christos 
    374      1.1.1.3  christos void
    375      1.1.1.3  christos AcpiDmFieldPredefinedDescription (
    376      1.1.1.3  christos     ACPI_PARSE_OBJECT       *Op)
    377      1.1.1.3  christos {
    378      1.1.1.3  christos #ifdef ACPI_ASL_COMPILER
    379      1.1.1.3  christos     ACPI_PARSE_OBJECT       *IndexOp;
    380      1.1.1.3  christos     char                    *Tag;
    381      1.1.1.3  christos     const ACPI_OPCODE_INFO  *OpInfo;
    382      1.1.1.3  christos     const AH_PREDEFINED_NAME *Info;
    383      1.1.1.3  christos 
    384      1.1.1.3  christos 
    385      1.1.1.3  christos     if (!Op)
    386      1.1.1.3  christos     {
    387      1.1.1.3  christos         return;
    388      1.1.1.3  christos     }
    389      1.1.1.3  christos 
    390      1.1.1.3  christos     /* Ensure that the comment field is emitted only once */
    391      1.1.1.3  christos 
    392  1.1.1.4.2.4     skrll     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
    393      1.1.1.3  christos     {
    394      1.1.1.3  christos         return;
    395      1.1.1.3  christos     }
    396  1.1.1.4.2.4     skrll     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
    397      1.1.1.3  christos 
    398      1.1.1.3  christos     /*
    399      1.1.1.3  christos      * Op must be one of the Create* operators: CreateField, CreateBitField,
    400      1.1.1.3  christos      * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
    401      1.1.1.3  christos      */
    402      1.1.1.3  christos     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
    403      1.1.1.3  christos     if (!(OpInfo->Flags & AML_CREATE))
    404      1.1.1.3  christos     {
    405      1.1.1.3  christos         return;
    406      1.1.1.3  christos     }
    407      1.1.1.3  christos 
    408      1.1.1.3  christos     /* Second argument is the Index argument */
    409      1.1.1.3  christos 
    410      1.1.1.3  christos     IndexOp = Op->Common.Value.Arg;
    411      1.1.1.3  christos     IndexOp = IndexOp->Common.Next;
    412      1.1.1.3  christos 
    413      1.1.1.3  christos     /* Index argument must be a namepath */
    414      1.1.1.3  christos 
    415      1.1.1.3  christos     if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
    416      1.1.1.3  christos     {
    417      1.1.1.3  christos         return;
    418      1.1.1.3  christos     }
    419      1.1.1.3  christos 
    420      1.1.1.3  christos     /* Major cheat: We previously put the Tag ptr in the Node field */
    421      1.1.1.3  christos 
    422      1.1.1.3  christos     Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
    423      1.1.1.3  christos     if (!Tag)
    424      1.1.1.3  christos     {
    425      1.1.1.3  christos         return;
    426      1.1.1.3  christos     }
    427      1.1.1.3  christos 
    428      1.1.1.3  christos     /* Match the name in the info table */
    429      1.1.1.3  christos 
    430      1.1.1.4  christos     Info = AcpiAhMatchPredefinedName (Tag);
    431      1.1.1.4  christos     if (Info)
    432      1.1.1.3  christos     {
    433      1.1.1.4  christos         AcpiOsPrintf ("  // %4.4s: %s", Tag,
    434      1.1.1.4  christos             ACPI_CAST_PTR (char, Info->Description));
    435      1.1.1.3  christos     }
    436      1.1.1.3  christos 
    437      1.1.1.3  christos #endif
    438      1.1.1.3  christos     return;
    439      1.1.1.3  christos }
    440      1.1.1.3  christos 
    441      1.1.1.3  christos 
    442      1.1.1.3  christos /*******************************************************************************
    443      1.1.1.3  christos  *
    444          1.1    jruoho  * FUNCTION:    AcpiDmMethodFlags
    445          1.1    jruoho  *
    446          1.1    jruoho  * PARAMETERS:  Op              - Method Object to be examined
    447          1.1    jruoho  *
    448          1.1    jruoho  * RETURN:      None
    449          1.1    jruoho  *
    450          1.1    jruoho  * DESCRIPTION: Decode control method flags
    451          1.1    jruoho  *
    452          1.1    jruoho  ******************************************************************************/
    453          1.1    jruoho 
    454          1.1    jruoho void
    455          1.1    jruoho AcpiDmMethodFlags (
    456          1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    457          1.1    jruoho {
    458          1.1    jruoho     UINT32                  Flags;
    459          1.1    jruoho     UINT32                  Args;
    460          1.1    jruoho 
    461          1.1    jruoho 
    462          1.1    jruoho     /* The next Op contains the flags */
    463          1.1    jruoho 
    464          1.1    jruoho     Op = AcpiPsGetDepthNext (NULL, Op);
    465          1.1    jruoho     Flags = (UINT8) Op->Common.Value.Integer;
    466          1.1    jruoho     Args = Flags & 0x07;
    467          1.1    jruoho 
    468          1.1    jruoho     /* Mark the Op as completed */
    469          1.1    jruoho 
    470          1.1    jruoho     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    471          1.1    jruoho 
    472          1.1    jruoho     /* 1) Method argument count */
    473          1.1    jruoho 
    474          1.1    jruoho     AcpiOsPrintf (", %u, ", Args);
    475          1.1    jruoho 
    476          1.1    jruoho     /* 2) Serialize rule */
    477          1.1    jruoho 
    478          1.1    jruoho     if (!(Flags & 0x08))
    479          1.1    jruoho     {
    480          1.1    jruoho         AcpiOsPrintf ("Not");
    481          1.1    jruoho     }
    482          1.1    jruoho 
    483          1.1    jruoho     AcpiOsPrintf ("Serialized");
    484          1.1    jruoho 
    485          1.1    jruoho     /* 3) SyncLevel */
    486          1.1    jruoho 
    487          1.1    jruoho     if (Flags & 0xF0)
    488          1.1    jruoho     {
    489          1.1    jruoho         AcpiOsPrintf (", %u", Flags >> 4);
    490          1.1    jruoho     }
    491          1.1    jruoho }
    492          1.1    jruoho 
    493          1.1    jruoho 
    494          1.1    jruoho /*******************************************************************************
    495          1.1    jruoho  *
    496          1.1    jruoho  * FUNCTION:    AcpiDmFieldFlags
    497          1.1    jruoho  *
    498          1.1    jruoho  * PARAMETERS:  Op              - Field Object to be examined
    499          1.1    jruoho  *
    500          1.1    jruoho  * RETURN:      None
    501          1.1    jruoho  *
    502          1.1    jruoho  * DESCRIPTION: Decode Field definition flags
    503          1.1    jruoho  *
    504          1.1    jruoho  ******************************************************************************/
    505          1.1    jruoho 
    506          1.1    jruoho void
    507          1.1    jruoho AcpiDmFieldFlags (
    508          1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    509          1.1    jruoho {
    510          1.1    jruoho     UINT32                  Flags;
    511          1.1    jruoho 
    512          1.1    jruoho 
    513          1.1    jruoho     Op = Op->Common.Next;
    514          1.1    jruoho     Flags = (UINT8) Op->Common.Value.Integer;
    515          1.1    jruoho 
    516          1.1    jruoho     /* Mark the Op as completed */
    517          1.1    jruoho 
    518          1.1    jruoho     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    519          1.1    jruoho 
    520          1.1    jruoho     AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]);
    521          1.1    jruoho     AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
    522          1.1    jruoho     AcpiOsPrintf ("%s)",  AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
    523          1.1    jruoho }
    524          1.1    jruoho 
    525          1.1    jruoho 
    526          1.1    jruoho /*******************************************************************************
    527          1.1    jruoho  *
    528          1.1    jruoho  * FUNCTION:    AcpiDmAddressSpace
    529          1.1    jruoho  *
    530          1.1    jruoho  * PARAMETERS:  SpaceId         - ID to be translated
    531          1.1    jruoho  *
    532          1.1    jruoho  * RETURN:      None
    533          1.1    jruoho  *
    534          1.1    jruoho  * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
    535          1.1    jruoho  *
    536          1.1    jruoho  ******************************************************************************/
    537          1.1    jruoho 
    538          1.1    jruoho void
    539          1.1    jruoho AcpiDmAddressSpace (
    540          1.1    jruoho     UINT8                   SpaceId)
    541          1.1    jruoho {
    542          1.1    jruoho 
    543          1.1    jruoho     if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
    544          1.1    jruoho     {
    545          1.1    jruoho         if (SpaceId == 0x7F)
    546          1.1    jruoho         {
    547          1.1    jruoho             AcpiOsPrintf ("FFixedHW, ");
    548          1.1    jruoho         }
    549          1.1    jruoho         else
    550          1.1    jruoho         {
    551          1.1    jruoho             AcpiOsPrintf ("0x%.2X, ", SpaceId);
    552          1.1    jruoho         }
    553          1.1    jruoho     }
    554          1.1    jruoho     else
    555          1.1    jruoho     {
    556          1.1    jruoho         AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
    557          1.1    jruoho     }
    558          1.1    jruoho }
    559          1.1    jruoho 
    560          1.1    jruoho 
    561          1.1    jruoho /*******************************************************************************
    562          1.1    jruoho  *
    563          1.1    jruoho  * FUNCTION:    AcpiDmRegionFlags
    564          1.1    jruoho  *
    565          1.1    jruoho  * PARAMETERS:  Op              - Object to be examined
    566          1.1    jruoho  *
    567          1.1    jruoho  * RETURN:      None
    568          1.1    jruoho  *
    569          1.1    jruoho  * DESCRIPTION: Decode OperationRegion flags
    570          1.1    jruoho  *
    571          1.1    jruoho  ******************************************************************************/
    572          1.1    jruoho 
    573          1.1    jruoho void
    574          1.1    jruoho AcpiDmRegionFlags (
    575          1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    576          1.1    jruoho {
    577          1.1    jruoho 
    578          1.1    jruoho     /* The next Op contains the SpaceId */
    579          1.1    jruoho 
    580          1.1    jruoho     Op = AcpiPsGetDepthNext (NULL, Op);
    581          1.1    jruoho 
    582          1.1    jruoho     /* Mark the Op as completed */
    583          1.1    jruoho 
    584          1.1    jruoho     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    585          1.1    jruoho 
    586          1.1    jruoho     AcpiOsPrintf (", ");
    587          1.1    jruoho     AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
    588          1.1    jruoho }
    589          1.1    jruoho 
    590          1.1    jruoho 
    591          1.1    jruoho /*******************************************************************************
    592          1.1    jruoho  *
    593          1.1    jruoho  * FUNCTION:    AcpiDmMatchOp
    594          1.1    jruoho  *
    595          1.1    jruoho  * PARAMETERS:  Op              - Match Object to be examined
    596          1.1    jruoho  *
    597          1.1    jruoho  * RETURN:      None
    598          1.1    jruoho  *
    599          1.1    jruoho  * DESCRIPTION: Decode Match opcode operands
    600          1.1    jruoho  *
    601          1.1    jruoho  ******************************************************************************/
    602          1.1    jruoho 
    603          1.1    jruoho void
    604          1.1    jruoho AcpiDmMatchOp (
    605          1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    606          1.1    jruoho {
    607          1.1    jruoho     ACPI_PARSE_OBJECT       *NextOp;
    608          1.1    jruoho 
    609          1.1    jruoho 
    610          1.1    jruoho     NextOp = AcpiPsGetDepthNext (NULL, Op);
    611          1.1    jruoho     NextOp = NextOp->Common.Next;
    612          1.1    jruoho 
    613          1.1    jruoho     if (!NextOp)
    614          1.1    jruoho     {
    615          1.1    jruoho         /* Handle partial tree during single-step */
    616          1.1    jruoho 
    617          1.1    jruoho         return;
    618          1.1    jruoho     }
    619          1.1    jruoho 
    620          1.1    jruoho     /* Mark the two nodes that contain the encoding for the match keywords */
    621          1.1    jruoho 
    622          1.1    jruoho     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
    623          1.1    jruoho 
    624          1.1    jruoho     NextOp = NextOp->Common.Next;
    625          1.1    jruoho     NextOp = NextOp->Common.Next;
    626          1.1    jruoho     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
    627          1.1    jruoho }
    628          1.1    jruoho 
    629          1.1    jruoho 
    630          1.1    jruoho /*******************************************************************************
    631          1.1    jruoho  *
    632          1.1    jruoho  * FUNCTION:    AcpiDmMatchKeyword
    633          1.1    jruoho  *
    634          1.1    jruoho  * PARAMETERS:  Op              - Match Object to be examined
    635          1.1    jruoho  *
    636          1.1    jruoho  * RETURN:      None
    637          1.1    jruoho  *
    638          1.1    jruoho  * DESCRIPTION: Decode Match opcode operands
    639          1.1    jruoho  *
    640          1.1    jruoho  ******************************************************************************/
    641          1.1    jruoho 
    642          1.1    jruoho static void
    643          1.1    jruoho AcpiDmMatchKeyword (
    644          1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    645          1.1    jruoho {
    646          1.1    jruoho 
    647          1.1    jruoho     if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE)
    648          1.1    jruoho     {
    649          1.1    jruoho         AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
    650          1.1    jruoho     }
    651          1.1    jruoho     else
    652          1.1    jruoho     {
    653  1.1.1.4.2.4     skrll         AcpiOsPrintf ("%s",
    654  1.1.1.4.2.4     skrll             AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]);
    655          1.1    jruoho     }
    656          1.1    jruoho }
    657          1.1    jruoho 
    658          1.1    jruoho 
    659          1.1    jruoho /*******************************************************************************
    660          1.1    jruoho  *
    661          1.1    jruoho  * FUNCTION:    AcpiDmDisassembleOneOp
    662          1.1    jruoho  *
    663          1.1    jruoho  * PARAMETERS:  WalkState           - Current walk info
    664          1.1    jruoho  *              Info                - Parse tree walk info
    665          1.1    jruoho  *              Op                  - Op that is to be printed
    666          1.1    jruoho  *
    667          1.1    jruoho  * RETURN:      None
    668          1.1    jruoho  *
    669          1.1    jruoho  * DESCRIPTION: Disassemble a single AML opcode
    670          1.1    jruoho  *
    671          1.1    jruoho  ******************************************************************************/
    672          1.1    jruoho 
    673          1.1    jruoho void
    674          1.1    jruoho AcpiDmDisassembleOneOp (
    675          1.1    jruoho     ACPI_WALK_STATE         *WalkState,
    676          1.1    jruoho     ACPI_OP_WALK_INFO       *Info,
    677          1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    678          1.1    jruoho {
    679          1.1    jruoho     const ACPI_OPCODE_INFO  *OpInfo = NULL;
    680          1.1    jruoho     UINT32                  Offset;
    681          1.1    jruoho     UINT32                  Length;
    682          1.1    jruoho     ACPI_PARSE_OBJECT       *Child;
    683          1.1    jruoho     ACPI_STATUS             Status;
    684      1.1.1.3  christos     UINT8                   *Aml;
    685      1.1.1.4  christos     const AH_DEVICE_ID      *IdInfo;
    686          1.1    jruoho 
    687          1.1    jruoho 
    688          1.1    jruoho     if (!Op)
    689          1.1    jruoho     {
    690          1.1    jruoho         AcpiOsPrintf ("<NULL OP PTR>");
    691          1.1    jruoho         return;
    692          1.1    jruoho     }
    693          1.1    jruoho 
    694  1.1.1.4.2.3     skrll     if (Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)
    695  1.1.1.4.2.3     skrll     {
    696  1.1.1.4.2.3     skrll         return; /* ElseIf macro was already emitted */
    697  1.1.1.4.2.3     skrll     }
    698  1.1.1.4.2.3     skrll 
    699          1.1    jruoho     switch (Op->Common.DisasmOpcode)
    700          1.1    jruoho     {
    701          1.1    jruoho     case ACPI_DASM_MATCHOP:
    702          1.1    jruoho 
    703          1.1    jruoho         AcpiDmMatchKeyword (Op);
    704          1.1    jruoho         return;
    705          1.1    jruoho 
    706          1.1    jruoho     case ACPI_DASM_LNOT_SUFFIX:
    707      1.1.1.3  christos 
    708  1.1.1.4.2.1     skrll         if (!AcpiGbl_CstyleDisassembly)
    709          1.1    jruoho         {
    710  1.1.1.4.2.1     skrll             switch (Op->Common.AmlOpcode)
    711  1.1.1.4.2.1     skrll             {
    712  1.1.1.4.2.1     skrll             case AML_LEQUAL_OP:
    713  1.1.1.4.2.1     skrll                 AcpiOsPrintf ("LNotEqual");
    714  1.1.1.4.2.1     skrll                 break;
    715      1.1.1.3  christos 
    716  1.1.1.4.2.1     skrll             case AML_LGREATER_OP:
    717  1.1.1.4.2.1     skrll                 AcpiOsPrintf ("LLessEqual");
    718  1.1.1.4.2.1     skrll                 break;
    719          1.1    jruoho 
    720  1.1.1.4.2.1     skrll             case AML_LLESS_OP:
    721  1.1.1.4.2.1     skrll                 AcpiOsPrintf ("LGreaterEqual");
    722  1.1.1.4.2.1     skrll                 break;
    723      1.1.1.3  christos 
    724  1.1.1.4.2.1     skrll             default:
    725  1.1.1.4.2.1     skrll                 break;
    726  1.1.1.4.2.1     skrll             }
    727          1.1    jruoho         }
    728  1.1.1.4.2.1     skrll 
    729          1.1    jruoho         Op->Common.DisasmOpcode = 0;
    730          1.1    jruoho         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    731          1.1    jruoho         return;
    732          1.1    jruoho 
    733          1.1    jruoho     default:
    734          1.1    jruoho         break;
    735          1.1    jruoho     }
    736          1.1    jruoho 
    737          1.1    jruoho     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
    738          1.1    jruoho 
    739          1.1    jruoho     /* The op and arguments */
    740          1.1    jruoho 
    741          1.1    jruoho     switch (Op->Common.AmlOpcode)
    742          1.1    jruoho     {
    743          1.1    jruoho     case AML_LNOT_OP:
    744          1.1    jruoho 
    745          1.1    jruoho         Child = Op->Common.Value.Arg;
    746          1.1    jruoho         if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) ||
    747          1.1    jruoho             (Child->Common.AmlOpcode == AML_LGREATER_OP) ||
    748          1.1    jruoho             (Child->Common.AmlOpcode == AML_LLESS_OP))
    749          1.1    jruoho         {
    750          1.1    jruoho             Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;
    751          1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
    752          1.1    jruoho         }
    753          1.1    jruoho         else
    754          1.1    jruoho         {
    755          1.1    jruoho             AcpiOsPrintf ("%s", OpInfo->Name);
    756          1.1    jruoho         }
    757          1.1    jruoho         break;
    758          1.1    jruoho 
    759          1.1    jruoho     case AML_BYTE_OP:
    760          1.1    jruoho 
    761          1.1    jruoho         AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
    762          1.1    jruoho         break;
    763          1.1    jruoho 
    764          1.1    jruoho     case AML_WORD_OP:
    765          1.1    jruoho 
    766          1.1    jruoho         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
    767          1.1    jruoho         {
    768      1.1.1.4  christos             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
    769          1.1    jruoho         }
    770          1.1    jruoho         else
    771          1.1    jruoho         {
    772          1.1    jruoho             AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
    773          1.1    jruoho         }
    774          1.1    jruoho         break;
    775          1.1    jruoho 
    776          1.1    jruoho     case AML_DWORD_OP:
    777          1.1    jruoho 
    778          1.1    jruoho         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
    779          1.1    jruoho         {
    780      1.1.1.4  christos             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
    781          1.1    jruoho         }
    782          1.1    jruoho         else
    783          1.1    jruoho         {
    784          1.1    jruoho             AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
    785          1.1    jruoho         }
    786          1.1    jruoho         break;
    787          1.1    jruoho 
    788          1.1    jruoho     case AML_QWORD_OP:
    789          1.1    jruoho 
    790          1.1    jruoho         AcpiOsPrintf ("0x%8.8X%8.8X",
    791          1.1    jruoho             ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
    792          1.1    jruoho         break;
    793          1.1    jruoho 
    794          1.1    jruoho     case AML_STRING_OP:
    795          1.1    jruoho 
    796      1.1.1.3  christos         AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX);
    797      1.1.1.4  christos 
    798      1.1.1.4  christos         /* For _HID/_CID strings, attempt to output a descriptive comment */
    799      1.1.1.4  christos 
    800      1.1.1.4  christos         if (Op->Common.DisasmOpcode == ACPI_DASM_HID_STRING)
    801      1.1.1.4  christos         {
    802      1.1.1.4  christos             /* If we know about the ID, emit the description */
    803      1.1.1.4  christos 
    804      1.1.1.4  christos             IdInfo = AcpiAhMatchHardwareId (Op->Common.Value.String);
    805      1.1.1.4  christos             if (IdInfo)
    806      1.1.1.4  christos             {
    807      1.1.1.4  christos                 AcpiOsPrintf (" /* %s */", IdInfo->Description);
    808      1.1.1.4  christos             }
    809      1.1.1.4  christos         }
    810          1.1    jruoho         break;
    811          1.1    jruoho 
    812          1.1    jruoho     case AML_BUFFER_OP:
    813          1.1    jruoho         /*
    814      1.1.1.3  christos          * Determine the type of buffer. We can have one of the following:
    815          1.1    jruoho          *
    816          1.1    jruoho          * 1) ResourceTemplate containing Resource Descriptors.
    817          1.1    jruoho          * 2) Unicode String buffer
    818          1.1    jruoho          * 3) ASCII String buffer
    819          1.1    jruoho          * 4) Raw data buffer (if none of the above)
    820          1.1    jruoho          *
    821          1.1    jruoho          * Since there are no special AML opcodes to differentiate these
    822          1.1    jruoho          * types of buffers, we have to closely look at the data in the
    823          1.1    jruoho          * buffer to determine the type.
    824          1.1    jruoho          */
    825      1.1.1.3  christos         if (!AcpiGbl_NoResourceDisassembly)
    826          1.1    jruoho         {
    827      1.1.1.3  christos             Status = AcpiDmIsResourceTemplate (WalkState, Op);
    828      1.1.1.3  christos             if (ACPI_SUCCESS (Status))
    829      1.1.1.3  christos             {
    830      1.1.1.3  christos                 Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
    831      1.1.1.3  christos                 AcpiOsPrintf ("ResourceTemplate");
    832      1.1.1.3  christos                 break;
    833      1.1.1.3  christos             }
    834      1.1.1.3  christos             else if (Status == AE_AML_NO_RESOURCE_END_TAG)
    835      1.1.1.3  christos             {
    836  1.1.1.4.2.3     skrll                 AcpiOsPrintf (
    837  1.1.1.4.2.3     skrll                     "/**** Is ResourceTemplate, "
    838  1.1.1.4.2.3     skrll                     "but EndTag not at buffer end ****/ ");
    839      1.1.1.3  christos             }
    840          1.1    jruoho         }
    841          1.1    jruoho 
    842      1.1.1.4  christos         if (AcpiDmIsUuidBuffer (Op))
    843      1.1.1.4  christos         {
    844      1.1.1.4  christos             Op->Common.DisasmOpcode = ACPI_DASM_UUID;
    845      1.1.1.4  christos             AcpiOsPrintf ("ToUUID (");
    846      1.1.1.4  christos         }
    847      1.1.1.4  christos         else if (AcpiDmIsUnicodeBuffer (Op))
    848          1.1    jruoho         {
    849          1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
    850          1.1    jruoho             AcpiOsPrintf ("Unicode (");
    851          1.1    jruoho         }
    852          1.1    jruoho         else if (AcpiDmIsStringBuffer (Op))
    853          1.1    jruoho         {
    854          1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_STRING;
    855          1.1    jruoho             AcpiOsPrintf ("Buffer");
    856          1.1    jruoho         }
    857      1.1.1.3  christos         else if (AcpiDmIsPldBuffer (Op))
    858      1.1.1.3  christos         {
    859      1.1.1.3  christos             Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD;
    860  1.1.1.4.2.1     skrll             AcpiOsPrintf ("ToPLD (");
    861      1.1.1.3  christos         }
    862          1.1    jruoho         else
    863          1.1    jruoho         {
    864          1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
    865          1.1    jruoho             AcpiOsPrintf ("Buffer");
    866          1.1    jruoho         }
    867          1.1    jruoho         break;
    868          1.1    jruoho 
    869          1.1    jruoho     case AML_INT_NAMEPATH_OP:
    870          1.1    jruoho 
    871          1.1    jruoho         AcpiDmNamestring (Op->Common.Value.Name);
    872          1.1    jruoho         break;
    873          1.1    jruoho 
    874          1.1    jruoho     case AML_INT_NAMEDFIELD_OP:
    875          1.1    jruoho 
    876          1.1    jruoho         Length = AcpiDmDumpName (Op->Named.Name);
    877          1.1    jruoho         AcpiOsPrintf (",%*.s  %u", (unsigned) (5 - Length), " ",
    878          1.1    jruoho             (UINT32) Op->Common.Value.Integer);
    879          1.1    jruoho         AcpiDmCommaIfFieldMember (Op);
    880          1.1    jruoho 
    881          1.1    jruoho         Info->BitOffset += (UINT32) Op->Common.Value.Integer;
    882          1.1    jruoho         break;
    883          1.1    jruoho 
    884          1.1    jruoho     case AML_INT_RESERVEDFIELD_OP:
    885          1.1    jruoho 
    886          1.1    jruoho         /* Offset() -- Must account for previous offsets */
    887          1.1    jruoho 
    888          1.1    jruoho         Offset = (UINT32) Op->Common.Value.Integer;
    889          1.1    jruoho         Info->BitOffset += Offset;
    890          1.1    jruoho 
    891          1.1    jruoho         if (Info->BitOffset % 8 == 0)
    892          1.1    jruoho         {
    893      1.1.1.3  christos             AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
    894          1.1    jruoho         }
    895          1.1    jruoho         else
    896          1.1    jruoho         {
    897          1.1    jruoho             AcpiOsPrintf ("    ,   %u", Offset);
    898          1.1    jruoho         }
    899          1.1    jruoho 
    900          1.1    jruoho         AcpiDmCommaIfFieldMember (Op);
    901          1.1    jruoho         break;
    902          1.1    jruoho 
    903          1.1    jruoho     case AML_INT_ACCESSFIELD_OP:
    904      1.1.1.3  christos     case AML_INT_EXTACCESSFIELD_OP:
    905      1.1.1.3  christos 
    906      1.1.1.3  christos         AcpiOsPrintf ("AccessAs (%s, ",
    907      1.1.1.3  christos             AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]);
    908      1.1.1.3  christos 
    909      1.1.1.3  christos         AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8));
    910          1.1    jruoho 
    911      1.1.1.3  christos         if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP)
    912      1.1.1.3  christos         {
    913  1.1.1.4.2.3     skrll             AcpiOsPrintf (" (0x%2.2X)", (unsigned)
    914  1.1.1.4.2.3     skrll                 ((Op->Common.Value.Integer >> 16) & 0xFF));
    915      1.1.1.3  christos         }
    916          1.1    jruoho 
    917          1.1    jruoho         AcpiOsPrintf (")");
    918          1.1    jruoho         AcpiDmCommaIfFieldMember (Op);
    919          1.1    jruoho         break;
    920          1.1    jruoho 
    921      1.1.1.3  christos     case AML_INT_CONNECTION_OP:
    922      1.1.1.3  christos         /*
    923      1.1.1.3  christos          * Two types of Connection() - one with a buffer object, the
    924      1.1.1.3  christos          * other with a namestring that points to a buffer object.
    925      1.1.1.3  christos          */
    926      1.1.1.3  christos         AcpiOsPrintf ("Connection (");
    927      1.1.1.3  christos         Child = Op->Common.Value.Arg;
    928      1.1.1.3  christos 
    929      1.1.1.3  christos         if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
    930      1.1.1.3  christos         {
    931      1.1.1.3  christos             AcpiOsPrintf ("\n");
    932      1.1.1.3  christos 
    933      1.1.1.3  christos             Aml = Child->Named.Data;
    934      1.1.1.3  christos             Length = (UINT32) Child->Common.Value.Integer;
    935      1.1.1.3  christos 
    936      1.1.1.3  christos             Info->Level += 1;
    937      1.1.1.4  christos             Info->MappingOp = Op;
    938      1.1.1.3  christos             Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
    939      1.1.1.4  christos 
    940      1.1.1.3  christos             AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length);
    941      1.1.1.3  christos 
    942      1.1.1.3  christos             Info->Level -= 1;
    943      1.1.1.3  christos             AcpiDmIndent (Info->Level);
    944      1.1.1.3  christos         }
    945      1.1.1.3  christos         else
    946      1.1.1.3  christos         {
    947      1.1.1.3  christos             AcpiDmNamestring (Child->Common.Value.Name);
    948      1.1.1.3  christos         }
    949      1.1.1.3  christos 
    950      1.1.1.3  christos         AcpiOsPrintf (")");
    951      1.1.1.3  christos         AcpiDmCommaIfFieldMember (Op);
    952      1.1.1.3  christos         AcpiOsPrintf ("\n");
    953      1.1.1.3  christos 
    954      1.1.1.3  christos         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */
    955      1.1.1.3  christos         Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    956      1.1.1.3  christos         break;
    957          1.1    jruoho 
    958          1.1    jruoho     case AML_INT_BYTELIST_OP:
    959          1.1    jruoho 
    960          1.1    jruoho         AcpiDmByteList (Info, Op);
    961          1.1    jruoho         break;
    962          1.1    jruoho 
    963          1.1    jruoho     case AML_INT_METHODCALL_OP:
    964          1.1    jruoho 
    965          1.1    jruoho         Op = AcpiPsGetDepthNext (NULL, Op);
    966          1.1    jruoho         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    967          1.1    jruoho 
    968          1.1    jruoho         AcpiDmNamestring (Op->Common.Value.Name);
    969          1.1    jruoho         break;
    970          1.1    jruoho 
    971  1.1.1.4.2.3     skrll     case AML_ELSE_OP:
    972  1.1.1.4.2.3     skrll 
    973  1.1.1.4.2.3     skrll         AcpiDmConvertToElseIf (Op);
    974  1.1.1.4.2.3     skrll         break;
    975  1.1.1.4.2.3     skrll 
    976  1.1.1.4.2.4     skrll     case AML_EXTERNAL_OP:
    977  1.1.1.4.2.4     skrll 
    978  1.1.1.4.2.5     skrll         if (AcpiGbl_DmEmitExternalOpcodes)
    979  1.1.1.4.2.5     skrll         {
    980  1.1.1.4.2.5     skrll             AcpiOsPrintf ("/* Opcode 0x15 */ ");
    981  1.1.1.4.2.5     skrll 
    982  1.1.1.4.2.5     skrll             /* Fallthrough */
    983  1.1.1.4.2.5     skrll         }
    984  1.1.1.4.2.5     skrll         else
    985  1.1.1.4.2.5     skrll         {
    986  1.1.1.4.2.5     skrll             break;
    987  1.1.1.4.2.5     skrll         }
    988  1.1.1.4.2.4     skrll 
    989          1.1    jruoho     default:
    990          1.1    jruoho 
    991          1.1    jruoho         /* Just get the opcode name and print it */
    992          1.1    jruoho 
    993          1.1    jruoho         AcpiOsPrintf ("%s", OpInfo->Name);
    994          1.1    jruoho 
    995          1.1    jruoho 
    996          1.1    jruoho #ifdef ACPI_DEBUGGER
    997          1.1    jruoho 
    998          1.1    jruoho         if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
    999          1.1    jruoho             (WalkState) &&
   1000          1.1    jruoho             (WalkState->Results) &&
   1001          1.1    jruoho             (WalkState->ResultCount))
   1002          1.1    jruoho         {
   1003  1.1.1.4.2.2     skrll             AcpiDbDecodeInternalObject (
   1004          1.1    jruoho                 WalkState->Results->Results.ObjDesc [
   1005          1.1    jruoho                     (WalkState->ResultCount - 1) %
   1006          1.1    jruoho                         ACPI_RESULTS_FRAME_OBJ_NUM]);
   1007          1.1    jruoho         }
   1008          1.1    jruoho #endif
   1009          1.1    jruoho 
   1010          1.1    jruoho         break;
   1011          1.1    jruoho     }
   1012          1.1    jruoho }
   1013          1.1    jruoho 
   1014  1.1.1.4.2.3     skrll 
   1015  1.1.1.4.2.3     skrll /*******************************************************************************
   1016  1.1.1.4.2.3     skrll  *
   1017  1.1.1.4.2.3     skrll  * FUNCTION:    AcpiDmConvertToElseIf
   1018  1.1.1.4.2.3     skrll  *
   1019  1.1.1.4.2.3     skrll  * PARAMETERS:  OriginalElseOp          - ELSE Object to be examined
   1020  1.1.1.4.2.3     skrll  *
   1021  1.1.1.4.2.3     skrll  * RETURN:      None. Emits either an "Else" or an "ElseIf" ASL operator.
   1022  1.1.1.4.2.3     skrll  *
   1023  1.1.1.4.2.3     skrll  * DESCRIPTION: Detect and convert an If..Else..If sequence to If..ElseIf
   1024  1.1.1.4.2.3     skrll  *
   1025  1.1.1.4.2.3     skrll  * EXAMPLE:
   1026  1.1.1.4.2.3     skrll  *
   1027  1.1.1.4.2.3     skrll  * This If..Else..If nested sequence:
   1028  1.1.1.4.2.3     skrll  *
   1029  1.1.1.4.2.3     skrll  *        If (Arg0 == 1)
   1030  1.1.1.4.2.3     skrll  *        {
   1031  1.1.1.4.2.3     skrll  *            Local0 = 4
   1032  1.1.1.4.2.3     skrll  *        }
   1033  1.1.1.4.2.3     skrll  *        Else
   1034  1.1.1.4.2.3     skrll  *        {
   1035  1.1.1.4.2.3     skrll  *            If (Arg0 == 2)
   1036  1.1.1.4.2.3     skrll  *            {
   1037  1.1.1.4.2.3     skrll  *                Local0 = 5
   1038  1.1.1.4.2.3     skrll  *            }
   1039  1.1.1.4.2.3     skrll  *        }
   1040  1.1.1.4.2.3     skrll  *
   1041  1.1.1.4.2.3     skrll  * Is converted to this simpler If..ElseIf sequence:
   1042  1.1.1.4.2.3     skrll  *
   1043  1.1.1.4.2.3     skrll  *        If (Arg0 == 1)
   1044  1.1.1.4.2.3     skrll  *        {
   1045  1.1.1.4.2.3     skrll  *            Local0 = 4
   1046  1.1.1.4.2.3     skrll  *        }
   1047  1.1.1.4.2.3     skrll  *        ElseIf (Arg0 == 2)
   1048  1.1.1.4.2.3     skrll  *        {
   1049  1.1.1.4.2.3     skrll  *            Local0 = 5
   1050  1.1.1.4.2.3     skrll  *        }
   1051  1.1.1.4.2.3     skrll  *
   1052  1.1.1.4.2.3     skrll  * NOTE: There is no actual ElseIf AML opcode. ElseIf is essentially an ASL
   1053  1.1.1.4.2.3     skrll  * macro that emits an Else opcode followed by an If opcode. This function
   1054  1.1.1.4.2.3     skrll  * reverses these AML sequences back to an ElseIf macro where possible. This
   1055  1.1.1.4.2.3     skrll  * can make the disassembled ASL code simpler and more like the original code.
   1056  1.1.1.4.2.3     skrll  *
   1057  1.1.1.4.2.3     skrll  ******************************************************************************/
   1058  1.1.1.4.2.3     skrll 
   1059  1.1.1.4.2.3     skrll static void
   1060  1.1.1.4.2.3     skrll AcpiDmConvertToElseIf (
   1061  1.1.1.4.2.3     skrll     ACPI_PARSE_OBJECT       *OriginalElseOp)
   1062  1.1.1.4.2.3     skrll {
   1063  1.1.1.4.2.3     skrll     ACPI_PARSE_OBJECT       *IfOp;
   1064  1.1.1.4.2.3     skrll     ACPI_PARSE_OBJECT       *ElseOp;
   1065  1.1.1.4.2.3     skrll 
   1066  1.1.1.4.2.3     skrll 
   1067  1.1.1.4.2.4     skrll     /*
   1068  1.1.1.4.2.4     skrll      * To be able to perform the conversion, two conditions must be satisfied:
   1069  1.1.1.4.2.4     skrll      * 1) The first child of the Else must be an If statement.
   1070  1.1.1.4.2.4     skrll      * 2) The If block can only be followed by an Else block and these must
   1071  1.1.1.4.2.4     skrll      *    be the only blocks under the original Else.
   1072  1.1.1.4.2.4     skrll      */
   1073  1.1.1.4.2.3     skrll     IfOp = OriginalElseOp->Common.Value.Arg;
   1074  1.1.1.4.2.6     skrll 
   1075  1.1.1.4.2.4     skrll     if (!IfOp ||
   1076  1.1.1.4.2.4     skrll         (IfOp->Common.AmlOpcode != AML_IF_OP) ||
   1077  1.1.1.4.2.4     skrll         (IfOp->Asl.Next && (IfOp->Asl.Next->Common.AmlOpcode != AML_ELSE_OP)))
   1078  1.1.1.4.2.3     skrll     {
   1079  1.1.1.4.2.6     skrll         /* Not a proper Else..If sequence, cannot convert to ElseIf */
   1080  1.1.1.4.2.6     skrll 
   1081  1.1.1.4.2.6     skrll         AcpiOsPrintf ("%s", "Else");
   1082  1.1.1.4.2.6     skrll         return;
   1083  1.1.1.4.2.6     skrll     }
   1084  1.1.1.4.2.6     skrll 
   1085  1.1.1.4.2.6     skrll     /* Cannot have anything following the If...Else block */
   1086  1.1.1.4.2.3     skrll 
   1087  1.1.1.4.2.6     skrll     ElseOp = IfOp->Common.Next;
   1088  1.1.1.4.2.6     skrll     if (ElseOp && ElseOp->Common.Next)
   1089  1.1.1.4.2.6     skrll     {
   1090  1.1.1.4.2.3     skrll         AcpiOsPrintf ("%s", "Else");
   1091  1.1.1.4.2.3     skrll         return;
   1092  1.1.1.4.2.3     skrll     }
   1093  1.1.1.4.2.3     skrll 
   1094  1.1.1.4.2.3     skrll     /* Emit ElseIf, mark the IF as now an ELSEIF */
   1095  1.1.1.4.2.3     skrll 
   1096  1.1.1.4.2.3     skrll     AcpiOsPrintf ("%s", "ElseIf");
   1097  1.1.1.4.2.3     skrll     IfOp->Common.DisasmFlags |= ACPI_PARSEOP_ELSEIF;
   1098  1.1.1.4.2.3     skrll 
   1099  1.1.1.4.2.3     skrll     /* The IF parent will now be the same as the original ELSE parent */
   1100  1.1.1.4.2.3     skrll 
   1101  1.1.1.4.2.3     skrll     IfOp->Common.Parent = OriginalElseOp->Common.Parent;
   1102  1.1.1.4.2.3     skrll 
   1103  1.1.1.4.2.3     skrll     /*
   1104  1.1.1.4.2.3     skrll      * Update the NEXT pointers to restructure the parse tree, essentially
   1105  1.1.1.4.2.3     skrll      * promoting an If..Else block up to the same level as the original
   1106  1.1.1.4.2.3     skrll      * Else.
   1107  1.1.1.4.2.3     skrll      *
   1108  1.1.1.4.2.3     skrll      * Check if the IF has a corresponding ELSE peer
   1109  1.1.1.4.2.3     skrll      */
   1110  1.1.1.4.2.3     skrll     ElseOp = IfOp->Common.Next;
   1111  1.1.1.4.2.3     skrll     if (ElseOp &&
   1112  1.1.1.4.2.3     skrll         (ElseOp->Common.AmlOpcode == AML_ELSE_OP))
   1113  1.1.1.4.2.3     skrll     {
   1114  1.1.1.4.2.3     skrll         /* If an ELSE matches the IF, promote it also */
   1115  1.1.1.4.2.3     skrll 
   1116  1.1.1.4.2.3     skrll         ElseOp->Common.Parent = OriginalElseOp->Common.Parent;
   1117  1.1.1.4.2.6     skrll 
   1118  1.1.1.4.2.6     skrll         /* Promote the entire block under the ElseIf (All Next OPs) */
   1119  1.1.1.4.2.6     skrll 
   1120  1.1.1.4.2.6     skrll         AcpiDmPromoteSubtree (OriginalElseOp);
   1121  1.1.1.4.2.3     skrll     }
   1122  1.1.1.4.2.3     skrll     else
   1123  1.1.1.4.2.3     skrll     {
   1124  1.1.1.4.2.3     skrll         /* Otherwise, set the IF NEXT to the original ELSE NEXT */
   1125  1.1.1.4.2.3     skrll 
   1126  1.1.1.4.2.3     skrll         IfOp->Common.Next = OriginalElseOp->Common.Next;
   1127  1.1.1.4.2.3     skrll     }
   1128  1.1.1.4.2.3     skrll 
   1129  1.1.1.4.2.3     skrll     /* Detach the child IF block from the original ELSE */
   1130  1.1.1.4.2.3     skrll 
   1131  1.1.1.4.2.3     skrll     OriginalElseOp->Common.Value.Arg = NULL;
   1132  1.1.1.4.2.3     skrll 
   1133  1.1.1.4.2.3     skrll     /* Ignore the original ELSE from now on */
   1134  1.1.1.4.2.3     skrll 
   1135  1.1.1.4.2.3     skrll     OriginalElseOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
   1136  1.1.1.4.2.3     skrll     OriginalElseOp->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
   1137  1.1.1.4.2.3     skrll 
   1138  1.1.1.4.2.3     skrll     /* Insert IF (now ELSEIF) as next peer of the original ELSE */
   1139  1.1.1.4.2.3     skrll 
   1140  1.1.1.4.2.3     skrll     OriginalElseOp->Common.Next = IfOp;
   1141  1.1.1.4.2.3     skrll }
   1142  1.1.1.4.2.6     skrll 
   1143  1.1.1.4.2.6     skrll 
   1144  1.1.1.4.2.6     skrll /*******************************************************************************
   1145  1.1.1.4.2.6     skrll  *
   1146  1.1.1.4.2.6     skrll  * FUNCTION:    AcpiDmPromoteSubtree
   1147  1.1.1.4.2.6     skrll  *
   1148  1.1.1.4.2.6     skrll  * PARAMETERS:  StartOpOp           - Original parent of the entire subtree
   1149  1.1.1.4.2.6     skrll  *
   1150  1.1.1.4.2.6     skrll  * RETURN:      None
   1151  1.1.1.4.2.6     skrll  *
   1152  1.1.1.4.2.6     skrll  * DESCRIPTION: Promote an entire parse subtree up one level.
   1153  1.1.1.4.2.6     skrll  *
   1154  1.1.1.4.2.6     skrll  ******************************************************************************/
   1155  1.1.1.4.2.6     skrll 
   1156  1.1.1.4.2.6     skrll static void
   1157  1.1.1.4.2.6     skrll AcpiDmPromoteSubtree (
   1158  1.1.1.4.2.6     skrll     ACPI_PARSE_OBJECT       *StartOp)
   1159  1.1.1.4.2.6     skrll {
   1160  1.1.1.4.2.6     skrll     ACPI_PARSE_OBJECT       *Op;
   1161  1.1.1.4.2.6     skrll     ACPI_PARSE_OBJECT       *ParentOp;
   1162  1.1.1.4.2.6     skrll 
   1163  1.1.1.4.2.6     skrll 
   1164  1.1.1.4.2.6     skrll     /* New parent for subtree elements */
   1165  1.1.1.4.2.6     skrll 
   1166  1.1.1.4.2.6     skrll     ParentOp = StartOp->Common.Parent;
   1167  1.1.1.4.2.6     skrll 
   1168  1.1.1.4.2.6     skrll     /* First child starts the subtree */
   1169  1.1.1.4.2.6     skrll 
   1170  1.1.1.4.2.6     skrll     Op = StartOp->Common.Value.Arg;
   1171  1.1.1.4.2.6     skrll 
   1172  1.1.1.4.2.6     skrll     /* Walk the top-level elements of the subtree */
   1173  1.1.1.4.2.6     skrll 
   1174  1.1.1.4.2.6     skrll     while (Op)
   1175  1.1.1.4.2.6     skrll     {
   1176  1.1.1.4.2.6     skrll         Op->Common.Parent = ParentOp;
   1177  1.1.1.4.2.6     skrll         if (!Op->Common.Next)
   1178  1.1.1.4.2.6     skrll         {
   1179  1.1.1.4.2.6     skrll             /* Last Op in list, update its next field */
   1180  1.1.1.4.2.6     skrll 
   1181  1.1.1.4.2.6     skrll             Op->Common.Next = StartOp->Common.Next;
   1182  1.1.1.4.2.6     skrll             break;
   1183  1.1.1.4.2.6     skrll         }
   1184  1.1.1.4.2.6     skrll         Op = Op->Common.Next;
   1185  1.1.1.4.2.6     skrll     }
   1186  1.1.1.4.2.6     skrll }
   1187