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