11a39cfb0SJung-uk Kim /****************************************************************************** 21a39cfb0SJung-uk Kim * 31a39cfb0SJung-uk Kim * Module Name: adwalk - Application-level disassembler parse tree walk routines 41a39cfb0SJung-uk Kim * 51a39cfb0SJung-uk Kim *****************************************************************************/ 61a39cfb0SJung-uk Kim 71a39cfb0SJung-uk Kim /****************************************************************************** 81a39cfb0SJung-uk Kim * 91a39cfb0SJung-uk Kim * 1. Copyright Notice 101a39cfb0SJung-uk Kim * 11a9f12690SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. 121a39cfb0SJung-uk Kim * All rights reserved. 131a39cfb0SJung-uk Kim * 141a39cfb0SJung-uk Kim * 2. License 151a39cfb0SJung-uk Kim * 161a39cfb0SJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 171a39cfb0SJung-uk Kim * rights. You may have additional license terms from the party that provided 181a39cfb0SJung-uk Kim * you this software, covering your right to use that party's intellectual 191a39cfb0SJung-uk Kim * property rights. 201a39cfb0SJung-uk Kim * 211a39cfb0SJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 221a39cfb0SJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 231a39cfb0SJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 241a39cfb0SJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 251a39cfb0SJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 261a39cfb0SJung-uk Kim * Code in any form, with the right to sublicense such rights; and 271a39cfb0SJung-uk Kim * 281a39cfb0SJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 291a39cfb0SJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 301a39cfb0SJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 311a39cfb0SJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 321a39cfb0SJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 331a39cfb0SJung-uk Kim * license, and in no event shall the patent license extend to any additions 341a39cfb0SJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 351a39cfb0SJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 361a39cfb0SJung-uk Kim * 371a39cfb0SJung-uk Kim * The above copyright and patent license is granted only if the following 381a39cfb0SJung-uk Kim * conditions are met: 391a39cfb0SJung-uk Kim * 401a39cfb0SJung-uk Kim * 3. Conditions 411a39cfb0SJung-uk Kim * 421a39cfb0SJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 431a39cfb0SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 441a39cfb0SJung-uk Kim * Code or modification with rights to further distribute source must include 451a39cfb0SJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 461a39cfb0SJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 471a39cfb0SJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 481a39cfb0SJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 491a39cfb0SJung-uk Kim * Code and the date of any change. Licensee must include in that file the 501a39cfb0SJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 511a39cfb0SJung-uk Kim * must include a prominent statement that the modification is derived, 521a39cfb0SJung-uk Kim * directly or indirectly, from Original Intel Code. 531a39cfb0SJung-uk Kim * 541a39cfb0SJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 551a39cfb0SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 561a39cfb0SJung-uk Kim * Code or modification without rights to further distribute source must 571a39cfb0SJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 581a39cfb0SJung-uk Kim * documentation and/or other materials provided with distribution. In 591a39cfb0SJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 601a39cfb0SJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 611a39cfb0SJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 621a39cfb0SJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 631a39cfb0SJung-uk Kim * not to intellectual property embodied in modifications its licensee may 641a39cfb0SJung-uk Kim * make. 651a39cfb0SJung-uk Kim * 661a39cfb0SJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 671a39cfb0SJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 681a39cfb0SJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 691a39cfb0SJung-uk Kim * provision in the documentation and/or other materials provided with the 701a39cfb0SJung-uk Kim * distribution. 711a39cfb0SJung-uk Kim * 721a39cfb0SJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 731a39cfb0SJung-uk Kim * Intel Code. 741a39cfb0SJung-uk Kim * 751a39cfb0SJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 761a39cfb0SJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 771a39cfb0SJung-uk Kim * other dealings in products derived from or relating to the Covered Code 781a39cfb0SJung-uk Kim * without prior written authorization from Intel. 791a39cfb0SJung-uk Kim * 801a39cfb0SJung-uk Kim * 4. Disclaimer and Export Compliance 811a39cfb0SJung-uk Kim * 821a39cfb0SJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 831a39cfb0SJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 841a39cfb0SJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 851a39cfb0SJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 861a39cfb0SJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 871a39cfb0SJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 881a39cfb0SJung-uk Kim * PARTICULAR PURPOSE. 891a39cfb0SJung-uk Kim * 901a39cfb0SJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 911a39cfb0SJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 921a39cfb0SJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 931a39cfb0SJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 941a39cfb0SJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 951a39cfb0SJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 961a39cfb0SJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 971a39cfb0SJung-uk Kim * LIMITED REMEDY. 981a39cfb0SJung-uk Kim * 991a39cfb0SJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1001a39cfb0SJung-uk Kim * software or system incorporating such software without first obtaining any 1011a39cfb0SJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1021a39cfb0SJung-uk Kim * any other agency or department of the United States Government. In the 1031a39cfb0SJung-uk Kim * event Licensee exports any such software from the United States or 1041a39cfb0SJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1051a39cfb0SJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1061a39cfb0SJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1071a39cfb0SJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1081a39cfb0SJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1091a39cfb0SJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1101a39cfb0SJung-uk Kim * United States government or any agency thereof requires an export license, 1111a39cfb0SJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1121a39cfb0SJung-uk Kim * such license, approval or letter. 1131a39cfb0SJung-uk Kim * 1141a39cfb0SJung-uk Kim *****************************************************************************/ 1151a39cfb0SJung-uk Kim 1161a39cfb0SJung-uk Kim 117ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 118ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 119ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 120ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 121ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h> 122ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 123ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h> 124ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 125ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 1261a39cfb0SJung-uk Kim 1271a39cfb0SJung-uk Kim 1281a39cfb0SJung-uk Kim #define _COMPONENT ACPI_TOOLS 1291a39cfb0SJung-uk Kim ACPI_MODULE_NAME ("adwalk") 1301a39cfb0SJung-uk Kim 1311a39cfb0SJung-uk Kim /* 1321a39cfb0SJung-uk Kim * aslmap - opcode mappings and reserved method names 1331a39cfb0SJung-uk Kim */ 1341a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE 1351a39cfb0SJung-uk Kim AslMapNamedOpcodeToDataType ( 1361a39cfb0SJung-uk Kim UINT16 Opcode); 1371a39cfb0SJung-uk Kim 1381a39cfb0SJung-uk Kim /* Local prototypes */ 1391a39cfb0SJung-uk Kim 1401a39cfb0SJung-uk Kim static ACPI_STATUS 1411a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending ( 1421a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1431a39cfb0SJung-uk Kim UINT32 Level, 1441a39cfb0SJung-uk Kim void *Context); 1451a39cfb0SJung-uk Kim 1461a39cfb0SJung-uk Kim static ACPI_STATUS 1471a39cfb0SJung-uk Kim AcpiDmDumpDescending ( 1481a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1491a39cfb0SJung-uk Kim UINT32 Level, 1501a39cfb0SJung-uk Kim void *Context); 1511a39cfb0SJung-uk Kim 1521a39cfb0SJung-uk Kim static ACPI_STATUS 1531a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp ( 1541a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1551a39cfb0SJung-uk Kim UINT32 Level, 1561a39cfb0SJung-uk Kim void *Context); 1571a39cfb0SJung-uk Kim 1581a39cfb0SJung-uk Kim static ACPI_STATUS 1591a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp ( 1601a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1611a39cfb0SJung-uk Kim UINT32 Level, 1621a39cfb0SJung-uk Kim void *Context); 1631a39cfb0SJung-uk Kim 1641a39cfb0SJung-uk Kim static ACPI_STATUS 1651a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp ( 1661a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1671a39cfb0SJung-uk Kim UINT32 Level, 1681a39cfb0SJung-uk Kim void *Context); 1691a39cfb0SJung-uk Kim 1701a39cfb0SJung-uk Kim static UINT32 1711a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs ( 1721a39cfb0SJung-uk Kim UINT32 CurrentOpArgCount, 1731a39cfb0SJung-uk Kim UINT32 TargetCount, 1741a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op); 1751a39cfb0SJung-uk Kim 1761a39cfb0SJung-uk Kim static ACPI_STATUS 1771a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp ( 1781a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1791a39cfb0SJung-uk Kim UINT32 Level, 1801a39cfb0SJung-uk Kim void *Context); 1811a39cfb0SJung-uk Kim 1821a39cfb0SJung-uk Kim 1831a39cfb0SJung-uk Kim /******************************************************************************* 1841a39cfb0SJung-uk Kim * 1851a39cfb0SJung-uk Kim * FUNCTION: AcpiDmDumpTree 1861a39cfb0SJung-uk Kim * 1871a39cfb0SJung-uk Kim * PARAMETERS: Origin - Starting object 1881a39cfb0SJung-uk Kim * 1891a39cfb0SJung-uk Kim * RETURN: None 1901a39cfb0SJung-uk Kim * 1911a39cfb0SJung-uk Kim * DESCRIPTION: Parse tree walk to format and output the nodes 1921a39cfb0SJung-uk Kim * 1931a39cfb0SJung-uk Kim ******************************************************************************/ 1941a39cfb0SJung-uk Kim 1951a39cfb0SJung-uk Kim void 1961a39cfb0SJung-uk Kim AcpiDmDumpTree ( 1971a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Origin) 1981a39cfb0SJung-uk Kim { 1991a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 2001a39cfb0SJung-uk Kim 2011a39cfb0SJung-uk Kim 2021a39cfb0SJung-uk Kim if (!Origin) 2031a39cfb0SJung-uk Kim { 2041a39cfb0SJung-uk Kim return; 2051a39cfb0SJung-uk Kim } 2061a39cfb0SJung-uk Kim 2071a39cfb0SJung-uk Kim AcpiOsPrintf ("/*\nAML Parse Tree\n\n"); 2081a39cfb0SJung-uk Kim Info.Flags = 0; 2091a39cfb0SJung-uk Kim Info.Count = 0; 2101a39cfb0SJung-uk Kim Info.Level = 0; 2111a39cfb0SJung-uk Kim Info.WalkState = NULL; 2121a39cfb0SJung-uk Kim AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info); 2131a39cfb0SJung-uk Kim AcpiOsPrintf ("*/\n\n"); 2141a39cfb0SJung-uk Kim } 2151a39cfb0SJung-uk Kim 2161a39cfb0SJung-uk Kim 2171a39cfb0SJung-uk Kim /******************************************************************************* 2181a39cfb0SJung-uk Kim * 2191a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFindOrphanMethods 2201a39cfb0SJung-uk Kim * 2211a39cfb0SJung-uk Kim * PARAMETERS: Origin - Starting object 2221a39cfb0SJung-uk Kim * 2231a39cfb0SJung-uk Kim * RETURN: None 2241a39cfb0SJung-uk Kim * 2251a39cfb0SJung-uk Kim * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods 2261a39cfb0SJung-uk Kim * that are not resolved in the namespace 2271a39cfb0SJung-uk Kim * 2281a39cfb0SJung-uk Kim ******************************************************************************/ 2291a39cfb0SJung-uk Kim 2301a39cfb0SJung-uk Kim void 2311a39cfb0SJung-uk Kim AcpiDmFindOrphanMethods ( 2321a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Origin) 2331a39cfb0SJung-uk Kim { 2341a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 2351a39cfb0SJung-uk Kim 2361a39cfb0SJung-uk Kim 2371a39cfb0SJung-uk Kim if (!Origin) 2381a39cfb0SJung-uk Kim { 2391a39cfb0SJung-uk Kim return; 2401a39cfb0SJung-uk Kim } 2411a39cfb0SJung-uk Kim 2421a39cfb0SJung-uk Kim Info.Flags = 0; 2431a39cfb0SJung-uk Kim Info.Level = 0; 2441a39cfb0SJung-uk Kim Info.WalkState = NULL; 2451a39cfb0SJung-uk Kim AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info); 2461a39cfb0SJung-uk Kim } 2471a39cfb0SJung-uk Kim 2481a39cfb0SJung-uk Kim 2491a39cfb0SJung-uk Kim /******************************************************************************* 2501a39cfb0SJung-uk Kim * 2511a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFinishNamespaceLoad 2521a39cfb0SJung-uk Kim * 2531a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree 2541a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace 255a9f12690SJung-uk Kim * OwnerId - OwnerId of the table to be disassembled 2561a39cfb0SJung-uk Kim * 2571a39cfb0SJung-uk Kim * RETURN: None 2581a39cfb0SJung-uk Kim * 2591a39cfb0SJung-uk Kim * DESCRIPTION: Load all namespace items that are created within control 2601a39cfb0SJung-uk Kim * methods. Used before namespace cross reference 2611a39cfb0SJung-uk Kim * 2621a39cfb0SJung-uk Kim ******************************************************************************/ 2631a39cfb0SJung-uk Kim 2641a39cfb0SJung-uk Kim void 2651a39cfb0SJung-uk Kim AcpiDmFinishNamespaceLoad ( 2661a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot, 267a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot, 268a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId) 2691a39cfb0SJung-uk Kim { 2701a39cfb0SJung-uk Kim ACPI_STATUS Status; 2711a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 2721a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 2731a39cfb0SJung-uk Kim 2741a39cfb0SJung-uk Kim 2751a39cfb0SJung-uk Kim if (!ParseTreeRoot) 2761a39cfb0SJung-uk Kim { 2771a39cfb0SJung-uk Kim return; 2781a39cfb0SJung-uk Kim } 2791a39cfb0SJung-uk Kim 2801a39cfb0SJung-uk Kim /* Create and initialize a new walk state */ 2811a39cfb0SJung-uk Kim 282a9f12690SJung-uk Kim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 2831a39cfb0SJung-uk Kim if (!WalkState) 2841a39cfb0SJung-uk Kim { 2851a39cfb0SJung-uk Kim return; 2861a39cfb0SJung-uk Kim } 2871a39cfb0SJung-uk Kim 2881a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 2891a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 2901a39cfb0SJung-uk Kim { 2911a39cfb0SJung-uk Kim return; 2921a39cfb0SJung-uk Kim } 2931a39cfb0SJung-uk Kim 2941a39cfb0SJung-uk Kim Info.Flags = 0; 2951a39cfb0SJung-uk Kim Info.Level = 0; 2961a39cfb0SJung-uk Kim Info.WalkState = WalkState; 2971a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp, 2981a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info); 2991a39cfb0SJung-uk Kim ACPI_FREE (WalkState); 3001a39cfb0SJung-uk Kim } 3011a39cfb0SJung-uk Kim 3021a39cfb0SJung-uk Kim 3031a39cfb0SJung-uk Kim /******************************************************************************* 3041a39cfb0SJung-uk Kim * 3051a39cfb0SJung-uk Kim * FUNCTION: AcpiDmCrossReferenceNamespace 3061a39cfb0SJung-uk Kim * 3071a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree 3081a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace 309a9f12690SJung-uk Kim * OwnerId - OwnerId of the table to be disassembled 3101a39cfb0SJung-uk Kim * 3111a39cfb0SJung-uk Kim * RETURN: None 3121a39cfb0SJung-uk Kim * 3131a39cfb0SJung-uk Kim * DESCRIPTION: Cross reference the namespace to create externals 3141a39cfb0SJung-uk Kim * 3151a39cfb0SJung-uk Kim ******************************************************************************/ 3161a39cfb0SJung-uk Kim 3171a39cfb0SJung-uk Kim void 3181a39cfb0SJung-uk Kim AcpiDmCrossReferenceNamespace ( 3191a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot, 320a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot, 321a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId) 3221a39cfb0SJung-uk Kim { 3231a39cfb0SJung-uk Kim ACPI_STATUS Status; 3241a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 3251a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 3261a39cfb0SJung-uk Kim 3271a39cfb0SJung-uk Kim 3281a39cfb0SJung-uk Kim if (!ParseTreeRoot) 3291a39cfb0SJung-uk Kim { 3301a39cfb0SJung-uk Kim return; 3311a39cfb0SJung-uk Kim } 3321a39cfb0SJung-uk Kim 3331a39cfb0SJung-uk Kim /* Create and initialize a new walk state */ 3341a39cfb0SJung-uk Kim 335a9f12690SJung-uk Kim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 3361a39cfb0SJung-uk Kim if (!WalkState) 3371a39cfb0SJung-uk Kim { 3381a39cfb0SJung-uk Kim return; 3391a39cfb0SJung-uk Kim } 3401a39cfb0SJung-uk Kim 3411a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 3421a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 3431a39cfb0SJung-uk Kim { 3441a39cfb0SJung-uk Kim return; 3451a39cfb0SJung-uk Kim } 3461a39cfb0SJung-uk Kim 3471a39cfb0SJung-uk Kim Info.Flags = 0; 3481a39cfb0SJung-uk Kim Info.Level = 0; 3491a39cfb0SJung-uk Kim Info.WalkState = WalkState; 3501a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp, 3511a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info); 3521a39cfb0SJung-uk Kim ACPI_FREE (WalkState); 3531a39cfb0SJung-uk Kim } 3541a39cfb0SJung-uk Kim 3551a39cfb0SJung-uk Kim 3561a39cfb0SJung-uk Kim /******************************************************************************* 3571a39cfb0SJung-uk Kim * 3581a39cfb0SJung-uk Kim * FUNCTION: AcpiDmConvertResourceIndexes 3591a39cfb0SJung-uk Kim * 3601a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree 3611a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace 3621a39cfb0SJung-uk Kim * 3631a39cfb0SJung-uk Kim * RETURN: None 3641a39cfb0SJung-uk Kim * 3651a39cfb0SJung-uk Kim * DESCRIPTION: Convert fixed-offset references to resource descriptors to 3661a39cfb0SJung-uk Kim * symbolic references. Should only be called after namespace has 3671a39cfb0SJung-uk Kim * been cross referenced. 3681a39cfb0SJung-uk Kim * 3691a39cfb0SJung-uk Kim ******************************************************************************/ 3701a39cfb0SJung-uk Kim 3711a39cfb0SJung-uk Kim void 3721a39cfb0SJung-uk Kim AcpiDmConvertResourceIndexes ( 3731a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot, 3741a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot) 3751a39cfb0SJung-uk Kim { 3761a39cfb0SJung-uk Kim ACPI_STATUS Status; 3771a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 3781a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 3791a39cfb0SJung-uk Kim 3801a39cfb0SJung-uk Kim 3811a39cfb0SJung-uk Kim if (!ParseTreeRoot) 3821a39cfb0SJung-uk Kim { 3831a39cfb0SJung-uk Kim return; 3841a39cfb0SJung-uk Kim } 3851a39cfb0SJung-uk Kim 3861a39cfb0SJung-uk Kim /* Create and initialize a new walk state */ 3871a39cfb0SJung-uk Kim 3881a39cfb0SJung-uk Kim WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL); 3891a39cfb0SJung-uk Kim if (!WalkState) 3901a39cfb0SJung-uk Kim { 3911a39cfb0SJung-uk Kim return; 3921a39cfb0SJung-uk Kim } 3931a39cfb0SJung-uk Kim 3941a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 3951a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 3961a39cfb0SJung-uk Kim { 3971a39cfb0SJung-uk Kim return; 3981a39cfb0SJung-uk Kim } 3991a39cfb0SJung-uk Kim 4001a39cfb0SJung-uk Kim Info.Flags = 0; 4011a39cfb0SJung-uk Kim Info.Level = 0; 4021a39cfb0SJung-uk Kim Info.WalkState = WalkState; 4031a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp, 4041a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info); 4051a39cfb0SJung-uk Kim ACPI_FREE (WalkState); 4061a39cfb0SJung-uk Kim return; 4071a39cfb0SJung-uk Kim } 4081a39cfb0SJung-uk Kim 4091a39cfb0SJung-uk Kim 4101a39cfb0SJung-uk Kim /******************************************************************************* 4111a39cfb0SJung-uk Kim * 4121a39cfb0SJung-uk Kim * FUNCTION: AcpiDmDumpDescending 4131a39cfb0SJung-uk Kim * 4141a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 4151a39cfb0SJung-uk Kim * 4161a39cfb0SJung-uk Kim * RETURN: Status 4171a39cfb0SJung-uk Kim * 4181a39cfb0SJung-uk Kim * DESCRIPTION: Format and print contents of one parse Op. 4191a39cfb0SJung-uk Kim * 4201a39cfb0SJung-uk Kim ******************************************************************************/ 4211a39cfb0SJung-uk Kim 4221a39cfb0SJung-uk Kim static ACPI_STATUS 4231a39cfb0SJung-uk Kim AcpiDmDumpDescending ( 4241a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 4251a39cfb0SJung-uk Kim UINT32 Level, 4261a39cfb0SJung-uk Kim void *Context) 4271a39cfb0SJung-uk Kim { 4281a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 4291a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 4301a39cfb0SJung-uk Kim char *Path; 4311a39cfb0SJung-uk Kim 4321a39cfb0SJung-uk Kim 4331a39cfb0SJung-uk Kim if (!Op) 4341a39cfb0SJung-uk Kim { 4351a39cfb0SJung-uk Kim return (AE_OK); 4361a39cfb0SJung-uk Kim } 4371a39cfb0SJung-uk Kim 4381a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 4391a39cfb0SJung-uk Kim Info->Count++; 4401a39cfb0SJung-uk Kim 4411a39cfb0SJung-uk Kim /* Most of the information (count, level, name) here */ 4421a39cfb0SJung-uk Kim 4431a39cfb0SJung-uk Kim AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level); 4441a39cfb0SJung-uk Kim AcpiDmIndent (Level); 4451a39cfb0SJung-uk Kim AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode)); 4461a39cfb0SJung-uk Kim 4471a39cfb0SJung-uk Kim /* Extra info is helpful */ 4481a39cfb0SJung-uk Kim 4491a39cfb0SJung-uk Kim switch (Op->Common.AmlOpcode) 4501a39cfb0SJung-uk Kim { 4511a39cfb0SJung-uk Kim case AML_BYTE_OP: 4521a39cfb0SJung-uk Kim case AML_WORD_OP: 4531a39cfb0SJung-uk Kim case AML_DWORD_OP: 4541a39cfb0SJung-uk Kim AcpiOsPrintf ("%X", (UINT32) Op->Common.Value.Integer); 4551a39cfb0SJung-uk Kim break; 4561a39cfb0SJung-uk Kim 4571a39cfb0SJung-uk Kim case AML_INT_NAMEPATH_OP: 4581a39cfb0SJung-uk Kim if (Op->Common.Value.String) 4591a39cfb0SJung-uk Kim { 4601a39cfb0SJung-uk Kim AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String, 4611a39cfb0SJung-uk Kim NULL, &Path); 4621a39cfb0SJung-uk Kim AcpiOsPrintf ("%s %p", Path, Op->Common.Node); 4631a39cfb0SJung-uk Kim ACPI_FREE (Path); 4641a39cfb0SJung-uk Kim } 4651a39cfb0SJung-uk Kim else 4661a39cfb0SJung-uk Kim { 4671a39cfb0SJung-uk Kim AcpiOsPrintf ("[NULL]"); 4681a39cfb0SJung-uk Kim } 4691a39cfb0SJung-uk Kim break; 4701a39cfb0SJung-uk Kim 4711a39cfb0SJung-uk Kim case AML_NAME_OP: 4721a39cfb0SJung-uk Kim case AML_METHOD_OP: 4731a39cfb0SJung-uk Kim case AML_DEVICE_OP: 4741a39cfb0SJung-uk Kim case AML_INT_NAMEDFIELD_OP: 4751a39cfb0SJung-uk Kim AcpiOsPrintf ("%4.4s", &Op->Named.Name); 4761a39cfb0SJung-uk Kim break; 477a9f12690SJung-uk Kim 478a9f12690SJung-uk Kim default: 479a9f12690SJung-uk Kim break; 4801a39cfb0SJung-uk Kim } 4811a39cfb0SJung-uk Kim 4821a39cfb0SJung-uk Kim AcpiOsPrintf ("\n"); 4831a39cfb0SJung-uk Kim return (AE_OK); 4841a39cfb0SJung-uk Kim } 4851a39cfb0SJung-uk Kim 4861a39cfb0SJung-uk Kim 4871a39cfb0SJung-uk Kim /******************************************************************************* 4881a39cfb0SJung-uk Kim * 4891a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFindOrphanDescending 4901a39cfb0SJung-uk Kim * 4911a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 4921a39cfb0SJung-uk Kim * 4931a39cfb0SJung-uk Kim * RETURN: Status 4941a39cfb0SJung-uk Kim * 4951a39cfb0SJung-uk Kim * DESCRIPTION: Check namepath Ops for orphaned method invocations 4961a39cfb0SJung-uk Kim * 4971a39cfb0SJung-uk Kim * Note: Experimental. 4981a39cfb0SJung-uk Kim * 4991a39cfb0SJung-uk Kim ******************************************************************************/ 5001a39cfb0SJung-uk Kim 5011a39cfb0SJung-uk Kim static ACPI_STATUS 5021a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending ( 5031a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 5041a39cfb0SJung-uk Kim UINT32 Level, 5051a39cfb0SJung-uk Kim void *Context) 5061a39cfb0SJung-uk Kim { 5071a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 5081a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ChildOp; 5091a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 5101a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp; 5111a39cfb0SJung-uk Kim UINT32 ArgCount; 5121a39cfb0SJung-uk Kim 5131a39cfb0SJung-uk Kim 5141a39cfb0SJung-uk Kim if (!Op) 5151a39cfb0SJung-uk Kim { 5161a39cfb0SJung-uk Kim return (AE_OK); 5171a39cfb0SJung-uk Kim } 5181a39cfb0SJung-uk Kim 5191a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 5201a39cfb0SJung-uk Kim 5211a39cfb0SJung-uk Kim switch (Op->Common.AmlOpcode) 5221a39cfb0SJung-uk Kim { 5231a39cfb0SJung-uk Kim #ifdef ACPI_UNDER_DEVELOPMENT 5241a39cfb0SJung-uk Kim case AML_ADD_OP: 5251a39cfb0SJung-uk Kim ChildOp = Op->Common.Value.Arg; 5261a39cfb0SJung-uk Kim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 5271a39cfb0SJung-uk Kim !ChildOp->Common.Node) 5281a39cfb0SJung-uk Kim { 5291a39cfb0SJung-uk Kim AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String, 5301a39cfb0SJung-uk Kim NULL, &Path); 5311a39cfb0SJung-uk Kim AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s */\n", Op->Common.AmlOpName, Path); 5321a39cfb0SJung-uk Kim ACPI_FREE (Path); 5331a39cfb0SJung-uk Kim 5341a39cfb0SJung-uk Kim NextOp = Op->Common.Next; 5351a39cfb0SJung-uk Kim if (!NextOp) 5361a39cfb0SJung-uk Kim { 5371a39cfb0SJung-uk Kim /* This NamePath has no args, assume it is an integer */ 5381a39cfb0SJung-uk Kim 5391a39cfb0SJung-uk Kim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 5401a39cfb0SJung-uk Kim return (AE_OK); 5411a39cfb0SJung-uk Kim } 5421a39cfb0SJung-uk Kim 5431a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp); 5441a39cfb0SJung-uk Kim AcpiOsPrintf ("/* A-CHILDREN: %d Actual %d */\n", ArgCount, AcpiDmCountChildren (Op)); 5451a39cfb0SJung-uk Kim 5461a39cfb0SJung-uk Kim if (ArgCount < 1) 5471a39cfb0SJung-uk Kim { 5481a39cfb0SJung-uk Kim /* One Arg means this is just a Store(Name,Target) */ 5491a39cfb0SJung-uk Kim 5501a39cfb0SJung-uk Kim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 5511a39cfb0SJung-uk Kim return (AE_OK); 5521a39cfb0SJung-uk Kim } 5531a39cfb0SJung-uk Kim 5541a39cfb0SJung-uk Kim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 5551a39cfb0SJung-uk Kim } 5561a39cfb0SJung-uk Kim break; 5571a39cfb0SJung-uk Kim #endif 5581a39cfb0SJung-uk Kim 5591a39cfb0SJung-uk Kim case AML_STORE_OP: 5601a39cfb0SJung-uk Kim 5611a39cfb0SJung-uk Kim ChildOp = Op->Common.Value.Arg; 5621a39cfb0SJung-uk Kim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 5631a39cfb0SJung-uk Kim !ChildOp->Common.Node) 5641a39cfb0SJung-uk Kim { 5651a39cfb0SJung-uk Kim NextOp = Op->Common.Next; 5661a39cfb0SJung-uk Kim if (!NextOp) 5671a39cfb0SJung-uk Kim { 5681a39cfb0SJung-uk Kim /* This NamePath has no args, assume it is an integer */ 5691a39cfb0SJung-uk Kim 5701a39cfb0SJung-uk Kim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 5711a39cfb0SJung-uk Kim return (AE_OK); 5721a39cfb0SJung-uk Kim } 5731a39cfb0SJung-uk Kim 5741a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp); 5751a39cfb0SJung-uk Kim if (ArgCount <= 1) 5761a39cfb0SJung-uk Kim { 5771a39cfb0SJung-uk Kim /* One Arg means this is just a Store(Name,Target) */ 5781a39cfb0SJung-uk Kim 5791a39cfb0SJung-uk Kim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 5801a39cfb0SJung-uk Kim return (AE_OK); 5811a39cfb0SJung-uk Kim } 5821a39cfb0SJung-uk Kim 5831a39cfb0SJung-uk Kim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 5841a39cfb0SJung-uk Kim } 5851a39cfb0SJung-uk Kim break; 5861a39cfb0SJung-uk Kim 5871a39cfb0SJung-uk Kim case AML_INT_NAMEPATH_OP: 5881a39cfb0SJung-uk Kim 5891a39cfb0SJung-uk Kim /* Must examine parent to see if this namepath is an argument */ 5901a39cfb0SJung-uk Kim 5911a39cfb0SJung-uk Kim ParentOp = Op->Common.Parent; 5921a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode); 5931a39cfb0SJung-uk Kim 5941a39cfb0SJung-uk Kim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 5951a39cfb0SJung-uk Kim (OpInfo->Class != AML_CLASS_CREATE) && 5961a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) && 5971a39cfb0SJung-uk Kim !Op->Common.Node) 5981a39cfb0SJung-uk Kim { 5991a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next); 6001a39cfb0SJung-uk Kim 6011a39cfb0SJung-uk Kim /* 6021a39cfb0SJung-uk Kim * Check if namepath is a predicate for if/while or lone parameter to 6031a39cfb0SJung-uk Kim * a return. 6041a39cfb0SJung-uk Kim */ 6051a39cfb0SJung-uk Kim if (ArgCount == 0) 6061a39cfb0SJung-uk Kim { 6071a39cfb0SJung-uk Kim if (((ParentOp->Common.AmlOpcode == AML_IF_OP) || 6081a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_WHILE_OP) || 6091a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) && 6101a39cfb0SJung-uk Kim 6111a39cfb0SJung-uk Kim /* And namepath is the first argument */ 6121a39cfb0SJung-uk Kim (ParentOp->Common.Value.Arg == Op)) 6131a39cfb0SJung-uk Kim { 6141a39cfb0SJung-uk Kim AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_INTEGER, 0); 6151a39cfb0SJung-uk Kim break; 6161a39cfb0SJung-uk Kim } 6171a39cfb0SJung-uk Kim } 6181a39cfb0SJung-uk Kim 6191a39cfb0SJung-uk Kim /* 6201a39cfb0SJung-uk Kim * This is a standalone namestring (not a parameter to another 6211a39cfb0SJung-uk Kim * operator) - it *must* be a method invocation, nothing else is 6221a39cfb0SJung-uk Kim * grammatically possible. 6231a39cfb0SJung-uk Kim */ 6241a39cfb0SJung-uk Kim AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 6251a39cfb0SJung-uk Kim 6261a39cfb0SJung-uk Kim } 6271a39cfb0SJung-uk Kim break; 628a9f12690SJung-uk Kim 629a9f12690SJung-uk Kim default: 630a9f12690SJung-uk Kim break; 6311a39cfb0SJung-uk Kim } 6321a39cfb0SJung-uk Kim 6331a39cfb0SJung-uk Kim return (AE_OK); 6341a39cfb0SJung-uk Kim } 6351a39cfb0SJung-uk Kim 6361a39cfb0SJung-uk Kim 6371a39cfb0SJung-uk Kim /******************************************************************************* 6381a39cfb0SJung-uk Kim * 6391a39cfb0SJung-uk Kim * FUNCTION: AcpiDmLoadDescendingOp 6401a39cfb0SJung-uk Kim * 6411a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 6421a39cfb0SJung-uk Kim * 6431a39cfb0SJung-uk Kim * RETURN: Status 6441a39cfb0SJung-uk Kim * 6451a39cfb0SJung-uk Kim * DESCRIPTION: Descending handler for namespace control method object load 6461a39cfb0SJung-uk Kim * 6471a39cfb0SJung-uk Kim ******************************************************************************/ 6481a39cfb0SJung-uk Kim 6491a39cfb0SJung-uk Kim static ACPI_STATUS 6501a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp ( 6511a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 6521a39cfb0SJung-uk Kim UINT32 Level, 6531a39cfb0SJung-uk Kim void *Context) 6541a39cfb0SJung-uk Kim { 6551a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 6561a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 6571a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 6581a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 6591a39cfb0SJung-uk Kim ACPI_STATUS Status; 6601a39cfb0SJung-uk Kim char *Path = NULL; 6611a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 6621a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 663a9f12690SJung-uk Kim char FieldPath[5]; 664a9f12690SJung-uk Kim BOOLEAN PreDefined = FALSE; 665a9f12690SJung-uk Kim UINT8 PreDefineIndex = 0; 6661a39cfb0SJung-uk Kim 6671a39cfb0SJung-uk Kim 6681a39cfb0SJung-uk Kim WalkState = Info->WalkState; 6691a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 6701a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 6711a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 6721a39cfb0SJung-uk Kim 6731a39cfb0SJung-uk Kim /* Only interested in operators that create new names */ 6741a39cfb0SJung-uk Kim 6751a39cfb0SJung-uk Kim if (!(OpInfo->Flags & AML_NAMED) && 6761a39cfb0SJung-uk Kim !(OpInfo->Flags & AML_CREATE)) 6771a39cfb0SJung-uk Kim { 6781a39cfb0SJung-uk Kim goto Exit; 6791a39cfb0SJung-uk Kim } 6801a39cfb0SJung-uk Kim 6811a39cfb0SJung-uk Kim /* Get the NamePath from the appropriate place */ 6821a39cfb0SJung-uk Kim 6831a39cfb0SJung-uk Kim if (OpInfo->Flags & AML_NAMED) 6841a39cfb0SJung-uk Kim { 6851a39cfb0SJung-uk Kim /* For all named operators, get the new name */ 6861a39cfb0SJung-uk Kim 6871a39cfb0SJung-uk Kim Path = (char *) Op->Named.Path; 688a9f12690SJung-uk Kim 689a9f12690SJung-uk Kim if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) 690a9f12690SJung-uk Kim { 691a9f12690SJung-uk Kim *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name; 692a9f12690SJung-uk Kim FieldPath[4] = 0; 693a9f12690SJung-uk Kim Path = FieldPath; 694a9f12690SJung-uk Kim } 6951a39cfb0SJung-uk Kim } 6961a39cfb0SJung-uk Kim else if (OpInfo->Flags & AML_CREATE) 6971a39cfb0SJung-uk Kim { 6981a39cfb0SJung-uk Kim /* New name is the last child */ 6991a39cfb0SJung-uk Kim 7001a39cfb0SJung-uk Kim NextOp = Op->Common.Value.Arg; 7011a39cfb0SJung-uk Kim 7021a39cfb0SJung-uk Kim while (NextOp->Common.Next) 7031a39cfb0SJung-uk Kim { 7041a39cfb0SJung-uk Kim NextOp = NextOp->Common.Next; 7051a39cfb0SJung-uk Kim } 7061a39cfb0SJung-uk Kim Path = NextOp->Common.Value.String; 7071a39cfb0SJung-uk Kim } 7081a39cfb0SJung-uk Kim 7091a39cfb0SJung-uk Kim if (!Path) 7101a39cfb0SJung-uk Kim { 7111a39cfb0SJung-uk Kim goto Exit; 7121a39cfb0SJung-uk Kim } 7131a39cfb0SJung-uk Kim 7141a39cfb0SJung-uk Kim /* Insert the name into the namespace */ 7151a39cfb0SJung-uk Kim 7161a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 7171a39cfb0SJung-uk Kim ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE, 7181a39cfb0SJung-uk Kim WalkState, &Node); 7191a39cfb0SJung-uk Kim 7201a39cfb0SJung-uk Kim Op->Common.Node = Node; 7211a39cfb0SJung-uk Kim 722a9f12690SJung-uk Kim if (ACPI_SUCCESS (Status)) 723a9f12690SJung-uk Kim { 724a9f12690SJung-uk Kim /* Check if it's a predefined node */ 725a9f12690SJung-uk Kim 726a9f12690SJung-uk Kim while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name) 727a9f12690SJung-uk Kim { 728a9f12690SJung-uk Kim if (!ACPI_STRNCMP (Node->Name.Ascii, 729a9f12690SJung-uk Kim AcpiGbl_PreDefinedNames[PreDefineIndex].Name, 4)) 730a9f12690SJung-uk Kim { 731a9f12690SJung-uk Kim PreDefined = TRUE; 732a9f12690SJung-uk Kim break; 733a9f12690SJung-uk Kim } 734a9f12690SJung-uk Kim 735a9f12690SJung-uk Kim PreDefineIndex++; 736a9f12690SJung-uk Kim } 737a9f12690SJung-uk Kim 738a9f12690SJung-uk Kim /* 739a9f12690SJung-uk Kim * Set node owner id if it satisfies all the following conditions: 740a9f12690SJung-uk Kim * 1) Not a predefined node, _SB_ etc 741a9f12690SJung-uk Kim * 2) Not the root node 742a9f12690SJung-uk Kim * 3) Not a node created by Scope 743a9f12690SJung-uk Kim */ 744a9f12690SJung-uk Kim 745a9f12690SJung-uk Kim if (!PreDefined && Node != AcpiGbl_RootNode && 746a9f12690SJung-uk Kim Op->Common.AmlOpcode != AML_SCOPE_OP) 747a9f12690SJung-uk Kim { 748a9f12690SJung-uk Kim Node->OwnerId = WalkState->OwnerId; 749a9f12690SJung-uk Kim } 750a9f12690SJung-uk Kim } 751a9f12690SJung-uk Kim 7521a39cfb0SJung-uk Kim 7531a39cfb0SJung-uk Kim Exit: 7541a39cfb0SJung-uk Kim 7551a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 7561a39cfb0SJung-uk Kim { 7571a39cfb0SJung-uk Kim if (Op->Common.Node) 7581a39cfb0SJung-uk Kim { 7591a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 7601a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 7611a39cfb0SJung-uk Kim { 7621a39cfb0SJung-uk Kim return (Status); 7631a39cfb0SJung-uk Kim } 7641a39cfb0SJung-uk Kim } 7651a39cfb0SJung-uk Kim } 7661a39cfb0SJung-uk Kim 7671a39cfb0SJung-uk Kim return (AE_OK); 7681a39cfb0SJung-uk Kim } 7691a39cfb0SJung-uk Kim 7701a39cfb0SJung-uk Kim 7711a39cfb0SJung-uk Kim /******************************************************************************* 7721a39cfb0SJung-uk Kim * 7731a39cfb0SJung-uk Kim * FUNCTION: AcpiDmXrefDescendingOp 7741a39cfb0SJung-uk Kim * 7751a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 7761a39cfb0SJung-uk Kim * 7771a39cfb0SJung-uk Kim * RETURN: Status 7781a39cfb0SJung-uk Kim * 7791a39cfb0SJung-uk Kim * DESCRIPTION: Descending handler for namespace cross reference 7801a39cfb0SJung-uk Kim * 7811a39cfb0SJung-uk Kim ******************************************************************************/ 7821a39cfb0SJung-uk Kim 7831a39cfb0SJung-uk Kim static ACPI_STATUS 7841a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp ( 7851a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 7861a39cfb0SJung-uk Kim UINT32 Level, 7871a39cfb0SJung-uk Kim void *Context) 7881a39cfb0SJung-uk Kim { 7891a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 7901a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 7911a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 7921a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 793a9f12690SJung-uk Kim ACPI_OBJECT_TYPE ObjectType2; 7941a39cfb0SJung-uk Kim ACPI_STATUS Status; 7951a39cfb0SJung-uk Kim char *Path = NULL; 7961a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 7971a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 798a9f12690SJung-uk Kim ACPI_OPERAND_OBJECT *Object; 7991a39cfb0SJung-uk Kim 8001a39cfb0SJung-uk Kim 8011a39cfb0SJung-uk Kim WalkState = Info->WalkState; 8021a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 8031a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 8041a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 8051a39cfb0SJung-uk Kim 8061a39cfb0SJung-uk Kim if ((!(OpInfo->Flags & AML_NAMED)) && 8071a39cfb0SJung-uk Kim (!(OpInfo->Flags & AML_CREATE)) && 8081a39cfb0SJung-uk Kim (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP)) 8091a39cfb0SJung-uk Kim { 8101a39cfb0SJung-uk Kim goto Exit; 8111a39cfb0SJung-uk Kim } 8121a39cfb0SJung-uk Kim 8131a39cfb0SJung-uk Kim /* Get the NamePath from the appropriate place */ 8141a39cfb0SJung-uk Kim 8151a39cfb0SJung-uk Kim if (OpInfo->Flags & AML_NAMED) 8161a39cfb0SJung-uk Kim { 8171a39cfb0SJung-uk Kim if ((Op->Common.AmlOpcode == AML_ALIAS_OP) || 8181a39cfb0SJung-uk Kim (Op->Common.AmlOpcode == AML_SCOPE_OP)) 8191a39cfb0SJung-uk Kim { 8201a39cfb0SJung-uk Kim /* 8211a39cfb0SJung-uk Kim * Only these two operators refer to an existing name, 8221a39cfb0SJung-uk Kim * first argument 8231a39cfb0SJung-uk Kim */ 8241a39cfb0SJung-uk Kim Path = (char *) Op->Named.Path; 8251a39cfb0SJung-uk Kim } 8261a39cfb0SJung-uk Kim } 8271a39cfb0SJung-uk Kim else if (OpInfo->Flags & AML_CREATE) 8281a39cfb0SJung-uk Kim { 8291a39cfb0SJung-uk Kim /* Referenced Buffer Name is the first child */ 8301a39cfb0SJung-uk Kim 8311a39cfb0SJung-uk Kim NextOp = Op->Common.Value.Arg; 8321a39cfb0SJung-uk Kim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 8331a39cfb0SJung-uk Kim { 8341a39cfb0SJung-uk Kim Path = NextOp->Common.Value.String; 8351a39cfb0SJung-uk Kim } 8361a39cfb0SJung-uk Kim } 8371a39cfb0SJung-uk Kim else 8381a39cfb0SJung-uk Kim { 8391a39cfb0SJung-uk Kim Path = Op->Common.Value.String; 8401a39cfb0SJung-uk Kim } 8411a39cfb0SJung-uk Kim 8421a39cfb0SJung-uk Kim if (!Path) 8431a39cfb0SJung-uk Kim { 8441a39cfb0SJung-uk Kim goto Exit; 8451a39cfb0SJung-uk Kim } 8461a39cfb0SJung-uk Kim 8471a39cfb0SJung-uk Kim /* 8481a39cfb0SJung-uk Kim * Lookup the name in the namespace. Name must exist at this point, or it 8491a39cfb0SJung-uk Kim * is an invalid reference. 8501a39cfb0SJung-uk Kim * 8511a39cfb0SJung-uk Kim * The namespace is also used as a lookup table for references to resource 8521a39cfb0SJung-uk Kim * descriptors and the fields within them. 8531a39cfb0SJung-uk Kim */ 8541a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 8551a39cfb0SJung-uk Kim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 8561a39cfb0SJung-uk Kim WalkState, &Node); 8571a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 8581a39cfb0SJung-uk Kim { 8591a39cfb0SJung-uk Kim if (Status == AE_NOT_FOUND) 8601a39cfb0SJung-uk Kim { 8611a39cfb0SJung-uk Kim AcpiDmAddToExternalList (Path, (UINT8) ObjectType, 0); 8621a39cfb0SJung-uk Kim 8631a39cfb0SJung-uk Kim /* 8641a39cfb0SJung-uk Kim * We could install this into the namespace, but we catch duplicate 8651a39cfb0SJung-uk Kim * externals when they are added to the list. 8661a39cfb0SJung-uk Kim */ 8671a39cfb0SJung-uk Kim #if 0 8681a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 8691a39cfb0SJung-uk Kim ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE, 8701a39cfb0SJung-uk Kim WalkState, &Node); 8711a39cfb0SJung-uk Kim #endif 8721a39cfb0SJung-uk Kim } 8731a39cfb0SJung-uk Kim } 874a9f12690SJung-uk Kim 875a9f12690SJung-uk Kim /* 876a9f12690SJung-uk Kim * Found the node in external table, add it to external list 877a9f12690SJung-uk Kim * Node->OwnerId == 0 indicates built-in ACPI Names, _OS_ etc 878a9f12690SJung-uk Kim */ 879a9f12690SJung-uk Kim else if (Node->OwnerId && WalkState->OwnerId != Node->OwnerId) 880a9f12690SJung-uk Kim { 881a9f12690SJung-uk Kim ObjectType2 = ObjectType; 882a9f12690SJung-uk Kim 883a9f12690SJung-uk Kim Object = AcpiNsGetAttachedObject (Node); 884a9f12690SJung-uk Kim if (Object) 885a9f12690SJung-uk Kim { 886a9f12690SJung-uk Kim ObjectType2 = Object->Common.Type; 887a9f12690SJung-uk Kim } 888a9f12690SJung-uk Kim 889a9f12690SJung-uk Kim if (ObjectType2 == ACPI_TYPE_METHOD) 890a9f12690SJung-uk Kim { 891a9f12690SJung-uk Kim AcpiDmAddToExternalList (Path, ACPI_TYPE_METHOD, 892a9f12690SJung-uk Kim Object->Method.ParamCount); 893a9f12690SJung-uk Kim } 894a9f12690SJung-uk Kim else 895a9f12690SJung-uk Kim { 896a9f12690SJung-uk Kim AcpiDmAddToExternalList (Path, (UINT8) ObjectType2, 0); 897a9f12690SJung-uk Kim } 898a9f12690SJung-uk Kim 899a9f12690SJung-uk Kim Op->Common.Node = Node; 900a9f12690SJung-uk Kim } 9011a39cfb0SJung-uk Kim else 9021a39cfb0SJung-uk Kim { 9031a39cfb0SJung-uk Kim Op->Common.Node = Node; 9041a39cfb0SJung-uk Kim } 9051a39cfb0SJung-uk Kim 9061a39cfb0SJung-uk Kim 9071a39cfb0SJung-uk Kim Exit: 9081a39cfb0SJung-uk Kim /* Open new scope if necessary */ 9091a39cfb0SJung-uk Kim 9101a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 9111a39cfb0SJung-uk Kim { 9121a39cfb0SJung-uk Kim if (Op->Common.Node) 9131a39cfb0SJung-uk Kim { 9141a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 9151a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 9161a39cfb0SJung-uk Kim { 9171a39cfb0SJung-uk Kim return (Status); 9181a39cfb0SJung-uk Kim } 9191a39cfb0SJung-uk Kim } 9201a39cfb0SJung-uk Kim } 9211a39cfb0SJung-uk Kim 9221a39cfb0SJung-uk Kim return (AE_OK); 9231a39cfb0SJung-uk Kim } 9241a39cfb0SJung-uk Kim 9251a39cfb0SJung-uk Kim 9261a39cfb0SJung-uk Kim /******************************************************************************* 9271a39cfb0SJung-uk Kim * 9281a39cfb0SJung-uk Kim * FUNCTION: AcpiDmResourceDescendingOp 9291a39cfb0SJung-uk Kim * 9301a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 9311a39cfb0SJung-uk Kim * 9321a39cfb0SJung-uk Kim * RETURN: None 9331a39cfb0SJung-uk Kim * 9341a39cfb0SJung-uk Kim * DESCRIPTION: Process one parse op during symbolic resource index conversion. 9351a39cfb0SJung-uk Kim * 9361a39cfb0SJung-uk Kim ******************************************************************************/ 9371a39cfb0SJung-uk Kim 9381a39cfb0SJung-uk Kim static ACPI_STATUS 9391a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp ( 9401a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 9411a39cfb0SJung-uk Kim UINT32 Level, 9421a39cfb0SJung-uk Kim void *Context) 9431a39cfb0SJung-uk Kim { 9441a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 9451a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 9461a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 9471a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 9481a39cfb0SJung-uk Kim ACPI_STATUS Status; 9491a39cfb0SJung-uk Kim 9501a39cfb0SJung-uk Kim 9511a39cfb0SJung-uk Kim WalkState = Info->WalkState; 9521a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 9531a39cfb0SJung-uk Kim 9541a39cfb0SJung-uk Kim /* Open new scope if necessary */ 9551a39cfb0SJung-uk Kim 9561a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 9571a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 9581a39cfb0SJung-uk Kim { 9591a39cfb0SJung-uk Kim if (Op->Common.Node) 9601a39cfb0SJung-uk Kim { 9611a39cfb0SJung-uk Kim 9621a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 9631a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 9641a39cfb0SJung-uk Kim { 9651a39cfb0SJung-uk Kim return (Status); 9661a39cfb0SJung-uk Kim } 9671a39cfb0SJung-uk Kim } 9681a39cfb0SJung-uk Kim } 9691a39cfb0SJung-uk Kim 9701a39cfb0SJung-uk Kim /* 9711a39cfb0SJung-uk Kim * Check if this operator contains a reference to a resource descriptor. 9721a39cfb0SJung-uk Kim * If so, convert the reference into a symbolic reference. 9731a39cfb0SJung-uk Kim */ 9741a39cfb0SJung-uk Kim AcpiDmCheckResourceReference (Op, WalkState); 9751a39cfb0SJung-uk Kim return (AE_OK); 9761a39cfb0SJung-uk Kim } 9771a39cfb0SJung-uk Kim 9781a39cfb0SJung-uk Kim 9791a39cfb0SJung-uk Kim /******************************************************************************* 9801a39cfb0SJung-uk Kim * 9811a39cfb0SJung-uk Kim * FUNCTION: AcpiDmCommonAscendingOp 9821a39cfb0SJung-uk Kim * 9831a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 9841a39cfb0SJung-uk Kim * 9851a39cfb0SJung-uk Kim * RETURN: None 9861a39cfb0SJung-uk Kim * 9871a39cfb0SJung-uk Kim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes 9881a39cfb0SJung-uk Kim * scope if necessary. 9891a39cfb0SJung-uk Kim * 9901a39cfb0SJung-uk Kim ******************************************************************************/ 9911a39cfb0SJung-uk Kim 9921a39cfb0SJung-uk Kim static ACPI_STATUS 9931a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp ( 9941a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 9951a39cfb0SJung-uk Kim UINT32 Level, 9961a39cfb0SJung-uk Kim void *Context) 9971a39cfb0SJung-uk Kim { 9981a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 9991a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 10001a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 10011a39cfb0SJung-uk Kim 10021a39cfb0SJung-uk Kim 10031a39cfb0SJung-uk Kim /* Close scope if necessary */ 10041a39cfb0SJung-uk Kim 10051a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 10061a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 10071a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 10081a39cfb0SJung-uk Kim 10091a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 10101a39cfb0SJung-uk Kim { 10111a39cfb0SJung-uk Kim (void) AcpiDsScopeStackPop (Info->WalkState); 10121a39cfb0SJung-uk Kim } 10131a39cfb0SJung-uk Kim 10141a39cfb0SJung-uk Kim return (AE_OK); 10151a39cfb0SJung-uk Kim } 10161a39cfb0SJung-uk Kim 10171a39cfb0SJung-uk Kim 10181a39cfb0SJung-uk Kim /******************************************************************************* 10191a39cfb0SJung-uk Kim * 10201a39cfb0SJung-uk Kim * FUNCTION: AcpiDmInspectPossibleArgs 10211a39cfb0SJung-uk Kim * 10221a39cfb0SJung-uk Kim * PARAMETERS: CurrentOpArgCount - Which arg of the current op was the 10231a39cfb0SJung-uk Kim * possible method invocation found 10241a39cfb0SJung-uk Kim * TargetCount - Number of targets (0,1,2) for this op 10251a39cfb0SJung-uk Kim * Op - Parse op 10261a39cfb0SJung-uk Kim * 10271a39cfb0SJung-uk Kim * RETURN: Status 10281a39cfb0SJung-uk Kim * 10291a39cfb0SJung-uk Kim * DESCRIPTION: Examine following args and next ops for possible arguments 10301a39cfb0SJung-uk Kim * for an unrecognized method invocation. 10311a39cfb0SJung-uk Kim * 10321a39cfb0SJung-uk Kim ******************************************************************************/ 10331a39cfb0SJung-uk Kim 10341a39cfb0SJung-uk Kim static UINT32 10351a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs ( 10361a39cfb0SJung-uk Kim UINT32 CurrentOpArgCount, 10371a39cfb0SJung-uk Kim UINT32 TargetCount, 10381a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op) 10391a39cfb0SJung-uk Kim { 10401a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 10411a39cfb0SJung-uk Kim UINT32 i; 10421a39cfb0SJung-uk Kim UINT32 Last = 0; 10431a39cfb0SJung-uk Kim UINT32 Lookahead; 10441a39cfb0SJung-uk Kim 10451a39cfb0SJung-uk Kim 10461a39cfb0SJung-uk Kim Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount; 10471a39cfb0SJung-uk Kim 10481a39cfb0SJung-uk Kim /* Lookahead for the maximum number of possible arguments */ 10491a39cfb0SJung-uk Kim 10501a39cfb0SJung-uk Kim for (i = 0; i < Lookahead; i++) 10511a39cfb0SJung-uk Kim { 10521a39cfb0SJung-uk Kim if (!Op) 10531a39cfb0SJung-uk Kim { 10541a39cfb0SJung-uk Kim break; 10551a39cfb0SJung-uk Kim } 10561a39cfb0SJung-uk Kim 10571a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 10581a39cfb0SJung-uk Kim 10591a39cfb0SJung-uk Kim /* 10601a39cfb0SJung-uk Kim * Any one of these operators is "very probably" not a method arg 10611a39cfb0SJung-uk Kim */ 10621a39cfb0SJung-uk Kim if ((Op->Common.AmlOpcode == AML_STORE_OP) || 10631a39cfb0SJung-uk Kim (Op->Common.AmlOpcode == AML_NOTIFY_OP)) 10641a39cfb0SJung-uk Kim { 10651a39cfb0SJung-uk Kim break; 10661a39cfb0SJung-uk Kim } 10671a39cfb0SJung-uk Kim 10681a39cfb0SJung-uk Kim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 10691a39cfb0SJung-uk Kim (OpInfo->Class != AML_CLASS_CONTROL)) 10701a39cfb0SJung-uk Kim { 10711a39cfb0SJung-uk Kim Last = i+1; 10721a39cfb0SJung-uk Kim } 10731a39cfb0SJung-uk Kim 10741a39cfb0SJung-uk Kim Op = Op->Common.Next; 10751a39cfb0SJung-uk Kim } 10761a39cfb0SJung-uk Kim 10771a39cfb0SJung-uk Kim return (Last); 10781a39cfb0SJung-uk Kim } 10791a39cfb0SJung-uk Kim 10801a39cfb0SJung-uk Kim 1081