Home | History | Annotate | Line # | Download | only in disassembler
dmopcode.c revision 1.1.1.13.2.1
      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.13.2.1  pgoyette  * Copyright (C) 2000 - 2018, 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.6  christos #include "acdebug.h"
     51      1.1.1.12  christos #include "acconvert.h"
     52           1.1    jruoho 
     53           1.1    jruoho 
     54           1.1    jruoho #define _COMPONENT          ACPI_CA_DEBUGGER
     55           1.1    jruoho         ACPI_MODULE_NAME    ("dmopcode")
     56           1.1    jruoho 
     57       1.1.1.5  christos 
     58           1.1    jruoho /* Local prototypes */
     59           1.1    jruoho 
     60           1.1    jruoho static void
     61           1.1    jruoho AcpiDmMatchKeyword (
     62           1.1    jruoho     ACPI_PARSE_OBJECT       *Op);
     63           1.1    jruoho 
     64       1.1.1.7  christos static void
     65       1.1.1.7  christos AcpiDmConvertToElseIf (
     66       1.1.1.7  christos     ACPI_PARSE_OBJECT       *Op);
     67       1.1.1.7  christos 
     68      1.1.1.10  christos static void
     69      1.1.1.10  christos AcpiDmPromoteSubtree (
     70      1.1.1.10  christos     ACPI_PARSE_OBJECT       *StartOp);
     71      1.1.1.10  christos 
     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.8  christos     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.8  christos     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.6  christos         (isdigit ((int) NameString[3]));    /* d */
    280       1.1.1.3  christos     LastCharsAreHex =
    281       1.1.1.6  christos         (isxdigit ((int) NameString[2]) &&  /* xx */
    282       1.1.1.6  christos          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.8  christos     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.8  christos     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.13  christos     if (!Tag || (*Tag == 0))
    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.13  christos     /* Is the tag a predefined name? */
    429       1.1.1.3  christos 
    430       1.1.1.4  christos     Info = AcpiAhMatchPredefinedName (Tag);
    431      1.1.1.13  christos     if (!Info)
    432       1.1.1.3  christos     {
    433      1.1.1.13  christos         /* Not a predefined name (does not start with underscore) */
    434      1.1.1.13  christos 
    435      1.1.1.13  christos         return;
    436       1.1.1.3  christos     }
    437       1.1.1.3  christos 
    438      1.1.1.13  christos     AcpiOsPrintf ("  // %4.4s: %s", Tag,
    439      1.1.1.13  christos         ACPI_CAST_PTR (char, Info->Description));
    440      1.1.1.12  christos 
    441      1.1.1.13  christos     /* String contains the prefix path, free it */
    442      1.1.1.12  christos 
    443      1.1.1.13  christos     ACPI_FREE (IndexOp->Common.Value.String);
    444      1.1.1.13  christos     IndexOp->Common.Value.String = NULL;
    445       1.1.1.3  christos #endif
    446      1.1.1.13  christos 
    447       1.1.1.3  christos     return;
    448       1.1.1.3  christos }
    449       1.1.1.3  christos 
    450       1.1.1.3  christos 
    451       1.1.1.3  christos /*******************************************************************************
    452       1.1.1.3  christos  *
    453           1.1    jruoho  * FUNCTION:    AcpiDmMethodFlags
    454           1.1    jruoho  *
    455           1.1    jruoho  * PARAMETERS:  Op              - Method Object to be examined
    456           1.1    jruoho  *
    457           1.1    jruoho  * RETURN:      None
    458           1.1    jruoho  *
    459           1.1    jruoho  * DESCRIPTION: Decode control method flags
    460           1.1    jruoho  *
    461           1.1    jruoho  ******************************************************************************/
    462           1.1    jruoho 
    463           1.1    jruoho void
    464           1.1    jruoho AcpiDmMethodFlags (
    465           1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    466           1.1    jruoho {
    467           1.1    jruoho     UINT32                  Flags;
    468           1.1    jruoho     UINT32                  Args;
    469           1.1    jruoho 
    470           1.1    jruoho 
    471           1.1    jruoho     /* The next Op contains the flags */
    472           1.1    jruoho 
    473           1.1    jruoho     Op = AcpiPsGetDepthNext (NULL, Op);
    474           1.1    jruoho     Flags = (UINT8) Op->Common.Value.Integer;
    475           1.1    jruoho     Args = Flags & 0x07;
    476           1.1    jruoho 
    477           1.1    jruoho     /* Mark the Op as completed */
    478           1.1    jruoho 
    479           1.1    jruoho     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    480           1.1    jruoho 
    481           1.1    jruoho     /* 1) Method argument count */
    482           1.1    jruoho 
    483           1.1    jruoho     AcpiOsPrintf (", %u, ", Args);
    484           1.1    jruoho 
    485           1.1    jruoho     /* 2) Serialize rule */
    486           1.1    jruoho 
    487           1.1    jruoho     if (!(Flags & 0x08))
    488           1.1    jruoho     {
    489           1.1    jruoho         AcpiOsPrintf ("Not");
    490           1.1    jruoho     }
    491           1.1    jruoho 
    492           1.1    jruoho     AcpiOsPrintf ("Serialized");
    493           1.1    jruoho 
    494           1.1    jruoho     /* 3) SyncLevel */
    495           1.1    jruoho 
    496           1.1    jruoho     if (Flags & 0xF0)
    497           1.1    jruoho     {
    498           1.1    jruoho         AcpiOsPrintf (", %u", Flags >> 4);
    499           1.1    jruoho     }
    500           1.1    jruoho }
    501           1.1    jruoho 
    502           1.1    jruoho 
    503           1.1    jruoho /*******************************************************************************
    504           1.1    jruoho  *
    505           1.1    jruoho  * FUNCTION:    AcpiDmFieldFlags
    506           1.1    jruoho  *
    507           1.1    jruoho  * PARAMETERS:  Op              - Field Object to be examined
    508           1.1    jruoho  *
    509           1.1    jruoho  * RETURN:      None
    510           1.1    jruoho  *
    511           1.1    jruoho  * DESCRIPTION: Decode Field definition flags
    512           1.1    jruoho  *
    513           1.1    jruoho  ******************************************************************************/
    514           1.1    jruoho 
    515           1.1    jruoho void
    516           1.1    jruoho AcpiDmFieldFlags (
    517           1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    518           1.1    jruoho {
    519           1.1    jruoho     UINT32                  Flags;
    520           1.1    jruoho 
    521           1.1    jruoho 
    522           1.1    jruoho     Op = Op->Common.Next;
    523           1.1    jruoho     Flags = (UINT8) Op->Common.Value.Integer;
    524           1.1    jruoho 
    525           1.1    jruoho     /* Mark the Op as completed */
    526           1.1    jruoho 
    527           1.1    jruoho     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    528           1.1    jruoho 
    529           1.1    jruoho     AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]);
    530           1.1    jruoho     AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
    531           1.1    jruoho     AcpiOsPrintf ("%s)",  AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
    532           1.1    jruoho }
    533           1.1    jruoho 
    534           1.1    jruoho 
    535           1.1    jruoho /*******************************************************************************
    536           1.1    jruoho  *
    537           1.1    jruoho  * FUNCTION:    AcpiDmAddressSpace
    538           1.1    jruoho  *
    539           1.1    jruoho  * PARAMETERS:  SpaceId         - ID to be translated
    540           1.1    jruoho  *
    541           1.1    jruoho  * RETURN:      None
    542           1.1    jruoho  *
    543           1.1    jruoho  * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
    544           1.1    jruoho  *
    545           1.1    jruoho  ******************************************************************************/
    546           1.1    jruoho 
    547           1.1    jruoho void
    548           1.1    jruoho AcpiDmAddressSpace (
    549           1.1    jruoho     UINT8                   SpaceId)
    550           1.1    jruoho {
    551           1.1    jruoho 
    552           1.1    jruoho     if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
    553           1.1    jruoho     {
    554           1.1    jruoho         if (SpaceId == 0x7F)
    555           1.1    jruoho         {
    556           1.1    jruoho             AcpiOsPrintf ("FFixedHW, ");
    557           1.1    jruoho         }
    558           1.1    jruoho         else
    559           1.1    jruoho         {
    560           1.1    jruoho             AcpiOsPrintf ("0x%.2X, ", SpaceId);
    561           1.1    jruoho         }
    562           1.1    jruoho     }
    563           1.1    jruoho     else
    564           1.1    jruoho     {
    565           1.1    jruoho         AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
    566           1.1    jruoho     }
    567           1.1    jruoho }
    568           1.1    jruoho 
    569           1.1    jruoho 
    570           1.1    jruoho /*******************************************************************************
    571           1.1    jruoho  *
    572           1.1    jruoho  * FUNCTION:    AcpiDmRegionFlags
    573           1.1    jruoho  *
    574           1.1    jruoho  * PARAMETERS:  Op              - Object to be examined
    575           1.1    jruoho  *
    576           1.1    jruoho  * RETURN:      None
    577           1.1    jruoho  *
    578           1.1    jruoho  * DESCRIPTION: Decode OperationRegion flags
    579           1.1    jruoho  *
    580           1.1    jruoho  ******************************************************************************/
    581           1.1    jruoho 
    582           1.1    jruoho void
    583           1.1    jruoho AcpiDmRegionFlags (
    584           1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    585           1.1    jruoho {
    586           1.1    jruoho 
    587           1.1    jruoho     /* The next Op contains the SpaceId */
    588           1.1    jruoho 
    589           1.1    jruoho     Op = AcpiPsGetDepthNext (NULL, Op);
    590           1.1    jruoho 
    591           1.1    jruoho     /* Mark the Op as completed */
    592           1.1    jruoho 
    593           1.1    jruoho     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    594           1.1    jruoho 
    595           1.1    jruoho     AcpiOsPrintf (", ");
    596           1.1    jruoho     AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
    597           1.1    jruoho }
    598           1.1    jruoho 
    599           1.1    jruoho 
    600           1.1    jruoho /*******************************************************************************
    601           1.1    jruoho  *
    602           1.1    jruoho  * FUNCTION:    AcpiDmMatchOp
    603           1.1    jruoho  *
    604           1.1    jruoho  * PARAMETERS:  Op              - Match Object to be examined
    605           1.1    jruoho  *
    606           1.1    jruoho  * RETURN:      None
    607           1.1    jruoho  *
    608           1.1    jruoho  * DESCRIPTION: Decode Match opcode operands
    609           1.1    jruoho  *
    610           1.1    jruoho  ******************************************************************************/
    611           1.1    jruoho 
    612           1.1    jruoho void
    613           1.1    jruoho AcpiDmMatchOp (
    614           1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    615           1.1    jruoho {
    616           1.1    jruoho     ACPI_PARSE_OBJECT       *NextOp;
    617           1.1    jruoho 
    618           1.1    jruoho 
    619           1.1    jruoho     NextOp = AcpiPsGetDepthNext (NULL, Op);
    620           1.1    jruoho     NextOp = NextOp->Common.Next;
    621           1.1    jruoho 
    622           1.1    jruoho     if (!NextOp)
    623           1.1    jruoho     {
    624           1.1    jruoho         /* Handle partial tree during single-step */
    625           1.1    jruoho 
    626           1.1    jruoho         return;
    627           1.1    jruoho     }
    628           1.1    jruoho 
    629           1.1    jruoho     /* Mark the two nodes that contain the encoding for the match keywords */
    630           1.1    jruoho 
    631           1.1    jruoho     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
    632           1.1    jruoho 
    633           1.1    jruoho     NextOp = NextOp->Common.Next;
    634           1.1    jruoho     NextOp = NextOp->Common.Next;
    635           1.1    jruoho     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
    636           1.1    jruoho }
    637           1.1    jruoho 
    638           1.1    jruoho 
    639           1.1    jruoho /*******************************************************************************
    640           1.1    jruoho  *
    641           1.1    jruoho  * FUNCTION:    AcpiDmMatchKeyword
    642           1.1    jruoho  *
    643           1.1    jruoho  * PARAMETERS:  Op              - Match Object to be examined
    644           1.1    jruoho  *
    645           1.1    jruoho  * RETURN:      None
    646           1.1    jruoho  *
    647           1.1    jruoho  * DESCRIPTION: Decode Match opcode operands
    648           1.1    jruoho  *
    649           1.1    jruoho  ******************************************************************************/
    650           1.1    jruoho 
    651           1.1    jruoho static void
    652           1.1    jruoho AcpiDmMatchKeyword (
    653           1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    654           1.1    jruoho {
    655           1.1    jruoho 
    656           1.1    jruoho     if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE)
    657           1.1    jruoho     {
    658           1.1    jruoho         AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
    659           1.1    jruoho     }
    660           1.1    jruoho     else
    661           1.1    jruoho     {
    662       1.1.1.8  christos         AcpiOsPrintf ("%s",
    663       1.1.1.8  christos             AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]);
    664           1.1    jruoho     }
    665           1.1    jruoho }
    666           1.1    jruoho 
    667           1.1    jruoho 
    668           1.1    jruoho /*******************************************************************************
    669           1.1    jruoho  *
    670           1.1    jruoho  * FUNCTION:    AcpiDmDisassembleOneOp
    671           1.1    jruoho  *
    672           1.1    jruoho  * PARAMETERS:  WalkState           - Current walk info
    673           1.1    jruoho  *              Info                - Parse tree walk info
    674           1.1    jruoho  *              Op                  - Op that is to be printed
    675           1.1    jruoho  *
    676           1.1    jruoho  * RETURN:      None
    677           1.1    jruoho  *
    678           1.1    jruoho  * DESCRIPTION: Disassemble a single AML opcode
    679           1.1    jruoho  *
    680           1.1    jruoho  ******************************************************************************/
    681           1.1    jruoho 
    682           1.1    jruoho void
    683           1.1    jruoho AcpiDmDisassembleOneOp (
    684           1.1    jruoho     ACPI_WALK_STATE         *WalkState,
    685           1.1    jruoho     ACPI_OP_WALK_INFO       *Info,
    686           1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    687           1.1    jruoho {
    688           1.1    jruoho     const ACPI_OPCODE_INFO  *OpInfo = NULL;
    689           1.1    jruoho     UINT32                  Offset;
    690           1.1    jruoho     UINT32                  Length;
    691           1.1    jruoho     ACPI_PARSE_OBJECT       *Child;
    692           1.1    jruoho     ACPI_STATUS             Status;
    693       1.1.1.3  christos     UINT8                   *Aml;
    694       1.1.1.4  christos     const AH_DEVICE_ID      *IdInfo;
    695           1.1    jruoho 
    696           1.1    jruoho 
    697           1.1    jruoho     if (!Op)
    698           1.1    jruoho     {
    699           1.1    jruoho         AcpiOsPrintf ("<NULL OP PTR>");
    700           1.1    jruoho         return;
    701           1.1    jruoho     }
    702           1.1    jruoho 
    703       1.1.1.7  christos     if (Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)
    704       1.1.1.7  christos     {
    705       1.1.1.7  christos         return; /* ElseIf macro was already emitted */
    706       1.1.1.7  christos     }
    707       1.1.1.7  christos 
    708           1.1    jruoho     switch (Op->Common.DisasmOpcode)
    709           1.1    jruoho     {
    710           1.1    jruoho     case ACPI_DASM_MATCHOP:
    711           1.1    jruoho 
    712           1.1    jruoho         AcpiDmMatchKeyword (Op);
    713           1.1    jruoho         return;
    714           1.1    jruoho 
    715           1.1    jruoho     case ACPI_DASM_LNOT_SUFFIX:
    716       1.1.1.3  christos 
    717       1.1.1.5  christos         if (!AcpiGbl_CstyleDisassembly)
    718           1.1    jruoho         {
    719       1.1.1.5  christos             switch (Op->Common.AmlOpcode)
    720       1.1.1.5  christos             {
    721      1.1.1.12  christos             case AML_LOGICAL_EQUAL_OP:
    722       1.1.1.5  christos                 AcpiOsPrintf ("LNotEqual");
    723       1.1.1.5  christos                 break;
    724       1.1.1.3  christos 
    725      1.1.1.12  christos             case AML_LOGICAL_GREATER_OP:
    726       1.1.1.5  christos                 AcpiOsPrintf ("LLessEqual");
    727       1.1.1.5  christos                 break;
    728           1.1    jruoho 
    729      1.1.1.12  christos             case AML_LOGICAL_LESS_OP:
    730       1.1.1.5  christos                 AcpiOsPrintf ("LGreaterEqual");
    731       1.1.1.5  christos                 break;
    732       1.1.1.3  christos 
    733       1.1.1.5  christos             default:
    734       1.1.1.5  christos                 break;
    735       1.1.1.5  christos             }
    736           1.1    jruoho         }
    737       1.1.1.5  christos 
    738           1.1    jruoho         Op->Common.DisasmOpcode = 0;
    739           1.1    jruoho         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    740           1.1    jruoho         return;
    741           1.1    jruoho 
    742           1.1    jruoho     default:
    743           1.1    jruoho         break;
    744           1.1    jruoho     }
    745           1.1    jruoho 
    746           1.1    jruoho     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
    747           1.1    jruoho 
    748           1.1    jruoho     /* The op and arguments */
    749           1.1    jruoho 
    750           1.1    jruoho     switch (Op->Common.AmlOpcode)
    751           1.1    jruoho     {
    752      1.1.1.12  christos     case AML_LOGICAL_NOT_OP:
    753           1.1    jruoho 
    754           1.1    jruoho         Child = Op->Common.Value.Arg;
    755      1.1.1.12  christos         if ((Child->Common.AmlOpcode == AML_LOGICAL_EQUAL_OP) ||
    756      1.1.1.12  christos             (Child->Common.AmlOpcode == AML_LOGICAL_GREATER_OP) ||
    757      1.1.1.12  christos             (Child->Common.AmlOpcode == AML_LOGICAL_LESS_OP))
    758           1.1    jruoho         {
    759           1.1    jruoho             Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;
    760           1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
    761           1.1    jruoho         }
    762           1.1    jruoho         else
    763           1.1    jruoho         {
    764           1.1    jruoho             AcpiOsPrintf ("%s", OpInfo->Name);
    765           1.1    jruoho         }
    766           1.1    jruoho         break;
    767           1.1    jruoho 
    768           1.1    jruoho     case AML_BYTE_OP:
    769           1.1    jruoho 
    770           1.1    jruoho         AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
    771           1.1    jruoho         break;
    772           1.1    jruoho 
    773           1.1    jruoho     case AML_WORD_OP:
    774           1.1    jruoho 
    775           1.1    jruoho         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
    776           1.1    jruoho         {
    777       1.1.1.4  christos             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
    778           1.1    jruoho         }
    779           1.1    jruoho         else
    780           1.1    jruoho         {
    781           1.1    jruoho             AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
    782           1.1    jruoho         }
    783           1.1    jruoho         break;
    784           1.1    jruoho 
    785           1.1    jruoho     case AML_DWORD_OP:
    786           1.1    jruoho 
    787           1.1    jruoho         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
    788           1.1    jruoho         {
    789       1.1.1.4  christos             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
    790           1.1    jruoho         }
    791           1.1    jruoho         else
    792           1.1    jruoho         {
    793           1.1    jruoho             AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
    794           1.1    jruoho         }
    795           1.1    jruoho         break;
    796           1.1    jruoho 
    797           1.1    jruoho     case AML_QWORD_OP:
    798           1.1    jruoho 
    799           1.1    jruoho         AcpiOsPrintf ("0x%8.8X%8.8X",
    800           1.1    jruoho             ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
    801           1.1    jruoho         break;
    802           1.1    jruoho 
    803           1.1    jruoho     case AML_STRING_OP:
    804           1.1    jruoho 
    805       1.1.1.3  christos         AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX);
    806       1.1.1.4  christos 
    807       1.1.1.4  christos         /* For _HID/_CID strings, attempt to output a descriptive comment */
    808       1.1.1.4  christos 
    809       1.1.1.4  christos         if (Op->Common.DisasmOpcode == ACPI_DASM_HID_STRING)
    810       1.1.1.4  christos         {
    811       1.1.1.4  christos             /* If we know about the ID, emit the description */
    812       1.1.1.4  christos 
    813       1.1.1.4  christos             IdInfo = AcpiAhMatchHardwareId (Op->Common.Value.String);
    814       1.1.1.4  christos             if (IdInfo)
    815       1.1.1.4  christos             {
    816       1.1.1.4  christos                 AcpiOsPrintf (" /* %s */", IdInfo->Description);
    817       1.1.1.4  christos             }
    818       1.1.1.4  christos         }
    819           1.1    jruoho         break;
    820           1.1    jruoho 
    821           1.1    jruoho     case AML_BUFFER_OP:
    822           1.1    jruoho         /*
    823       1.1.1.3  christos          * Determine the type of buffer. We can have one of the following:
    824           1.1    jruoho          *
    825           1.1    jruoho          * 1) ResourceTemplate containing Resource Descriptors.
    826           1.1    jruoho          * 2) Unicode String buffer
    827           1.1    jruoho          * 3) ASCII String buffer
    828           1.1    jruoho          * 4) Raw data buffer (if none of the above)
    829           1.1    jruoho          *
    830           1.1    jruoho          * Since there are no special AML opcodes to differentiate these
    831           1.1    jruoho          * types of buffers, we have to closely look at the data in the
    832           1.1    jruoho          * buffer to determine the type.
    833           1.1    jruoho          */
    834       1.1.1.3  christos         if (!AcpiGbl_NoResourceDisassembly)
    835           1.1    jruoho         {
    836       1.1.1.3  christos             Status = AcpiDmIsResourceTemplate (WalkState, Op);
    837       1.1.1.3  christos             if (ACPI_SUCCESS (Status))
    838       1.1.1.3  christos             {
    839       1.1.1.3  christos                 Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
    840       1.1.1.3  christos                 AcpiOsPrintf ("ResourceTemplate");
    841       1.1.1.3  christos                 break;
    842       1.1.1.3  christos             }
    843       1.1.1.3  christos             else if (Status == AE_AML_NO_RESOURCE_END_TAG)
    844       1.1.1.3  christos             {
    845       1.1.1.7  christos                 AcpiOsPrintf (
    846       1.1.1.7  christos                     "/**** Is ResourceTemplate, "
    847       1.1.1.7  christos                     "but EndTag not at buffer end ****/ ");
    848       1.1.1.3  christos             }
    849           1.1    jruoho         }
    850           1.1    jruoho 
    851       1.1.1.4  christos         if (AcpiDmIsUuidBuffer (Op))
    852       1.1.1.4  christos         {
    853       1.1.1.4  christos             Op->Common.DisasmOpcode = ACPI_DASM_UUID;
    854       1.1.1.4  christos             AcpiOsPrintf ("ToUUID (");
    855       1.1.1.4  christos         }
    856       1.1.1.4  christos         else if (AcpiDmIsUnicodeBuffer (Op))
    857           1.1    jruoho         {
    858           1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
    859           1.1    jruoho             AcpiOsPrintf ("Unicode (");
    860           1.1    jruoho         }
    861           1.1    jruoho         else if (AcpiDmIsStringBuffer (Op))
    862           1.1    jruoho         {
    863           1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_STRING;
    864           1.1    jruoho             AcpiOsPrintf ("Buffer");
    865           1.1    jruoho         }
    866       1.1.1.3  christos         else if (AcpiDmIsPldBuffer (Op))
    867       1.1.1.3  christos         {
    868       1.1.1.3  christos             Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD;
    869       1.1.1.5  christos             AcpiOsPrintf ("ToPLD (");
    870       1.1.1.3  christos         }
    871           1.1    jruoho         else
    872           1.1    jruoho         {
    873           1.1    jruoho             Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
    874           1.1    jruoho             AcpiOsPrintf ("Buffer");
    875           1.1    jruoho         }
    876           1.1    jruoho         break;
    877           1.1    jruoho 
    878           1.1    jruoho     case AML_INT_NAMEPATH_OP:
    879           1.1    jruoho 
    880           1.1    jruoho         AcpiDmNamestring (Op->Common.Value.Name);
    881           1.1    jruoho         break;
    882           1.1    jruoho 
    883           1.1    jruoho     case AML_INT_NAMEDFIELD_OP:
    884           1.1    jruoho 
    885           1.1    jruoho         Length = AcpiDmDumpName (Op->Named.Name);
    886      1.1.1.12  christos 
    887      1.1.1.12  christos         AcpiOsPrintf (",");
    888      1.1.1.12  christos         ASL_CV_PRINT_ONE_COMMENT (Op, AML_NAMECOMMENT, NULL, 0);
    889      1.1.1.12  christos         AcpiOsPrintf ("%*.s  %u", (unsigned) (5 - Length), " ",
    890           1.1    jruoho             (UINT32) Op->Common.Value.Integer);
    891      1.1.1.12  christos 
    892           1.1    jruoho         AcpiDmCommaIfFieldMember (Op);
    893           1.1    jruoho 
    894           1.1    jruoho         Info->BitOffset += (UINT32) Op->Common.Value.Integer;
    895           1.1    jruoho         break;
    896           1.1    jruoho 
    897           1.1    jruoho     case AML_INT_RESERVEDFIELD_OP:
    898           1.1    jruoho 
    899           1.1    jruoho         /* Offset() -- Must account for previous offsets */
    900           1.1    jruoho 
    901           1.1    jruoho         Offset = (UINT32) Op->Common.Value.Integer;
    902           1.1    jruoho         Info->BitOffset += Offset;
    903           1.1    jruoho 
    904           1.1    jruoho         if (Info->BitOffset % 8 == 0)
    905           1.1    jruoho         {
    906       1.1.1.3  christos             AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
    907           1.1    jruoho         }
    908           1.1    jruoho         else
    909           1.1    jruoho         {
    910           1.1    jruoho             AcpiOsPrintf ("    ,   %u", Offset);
    911           1.1    jruoho         }
    912           1.1    jruoho 
    913           1.1    jruoho         AcpiDmCommaIfFieldMember (Op);
    914           1.1    jruoho         break;
    915           1.1    jruoho 
    916           1.1    jruoho     case AML_INT_ACCESSFIELD_OP:
    917       1.1.1.3  christos     case AML_INT_EXTACCESSFIELD_OP:
    918       1.1.1.3  christos 
    919       1.1.1.3  christos         AcpiOsPrintf ("AccessAs (%s, ",
    920       1.1.1.3  christos             AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]);
    921       1.1.1.3  christos 
    922       1.1.1.3  christos         AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8));
    923           1.1    jruoho 
    924       1.1.1.3  christos         if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP)
    925       1.1.1.3  christos         {
    926       1.1.1.7  christos             AcpiOsPrintf (" (0x%2.2X)", (unsigned)
    927       1.1.1.7  christos                 ((Op->Common.Value.Integer >> 16) & 0xFF));
    928       1.1.1.3  christos         }
    929           1.1    jruoho 
    930           1.1    jruoho         AcpiOsPrintf (")");
    931           1.1    jruoho         AcpiDmCommaIfFieldMember (Op);
    932      1.1.1.12  christos         ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0);
    933           1.1    jruoho         break;
    934           1.1    jruoho 
    935       1.1.1.3  christos     case AML_INT_CONNECTION_OP:
    936       1.1.1.3  christos         /*
    937       1.1.1.3  christos          * Two types of Connection() - one with a buffer object, the
    938       1.1.1.3  christos          * other with a namestring that points to a buffer object.
    939       1.1.1.3  christos          */
    940       1.1.1.3  christos         AcpiOsPrintf ("Connection (");
    941       1.1.1.3  christos         Child = Op->Common.Value.Arg;
    942       1.1.1.3  christos 
    943       1.1.1.3  christos         if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
    944       1.1.1.3  christos         {
    945       1.1.1.3  christos             AcpiOsPrintf ("\n");
    946       1.1.1.3  christos 
    947       1.1.1.3  christos             Aml = Child->Named.Data;
    948       1.1.1.3  christos             Length = (UINT32) Child->Common.Value.Integer;
    949       1.1.1.3  christos 
    950       1.1.1.3  christos             Info->Level += 1;
    951       1.1.1.4  christos             Info->MappingOp = Op;
    952       1.1.1.3  christos             Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
    953       1.1.1.4  christos 
    954       1.1.1.3  christos             AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length);
    955       1.1.1.3  christos 
    956       1.1.1.3  christos             Info->Level -= 1;
    957       1.1.1.3  christos             AcpiDmIndent (Info->Level);
    958       1.1.1.3  christos         }
    959       1.1.1.3  christos         else
    960       1.1.1.3  christos         {
    961       1.1.1.3  christos             AcpiDmNamestring (Child->Common.Value.Name);
    962       1.1.1.3  christos         }
    963       1.1.1.3  christos 
    964       1.1.1.3  christos         AcpiOsPrintf (")");
    965       1.1.1.3  christos         AcpiDmCommaIfFieldMember (Op);
    966      1.1.1.12  christos         ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0);
    967      1.1.1.12  christos         ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0);
    968       1.1.1.3  christos         AcpiOsPrintf ("\n");
    969       1.1.1.3  christos 
    970       1.1.1.3  christos         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */
    971       1.1.1.3  christos         Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    972       1.1.1.3  christos         break;
    973           1.1    jruoho 
    974           1.1    jruoho     case AML_INT_BYTELIST_OP:
    975           1.1    jruoho 
    976           1.1    jruoho         AcpiDmByteList (Info, Op);
    977           1.1    jruoho         break;
    978           1.1    jruoho 
    979           1.1    jruoho     case AML_INT_METHODCALL_OP:
    980           1.1    jruoho 
    981           1.1    jruoho         Op = AcpiPsGetDepthNext (NULL, Op);
    982           1.1    jruoho         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    983           1.1    jruoho 
    984           1.1    jruoho         AcpiDmNamestring (Op->Common.Value.Name);
    985           1.1    jruoho         break;
    986           1.1    jruoho 
    987      1.1.1.11  christos     case AML_WHILE_OP:
    988      1.1.1.11  christos 
    989      1.1.1.12  christos         if (Op->Common.DisasmOpcode == ACPI_DASM_SWITCH)
    990      1.1.1.11  christos         {
    991      1.1.1.11  christos             AcpiOsPrintf ("%s", "Switch");
    992      1.1.1.11  christos             break;
    993      1.1.1.11  christos         }
    994      1.1.1.11  christos 
    995      1.1.1.11  christos         AcpiOsPrintf ("%s", OpInfo->Name);
    996      1.1.1.11  christos         break;
    997      1.1.1.11  christos 
    998      1.1.1.11  christos     case AML_IF_OP:
    999      1.1.1.11  christos 
   1000      1.1.1.11  christos         if (Op->Common.DisasmOpcode == ACPI_DASM_CASE)
   1001      1.1.1.11  christos         {
   1002      1.1.1.11  christos             AcpiOsPrintf ("%s", "Case");
   1003      1.1.1.11  christos             break;
   1004      1.1.1.11  christos         }
   1005      1.1.1.11  christos 
   1006      1.1.1.11  christos         AcpiOsPrintf ("%s", OpInfo->Name);
   1007      1.1.1.11  christos         break;
   1008      1.1.1.11  christos 
   1009       1.1.1.7  christos     case AML_ELSE_OP:
   1010       1.1.1.7  christos 
   1011       1.1.1.7  christos         AcpiDmConvertToElseIf (Op);
   1012       1.1.1.7  christos         break;
   1013       1.1.1.7  christos 
   1014       1.1.1.8  christos     case AML_EXTERNAL_OP:
   1015       1.1.1.8  christos 
   1016       1.1.1.9  christos         if (AcpiGbl_DmEmitExternalOpcodes)
   1017       1.1.1.9  christos         {
   1018      1.1.1.13  christos             AcpiDmEmitExternal (Op, AcpiPsGetArg(Op, 0));
   1019       1.1.1.9  christos         }
   1020       1.1.1.8  christos 
   1021      1.1.1.12  christos         break;
   1022      1.1.1.12  christos 
   1023           1.1    jruoho     default:
   1024           1.1    jruoho 
   1025           1.1    jruoho         /* Just get the opcode name and print it */
   1026           1.1    jruoho 
   1027           1.1    jruoho         AcpiOsPrintf ("%s", OpInfo->Name);
   1028           1.1    jruoho 
   1029           1.1    jruoho 
   1030           1.1    jruoho #ifdef ACPI_DEBUGGER
   1031           1.1    jruoho 
   1032           1.1    jruoho         if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
   1033           1.1    jruoho             (WalkState) &&
   1034           1.1    jruoho             (WalkState->Results) &&
   1035           1.1    jruoho             (WalkState->ResultCount))
   1036           1.1    jruoho         {
   1037       1.1.1.6  christos             AcpiDbDecodeInternalObject (
   1038           1.1    jruoho                 WalkState->Results->Results.ObjDesc [
   1039           1.1    jruoho                     (WalkState->ResultCount - 1) %
   1040           1.1    jruoho                         ACPI_RESULTS_FRAME_OBJ_NUM]);
   1041           1.1    jruoho         }
   1042           1.1    jruoho #endif
   1043           1.1    jruoho 
   1044           1.1    jruoho         break;
   1045           1.1    jruoho     }
   1046           1.1    jruoho }
   1047           1.1    jruoho 
   1048       1.1.1.7  christos 
   1049       1.1.1.7  christos /*******************************************************************************
   1050       1.1.1.7  christos  *
   1051       1.1.1.7  christos  * FUNCTION:    AcpiDmConvertToElseIf
   1052       1.1.1.7  christos  *
   1053       1.1.1.7  christos  * PARAMETERS:  OriginalElseOp          - ELSE Object to be examined
   1054       1.1.1.7  christos  *
   1055       1.1.1.7  christos  * RETURN:      None. Emits either an "Else" or an "ElseIf" ASL operator.
   1056       1.1.1.7  christos  *
   1057       1.1.1.7  christos  * DESCRIPTION: Detect and convert an If..Else..If sequence to If..ElseIf
   1058       1.1.1.7  christos  *
   1059       1.1.1.7  christos  * EXAMPLE:
   1060       1.1.1.7  christos  *
   1061       1.1.1.7  christos  * This If..Else..If nested sequence:
   1062       1.1.1.7  christos  *
   1063       1.1.1.7  christos  *        If (Arg0 == 1)
   1064       1.1.1.7  christos  *        {
   1065       1.1.1.7  christos  *            Local0 = 4
   1066       1.1.1.7  christos  *        }
   1067       1.1.1.7  christos  *        Else
   1068       1.1.1.7  christos  *        {
   1069       1.1.1.7  christos  *            If (Arg0 == 2)
   1070       1.1.1.7  christos  *            {
   1071       1.1.1.7  christos  *                Local0 = 5
   1072       1.1.1.7  christos  *            }
   1073       1.1.1.7  christos  *        }
   1074       1.1.1.7  christos  *
   1075       1.1.1.7  christos  * Is converted to this simpler If..ElseIf sequence:
   1076       1.1.1.7  christos  *
   1077       1.1.1.7  christos  *        If (Arg0 == 1)
   1078       1.1.1.7  christos  *        {
   1079       1.1.1.7  christos  *            Local0 = 4
   1080       1.1.1.7  christos  *        }
   1081       1.1.1.7  christos  *        ElseIf (Arg0 == 2)
   1082       1.1.1.7  christos  *        {
   1083       1.1.1.7  christos  *            Local0 = 5
   1084       1.1.1.7  christos  *        }
   1085       1.1.1.7  christos  *
   1086       1.1.1.7  christos  * NOTE: There is no actual ElseIf AML opcode. ElseIf is essentially an ASL
   1087       1.1.1.7  christos  * macro that emits an Else opcode followed by an If opcode. This function
   1088       1.1.1.7  christos  * reverses these AML sequences back to an ElseIf macro where possible. This
   1089       1.1.1.7  christos  * can make the disassembled ASL code simpler and more like the original code.
   1090       1.1.1.7  christos  *
   1091       1.1.1.7  christos  ******************************************************************************/
   1092       1.1.1.7  christos 
   1093       1.1.1.7  christos static void
   1094       1.1.1.7  christos AcpiDmConvertToElseIf (
   1095       1.1.1.7  christos     ACPI_PARSE_OBJECT       *OriginalElseOp)
   1096       1.1.1.7  christos {
   1097       1.1.1.7  christos     ACPI_PARSE_OBJECT       *IfOp;
   1098       1.1.1.7  christos     ACPI_PARSE_OBJECT       *ElseOp;
   1099       1.1.1.7  christos 
   1100       1.1.1.7  christos 
   1101       1.1.1.8  christos     /*
   1102       1.1.1.8  christos      * To be able to perform the conversion, two conditions must be satisfied:
   1103       1.1.1.8  christos      * 1) The first child of the Else must be an If statement.
   1104       1.1.1.8  christos      * 2) The If block can only be followed by an Else block and these must
   1105       1.1.1.8  christos      *    be the only blocks under the original Else.
   1106       1.1.1.8  christos      */
   1107       1.1.1.7  christos     IfOp = OriginalElseOp->Common.Value.Arg;
   1108      1.1.1.10  christos 
   1109       1.1.1.8  christos     if (!IfOp ||
   1110       1.1.1.8  christos         (IfOp->Common.AmlOpcode != AML_IF_OP) ||
   1111       1.1.1.8  christos         (IfOp->Asl.Next && (IfOp->Asl.Next->Common.AmlOpcode != AML_ELSE_OP)))
   1112       1.1.1.7  christos     {
   1113      1.1.1.10  christos         /* Not a proper Else..If sequence, cannot convert to ElseIf */
   1114      1.1.1.10  christos 
   1115      1.1.1.11  christos         if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT)
   1116      1.1.1.11  christos         {
   1117      1.1.1.11  christos             AcpiOsPrintf ("%s", "Default");
   1118      1.1.1.11  christos             return;
   1119      1.1.1.11  christos         }
   1120      1.1.1.11  christos 
   1121      1.1.1.10  christos         AcpiOsPrintf ("%s", "Else");
   1122      1.1.1.10  christos         return;
   1123      1.1.1.10  christos     }
   1124      1.1.1.10  christos 
   1125      1.1.1.10  christos     /* Cannot have anything following the If...Else block */
   1126       1.1.1.7  christos 
   1127      1.1.1.10  christos     ElseOp = IfOp->Common.Next;
   1128      1.1.1.10  christos     if (ElseOp && ElseOp->Common.Next)
   1129      1.1.1.10  christos     {
   1130      1.1.1.11  christos         if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT)
   1131      1.1.1.11  christos         {
   1132      1.1.1.11  christos             AcpiOsPrintf ("%s", "Default");
   1133      1.1.1.11  christos             return;
   1134      1.1.1.11  christos         }
   1135      1.1.1.11  christos 
   1136       1.1.1.7  christos         AcpiOsPrintf ("%s", "Else");
   1137       1.1.1.7  christos         return;
   1138       1.1.1.7  christos     }
   1139       1.1.1.7  christos 
   1140      1.1.1.11  christos     if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT)
   1141      1.1.1.11  christos     {
   1142      1.1.1.11  christos         /*
   1143      1.1.1.11  christos          * There is an ElseIf but in this case the Else is actually
   1144      1.1.1.11  christos          * a Default block for a Switch/Case statement. No conversion.
   1145      1.1.1.11  christos          */
   1146      1.1.1.11  christos         AcpiOsPrintf ("%s", "Default");
   1147      1.1.1.11  christos         return;
   1148      1.1.1.11  christos     }
   1149      1.1.1.11  christos 
   1150      1.1.1.11  christos     if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_CASE)
   1151      1.1.1.11  christos     {
   1152      1.1.1.11  christos         /*
   1153      1.1.1.11  christos          * This ElseIf is actually a Case block for a Switch/Case
   1154      1.1.1.11  christos          * statement. Print Case but do not return so that we can
   1155      1.1.1.11  christos          * promote the subtree and keep the indentation level.
   1156      1.1.1.11  christos          */
   1157      1.1.1.11  christos         AcpiOsPrintf ("%s", "Case");
   1158      1.1.1.11  christos     }
   1159      1.1.1.11  christos     else
   1160      1.1.1.11  christos     {
   1161      1.1.1.11  christos        /* Emit ElseIf, mark the IF as now an ELSEIF */
   1162      1.1.1.11  christos 
   1163      1.1.1.11  christos         AcpiOsPrintf ("%s", "ElseIf");
   1164      1.1.1.11  christos     }
   1165       1.1.1.7  christos 
   1166       1.1.1.7  christos     IfOp->Common.DisasmFlags |= ACPI_PARSEOP_ELSEIF;
   1167       1.1.1.7  christos 
   1168       1.1.1.7  christos     /* The IF parent will now be the same as the original ELSE parent */
   1169       1.1.1.7  christos 
   1170       1.1.1.7  christos     IfOp->Common.Parent = OriginalElseOp->Common.Parent;
   1171       1.1.1.7  christos 
   1172       1.1.1.7  christos     /*
   1173       1.1.1.7  christos      * Update the NEXT pointers to restructure the parse tree, essentially
   1174       1.1.1.7  christos      * promoting an If..Else block up to the same level as the original
   1175       1.1.1.7  christos      * Else.
   1176       1.1.1.7  christos      *
   1177       1.1.1.7  christos      * Check if the IF has a corresponding ELSE peer
   1178       1.1.1.7  christos      */
   1179       1.1.1.7  christos     ElseOp = IfOp->Common.Next;
   1180       1.1.1.7  christos     if (ElseOp &&
   1181       1.1.1.7  christos         (ElseOp->Common.AmlOpcode == AML_ELSE_OP))
   1182       1.1.1.7  christos     {
   1183       1.1.1.7  christos         /* If an ELSE matches the IF, promote it also */
   1184       1.1.1.7  christos 
   1185       1.1.1.7  christos         ElseOp->Common.Parent = OriginalElseOp->Common.Parent;
   1186      1.1.1.10  christos 
   1187      1.1.1.10  christos         /* Promote the entire block under the ElseIf (All Next OPs) */
   1188      1.1.1.10  christos 
   1189      1.1.1.10  christos         AcpiDmPromoteSubtree (OriginalElseOp);
   1190       1.1.1.7  christos     }
   1191       1.1.1.7  christos     else
   1192       1.1.1.7  christos     {
   1193       1.1.1.7  christos         /* Otherwise, set the IF NEXT to the original ELSE NEXT */
   1194       1.1.1.7  christos 
   1195       1.1.1.7  christos         IfOp->Common.Next = OriginalElseOp->Common.Next;
   1196       1.1.1.7  christos     }
   1197       1.1.1.7  christos 
   1198       1.1.1.7  christos     /* Detach the child IF block from the original ELSE */
   1199       1.1.1.7  christos 
   1200       1.1.1.7  christos     OriginalElseOp->Common.Value.Arg = NULL;
   1201       1.1.1.7  christos 
   1202       1.1.1.7  christos     /* Ignore the original ELSE from now on */
   1203       1.1.1.7  christos 
   1204       1.1.1.7  christos     OriginalElseOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
   1205       1.1.1.7  christos     OriginalElseOp->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
   1206       1.1.1.7  christos 
   1207       1.1.1.7  christos     /* Insert IF (now ELSEIF) as next peer of the original ELSE */
   1208       1.1.1.7  christos 
   1209       1.1.1.7  christos     OriginalElseOp->Common.Next = IfOp;
   1210       1.1.1.7  christos }
   1211      1.1.1.10  christos 
   1212      1.1.1.10  christos 
   1213      1.1.1.10  christos /*******************************************************************************
   1214      1.1.1.10  christos  *
   1215      1.1.1.10  christos  * FUNCTION:    AcpiDmPromoteSubtree
   1216      1.1.1.10  christos  *
   1217      1.1.1.10  christos  * PARAMETERS:  StartOpOp           - Original parent of the entire subtree
   1218      1.1.1.10  christos  *
   1219      1.1.1.10  christos  * RETURN:      None
   1220      1.1.1.10  christos  *
   1221      1.1.1.10  christos  * DESCRIPTION: Promote an entire parse subtree up one level.
   1222      1.1.1.10  christos  *
   1223      1.1.1.10  christos  ******************************************************************************/
   1224      1.1.1.10  christos 
   1225      1.1.1.10  christos static void
   1226      1.1.1.10  christos AcpiDmPromoteSubtree (
   1227      1.1.1.10  christos     ACPI_PARSE_OBJECT       *StartOp)
   1228      1.1.1.10  christos {
   1229      1.1.1.10  christos     ACPI_PARSE_OBJECT       *Op;
   1230      1.1.1.10  christos     ACPI_PARSE_OBJECT       *ParentOp;
   1231      1.1.1.10  christos 
   1232      1.1.1.10  christos 
   1233      1.1.1.10  christos     /* New parent for subtree elements */
   1234      1.1.1.10  christos 
   1235      1.1.1.10  christos     ParentOp = StartOp->Common.Parent;
   1236      1.1.1.10  christos 
   1237      1.1.1.10  christos     /* First child starts the subtree */
   1238      1.1.1.10  christos 
   1239      1.1.1.10  christos     Op = StartOp->Common.Value.Arg;
   1240      1.1.1.10  christos 
   1241      1.1.1.10  christos     /* Walk the top-level elements of the subtree */
   1242      1.1.1.10  christos 
   1243      1.1.1.10  christos     while (Op)
   1244      1.1.1.10  christos     {
   1245      1.1.1.10  christos         Op->Common.Parent = ParentOp;
   1246      1.1.1.10  christos         if (!Op->Common.Next)
   1247      1.1.1.10  christos         {
   1248      1.1.1.10  christos             /* Last Op in list, update its next field */
   1249      1.1.1.10  christos 
   1250      1.1.1.10  christos             Op->Common.Next = StartOp->Common.Next;
   1251      1.1.1.10  christos             break;
   1252      1.1.1.10  christos         }
   1253      1.1.1.10  christos         Op = Op->Common.Next;
   1254      1.1.1.10  christos     }
   1255      1.1.1.10  christos }
   1256