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