13446Smrj /******************************************************************************* 23446Smrj * 33446Smrj * Module Name: dmwalk - AML disassembly tree walk 43446Smrj * 53446Smrj ******************************************************************************/ 63446Smrj 73446Smrj /****************************************************************************** 83446Smrj * 93446Smrj * 1. Copyright Notice 103446Smrj * 11*9980SDana.Myers@Sun.COM * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. 123446Smrj * All rights reserved. 133446Smrj * 143446Smrj * 2. License 153446Smrj * 163446Smrj * 2.1. This is your license from Intel Corp. under its intellectual property 173446Smrj * rights. You may have additional license terms from the party that provided 183446Smrj * you this software, covering your right to use that party's intellectual 193446Smrj * property rights. 203446Smrj * 213446Smrj * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 223446Smrj * copy of the source code appearing in this file ("Covered Code") an 233446Smrj * irrevocable, perpetual, worldwide license under Intel's copyrights in the 243446Smrj * base code distributed originally by Intel ("Original Intel Code") to copy, 253446Smrj * make derivatives, distribute, use and display any portion of the Covered 263446Smrj * Code in any form, with the right to sublicense such rights; and 273446Smrj * 283446Smrj * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 293446Smrj * license (with the right to sublicense), under only those claims of Intel 303446Smrj * patents that are infringed by the Original Intel Code, to make, use, sell, 313446Smrj * offer to sell, and import the Covered Code and derivative works thereof 323446Smrj * solely to the minimum extent necessary to exercise the above copyright 333446Smrj * license, and in no event shall the patent license extend to any additions 343446Smrj * to or modifications of the Original Intel Code. No other license or right 353446Smrj * is granted directly or by implication, estoppel or otherwise; 363446Smrj * 373446Smrj * The above copyright and patent license is granted only if the following 383446Smrj * conditions are met: 393446Smrj * 403446Smrj * 3. Conditions 413446Smrj * 423446Smrj * 3.1. Redistribution of Source with Rights to Further Distribute Source. 433446Smrj * Redistribution of source code of any substantial portion of the Covered 443446Smrj * Code or modification with rights to further distribute source must include 453446Smrj * the above Copyright Notice, the above License, this list of Conditions, 463446Smrj * and the following Disclaimer and Export Compliance provision. In addition, 473446Smrj * Licensee must cause all Covered Code to which Licensee contributes to 483446Smrj * contain a file documenting the changes Licensee made to create that Covered 493446Smrj * Code and the date of any change. Licensee must include in that file the 503446Smrj * documentation of any changes made by any predecessor Licensee. Licensee 513446Smrj * must include a prominent statement that the modification is derived, 523446Smrj * directly or indirectly, from Original Intel Code. 533446Smrj * 543446Smrj * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 553446Smrj * Redistribution of source code of any substantial portion of the Covered 563446Smrj * Code or modification without rights to further distribute source must 573446Smrj * include the following Disclaimer and Export Compliance provision in the 583446Smrj * documentation and/or other materials provided with distribution. In 593446Smrj * addition, Licensee may not authorize further sublicense of source of any 603446Smrj * portion of the Covered Code, and must include terms to the effect that the 613446Smrj * license from Licensee to its licensee is limited to the intellectual 623446Smrj * property embodied in the software Licensee provides to its licensee, and 633446Smrj * not to intellectual property embodied in modifications its licensee may 643446Smrj * make. 653446Smrj * 663446Smrj * 3.3. Redistribution of Executable. Redistribution in executable form of any 673446Smrj * substantial portion of the Covered Code or modification must reproduce the 683446Smrj * above Copyright Notice, and the following Disclaimer and Export Compliance 693446Smrj * provision in the documentation and/or other materials provided with the 703446Smrj * distribution. 713446Smrj * 723446Smrj * 3.4. Intel retains all right, title, and interest in and to the Original 733446Smrj * Intel Code. 743446Smrj * 753446Smrj * 3.5. Neither the name Intel nor any other trademark owned or controlled by 763446Smrj * Intel shall be used in advertising or otherwise to promote the sale, use or 773446Smrj * other dealings in products derived from or relating to the Covered Code 783446Smrj * without prior written authorization from Intel. 793446Smrj * 803446Smrj * 4. Disclaimer and Export Compliance 813446Smrj * 823446Smrj * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 833446Smrj * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 843446Smrj * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 853446Smrj * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 863446Smrj * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 873446Smrj * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 883446Smrj * PARTICULAR PURPOSE. 893446Smrj * 903446Smrj * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 913446Smrj * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 923446Smrj * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 933446Smrj * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 943446Smrj * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 953446Smrj * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 963446Smrj * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 973446Smrj * LIMITED REMEDY. 983446Smrj * 993446Smrj * 4.3. Licensee shall not export, either directly or indirectly, any of this 1003446Smrj * software or system incorporating such software without first obtaining any 1013446Smrj * required license or other approval from the U. S. Department of Commerce or 1023446Smrj * any other agency or department of the United States Government. In the 1033446Smrj * event Licensee exports any such software from the United States or 1043446Smrj * re-exports any such software from a foreign destination, Licensee shall 1053446Smrj * ensure that the distribution and export/re-export of the software is in 1063446Smrj * compliance with all laws, regulations, orders, or other restrictions of the 1073446Smrj * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1083446Smrj * any of its subsidiaries will export/re-export any technical data, process, 1093446Smrj * software, or service, directly or indirectly, to any country for which the 1103446Smrj * United States government or any agency thereof requires an export license, 1113446Smrj * other governmental approval, or letter of assurance, without first obtaining 1123446Smrj * such license, approval or letter. 1133446Smrj * 1143446Smrj *****************************************************************************/ 1153446Smrj 1163446Smrj 1173446Smrj #include "acpi.h" 118*9980SDana.Myers@Sun.COM #include "accommon.h" 1193446Smrj #include "acparser.h" 1203446Smrj #include "amlcode.h" 1213446Smrj #include "acdisasm.h" 1223446Smrj #include "acdebug.h" 1233446Smrj 1243446Smrj 1253446Smrj #ifdef ACPI_DISASSEMBLER 1263446Smrj 1273446Smrj #define _COMPONENT ACPI_CA_DEBUGGER 1283446Smrj ACPI_MODULE_NAME ("dmwalk") 1293446Smrj 1303446Smrj 1313446Smrj #define DB_FULL_OP_INFO "[%4.4s] @%5.5X #%4.4X: " 1323446Smrj 1333446Smrj /* Local prototypes */ 1343446Smrj 1353446Smrj static ACPI_STATUS 1363446Smrj AcpiDmDescendingOp ( 1373446Smrj ACPI_PARSE_OBJECT *Op, 1383446Smrj UINT32 Level, 1393446Smrj void *Context); 1403446Smrj 1413446Smrj static ACPI_STATUS 1423446Smrj AcpiDmAscendingOp ( 1433446Smrj ACPI_PARSE_OBJECT *Op, 1443446Smrj UINT32 Level, 1453446Smrj void *Context); 1463446Smrj 1473446Smrj static UINT32 1483446Smrj AcpiDmBlockType ( 1493446Smrj ACPI_PARSE_OBJECT *Op); 1503446Smrj 151*9980SDana.Myers@Sun.COM static const char * 152*9980SDana.Myers@Sun.COM AcpiDmGetObjectTypeName ( 153*9980SDana.Myers@Sun.COM ACPI_OBJECT_TYPE Type); 154*9980SDana.Myers@Sun.COM 155*9980SDana.Myers@Sun.COM /* 156*9980SDana.Myers@Sun.COM * This table maps ACPI_OBJECT_TYPEs to the corresponding ASL 157*9980SDana.Myers@Sun.COM * ObjectTypeKeyword. Used to generate typed external declarations 158*9980SDana.Myers@Sun.COM */ 159*9980SDana.Myers@Sun.COM static const char *AcpiGbl_DmTypeNames[] = 160*9980SDana.Myers@Sun.COM { 161*9980SDana.Myers@Sun.COM /* 00 */ "", /* Type ANY */ 162*9980SDana.Myers@Sun.COM /* 01 */ ", IntObj", 163*9980SDana.Myers@Sun.COM /* 02 */ ", StrObj", 164*9980SDana.Myers@Sun.COM /* 03 */ ", BuffObj", 165*9980SDana.Myers@Sun.COM /* 04 */ ", PkgObj", 166*9980SDana.Myers@Sun.COM /* 05 */ ", FieldUnitObj", 167*9980SDana.Myers@Sun.COM /* 06 */ ", DeviceObj", 168*9980SDana.Myers@Sun.COM /* 07 */ ", EventObj", 169*9980SDana.Myers@Sun.COM /* 08 */ ", MethodObj", 170*9980SDana.Myers@Sun.COM /* 09 */ ", MutexObj", 171*9980SDana.Myers@Sun.COM /* 10 */ ", OpRegionObj", 172*9980SDana.Myers@Sun.COM /* 11 */ ", PowerResObj", 173*9980SDana.Myers@Sun.COM /* 12 */ ", ProcessorObj", 174*9980SDana.Myers@Sun.COM /* 13 */ ", ThermalZoneObj", 175*9980SDana.Myers@Sun.COM /* 14 */ ", BuffFieldObj", 176*9980SDana.Myers@Sun.COM /* 15 */ ", DDBHandleObj", 177*9980SDana.Myers@Sun.COM /* 16 */ "", /* Debug object */ 178*9980SDana.Myers@Sun.COM /* 17 */ ", FieldUnitObj", 179*9980SDana.Myers@Sun.COM /* 18 */ ", FieldUnitObj", 180*9980SDana.Myers@Sun.COM /* 19 */ ", FieldUnitObj" 181*9980SDana.Myers@Sun.COM }; 182*9980SDana.Myers@Sun.COM 183*9980SDana.Myers@Sun.COM 184*9980SDana.Myers@Sun.COM /******************************************************************************* 185*9980SDana.Myers@Sun.COM * 186*9980SDana.Myers@Sun.COM * FUNCTION: AcpiDmGetObjectTypeName 187*9980SDana.Myers@Sun.COM * 188*9980SDana.Myers@Sun.COM * PARAMETERS: Type - An ACPI_OBJECT_TYPE 189*9980SDana.Myers@Sun.COM * 190*9980SDana.Myers@Sun.COM * RETURN: Pointer to a string 191*9980SDana.Myers@Sun.COM * 192*9980SDana.Myers@Sun.COM * DESCRIPTION: Map an object type to the ASL object type string. 193*9980SDana.Myers@Sun.COM * 194*9980SDana.Myers@Sun.COM ******************************************************************************/ 195*9980SDana.Myers@Sun.COM 196*9980SDana.Myers@Sun.COM static const char * 197*9980SDana.Myers@Sun.COM AcpiDmGetObjectTypeName ( 198*9980SDana.Myers@Sun.COM ACPI_OBJECT_TYPE Type) 199*9980SDana.Myers@Sun.COM { 200*9980SDana.Myers@Sun.COM 201*9980SDana.Myers@Sun.COM if (Type == ACPI_TYPE_LOCAL_SCOPE) 202*9980SDana.Myers@Sun.COM { 203*9980SDana.Myers@Sun.COM Type = ACPI_TYPE_DEVICE; 204*9980SDana.Myers@Sun.COM } 205*9980SDana.Myers@Sun.COM 206*9980SDana.Myers@Sun.COM else if (Type > ACPI_TYPE_LOCAL_INDEX_FIELD) 207*9980SDana.Myers@Sun.COM { 208*9980SDana.Myers@Sun.COM return (""); 209*9980SDana.Myers@Sun.COM } 210*9980SDana.Myers@Sun.COM 211*9980SDana.Myers@Sun.COM return (AcpiGbl_DmTypeNames[Type]); 212*9980SDana.Myers@Sun.COM } 213*9980SDana.Myers@Sun.COM 2143446Smrj 2153446Smrj /******************************************************************************* 2163446Smrj * 2173446Smrj * FUNCTION: AcpiDmDisassemble 2183446Smrj * 2193446Smrj * PARAMETERS: WalkState - Current state 2203446Smrj * Origin - Starting object 2213446Smrj * NumOpcodes - Max number of opcodes to be displayed 2223446Smrj * 2233446Smrj * RETURN: None 2243446Smrj * 2253446Smrj * DESCRIPTION: Disassemble parser object and its children. This is the 2263446Smrj * main entry point of the disassembler. 2273446Smrj * 2283446Smrj ******************************************************************************/ 2293446Smrj 2303446Smrj void 2313446Smrj AcpiDmDisassemble ( 2323446Smrj ACPI_WALK_STATE *WalkState, 2333446Smrj ACPI_PARSE_OBJECT *Origin, 2343446Smrj UINT32 NumOpcodes) 2353446Smrj { 2363446Smrj ACPI_PARSE_OBJECT *Op = Origin; 2373446Smrj ACPI_OP_WALK_INFO Info; 2383446Smrj 2393446Smrj 2403446Smrj if (!Op) 2413446Smrj { 2423446Smrj return; 2433446Smrj } 2443446Smrj 2453446Smrj Info.Flags = 0; 2463446Smrj Info.Level = 0; 2473446Smrj Info.Count = 0; 2483446Smrj Info.WalkState = WalkState; 2493446Smrj AcpiDmWalkParseTree (Op, AcpiDmDescendingOp, AcpiDmAscendingOp, &Info); 2503446Smrj return; 2513446Smrj } 2523446Smrj 2533446Smrj 2543446Smrj /******************************************************************************* 2553446Smrj * 2563446Smrj * FUNCTION: AcpiDmWalkParseTree 2573446Smrj * 2583446Smrj * PARAMETERS: Op - Root Op object 2593446Smrj * DescendingCallback - Called during tree descent 2603446Smrj * AscendingCallback - Called during tree ascent 2613446Smrj * Context - To be passed to the callbacks 2623446Smrj * 2633446Smrj * RETURN: Status from callback(s) 2643446Smrj * 2653446Smrj * DESCRIPTION: Walk the entire parse tree. 2663446Smrj * 2673446Smrj ******************************************************************************/ 2683446Smrj 2693446Smrj void 2703446Smrj AcpiDmWalkParseTree ( 2713446Smrj ACPI_PARSE_OBJECT *Op, 2723446Smrj ASL_WALK_CALLBACK DescendingCallback, 2733446Smrj ASL_WALK_CALLBACK AscendingCallback, 2743446Smrj void *Context) 2753446Smrj { 2763446Smrj BOOLEAN NodePreviouslyVisited; 2773446Smrj ACPI_PARSE_OBJECT *StartOp = Op; 2783446Smrj ACPI_STATUS Status; 2793446Smrj ACPI_PARSE_OBJECT *Next; 2803446Smrj ACPI_OP_WALK_INFO *Info = Context; 2813446Smrj 2823446Smrj 2833446Smrj Info->Level = 0; 2843446Smrj NodePreviouslyVisited = FALSE; 2853446Smrj 2863446Smrj while (Op) 2873446Smrj { 2883446Smrj if (NodePreviouslyVisited) 2893446Smrj { 2903446Smrj if (AscendingCallback) 2913446Smrj { 2923446Smrj Status = AscendingCallback (Op, Info->Level, Context); 2933446Smrj if (ACPI_FAILURE (Status)) 2943446Smrj { 2953446Smrj return; 2963446Smrj } 2973446Smrj } 2983446Smrj } 2993446Smrj else 3003446Smrj { 3013446Smrj /* Let the callback process the node */ 3023446Smrj 3033446Smrj Status = DescendingCallback (Op, Info->Level, Context); 3043446Smrj if (ACPI_SUCCESS (Status)) 3053446Smrj { 3063446Smrj /* Visit children first, once */ 3073446Smrj 3083446Smrj Next = AcpiPsGetArg (Op, 0); 3093446Smrj if (Next) 3103446Smrj { 3113446Smrj Info->Level++; 3123446Smrj Op = Next; 3133446Smrj continue; 3143446Smrj } 3153446Smrj } 3163446Smrj else if (Status != AE_CTRL_DEPTH) 3173446Smrj { 3183446Smrj /* Exit immediately on any error */ 3193446Smrj 3203446Smrj return; 3213446Smrj } 3223446Smrj } 3233446Smrj 3243446Smrj /* Terminate walk at start op */ 3253446Smrj 3263446Smrj if (Op == StartOp) 3273446Smrj { 3283446Smrj break; 3293446Smrj } 3303446Smrj 3313446Smrj /* No more children, re-visit this node */ 3323446Smrj 3333446Smrj if (!NodePreviouslyVisited) 3343446Smrj { 3353446Smrj NodePreviouslyVisited = TRUE; 3363446Smrj continue; 3373446Smrj } 3383446Smrj 3393446Smrj /* No more children, visit peers */ 3403446Smrj 3413446Smrj if (Op->Common.Next) 3423446Smrj { 3433446Smrj Op = Op->Common.Next; 3443446Smrj NodePreviouslyVisited = FALSE; 3453446Smrj } 3463446Smrj else 3473446Smrj { 3483446Smrj /* No peers, re-visit parent */ 3493446Smrj 3503446Smrj if (Info->Level != 0 ) 3513446Smrj { 3523446Smrj Info->Level--; 3533446Smrj } 3543446Smrj 3553446Smrj Op = Op->Common.Parent; 3563446Smrj NodePreviouslyVisited = TRUE; 3573446Smrj } 3583446Smrj } 3593446Smrj 3603446Smrj /* If we get here, the walk completed with no errors */ 3613446Smrj 3623446Smrj return; 3633446Smrj } 3643446Smrj 3653446Smrj 3663446Smrj /******************************************************************************* 3673446Smrj * 3683446Smrj * FUNCTION: AcpiDmBlockType 3693446Smrj * 3703446Smrj * PARAMETERS: Op - Object to be examined 3713446Smrj * 3723446Smrj * RETURN: BlockType - not a block, parens, braces, or even both. 3733446Smrj * 3743446Smrj * DESCRIPTION: Type of block for this op (parens or braces) 3753446Smrj * 3763446Smrj ******************************************************************************/ 3773446Smrj 3783446Smrj static UINT32 3793446Smrj AcpiDmBlockType ( 3803446Smrj ACPI_PARSE_OBJECT *Op) 3813446Smrj { 3823446Smrj const ACPI_OPCODE_INFO *OpInfo; 3833446Smrj 3843446Smrj 3853446Smrj if (!Op) 3863446Smrj { 3873446Smrj return (BLOCK_NONE); 3883446Smrj } 3893446Smrj 3903446Smrj switch (Op->Common.AmlOpcode) 3913446Smrj { 3923446Smrj case AML_ELSE_OP: 3933446Smrj 3943446Smrj return (BLOCK_BRACE); 3953446Smrj 3963446Smrj case AML_METHOD_OP: 3973446Smrj case AML_DEVICE_OP: 3983446Smrj case AML_SCOPE_OP: 3993446Smrj case AML_PROCESSOR_OP: 4003446Smrj case AML_POWER_RES_OP: 4013446Smrj case AML_THERMAL_ZONE_OP: 4023446Smrj case AML_IF_OP: 4033446Smrj case AML_WHILE_OP: 4043446Smrj case AML_FIELD_OP: 4053446Smrj case AML_INDEX_FIELD_OP: 4063446Smrj case AML_BANK_FIELD_OP: 4073446Smrj 4083446Smrj return (BLOCK_PAREN | BLOCK_BRACE); 4093446Smrj 4103446Smrj case AML_BUFFER_OP: 4113446Smrj 4123446Smrj if (Op->Common.DisasmOpcode == ACPI_DASM_UNICODE) 4133446Smrj { 4143446Smrj return (BLOCK_NONE); 4153446Smrj } 4163446Smrj 4173446Smrj /*lint -fallthrough */ 4183446Smrj 4193446Smrj case AML_PACKAGE_OP: 4203446Smrj case AML_VAR_PACKAGE_OP: 4213446Smrj 4223446Smrj return (BLOCK_PAREN | BLOCK_BRACE); 4233446Smrj 4243446Smrj case AML_EVENT_OP: 4253446Smrj 4263446Smrj return (BLOCK_PAREN); 4273446Smrj 4283446Smrj default: 4293446Smrj 4303446Smrj OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 4313446Smrj if (OpInfo->Flags & AML_HAS_ARGS) 4323446Smrj { 4333446Smrj return (BLOCK_PAREN); 4343446Smrj } 4353446Smrj 4363446Smrj return (BLOCK_NONE); 4373446Smrj } 4383446Smrj } 4393446Smrj 4403446Smrj 4413446Smrj /******************************************************************************* 4423446Smrj * 4433446Smrj * FUNCTION: AcpiDmListType 4443446Smrj * 4453446Smrj * PARAMETERS: Op - Object to be examined 4463446Smrj * 4473446Smrj * RETURN: ListType - has commas or not. 4483446Smrj * 4493446Smrj * DESCRIPTION: Type of block for this op (parens or braces) 4503446Smrj * 4513446Smrj ******************************************************************************/ 4523446Smrj 4533446Smrj UINT32 4543446Smrj AcpiDmListType ( 4553446Smrj ACPI_PARSE_OBJECT *Op) 4563446Smrj { 4573446Smrj const ACPI_OPCODE_INFO *OpInfo; 4583446Smrj 4593446Smrj 4603446Smrj if (!Op) 4613446Smrj { 4623446Smrj return (BLOCK_NONE); 4633446Smrj } 4643446Smrj 4653446Smrj switch (Op->Common.AmlOpcode) 4663446Smrj { 4673446Smrj 4683446Smrj case AML_ELSE_OP: 4693446Smrj case AML_METHOD_OP: 4703446Smrj case AML_DEVICE_OP: 4713446Smrj case AML_SCOPE_OP: 4723446Smrj case AML_POWER_RES_OP: 4733446Smrj case AML_PROCESSOR_OP: 4743446Smrj case AML_THERMAL_ZONE_OP: 4753446Smrj case AML_IF_OP: 4763446Smrj case AML_WHILE_OP: 4773446Smrj case AML_FIELD_OP: 4783446Smrj case AML_INDEX_FIELD_OP: 4793446Smrj case AML_BANK_FIELD_OP: 4803446Smrj 4813446Smrj return (BLOCK_NONE); 4823446Smrj 4833446Smrj case AML_BUFFER_OP: 4843446Smrj case AML_PACKAGE_OP: 4853446Smrj case AML_VAR_PACKAGE_OP: 4863446Smrj 4873446Smrj return (BLOCK_COMMA_LIST); 4883446Smrj 4893446Smrj default: 4903446Smrj 4913446Smrj OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 4923446Smrj if (OpInfo->Flags & AML_HAS_ARGS) 4933446Smrj { 4943446Smrj return (BLOCK_COMMA_LIST); 4953446Smrj } 4963446Smrj 4973446Smrj return (BLOCK_NONE); 4983446Smrj } 4993446Smrj } 5003446Smrj 5013446Smrj 5023446Smrj /******************************************************************************* 5033446Smrj * 5043446Smrj * FUNCTION: AcpiDmDescendingOp 5053446Smrj * 5063446Smrj * PARAMETERS: ASL_WALK_CALLBACK 5073446Smrj * 5083446Smrj * RETURN: Status 5093446Smrj * 5103446Smrj * DESCRIPTION: First visitation of a parse object during tree descent. 5113446Smrj * Decode opcode name and begin parameter list(s), if any. 5123446Smrj * 5133446Smrj ******************************************************************************/ 5143446Smrj 5153446Smrj static ACPI_STATUS 5163446Smrj AcpiDmDescendingOp ( 5173446Smrj ACPI_PARSE_OBJECT *Op, 5183446Smrj UINT32 Level, 5193446Smrj void *Context) 5203446Smrj { 5213446Smrj ACPI_OP_WALK_INFO *Info = Context; 5223446Smrj const ACPI_OPCODE_INFO *OpInfo; 5233446Smrj UINT32 Name; 5243446Smrj ACPI_PARSE_OBJECT *NextOp; 5253446Smrj ACPI_EXTERNAL_LIST *NextExternal; 5263446Smrj 5273446Smrj 5283446Smrj if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) 5293446Smrj { 5303446Smrj /* Ignore this op -- it was handled elsewhere */ 5313446Smrj 5323446Smrj return (AE_CTRL_DEPTH); 5333446Smrj } 5343446Smrj 5353446Smrj /* Level 0 is at the Definition Block level */ 5363446Smrj 5373446Smrj if (Level == 0) 5383446Smrj { 5393446Smrj /* In verbose mode, print the AML offset, opcode and depth count */ 5403446Smrj 5413446Smrj if (Info->WalkState) 5423446Smrj { 5433446Smrj VERBOSE_PRINT ((DB_FULL_OP_INFO, 5443446Smrj (Info->WalkState->MethodNode ? 5453446Smrj Info->WalkState->MethodNode->Name.Ascii : " "), 5463446Smrj Op->Common.AmlOffset, (UINT32) Op->Common.AmlOpcode)); 5473446Smrj } 5483446Smrj 5493446Smrj if (Op->Common.AmlOpcode == AML_SCOPE_OP) 5503446Smrj { 5513446Smrj /* This is the beginning of the Definition Block */ 5523446Smrj 5533446Smrj AcpiOsPrintf ("{\n"); 5543446Smrj 5553446Smrj /* Emit all External() declarations here */ 5563446Smrj 5573446Smrj if (AcpiGbl_ExternalList) 5583446Smrj { 5593446Smrj /* 5603446Smrj * Walk the list of externals (unresolved references) 5613446Smrj * found during parsing 5623446Smrj */ 5633446Smrj while (AcpiGbl_ExternalList) 5643446Smrj { 565*9980SDana.Myers@Sun.COM AcpiOsPrintf (" External (%s%s", 566*9980SDana.Myers@Sun.COM AcpiGbl_ExternalList->Path, 567*9980SDana.Myers@Sun.COM AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type)); 5683446Smrj 5693446Smrj if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD) 5703446Smrj { 5713446Smrj AcpiOsPrintf (") // %d Arguments\n", AcpiGbl_ExternalList->Value); 5723446Smrj } 5733446Smrj else 5743446Smrj { 5753446Smrj AcpiOsPrintf (")\n"); 5763446Smrj } 5773446Smrj 5783446Smrj NextExternal = AcpiGbl_ExternalList->Next; 5793446Smrj ACPI_FREE (AcpiGbl_ExternalList->Path); 5803446Smrj ACPI_FREE (AcpiGbl_ExternalList); 5813446Smrj AcpiGbl_ExternalList = NextExternal; 5823446Smrj } 5833446Smrj AcpiOsPrintf ("\n"); 5843446Smrj } 5853446Smrj 5863446Smrj return (AE_OK); 5873446Smrj } 5883446Smrj } 5893446Smrj else if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 5903446Smrj (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) && 5913446Smrj (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP)) 5923446Smrj { 5933446Smrj /* 5943446Smrj * This is a first-level element of a term list, 5953446Smrj * indent a new line 5963446Smrj */ 5973446Smrj AcpiDmIndent (Level); 5983446Smrj Info->LastLevel = Level; 5993446Smrj Info->Count = 0; 6003446Smrj } 6013446Smrj 6023446Smrj /* 6033446Smrj * This is an inexpensive mechanism to try and keep lines from getting 6043446Smrj * too long. When the limit is hit, start a new line at the previous 6053446Smrj * indent plus one. A better but more expensive mechanism would be to 6063446Smrj * keep track of the current column. 6073446Smrj */ 6083446Smrj Info->Count++; 6093446Smrj if (Info->Count /*+Info->LastLevel*/ > 10) 6103446Smrj { 6113446Smrj Info->Count = 0; 6123446Smrj AcpiOsPrintf ("\n"); 6133446Smrj AcpiDmIndent (Info->LastLevel + 1); 6143446Smrj } 6153446Smrj 6163446Smrj /* Print the opcode name */ 6173446Smrj 6183446Smrj AcpiDmDisassembleOneOp (NULL, Info, Op); 6193446Smrj 6203446Smrj if (Op->Common.DisasmOpcode == ACPI_DASM_LNOT_PREFIX) 6213446Smrj { 6223446Smrj return (AE_OK); 6233446Smrj } 6243446Smrj 6253446Smrj if ((Op->Common.AmlOpcode == AML_NAME_OP) || 6263446Smrj (Op->Common.AmlOpcode == AML_RETURN_OP)) 6273446Smrj { 6283446Smrj Info->Level--; 6293446Smrj } 6303446Smrj 6313446Smrj /* Start the opcode argument list if necessary */ 6323446Smrj 6333446Smrj OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 6343446Smrj 6353446Smrj if ((OpInfo->Flags & AML_HAS_ARGS) || 6363446Smrj (Op->Common.AmlOpcode == AML_EVENT_OP)) 6373446Smrj { 6383446Smrj /* This opcode has an argument list */ 6393446Smrj 6403446Smrj if (AcpiDmBlockType (Op) & BLOCK_PAREN) 6413446Smrj { 6423446Smrj AcpiOsPrintf (" ("); 6433446Smrj } 6443446Smrj 6453446Smrj /* If this is a named opcode, print the associated name value */ 6463446Smrj 6473446Smrj if (OpInfo->Flags & AML_NAMED) 6483446Smrj { 6493446Smrj switch (Op->Common.AmlOpcode) 6503446Smrj { 6513446Smrj case AML_ALIAS_OP: 6523446Smrj 6533446Smrj NextOp = AcpiPsGetDepthNext (NULL, Op); 6543446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 6553446Smrj AcpiDmNamestring (NextOp->Common.Value.Name); 6563446Smrj AcpiOsPrintf (", "); 6573446Smrj 6583446Smrj /*lint -fallthrough */ 6593446Smrj 6603446Smrj default: 6613446Smrj 6623446Smrj Name = AcpiPsGetName (Op); 6633446Smrj if (Op->Named.Path) 6643446Smrj { 6653446Smrj AcpiDmNamestring ((char *) Op->Named.Path); 6663446Smrj } 6673446Smrj else 6683446Smrj { 6697851SDana.Myers@Sun.COM AcpiDmDumpName (Name); 6703446Smrj } 6713446Smrj 6723446Smrj if (Op->Common.AmlOpcode != AML_INT_NAMEDFIELD_OP) 6733446Smrj { 6743446Smrj if (AcpiGbl_DbOpt_verbose) 6753446Smrj { 6763446Smrj (void) AcpiPsDisplayObjectPathname (NULL, Op); 6773446Smrj } 6783446Smrj } 6793446Smrj break; 6803446Smrj } 6813446Smrj 6823446Smrj switch (Op->Common.AmlOpcode) 6833446Smrj { 6843446Smrj case AML_METHOD_OP: 6853446Smrj 6863446Smrj AcpiDmMethodFlags (Op); 6873446Smrj AcpiOsPrintf (")"); 6883446Smrj break; 6893446Smrj 6903446Smrj 6913446Smrj case AML_NAME_OP: 6923446Smrj 6933446Smrj /* Check for _HID and related EISAID() */ 6943446Smrj 6953446Smrj AcpiDmIsEisaId (Op); 6963446Smrj AcpiOsPrintf (", "); 6973446Smrj break; 6983446Smrj 6993446Smrj 7003446Smrj case AML_REGION_OP: 7013446Smrj 7023446Smrj AcpiDmRegionFlags (Op); 7033446Smrj break; 7043446Smrj 7053446Smrj 7063446Smrj case AML_POWER_RES_OP: 7073446Smrj 7083446Smrj /* Mark the next two Ops as part of the parameter list */ 7093446Smrj 7103446Smrj AcpiOsPrintf (", "); 7113446Smrj NextOp = AcpiPsGetDepthNext (NULL, Op); 7123446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 7133446Smrj 7143446Smrj NextOp = NextOp->Common.Next; 7153446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 7163446Smrj return (AE_OK); 7173446Smrj 7183446Smrj 7193446Smrj case AML_PROCESSOR_OP: 7203446Smrj 7213446Smrj /* Mark the next three Ops as part of the parameter list */ 7223446Smrj 7233446Smrj AcpiOsPrintf (", "); 7243446Smrj NextOp = AcpiPsGetDepthNext (NULL, Op); 7253446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 7263446Smrj 7273446Smrj NextOp = NextOp->Common.Next; 7283446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 7293446Smrj 7303446Smrj NextOp = NextOp->Common.Next; 7313446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 7323446Smrj return (AE_OK); 7333446Smrj 7343446Smrj 7353446Smrj case AML_MUTEX_OP: 7363446Smrj case AML_DATA_REGION_OP: 7373446Smrj 7383446Smrj AcpiOsPrintf (", "); 7393446Smrj return (AE_OK); 7403446Smrj 7413446Smrj 7423446Smrj case AML_EVENT_OP: 7433446Smrj case AML_ALIAS_OP: 7443446Smrj 7453446Smrj return (AE_OK); 7463446Smrj 7473446Smrj 7483446Smrj case AML_SCOPE_OP: 7493446Smrj case AML_DEVICE_OP: 7503446Smrj case AML_THERMAL_ZONE_OP: 7513446Smrj 7523446Smrj AcpiOsPrintf (")"); 7533446Smrj break; 7543446Smrj 7553446Smrj 7563446Smrj default: 7573446Smrj 7583446Smrj AcpiOsPrintf ("*** Unhandled named opcode %X\n", Op->Common.AmlOpcode); 7593446Smrj break; 7603446Smrj } 7613446Smrj } 7623446Smrj 7633446Smrj else switch (Op->Common.AmlOpcode) 7643446Smrj { 7653446Smrj case AML_FIELD_OP: 7663446Smrj case AML_BANK_FIELD_OP: 7673446Smrj case AML_INDEX_FIELD_OP: 7683446Smrj 7693446Smrj Info->BitOffset = 0; 7703446Smrj 7713446Smrj /* Name of the parent OperationRegion */ 7723446Smrj 7733446Smrj NextOp = AcpiPsGetDepthNext (NULL, Op); 7743446Smrj AcpiDmNamestring (NextOp->Common.Value.Name); 7753446Smrj AcpiOsPrintf (", "); 7763446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 7773446Smrj 7783446Smrj switch (Op->Common.AmlOpcode) 7793446Smrj { 7803446Smrj case AML_BANK_FIELD_OP: 7813446Smrj 7823446Smrj /* Namestring - Bank Name */ 7833446Smrj 7843446Smrj NextOp = AcpiPsGetDepthNext (NULL, NextOp); 7853446Smrj AcpiDmNamestring (NextOp->Common.Value.Name); 7863446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 7873446Smrj AcpiOsPrintf (", "); 7883446Smrj 7893446Smrj /* 7903446Smrj * Bank Value. This is a TermArg in the middle of the parameter 7913446Smrj * list, must handle it here. 7923446Smrj * 7933446Smrj * Disassemble the TermArg parse tree. ACPI_PARSEOP_PARAMLIST 7943446Smrj * eliminates newline in the output. 7953446Smrj */ 7963446Smrj NextOp = NextOp->Common.Next; 7973446Smrj 7983446Smrj Info->Flags = ACPI_PARSEOP_PARAMLIST; 7993446Smrj AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, AcpiDmAscendingOp, Info); 8003446Smrj Info->Flags = 0; 8013446Smrj Info->Level = Level; 8023446Smrj 8033446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 8043446Smrj AcpiOsPrintf (", "); 8053446Smrj break; 8063446Smrj 8073446Smrj case AML_INDEX_FIELD_OP: 8083446Smrj 8093446Smrj /* Namestring - Data Name */ 8103446Smrj 8113446Smrj NextOp = AcpiPsGetDepthNext (NULL, NextOp); 8123446Smrj AcpiDmNamestring (NextOp->Common.Value.Name); 8133446Smrj AcpiOsPrintf (", "); 8143446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 8153446Smrj break; 8163446Smrj 8173446Smrj default: 8183446Smrj 8193446Smrj break; 8203446Smrj } 8213446Smrj 8223446Smrj AcpiDmFieldFlags (NextOp); 8233446Smrj break; 8243446Smrj 8253446Smrj 8263446Smrj case AML_BUFFER_OP: 8273446Smrj 8283446Smrj /* The next op is the size parameter */ 8293446Smrj 8303446Smrj NextOp = AcpiPsGetDepthNext (NULL, Op); 8313446Smrj if (!NextOp) 8323446Smrj { 8333446Smrj /* Single-step support */ 8343446Smrj 8353446Smrj return (AE_OK); 8363446Smrj } 8373446Smrj 8383446Smrj if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE) 8393446Smrj { 8403446Smrj /* 8413446Smrj * We have a resource list. Don't need to output 8423446Smrj * the buffer size Op. Open up a new block 8433446Smrj */ 8443446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 8453446Smrj NextOp = NextOp->Common.Next; 8463446Smrj AcpiOsPrintf (")\n"); 8473446Smrj AcpiDmIndent (Info->Level); 8483446Smrj AcpiOsPrintf ("{\n"); 8493446Smrj return (AE_OK); 8503446Smrj } 8513446Smrj 8523446Smrj /* Normal Buffer, mark size as in the parameter list */ 8533446Smrj 8543446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 8553446Smrj return (AE_OK); 8563446Smrj 8573446Smrj 8583446Smrj case AML_VAR_PACKAGE_OP: 8593446Smrj case AML_IF_OP: 8603446Smrj case AML_WHILE_OP: 8613446Smrj 8623446Smrj /* The next op is the size or predicate parameter */ 8633446Smrj 8643446Smrj NextOp = AcpiPsGetDepthNext (NULL, Op); 8653446Smrj if (NextOp) 8663446Smrj { 8673446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 8683446Smrj } 8693446Smrj return (AE_OK); 8703446Smrj 8713446Smrj 8723446Smrj case AML_PACKAGE_OP: 8733446Smrj 8743446Smrj /* The next op is the size or predicate parameter */ 8753446Smrj 8763446Smrj NextOp = AcpiPsGetDepthNext (NULL, Op); 8773446Smrj if (NextOp) 8783446Smrj { 8793446Smrj NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 8803446Smrj } 8813446Smrj return (AE_OK); 8823446Smrj 8833446Smrj 8843446Smrj case AML_MATCH_OP: 8853446Smrj 8863446Smrj AcpiDmMatchOp (Op); 8873446Smrj break; 8883446Smrj 8893446Smrj 8903446Smrj default: 8913446Smrj 8923446Smrj break; 8933446Smrj } 8943446Smrj 8953446Smrj if (AcpiDmBlockType (Op) & BLOCK_BRACE) 8963446Smrj { 8973446Smrj AcpiOsPrintf ("\n"); 8983446Smrj AcpiDmIndent (Level); 8993446Smrj AcpiOsPrintf ("{\n"); 9003446Smrj } 9013446Smrj } 9023446Smrj 9033446Smrj return (AE_OK); 9043446Smrj } 9053446Smrj 9063446Smrj 9073446Smrj /******************************************************************************* 9083446Smrj * 9093446Smrj * FUNCTION: AcpiDmAscendingOp 9103446Smrj * 9113446Smrj * PARAMETERS: ASL_WALK_CALLBACK 9123446Smrj * 9133446Smrj * RETURN: Status 9143446Smrj * 9153446Smrj * DESCRIPTION: Second visitation of a parse object, during ascent of parse 9163446Smrj * tree. Close out any parameter lists and complete the opcode. 9173446Smrj * 9183446Smrj ******************************************************************************/ 9193446Smrj 9203446Smrj static ACPI_STATUS 9213446Smrj AcpiDmAscendingOp ( 9223446Smrj ACPI_PARSE_OBJECT *Op, 9233446Smrj UINT32 Level, 9243446Smrj void *Context) 9253446Smrj { 9263446Smrj ACPI_OP_WALK_INFO *Info = Context; 9273446Smrj 9283446Smrj 9293446Smrj if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) 9303446Smrj { 9313446Smrj /* Ignore this op -- it was handled elsewhere */ 9323446Smrj 9333446Smrj return (AE_OK); 9343446Smrj } 9353446Smrj 9363446Smrj if ((Level == 0) && (Op->Common.AmlOpcode == AML_SCOPE_OP)) 9373446Smrj { 9383446Smrj /* Indicates the end of the current descriptor block (table) */ 9393446Smrj 9403446Smrj AcpiOsPrintf ("}\n\n"); 9413446Smrj return (AE_OK); 9423446Smrj } 9433446Smrj 9443446Smrj switch (AcpiDmBlockType (Op)) 9453446Smrj { 9463446Smrj case BLOCK_PAREN: 9473446Smrj 9483446Smrj /* Completed an op that has arguments, add closing paren */ 9493446Smrj 9503446Smrj AcpiOsPrintf (")"); 9513446Smrj 9523446Smrj /* Could be a nested operator, check if comma required */ 9533446Smrj 9543446Smrj if (!AcpiDmCommaIfListMember (Op)) 9553446Smrj { 9563446Smrj if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 9573446Smrj (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) && 9583446Smrj (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP)) 9593446Smrj { 9603446Smrj /* 9613446Smrj * This is a first-level element of a term list 9623446Smrj * start a new line 9633446Smrj */ 9643446Smrj if (!(Info->Flags & ACPI_PARSEOP_PARAMLIST)) 9653446Smrj { 9663446Smrj AcpiOsPrintf ("\n"); 9673446Smrj } 9683446Smrj } 9693446Smrj } 9703446Smrj break; 9713446Smrj 9723446Smrj 9733446Smrj case BLOCK_BRACE: 9743446Smrj case (BLOCK_BRACE | BLOCK_PAREN): 9753446Smrj 9763446Smrj /* Completed an op that has a term list, add closing brace */ 9773446Smrj 9783446Smrj if (Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST) 9793446Smrj { 9803446Smrj AcpiOsPrintf ("}"); 9813446Smrj } 9823446Smrj else 9833446Smrj { 9843446Smrj AcpiDmIndent (Level); 9853446Smrj AcpiOsPrintf ("}"); 9863446Smrj } 9873446Smrj 9883446Smrj AcpiDmCommaIfListMember (Op); 9893446Smrj 9903446Smrj if (AcpiDmBlockType (Op->Common.Parent) != BLOCK_PAREN) 9913446Smrj { 9923446Smrj AcpiOsPrintf ("\n"); 9933446Smrj if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST)) 9943446Smrj { 9953446Smrj if ((Op->Common.AmlOpcode == AML_IF_OP) && 9963446Smrj (Op->Common.Next) && 9973446Smrj (Op->Common.Next->Common.AmlOpcode == AML_ELSE_OP)) 9983446Smrj { 9993446Smrj break; 10003446Smrj } 10013446Smrj 10023446Smrj if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 10033446Smrj (!Op->Common.Next)) 10043446Smrj { 10053446Smrj break; 10063446Smrj } 10073446Smrj AcpiOsPrintf ("\n"); 10083446Smrj } 10093446Smrj } 10103446Smrj break; 10113446Smrj 10123446Smrj 10133446Smrj case BLOCK_NONE: 10143446Smrj default: 10153446Smrj 10163446Smrj /* Could be a nested operator, check if comma required */ 10173446Smrj 10183446Smrj if (!AcpiDmCommaIfListMember (Op)) 10193446Smrj { 10203446Smrj if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 10213446Smrj (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) && 10223446Smrj (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP)) 10233446Smrj { 10243446Smrj /* 10253446Smrj * This is a first-level element of a term list 10263446Smrj * start a new line 10273446Smrj */ 10283446Smrj AcpiOsPrintf ("\n"); 10293446Smrj } 10303446Smrj } 10313446Smrj else if (Op->Common.Parent) 10323446Smrj { 10333446Smrj switch (Op->Common.Parent->Common.AmlOpcode) 10343446Smrj { 10353446Smrj case AML_PACKAGE_OP: 10363446Smrj case AML_VAR_PACKAGE_OP: 10373446Smrj 10383446Smrj if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) 10393446Smrj { 10403446Smrj AcpiOsPrintf ("\n"); 10413446Smrj } 10423446Smrj break; 10433446Smrj 10443446Smrj default: 10453446Smrj 10463446Smrj break; 10473446Smrj } 10483446Smrj } 10493446Smrj break; 10503446Smrj } 10513446Smrj 10523446Smrj if (Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) 10533446Smrj { 10543446Smrj if ((Op->Common.Next) && 10553446Smrj (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) 10563446Smrj { 10573446Smrj return (AE_OK); 10583446Smrj } 10593446Smrj 10603446Smrj /* 10613446Smrj * Just completed a parameter node for something like "Buffer (param)". 10623446Smrj * Close the paren and open up the term list block with a brace 10633446Smrj */ 10643446Smrj if (Op->Common.Next) 10653446Smrj { 10663446Smrj AcpiOsPrintf (")\n"); 10673446Smrj AcpiDmIndent (Level - 1); 10683446Smrj AcpiOsPrintf ("{\n"); 10693446Smrj } 10703446Smrj else 10713446Smrj { 10723446Smrj Op->Common.Parent->Common.DisasmFlags |= 10733446Smrj ACPI_PARSEOP_EMPTY_TERMLIST; 10743446Smrj AcpiOsPrintf (") {"); 10753446Smrj } 10763446Smrj } 10773446Smrj 10783446Smrj if ((Op->Common.AmlOpcode == AML_NAME_OP) || 10793446Smrj (Op->Common.AmlOpcode == AML_RETURN_OP)) 10803446Smrj { 10813446Smrj Info->Level++; 10823446Smrj } 10833446Smrj return (AE_OK); 10843446Smrj } 10853446Smrj 10863446Smrj 10873446Smrj #endif /* ACPI_DISASSEMBLER */ 1088