xref: /freebsd/sys/contrib/dev/acpica/common/adwalk.c (revision ab6f3bf9cb8ad195aecd9165d8d4b1a93aed3c8d)
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