Home | History | Annotate | Line # | Download | only in disassembler
dmutils.c revision 1.1.1.2
      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.2  jruoho  * Copyright (C) 2000 - 2011, 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  jruoho  * DESCRIPTION: Decode the AccessAs attribute byte.  (Mostly SMBus stuff)
    139      1.1  jruoho  *
    140      1.1  jruoho  ******************************************************************************/
    141      1.1  jruoho 
    142      1.1  jruoho void
    143      1.1  jruoho AcpiDmDecodeAttribute (
    144      1.1  jruoho     UINT8                   Attribute)
    145      1.1  jruoho {
    146      1.1  jruoho 
    147      1.1  jruoho     switch (Attribute)
    148      1.1  jruoho     {
    149      1.1  jruoho     case AML_FIELD_ATTRIB_SMB_QUICK:
    150      1.1  jruoho 
    151      1.1  jruoho         AcpiOsPrintf ("SMBQuick");
    152      1.1  jruoho         break;
    153      1.1  jruoho 
    154      1.1  jruoho     case AML_FIELD_ATTRIB_SMB_SEND_RCV:
    155      1.1  jruoho 
    156      1.1  jruoho         AcpiOsPrintf ("SMBSendReceive");
    157      1.1  jruoho         break;
    158      1.1  jruoho 
    159      1.1  jruoho     case AML_FIELD_ATTRIB_SMB_BYTE:
    160      1.1  jruoho 
    161      1.1  jruoho         AcpiOsPrintf ("SMBByte");
    162      1.1  jruoho         break;
    163      1.1  jruoho 
    164      1.1  jruoho     case AML_FIELD_ATTRIB_SMB_WORD:
    165      1.1  jruoho 
    166      1.1  jruoho         AcpiOsPrintf ("SMBWord");
    167      1.1  jruoho         break;
    168      1.1  jruoho 
    169      1.1  jruoho     case AML_FIELD_ATTRIB_SMB_WORD_CALL:
    170      1.1  jruoho 
    171      1.1  jruoho         AcpiOsPrintf ("SMBProcessCall");
    172      1.1  jruoho         break;
    173      1.1  jruoho 
    174      1.1  jruoho     case AML_FIELD_ATTRIB_SMB_BLOCK:
    175      1.1  jruoho 
    176      1.1  jruoho         AcpiOsPrintf ("SMBBlock");
    177      1.1  jruoho         break;
    178      1.1  jruoho 
    179      1.1  jruoho     case AML_FIELD_ATTRIB_SMB_BLOCK_CALL:
    180      1.1  jruoho 
    181      1.1  jruoho         AcpiOsPrintf ("SMBBlockProcessCall");
    182      1.1  jruoho         break;
    183      1.1  jruoho 
    184      1.1  jruoho     default:
    185      1.1  jruoho 
    186      1.1  jruoho         AcpiOsPrintf ("0x%.2X", Attribute);
    187      1.1  jruoho         break;
    188      1.1  jruoho     }
    189      1.1  jruoho }
    190      1.1  jruoho 
    191      1.1  jruoho 
    192      1.1  jruoho /*******************************************************************************
    193      1.1  jruoho  *
    194      1.1  jruoho  * FUNCTION:    AcpiDmIndent
    195      1.1  jruoho  *
    196      1.1  jruoho  * PARAMETERS:  Level               - Current source code indentation level
    197      1.1  jruoho  *
    198      1.1  jruoho  * RETURN:      None
    199      1.1  jruoho  *
    200      1.1  jruoho  * DESCRIPTION: Indent 4 spaces per indentation level.
    201      1.1  jruoho  *
    202      1.1  jruoho  ******************************************************************************/
    203      1.1  jruoho 
    204      1.1  jruoho void
    205      1.1  jruoho AcpiDmIndent (
    206      1.1  jruoho     UINT32                  Level)
    207      1.1  jruoho {
    208      1.1  jruoho 
    209      1.1  jruoho     if (!Level)
    210      1.1  jruoho     {
    211      1.1  jruoho         return;
    212      1.1  jruoho     }
    213      1.1  jruoho 
    214      1.1  jruoho     AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " ");
    215      1.1  jruoho }
    216      1.1  jruoho 
    217      1.1  jruoho 
    218      1.1  jruoho /*******************************************************************************
    219      1.1  jruoho  *
    220      1.1  jruoho  * FUNCTION:    AcpiDmCommaIfListMember
    221      1.1  jruoho  *
    222      1.1  jruoho  * PARAMETERS:  Op              - Current operator/operand
    223      1.1  jruoho  *
    224      1.1  jruoho  * RETURN:      TRUE if a comma was inserted
    225      1.1  jruoho  *
    226      1.1  jruoho  * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
    227      1.1  jruoho  *
    228      1.1  jruoho  ******************************************************************************/
    229      1.1  jruoho 
    230      1.1  jruoho BOOLEAN
    231      1.1  jruoho AcpiDmCommaIfListMember (
    232      1.1  jruoho     ACPI_PARSE_OBJECT       *Op)
    233      1.1  jruoho {
    234      1.1  jruoho 
    235      1.1  jruoho     if (!Op->Common.Next)
    236      1.1  jruoho     {
    237      1.1  jruoho         return FALSE;
    238      1.1  jruoho     }
    239      1.1  jruoho 
    240      1.1  jruoho     if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
    241      1.1  jruoho     {
    242      1.1  jruoho         /* Check for a NULL target operand */
    243      1.1  jruoho 
    244      1.1  jruoho         if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
    245      1.1  jruoho             (!Op->Common.Next->Common.Value.String))
    246      1.1  jruoho         {
    247      1.1  jruoho             /*
    248      1.1  jruoho              * To handle the Divide() case where there are two optional
    249      1.1  jruoho              * targets, look ahead one more op.  If null, this null target
    250      1.1  jruoho              * is the one and only target -- no comma needed.  Otherwise,
    251      1.1  jruoho              * we need a comma to prepare for the next target.
    252      1.1  jruoho              */
    253      1.1  jruoho             if (!Op->Common.Next->Common.Next)
    254      1.1  jruoho             {
    255      1.1  jruoho                 return FALSE;
    256      1.1  jruoho             }
    257      1.1  jruoho         }
    258      1.1  jruoho 
    259      1.1  jruoho         if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
    260      1.1  jruoho             (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)))
    261      1.1  jruoho         {
    262      1.1  jruoho             return FALSE;
    263      1.1  jruoho         }
    264      1.1  jruoho 
    265      1.1  jruoho         AcpiOsPrintf (", ");
    266      1.1  jruoho         return (TRUE);
    267      1.1  jruoho     }
    268      1.1  jruoho 
    269      1.1  jruoho     else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
    270      1.1  jruoho              (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
    271      1.1  jruoho     {
    272      1.1  jruoho         AcpiOsPrintf (", ");
    273      1.1  jruoho         return (TRUE);
    274      1.1  jruoho     }
    275      1.1  jruoho 
    276      1.1  jruoho     return (FALSE);
    277      1.1  jruoho }
    278      1.1  jruoho 
    279      1.1  jruoho 
    280      1.1  jruoho /*******************************************************************************
    281      1.1  jruoho  *
    282      1.1  jruoho  * FUNCTION:    AcpiDmCommaIfFieldMember
    283      1.1  jruoho  *
    284      1.1  jruoho  * PARAMETERS:  Op              - Current operator/operand
    285      1.1  jruoho  *
    286      1.1  jruoho  * RETURN:      None
    287      1.1  jruoho  *
    288      1.1  jruoho  * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
    289      1.1  jruoho  *
    290      1.1  jruoho  ******************************************************************************/
    291      1.1  jruoho 
    292      1.1  jruoho void
    293      1.1  jruoho AcpiDmCommaIfFieldMember (
    294      1.1  jruoho     ACPI_PARSE_OBJECT       *Op)
    295      1.1  jruoho {
    296      1.1  jruoho 
    297      1.1  jruoho     if (Op->Common.Next)
    298      1.1  jruoho     {
    299      1.1  jruoho         AcpiOsPrintf (", ");
    300      1.1  jruoho     }
    301      1.1  jruoho }
    302      1.1  jruoho 
    303      1.1  jruoho #endif
    304