Home | History | Annotate | Line # | Download | only in disassembler
dmutils.c revision 1.1.1.2.4.2
      1  1.1.1.2.4.2  rmind /*******************************************************************************
      2  1.1.1.2.4.2  rmind  *
      3  1.1.1.2.4.2  rmind  * Module Name: dmutils - AML disassembler utilities
      4  1.1.1.2.4.2  rmind  *
      5  1.1.1.2.4.2  rmind  ******************************************************************************/
      6  1.1.1.2.4.2  rmind 
      7  1.1.1.2.4.2  rmind /*
      8  1.1.1.2.4.2  rmind  * Copyright (C) 2000 - 2011, Intel Corp.
      9  1.1.1.2.4.2  rmind  * All rights reserved.
     10  1.1.1.2.4.2  rmind  *
     11  1.1.1.2.4.2  rmind  * Redistribution and use in source and binary forms, with or without
     12  1.1.1.2.4.2  rmind  * modification, are permitted provided that the following conditions
     13  1.1.1.2.4.2  rmind  * are met:
     14  1.1.1.2.4.2  rmind  * 1. Redistributions of source code must retain the above copyright
     15  1.1.1.2.4.2  rmind  *    notice, this list of conditions, and the following disclaimer,
     16  1.1.1.2.4.2  rmind  *    without modification.
     17  1.1.1.2.4.2  rmind  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  1.1.1.2.4.2  rmind  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  1.1.1.2.4.2  rmind  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  1.1.1.2.4.2  rmind  *    including a substantially similar Disclaimer requirement for further
     21  1.1.1.2.4.2  rmind  *    binary redistribution.
     22  1.1.1.2.4.2  rmind  * 3. Neither the names of the above-listed copyright holders nor the names
     23  1.1.1.2.4.2  rmind  *    of any contributors may be used to endorse or promote products derived
     24  1.1.1.2.4.2  rmind  *    from this software without specific prior written permission.
     25  1.1.1.2.4.2  rmind  *
     26  1.1.1.2.4.2  rmind  * Alternatively, this software may be distributed under the terms of the
     27  1.1.1.2.4.2  rmind  * GNU General Public License ("GPL") version 2 as published by the Free
     28  1.1.1.2.4.2  rmind  * Software Foundation.
     29  1.1.1.2.4.2  rmind  *
     30  1.1.1.2.4.2  rmind  * NO WARRANTY
     31  1.1.1.2.4.2  rmind  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  1.1.1.2.4.2  rmind  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  1.1.1.2.4.2  rmind  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  1.1.1.2.4.2  rmind  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  1.1.1.2.4.2  rmind  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  1.1.1.2.4.2  rmind  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  1.1.1.2.4.2  rmind  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  1.1.1.2.4.2  rmind  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  1.1.1.2.4.2  rmind  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  1.1.1.2.4.2  rmind  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  1.1.1.2.4.2  rmind  * POSSIBILITY OF SUCH DAMAGES.
     42  1.1.1.2.4.2  rmind  */
     43  1.1.1.2.4.2  rmind 
     44  1.1.1.2.4.2  rmind 
     45  1.1.1.2.4.2  rmind #include "acpi.h"
     46  1.1.1.2.4.2  rmind #include "accommon.h"
     47  1.1.1.2.4.2  rmind #include "amlcode.h"
     48  1.1.1.2.4.2  rmind #include "acdisasm.h"
     49  1.1.1.2.4.2  rmind 
     50  1.1.1.2.4.2  rmind #ifdef ACPI_ASL_COMPILER
     51  1.1.1.2.4.2  rmind #include <acnamesp.h>
     52  1.1.1.2.4.2  rmind #endif
     53  1.1.1.2.4.2  rmind 
     54  1.1.1.2.4.2  rmind #ifdef ACPI_DISASSEMBLER
     55  1.1.1.2.4.2  rmind 
     56  1.1.1.2.4.2  rmind #define _COMPONENT          ACPI_CA_DEBUGGER
     57  1.1.1.2.4.2  rmind         ACPI_MODULE_NAME    ("dmutils")
     58  1.1.1.2.4.2  rmind 
     59  1.1.1.2.4.2  rmind 
     60  1.1.1.2.4.2  rmind /* Data used in keeping track of fields */
     61  1.1.1.2.4.2  rmind #if 0
     62  1.1.1.2.4.2  rmind const char                      *AcpiGbl_FENames[] =
     63  1.1.1.2.4.2  rmind {
     64  1.1.1.2.4.2  rmind     "skip",
     65  1.1.1.2.4.2  rmind     "?access?"
     66  1.1.1.2.4.2  rmind };              /* FE = Field Element */
     67  1.1.1.2.4.2  rmind #endif
     68  1.1.1.2.4.2  rmind 
     69  1.1.1.2.4.2  rmind /* Operators for Match() */
     70  1.1.1.2.4.2  rmind 
     71  1.1.1.2.4.2  rmind const char                      *AcpiGbl_MatchOps[] =
     72  1.1.1.2.4.2  rmind {
     73  1.1.1.2.4.2  rmind     "MTR",
     74  1.1.1.2.4.2  rmind     "MEQ",
     75  1.1.1.2.4.2  rmind     "MLE",
     76  1.1.1.2.4.2  rmind     "MLT",
     77  1.1.1.2.4.2  rmind     "MGE",
     78  1.1.1.2.4.2  rmind     "MGT"
     79  1.1.1.2.4.2  rmind };
     80  1.1.1.2.4.2  rmind 
     81  1.1.1.2.4.2  rmind /* Access type decoding */
     82  1.1.1.2.4.2  rmind 
     83  1.1.1.2.4.2  rmind const char                      *AcpiGbl_AccessTypes[] =
     84  1.1.1.2.4.2  rmind {
     85  1.1.1.2.4.2  rmind     "AnyAcc",
     86  1.1.1.2.4.2  rmind     "ByteAcc",
     87  1.1.1.2.4.2  rmind     "WordAcc",
     88  1.1.1.2.4.2  rmind     "DWordAcc",
     89  1.1.1.2.4.2  rmind     "QWordAcc",
     90  1.1.1.2.4.2  rmind     "BufferAcc",
     91  1.1.1.2.4.2  rmind     "InvalidAccType",
     92  1.1.1.2.4.2  rmind     "InvalidAccType"
     93  1.1.1.2.4.2  rmind };
     94  1.1.1.2.4.2  rmind 
     95  1.1.1.2.4.2  rmind /* Lock rule decoding */
     96  1.1.1.2.4.2  rmind 
     97  1.1.1.2.4.2  rmind const char                      *AcpiGbl_LockRule[] =
     98  1.1.1.2.4.2  rmind {
     99  1.1.1.2.4.2  rmind     "NoLock",
    100  1.1.1.2.4.2  rmind     "Lock"
    101  1.1.1.2.4.2  rmind };
    102  1.1.1.2.4.2  rmind 
    103  1.1.1.2.4.2  rmind /* Update rule decoding */
    104  1.1.1.2.4.2  rmind 
    105  1.1.1.2.4.2  rmind const char                      *AcpiGbl_UpdateRules[] =
    106  1.1.1.2.4.2  rmind {
    107  1.1.1.2.4.2  rmind     "Preserve",
    108  1.1.1.2.4.2  rmind     "WriteAsOnes",
    109  1.1.1.2.4.2  rmind     "WriteAsZeros",
    110  1.1.1.2.4.2  rmind     "InvalidUpdateRule"
    111  1.1.1.2.4.2  rmind };
    112  1.1.1.2.4.2  rmind 
    113  1.1.1.2.4.2  rmind /* Strings used to decode resource descriptors */
    114  1.1.1.2.4.2  rmind 
    115  1.1.1.2.4.2  rmind const char                      *AcpiGbl_WordDecode[] =
    116  1.1.1.2.4.2  rmind {
    117  1.1.1.2.4.2  rmind     "Memory",
    118  1.1.1.2.4.2  rmind     "IO",
    119  1.1.1.2.4.2  rmind     "BusNumber",
    120  1.1.1.2.4.2  rmind     "UnknownResourceType"
    121  1.1.1.2.4.2  rmind };
    122  1.1.1.2.4.2  rmind 
    123  1.1.1.2.4.2  rmind const char                      *AcpiGbl_IrqDecode[] =
    124  1.1.1.2.4.2  rmind {
    125  1.1.1.2.4.2  rmind     "IRQNoFlags",
    126  1.1.1.2.4.2  rmind     "IRQ"
    127  1.1.1.2.4.2  rmind };
    128  1.1.1.2.4.2  rmind 
    129  1.1.1.2.4.2  rmind 
    130  1.1.1.2.4.2  rmind /*******************************************************************************
    131  1.1.1.2.4.2  rmind  *
    132  1.1.1.2.4.2  rmind  * FUNCTION:    AcpiDmDecodeAttribute
    133  1.1.1.2.4.2  rmind  *
    134  1.1.1.2.4.2  rmind  * PARAMETERS:  Attribute       - Attribute field of AccessAs keyword
    135  1.1.1.2.4.2  rmind  *
    136  1.1.1.2.4.2  rmind  * RETURN:      None
    137  1.1.1.2.4.2  rmind  *
    138  1.1.1.2.4.2  rmind  * DESCRIPTION: Decode the AccessAs attribute byte.  (Mostly SMBus stuff)
    139  1.1.1.2.4.2  rmind  *
    140  1.1.1.2.4.2  rmind  ******************************************************************************/
    141  1.1.1.2.4.2  rmind 
    142  1.1.1.2.4.2  rmind void
    143  1.1.1.2.4.2  rmind AcpiDmDecodeAttribute (
    144  1.1.1.2.4.2  rmind     UINT8                   Attribute)
    145  1.1.1.2.4.2  rmind {
    146  1.1.1.2.4.2  rmind 
    147  1.1.1.2.4.2  rmind     switch (Attribute)
    148  1.1.1.2.4.2  rmind     {
    149  1.1.1.2.4.2  rmind     case AML_FIELD_ATTRIB_SMB_QUICK:
    150  1.1.1.2.4.2  rmind 
    151  1.1.1.2.4.2  rmind         AcpiOsPrintf ("SMBQuick");
    152  1.1.1.2.4.2  rmind         break;
    153  1.1.1.2.4.2  rmind 
    154  1.1.1.2.4.2  rmind     case AML_FIELD_ATTRIB_SMB_SEND_RCV:
    155  1.1.1.2.4.2  rmind 
    156  1.1.1.2.4.2  rmind         AcpiOsPrintf ("SMBSendReceive");
    157  1.1.1.2.4.2  rmind         break;
    158  1.1.1.2.4.2  rmind 
    159  1.1.1.2.4.2  rmind     case AML_FIELD_ATTRIB_SMB_BYTE:
    160  1.1.1.2.4.2  rmind 
    161  1.1.1.2.4.2  rmind         AcpiOsPrintf ("SMBByte");
    162  1.1.1.2.4.2  rmind         break;
    163  1.1.1.2.4.2  rmind 
    164  1.1.1.2.4.2  rmind     case AML_FIELD_ATTRIB_SMB_WORD:
    165  1.1.1.2.4.2  rmind 
    166  1.1.1.2.4.2  rmind         AcpiOsPrintf ("SMBWord");
    167  1.1.1.2.4.2  rmind         break;
    168  1.1.1.2.4.2  rmind 
    169  1.1.1.2.4.2  rmind     case AML_FIELD_ATTRIB_SMB_WORD_CALL:
    170  1.1.1.2.4.2  rmind 
    171  1.1.1.2.4.2  rmind         AcpiOsPrintf ("SMBProcessCall");
    172  1.1.1.2.4.2  rmind         break;
    173  1.1.1.2.4.2  rmind 
    174  1.1.1.2.4.2  rmind     case AML_FIELD_ATTRIB_SMB_BLOCK:
    175  1.1.1.2.4.2  rmind 
    176  1.1.1.2.4.2  rmind         AcpiOsPrintf ("SMBBlock");
    177  1.1.1.2.4.2  rmind         break;
    178  1.1.1.2.4.2  rmind 
    179  1.1.1.2.4.2  rmind     case AML_FIELD_ATTRIB_SMB_BLOCK_CALL:
    180  1.1.1.2.4.2  rmind 
    181  1.1.1.2.4.2  rmind         AcpiOsPrintf ("SMBBlockProcessCall");
    182  1.1.1.2.4.2  rmind         break;
    183  1.1.1.2.4.2  rmind 
    184  1.1.1.2.4.2  rmind     default:
    185  1.1.1.2.4.2  rmind 
    186  1.1.1.2.4.2  rmind         AcpiOsPrintf ("0x%.2X", Attribute);
    187  1.1.1.2.4.2  rmind         break;
    188  1.1.1.2.4.2  rmind     }
    189  1.1.1.2.4.2  rmind }
    190  1.1.1.2.4.2  rmind 
    191  1.1.1.2.4.2  rmind 
    192  1.1.1.2.4.2  rmind /*******************************************************************************
    193  1.1.1.2.4.2  rmind  *
    194  1.1.1.2.4.2  rmind  * FUNCTION:    AcpiDmIndent
    195  1.1.1.2.4.2  rmind  *
    196  1.1.1.2.4.2  rmind  * PARAMETERS:  Level               - Current source code indentation level
    197  1.1.1.2.4.2  rmind  *
    198  1.1.1.2.4.2  rmind  * RETURN:      None
    199  1.1.1.2.4.2  rmind  *
    200  1.1.1.2.4.2  rmind  * DESCRIPTION: Indent 4 spaces per indentation level.
    201  1.1.1.2.4.2  rmind  *
    202  1.1.1.2.4.2  rmind  ******************************************************************************/
    203  1.1.1.2.4.2  rmind 
    204  1.1.1.2.4.2  rmind void
    205  1.1.1.2.4.2  rmind AcpiDmIndent (
    206  1.1.1.2.4.2  rmind     UINT32                  Level)
    207  1.1.1.2.4.2  rmind {
    208  1.1.1.2.4.2  rmind 
    209  1.1.1.2.4.2  rmind     if (!Level)
    210  1.1.1.2.4.2  rmind     {
    211  1.1.1.2.4.2  rmind         return;
    212  1.1.1.2.4.2  rmind     }
    213  1.1.1.2.4.2  rmind 
    214  1.1.1.2.4.2  rmind     AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " ");
    215  1.1.1.2.4.2  rmind }
    216  1.1.1.2.4.2  rmind 
    217  1.1.1.2.4.2  rmind 
    218  1.1.1.2.4.2  rmind /*******************************************************************************
    219  1.1.1.2.4.2  rmind  *
    220  1.1.1.2.4.2  rmind  * FUNCTION:    AcpiDmCommaIfListMember
    221  1.1.1.2.4.2  rmind  *
    222  1.1.1.2.4.2  rmind  * PARAMETERS:  Op              - Current operator/operand
    223  1.1.1.2.4.2  rmind  *
    224  1.1.1.2.4.2  rmind  * RETURN:      TRUE if a comma was inserted
    225  1.1.1.2.4.2  rmind  *
    226  1.1.1.2.4.2  rmind  * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
    227  1.1.1.2.4.2  rmind  *
    228  1.1.1.2.4.2  rmind  ******************************************************************************/
    229  1.1.1.2.4.2  rmind 
    230  1.1.1.2.4.2  rmind BOOLEAN
    231  1.1.1.2.4.2  rmind AcpiDmCommaIfListMember (
    232  1.1.1.2.4.2  rmind     ACPI_PARSE_OBJECT       *Op)
    233  1.1.1.2.4.2  rmind {
    234  1.1.1.2.4.2  rmind 
    235  1.1.1.2.4.2  rmind     if (!Op->Common.Next)
    236  1.1.1.2.4.2  rmind     {
    237  1.1.1.2.4.2  rmind         return FALSE;
    238  1.1.1.2.4.2  rmind     }
    239  1.1.1.2.4.2  rmind 
    240  1.1.1.2.4.2  rmind     if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
    241  1.1.1.2.4.2  rmind     {
    242  1.1.1.2.4.2  rmind         /* Check for a NULL target operand */
    243  1.1.1.2.4.2  rmind 
    244  1.1.1.2.4.2  rmind         if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
    245  1.1.1.2.4.2  rmind             (!Op->Common.Next->Common.Value.String))
    246  1.1.1.2.4.2  rmind         {
    247  1.1.1.2.4.2  rmind             /*
    248  1.1.1.2.4.2  rmind              * To handle the Divide() case where there are two optional
    249  1.1.1.2.4.2  rmind              * targets, look ahead one more op.  If null, this null target
    250  1.1.1.2.4.2  rmind              * is the one and only target -- no comma needed.  Otherwise,
    251  1.1.1.2.4.2  rmind              * we need a comma to prepare for the next target.
    252  1.1.1.2.4.2  rmind              */
    253  1.1.1.2.4.2  rmind             if (!Op->Common.Next->Common.Next)
    254  1.1.1.2.4.2  rmind             {
    255  1.1.1.2.4.2  rmind                 return FALSE;
    256  1.1.1.2.4.2  rmind             }
    257  1.1.1.2.4.2  rmind         }
    258  1.1.1.2.4.2  rmind 
    259  1.1.1.2.4.2  rmind         if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
    260  1.1.1.2.4.2  rmind             (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)))
    261  1.1.1.2.4.2  rmind         {
    262  1.1.1.2.4.2  rmind             return FALSE;
    263  1.1.1.2.4.2  rmind         }
    264  1.1.1.2.4.2  rmind 
    265  1.1.1.2.4.2  rmind         AcpiOsPrintf (", ");
    266  1.1.1.2.4.2  rmind         return (TRUE);
    267  1.1.1.2.4.2  rmind     }
    268  1.1.1.2.4.2  rmind 
    269  1.1.1.2.4.2  rmind     else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
    270  1.1.1.2.4.2  rmind              (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
    271  1.1.1.2.4.2  rmind     {
    272  1.1.1.2.4.2  rmind         AcpiOsPrintf (", ");
    273  1.1.1.2.4.2  rmind         return (TRUE);
    274  1.1.1.2.4.2  rmind     }
    275  1.1.1.2.4.2  rmind 
    276  1.1.1.2.4.2  rmind     return (FALSE);
    277  1.1.1.2.4.2  rmind }
    278  1.1.1.2.4.2  rmind 
    279  1.1.1.2.4.2  rmind 
    280  1.1.1.2.4.2  rmind /*******************************************************************************
    281  1.1.1.2.4.2  rmind  *
    282  1.1.1.2.4.2  rmind  * FUNCTION:    AcpiDmCommaIfFieldMember
    283  1.1.1.2.4.2  rmind  *
    284  1.1.1.2.4.2  rmind  * PARAMETERS:  Op              - Current operator/operand
    285  1.1.1.2.4.2  rmind  *
    286  1.1.1.2.4.2  rmind  * RETURN:      None
    287  1.1.1.2.4.2  rmind  *
    288  1.1.1.2.4.2  rmind  * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
    289  1.1.1.2.4.2  rmind  *
    290  1.1.1.2.4.2  rmind  ******************************************************************************/
    291  1.1.1.2.4.2  rmind 
    292  1.1.1.2.4.2  rmind void
    293  1.1.1.2.4.2  rmind AcpiDmCommaIfFieldMember (
    294  1.1.1.2.4.2  rmind     ACPI_PARSE_OBJECT       *Op)
    295  1.1.1.2.4.2  rmind {
    296  1.1.1.2.4.2  rmind 
    297  1.1.1.2.4.2  rmind     if (Op->Common.Next)
    298  1.1.1.2.4.2  rmind     {
    299  1.1.1.2.4.2  rmind         AcpiOsPrintf (", ");
    300  1.1.1.2.4.2  rmind     }
    301  1.1.1.2.4.2  rmind }
    302  1.1.1.2.4.2  rmind 
    303  1.1.1.2.4.2  rmind #endif
    304