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