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