Home | History | Annotate | Line # | Download | only in disassembler
dmutils.c revision 1.1.1.6
      1      1.1    jruoho /*******************************************************************************
      2      1.1    jruoho  *
      3      1.1    jruoho  * Module Name: dmutils - AML disassembler utilities
      4      1.1    jruoho  *
      5      1.1    jruoho  ******************************************************************************/
      6      1.1    jruoho 
      7  1.1.1.2    jruoho /*
      8  1.1.1.6  christos  * 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 "amlcode.h"
     47      1.1    jruoho #include "acdisasm.h"
     48      1.1    jruoho 
     49      1.1    jruoho #ifdef ACPI_ASL_COMPILER
     50      1.1    jruoho #include <acnamesp.h>
     51      1.1    jruoho #endif
     52      1.1    jruoho 
     53      1.1    jruoho 
     54      1.1    jruoho #define _COMPONENT          ACPI_CA_DEBUGGER
     55      1.1    jruoho         ACPI_MODULE_NAME    ("dmutils")
     56      1.1    jruoho 
     57      1.1    jruoho 
     58      1.1    jruoho /* Data used in keeping track of fields */
     59      1.1    jruoho #if 0
     60      1.1    jruoho const char                      *AcpiGbl_FENames[] =
     61      1.1    jruoho {
     62      1.1    jruoho     "skip",
     63      1.1    jruoho     "?access?"
     64      1.1    jruoho };              /* FE = Field Element */
     65      1.1    jruoho #endif
     66      1.1    jruoho 
     67      1.1    jruoho /* Operators for Match() */
     68      1.1    jruoho 
     69      1.1    jruoho const char                      *AcpiGbl_MatchOps[] =
     70      1.1    jruoho {
     71      1.1    jruoho     "MTR",
     72      1.1    jruoho     "MEQ",
     73      1.1    jruoho     "MLE",
     74      1.1    jruoho     "MLT",
     75      1.1    jruoho     "MGE",
     76      1.1    jruoho     "MGT"
     77      1.1    jruoho };
     78      1.1    jruoho 
     79      1.1    jruoho /* Access type decoding */
     80      1.1    jruoho 
     81      1.1    jruoho const char                      *AcpiGbl_AccessTypes[] =
     82      1.1    jruoho {
     83      1.1    jruoho     "AnyAcc",
     84      1.1    jruoho     "ByteAcc",
     85      1.1    jruoho     "WordAcc",
     86      1.1    jruoho     "DWordAcc",
     87      1.1    jruoho     "QWordAcc",
     88      1.1    jruoho     "BufferAcc",
     89      1.1    jruoho     "InvalidAccType",
     90      1.1    jruoho     "InvalidAccType"
     91      1.1    jruoho };
     92      1.1    jruoho 
     93      1.1    jruoho /* Lock rule decoding */
     94      1.1    jruoho 
     95      1.1    jruoho const char                      *AcpiGbl_LockRule[] =
     96      1.1    jruoho {
     97      1.1    jruoho     "NoLock",
     98      1.1    jruoho     "Lock"
     99      1.1    jruoho };
    100      1.1    jruoho 
    101      1.1    jruoho /* Update rule decoding */
    102      1.1    jruoho 
    103      1.1    jruoho const char                      *AcpiGbl_UpdateRules[] =
    104      1.1    jruoho {
    105      1.1    jruoho     "Preserve",
    106      1.1    jruoho     "WriteAsOnes",
    107      1.1    jruoho     "WriteAsZeros",
    108      1.1    jruoho     "InvalidUpdateRule"
    109      1.1    jruoho };
    110      1.1    jruoho 
    111      1.1    jruoho /* Strings used to decode resource descriptors */
    112      1.1    jruoho 
    113      1.1    jruoho const char                      *AcpiGbl_WordDecode[] =
    114      1.1    jruoho {
    115      1.1    jruoho     "Memory",
    116      1.1    jruoho     "IO",
    117      1.1    jruoho     "BusNumber",
    118      1.1    jruoho     "UnknownResourceType"
    119      1.1    jruoho };
    120      1.1    jruoho 
    121      1.1    jruoho const char                      *AcpiGbl_IrqDecode[] =
    122      1.1    jruoho {
    123      1.1    jruoho     "IRQNoFlags",
    124      1.1    jruoho     "IRQ"
    125      1.1    jruoho };
    126      1.1    jruoho 
    127      1.1    jruoho 
    128      1.1    jruoho /*******************************************************************************
    129      1.1    jruoho  *
    130      1.1    jruoho  * FUNCTION:    AcpiDmDecodeAttribute
    131      1.1    jruoho  *
    132      1.1    jruoho  * PARAMETERS:  Attribute       - Attribute field of AccessAs keyword
    133      1.1    jruoho  *
    134      1.1    jruoho  * RETURN:      None
    135      1.1    jruoho  *
    136  1.1.1.3  christos  * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus and
    137  1.1.1.3  christos  *              GenericSerialBus stuff.)
    138      1.1    jruoho  *
    139      1.1    jruoho  ******************************************************************************/
    140      1.1    jruoho 
    141      1.1    jruoho void
    142      1.1    jruoho AcpiDmDecodeAttribute (
    143      1.1    jruoho     UINT8                   Attribute)
    144      1.1    jruoho {
    145      1.1    jruoho 
    146      1.1    jruoho     switch (Attribute)
    147      1.1    jruoho     {
    148  1.1.1.3  christos     case AML_FIELD_ATTRIB_QUICK:
    149      1.1    jruoho 
    150  1.1.1.3  christos         AcpiOsPrintf ("AttribQuick");
    151      1.1    jruoho         break;
    152      1.1    jruoho 
    153  1.1.1.3  christos     case AML_FIELD_ATTRIB_SEND_RCV:
    154      1.1    jruoho 
    155  1.1.1.3  christos         AcpiOsPrintf ("AttribSendReceive");
    156      1.1    jruoho         break;
    157      1.1    jruoho 
    158  1.1.1.3  christos     case AML_FIELD_ATTRIB_BYTE:
    159      1.1    jruoho 
    160  1.1.1.3  christos         AcpiOsPrintf ("AttribByte");
    161      1.1    jruoho         break;
    162      1.1    jruoho 
    163  1.1.1.3  christos     case AML_FIELD_ATTRIB_WORD:
    164      1.1    jruoho 
    165  1.1.1.3  christos         AcpiOsPrintf ("AttribWord");
    166      1.1    jruoho         break;
    167      1.1    jruoho 
    168  1.1.1.3  christos     case AML_FIELD_ATTRIB_BLOCK:
    169      1.1    jruoho 
    170  1.1.1.3  christos         AcpiOsPrintf ("AttribBlock");
    171      1.1    jruoho         break;
    172      1.1    jruoho 
    173  1.1.1.3  christos     case AML_FIELD_ATTRIB_MULTIBYTE:
    174      1.1    jruoho 
    175  1.1.1.3  christos         AcpiOsPrintf ("AttribBytes");
    176      1.1    jruoho         break;
    177      1.1    jruoho 
    178  1.1.1.3  christos     case AML_FIELD_ATTRIB_WORD_CALL:
    179      1.1    jruoho 
    180  1.1.1.3  christos         AcpiOsPrintf ("AttribProcessCall");
    181  1.1.1.3  christos         break;
    182  1.1.1.3  christos 
    183  1.1.1.3  christos     case AML_FIELD_ATTRIB_BLOCK_CALL:
    184  1.1.1.3  christos 
    185  1.1.1.3  christos         AcpiOsPrintf ("AttribBlockProcessCall");
    186  1.1.1.3  christos         break;
    187  1.1.1.3  christos 
    188  1.1.1.3  christos     case AML_FIELD_ATTRIB_RAW_BYTES:
    189  1.1.1.3  christos 
    190  1.1.1.3  christos         AcpiOsPrintf ("AttribRawBytes");
    191  1.1.1.3  christos         break;
    192  1.1.1.3  christos 
    193  1.1.1.3  christos     case AML_FIELD_ATTRIB_RAW_PROCESS:
    194  1.1.1.3  christos 
    195  1.1.1.3  christos         AcpiOsPrintf ("AttribRawProcessBytes");
    196      1.1    jruoho         break;
    197      1.1    jruoho 
    198      1.1    jruoho     default:
    199      1.1    jruoho 
    200  1.1.1.3  christos         /* A ByteConst is allowed by the grammar */
    201  1.1.1.3  christos 
    202  1.1.1.3  christos         AcpiOsPrintf ("0x%2.2X", Attribute);
    203      1.1    jruoho         break;
    204      1.1    jruoho     }
    205      1.1    jruoho }
    206      1.1    jruoho 
    207      1.1    jruoho 
    208      1.1    jruoho /*******************************************************************************
    209      1.1    jruoho  *
    210      1.1    jruoho  * FUNCTION:    AcpiDmIndent
    211      1.1    jruoho  *
    212      1.1    jruoho  * PARAMETERS:  Level               - Current source code indentation level
    213      1.1    jruoho  *
    214      1.1    jruoho  * RETURN:      None
    215      1.1    jruoho  *
    216      1.1    jruoho  * DESCRIPTION: Indent 4 spaces per indentation level.
    217      1.1    jruoho  *
    218      1.1    jruoho  ******************************************************************************/
    219      1.1    jruoho 
    220      1.1    jruoho void
    221      1.1    jruoho AcpiDmIndent (
    222      1.1    jruoho     UINT32                  Level)
    223      1.1    jruoho {
    224      1.1    jruoho 
    225      1.1    jruoho     if (!Level)
    226      1.1    jruoho     {
    227      1.1    jruoho         return;
    228      1.1    jruoho     }
    229      1.1    jruoho 
    230      1.1    jruoho     AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " ");
    231      1.1    jruoho }
    232      1.1    jruoho 
    233      1.1    jruoho 
    234      1.1    jruoho /*******************************************************************************
    235      1.1    jruoho  *
    236      1.1    jruoho  * FUNCTION:    AcpiDmCommaIfListMember
    237      1.1    jruoho  *
    238      1.1    jruoho  * PARAMETERS:  Op              - Current operator/operand
    239      1.1    jruoho  *
    240      1.1    jruoho  * RETURN:      TRUE if a comma was inserted
    241      1.1    jruoho  *
    242      1.1    jruoho  * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
    243      1.1    jruoho  *
    244      1.1    jruoho  ******************************************************************************/
    245      1.1    jruoho 
    246      1.1    jruoho BOOLEAN
    247      1.1    jruoho AcpiDmCommaIfListMember (
    248      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    249      1.1    jruoho {
    250      1.1    jruoho 
    251      1.1    jruoho     if (!Op->Common.Next)
    252      1.1    jruoho     {
    253  1.1.1.3  christos         return (FALSE);
    254      1.1    jruoho     }
    255      1.1    jruoho 
    256      1.1    jruoho     if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
    257      1.1    jruoho     {
    258  1.1.1.5  christos         /* Exit if Target has been marked IGNORE */
    259  1.1.1.5  christos 
    260  1.1.1.5  christos         if (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
    261  1.1.1.5  christos         {
    262  1.1.1.5  christos             return (FALSE);
    263  1.1.1.5  christos         }
    264  1.1.1.5  christos 
    265      1.1    jruoho         /* Check for a NULL target operand */
    266      1.1    jruoho 
    267      1.1    jruoho         if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
    268      1.1    jruoho             (!Op->Common.Next->Common.Value.String))
    269      1.1    jruoho         {
    270      1.1    jruoho             /*
    271      1.1    jruoho              * To handle the Divide() case where there are two optional
    272  1.1.1.3  christos              * targets, look ahead one more op. If null, this null target
    273  1.1.1.3  christos              * is the one and only target -- no comma needed. Otherwise,
    274      1.1    jruoho              * we need a comma to prepare for the next target.
    275      1.1    jruoho              */
    276      1.1    jruoho             if (!Op->Common.Next->Common.Next)
    277      1.1    jruoho             {
    278  1.1.1.3  christos                 return (FALSE);
    279      1.1    jruoho             }
    280      1.1    jruoho         }
    281      1.1    jruoho 
    282      1.1    jruoho         if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
    283      1.1    jruoho             (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)))
    284      1.1    jruoho         {
    285  1.1.1.3  christos             return (FALSE);
    286      1.1    jruoho         }
    287      1.1    jruoho 
    288  1.1.1.5  christos         /* Emit comma only if this is not a C-style operator */
    289  1.1.1.5  christos 
    290  1.1.1.5  christos         if (!Op->Common.OperatorSymbol)
    291  1.1.1.5  christos         {
    292  1.1.1.5  christos             AcpiOsPrintf (", ");
    293  1.1.1.5  christos         }
    294  1.1.1.5  christos 
    295      1.1    jruoho         return (TRUE);
    296      1.1    jruoho     }
    297      1.1    jruoho 
    298      1.1    jruoho     else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
    299      1.1    jruoho              (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
    300      1.1    jruoho     {
    301      1.1    jruoho         AcpiOsPrintf (", ");
    302      1.1    jruoho         return (TRUE);
    303      1.1    jruoho     }
    304      1.1    jruoho 
    305      1.1    jruoho     return (FALSE);
    306      1.1    jruoho }
    307      1.1    jruoho 
    308      1.1    jruoho 
    309      1.1    jruoho /*******************************************************************************
    310      1.1    jruoho  *
    311      1.1    jruoho  * FUNCTION:    AcpiDmCommaIfFieldMember
    312      1.1    jruoho  *
    313      1.1    jruoho  * PARAMETERS:  Op              - Current operator/operand
    314      1.1    jruoho  *
    315      1.1    jruoho  * RETURN:      None
    316      1.1    jruoho  *
    317      1.1    jruoho  * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
    318      1.1    jruoho  *
    319      1.1    jruoho  ******************************************************************************/
    320      1.1    jruoho 
    321      1.1    jruoho void
    322      1.1    jruoho AcpiDmCommaIfFieldMember (
    323      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    324      1.1    jruoho {
    325      1.1    jruoho 
    326      1.1    jruoho     if (Op->Common.Next)
    327      1.1    jruoho     {
    328      1.1    jruoho         AcpiOsPrintf (", ");
    329      1.1    jruoho     }
    330      1.1    jruoho }
    331