xref: /freebsd/sys/contrib/dev/acpica/common/adwalk.c (revision 1a39cfb03c6797452971010e59462692d346a22b)
11a39cfb0SJung-uk Kim /******************************************************************************
21a39cfb0SJung-uk Kim  *
31a39cfb0SJung-uk Kim  * Module Name: adwalk - Application-level disassembler parse tree walk routines
41a39cfb0SJung-uk Kim  *              $Revision: 1.6 $
51a39cfb0SJung-uk Kim  *
61a39cfb0SJung-uk Kim  *****************************************************************************/
71a39cfb0SJung-uk Kim 
81a39cfb0SJung-uk Kim /******************************************************************************
91a39cfb0SJung-uk Kim  *
101a39cfb0SJung-uk Kim  * 1. Copyright Notice
111a39cfb0SJung-uk Kim  *
121a39cfb0SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
131a39cfb0SJung-uk Kim  * All rights reserved.
141a39cfb0SJung-uk Kim  *
151a39cfb0SJung-uk Kim  * 2. License
161a39cfb0SJung-uk Kim  *
171a39cfb0SJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
181a39cfb0SJung-uk Kim  * rights.  You may have additional license terms from the party that provided
191a39cfb0SJung-uk Kim  * you this software, covering your right to use that party's intellectual
201a39cfb0SJung-uk Kim  * property rights.
211a39cfb0SJung-uk Kim  *
221a39cfb0SJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
231a39cfb0SJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
241a39cfb0SJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
251a39cfb0SJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
261a39cfb0SJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
271a39cfb0SJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
281a39cfb0SJung-uk Kim  *
291a39cfb0SJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
301a39cfb0SJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
311a39cfb0SJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
321a39cfb0SJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
331a39cfb0SJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
341a39cfb0SJung-uk Kim  * license, and in no event shall the patent license extend to any additions
351a39cfb0SJung-uk Kim  * to or modifications of the Original Intel Code.  No other license or right
361a39cfb0SJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
371a39cfb0SJung-uk Kim  *
381a39cfb0SJung-uk Kim  * The above copyright and patent license is granted only if the following
391a39cfb0SJung-uk Kim  * conditions are met:
401a39cfb0SJung-uk Kim  *
411a39cfb0SJung-uk Kim  * 3. Conditions
421a39cfb0SJung-uk Kim  *
431a39cfb0SJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
441a39cfb0SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
451a39cfb0SJung-uk Kim  * Code or modification with rights to further distribute source must include
461a39cfb0SJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
471a39cfb0SJung-uk Kim  * and the following Disclaimer and Export Compliance provision.  In addition,
481a39cfb0SJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
491a39cfb0SJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
501a39cfb0SJung-uk Kim  * Code and the date of any change.  Licensee must include in that file the
511a39cfb0SJung-uk Kim  * documentation of any changes made by any predecessor Licensee.  Licensee
521a39cfb0SJung-uk Kim  * must include a prominent statement that the modification is derived,
531a39cfb0SJung-uk Kim  * directly or indirectly, from Original Intel Code.
541a39cfb0SJung-uk Kim  *
551a39cfb0SJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
561a39cfb0SJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
571a39cfb0SJung-uk Kim  * Code or modification without rights to further distribute source must
581a39cfb0SJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
591a39cfb0SJung-uk Kim  * documentation and/or other materials provided with distribution.  In
601a39cfb0SJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
611a39cfb0SJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
621a39cfb0SJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
631a39cfb0SJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
641a39cfb0SJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
651a39cfb0SJung-uk Kim  * make.
661a39cfb0SJung-uk Kim  *
671a39cfb0SJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
681a39cfb0SJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
691a39cfb0SJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
701a39cfb0SJung-uk Kim  * provision in the documentation and/or other materials provided with the
711a39cfb0SJung-uk Kim  * distribution.
721a39cfb0SJung-uk Kim  *
731a39cfb0SJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
741a39cfb0SJung-uk Kim  * Intel Code.
751a39cfb0SJung-uk Kim  *
761a39cfb0SJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
771a39cfb0SJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
781a39cfb0SJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
791a39cfb0SJung-uk Kim  * without prior written authorization from Intel.
801a39cfb0SJung-uk Kim  *
811a39cfb0SJung-uk Kim  * 4. Disclaimer and Export Compliance
821a39cfb0SJung-uk Kim  *
831a39cfb0SJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
841a39cfb0SJung-uk Kim  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
851a39cfb0SJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
861a39cfb0SJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
871a39cfb0SJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
881a39cfb0SJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
891a39cfb0SJung-uk Kim  * PARTICULAR PURPOSE.
901a39cfb0SJung-uk Kim  *
911a39cfb0SJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
921a39cfb0SJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
931a39cfb0SJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
941a39cfb0SJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
951a39cfb0SJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
961a39cfb0SJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
971a39cfb0SJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
981a39cfb0SJung-uk Kim  * LIMITED REMEDY.
991a39cfb0SJung-uk Kim  *
1001a39cfb0SJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1011a39cfb0SJung-uk Kim  * software or system incorporating such software without first obtaining any
1021a39cfb0SJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
1031a39cfb0SJung-uk Kim  * any other agency or department of the United States Government.  In the
1041a39cfb0SJung-uk Kim  * event Licensee exports any such software from the United States or
1051a39cfb0SJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
1061a39cfb0SJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
1071a39cfb0SJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
1081a39cfb0SJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1091a39cfb0SJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
1101a39cfb0SJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
1111a39cfb0SJung-uk Kim  * United States government or any agency thereof requires an export license,
1121a39cfb0SJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
1131a39cfb0SJung-uk Kim  * such license, approval or letter.
1141a39cfb0SJung-uk Kim  *
1151a39cfb0SJung-uk Kim  *****************************************************************************/
1161a39cfb0SJung-uk Kim 
1171a39cfb0SJung-uk Kim 
1181a39cfb0SJung-uk Kim #include <contrib/dev/acpica/acpi.h>
1191a39cfb0SJung-uk Kim #include <contrib/dev/acpica/acparser.h>
1201a39cfb0SJung-uk Kim #include <contrib/dev/acpica/amlcode.h>
1211a39cfb0SJung-uk Kim #include <contrib/dev/acpica/acdebug.h>
1221a39cfb0SJung-uk Kim #include <contrib/dev/acpica/acdisasm.h>
1231a39cfb0SJung-uk Kim #include <contrib/dev/acpica/acdispat.h>
1241a39cfb0SJung-uk Kim #include <contrib/dev/acpica/acnamesp.h>
1251a39cfb0SJung-uk Kim #include <contrib/dev/acpica/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
2551a39cfb0SJung-uk Kim  *
2561a39cfb0SJung-uk Kim  * RETURN:      None
2571a39cfb0SJung-uk Kim  *
2581a39cfb0SJung-uk Kim  * DESCRIPTION: Load all namespace items that are created within control
2591a39cfb0SJung-uk Kim  *              methods. Used before namespace cross reference
2601a39cfb0SJung-uk Kim  *
2611a39cfb0SJung-uk Kim  ******************************************************************************/
2621a39cfb0SJung-uk Kim 
2631a39cfb0SJung-uk Kim void
2641a39cfb0SJung-uk Kim AcpiDmFinishNamespaceLoad (
2651a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
2661a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot)
2671a39cfb0SJung-uk Kim {
2681a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
2691a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
2701a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
2711a39cfb0SJung-uk Kim 
2721a39cfb0SJung-uk Kim 
2731a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
2741a39cfb0SJung-uk Kim     {
2751a39cfb0SJung-uk Kim         return;
2761a39cfb0SJung-uk Kim     }
2771a39cfb0SJung-uk Kim 
2781a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
2791a39cfb0SJung-uk Kim 
2801a39cfb0SJung-uk Kim     WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
2811a39cfb0SJung-uk Kim     if (!WalkState)
2821a39cfb0SJung-uk Kim     {
2831a39cfb0SJung-uk Kim         return;
2841a39cfb0SJung-uk Kim     }
2851a39cfb0SJung-uk Kim 
2861a39cfb0SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
2871a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
2881a39cfb0SJung-uk Kim     {
2891a39cfb0SJung-uk Kim         return;
2901a39cfb0SJung-uk Kim     }
2911a39cfb0SJung-uk Kim 
2921a39cfb0SJung-uk Kim     Info.Flags = 0;
2931a39cfb0SJung-uk Kim     Info.Level = 0;
2941a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
2951a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp,
2961a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
2971a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
2981a39cfb0SJung-uk Kim }
2991a39cfb0SJung-uk Kim 
3001a39cfb0SJung-uk Kim 
3011a39cfb0SJung-uk Kim /*******************************************************************************
3021a39cfb0SJung-uk Kim  *
3031a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmCrossReferenceNamespace
3041a39cfb0SJung-uk Kim  *
3051a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
3061a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
3071a39cfb0SJung-uk Kim  *
3081a39cfb0SJung-uk Kim  * RETURN:      None
3091a39cfb0SJung-uk Kim  *
3101a39cfb0SJung-uk Kim  * DESCRIPTION: Cross reference the namespace to create externals
3111a39cfb0SJung-uk Kim  *
3121a39cfb0SJung-uk Kim  ******************************************************************************/
3131a39cfb0SJung-uk Kim 
3141a39cfb0SJung-uk Kim void
3151a39cfb0SJung-uk Kim AcpiDmCrossReferenceNamespace (
3161a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
3171a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot)
3181a39cfb0SJung-uk Kim {
3191a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
3201a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
3211a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
3221a39cfb0SJung-uk Kim 
3231a39cfb0SJung-uk Kim 
3241a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
3251a39cfb0SJung-uk Kim     {
3261a39cfb0SJung-uk Kim         return;
3271a39cfb0SJung-uk Kim     }
3281a39cfb0SJung-uk Kim 
3291a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
3301a39cfb0SJung-uk Kim 
3311a39cfb0SJung-uk Kim     WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
3321a39cfb0SJung-uk Kim     if (!WalkState)
3331a39cfb0SJung-uk Kim     {
3341a39cfb0SJung-uk Kim         return;
3351a39cfb0SJung-uk Kim     }
3361a39cfb0SJung-uk Kim 
3371a39cfb0SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
3381a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
3391a39cfb0SJung-uk Kim     {
3401a39cfb0SJung-uk Kim         return;
3411a39cfb0SJung-uk Kim     }
3421a39cfb0SJung-uk Kim 
3431a39cfb0SJung-uk Kim     Info.Flags = 0;
3441a39cfb0SJung-uk Kim     Info.Level = 0;
3451a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
3461a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp,
3471a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
3481a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
3491a39cfb0SJung-uk Kim }
3501a39cfb0SJung-uk Kim 
3511a39cfb0SJung-uk Kim 
3521a39cfb0SJung-uk Kim /*******************************************************************************
3531a39cfb0SJung-uk Kim  *
3541a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmConvertResourceIndexes
3551a39cfb0SJung-uk Kim  *
3561a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
3571a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
3581a39cfb0SJung-uk Kim  *
3591a39cfb0SJung-uk Kim  * RETURN:      None
3601a39cfb0SJung-uk Kim  *
3611a39cfb0SJung-uk Kim  * DESCRIPTION: Convert fixed-offset references to resource descriptors to
3621a39cfb0SJung-uk Kim  *              symbolic references. Should only be called after namespace has
3631a39cfb0SJung-uk Kim  *              been cross referenced.
3641a39cfb0SJung-uk Kim  *
3651a39cfb0SJung-uk Kim  ******************************************************************************/
3661a39cfb0SJung-uk Kim 
3671a39cfb0SJung-uk Kim void
3681a39cfb0SJung-uk Kim AcpiDmConvertResourceIndexes (
3691a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
3701a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot)
3711a39cfb0SJung-uk Kim {
3721a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
3731a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
3741a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
3751a39cfb0SJung-uk Kim 
3761a39cfb0SJung-uk Kim 
3771a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
3781a39cfb0SJung-uk Kim     {
3791a39cfb0SJung-uk Kim         return;
3801a39cfb0SJung-uk Kim     }
3811a39cfb0SJung-uk Kim 
3821a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
3831a39cfb0SJung-uk Kim 
3841a39cfb0SJung-uk Kim     WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
3851a39cfb0SJung-uk Kim     if (!WalkState)
3861a39cfb0SJung-uk Kim     {
3871a39cfb0SJung-uk Kim         return;
3881a39cfb0SJung-uk Kim     }
3891a39cfb0SJung-uk Kim 
3901a39cfb0SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
3911a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
3921a39cfb0SJung-uk Kim     {
3931a39cfb0SJung-uk Kim         return;
3941a39cfb0SJung-uk Kim     }
3951a39cfb0SJung-uk Kim 
3961a39cfb0SJung-uk Kim     Info.Flags = 0;
3971a39cfb0SJung-uk Kim     Info.Level = 0;
3981a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
3991a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp,
4001a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
4011a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
4021a39cfb0SJung-uk Kim     return;
4031a39cfb0SJung-uk Kim }
4041a39cfb0SJung-uk Kim 
4051a39cfb0SJung-uk Kim 
4061a39cfb0SJung-uk Kim /*******************************************************************************
4071a39cfb0SJung-uk Kim  *
4081a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmDumpDescending
4091a39cfb0SJung-uk Kim  *
4101a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
4111a39cfb0SJung-uk Kim  *
4121a39cfb0SJung-uk Kim  * RETURN:      Status
4131a39cfb0SJung-uk Kim  *
4141a39cfb0SJung-uk Kim  * DESCRIPTION: Format and print contents of one parse Op.
4151a39cfb0SJung-uk Kim  *
4161a39cfb0SJung-uk Kim  ******************************************************************************/
4171a39cfb0SJung-uk Kim 
4181a39cfb0SJung-uk Kim static ACPI_STATUS
4191a39cfb0SJung-uk Kim AcpiDmDumpDescending (
4201a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
4211a39cfb0SJung-uk Kim     UINT32                  Level,
4221a39cfb0SJung-uk Kim     void                    *Context)
4231a39cfb0SJung-uk Kim {
4241a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
4251a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
4261a39cfb0SJung-uk Kim     char                    *Path;
4271a39cfb0SJung-uk Kim 
4281a39cfb0SJung-uk Kim 
4291a39cfb0SJung-uk Kim     if (!Op)
4301a39cfb0SJung-uk Kim     {
4311a39cfb0SJung-uk Kim         return (AE_OK);
4321a39cfb0SJung-uk Kim     }
4331a39cfb0SJung-uk Kim 
4341a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
4351a39cfb0SJung-uk Kim     Info->Count++;
4361a39cfb0SJung-uk Kim 
4371a39cfb0SJung-uk Kim     /* Most of the information (count, level, name) here */
4381a39cfb0SJung-uk Kim 
4391a39cfb0SJung-uk Kim     AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level);
4401a39cfb0SJung-uk Kim     AcpiDmIndent (Level);
4411a39cfb0SJung-uk Kim     AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
4421a39cfb0SJung-uk Kim 
4431a39cfb0SJung-uk Kim     /* Extra info is helpful */
4441a39cfb0SJung-uk Kim 
4451a39cfb0SJung-uk Kim     switch (Op->Common.AmlOpcode)
4461a39cfb0SJung-uk Kim     {
4471a39cfb0SJung-uk Kim     case AML_BYTE_OP:
4481a39cfb0SJung-uk Kim     case AML_WORD_OP:
4491a39cfb0SJung-uk Kim     case AML_DWORD_OP:
4501a39cfb0SJung-uk Kim         AcpiOsPrintf ("%X", (UINT32) Op->Common.Value.Integer);
4511a39cfb0SJung-uk Kim         break;
4521a39cfb0SJung-uk Kim 
4531a39cfb0SJung-uk Kim     case AML_INT_NAMEPATH_OP:
4541a39cfb0SJung-uk Kim         if (Op->Common.Value.String)
4551a39cfb0SJung-uk Kim         {
4561a39cfb0SJung-uk Kim             AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String,
4571a39cfb0SJung-uk Kim                             NULL, &Path);
4581a39cfb0SJung-uk Kim             AcpiOsPrintf ("%s %p", Path, Op->Common.Node);
4591a39cfb0SJung-uk Kim             ACPI_FREE (Path);
4601a39cfb0SJung-uk Kim         }
4611a39cfb0SJung-uk Kim         else
4621a39cfb0SJung-uk Kim         {
4631a39cfb0SJung-uk Kim             AcpiOsPrintf ("[NULL]");
4641a39cfb0SJung-uk Kim         }
4651a39cfb0SJung-uk Kim         break;
4661a39cfb0SJung-uk Kim 
4671a39cfb0SJung-uk Kim     case AML_NAME_OP:
4681a39cfb0SJung-uk Kim     case AML_METHOD_OP:
4691a39cfb0SJung-uk Kim     case AML_DEVICE_OP:
4701a39cfb0SJung-uk Kim     case AML_INT_NAMEDFIELD_OP:
4711a39cfb0SJung-uk Kim         AcpiOsPrintf ("%4.4s", &Op->Named.Name);
4721a39cfb0SJung-uk Kim         break;
4731a39cfb0SJung-uk Kim     }
4741a39cfb0SJung-uk Kim 
4751a39cfb0SJung-uk Kim     AcpiOsPrintf ("\n");
4761a39cfb0SJung-uk Kim     return (AE_OK);
4771a39cfb0SJung-uk Kim }
4781a39cfb0SJung-uk Kim 
4791a39cfb0SJung-uk Kim 
4801a39cfb0SJung-uk Kim /*******************************************************************************
4811a39cfb0SJung-uk Kim  *
4821a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmFindOrphanDescending
4831a39cfb0SJung-uk Kim  *
4841a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
4851a39cfb0SJung-uk Kim  *
4861a39cfb0SJung-uk Kim  * RETURN:      Status
4871a39cfb0SJung-uk Kim  *
4881a39cfb0SJung-uk Kim  * DESCRIPTION: Check namepath Ops for orphaned method invocations
4891a39cfb0SJung-uk Kim  *
4901a39cfb0SJung-uk Kim  * Note: Experimental.
4911a39cfb0SJung-uk Kim  *
4921a39cfb0SJung-uk Kim  ******************************************************************************/
4931a39cfb0SJung-uk Kim 
4941a39cfb0SJung-uk Kim static ACPI_STATUS
4951a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending (
4961a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
4971a39cfb0SJung-uk Kim     UINT32                  Level,
4981a39cfb0SJung-uk Kim     void                    *Context)
4991a39cfb0SJung-uk Kim {
5001a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
5011a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ChildOp;
5021a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
5031a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParentOp;
5041a39cfb0SJung-uk Kim     UINT32                  ArgCount;
5051a39cfb0SJung-uk Kim 
5061a39cfb0SJung-uk Kim 
5071a39cfb0SJung-uk Kim     if (!Op)
5081a39cfb0SJung-uk Kim     {
5091a39cfb0SJung-uk Kim         return (AE_OK);
5101a39cfb0SJung-uk Kim     }
5111a39cfb0SJung-uk Kim 
5121a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
5131a39cfb0SJung-uk Kim 
5141a39cfb0SJung-uk Kim     switch (Op->Common.AmlOpcode)
5151a39cfb0SJung-uk Kim     {
5161a39cfb0SJung-uk Kim #ifdef ACPI_UNDER_DEVELOPMENT
5171a39cfb0SJung-uk Kim     case AML_ADD_OP:
5181a39cfb0SJung-uk Kim         ChildOp = Op->Common.Value.Arg;
5191a39cfb0SJung-uk Kim         if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
5201a39cfb0SJung-uk Kim             !ChildOp->Common.Node)
5211a39cfb0SJung-uk Kim         {
5221a39cfb0SJung-uk Kim             AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String,
5231a39cfb0SJung-uk Kim                             NULL, &Path);
5241a39cfb0SJung-uk Kim             AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s  */\n", Op->Common.AmlOpName, Path);
5251a39cfb0SJung-uk Kim             ACPI_FREE (Path);
5261a39cfb0SJung-uk Kim 
5271a39cfb0SJung-uk Kim             NextOp = Op->Common.Next;
5281a39cfb0SJung-uk Kim             if (!NextOp)
5291a39cfb0SJung-uk Kim             {
5301a39cfb0SJung-uk Kim                 /* This NamePath has no args, assume it is an integer */
5311a39cfb0SJung-uk Kim 
5321a39cfb0SJung-uk Kim                 AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
5331a39cfb0SJung-uk Kim                 return (AE_OK);
5341a39cfb0SJung-uk Kim             }
5351a39cfb0SJung-uk Kim 
5361a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp);
5371a39cfb0SJung-uk Kim             AcpiOsPrintf ("/* A-CHILDREN: %d Actual %d */\n", ArgCount, AcpiDmCountChildren (Op));
5381a39cfb0SJung-uk Kim 
5391a39cfb0SJung-uk Kim             if (ArgCount < 1)
5401a39cfb0SJung-uk Kim             {
5411a39cfb0SJung-uk Kim                 /* One Arg means this is just a Store(Name,Target) */
5421a39cfb0SJung-uk Kim 
5431a39cfb0SJung-uk Kim                 AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
5441a39cfb0SJung-uk Kim                 return (AE_OK);
5451a39cfb0SJung-uk Kim             }
5461a39cfb0SJung-uk Kim 
5471a39cfb0SJung-uk Kim             AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount);
5481a39cfb0SJung-uk Kim         }
5491a39cfb0SJung-uk Kim         break;
5501a39cfb0SJung-uk Kim #endif
5511a39cfb0SJung-uk Kim 
5521a39cfb0SJung-uk Kim     case AML_STORE_OP:
5531a39cfb0SJung-uk Kim 
5541a39cfb0SJung-uk Kim         ChildOp = Op->Common.Value.Arg;
5551a39cfb0SJung-uk Kim         if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
5561a39cfb0SJung-uk Kim             !ChildOp->Common.Node)
5571a39cfb0SJung-uk Kim         {
5581a39cfb0SJung-uk Kim             NextOp = Op->Common.Next;
5591a39cfb0SJung-uk Kim             if (!NextOp)
5601a39cfb0SJung-uk Kim             {
5611a39cfb0SJung-uk Kim                 /* This NamePath has no args, assume it is an integer */
5621a39cfb0SJung-uk Kim 
5631a39cfb0SJung-uk Kim                 AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
5641a39cfb0SJung-uk Kim                 return (AE_OK);
5651a39cfb0SJung-uk Kim             }
5661a39cfb0SJung-uk Kim 
5671a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp);
5681a39cfb0SJung-uk Kim             if (ArgCount <= 1)
5691a39cfb0SJung-uk Kim             {
5701a39cfb0SJung-uk Kim                 /* One Arg means this is just a Store(Name,Target) */
5711a39cfb0SJung-uk Kim 
5721a39cfb0SJung-uk Kim                 AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
5731a39cfb0SJung-uk Kim                 return (AE_OK);
5741a39cfb0SJung-uk Kim             }
5751a39cfb0SJung-uk Kim 
5761a39cfb0SJung-uk Kim             AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount);
5771a39cfb0SJung-uk Kim         }
5781a39cfb0SJung-uk Kim         break;
5791a39cfb0SJung-uk Kim 
5801a39cfb0SJung-uk Kim     case AML_INT_NAMEPATH_OP:
5811a39cfb0SJung-uk Kim 
5821a39cfb0SJung-uk Kim         /* Must examine parent to see if this namepath is an argument */
5831a39cfb0SJung-uk Kim 
5841a39cfb0SJung-uk Kim         ParentOp = Op->Common.Parent;
5851a39cfb0SJung-uk Kim         OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
5861a39cfb0SJung-uk Kim 
5871a39cfb0SJung-uk Kim         if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
5881a39cfb0SJung-uk Kim             (OpInfo->Class != AML_CLASS_CREATE) &&
5891a39cfb0SJung-uk Kim             (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
5901a39cfb0SJung-uk Kim             !Op->Common.Node)
5911a39cfb0SJung-uk Kim         {
5921a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next);
5931a39cfb0SJung-uk Kim 
5941a39cfb0SJung-uk Kim             /*
5951a39cfb0SJung-uk Kim              * Check if namepath is a predicate for if/while or lone parameter to
5961a39cfb0SJung-uk Kim              * a return.
5971a39cfb0SJung-uk Kim              */
5981a39cfb0SJung-uk Kim             if (ArgCount == 0)
5991a39cfb0SJung-uk Kim             {
6001a39cfb0SJung-uk Kim                 if (((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
6011a39cfb0SJung-uk Kim                      (ParentOp->Common.AmlOpcode == AML_WHILE_OP) ||
6021a39cfb0SJung-uk Kim                      (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) &&
6031a39cfb0SJung-uk Kim 
6041a39cfb0SJung-uk Kim                      /* And namepath is the first argument */
6051a39cfb0SJung-uk Kim                      (ParentOp->Common.Value.Arg == Op))
6061a39cfb0SJung-uk Kim                 {
6071a39cfb0SJung-uk Kim                     AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_INTEGER, 0);
6081a39cfb0SJung-uk Kim                     break;
6091a39cfb0SJung-uk Kim                 }
6101a39cfb0SJung-uk Kim             }
6111a39cfb0SJung-uk Kim 
6121a39cfb0SJung-uk Kim             /*
6131a39cfb0SJung-uk Kim              * This is a standalone namestring (not a parameter to another
6141a39cfb0SJung-uk Kim              * operator) - it *must* be a method invocation, nothing else is
6151a39cfb0SJung-uk Kim              * grammatically possible.
6161a39cfb0SJung-uk Kim              */
6171a39cfb0SJung-uk Kim             AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount);
6181a39cfb0SJung-uk Kim 
6191a39cfb0SJung-uk Kim         }
6201a39cfb0SJung-uk Kim         break;
6211a39cfb0SJung-uk Kim     }
6221a39cfb0SJung-uk Kim 
6231a39cfb0SJung-uk Kim     return (AE_OK);
6241a39cfb0SJung-uk Kim }
6251a39cfb0SJung-uk Kim 
6261a39cfb0SJung-uk Kim 
6271a39cfb0SJung-uk Kim /*******************************************************************************
6281a39cfb0SJung-uk Kim  *
6291a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmLoadDescendingOp
6301a39cfb0SJung-uk Kim  *
6311a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
6321a39cfb0SJung-uk Kim  *
6331a39cfb0SJung-uk Kim  * RETURN:      Status
6341a39cfb0SJung-uk Kim  *
6351a39cfb0SJung-uk Kim  * DESCRIPTION: Descending handler for namespace control method object load
6361a39cfb0SJung-uk Kim  *
6371a39cfb0SJung-uk Kim  ******************************************************************************/
6381a39cfb0SJung-uk Kim 
6391a39cfb0SJung-uk Kim static ACPI_STATUS
6401a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp (
6411a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
6421a39cfb0SJung-uk Kim     UINT32                  Level,
6431a39cfb0SJung-uk Kim     void                    *Context)
6441a39cfb0SJung-uk Kim {
6451a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
6461a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
6471a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
6481a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
6491a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
6501a39cfb0SJung-uk Kim     char                    *Path = NULL;
6511a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
6521a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
6531a39cfb0SJung-uk Kim 
6541a39cfb0SJung-uk Kim 
6551a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
6561a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
6571a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
6581a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
6591a39cfb0SJung-uk Kim 
6601a39cfb0SJung-uk Kim     /* Only interested in operators that create new names */
6611a39cfb0SJung-uk Kim 
6621a39cfb0SJung-uk Kim     if (!(OpInfo->Flags & AML_NAMED) &&
6631a39cfb0SJung-uk Kim         !(OpInfo->Flags & AML_CREATE))
6641a39cfb0SJung-uk Kim     {
6651a39cfb0SJung-uk Kim         goto Exit;
6661a39cfb0SJung-uk Kim     }
6671a39cfb0SJung-uk Kim 
6681a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
6691a39cfb0SJung-uk Kim 
6701a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
6711a39cfb0SJung-uk Kim     {
6721a39cfb0SJung-uk Kim         /* For all named operators, get the new name */
6731a39cfb0SJung-uk Kim 
6741a39cfb0SJung-uk Kim         Path = (char *) Op->Named.Path;
6751a39cfb0SJung-uk Kim     }
6761a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
6771a39cfb0SJung-uk Kim     {
6781a39cfb0SJung-uk Kim         /* New name is the last child */
6791a39cfb0SJung-uk Kim 
6801a39cfb0SJung-uk Kim         NextOp = Op->Common.Value.Arg;
6811a39cfb0SJung-uk Kim 
6821a39cfb0SJung-uk Kim         while (NextOp->Common.Next)
6831a39cfb0SJung-uk Kim         {
6841a39cfb0SJung-uk Kim             NextOp = NextOp->Common.Next;
6851a39cfb0SJung-uk Kim         }
6861a39cfb0SJung-uk Kim         Path = NextOp->Common.Value.String;
6871a39cfb0SJung-uk Kim     }
6881a39cfb0SJung-uk Kim 
6891a39cfb0SJung-uk Kim     if (!Path)
6901a39cfb0SJung-uk Kim     {
6911a39cfb0SJung-uk Kim         goto Exit;
6921a39cfb0SJung-uk Kim     }
6931a39cfb0SJung-uk Kim 
6941a39cfb0SJung-uk Kim     /* Insert the name into the namespace */
6951a39cfb0SJung-uk Kim 
6961a39cfb0SJung-uk Kim     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
6971a39cfb0SJung-uk Kim                 ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE,
6981a39cfb0SJung-uk Kim                 WalkState, &Node);
6991a39cfb0SJung-uk Kim 
7001a39cfb0SJung-uk Kim     Op->Common.Node = Node;
7011a39cfb0SJung-uk Kim 
7021a39cfb0SJung-uk Kim 
7031a39cfb0SJung-uk Kim Exit:
7041a39cfb0SJung-uk Kim 
7051a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
7061a39cfb0SJung-uk Kim     {
7071a39cfb0SJung-uk Kim         if (Op->Common.Node)
7081a39cfb0SJung-uk Kim         {
7091a39cfb0SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
7101a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
7111a39cfb0SJung-uk Kim             {
7121a39cfb0SJung-uk Kim                 return (Status);
7131a39cfb0SJung-uk Kim             }
7141a39cfb0SJung-uk Kim         }
7151a39cfb0SJung-uk Kim     }
7161a39cfb0SJung-uk Kim 
7171a39cfb0SJung-uk Kim     return (AE_OK);
7181a39cfb0SJung-uk Kim }
7191a39cfb0SJung-uk Kim 
7201a39cfb0SJung-uk Kim 
7211a39cfb0SJung-uk Kim /*******************************************************************************
7221a39cfb0SJung-uk Kim  *
7231a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmXrefDescendingOp
7241a39cfb0SJung-uk Kim  *
7251a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
7261a39cfb0SJung-uk Kim  *
7271a39cfb0SJung-uk Kim  * RETURN:      Status
7281a39cfb0SJung-uk Kim  *
7291a39cfb0SJung-uk Kim  * DESCRIPTION: Descending handler for namespace cross reference
7301a39cfb0SJung-uk Kim  *
7311a39cfb0SJung-uk Kim  ******************************************************************************/
7321a39cfb0SJung-uk Kim 
7331a39cfb0SJung-uk Kim static ACPI_STATUS
7341a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp (
7351a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
7361a39cfb0SJung-uk Kim     UINT32                  Level,
7371a39cfb0SJung-uk Kim     void                    *Context)
7381a39cfb0SJung-uk Kim {
7391a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
7401a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
7411a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
7421a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
7431a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
7441a39cfb0SJung-uk Kim     char                    *Path = NULL;
7451a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
7461a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
7471a39cfb0SJung-uk Kim 
7481a39cfb0SJung-uk Kim 
7491a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
7501a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
7511a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
7521a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
7531a39cfb0SJung-uk Kim 
7541a39cfb0SJung-uk Kim     if ((!(OpInfo->Flags & AML_NAMED)) &&
7551a39cfb0SJung-uk Kim         (!(OpInfo->Flags & AML_CREATE)) &&
7561a39cfb0SJung-uk Kim         (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
7571a39cfb0SJung-uk Kim     {
7581a39cfb0SJung-uk Kim         goto Exit;
7591a39cfb0SJung-uk Kim     }
7601a39cfb0SJung-uk Kim 
7611a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
7621a39cfb0SJung-uk Kim 
7631a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
7641a39cfb0SJung-uk Kim     {
7651a39cfb0SJung-uk Kim         if ((Op->Common.AmlOpcode == AML_ALIAS_OP) ||
7661a39cfb0SJung-uk Kim             (Op->Common.AmlOpcode == AML_SCOPE_OP))
7671a39cfb0SJung-uk Kim         {
7681a39cfb0SJung-uk Kim             /*
7691a39cfb0SJung-uk Kim              * Only these two operators refer to an existing name,
7701a39cfb0SJung-uk Kim              * first argument
7711a39cfb0SJung-uk Kim              */
7721a39cfb0SJung-uk Kim             Path = (char *) Op->Named.Path;
7731a39cfb0SJung-uk Kim         }
7741a39cfb0SJung-uk Kim     }
7751a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
7761a39cfb0SJung-uk Kim     {
7771a39cfb0SJung-uk Kim         /* Referenced Buffer Name is the first child */
7781a39cfb0SJung-uk Kim 
7791a39cfb0SJung-uk Kim         NextOp = Op->Common.Value.Arg;
7801a39cfb0SJung-uk Kim         if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
7811a39cfb0SJung-uk Kim         {
7821a39cfb0SJung-uk Kim             Path = NextOp->Common.Value.String;
7831a39cfb0SJung-uk Kim         }
7841a39cfb0SJung-uk Kim     }
7851a39cfb0SJung-uk Kim     else
7861a39cfb0SJung-uk Kim     {
7871a39cfb0SJung-uk Kim         Path = Op->Common.Value.String;
7881a39cfb0SJung-uk Kim     }
7891a39cfb0SJung-uk Kim 
7901a39cfb0SJung-uk Kim     if (!Path)
7911a39cfb0SJung-uk Kim     {
7921a39cfb0SJung-uk Kim         goto Exit;
7931a39cfb0SJung-uk Kim     }
7941a39cfb0SJung-uk Kim 
7951a39cfb0SJung-uk Kim     /*
7961a39cfb0SJung-uk Kim      * Lookup the name in the namespace.  Name must exist at this point, or it
7971a39cfb0SJung-uk Kim      * is an invalid reference.
7981a39cfb0SJung-uk Kim      *
7991a39cfb0SJung-uk Kim      * The namespace is also used as a lookup table for references to resource
8001a39cfb0SJung-uk Kim      * descriptors and the fields within them.
8011a39cfb0SJung-uk Kim      */
8021a39cfb0SJung-uk Kim     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
8031a39cfb0SJung-uk Kim                 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
8041a39cfb0SJung-uk Kim                 WalkState, &Node);
8051a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
8061a39cfb0SJung-uk Kim     {
8071a39cfb0SJung-uk Kim         if (Status == AE_NOT_FOUND)
8081a39cfb0SJung-uk Kim         {
8091a39cfb0SJung-uk Kim             AcpiDmAddToExternalList (Path, (UINT8) ObjectType, 0);
8101a39cfb0SJung-uk Kim 
8111a39cfb0SJung-uk Kim             /*
8121a39cfb0SJung-uk Kim              * We could install this into the namespace, but we catch duplicate
8131a39cfb0SJung-uk Kim              * externals when they are added to the list.
8141a39cfb0SJung-uk Kim              */
8151a39cfb0SJung-uk Kim #if 0
8161a39cfb0SJung-uk Kim             Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
8171a39cfb0SJung-uk Kim                        ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE,
8181a39cfb0SJung-uk Kim                        WalkState, &Node);
8191a39cfb0SJung-uk Kim #endif
8201a39cfb0SJung-uk Kim         }
8211a39cfb0SJung-uk Kim     }
8221a39cfb0SJung-uk Kim     else
8231a39cfb0SJung-uk Kim     {
8241a39cfb0SJung-uk Kim         Op->Common.Node = Node;
8251a39cfb0SJung-uk Kim     }
8261a39cfb0SJung-uk Kim 
8271a39cfb0SJung-uk Kim 
8281a39cfb0SJung-uk Kim Exit:
8291a39cfb0SJung-uk Kim     /* Open new scope if necessary */
8301a39cfb0SJung-uk Kim 
8311a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
8321a39cfb0SJung-uk Kim     {
8331a39cfb0SJung-uk Kim         if (Op->Common.Node)
8341a39cfb0SJung-uk Kim         {
8351a39cfb0SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
8361a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
8371a39cfb0SJung-uk Kim             {
8381a39cfb0SJung-uk Kim                 return (Status);
8391a39cfb0SJung-uk Kim             }
8401a39cfb0SJung-uk Kim         }
8411a39cfb0SJung-uk Kim     }
8421a39cfb0SJung-uk Kim 
8431a39cfb0SJung-uk Kim     return (AE_OK);
8441a39cfb0SJung-uk Kim }
8451a39cfb0SJung-uk Kim 
8461a39cfb0SJung-uk Kim 
8471a39cfb0SJung-uk Kim /*******************************************************************************
8481a39cfb0SJung-uk Kim  *
8491a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmResourceDescendingOp
8501a39cfb0SJung-uk Kim  *
8511a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
8521a39cfb0SJung-uk Kim  *
8531a39cfb0SJung-uk Kim  * RETURN:      None
8541a39cfb0SJung-uk Kim  *
8551a39cfb0SJung-uk Kim  * DESCRIPTION: Process one parse op during symbolic resource index conversion.
8561a39cfb0SJung-uk Kim  *
8571a39cfb0SJung-uk Kim  ******************************************************************************/
8581a39cfb0SJung-uk Kim 
8591a39cfb0SJung-uk Kim static ACPI_STATUS
8601a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp (
8611a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
8621a39cfb0SJung-uk Kim     UINT32                  Level,
8631a39cfb0SJung-uk Kim     void                    *Context)
8641a39cfb0SJung-uk Kim {
8651a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
8661a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
8671a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
8681a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
8691a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
8701a39cfb0SJung-uk Kim 
8711a39cfb0SJung-uk Kim 
8721a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
8731a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
8741a39cfb0SJung-uk Kim 
8751a39cfb0SJung-uk Kim     /* Open new scope if necessary */
8761a39cfb0SJung-uk Kim 
8771a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
8781a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
8791a39cfb0SJung-uk Kim     {
8801a39cfb0SJung-uk Kim         if (Op->Common.Node)
8811a39cfb0SJung-uk Kim         {
8821a39cfb0SJung-uk Kim 
8831a39cfb0SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
8841a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
8851a39cfb0SJung-uk Kim             {
8861a39cfb0SJung-uk Kim                 return (Status);
8871a39cfb0SJung-uk Kim             }
8881a39cfb0SJung-uk Kim         }
8891a39cfb0SJung-uk Kim     }
8901a39cfb0SJung-uk Kim 
8911a39cfb0SJung-uk Kim     /*
8921a39cfb0SJung-uk Kim      * Check if this operator contains a reference to a resource descriptor.
8931a39cfb0SJung-uk Kim      * If so, convert the reference into a symbolic reference.
8941a39cfb0SJung-uk Kim      */
8951a39cfb0SJung-uk Kim     AcpiDmCheckResourceReference (Op, WalkState);
8961a39cfb0SJung-uk Kim     return (AE_OK);
8971a39cfb0SJung-uk Kim }
8981a39cfb0SJung-uk Kim 
8991a39cfb0SJung-uk Kim 
9001a39cfb0SJung-uk Kim /*******************************************************************************
9011a39cfb0SJung-uk Kim  *
9021a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmCommonAscendingOp
9031a39cfb0SJung-uk Kim  *
9041a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
9051a39cfb0SJung-uk Kim  *
9061a39cfb0SJung-uk Kim  * RETURN:      None
9071a39cfb0SJung-uk Kim  *
9081a39cfb0SJung-uk Kim  * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes
9091a39cfb0SJung-uk Kim  *              scope if necessary.
9101a39cfb0SJung-uk Kim  *
9111a39cfb0SJung-uk Kim  ******************************************************************************/
9121a39cfb0SJung-uk Kim 
9131a39cfb0SJung-uk Kim static ACPI_STATUS
9141a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp (
9151a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
9161a39cfb0SJung-uk Kim     UINT32                  Level,
9171a39cfb0SJung-uk Kim     void                    *Context)
9181a39cfb0SJung-uk Kim {
9191a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
9201a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
9211a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
9221a39cfb0SJung-uk Kim 
9231a39cfb0SJung-uk Kim 
9241a39cfb0SJung-uk Kim     /* Close scope if necessary */
9251a39cfb0SJung-uk Kim 
9261a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
9271a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
9281a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
9291a39cfb0SJung-uk Kim 
9301a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
9311a39cfb0SJung-uk Kim     {
9321a39cfb0SJung-uk Kim         (void) AcpiDsScopeStackPop (Info->WalkState);
9331a39cfb0SJung-uk Kim     }
9341a39cfb0SJung-uk Kim 
9351a39cfb0SJung-uk Kim     return (AE_OK);
9361a39cfb0SJung-uk Kim }
9371a39cfb0SJung-uk Kim 
9381a39cfb0SJung-uk Kim 
9391a39cfb0SJung-uk Kim /*******************************************************************************
9401a39cfb0SJung-uk Kim  *
9411a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmInspectPossibleArgs
9421a39cfb0SJung-uk Kim  *
9431a39cfb0SJung-uk Kim  * PARAMETERS:  CurrentOpArgCount   - Which arg of the current op was the
9441a39cfb0SJung-uk Kim  *                                    possible method invocation found
9451a39cfb0SJung-uk Kim  *              TargetCount         - Number of targets (0,1,2) for this op
9461a39cfb0SJung-uk Kim  *              Op                  - Parse op
9471a39cfb0SJung-uk Kim  *
9481a39cfb0SJung-uk Kim  * RETURN:      Status
9491a39cfb0SJung-uk Kim  *
9501a39cfb0SJung-uk Kim  * DESCRIPTION: Examine following args and next ops for possible arguments
9511a39cfb0SJung-uk Kim  *              for an unrecognized method invocation.
9521a39cfb0SJung-uk Kim  *
9531a39cfb0SJung-uk Kim  ******************************************************************************/
9541a39cfb0SJung-uk Kim 
9551a39cfb0SJung-uk Kim static UINT32
9561a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs (
9571a39cfb0SJung-uk Kim     UINT32                  CurrentOpArgCount,
9581a39cfb0SJung-uk Kim     UINT32                  TargetCount,
9591a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
9601a39cfb0SJung-uk Kim {
9611a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
9621a39cfb0SJung-uk Kim     UINT32                  i;
9631a39cfb0SJung-uk Kim     UINT32                  Last = 0;
9641a39cfb0SJung-uk Kim     UINT32                  Lookahead;
9651a39cfb0SJung-uk Kim 
9661a39cfb0SJung-uk Kim 
9671a39cfb0SJung-uk Kim     Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount;
9681a39cfb0SJung-uk Kim 
9691a39cfb0SJung-uk Kim     /* Lookahead for the maximum number of possible arguments */
9701a39cfb0SJung-uk Kim 
9711a39cfb0SJung-uk Kim     for (i = 0; i < Lookahead; i++)
9721a39cfb0SJung-uk Kim     {
9731a39cfb0SJung-uk Kim         if (!Op)
9741a39cfb0SJung-uk Kim         {
9751a39cfb0SJung-uk Kim             break;
9761a39cfb0SJung-uk Kim         }
9771a39cfb0SJung-uk Kim 
9781a39cfb0SJung-uk Kim         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
9791a39cfb0SJung-uk Kim 
9801a39cfb0SJung-uk Kim         /*
9811a39cfb0SJung-uk Kim          * Any one of these operators is "very probably" not a method arg
9821a39cfb0SJung-uk Kim          */
9831a39cfb0SJung-uk Kim         if ((Op->Common.AmlOpcode == AML_STORE_OP) ||
9841a39cfb0SJung-uk Kim             (Op->Common.AmlOpcode == AML_NOTIFY_OP))
9851a39cfb0SJung-uk Kim         {
9861a39cfb0SJung-uk Kim             break;
9871a39cfb0SJung-uk Kim         }
9881a39cfb0SJung-uk Kim 
9891a39cfb0SJung-uk Kim         if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
9901a39cfb0SJung-uk Kim             (OpInfo->Class != AML_CLASS_CONTROL))
9911a39cfb0SJung-uk Kim         {
9921a39cfb0SJung-uk Kim             Last = i+1;
9931a39cfb0SJung-uk Kim         }
9941a39cfb0SJung-uk Kim 
9951a39cfb0SJung-uk Kim         Op = Op->Common.Next;
9961a39cfb0SJung-uk Kim     }
9971a39cfb0SJung-uk Kim 
9981a39cfb0SJung-uk Kim     return (Last);
9991a39cfb0SJung-uk Kim }
10001a39cfb0SJung-uk Kim 
10011a39cfb0SJung-uk Kim 
1002