1ae115bc7Smrj /******************************************************************************* 2ae115bc7Smrj * 3ae115bc7Smrj * Module Name: dmopcode - AML disassembler, specific AML opcodes 4ae115bc7Smrj * 5ae115bc7Smrj ******************************************************************************/ 6ae115bc7Smrj 726f3cdf0SGordon Ross /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9ae115bc7Smrj * All rights reserved. 10ae115bc7Smrj * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 25ae115bc7Smrj * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 29ae115bc7Smrj * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 43ae115bc7Smrj 44ae115bc7Smrj #include "acpi.h" 45aa2aa9a6SDana Myers #include "accommon.h" 46ae115bc7Smrj #include "acparser.h" 47ae115bc7Smrj #include "amlcode.h" 48*385cc6b4SJerry Jelinek #include "acinterp.h" 49*385cc6b4SJerry Jelinek #include "acnamesp.h" 50*385cc6b4SJerry Jelinek #include "acdebug.h" 51ae115bc7Smrj 52ae115bc7Smrj 53ae115bc7Smrj #define _COMPONENT ACPI_CA_DEBUGGER 54ae115bc7Smrj ACPI_MODULE_NAME ("dmopcode") 55ae115bc7Smrj 56*385cc6b4SJerry Jelinek 57ae115bc7Smrj /* Local prototypes */ 58ae115bc7Smrj 59ae115bc7Smrj static void 60ae115bc7Smrj AcpiDmMatchKeyword ( 61ae115bc7Smrj ACPI_PARSE_OBJECT *Op); 62ae115bc7Smrj 63*385cc6b4SJerry Jelinek static void 64*385cc6b4SJerry Jelinek AcpiDmConvertToElseIf ( 65*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op); 66*385cc6b4SJerry Jelinek 67*385cc6b4SJerry Jelinek 68*385cc6b4SJerry Jelinek /******************************************************************************* 69*385cc6b4SJerry Jelinek * 70*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmDisplayTargetPathname 71*385cc6b4SJerry Jelinek * 72*385cc6b4SJerry Jelinek * PARAMETERS: Op - Parse object 73*385cc6b4SJerry Jelinek * 74*385cc6b4SJerry Jelinek * RETURN: None 75*385cc6b4SJerry Jelinek * 76*385cc6b4SJerry Jelinek * DESCRIPTION: For AML opcodes that have a target operand, display the full 77*385cc6b4SJerry Jelinek * pathname for the target, in a comment field. Handles Return() 78*385cc6b4SJerry Jelinek * statements also. 79*385cc6b4SJerry Jelinek * 80*385cc6b4SJerry Jelinek ******************************************************************************/ 81*385cc6b4SJerry Jelinek 82*385cc6b4SJerry Jelinek void 83*385cc6b4SJerry Jelinek AcpiDmDisplayTargetPathname ( 84*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op) 85*385cc6b4SJerry Jelinek { 86*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *NextOp; 87*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *PrevOp = NULL; 88*385cc6b4SJerry Jelinek char *Pathname; 89*385cc6b4SJerry Jelinek const ACPI_OPCODE_INFO *OpInfo; 90*385cc6b4SJerry Jelinek 91*385cc6b4SJerry Jelinek 92*385cc6b4SJerry Jelinek if (Op->Common.AmlOpcode == AML_RETURN_OP) 93*385cc6b4SJerry Jelinek { 94*385cc6b4SJerry Jelinek PrevOp = Op->Asl.Value.Arg; 95*385cc6b4SJerry Jelinek } 96*385cc6b4SJerry Jelinek else 97*385cc6b4SJerry Jelinek { 98*385cc6b4SJerry Jelinek OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 99*385cc6b4SJerry Jelinek if (!(OpInfo->Flags & AML_HAS_TARGET)) 100*385cc6b4SJerry Jelinek { 101*385cc6b4SJerry Jelinek return; 102*385cc6b4SJerry Jelinek } 103*385cc6b4SJerry Jelinek 104*385cc6b4SJerry Jelinek /* Target is the last Op in the arg list */ 105*385cc6b4SJerry Jelinek 106*385cc6b4SJerry Jelinek NextOp = Op->Asl.Value.Arg; 107*385cc6b4SJerry Jelinek while (NextOp) 108*385cc6b4SJerry Jelinek { 109*385cc6b4SJerry Jelinek PrevOp = NextOp; 110*385cc6b4SJerry Jelinek NextOp = PrevOp->Asl.Next; 111*385cc6b4SJerry Jelinek } 112*385cc6b4SJerry Jelinek } 113*385cc6b4SJerry Jelinek 114*385cc6b4SJerry Jelinek if (!PrevOp) 115*385cc6b4SJerry Jelinek { 116*385cc6b4SJerry Jelinek return; 117*385cc6b4SJerry Jelinek } 118*385cc6b4SJerry Jelinek 119*385cc6b4SJerry Jelinek /* We must have a namepath AML opcode */ 120*385cc6b4SJerry Jelinek 121*385cc6b4SJerry Jelinek if (PrevOp->Asl.AmlOpcode != AML_INT_NAMEPATH_OP) 122*385cc6b4SJerry Jelinek { 123*385cc6b4SJerry Jelinek return; 124*385cc6b4SJerry Jelinek } 125*385cc6b4SJerry Jelinek 126*385cc6b4SJerry Jelinek /* A null string is the "no target specified" case */ 127*385cc6b4SJerry Jelinek 128*385cc6b4SJerry Jelinek if (!PrevOp->Asl.Value.String) 129*385cc6b4SJerry Jelinek { 130*385cc6b4SJerry Jelinek return; 131*385cc6b4SJerry Jelinek } 132*385cc6b4SJerry Jelinek 133*385cc6b4SJerry Jelinek /* No node means "unresolved external reference" */ 134*385cc6b4SJerry Jelinek 135*385cc6b4SJerry Jelinek if (!PrevOp->Asl.Node) 136*385cc6b4SJerry Jelinek { 137*385cc6b4SJerry Jelinek AcpiOsPrintf (" /* External reference */"); 138*385cc6b4SJerry Jelinek return; 139*385cc6b4SJerry Jelinek } 140*385cc6b4SJerry Jelinek 141*385cc6b4SJerry Jelinek /* Ignore if path is already from the root */ 142*385cc6b4SJerry Jelinek 143*385cc6b4SJerry Jelinek if (*PrevOp->Asl.Value.String == '\\') 144*385cc6b4SJerry Jelinek { 145*385cc6b4SJerry Jelinek return; 146*385cc6b4SJerry Jelinek } 147*385cc6b4SJerry Jelinek 148*385cc6b4SJerry Jelinek /* Now: we can get the full pathname */ 149*385cc6b4SJerry Jelinek 150*385cc6b4SJerry Jelinek Pathname = AcpiNsGetExternalPathname (PrevOp->Asl.Node); 151*385cc6b4SJerry Jelinek if (!Pathname) 152*385cc6b4SJerry Jelinek { 153*385cc6b4SJerry Jelinek return; 154*385cc6b4SJerry Jelinek } 155*385cc6b4SJerry Jelinek 156*385cc6b4SJerry Jelinek AcpiOsPrintf (" /* %s */", Pathname); 157*385cc6b4SJerry Jelinek ACPI_FREE (Pathname); 158*385cc6b4SJerry Jelinek } 159*385cc6b4SJerry Jelinek 160*385cc6b4SJerry Jelinek 161*385cc6b4SJerry Jelinek /******************************************************************************* 162*385cc6b4SJerry Jelinek * 163*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmNotifyDescription 164*385cc6b4SJerry Jelinek * 165*385cc6b4SJerry Jelinek * PARAMETERS: Op - Name() parse object 166*385cc6b4SJerry Jelinek * 167*385cc6b4SJerry Jelinek * RETURN: None 168*385cc6b4SJerry Jelinek * 169*385cc6b4SJerry Jelinek * DESCRIPTION: Emit a description comment for the value associated with a 170*385cc6b4SJerry Jelinek * Notify() operator. 171*385cc6b4SJerry Jelinek * 172*385cc6b4SJerry Jelinek ******************************************************************************/ 173*385cc6b4SJerry Jelinek 174*385cc6b4SJerry Jelinek void 175*385cc6b4SJerry Jelinek AcpiDmNotifyDescription ( 176*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op) 177*385cc6b4SJerry Jelinek { 178*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *NextOp; 179*385cc6b4SJerry Jelinek ACPI_NAMESPACE_NODE *Node; 180*385cc6b4SJerry Jelinek UINT8 NotifyValue; 181*385cc6b4SJerry Jelinek UINT8 Type = ACPI_TYPE_ANY; 182*385cc6b4SJerry Jelinek 183*385cc6b4SJerry Jelinek 184*385cc6b4SJerry Jelinek /* The notify value is the second argument */ 185*385cc6b4SJerry Jelinek 186*385cc6b4SJerry Jelinek NextOp = Op->Asl.Value.Arg; 187*385cc6b4SJerry Jelinek NextOp = NextOp->Asl.Next; 188*385cc6b4SJerry Jelinek 189*385cc6b4SJerry Jelinek switch (NextOp->Common.AmlOpcode) 190*385cc6b4SJerry Jelinek { 191*385cc6b4SJerry Jelinek case AML_ZERO_OP: 192*385cc6b4SJerry Jelinek case AML_ONE_OP: 193*385cc6b4SJerry Jelinek 194*385cc6b4SJerry Jelinek NotifyValue = (UINT8) NextOp->Common.AmlOpcode; 195*385cc6b4SJerry Jelinek break; 196*385cc6b4SJerry Jelinek 197*385cc6b4SJerry Jelinek case AML_BYTE_OP: 198*385cc6b4SJerry Jelinek 199*385cc6b4SJerry Jelinek NotifyValue = (UINT8) NextOp->Asl.Value.Integer; 200*385cc6b4SJerry Jelinek break; 201*385cc6b4SJerry Jelinek 202*385cc6b4SJerry Jelinek default: 203*385cc6b4SJerry Jelinek return; 204*385cc6b4SJerry Jelinek } 205*385cc6b4SJerry Jelinek 206*385cc6b4SJerry Jelinek /* 207*385cc6b4SJerry Jelinek * Attempt to get the namespace node so we can determine the object type. 208*385cc6b4SJerry Jelinek * Some notify values are dependent on the object type (Device, Thermal, 209*385cc6b4SJerry Jelinek * or Processor). 210*385cc6b4SJerry Jelinek */ 211*385cc6b4SJerry Jelinek Node = Op->Asl.Node; 212*385cc6b4SJerry Jelinek if (Node) 213*385cc6b4SJerry Jelinek { 214*385cc6b4SJerry Jelinek Type = Node->Type; 215*385cc6b4SJerry Jelinek } 216*385cc6b4SJerry Jelinek 217*385cc6b4SJerry Jelinek AcpiOsPrintf (" // %s", AcpiUtGetNotifyName (NotifyValue, Type)); 218*385cc6b4SJerry Jelinek } 219*385cc6b4SJerry Jelinek 220*385cc6b4SJerry Jelinek 221*385cc6b4SJerry Jelinek /******************************************************************************* 222*385cc6b4SJerry Jelinek * 223*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmPredefinedDescription 224*385cc6b4SJerry Jelinek * 225*385cc6b4SJerry Jelinek * PARAMETERS: Op - Name() parse object 226*385cc6b4SJerry Jelinek * 227*385cc6b4SJerry Jelinek * RETURN: None 228*385cc6b4SJerry Jelinek * 229*385cc6b4SJerry Jelinek * DESCRIPTION: Emit a description comment for a predefined ACPI name. 230*385cc6b4SJerry Jelinek * Used for iASL compiler only. 231*385cc6b4SJerry Jelinek * 232*385cc6b4SJerry Jelinek ******************************************************************************/ 233*385cc6b4SJerry Jelinek 234*385cc6b4SJerry Jelinek void 235*385cc6b4SJerry Jelinek AcpiDmPredefinedDescription ( 236*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op) 237*385cc6b4SJerry Jelinek { 238*385cc6b4SJerry Jelinek #ifdef ACPI_ASL_COMPILER 239*385cc6b4SJerry Jelinek const AH_PREDEFINED_NAME *Info; 240*385cc6b4SJerry Jelinek char *NameString; 241*385cc6b4SJerry Jelinek int LastCharIsDigit; 242*385cc6b4SJerry Jelinek int LastCharsAreHex; 243*385cc6b4SJerry Jelinek 244*385cc6b4SJerry Jelinek 245*385cc6b4SJerry Jelinek if (!Op) 246*385cc6b4SJerry Jelinek { 247*385cc6b4SJerry Jelinek return; 248*385cc6b4SJerry Jelinek } 249*385cc6b4SJerry Jelinek 250*385cc6b4SJerry Jelinek /* Ensure that the comment field is emitted only once */ 251*385cc6b4SJerry Jelinek 252*385cc6b4SJerry Jelinek if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED) 253*385cc6b4SJerry Jelinek { 254*385cc6b4SJerry Jelinek return; 255*385cc6b4SJerry Jelinek } 256*385cc6b4SJerry Jelinek Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED; 257*385cc6b4SJerry Jelinek 258*385cc6b4SJerry Jelinek /* Predefined name must start with an underscore */ 259*385cc6b4SJerry Jelinek 260*385cc6b4SJerry Jelinek NameString = ACPI_CAST_PTR (char, &Op->Named.Name); 261*385cc6b4SJerry Jelinek if (NameString[0] != '_') 262*385cc6b4SJerry Jelinek { 263*385cc6b4SJerry Jelinek return; 264*385cc6b4SJerry Jelinek } 265*385cc6b4SJerry Jelinek 266*385cc6b4SJerry Jelinek /* 267*385cc6b4SJerry Jelinek * Check for the special ACPI names: 268*385cc6b4SJerry Jelinek * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a 269*385cc6b4SJerry Jelinek * (where d=decimal_digit, x=hex_digit, a=anything) 270*385cc6b4SJerry Jelinek * 271*385cc6b4SJerry Jelinek * Convert these to the generic name for table lookup. 272*385cc6b4SJerry Jelinek * Note: NameString is guaranteed to be upper case here. 273*385cc6b4SJerry Jelinek */ 274*385cc6b4SJerry Jelinek LastCharIsDigit = 275*385cc6b4SJerry Jelinek (isdigit ((int) NameString[3])); /* d */ 276*385cc6b4SJerry Jelinek LastCharsAreHex = 277*385cc6b4SJerry Jelinek (isxdigit ((int) NameString[2]) && /* xx */ 278*385cc6b4SJerry Jelinek isxdigit ((int) NameString[3])); 279*385cc6b4SJerry Jelinek 280*385cc6b4SJerry Jelinek switch (NameString[1]) 281*385cc6b4SJerry Jelinek { 282*385cc6b4SJerry Jelinek case 'A': 283*385cc6b4SJerry Jelinek 284*385cc6b4SJerry Jelinek if ((NameString[2] == 'C') && (LastCharIsDigit)) 285*385cc6b4SJerry Jelinek { 286*385cc6b4SJerry Jelinek NameString = "_ACx"; 287*385cc6b4SJerry Jelinek } 288*385cc6b4SJerry Jelinek else if ((NameString[2] == 'L') && (LastCharIsDigit)) 289*385cc6b4SJerry Jelinek { 290*385cc6b4SJerry Jelinek NameString = "_ALx"; 291*385cc6b4SJerry Jelinek } 292*385cc6b4SJerry Jelinek break; 293*385cc6b4SJerry Jelinek 294*385cc6b4SJerry Jelinek case 'E': 295*385cc6b4SJerry Jelinek 296*385cc6b4SJerry Jelinek if ((NameString[2] == 'J') && (LastCharIsDigit)) 297*385cc6b4SJerry Jelinek { 298*385cc6b4SJerry Jelinek NameString = "_EJx"; 299*385cc6b4SJerry Jelinek } 300*385cc6b4SJerry Jelinek else if (LastCharsAreHex) 301*385cc6b4SJerry Jelinek { 302*385cc6b4SJerry Jelinek NameString = "_Exx"; 303*385cc6b4SJerry Jelinek } 304*385cc6b4SJerry Jelinek break; 305*385cc6b4SJerry Jelinek 306*385cc6b4SJerry Jelinek case 'L': 307*385cc6b4SJerry Jelinek 308*385cc6b4SJerry Jelinek if (LastCharsAreHex) 309*385cc6b4SJerry Jelinek { 310*385cc6b4SJerry Jelinek NameString = "_Lxx"; 311*385cc6b4SJerry Jelinek } 312*385cc6b4SJerry Jelinek break; 313*385cc6b4SJerry Jelinek 314*385cc6b4SJerry Jelinek case 'Q': 315*385cc6b4SJerry Jelinek 316*385cc6b4SJerry Jelinek if (LastCharsAreHex) 317*385cc6b4SJerry Jelinek { 318*385cc6b4SJerry Jelinek NameString = "_Qxx"; 319*385cc6b4SJerry Jelinek } 320*385cc6b4SJerry Jelinek break; 321*385cc6b4SJerry Jelinek 322*385cc6b4SJerry Jelinek case 'T': 323*385cc6b4SJerry Jelinek 324*385cc6b4SJerry Jelinek if (NameString[2] == '_') 325*385cc6b4SJerry Jelinek { 326*385cc6b4SJerry Jelinek NameString = "_T_x"; 327*385cc6b4SJerry Jelinek } 328*385cc6b4SJerry Jelinek break; 329*385cc6b4SJerry Jelinek 330*385cc6b4SJerry Jelinek case 'W': 331*385cc6b4SJerry Jelinek 332*385cc6b4SJerry Jelinek if (LastCharsAreHex) 333*385cc6b4SJerry Jelinek { 334*385cc6b4SJerry Jelinek NameString = "_Wxx"; 335*385cc6b4SJerry Jelinek } 336*385cc6b4SJerry Jelinek break; 337*385cc6b4SJerry Jelinek 338*385cc6b4SJerry Jelinek default: 339*385cc6b4SJerry Jelinek 340*385cc6b4SJerry Jelinek break; 341*385cc6b4SJerry Jelinek } 342*385cc6b4SJerry Jelinek 343*385cc6b4SJerry Jelinek /* Match the name in the info table */ 344*385cc6b4SJerry Jelinek 345*385cc6b4SJerry Jelinek Info = AcpiAhMatchPredefinedName (NameString); 346*385cc6b4SJerry Jelinek if (Info) 347*385cc6b4SJerry Jelinek { 348*385cc6b4SJerry Jelinek AcpiOsPrintf (" // %4.4s: %s", 349*385cc6b4SJerry Jelinek NameString, ACPI_CAST_PTR (char, Info->Description)); 350*385cc6b4SJerry Jelinek } 351*385cc6b4SJerry Jelinek 352*385cc6b4SJerry Jelinek #endif 353*385cc6b4SJerry Jelinek return; 354*385cc6b4SJerry Jelinek } 355*385cc6b4SJerry Jelinek 356*385cc6b4SJerry Jelinek 357*385cc6b4SJerry Jelinek /******************************************************************************* 358*385cc6b4SJerry Jelinek * 359*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmFieldPredefinedDescription 360*385cc6b4SJerry Jelinek * 361*385cc6b4SJerry Jelinek * PARAMETERS: Op - Parse object 362*385cc6b4SJerry Jelinek * 363*385cc6b4SJerry Jelinek * RETURN: None 364*385cc6b4SJerry Jelinek * 365*385cc6b4SJerry Jelinek * DESCRIPTION: Emit a description comment for a resource descriptor tag 366*385cc6b4SJerry Jelinek * (which is a predefined ACPI name.) Used for iASL compiler only. 367*385cc6b4SJerry Jelinek * 368*385cc6b4SJerry Jelinek ******************************************************************************/ 369*385cc6b4SJerry Jelinek 370*385cc6b4SJerry Jelinek void 371*385cc6b4SJerry Jelinek AcpiDmFieldPredefinedDescription ( 372*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op) 373*385cc6b4SJerry Jelinek { 374*385cc6b4SJerry Jelinek #ifdef ACPI_ASL_COMPILER 375*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *IndexOp; 376*385cc6b4SJerry Jelinek char *Tag; 377*385cc6b4SJerry Jelinek const ACPI_OPCODE_INFO *OpInfo; 378*385cc6b4SJerry Jelinek const AH_PREDEFINED_NAME *Info; 379*385cc6b4SJerry Jelinek 380*385cc6b4SJerry Jelinek 381*385cc6b4SJerry Jelinek if (!Op) 382*385cc6b4SJerry Jelinek { 383*385cc6b4SJerry Jelinek return; 384*385cc6b4SJerry Jelinek } 385*385cc6b4SJerry Jelinek 386*385cc6b4SJerry Jelinek /* Ensure that the comment field is emitted only once */ 387*385cc6b4SJerry Jelinek 388*385cc6b4SJerry Jelinek if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED) 389*385cc6b4SJerry Jelinek { 390*385cc6b4SJerry Jelinek return; 391*385cc6b4SJerry Jelinek } 392*385cc6b4SJerry Jelinek Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED; 393*385cc6b4SJerry Jelinek 394*385cc6b4SJerry Jelinek /* 395*385cc6b4SJerry Jelinek * Op must be one of the Create* operators: CreateField, CreateBitField, 396*385cc6b4SJerry Jelinek * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField 397*385cc6b4SJerry Jelinek */ 398*385cc6b4SJerry Jelinek OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 399*385cc6b4SJerry Jelinek if (!(OpInfo->Flags & AML_CREATE)) 400*385cc6b4SJerry Jelinek { 401*385cc6b4SJerry Jelinek return; 402*385cc6b4SJerry Jelinek } 403*385cc6b4SJerry Jelinek 404*385cc6b4SJerry Jelinek /* Second argument is the Index argument */ 405*385cc6b4SJerry Jelinek 406*385cc6b4SJerry Jelinek IndexOp = Op->Common.Value.Arg; 407*385cc6b4SJerry Jelinek IndexOp = IndexOp->Common.Next; 408*385cc6b4SJerry Jelinek 409*385cc6b4SJerry Jelinek /* Index argument must be a namepath */ 410*385cc6b4SJerry Jelinek 411*385cc6b4SJerry Jelinek if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP) 412*385cc6b4SJerry Jelinek { 413*385cc6b4SJerry Jelinek return; 414*385cc6b4SJerry Jelinek } 415*385cc6b4SJerry Jelinek 416*385cc6b4SJerry Jelinek /* Major cheat: We previously put the Tag ptr in the Node field */ 417*385cc6b4SJerry Jelinek 418*385cc6b4SJerry Jelinek Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node); 419*385cc6b4SJerry Jelinek if (!Tag) 420*385cc6b4SJerry Jelinek { 421*385cc6b4SJerry Jelinek return; 422*385cc6b4SJerry Jelinek } 423*385cc6b4SJerry Jelinek 424*385cc6b4SJerry Jelinek /* Match the name in the info table */ 425*385cc6b4SJerry Jelinek 426*385cc6b4SJerry Jelinek Info = AcpiAhMatchPredefinedName (Tag); 427*385cc6b4SJerry Jelinek if (Info) 428*385cc6b4SJerry Jelinek { 429*385cc6b4SJerry Jelinek AcpiOsPrintf (" // %4.4s: %s", Tag, 430*385cc6b4SJerry Jelinek ACPI_CAST_PTR (char, Info->Description)); 431*385cc6b4SJerry Jelinek } 432*385cc6b4SJerry Jelinek 433*385cc6b4SJerry Jelinek #endif 434*385cc6b4SJerry Jelinek return; 435*385cc6b4SJerry Jelinek } 436*385cc6b4SJerry Jelinek 437ae115bc7Smrj 438ae115bc7Smrj /******************************************************************************* 439ae115bc7Smrj * 440ae115bc7Smrj * FUNCTION: AcpiDmMethodFlags 441ae115bc7Smrj * 442ae115bc7Smrj * PARAMETERS: Op - Method Object to be examined 443ae115bc7Smrj * 444ae115bc7Smrj * RETURN: None 445ae115bc7Smrj * 446ae115bc7Smrj * DESCRIPTION: Decode control method flags 447ae115bc7Smrj * 448ae115bc7Smrj ******************************************************************************/ 449ae115bc7Smrj 450ae115bc7Smrj void 451ae115bc7Smrj AcpiDmMethodFlags ( 452ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 453ae115bc7Smrj { 454ae115bc7Smrj UINT32 Flags; 455ae115bc7Smrj UINT32 Args; 456ae115bc7Smrj 457ae115bc7Smrj 458ae115bc7Smrj /* The next Op contains the flags */ 459ae115bc7Smrj 460ae115bc7Smrj Op = AcpiPsGetDepthNext (NULL, Op); 461ae115bc7Smrj Flags = (UINT8) Op->Common.Value.Integer; 462ae115bc7Smrj Args = Flags & 0x07; 463ae115bc7Smrj 464ae115bc7Smrj /* Mark the Op as completed */ 465ae115bc7Smrj 466ae115bc7Smrj Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 467ae115bc7Smrj 468ae115bc7Smrj /* 1) Method argument count */ 469ae115bc7Smrj 47026f3cdf0SGordon Ross AcpiOsPrintf (", %u, ", Args); 471ae115bc7Smrj 472ae115bc7Smrj /* 2) Serialize rule */ 473ae115bc7Smrj 474ae115bc7Smrj if (!(Flags & 0x08)) 475ae115bc7Smrj { 476ae115bc7Smrj AcpiOsPrintf ("Not"); 477ae115bc7Smrj } 478ae115bc7Smrj 479ae115bc7Smrj AcpiOsPrintf ("Serialized"); 480ae115bc7Smrj 481ae115bc7Smrj /* 3) SyncLevel */ 482ae115bc7Smrj 483ae115bc7Smrj if (Flags & 0xF0) 484ae115bc7Smrj { 48526f3cdf0SGordon Ross AcpiOsPrintf (", %u", Flags >> 4); 486ae115bc7Smrj } 487ae115bc7Smrj } 488ae115bc7Smrj 489ae115bc7Smrj 490ae115bc7Smrj /******************************************************************************* 491ae115bc7Smrj * 492ae115bc7Smrj * FUNCTION: AcpiDmFieldFlags 493ae115bc7Smrj * 494ae115bc7Smrj * PARAMETERS: Op - Field Object to be examined 495ae115bc7Smrj * 496ae115bc7Smrj * RETURN: None 497ae115bc7Smrj * 498ae115bc7Smrj * DESCRIPTION: Decode Field definition flags 499ae115bc7Smrj * 500ae115bc7Smrj ******************************************************************************/ 501ae115bc7Smrj 502ae115bc7Smrj void 503ae115bc7Smrj AcpiDmFieldFlags ( 504ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 505ae115bc7Smrj { 506ae115bc7Smrj UINT32 Flags; 507ae115bc7Smrj 508ae115bc7Smrj 509ae115bc7Smrj Op = Op->Common.Next; 510ae115bc7Smrj Flags = (UINT8) Op->Common.Value.Integer; 511ae115bc7Smrj 512ae115bc7Smrj /* Mark the Op as completed */ 513ae115bc7Smrj 514ae115bc7Smrj Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 515ae115bc7Smrj 516ae115bc7Smrj AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]); 517ae115bc7Smrj AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]); 518ae115bc7Smrj AcpiOsPrintf ("%s)", AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]); 519ae115bc7Smrj } 520ae115bc7Smrj 521ae115bc7Smrj 522ae115bc7Smrj /******************************************************************************* 523ae115bc7Smrj * 524ae115bc7Smrj * FUNCTION: AcpiDmAddressSpace 525ae115bc7Smrj * 526ae115bc7Smrj * PARAMETERS: SpaceId - ID to be translated 527ae115bc7Smrj * 528ae115bc7Smrj * RETURN: None 529ae115bc7Smrj * 530ae115bc7Smrj * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword 531ae115bc7Smrj * 532ae115bc7Smrj ******************************************************************************/ 533ae115bc7Smrj 534ae115bc7Smrj void 535ae115bc7Smrj AcpiDmAddressSpace ( 536ae115bc7Smrj UINT8 SpaceId) 537ae115bc7Smrj { 538ae115bc7Smrj 539ae115bc7Smrj if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) 540ae115bc7Smrj { 541ae115bc7Smrj if (SpaceId == 0x7F) 542ae115bc7Smrj { 543ae115bc7Smrj AcpiOsPrintf ("FFixedHW, "); 544ae115bc7Smrj } 545ae115bc7Smrj else 546ae115bc7Smrj { 547ae115bc7Smrj AcpiOsPrintf ("0x%.2X, ", SpaceId); 548ae115bc7Smrj } 549ae115bc7Smrj } 550ae115bc7Smrj else 551ae115bc7Smrj { 552ae115bc7Smrj AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]); 553ae115bc7Smrj } 554ae115bc7Smrj } 555ae115bc7Smrj 556ae115bc7Smrj 557ae115bc7Smrj /******************************************************************************* 558ae115bc7Smrj * 559ae115bc7Smrj * FUNCTION: AcpiDmRegionFlags 560ae115bc7Smrj * 561ae115bc7Smrj * PARAMETERS: Op - Object to be examined 562ae115bc7Smrj * 563ae115bc7Smrj * RETURN: None 564ae115bc7Smrj * 565ae115bc7Smrj * DESCRIPTION: Decode OperationRegion flags 566ae115bc7Smrj * 567ae115bc7Smrj ******************************************************************************/ 568ae115bc7Smrj 569ae115bc7Smrj void 570ae115bc7Smrj AcpiDmRegionFlags ( 571ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 572ae115bc7Smrj { 573ae115bc7Smrj 574ae115bc7Smrj /* The next Op contains the SpaceId */ 575ae115bc7Smrj 576ae115bc7Smrj Op = AcpiPsGetDepthNext (NULL, Op); 577ae115bc7Smrj 578ae115bc7Smrj /* Mark the Op as completed */ 579ae115bc7Smrj 580ae115bc7Smrj Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 581ae115bc7Smrj 582ae115bc7Smrj AcpiOsPrintf (", "); 583ae115bc7Smrj AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer); 584ae115bc7Smrj } 585ae115bc7Smrj 586ae115bc7Smrj 587ae115bc7Smrj /******************************************************************************* 588ae115bc7Smrj * 589ae115bc7Smrj * FUNCTION: AcpiDmMatchOp 590ae115bc7Smrj * 591ae115bc7Smrj * PARAMETERS: Op - Match Object to be examined 592ae115bc7Smrj * 593ae115bc7Smrj * RETURN: None 594ae115bc7Smrj * 595ae115bc7Smrj * DESCRIPTION: Decode Match opcode operands 596ae115bc7Smrj * 597ae115bc7Smrj ******************************************************************************/ 598ae115bc7Smrj 599ae115bc7Smrj void 600ae115bc7Smrj AcpiDmMatchOp ( 601ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 602ae115bc7Smrj { 603ae115bc7Smrj ACPI_PARSE_OBJECT *NextOp; 604ae115bc7Smrj 605ae115bc7Smrj 606ae115bc7Smrj NextOp = AcpiPsGetDepthNext (NULL, Op); 607ae115bc7Smrj NextOp = NextOp->Common.Next; 608ae115bc7Smrj 609ae115bc7Smrj if (!NextOp) 610ae115bc7Smrj { 611ae115bc7Smrj /* Handle partial tree during single-step */ 612ae115bc7Smrj 613ae115bc7Smrj return; 614ae115bc7Smrj } 615ae115bc7Smrj 616ae115bc7Smrj /* Mark the two nodes that contain the encoding for the match keywords */ 617ae115bc7Smrj 618ae115bc7Smrj NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP; 619ae115bc7Smrj 620ae115bc7Smrj NextOp = NextOp->Common.Next; 621ae115bc7Smrj NextOp = NextOp->Common.Next; 622ae115bc7Smrj NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP; 623ae115bc7Smrj } 624ae115bc7Smrj 625ae115bc7Smrj 626ae115bc7Smrj /******************************************************************************* 627ae115bc7Smrj * 628ae115bc7Smrj * FUNCTION: AcpiDmMatchKeyword 629ae115bc7Smrj * 630ae115bc7Smrj * PARAMETERS: Op - Match Object to be examined 631ae115bc7Smrj * 632ae115bc7Smrj * RETURN: None 633ae115bc7Smrj * 634ae115bc7Smrj * DESCRIPTION: Decode Match opcode operands 635ae115bc7Smrj * 636ae115bc7Smrj ******************************************************************************/ 637ae115bc7Smrj 638ae115bc7Smrj static void 639ae115bc7Smrj AcpiDmMatchKeyword ( 640ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 641ae115bc7Smrj { 642ae115bc7Smrj 643ae115bc7Smrj if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE) 644ae115bc7Smrj { 645ae115bc7Smrj AcpiOsPrintf ("/* Unknown Match Keyword encoding */"); 646ae115bc7Smrj } 647ae115bc7Smrj else 648ae115bc7Smrj { 649*385cc6b4SJerry Jelinek AcpiOsPrintf ("%s", 650*385cc6b4SJerry Jelinek AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]); 651ae115bc7Smrj } 652ae115bc7Smrj } 653ae115bc7Smrj 654ae115bc7Smrj 655ae115bc7Smrj /******************************************************************************* 656ae115bc7Smrj * 657ae115bc7Smrj * FUNCTION: AcpiDmDisassembleOneOp 658ae115bc7Smrj * 659ae115bc7Smrj * PARAMETERS: WalkState - Current walk info 660ae115bc7Smrj * Info - Parse tree walk info 661ae115bc7Smrj * Op - Op that is to be printed 662ae115bc7Smrj * 663ae115bc7Smrj * RETURN: None 664ae115bc7Smrj * 665ae115bc7Smrj * DESCRIPTION: Disassemble a single AML opcode 666ae115bc7Smrj * 667ae115bc7Smrj ******************************************************************************/ 668ae115bc7Smrj 669ae115bc7Smrj void 670ae115bc7Smrj AcpiDmDisassembleOneOp ( 671ae115bc7Smrj ACPI_WALK_STATE *WalkState, 672ae115bc7Smrj ACPI_OP_WALK_INFO *Info, 673ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 674ae115bc7Smrj { 675ae115bc7Smrj const ACPI_OPCODE_INFO *OpInfo = NULL; 676ae115bc7Smrj UINT32 Offset; 677ae115bc7Smrj UINT32 Length; 678ae115bc7Smrj ACPI_PARSE_OBJECT *Child; 679db2bae30SDana Myers ACPI_STATUS Status; 680*385cc6b4SJerry Jelinek UINT8 *Aml; 681*385cc6b4SJerry Jelinek const AH_DEVICE_ID *IdInfo; 682ae115bc7Smrj 683ae115bc7Smrj 684ae115bc7Smrj if (!Op) 685ae115bc7Smrj { 686ae115bc7Smrj AcpiOsPrintf ("<NULL OP PTR>"); 687ae115bc7Smrj return; 688ae115bc7Smrj } 689ae115bc7Smrj 690*385cc6b4SJerry Jelinek if (Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF) 691*385cc6b4SJerry Jelinek { 692*385cc6b4SJerry Jelinek return; /* ElseIf macro was already emitted */ 693*385cc6b4SJerry Jelinek } 694*385cc6b4SJerry Jelinek 695ae115bc7Smrj switch (Op->Common.DisasmOpcode) 696ae115bc7Smrj { 697ae115bc7Smrj case ACPI_DASM_MATCHOP: 698ae115bc7Smrj 699ae115bc7Smrj AcpiDmMatchKeyword (Op); 700ae115bc7Smrj return; 701ae115bc7Smrj 702ae115bc7Smrj case ACPI_DASM_LNOT_SUFFIX: 703*385cc6b4SJerry Jelinek 704*385cc6b4SJerry Jelinek if (!AcpiGbl_CstyleDisassembly) 705*385cc6b4SJerry Jelinek { 706ae115bc7Smrj switch (Op->Common.AmlOpcode) 707ae115bc7Smrj { 708ae115bc7Smrj case AML_LEQUAL_OP: 709ae115bc7Smrj AcpiOsPrintf ("LNotEqual"); 710ae115bc7Smrj break; 711ae115bc7Smrj 712ae115bc7Smrj case AML_LGREATER_OP: 713ae115bc7Smrj AcpiOsPrintf ("LLessEqual"); 714ae115bc7Smrj break; 715ae115bc7Smrj 716ae115bc7Smrj case AML_LLESS_OP: 717ae115bc7Smrj AcpiOsPrintf ("LGreaterEqual"); 718ae115bc7Smrj break; 719db2bae30SDana Myers 720db2bae30SDana Myers default: 721db2bae30SDana Myers break; 722ae115bc7Smrj } 723*385cc6b4SJerry Jelinek } 724*385cc6b4SJerry Jelinek 725ae115bc7Smrj Op->Common.DisasmOpcode = 0; 726ae115bc7Smrj Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 727ae115bc7Smrj return; 728ae115bc7Smrj 729ae115bc7Smrj default: 730ae115bc7Smrj break; 731ae115bc7Smrj } 732ae115bc7Smrj 733ae115bc7Smrj OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 734ae115bc7Smrj 735ae115bc7Smrj /* The op and arguments */ 736ae115bc7Smrj 737ae115bc7Smrj switch (Op->Common.AmlOpcode) 738ae115bc7Smrj { 739ae115bc7Smrj case AML_LNOT_OP: 740ae115bc7Smrj 741ae115bc7Smrj Child = Op->Common.Value.Arg; 742ae115bc7Smrj if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) || 743ae115bc7Smrj (Child->Common.AmlOpcode == AML_LGREATER_OP) || 744ae115bc7Smrj (Child->Common.AmlOpcode == AML_LLESS_OP)) 745ae115bc7Smrj { 746ae115bc7Smrj Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX; 747ae115bc7Smrj Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX; 748ae115bc7Smrj } 749ae115bc7Smrj else 750ae115bc7Smrj { 751ae115bc7Smrj AcpiOsPrintf ("%s", OpInfo->Name); 752ae115bc7Smrj } 753ae115bc7Smrj break; 754ae115bc7Smrj 755ae115bc7Smrj case AML_BYTE_OP: 756ae115bc7Smrj 757ae115bc7Smrj AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer); 758ae115bc7Smrj break; 759ae115bc7Smrj 760ae115bc7Smrj case AML_WORD_OP: 761ae115bc7Smrj 762ae115bc7Smrj if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) 763ae115bc7Smrj { 764*385cc6b4SJerry Jelinek AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer); 765ae115bc7Smrj } 766ae115bc7Smrj else 767ae115bc7Smrj { 768ae115bc7Smrj AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer); 769ae115bc7Smrj } 770ae115bc7Smrj break; 771ae115bc7Smrj 772ae115bc7Smrj case AML_DWORD_OP: 773ae115bc7Smrj 774ae115bc7Smrj if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) 775ae115bc7Smrj { 776*385cc6b4SJerry Jelinek AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer); 777ae115bc7Smrj } 778ae115bc7Smrj else 779ae115bc7Smrj { 780ae115bc7Smrj AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer); 781ae115bc7Smrj } 782ae115bc7Smrj break; 783ae115bc7Smrj 784ae115bc7Smrj case AML_QWORD_OP: 785ae115bc7Smrj 78626f3cdf0SGordon Ross AcpiOsPrintf ("0x%8.8X%8.8X", 78726f3cdf0SGordon Ross ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); 788ae115bc7Smrj break; 789ae115bc7Smrj 790ae115bc7Smrj case AML_STRING_OP: 791ae115bc7Smrj 792*385cc6b4SJerry Jelinek AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX); 793*385cc6b4SJerry Jelinek 794*385cc6b4SJerry Jelinek /* For _HID/_CID strings, attempt to output a descriptive comment */ 795*385cc6b4SJerry Jelinek 796*385cc6b4SJerry Jelinek if (Op->Common.DisasmOpcode == ACPI_DASM_HID_STRING) 797*385cc6b4SJerry Jelinek { 798*385cc6b4SJerry Jelinek /* If we know about the ID, emit the description */ 799*385cc6b4SJerry Jelinek 800*385cc6b4SJerry Jelinek IdInfo = AcpiAhMatchHardwareId (Op->Common.Value.String); 801*385cc6b4SJerry Jelinek if (IdInfo) 802*385cc6b4SJerry Jelinek { 803*385cc6b4SJerry Jelinek AcpiOsPrintf (" /* %s */", IdInfo->Description); 804*385cc6b4SJerry Jelinek } 805*385cc6b4SJerry Jelinek } 806ae115bc7Smrj break; 807ae115bc7Smrj 808ae115bc7Smrj case AML_BUFFER_OP: 809ae115bc7Smrj /* 810ae115bc7Smrj * Determine the type of buffer. We can have one of the following: 811ae115bc7Smrj * 812ae115bc7Smrj * 1) ResourceTemplate containing Resource Descriptors. 813ae115bc7Smrj * 2) Unicode String buffer 814ae115bc7Smrj * 3) ASCII String buffer 815ae115bc7Smrj * 4) Raw data buffer (if none of the above) 816ae115bc7Smrj * 817ae115bc7Smrj * Since there are no special AML opcodes to differentiate these 818ae115bc7Smrj * types of buffers, we have to closely look at the data in the 819ae115bc7Smrj * buffer to determine the type. 820ae115bc7Smrj */ 821*385cc6b4SJerry Jelinek if (!AcpiGbl_NoResourceDisassembly) 822*385cc6b4SJerry Jelinek { 823*385cc6b4SJerry Jelinek Status = AcpiDmIsResourceTemplate (WalkState, Op); 824db2bae30SDana Myers if (ACPI_SUCCESS (Status)) 825ae115bc7Smrj { 826ae115bc7Smrj Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; 827ae115bc7Smrj AcpiOsPrintf ("ResourceTemplate"); 828db2bae30SDana Myers break; 829ae115bc7Smrj } 830db2bae30SDana Myers else if (Status == AE_AML_NO_RESOURCE_END_TAG) 831db2bae30SDana Myers { 832*385cc6b4SJerry Jelinek AcpiOsPrintf ( 833*385cc6b4SJerry Jelinek "/**** Is ResourceTemplate, " 834*385cc6b4SJerry Jelinek "but EndTag not at buffer end ****/ "); 835*385cc6b4SJerry Jelinek } 836db2bae30SDana Myers } 837db2bae30SDana Myers 838*385cc6b4SJerry Jelinek if (AcpiDmIsUuidBuffer (Op)) 839*385cc6b4SJerry Jelinek { 840*385cc6b4SJerry Jelinek Op->Common.DisasmOpcode = ACPI_DASM_UUID; 841*385cc6b4SJerry Jelinek AcpiOsPrintf ("ToUUID ("); 842*385cc6b4SJerry Jelinek } 843*385cc6b4SJerry Jelinek else if (AcpiDmIsUnicodeBuffer (Op)) 844ae115bc7Smrj { 845ae115bc7Smrj Op->Common.DisasmOpcode = ACPI_DASM_UNICODE; 846ae115bc7Smrj AcpiOsPrintf ("Unicode ("); 847ae115bc7Smrj } 848ae115bc7Smrj else if (AcpiDmIsStringBuffer (Op)) 849ae115bc7Smrj { 850ae115bc7Smrj Op->Common.DisasmOpcode = ACPI_DASM_STRING; 851ae115bc7Smrj AcpiOsPrintf ("Buffer"); 852ae115bc7Smrj } 853*385cc6b4SJerry Jelinek else if (AcpiDmIsPldBuffer (Op)) 854*385cc6b4SJerry Jelinek { 855*385cc6b4SJerry Jelinek Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD; 856*385cc6b4SJerry Jelinek AcpiOsPrintf ("ToPLD ("); 857*385cc6b4SJerry Jelinek } 858ae115bc7Smrj else 859ae115bc7Smrj { 860ae115bc7Smrj Op->Common.DisasmOpcode = ACPI_DASM_BUFFER; 861ae115bc7Smrj AcpiOsPrintf ("Buffer"); 862ae115bc7Smrj } 863ae115bc7Smrj break; 864ae115bc7Smrj 865ae115bc7Smrj case AML_INT_NAMEPATH_OP: 866ae115bc7Smrj 867ae115bc7Smrj AcpiDmNamestring (Op->Common.Value.Name); 868ae115bc7Smrj break; 869ae115bc7Smrj 870ae115bc7Smrj case AML_INT_NAMEDFIELD_OP: 871ae115bc7Smrj 872db2bae30SDana Myers Length = AcpiDmDumpName (Op->Named.Name); 87326f3cdf0SGordon Ross AcpiOsPrintf (",%*.s %u", (unsigned) (5 - Length), " ", 874ae115bc7Smrj (UINT32) Op->Common.Value.Integer); 875ae115bc7Smrj AcpiDmCommaIfFieldMember (Op); 876ae115bc7Smrj 877ae115bc7Smrj Info->BitOffset += (UINT32) Op->Common.Value.Integer; 878ae115bc7Smrj break; 879ae115bc7Smrj 880ae115bc7Smrj case AML_INT_RESERVEDFIELD_OP: 881ae115bc7Smrj 882ae115bc7Smrj /* Offset() -- Must account for previous offsets */ 883ae115bc7Smrj 884ae115bc7Smrj Offset = (UINT32) Op->Common.Value.Integer; 885ae115bc7Smrj Info->BitOffset += Offset; 886ae115bc7Smrj 887ae115bc7Smrj if (Info->BitOffset % 8 == 0) 888ae115bc7Smrj { 889ae115bc7Smrj AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset)); 890ae115bc7Smrj } 891ae115bc7Smrj else 892ae115bc7Smrj { 89326f3cdf0SGordon Ross AcpiOsPrintf (" , %u", Offset); 894ae115bc7Smrj } 895ae115bc7Smrj 896ae115bc7Smrj AcpiDmCommaIfFieldMember (Op); 897ae115bc7Smrj break; 898ae115bc7Smrj 899ae115bc7Smrj case AML_INT_ACCESSFIELD_OP: 900*385cc6b4SJerry Jelinek case AML_INT_EXTACCESSFIELD_OP: 901ae115bc7Smrj 902ae115bc7Smrj AcpiOsPrintf ("AccessAs (%s, ", 903*385cc6b4SJerry Jelinek AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]); 904ae115bc7Smrj 905*385cc6b4SJerry Jelinek AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8)); 906*385cc6b4SJerry Jelinek 907*385cc6b4SJerry Jelinek if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP) 908*385cc6b4SJerry Jelinek { 909*385cc6b4SJerry Jelinek AcpiOsPrintf (" (0x%2.2X)", (unsigned) 910*385cc6b4SJerry Jelinek ((Op->Common.Value.Integer >> 16) & 0xFF)); 911*385cc6b4SJerry Jelinek } 912*385cc6b4SJerry Jelinek 913ae115bc7Smrj AcpiOsPrintf (")"); 914ae115bc7Smrj AcpiDmCommaIfFieldMember (Op); 915ae115bc7Smrj break; 916ae115bc7Smrj 917*385cc6b4SJerry Jelinek case AML_INT_CONNECTION_OP: 918*385cc6b4SJerry Jelinek /* 919*385cc6b4SJerry Jelinek * Two types of Connection() - one with a buffer object, the 920*385cc6b4SJerry Jelinek * other with a namestring that points to a buffer object. 921*385cc6b4SJerry Jelinek */ 922*385cc6b4SJerry Jelinek AcpiOsPrintf ("Connection ("); 923*385cc6b4SJerry Jelinek Child = Op->Common.Value.Arg; 924*385cc6b4SJerry Jelinek 925*385cc6b4SJerry Jelinek if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP) 926*385cc6b4SJerry Jelinek { 927*385cc6b4SJerry Jelinek AcpiOsPrintf ("\n"); 928*385cc6b4SJerry Jelinek 929*385cc6b4SJerry Jelinek Aml = Child->Named.Data; 930*385cc6b4SJerry Jelinek Length = (UINT32) Child->Common.Value.Integer; 931*385cc6b4SJerry Jelinek 932*385cc6b4SJerry Jelinek Info->Level += 1; 933*385cc6b4SJerry Jelinek Info->MappingOp = Op; 934*385cc6b4SJerry Jelinek Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; 935*385cc6b4SJerry Jelinek 936*385cc6b4SJerry Jelinek AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length); 937*385cc6b4SJerry Jelinek 938*385cc6b4SJerry Jelinek Info->Level -= 1; 939*385cc6b4SJerry Jelinek AcpiDmIndent (Info->Level); 940*385cc6b4SJerry Jelinek } 941*385cc6b4SJerry Jelinek else 942*385cc6b4SJerry Jelinek { 943*385cc6b4SJerry Jelinek AcpiDmNamestring (Child->Common.Value.Name); 944*385cc6b4SJerry Jelinek } 945*385cc6b4SJerry Jelinek 946*385cc6b4SJerry Jelinek AcpiOsPrintf (")"); 947*385cc6b4SJerry Jelinek AcpiDmCommaIfFieldMember (Op); 948*385cc6b4SJerry Jelinek AcpiOsPrintf ("\n"); 949*385cc6b4SJerry Jelinek 950*385cc6b4SJerry Jelinek Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */ 951*385cc6b4SJerry Jelinek Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 952*385cc6b4SJerry Jelinek break; 953ae115bc7Smrj 954ae115bc7Smrj case AML_INT_BYTELIST_OP: 955ae115bc7Smrj 956ae115bc7Smrj AcpiDmByteList (Info, Op); 957ae115bc7Smrj break; 958ae115bc7Smrj 959ae115bc7Smrj case AML_INT_METHODCALL_OP: 960ae115bc7Smrj 961ae115bc7Smrj Op = AcpiPsGetDepthNext (NULL, Op); 962ae115bc7Smrj Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 963ae115bc7Smrj 964ae115bc7Smrj AcpiDmNamestring (Op->Common.Value.Name); 965ae115bc7Smrj break; 966ae115bc7Smrj 967*385cc6b4SJerry Jelinek case AML_ELSE_OP: 968*385cc6b4SJerry Jelinek 969*385cc6b4SJerry Jelinek AcpiDmConvertToElseIf (Op); 970*385cc6b4SJerry Jelinek break; 971*385cc6b4SJerry Jelinek 972*385cc6b4SJerry Jelinek case AML_EXTERNAL_OP: 973*385cc6b4SJerry Jelinek 974*385cc6b4SJerry Jelinek if (AcpiGbl_DmEmitExternalOpcodes) 975*385cc6b4SJerry Jelinek { 976*385cc6b4SJerry Jelinek AcpiOsPrintf ("/* Opcode 0x15 */ "); 977*385cc6b4SJerry Jelinek 978*385cc6b4SJerry Jelinek /* Fallthrough */ 979*385cc6b4SJerry Jelinek } 980*385cc6b4SJerry Jelinek else 981*385cc6b4SJerry Jelinek { 982*385cc6b4SJerry Jelinek break; 983*385cc6b4SJerry Jelinek } 984ae115bc7Smrj 985ae115bc7Smrj default: 986ae115bc7Smrj 987ae115bc7Smrj /* Just get the opcode name and print it */ 988ae115bc7Smrj 989ae115bc7Smrj AcpiOsPrintf ("%s", OpInfo->Name); 990ae115bc7Smrj 991ae115bc7Smrj 992ae115bc7Smrj #ifdef ACPI_DEBUGGER 993ae115bc7Smrj 994ae115bc7Smrj if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) && 995ae115bc7Smrj (WalkState) && 996ae115bc7Smrj (WalkState->Results) && 997db2bae30SDana Myers (WalkState->ResultCount)) 998ae115bc7Smrj { 999*385cc6b4SJerry Jelinek AcpiDbDecodeInternalObject ( 1000ae115bc7Smrj WalkState->Results->Results.ObjDesc [ 1001db2bae30SDana Myers (WalkState->ResultCount - 1) % 1002db2bae30SDana Myers ACPI_RESULTS_FRAME_OBJ_NUM]); 1003ae115bc7Smrj } 1004ae115bc7Smrj #endif 1005db2bae30SDana Myers 1006ae115bc7Smrj break; 1007ae115bc7Smrj } 1008ae115bc7Smrj } 1009ae115bc7Smrj 1010*385cc6b4SJerry Jelinek 1011*385cc6b4SJerry Jelinek /******************************************************************************* 1012*385cc6b4SJerry Jelinek * 1013*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmConvertToElseIf 1014*385cc6b4SJerry Jelinek * 1015*385cc6b4SJerry Jelinek * PARAMETERS: OriginalElseOp - ELSE Object to be examined 1016*385cc6b4SJerry Jelinek * 1017*385cc6b4SJerry Jelinek * RETURN: None. Emits either an "Else" or an "ElseIf" ASL operator. 1018*385cc6b4SJerry Jelinek * 1019*385cc6b4SJerry Jelinek * DESCRIPTION: Detect and convert an If..Else..If sequence to If..ElseIf 1020*385cc6b4SJerry Jelinek * 1021*385cc6b4SJerry Jelinek * EXAMPLE: 1022*385cc6b4SJerry Jelinek * 1023*385cc6b4SJerry Jelinek * This If..Else..If nested sequence: 1024*385cc6b4SJerry Jelinek * 1025*385cc6b4SJerry Jelinek * If (Arg0 == 1) 1026*385cc6b4SJerry Jelinek * { 1027*385cc6b4SJerry Jelinek * Local0 = 4 1028*385cc6b4SJerry Jelinek * } 1029*385cc6b4SJerry Jelinek * Else 1030*385cc6b4SJerry Jelinek * { 1031*385cc6b4SJerry Jelinek * If (Arg0 == 2) 1032*385cc6b4SJerry Jelinek * { 1033*385cc6b4SJerry Jelinek * Local0 = 5 1034*385cc6b4SJerry Jelinek * } 1035*385cc6b4SJerry Jelinek * } 1036*385cc6b4SJerry Jelinek * 1037*385cc6b4SJerry Jelinek * Is converted to this simpler If..ElseIf sequence: 1038*385cc6b4SJerry Jelinek * 1039*385cc6b4SJerry Jelinek * If (Arg0 == 1) 1040*385cc6b4SJerry Jelinek * { 1041*385cc6b4SJerry Jelinek * Local0 = 4 1042*385cc6b4SJerry Jelinek * } 1043*385cc6b4SJerry Jelinek * ElseIf (Arg0 == 2) 1044*385cc6b4SJerry Jelinek * { 1045*385cc6b4SJerry Jelinek * Local0 = 5 1046*385cc6b4SJerry Jelinek * } 1047*385cc6b4SJerry Jelinek * 1048*385cc6b4SJerry Jelinek * NOTE: There is no actual ElseIf AML opcode. ElseIf is essentially an ASL 1049*385cc6b4SJerry Jelinek * macro that emits an Else opcode followed by an If opcode. This function 1050*385cc6b4SJerry Jelinek * reverses these AML sequences back to an ElseIf macro where possible. This 1051*385cc6b4SJerry Jelinek * can make the disassembled ASL code simpler and more like the original code. 1052*385cc6b4SJerry Jelinek * 1053*385cc6b4SJerry Jelinek ******************************************************************************/ 1054*385cc6b4SJerry Jelinek 1055*385cc6b4SJerry Jelinek static void 1056*385cc6b4SJerry Jelinek AcpiDmConvertToElseIf ( 1057*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *OriginalElseOp) 1058*385cc6b4SJerry Jelinek { 1059*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *IfOp; 1060*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *ElseOp; 1061*385cc6b4SJerry Jelinek 1062*385cc6b4SJerry Jelinek 1063*385cc6b4SJerry Jelinek /* 1064*385cc6b4SJerry Jelinek * To be able to perform the conversion, two conditions must be satisfied: 1065*385cc6b4SJerry Jelinek * 1) The first child of the Else must be an If statement. 1066*385cc6b4SJerry Jelinek * 2) The If block can only be followed by an Else block and these must 1067*385cc6b4SJerry Jelinek * be the only blocks under the original Else. 1068*385cc6b4SJerry Jelinek */ 1069*385cc6b4SJerry Jelinek IfOp = OriginalElseOp->Common.Value.Arg; 1070*385cc6b4SJerry Jelinek if (!IfOp || 1071*385cc6b4SJerry Jelinek (IfOp->Common.AmlOpcode != AML_IF_OP) || 1072*385cc6b4SJerry Jelinek (IfOp->Asl.Next && (IfOp->Asl.Next->Common.AmlOpcode != AML_ELSE_OP))) 1073*385cc6b4SJerry Jelinek { 1074*385cc6b4SJerry Jelinek /* Not an Else..If sequence, cannot convert to ElseIf */ 1075*385cc6b4SJerry Jelinek 1076*385cc6b4SJerry Jelinek AcpiOsPrintf ("%s", "Else"); 1077*385cc6b4SJerry Jelinek return; 1078*385cc6b4SJerry Jelinek } 1079*385cc6b4SJerry Jelinek 1080*385cc6b4SJerry Jelinek /* Emit ElseIf, mark the IF as now an ELSEIF */ 1081*385cc6b4SJerry Jelinek 1082*385cc6b4SJerry Jelinek AcpiOsPrintf ("%s", "ElseIf"); 1083*385cc6b4SJerry Jelinek IfOp->Common.DisasmFlags |= ACPI_PARSEOP_ELSEIF; 1084*385cc6b4SJerry Jelinek 1085*385cc6b4SJerry Jelinek /* The IF parent will now be the same as the original ELSE parent */ 1086*385cc6b4SJerry Jelinek 1087*385cc6b4SJerry Jelinek IfOp->Common.Parent = OriginalElseOp->Common.Parent; 1088*385cc6b4SJerry Jelinek 1089*385cc6b4SJerry Jelinek /* 1090*385cc6b4SJerry Jelinek * Update the NEXT pointers to restructure the parse tree, essentially 1091*385cc6b4SJerry Jelinek * promoting an If..Else block up to the same level as the original 1092*385cc6b4SJerry Jelinek * Else. 1093*385cc6b4SJerry Jelinek * 1094*385cc6b4SJerry Jelinek * Check if the IF has a corresponding ELSE peer 1095*385cc6b4SJerry Jelinek */ 1096*385cc6b4SJerry Jelinek ElseOp = IfOp->Common.Next; 1097*385cc6b4SJerry Jelinek if (ElseOp && 1098*385cc6b4SJerry Jelinek (ElseOp->Common.AmlOpcode == AML_ELSE_OP)) 1099*385cc6b4SJerry Jelinek { 1100*385cc6b4SJerry Jelinek /* If an ELSE matches the IF, promote it also */ 1101*385cc6b4SJerry Jelinek 1102*385cc6b4SJerry Jelinek ElseOp->Common.Parent = OriginalElseOp->Common.Parent; 1103*385cc6b4SJerry Jelinek ElseOp->Common.Next = OriginalElseOp->Common.Next; 1104*385cc6b4SJerry Jelinek } 1105*385cc6b4SJerry Jelinek else 1106*385cc6b4SJerry Jelinek { 1107*385cc6b4SJerry Jelinek /* Otherwise, set the IF NEXT to the original ELSE NEXT */ 1108*385cc6b4SJerry Jelinek 1109*385cc6b4SJerry Jelinek IfOp->Common.Next = OriginalElseOp->Common.Next; 1110*385cc6b4SJerry Jelinek } 1111*385cc6b4SJerry Jelinek 1112*385cc6b4SJerry Jelinek /* Detach the child IF block from the original ELSE */ 1113*385cc6b4SJerry Jelinek 1114*385cc6b4SJerry Jelinek OriginalElseOp->Common.Value.Arg = NULL; 1115*385cc6b4SJerry Jelinek 1116*385cc6b4SJerry Jelinek /* Ignore the original ELSE from now on */ 1117*385cc6b4SJerry Jelinek 1118*385cc6b4SJerry Jelinek OriginalElseOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 1119*385cc6b4SJerry Jelinek OriginalElseOp->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX; 1120*385cc6b4SJerry Jelinek 1121*385cc6b4SJerry Jelinek /* Insert IF (now ELSEIF) as next peer of the original ELSE */ 1122*385cc6b4SJerry Jelinek 1123*385cc6b4SJerry Jelinek OriginalElseOp->Common.Next = IfOp; 1124*385cc6b4SJerry Jelinek } 1125