1a159c266SJung-uk Kim /******************************************************************************* 2a159c266SJung-uk Kim * 3a159c266SJung-uk Kim * Module Name: dmopcode - AML disassembler, specific AML opcodes 4a159c266SJung-uk Kim * 5a159c266SJung-uk Kim ******************************************************************************/ 6a159c266SJung-uk Kim 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 11*804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp. 12a159c266SJung-uk Kim * All rights reserved. 13a159c266SJung-uk Kim * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-uk Kim * 119a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 121a159c266SJung-uk Kim * are met: 122a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124a159c266SJung-uk Kim * without modification. 125a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129a159c266SJung-uk Kim * binary redistribution. 130a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132a159c266SJung-uk Kim * from this software without specific prior written permission. 133a159c266SJung-uk Kim * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148a159c266SJung-uk Kim * Software Foundation. 149a159c266SJung-uk Kim * 1500d84335fSJung-uk Kim *****************************************************************************/ 151a159c266SJung-uk Kim 152a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 153a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 154a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 155a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 156313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h> 157313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 158fe0f0bbbSJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h> 1590d84335fSJung-uk Kim #include <contrib/dev/acpica/include/acconvert.h> 160a159c266SJung-uk Kim 161a159c266SJung-uk Kim 162a159c266SJung-uk Kim #define _COMPONENT ACPI_CA_DEBUGGER 163a159c266SJung-uk Kim ACPI_MODULE_NAME ("dmopcode") 164a159c266SJung-uk Kim 1651c0e1b6dSJung-uk Kim 166a159c266SJung-uk Kim /* Local prototypes */ 167a159c266SJung-uk Kim 168a159c266SJung-uk Kim static void 169a159c266SJung-uk Kim AcpiDmMatchKeyword ( 170a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op); 171a159c266SJung-uk Kim 172f8146b88SJung-uk Kim static void 173f8146b88SJung-uk Kim AcpiDmConvertToElseIf ( 174f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op); 175f8146b88SJung-uk Kim 176493deb39SJung-uk Kim static void 177493deb39SJung-uk Kim AcpiDmPromoteSubtree ( 178493deb39SJung-uk Kim ACPI_PARSE_OBJECT *StartOp); 179493deb39SJung-uk Kim 180a159c266SJung-uk Kim /******************************************************************************* 181a159c266SJung-uk Kim * 182313a0c13SJung-uk Kim * FUNCTION: AcpiDmDisplayTargetPathname 183313a0c13SJung-uk Kim * 184313a0c13SJung-uk Kim * PARAMETERS: Op - Parse object 185313a0c13SJung-uk Kim * 186313a0c13SJung-uk Kim * RETURN: None 187313a0c13SJung-uk Kim * 188313a0c13SJung-uk Kim * DESCRIPTION: For AML opcodes that have a target operand, display the full 189313a0c13SJung-uk Kim * pathname for the target, in a comment field. Handles Return() 190313a0c13SJung-uk Kim * statements also. 191313a0c13SJung-uk Kim * 192313a0c13SJung-uk Kim ******************************************************************************/ 193313a0c13SJung-uk Kim 194313a0c13SJung-uk Kim void 195313a0c13SJung-uk Kim AcpiDmDisplayTargetPathname ( 196313a0c13SJung-uk Kim ACPI_PARSE_OBJECT *Op) 197313a0c13SJung-uk Kim { 198313a0c13SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 199313a0c13SJung-uk Kim ACPI_PARSE_OBJECT *PrevOp = NULL; 200313a0c13SJung-uk Kim char *Pathname; 201313a0c13SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 202313a0c13SJung-uk Kim 203313a0c13SJung-uk Kim 204313a0c13SJung-uk Kim if (Op->Common.AmlOpcode == AML_RETURN_OP) 205313a0c13SJung-uk Kim { 206313a0c13SJung-uk Kim PrevOp = Op->Asl.Value.Arg; 207313a0c13SJung-uk Kim } 208313a0c13SJung-uk Kim else 209313a0c13SJung-uk Kim { 210313a0c13SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 211313a0c13SJung-uk Kim if (!(OpInfo->Flags & AML_HAS_TARGET)) 212313a0c13SJung-uk Kim { 213313a0c13SJung-uk Kim return; 214313a0c13SJung-uk Kim } 215313a0c13SJung-uk Kim 216313a0c13SJung-uk Kim /* Target is the last Op in the arg list */ 217313a0c13SJung-uk Kim 218313a0c13SJung-uk Kim NextOp = Op->Asl.Value.Arg; 219313a0c13SJung-uk Kim while (NextOp) 220313a0c13SJung-uk Kim { 221313a0c13SJung-uk Kim PrevOp = NextOp; 222313a0c13SJung-uk Kim NextOp = PrevOp->Asl.Next; 223313a0c13SJung-uk Kim } 224313a0c13SJung-uk Kim } 225313a0c13SJung-uk Kim 226313a0c13SJung-uk Kim if (!PrevOp) 227313a0c13SJung-uk Kim { 228313a0c13SJung-uk Kim return; 229313a0c13SJung-uk Kim } 230313a0c13SJung-uk Kim 231313a0c13SJung-uk Kim /* We must have a namepath AML opcode */ 232313a0c13SJung-uk Kim 233313a0c13SJung-uk Kim if (PrevOp->Asl.AmlOpcode != AML_INT_NAMEPATH_OP) 234313a0c13SJung-uk Kim { 235313a0c13SJung-uk Kim return; 236313a0c13SJung-uk Kim } 237313a0c13SJung-uk Kim 238313a0c13SJung-uk Kim /* A null string is the "no target specified" case */ 239313a0c13SJung-uk Kim 240313a0c13SJung-uk Kim if (!PrevOp->Asl.Value.String) 241313a0c13SJung-uk Kim { 242313a0c13SJung-uk Kim return; 243313a0c13SJung-uk Kim } 244313a0c13SJung-uk Kim 245313a0c13SJung-uk Kim /* No node means "unresolved external reference" */ 246313a0c13SJung-uk Kim 247313a0c13SJung-uk Kim if (!PrevOp->Asl.Node) 248313a0c13SJung-uk Kim { 249313a0c13SJung-uk Kim AcpiOsPrintf (" /* External reference */"); 250313a0c13SJung-uk Kim return; 251313a0c13SJung-uk Kim } 252313a0c13SJung-uk Kim 253313a0c13SJung-uk Kim /* Ignore if path is already from the root */ 254313a0c13SJung-uk Kim 255313a0c13SJung-uk Kim if (*PrevOp->Asl.Value.String == '\\') 256313a0c13SJung-uk Kim { 257313a0c13SJung-uk Kim return; 258313a0c13SJung-uk Kim } 259313a0c13SJung-uk Kim 260313a0c13SJung-uk Kim /* Now: we can get the full pathname */ 261313a0c13SJung-uk Kim 262313a0c13SJung-uk Kim Pathname = AcpiNsGetExternalPathname (PrevOp->Asl.Node); 263313a0c13SJung-uk Kim if (!Pathname) 264313a0c13SJung-uk Kim { 265313a0c13SJung-uk Kim return; 266313a0c13SJung-uk Kim } 267313a0c13SJung-uk Kim 268313a0c13SJung-uk Kim AcpiOsPrintf (" /* %s */", Pathname); 269313a0c13SJung-uk Kim ACPI_FREE (Pathname); 270313a0c13SJung-uk Kim } 271313a0c13SJung-uk Kim 272313a0c13SJung-uk Kim 273313a0c13SJung-uk Kim /******************************************************************************* 274313a0c13SJung-uk Kim * 275313a0c13SJung-uk Kim * FUNCTION: AcpiDmNotifyDescription 276313a0c13SJung-uk Kim * 277313a0c13SJung-uk Kim * PARAMETERS: Op - Name() parse object 278313a0c13SJung-uk Kim * 279313a0c13SJung-uk Kim * RETURN: None 280313a0c13SJung-uk Kim * 281313a0c13SJung-uk Kim * DESCRIPTION: Emit a description comment for the value associated with a 282313a0c13SJung-uk Kim * Notify() operator. 283313a0c13SJung-uk Kim * 284313a0c13SJung-uk Kim ******************************************************************************/ 285313a0c13SJung-uk Kim 286313a0c13SJung-uk Kim void 287313a0c13SJung-uk Kim AcpiDmNotifyDescription ( 288313a0c13SJung-uk Kim ACPI_PARSE_OBJECT *Op) 289313a0c13SJung-uk Kim { 290313a0c13SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 291313a0c13SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 292313a0c13SJung-uk Kim UINT8 NotifyValue; 293313a0c13SJung-uk Kim UINT8 Type = ACPI_TYPE_ANY; 294313a0c13SJung-uk Kim 295313a0c13SJung-uk Kim 296313a0c13SJung-uk Kim /* The notify value is the second argument */ 297313a0c13SJung-uk Kim 298313a0c13SJung-uk Kim NextOp = Op->Asl.Value.Arg; 299313a0c13SJung-uk Kim NextOp = NextOp->Asl.Next; 300313a0c13SJung-uk Kim 301313a0c13SJung-uk Kim switch (NextOp->Common.AmlOpcode) 302313a0c13SJung-uk Kim { 303313a0c13SJung-uk Kim case AML_ZERO_OP: 304313a0c13SJung-uk Kim case AML_ONE_OP: 305313a0c13SJung-uk Kim 306313a0c13SJung-uk Kim NotifyValue = (UINT8) NextOp->Common.AmlOpcode; 307313a0c13SJung-uk Kim break; 308313a0c13SJung-uk Kim 309313a0c13SJung-uk Kim case AML_BYTE_OP: 310313a0c13SJung-uk Kim 311313a0c13SJung-uk Kim NotifyValue = (UINT8) NextOp->Asl.Value.Integer; 312313a0c13SJung-uk Kim break; 313313a0c13SJung-uk Kim 314313a0c13SJung-uk Kim default: 315313a0c13SJung-uk Kim return; 316313a0c13SJung-uk Kim } 317313a0c13SJung-uk Kim 318313a0c13SJung-uk Kim /* 319313a0c13SJung-uk Kim * Attempt to get the namespace node so we can determine the object type. 320313a0c13SJung-uk Kim * Some notify values are dependent on the object type (Device, Thermal, 321313a0c13SJung-uk Kim * or Processor). 322313a0c13SJung-uk Kim */ 323313a0c13SJung-uk Kim Node = Op->Asl.Node; 324313a0c13SJung-uk Kim if (Node) 325313a0c13SJung-uk Kim { 326313a0c13SJung-uk Kim Type = Node->Type; 327313a0c13SJung-uk Kim } 328313a0c13SJung-uk Kim 329313a0c13SJung-uk Kim AcpiOsPrintf (" // %s", AcpiUtGetNotifyName (NotifyValue, Type)); 330313a0c13SJung-uk Kim } 331313a0c13SJung-uk Kim 332313a0c13SJung-uk Kim 333313a0c13SJung-uk Kim /******************************************************************************* 334313a0c13SJung-uk Kim * 335f38b0f21SJung-uk Kim * FUNCTION: AcpiDmPredefinedDescription 336f38b0f21SJung-uk Kim * 337f38b0f21SJung-uk Kim * PARAMETERS: Op - Name() parse object 338f38b0f21SJung-uk Kim * 339f38b0f21SJung-uk Kim * RETURN: None 340f38b0f21SJung-uk Kim * 341f38b0f21SJung-uk Kim * DESCRIPTION: Emit a description comment for a predefined ACPI name. 342f38b0f21SJung-uk Kim * Used for iASL compiler only. 343f38b0f21SJung-uk Kim * 344f38b0f21SJung-uk Kim ******************************************************************************/ 345f38b0f21SJung-uk Kim 346f38b0f21SJung-uk Kim void 347f38b0f21SJung-uk Kim AcpiDmPredefinedDescription ( 348f38b0f21SJung-uk Kim ACPI_PARSE_OBJECT *Op) 349f38b0f21SJung-uk Kim { 350f38b0f21SJung-uk Kim #ifdef ACPI_ASL_COMPILER 351f38b0f21SJung-uk Kim const AH_PREDEFINED_NAME *Info; 352f38b0f21SJung-uk Kim char *NameString; 353f38b0f21SJung-uk Kim int LastCharIsDigit; 354f38b0f21SJung-uk Kim int LastCharsAreHex; 355f38b0f21SJung-uk Kim 356f38b0f21SJung-uk Kim 357f38b0f21SJung-uk Kim if (!Op) 358f38b0f21SJung-uk Kim { 359f38b0f21SJung-uk Kim return; 360f38b0f21SJung-uk Kim } 361f38b0f21SJung-uk Kim 362f38b0f21SJung-uk Kim /* Ensure that the comment field is emitted only once */ 363f38b0f21SJung-uk Kim 364f8146b88SJung-uk Kim if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED) 365f38b0f21SJung-uk Kim { 366f38b0f21SJung-uk Kim return; 367f38b0f21SJung-uk Kim } 368f8146b88SJung-uk Kim Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED; 369f38b0f21SJung-uk Kim 370f38b0f21SJung-uk Kim /* Predefined name must start with an underscore */ 371f38b0f21SJung-uk Kim 372f38b0f21SJung-uk Kim NameString = ACPI_CAST_PTR (char, &Op->Named.Name); 373f38b0f21SJung-uk Kim if (NameString[0] != '_') 374f38b0f21SJung-uk Kim { 375f38b0f21SJung-uk Kim return; 376f38b0f21SJung-uk Kim } 377f38b0f21SJung-uk Kim 378f38b0f21SJung-uk Kim /* 379f38b0f21SJung-uk Kim * Check for the special ACPI names: 380f38b0f21SJung-uk Kim * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a 381f38b0f21SJung-uk Kim * (where d=decimal_digit, x=hex_digit, a=anything) 382f38b0f21SJung-uk Kim * 383f38b0f21SJung-uk Kim * Convert these to the generic name for table lookup. 384f38b0f21SJung-uk Kim * Note: NameString is guaranteed to be upper case here. 385f38b0f21SJung-uk Kim */ 386f38b0f21SJung-uk Kim LastCharIsDigit = 3875ef50723SJung-uk Kim (isdigit ((int) NameString[3])); /* d */ 388f38b0f21SJung-uk Kim LastCharsAreHex = 3895ef50723SJung-uk Kim (isxdigit ((int) NameString[2]) && /* xx */ 3905ef50723SJung-uk Kim isxdigit ((int) NameString[3])); 391f38b0f21SJung-uk Kim 392f38b0f21SJung-uk Kim switch (NameString[1]) 393f38b0f21SJung-uk Kim { 394f38b0f21SJung-uk Kim case 'A': 395a9d8d09cSJung-uk Kim 396f38b0f21SJung-uk Kim if ((NameString[2] == 'C') && (LastCharIsDigit)) 397f38b0f21SJung-uk Kim { 398f38b0f21SJung-uk Kim NameString = "_ACx"; 399f38b0f21SJung-uk Kim } 400f38b0f21SJung-uk Kim else if ((NameString[2] == 'L') && (LastCharIsDigit)) 401f38b0f21SJung-uk Kim { 402f38b0f21SJung-uk Kim NameString = "_ALx"; 403f38b0f21SJung-uk Kim } 404f38b0f21SJung-uk Kim break; 405f38b0f21SJung-uk Kim 406f38b0f21SJung-uk Kim case 'E': 407a9d8d09cSJung-uk Kim 408f38b0f21SJung-uk Kim if ((NameString[2] == 'J') && (LastCharIsDigit)) 409f38b0f21SJung-uk Kim { 410f38b0f21SJung-uk Kim NameString = "_EJx"; 411f38b0f21SJung-uk Kim } 412f38b0f21SJung-uk Kim else if (LastCharsAreHex) 413f38b0f21SJung-uk Kim { 414f38b0f21SJung-uk Kim NameString = "_Exx"; 415f38b0f21SJung-uk Kim } 416f38b0f21SJung-uk Kim break; 417f38b0f21SJung-uk Kim 418f38b0f21SJung-uk Kim case 'L': 419a9d8d09cSJung-uk Kim 420f38b0f21SJung-uk Kim if (LastCharsAreHex) 421f38b0f21SJung-uk Kim { 422f38b0f21SJung-uk Kim NameString = "_Lxx"; 423f38b0f21SJung-uk Kim } 424f38b0f21SJung-uk Kim break; 425f38b0f21SJung-uk Kim 426f38b0f21SJung-uk Kim case 'Q': 427a9d8d09cSJung-uk Kim 428f38b0f21SJung-uk Kim if (LastCharsAreHex) 429f38b0f21SJung-uk Kim { 430f38b0f21SJung-uk Kim NameString = "_Qxx"; 431f38b0f21SJung-uk Kim } 432f38b0f21SJung-uk Kim break; 433f38b0f21SJung-uk Kim 434f38b0f21SJung-uk Kim case 'T': 435a9d8d09cSJung-uk Kim 436f38b0f21SJung-uk Kim if (NameString[2] == '_') 437f38b0f21SJung-uk Kim { 438f38b0f21SJung-uk Kim NameString = "_T_x"; 439f38b0f21SJung-uk Kim } 440f38b0f21SJung-uk Kim break; 441f38b0f21SJung-uk Kim 442f38b0f21SJung-uk Kim case 'W': 443a9d8d09cSJung-uk Kim 444f38b0f21SJung-uk Kim if (LastCharsAreHex) 445f38b0f21SJung-uk Kim { 446f38b0f21SJung-uk Kim NameString = "_Wxx"; 447f38b0f21SJung-uk Kim } 448f38b0f21SJung-uk Kim break; 449f38b0f21SJung-uk Kim 450f38b0f21SJung-uk Kim default: 451a9d8d09cSJung-uk Kim 452f38b0f21SJung-uk Kim break; 453f38b0f21SJung-uk Kim } 454f38b0f21SJung-uk Kim 455f38b0f21SJung-uk Kim /* Match the name in the info table */ 456f38b0f21SJung-uk Kim 457313a0c13SJung-uk Kim Info = AcpiAhMatchPredefinedName (NameString); 458313a0c13SJung-uk Kim if (Info) 459f38b0f21SJung-uk Kim { 460f38b0f21SJung-uk Kim AcpiOsPrintf (" // %4.4s: %s", 461f38b0f21SJung-uk Kim NameString, ACPI_CAST_PTR (char, Info->Description)); 462f38b0f21SJung-uk Kim } 463f38b0f21SJung-uk Kim 464f38b0f21SJung-uk Kim #endif 465f38b0f21SJung-uk Kim return; 466f38b0f21SJung-uk Kim } 467f38b0f21SJung-uk Kim 468f38b0f21SJung-uk Kim 469f38b0f21SJung-uk Kim /******************************************************************************* 470f38b0f21SJung-uk Kim * 471f38b0f21SJung-uk Kim * FUNCTION: AcpiDmFieldPredefinedDescription 472f38b0f21SJung-uk Kim * 473f38b0f21SJung-uk Kim * PARAMETERS: Op - Parse object 474f38b0f21SJung-uk Kim * 475f38b0f21SJung-uk Kim * RETURN: None 476f38b0f21SJung-uk Kim * 477f38b0f21SJung-uk Kim * DESCRIPTION: Emit a description comment for a resource descriptor tag 478f38b0f21SJung-uk Kim * (which is a predefined ACPI name.) Used for iASL compiler only. 479f38b0f21SJung-uk Kim * 480f38b0f21SJung-uk Kim ******************************************************************************/ 481f38b0f21SJung-uk Kim 482f38b0f21SJung-uk Kim void 483f38b0f21SJung-uk Kim AcpiDmFieldPredefinedDescription ( 484f38b0f21SJung-uk Kim ACPI_PARSE_OBJECT *Op) 485f38b0f21SJung-uk Kim { 486f38b0f21SJung-uk Kim #ifdef ACPI_ASL_COMPILER 487f38b0f21SJung-uk Kim ACPI_PARSE_OBJECT *IndexOp; 488f38b0f21SJung-uk Kim char *Tag; 489f38b0f21SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 490f38b0f21SJung-uk Kim const AH_PREDEFINED_NAME *Info; 491f38b0f21SJung-uk Kim 492f38b0f21SJung-uk Kim 493f38b0f21SJung-uk Kim if (!Op) 494f38b0f21SJung-uk Kim { 495f38b0f21SJung-uk Kim return; 496f38b0f21SJung-uk Kim } 497f38b0f21SJung-uk Kim 498f38b0f21SJung-uk Kim /* Ensure that the comment field is emitted only once */ 499f38b0f21SJung-uk Kim 500f8146b88SJung-uk Kim if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED) 501f38b0f21SJung-uk Kim { 502f38b0f21SJung-uk Kim return; 503f38b0f21SJung-uk Kim } 504f8146b88SJung-uk Kim Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED; 505f38b0f21SJung-uk Kim 506f38b0f21SJung-uk Kim /* 507f38b0f21SJung-uk Kim * Op must be one of the Create* operators: CreateField, CreateBitField, 508f38b0f21SJung-uk Kim * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField 509f38b0f21SJung-uk Kim */ 510f38b0f21SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 511f38b0f21SJung-uk Kim if (!(OpInfo->Flags & AML_CREATE)) 512f38b0f21SJung-uk Kim { 513f38b0f21SJung-uk Kim return; 514f38b0f21SJung-uk Kim } 515f38b0f21SJung-uk Kim 516f38b0f21SJung-uk Kim /* Second argument is the Index argument */ 517f38b0f21SJung-uk Kim 518f38b0f21SJung-uk Kim IndexOp = Op->Common.Value.Arg; 519f38b0f21SJung-uk Kim IndexOp = IndexOp->Common.Next; 520f38b0f21SJung-uk Kim 521f38b0f21SJung-uk Kim /* Index argument must be a namepath */ 522f38b0f21SJung-uk Kim 523f38b0f21SJung-uk Kim if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP) 524f38b0f21SJung-uk Kim { 525f38b0f21SJung-uk Kim return; 526f38b0f21SJung-uk Kim } 527f38b0f21SJung-uk Kim 528f38b0f21SJung-uk Kim /* Major cheat: We previously put the Tag ptr in the Node field */ 529f38b0f21SJung-uk Kim 530f38b0f21SJung-uk Kim Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node); 5315f9b24faSJung-uk Kim if (!Tag || (*Tag == 0)) 532042ff955SJung-uk Kim { 533042ff955SJung-uk Kim return; 534042ff955SJung-uk Kim } 535f38b0f21SJung-uk Kim 5365f9b24faSJung-uk Kim /* Is the tag a predefined name? */ 537f38b0f21SJung-uk Kim 538313a0c13SJung-uk Kim Info = AcpiAhMatchPredefinedName (Tag); 5395f9b24faSJung-uk Kim if (!Info) 540f38b0f21SJung-uk Kim { 5415f9b24faSJung-uk Kim /* Not a predefined name (does not start with underscore) */ 5425f9b24faSJung-uk Kim 5435f9b24faSJung-uk Kim return; 544f38b0f21SJung-uk Kim } 545f38b0f21SJung-uk Kim 5465f9b24faSJung-uk Kim AcpiOsPrintf (" // %4.4s: %s", Tag, 5475f9b24faSJung-uk Kim ACPI_CAST_PTR (char, Info->Description)); 5485f9b24faSJung-uk Kim 5495f9b24faSJung-uk Kim /* String contains the prefix path, free it */ 5500d84335fSJung-uk Kim 5510d84335fSJung-uk Kim ACPI_FREE (IndexOp->Common.Value.String); 5525f9b24faSJung-uk Kim IndexOp->Common.Value.String = NULL; 553f38b0f21SJung-uk Kim #endif 5545f9b24faSJung-uk Kim 555f38b0f21SJung-uk Kim return; 556f38b0f21SJung-uk Kim } 557f38b0f21SJung-uk Kim 558f38b0f21SJung-uk Kim 559f38b0f21SJung-uk Kim /******************************************************************************* 560f38b0f21SJung-uk Kim * 561a159c266SJung-uk Kim * FUNCTION: AcpiDmMethodFlags 562a159c266SJung-uk Kim * 563a159c266SJung-uk Kim * PARAMETERS: Op - Method Object to be examined 564a159c266SJung-uk Kim * 565a159c266SJung-uk Kim * RETURN: None 566a159c266SJung-uk Kim * 567a159c266SJung-uk Kim * DESCRIPTION: Decode control method flags 568a159c266SJung-uk Kim * 569a159c266SJung-uk Kim ******************************************************************************/ 570a159c266SJung-uk Kim 571a159c266SJung-uk Kim void 572a159c266SJung-uk Kim AcpiDmMethodFlags ( 573a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 574a159c266SJung-uk Kim { 575a159c266SJung-uk Kim UINT32 Flags; 576a159c266SJung-uk Kim UINT32 Args; 577a159c266SJung-uk Kim 578a159c266SJung-uk Kim 579a159c266SJung-uk Kim /* The next Op contains the flags */ 580a159c266SJung-uk Kim 581a159c266SJung-uk Kim Op = AcpiPsGetDepthNext (NULL, Op); 582a159c266SJung-uk Kim Flags = (UINT8) Op->Common.Value.Integer; 583a159c266SJung-uk Kim Args = Flags & 0x07; 584a159c266SJung-uk Kim 585a159c266SJung-uk Kim /* Mark the Op as completed */ 586a159c266SJung-uk Kim 587a159c266SJung-uk Kim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 588a159c266SJung-uk Kim 589a159c266SJung-uk Kim /* 1) Method argument count */ 590a159c266SJung-uk Kim 591a159c266SJung-uk Kim AcpiOsPrintf (", %u, ", Args); 592a159c266SJung-uk Kim 593a159c266SJung-uk Kim /* 2) Serialize rule */ 594a159c266SJung-uk Kim 595a159c266SJung-uk Kim if (!(Flags & 0x08)) 596a159c266SJung-uk Kim { 597a159c266SJung-uk Kim AcpiOsPrintf ("Not"); 598a159c266SJung-uk Kim } 599a159c266SJung-uk Kim 600a159c266SJung-uk Kim AcpiOsPrintf ("Serialized"); 601a159c266SJung-uk Kim 602a159c266SJung-uk Kim /* 3) SyncLevel */ 603a159c266SJung-uk Kim 604a159c266SJung-uk Kim if (Flags & 0xF0) 605a159c266SJung-uk Kim { 606a159c266SJung-uk Kim AcpiOsPrintf (", %u", Flags >> 4); 607a159c266SJung-uk Kim } 608a159c266SJung-uk Kim } 609a159c266SJung-uk Kim 610a159c266SJung-uk Kim 611a159c266SJung-uk Kim /******************************************************************************* 612a159c266SJung-uk Kim * 613a159c266SJung-uk Kim * FUNCTION: AcpiDmFieldFlags 614a159c266SJung-uk Kim * 615a159c266SJung-uk Kim * PARAMETERS: Op - Field Object to be examined 616a159c266SJung-uk Kim * 617a159c266SJung-uk Kim * RETURN: None 618a159c266SJung-uk Kim * 619a159c266SJung-uk Kim * DESCRIPTION: Decode Field definition flags 620a159c266SJung-uk Kim * 621a159c266SJung-uk Kim ******************************************************************************/ 622a159c266SJung-uk Kim 623a159c266SJung-uk Kim void 624a159c266SJung-uk Kim AcpiDmFieldFlags ( 625a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 626a159c266SJung-uk Kim { 627a159c266SJung-uk Kim UINT32 Flags; 628a159c266SJung-uk Kim 629a159c266SJung-uk Kim 630a159c266SJung-uk Kim Op = Op->Common.Next; 631a159c266SJung-uk Kim Flags = (UINT8) Op->Common.Value.Integer; 632a159c266SJung-uk Kim 633a159c266SJung-uk Kim /* Mark the Op as completed */ 634a159c266SJung-uk Kim 635a159c266SJung-uk Kim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 636a159c266SJung-uk Kim 637a159c266SJung-uk Kim AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]); 638a159c266SJung-uk Kim AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]); 639a159c266SJung-uk Kim AcpiOsPrintf ("%s)", AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]); 640a159c266SJung-uk Kim } 641a159c266SJung-uk Kim 642a159c266SJung-uk Kim 643a159c266SJung-uk Kim /******************************************************************************* 644a159c266SJung-uk Kim * 645a159c266SJung-uk Kim * FUNCTION: AcpiDmAddressSpace 646a159c266SJung-uk Kim * 647a159c266SJung-uk Kim * PARAMETERS: SpaceId - ID to be translated 648a159c266SJung-uk Kim * 649a159c266SJung-uk Kim * RETURN: None 650a159c266SJung-uk Kim * 651a159c266SJung-uk Kim * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword 652a159c266SJung-uk Kim * 653a159c266SJung-uk Kim ******************************************************************************/ 654a159c266SJung-uk Kim 655a159c266SJung-uk Kim void 656a159c266SJung-uk Kim AcpiDmAddressSpace ( 657a159c266SJung-uk Kim UINT8 SpaceId) 658a159c266SJung-uk Kim { 659a159c266SJung-uk Kim 660a159c266SJung-uk Kim if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) 661a159c266SJung-uk Kim { 662a159c266SJung-uk Kim if (SpaceId == 0x7F) 663a159c266SJung-uk Kim { 664a159c266SJung-uk Kim AcpiOsPrintf ("FFixedHW, "); 665a159c266SJung-uk Kim } 666a159c266SJung-uk Kim else 667a159c266SJung-uk Kim { 668a159c266SJung-uk Kim AcpiOsPrintf ("0x%.2X, ", SpaceId); 669a159c266SJung-uk Kim } 670a159c266SJung-uk Kim } 671a159c266SJung-uk Kim else 672a159c266SJung-uk Kim { 673a159c266SJung-uk Kim AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]); 674a159c266SJung-uk Kim } 675a159c266SJung-uk Kim } 676a159c266SJung-uk Kim 677a159c266SJung-uk Kim 678a159c266SJung-uk Kim /******************************************************************************* 679a159c266SJung-uk Kim * 680a159c266SJung-uk Kim * FUNCTION: AcpiDmRegionFlags 681a159c266SJung-uk Kim * 682a159c266SJung-uk Kim * PARAMETERS: Op - Object to be examined 683a159c266SJung-uk Kim * 684a159c266SJung-uk Kim * RETURN: None 685a159c266SJung-uk Kim * 686a159c266SJung-uk Kim * DESCRIPTION: Decode OperationRegion flags 687a159c266SJung-uk Kim * 688a159c266SJung-uk Kim ******************************************************************************/ 689a159c266SJung-uk Kim 690a159c266SJung-uk Kim void 691a159c266SJung-uk Kim AcpiDmRegionFlags ( 692a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 693a159c266SJung-uk Kim { 694a159c266SJung-uk Kim 695a159c266SJung-uk Kim /* The next Op contains the SpaceId */ 696a159c266SJung-uk Kim 697a159c266SJung-uk Kim Op = AcpiPsGetDepthNext (NULL, Op); 698a159c266SJung-uk Kim 699a159c266SJung-uk Kim /* Mark the Op as completed */ 700a159c266SJung-uk Kim 701a159c266SJung-uk Kim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 702a159c266SJung-uk Kim 703a159c266SJung-uk Kim AcpiOsPrintf (", "); 704a159c266SJung-uk Kim AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer); 705a159c266SJung-uk Kim } 706a159c266SJung-uk Kim 707a159c266SJung-uk Kim 708a159c266SJung-uk Kim /******************************************************************************* 709a159c266SJung-uk Kim * 710a159c266SJung-uk Kim * FUNCTION: AcpiDmMatchOp 711a159c266SJung-uk Kim * 712a159c266SJung-uk Kim * PARAMETERS: Op - Match Object to be examined 713a159c266SJung-uk Kim * 714a159c266SJung-uk Kim * RETURN: None 715a159c266SJung-uk Kim * 716a159c266SJung-uk Kim * DESCRIPTION: Decode Match opcode operands 717a159c266SJung-uk Kim * 718a159c266SJung-uk Kim ******************************************************************************/ 719a159c266SJung-uk Kim 720a159c266SJung-uk Kim void 721a159c266SJung-uk Kim AcpiDmMatchOp ( 722a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 723a159c266SJung-uk Kim { 724a159c266SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 725a159c266SJung-uk Kim 726a159c266SJung-uk Kim 727a159c266SJung-uk Kim NextOp = AcpiPsGetDepthNext (NULL, Op); 728a159c266SJung-uk Kim NextOp = NextOp->Common.Next; 729a159c266SJung-uk Kim 730a159c266SJung-uk Kim if (!NextOp) 731a159c266SJung-uk Kim { 732a159c266SJung-uk Kim /* Handle partial tree during single-step */ 733a159c266SJung-uk Kim 734a159c266SJung-uk Kim return; 735a159c266SJung-uk Kim } 736a159c266SJung-uk Kim 737a159c266SJung-uk Kim /* Mark the two nodes that contain the encoding for the match keywords */ 738a159c266SJung-uk Kim 739a159c266SJung-uk Kim NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP; 740a159c266SJung-uk Kim 741a159c266SJung-uk Kim NextOp = NextOp->Common.Next; 742a159c266SJung-uk Kim NextOp = NextOp->Common.Next; 743a159c266SJung-uk Kim NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP; 744a159c266SJung-uk Kim } 745a159c266SJung-uk Kim 746a159c266SJung-uk Kim 747a159c266SJung-uk Kim /******************************************************************************* 748a159c266SJung-uk Kim * 749a159c266SJung-uk Kim * FUNCTION: AcpiDmMatchKeyword 750a159c266SJung-uk Kim * 751a159c266SJung-uk Kim * PARAMETERS: Op - Match Object to be examined 752a159c266SJung-uk Kim * 753a159c266SJung-uk Kim * RETURN: None 754a159c266SJung-uk Kim * 755a159c266SJung-uk Kim * DESCRIPTION: Decode Match opcode operands 756a159c266SJung-uk Kim * 757a159c266SJung-uk Kim ******************************************************************************/ 758a159c266SJung-uk Kim 759a159c266SJung-uk Kim static void 760a159c266SJung-uk Kim AcpiDmMatchKeyword ( 761a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 762a159c266SJung-uk Kim { 763a159c266SJung-uk Kim 764a159c266SJung-uk Kim if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE) 765a159c266SJung-uk Kim { 766a159c266SJung-uk Kim AcpiOsPrintf ("/* Unknown Match Keyword encoding */"); 767a159c266SJung-uk Kim } 768a159c266SJung-uk Kim else 769a159c266SJung-uk Kim { 770f8146b88SJung-uk Kim AcpiOsPrintf ("%s", 771f8146b88SJung-uk Kim AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]); 772a159c266SJung-uk Kim } 773a159c266SJung-uk Kim } 774a159c266SJung-uk Kim 775a159c266SJung-uk Kim 776a159c266SJung-uk Kim /******************************************************************************* 777a159c266SJung-uk Kim * 778a159c266SJung-uk Kim * FUNCTION: AcpiDmDisassembleOneOp 779a159c266SJung-uk Kim * 780a159c266SJung-uk Kim * PARAMETERS: WalkState - Current walk info 781a159c266SJung-uk Kim * Info - Parse tree walk info 782a159c266SJung-uk Kim * Op - Op that is to be printed 783a159c266SJung-uk Kim * 784a159c266SJung-uk Kim * RETURN: None 785a159c266SJung-uk Kim * 786a159c266SJung-uk Kim * DESCRIPTION: Disassemble a single AML opcode 787a159c266SJung-uk Kim * 788a159c266SJung-uk Kim ******************************************************************************/ 789a159c266SJung-uk Kim 790a159c266SJung-uk Kim void 791a159c266SJung-uk Kim AcpiDmDisassembleOneOp ( 792a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState, 793a159c266SJung-uk Kim ACPI_OP_WALK_INFO *Info, 794a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 795a159c266SJung-uk Kim { 796a159c266SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo = NULL; 797a159c266SJung-uk Kim UINT32 Offset; 798a159c266SJung-uk Kim UINT32 Length; 799a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Child; 800a159c266SJung-uk Kim ACPI_STATUS Status; 801a159c266SJung-uk Kim UINT8 *Aml; 802313a0c13SJung-uk Kim const AH_DEVICE_ID *IdInfo; 803a159c266SJung-uk Kim 804a159c266SJung-uk Kim 805a159c266SJung-uk Kim if (!Op) 806a159c266SJung-uk Kim { 807a159c266SJung-uk Kim AcpiOsPrintf ("<NULL OP PTR>"); 808a159c266SJung-uk Kim return; 809a159c266SJung-uk Kim } 810a159c266SJung-uk Kim 811f8146b88SJung-uk Kim if (Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF) 812f8146b88SJung-uk Kim { 813f8146b88SJung-uk Kim return; /* ElseIf macro was already emitted */ 814f8146b88SJung-uk Kim } 815f8146b88SJung-uk Kim 816a159c266SJung-uk Kim switch (Op->Common.DisasmOpcode) 817a159c266SJung-uk Kim { 818a159c266SJung-uk Kim case ACPI_DASM_MATCHOP: 819a159c266SJung-uk Kim 820a159c266SJung-uk Kim AcpiDmMatchKeyword (Op); 821a159c266SJung-uk Kim return; 822a159c266SJung-uk Kim 823a159c266SJung-uk Kim case ACPI_DASM_LNOT_SUFFIX: 824a9d8d09cSJung-uk Kim 8251c0e1b6dSJung-uk Kim if (!AcpiGbl_CstyleDisassembly) 8261c0e1b6dSJung-uk Kim { 827a159c266SJung-uk Kim switch (Op->Common.AmlOpcode) 828a159c266SJung-uk Kim { 8290d84335fSJung-uk Kim case AML_LOGICAL_EQUAL_OP: 830a159c266SJung-uk Kim AcpiOsPrintf ("LNotEqual"); 831a159c266SJung-uk Kim break; 832a159c266SJung-uk Kim 8330d84335fSJung-uk Kim case AML_LOGICAL_GREATER_OP: 834a159c266SJung-uk Kim AcpiOsPrintf ("LLessEqual"); 835a159c266SJung-uk Kim break; 836a159c266SJung-uk Kim 8370d84335fSJung-uk Kim case AML_LOGICAL_LESS_OP: 838a159c266SJung-uk Kim AcpiOsPrintf ("LGreaterEqual"); 839a159c266SJung-uk Kim break; 840a159c266SJung-uk Kim 841a159c266SJung-uk Kim default: 842a159c266SJung-uk Kim break; 843a159c266SJung-uk Kim } 8441c0e1b6dSJung-uk Kim } 8451c0e1b6dSJung-uk Kim 846a159c266SJung-uk Kim Op->Common.DisasmOpcode = 0; 847a159c266SJung-uk Kim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 848a159c266SJung-uk Kim return; 849a159c266SJung-uk Kim 850a159c266SJung-uk Kim default: 851a159c266SJung-uk Kim break; 852a159c266SJung-uk Kim } 853a159c266SJung-uk Kim 854a159c266SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 855a159c266SJung-uk Kim 856a159c266SJung-uk Kim /* The op and arguments */ 857a159c266SJung-uk Kim 858a159c266SJung-uk Kim switch (Op->Common.AmlOpcode) 859a159c266SJung-uk Kim { 8600d84335fSJung-uk Kim case AML_LOGICAL_NOT_OP: 861a159c266SJung-uk Kim 862a159c266SJung-uk Kim Child = Op->Common.Value.Arg; 8630d84335fSJung-uk Kim if ((Child->Common.AmlOpcode == AML_LOGICAL_EQUAL_OP) || 8640d84335fSJung-uk Kim (Child->Common.AmlOpcode == AML_LOGICAL_GREATER_OP) || 8650d84335fSJung-uk Kim (Child->Common.AmlOpcode == AML_LOGICAL_LESS_OP)) 866a159c266SJung-uk Kim { 867a159c266SJung-uk Kim Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX; 868a159c266SJung-uk Kim Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX; 869a159c266SJung-uk Kim } 870a159c266SJung-uk Kim else 871a159c266SJung-uk Kim { 872a159c266SJung-uk Kim AcpiOsPrintf ("%s", OpInfo->Name); 873a159c266SJung-uk Kim } 874a159c266SJung-uk Kim break; 875a159c266SJung-uk Kim 876a159c266SJung-uk Kim case AML_BYTE_OP: 877a159c266SJung-uk Kim 878a159c266SJung-uk Kim AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer); 879a159c266SJung-uk Kim break; 880a159c266SJung-uk Kim 881a159c266SJung-uk Kim case AML_WORD_OP: 882a159c266SJung-uk Kim 883a159c266SJung-uk Kim if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) 884a159c266SJung-uk Kim { 885313a0c13SJung-uk Kim AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer); 886a159c266SJung-uk Kim } 887a159c266SJung-uk Kim else 888a159c266SJung-uk Kim { 889a159c266SJung-uk Kim AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer); 890a159c266SJung-uk Kim } 891a159c266SJung-uk Kim break; 892a159c266SJung-uk Kim 893a159c266SJung-uk Kim case AML_DWORD_OP: 894a159c266SJung-uk Kim 895a159c266SJung-uk Kim if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) 896a159c266SJung-uk Kim { 897313a0c13SJung-uk Kim AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer); 898a159c266SJung-uk Kim } 899a159c266SJung-uk Kim else 900a159c266SJung-uk Kim { 901a159c266SJung-uk Kim AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer); 902a159c266SJung-uk Kim } 903a159c266SJung-uk Kim break; 904a159c266SJung-uk Kim 905a159c266SJung-uk Kim case AML_QWORD_OP: 906a159c266SJung-uk Kim 907a159c266SJung-uk Kim AcpiOsPrintf ("0x%8.8X%8.8X", 908a159c266SJung-uk Kim ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); 909a159c266SJung-uk Kim break; 910a159c266SJung-uk Kim 911a159c266SJung-uk Kim case AML_STRING_OP: 912a159c266SJung-uk Kim 9138d744e47SJung-uk Kim AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX); 914313a0c13SJung-uk Kim 915313a0c13SJung-uk Kim /* For _HID/_CID strings, attempt to output a descriptive comment */ 916313a0c13SJung-uk Kim 917313a0c13SJung-uk Kim if (Op->Common.DisasmOpcode == ACPI_DASM_HID_STRING) 918313a0c13SJung-uk Kim { 919313a0c13SJung-uk Kim /* If we know about the ID, emit the description */ 920313a0c13SJung-uk Kim 921313a0c13SJung-uk Kim IdInfo = AcpiAhMatchHardwareId (Op->Common.Value.String); 922313a0c13SJung-uk Kim if (IdInfo) 923313a0c13SJung-uk Kim { 924313a0c13SJung-uk Kim AcpiOsPrintf (" /* %s */", IdInfo->Description); 925313a0c13SJung-uk Kim } 926313a0c13SJung-uk Kim } 927a159c266SJung-uk Kim break; 928a159c266SJung-uk Kim 929a159c266SJung-uk Kim case AML_BUFFER_OP: 930a159c266SJung-uk Kim /* 931a159c266SJung-uk Kim * Determine the type of buffer. We can have one of the following: 932a159c266SJung-uk Kim * 933a159c266SJung-uk Kim * 1) ResourceTemplate containing Resource Descriptors. 934a159c266SJung-uk Kim * 2) Unicode String buffer 935a159c266SJung-uk Kim * 3) ASCII String buffer 936a159c266SJung-uk Kim * 4) Raw data buffer (if none of the above) 937a159c266SJung-uk Kim * 938a159c266SJung-uk Kim * Since there are no special AML opcodes to differentiate these 939a159c266SJung-uk Kim * types of buffers, we have to closely look at the data in the 940a159c266SJung-uk Kim * buffer to determine the type. 941a159c266SJung-uk Kim */ 942a159c266SJung-uk Kim if (!AcpiGbl_NoResourceDisassembly) 943a159c266SJung-uk Kim { 944ed17e06eSJung-uk Kim Status = AcpiDmIsResourceTemplate (WalkState, Op); 945a159c266SJung-uk Kim if (ACPI_SUCCESS (Status)) 946a159c266SJung-uk Kim { 947a159c266SJung-uk Kim Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; 948a159c266SJung-uk Kim AcpiOsPrintf ("ResourceTemplate"); 949a159c266SJung-uk Kim break; 950a159c266SJung-uk Kim } 951a159c266SJung-uk Kim else if (Status == AE_AML_NO_RESOURCE_END_TAG) 952a159c266SJung-uk Kim { 953f8146b88SJung-uk Kim AcpiOsPrintf ( 954f8146b88SJung-uk Kim "/**** Is ResourceTemplate, " 955f8146b88SJung-uk Kim "but EndTag not at buffer end ****/ "); 956a159c266SJung-uk Kim } 957a159c266SJung-uk Kim } 958a159c266SJung-uk Kim 959313a0c13SJung-uk Kim if (AcpiDmIsUuidBuffer (Op)) 960313a0c13SJung-uk Kim { 961313a0c13SJung-uk Kim Op->Common.DisasmOpcode = ACPI_DASM_UUID; 962313a0c13SJung-uk Kim AcpiOsPrintf ("ToUUID ("); 963313a0c13SJung-uk Kim } 964313a0c13SJung-uk Kim else if (AcpiDmIsUnicodeBuffer (Op)) 965a159c266SJung-uk Kim { 966a159c266SJung-uk Kim Op->Common.DisasmOpcode = ACPI_DASM_UNICODE; 967a159c266SJung-uk Kim AcpiOsPrintf ("Unicode ("); 968a159c266SJung-uk Kim } 969a159c266SJung-uk Kim else if (AcpiDmIsStringBuffer (Op)) 970a159c266SJung-uk Kim { 971a159c266SJung-uk Kim Op->Common.DisasmOpcode = ACPI_DASM_STRING; 972a159c266SJung-uk Kim AcpiOsPrintf ("Buffer"); 973a159c266SJung-uk Kim } 9741df130f1SJung-uk Kim else if (AcpiDmIsPldBuffer (Op)) 9751df130f1SJung-uk Kim { 9761df130f1SJung-uk Kim Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD; 9771c0e1b6dSJung-uk Kim AcpiOsPrintf ("ToPLD ("); 9781df130f1SJung-uk Kim } 979a159c266SJung-uk Kim else 980a159c266SJung-uk Kim { 981a159c266SJung-uk Kim Op->Common.DisasmOpcode = ACPI_DASM_BUFFER; 982a159c266SJung-uk Kim AcpiOsPrintf ("Buffer"); 983a159c266SJung-uk Kim } 984a159c266SJung-uk Kim break; 985a159c266SJung-uk Kim 986a159c266SJung-uk Kim case AML_INT_NAMEPATH_OP: 987a159c266SJung-uk Kim 988a159c266SJung-uk Kim AcpiDmNamestring (Op->Common.Value.Name); 989a159c266SJung-uk Kim break; 990a159c266SJung-uk Kim 991a159c266SJung-uk Kim case AML_INT_NAMEDFIELD_OP: 992a159c266SJung-uk Kim 993a159c266SJung-uk Kim Length = AcpiDmDumpName (Op->Named.Name); 9940d84335fSJung-uk Kim 9950d84335fSJung-uk Kim AcpiOsPrintf (","); 9960d84335fSJung-uk Kim ASL_CV_PRINT_ONE_COMMENT (Op, AML_NAMECOMMENT, NULL, 0); 9970d84335fSJung-uk Kim AcpiOsPrintf ("%*.s %u", (unsigned) (5 - Length), " ", 998a159c266SJung-uk Kim (UINT32) Op->Common.Value.Integer); 9990d84335fSJung-uk Kim 1000a159c266SJung-uk Kim AcpiDmCommaIfFieldMember (Op); 1001a159c266SJung-uk Kim 1002a159c266SJung-uk Kim Info->BitOffset += (UINT32) Op->Common.Value.Integer; 1003a159c266SJung-uk Kim break; 1004a159c266SJung-uk Kim 1005a159c266SJung-uk Kim case AML_INT_RESERVEDFIELD_OP: 1006a159c266SJung-uk Kim 1007a159c266SJung-uk Kim /* Offset() -- Must account for previous offsets */ 1008a159c266SJung-uk Kim 1009a159c266SJung-uk Kim Offset = (UINT32) Op->Common.Value.Integer; 1010a159c266SJung-uk Kim Info->BitOffset += Offset; 1011a159c266SJung-uk Kim 1012a159c266SJung-uk Kim if (Info->BitOffset % 8 == 0) 1013a159c266SJung-uk Kim { 1014a159c266SJung-uk Kim AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset)); 1015a159c266SJung-uk Kim } 1016a159c266SJung-uk Kim else 1017a159c266SJung-uk Kim { 1018a159c266SJung-uk Kim AcpiOsPrintf (" , %u", Offset); 1019a159c266SJung-uk Kim } 1020a159c266SJung-uk Kim 1021a159c266SJung-uk Kim AcpiDmCommaIfFieldMember (Op); 1022a159c266SJung-uk Kim break; 1023a159c266SJung-uk Kim 1024a159c266SJung-uk Kim case AML_INT_ACCESSFIELD_OP: 1025a159c266SJung-uk Kim case AML_INT_EXTACCESSFIELD_OP: 1026a159c266SJung-uk Kim 1027a159c266SJung-uk Kim AcpiOsPrintf ("AccessAs (%s, ", 1028a159c266SJung-uk Kim AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]); 1029a159c266SJung-uk Kim 1030a159c266SJung-uk Kim AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8)); 1031a159c266SJung-uk Kim 1032a159c266SJung-uk Kim if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP) 1033a159c266SJung-uk Kim { 1034f8146b88SJung-uk Kim AcpiOsPrintf (" (0x%2.2X)", (unsigned) 1035f8146b88SJung-uk Kim ((Op->Common.Value.Integer >> 16) & 0xFF)); 1036a159c266SJung-uk Kim } 1037a159c266SJung-uk Kim 1038a159c266SJung-uk Kim AcpiOsPrintf (")"); 1039a159c266SJung-uk Kim AcpiDmCommaIfFieldMember (Op); 10400d84335fSJung-uk Kim ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0); 1041a159c266SJung-uk Kim break; 1042a159c266SJung-uk Kim 1043a159c266SJung-uk Kim case AML_INT_CONNECTION_OP: 1044a159c266SJung-uk Kim /* 1045a159c266SJung-uk Kim * Two types of Connection() - one with a buffer object, the 1046a159c266SJung-uk Kim * other with a namestring that points to a buffer object. 1047a159c266SJung-uk Kim */ 1048a159c266SJung-uk Kim AcpiOsPrintf ("Connection ("); 1049a159c266SJung-uk Kim Child = Op->Common.Value.Arg; 1050a159c266SJung-uk Kim 1051a159c266SJung-uk Kim if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP) 1052a159c266SJung-uk Kim { 1053a159c266SJung-uk Kim AcpiOsPrintf ("\n"); 1054a159c266SJung-uk Kim 1055a159c266SJung-uk Kim Aml = Child->Named.Data; 1056a159c266SJung-uk Kim Length = (UINT32) Child->Common.Value.Integer; 1057a159c266SJung-uk Kim 1058a159c266SJung-uk Kim Info->Level += 1; 1059313a0c13SJung-uk Kim Info->MappingOp = Op; 1060a159c266SJung-uk Kim Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; 1061313a0c13SJung-uk Kim 1062a159c266SJung-uk Kim AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length); 1063a159c266SJung-uk Kim 1064a159c266SJung-uk Kim Info->Level -= 1; 1065a159c266SJung-uk Kim AcpiDmIndent (Info->Level); 1066a159c266SJung-uk Kim } 1067a159c266SJung-uk Kim else 1068a159c266SJung-uk Kim { 1069a159c266SJung-uk Kim AcpiDmNamestring (Child->Common.Value.Name); 1070a159c266SJung-uk Kim } 1071a159c266SJung-uk Kim 1072a159c266SJung-uk Kim AcpiOsPrintf (")"); 1073a159c266SJung-uk Kim AcpiDmCommaIfFieldMember (Op); 10740d84335fSJung-uk Kim ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0); 10750d84335fSJung-uk Kim ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0); 1076a159c266SJung-uk Kim AcpiOsPrintf ("\n"); 1077a159c266SJung-uk Kim 1078a159c266SJung-uk Kim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */ 1079a159c266SJung-uk Kim Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 1080a159c266SJung-uk Kim break; 1081a159c266SJung-uk Kim 1082a159c266SJung-uk Kim case AML_INT_BYTELIST_OP: 1083a159c266SJung-uk Kim 1084a159c266SJung-uk Kim AcpiDmByteList (Info, Op); 1085a159c266SJung-uk Kim break; 1086a159c266SJung-uk Kim 1087a159c266SJung-uk Kim case AML_INT_METHODCALL_OP: 1088a159c266SJung-uk Kim 1089a159c266SJung-uk Kim Op = AcpiPsGetDepthNext (NULL, Op); 1090a159c266SJung-uk Kim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 1091a159c266SJung-uk Kim 1092a159c266SJung-uk Kim AcpiDmNamestring (Op->Common.Value.Name); 1093a159c266SJung-uk Kim break; 1094a159c266SJung-uk Kim 109528482948SJung-uk Kim case AML_WHILE_OP: 109628482948SJung-uk Kim 10970d84335fSJung-uk Kim if (Op->Common.DisasmOpcode == ACPI_DASM_SWITCH) 109828482948SJung-uk Kim { 109928482948SJung-uk Kim AcpiOsPrintf ("%s", "Switch"); 110028482948SJung-uk Kim break; 110128482948SJung-uk Kim } 110228482948SJung-uk Kim 110328482948SJung-uk Kim AcpiOsPrintf ("%s", OpInfo->Name); 110428482948SJung-uk Kim break; 110528482948SJung-uk Kim 110628482948SJung-uk Kim case AML_IF_OP: 110728482948SJung-uk Kim 110828482948SJung-uk Kim if (Op->Common.DisasmOpcode == ACPI_DASM_CASE) 110928482948SJung-uk Kim { 111028482948SJung-uk Kim AcpiOsPrintf ("%s", "Case"); 111128482948SJung-uk Kim break; 111228482948SJung-uk Kim } 111328482948SJung-uk Kim 111428482948SJung-uk Kim AcpiOsPrintf ("%s", OpInfo->Name); 111528482948SJung-uk Kim break; 111628482948SJung-uk Kim 1117f8146b88SJung-uk Kim case AML_ELSE_OP: 1118f8146b88SJung-uk Kim 1119f8146b88SJung-uk Kim AcpiDmConvertToElseIf (Op); 1120f8146b88SJung-uk Kim break; 1121f8146b88SJung-uk Kim 1122f8146b88SJung-uk Kim case AML_EXTERNAL_OP: 1123f8146b88SJung-uk Kim 11243920312eSJung-uk Kim if (AcpiGbl_DmEmitExternalOpcodes) 11253920312eSJung-uk Kim { 1126af051161SJung-uk Kim AcpiDmEmitExternal (Op, AcpiPsGetArg(Op, 0)); 11273920312eSJung-uk Kim } 1128f8146b88SJung-uk Kim 11290d84335fSJung-uk Kim break; 11300d84335fSJung-uk Kim 1131a159c266SJung-uk Kim default: 1132a159c266SJung-uk Kim 1133a159c266SJung-uk Kim /* Just get the opcode name and print it */ 1134a159c266SJung-uk Kim 1135a159c266SJung-uk Kim AcpiOsPrintf ("%s", OpInfo->Name); 1136a159c266SJung-uk Kim 1137a159c266SJung-uk Kim 1138a159c266SJung-uk Kim #ifdef ACPI_DEBUGGER 1139a159c266SJung-uk Kim 1140a159c266SJung-uk Kim if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) && 1141a159c266SJung-uk Kim (WalkState) && 1142a159c266SJung-uk Kim (WalkState->Results) && 1143a159c266SJung-uk Kim (WalkState->ResultCount)) 1144a159c266SJung-uk Kim { 1145fe0f0bbbSJung-uk Kim AcpiDbDecodeInternalObject ( 1146a159c266SJung-uk Kim WalkState->Results->Results.ObjDesc [ 1147a159c266SJung-uk Kim (WalkState->ResultCount - 1) % 1148a159c266SJung-uk Kim ACPI_RESULTS_FRAME_OBJ_NUM]); 1149a159c266SJung-uk Kim } 1150a159c266SJung-uk Kim #endif 1151a159c266SJung-uk Kim 1152a159c266SJung-uk Kim break; 1153a159c266SJung-uk Kim } 1154a159c266SJung-uk Kim } 1155f8146b88SJung-uk Kim 1156f8146b88SJung-uk Kim 1157f8146b88SJung-uk Kim /******************************************************************************* 1158f8146b88SJung-uk Kim * 1159f8146b88SJung-uk Kim * FUNCTION: AcpiDmConvertToElseIf 1160f8146b88SJung-uk Kim * 1161f8146b88SJung-uk Kim * PARAMETERS: OriginalElseOp - ELSE Object to be examined 1162f8146b88SJung-uk Kim * 1163f8146b88SJung-uk Kim * RETURN: None. Emits either an "Else" or an "ElseIf" ASL operator. 1164f8146b88SJung-uk Kim * 1165f8146b88SJung-uk Kim * DESCRIPTION: Detect and convert an If..Else..If sequence to If..ElseIf 1166f8146b88SJung-uk Kim * 1167f8146b88SJung-uk Kim * EXAMPLE: 1168f8146b88SJung-uk Kim * 1169f8146b88SJung-uk Kim * This If..Else..If nested sequence: 1170f8146b88SJung-uk Kim * 1171f8146b88SJung-uk Kim * If (Arg0 == 1) 1172f8146b88SJung-uk Kim * { 1173f8146b88SJung-uk Kim * Local0 = 4 1174f8146b88SJung-uk Kim * } 1175f8146b88SJung-uk Kim * Else 1176f8146b88SJung-uk Kim * { 1177f8146b88SJung-uk Kim * If (Arg0 == 2) 1178f8146b88SJung-uk Kim * { 1179f8146b88SJung-uk Kim * Local0 = 5 1180f8146b88SJung-uk Kim * } 1181f8146b88SJung-uk Kim * } 1182f8146b88SJung-uk Kim * 1183f8146b88SJung-uk Kim * Is converted to this simpler If..ElseIf sequence: 1184f8146b88SJung-uk Kim * 1185f8146b88SJung-uk Kim * If (Arg0 == 1) 1186f8146b88SJung-uk Kim * { 1187f8146b88SJung-uk Kim * Local0 = 4 1188f8146b88SJung-uk Kim * } 1189f8146b88SJung-uk Kim * ElseIf (Arg0 == 2) 1190f8146b88SJung-uk Kim * { 1191f8146b88SJung-uk Kim * Local0 = 5 1192f8146b88SJung-uk Kim * } 1193f8146b88SJung-uk Kim * 1194f8146b88SJung-uk Kim * NOTE: There is no actual ElseIf AML opcode. ElseIf is essentially an ASL 1195f8146b88SJung-uk Kim * macro that emits an Else opcode followed by an If opcode. This function 1196f8146b88SJung-uk Kim * reverses these AML sequences back to an ElseIf macro where possible. This 1197f8146b88SJung-uk Kim * can make the disassembled ASL code simpler and more like the original code. 1198f8146b88SJung-uk Kim * 1199f8146b88SJung-uk Kim ******************************************************************************/ 1200f8146b88SJung-uk Kim 1201f8146b88SJung-uk Kim static void 1202f8146b88SJung-uk Kim AcpiDmConvertToElseIf ( 1203f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *OriginalElseOp) 1204f8146b88SJung-uk Kim { 1205f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *IfOp; 1206f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *ElseOp; 1207f8146b88SJung-uk Kim 1208f8146b88SJung-uk Kim 1209f8146b88SJung-uk Kim /* 1210f8146b88SJung-uk Kim * To be able to perform the conversion, two conditions must be satisfied: 1211f8146b88SJung-uk Kim * 1) The first child of the Else must be an If statement. 1212f8146b88SJung-uk Kim * 2) The If block can only be followed by an Else block and these must 1213f8146b88SJung-uk Kim * be the only blocks under the original Else. 1214f8146b88SJung-uk Kim */ 1215f8146b88SJung-uk Kim IfOp = OriginalElseOp->Common.Value.Arg; 1216493deb39SJung-uk Kim 1217f8146b88SJung-uk Kim if (!IfOp || 1218f8146b88SJung-uk Kim (IfOp->Common.AmlOpcode != AML_IF_OP) || 1219f8146b88SJung-uk Kim (IfOp->Asl.Next && (IfOp->Asl.Next->Common.AmlOpcode != AML_ELSE_OP))) 1220f8146b88SJung-uk Kim { 1221493deb39SJung-uk Kim /* Not a proper Else..If sequence, cannot convert to ElseIf */ 1222f8146b88SJung-uk Kim 122328482948SJung-uk Kim if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT) 122428482948SJung-uk Kim { 122528482948SJung-uk Kim AcpiOsPrintf ("%s", "Default"); 122628482948SJung-uk Kim return; 122728482948SJung-uk Kim } 122828482948SJung-uk Kim 1229f8146b88SJung-uk Kim AcpiOsPrintf ("%s", "Else"); 1230f8146b88SJung-uk Kim return; 1231f8146b88SJung-uk Kim } 1232f8146b88SJung-uk Kim 1233493deb39SJung-uk Kim /* Cannot have anything following the If...Else block */ 1234493deb39SJung-uk Kim 1235493deb39SJung-uk Kim ElseOp = IfOp->Common.Next; 1236493deb39SJung-uk Kim if (ElseOp && ElseOp->Common.Next) 1237493deb39SJung-uk Kim { 123828482948SJung-uk Kim if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT) 123928482948SJung-uk Kim { 124028482948SJung-uk Kim AcpiOsPrintf ("%s", "Default"); 124128482948SJung-uk Kim return; 124228482948SJung-uk Kim } 124328482948SJung-uk Kim 1244493deb39SJung-uk Kim AcpiOsPrintf ("%s", "Else"); 1245493deb39SJung-uk Kim return; 1246493deb39SJung-uk Kim } 1247493deb39SJung-uk Kim 124828482948SJung-uk Kim if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT) 124928482948SJung-uk Kim { 125028482948SJung-uk Kim /* 125128482948SJung-uk Kim * There is an ElseIf but in this case the Else is actually 125228482948SJung-uk Kim * a Default block for a Switch/Case statement. No conversion. 125328482948SJung-uk Kim */ 125428482948SJung-uk Kim AcpiOsPrintf ("%s", "Default"); 125528482948SJung-uk Kim return; 125628482948SJung-uk Kim } 125728482948SJung-uk Kim 125828482948SJung-uk Kim if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_CASE) 125928482948SJung-uk Kim { 126028482948SJung-uk Kim /* 126128482948SJung-uk Kim * This ElseIf is actually a Case block for a Switch/Case 126228482948SJung-uk Kim * statement. Print Case but do not return so that we can 126328482948SJung-uk Kim * promote the subtree and keep the indentation level. 126428482948SJung-uk Kim */ 126528482948SJung-uk Kim AcpiOsPrintf ("%s", "Case"); 126628482948SJung-uk Kim } 126728482948SJung-uk Kim else 126828482948SJung-uk Kim { 1269f8146b88SJung-uk Kim /* Emit ElseIf, mark the IF as now an ELSEIF */ 1270f8146b88SJung-uk Kim 1271f8146b88SJung-uk Kim AcpiOsPrintf ("%s", "ElseIf"); 127228482948SJung-uk Kim } 127328482948SJung-uk Kim 1274f8146b88SJung-uk Kim IfOp->Common.DisasmFlags |= ACPI_PARSEOP_ELSEIF; 1275f8146b88SJung-uk Kim 1276f8146b88SJung-uk Kim /* The IF parent will now be the same as the original ELSE parent */ 1277f8146b88SJung-uk Kim 1278f8146b88SJung-uk Kim IfOp->Common.Parent = OriginalElseOp->Common.Parent; 1279f8146b88SJung-uk Kim 1280f8146b88SJung-uk Kim /* 1281f8146b88SJung-uk Kim * Update the NEXT pointers to restructure the parse tree, essentially 1282f8146b88SJung-uk Kim * promoting an If..Else block up to the same level as the original 1283f8146b88SJung-uk Kim * Else. 1284f8146b88SJung-uk Kim * 1285f8146b88SJung-uk Kim * Check if the IF has a corresponding ELSE peer 1286f8146b88SJung-uk Kim */ 1287f8146b88SJung-uk Kim ElseOp = IfOp->Common.Next; 1288f8146b88SJung-uk Kim if (ElseOp && 1289f8146b88SJung-uk Kim (ElseOp->Common.AmlOpcode == AML_ELSE_OP)) 1290f8146b88SJung-uk Kim { 1291f8146b88SJung-uk Kim /* If an ELSE matches the IF, promote it also */ 1292f8146b88SJung-uk Kim 1293f8146b88SJung-uk Kim ElseOp->Common.Parent = OriginalElseOp->Common.Parent; 1294493deb39SJung-uk Kim 1295493deb39SJung-uk Kim /* Promote the entire block under the ElseIf (All Next OPs) */ 1296493deb39SJung-uk Kim 1297493deb39SJung-uk Kim AcpiDmPromoteSubtree (OriginalElseOp); 1298f8146b88SJung-uk Kim } 1299f8146b88SJung-uk Kim else 1300f8146b88SJung-uk Kim { 1301f8146b88SJung-uk Kim /* Otherwise, set the IF NEXT to the original ELSE NEXT */ 1302f8146b88SJung-uk Kim 1303f8146b88SJung-uk Kim IfOp->Common.Next = OriginalElseOp->Common.Next; 1304f8146b88SJung-uk Kim } 1305f8146b88SJung-uk Kim 1306f8146b88SJung-uk Kim /* Detach the child IF block from the original ELSE */ 1307f8146b88SJung-uk Kim 1308f8146b88SJung-uk Kim OriginalElseOp->Common.Value.Arg = NULL; 1309f8146b88SJung-uk Kim 1310f8146b88SJung-uk Kim /* Ignore the original ELSE from now on */ 1311f8146b88SJung-uk Kim 1312f8146b88SJung-uk Kim OriginalElseOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 1313f8146b88SJung-uk Kim OriginalElseOp->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX; 1314f8146b88SJung-uk Kim 1315f8146b88SJung-uk Kim /* Insert IF (now ELSEIF) as next peer of the original ELSE */ 1316f8146b88SJung-uk Kim 1317f8146b88SJung-uk Kim OriginalElseOp->Common.Next = IfOp; 1318f8146b88SJung-uk Kim } 1319493deb39SJung-uk Kim 1320493deb39SJung-uk Kim 1321493deb39SJung-uk Kim /******************************************************************************* 1322493deb39SJung-uk Kim * 1323493deb39SJung-uk Kim * FUNCTION: AcpiDmPromoteSubtree 1324493deb39SJung-uk Kim * 1325493deb39SJung-uk Kim * PARAMETERS: StartOpOp - Original parent of the entire subtree 1326493deb39SJung-uk Kim * 1327493deb39SJung-uk Kim * RETURN: None 1328493deb39SJung-uk Kim * 1329493deb39SJung-uk Kim * DESCRIPTION: Promote an entire parse subtree up one level. 1330493deb39SJung-uk Kim * 1331493deb39SJung-uk Kim ******************************************************************************/ 1332493deb39SJung-uk Kim 1333493deb39SJung-uk Kim static void 1334493deb39SJung-uk Kim AcpiDmPromoteSubtree ( 1335493deb39SJung-uk Kim ACPI_PARSE_OBJECT *StartOp) 1336493deb39SJung-uk Kim { 1337493deb39SJung-uk Kim ACPI_PARSE_OBJECT *Op; 1338493deb39SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp; 1339493deb39SJung-uk Kim 1340493deb39SJung-uk Kim 1341493deb39SJung-uk Kim /* New parent for subtree elements */ 1342493deb39SJung-uk Kim 1343493deb39SJung-uk Kim ParentOp = StartOp->Common.Parent; 1344493deb39SJung-uk Kim 1345493deb39SJung-uk Kim /* First child starts the subtree */ 1346493deb39SJung-uk Kim 1347493deb39SJung-uk Kim Op = StartOp->Common.Value.Arg; 1348493deb39SJung-uk Kim 1349493deb39SJung-uk Kim /* Walk the top-level elements of the subtree */ 1350493deb39SJung-uk Kim 1351493deb39SJung-uk Kim while (Op) 1352493deb39SJung-uk Kim { 1353493deb39SJung-uk Kim Op->Common.Parent = ParentOp; 1354493deb39SJung-uk Kim if (!Op->Common.Next) 1355493deb39SJung-uk Kim { 1356493deb39SJung-uk Kim /* Last Op in list, update its next field */ 1357493deb39SJung-uk Kim 1358493deb39SJung-uk Kim Op->Common.Next = StartOp->Common.Next; 1359493deb39SJung-uk Kim break; 1360493deb39SJung-uk Kim } 1361493deb39SJung-uk Kim Op = Op->Common.Next; 1362493deb39SJung-uk Kim } 1363493deb39SJung-uk Kim } 1364