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