xref: /freebsd/sys/contrib/dev/acpica/common/adwalk.c (revision 79c6d946797dd4db2f2a943f664a4e976f6c942b)
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 
7d244b227SJung-uk Kim /*
8efcc2a30SJung-uk Kim  * Copyright (C) 2000 - 2013, Intel Corp.
91a39cfb0SJung-uk Kim  * All rights reserved.
101a39cfb0SJung-uk Kim  *
11d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
13d244b227SJung-uk Kim  * are met:
14d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16d244b227SJung-uk Kim  *    without modification.
17d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21d244b227SJung-uk Kim  *    binary redistribution.
22d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24d244b227SJung-uk Kim  *    from this software without specific prior written permission.
251a39cfb0SJung-uk Kim  *
26d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28d244b227SJung-uk Kim  * Software Foundation.
291a39cfb0SJung-uk Kim  *
30d244b227SJung-uk Kim  * NO WARRANTY
31d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42d244b227SJung-uk Kim  */
431a39cfb0SJung-uk Kim 
441a39cfb0SJung-uk Kim 
45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h>
48ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
50ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h>
51ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
52ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
531a39cfb0SJung-uk Kim 
541a39cfb0SJung-uk Kim 
551a39cfb0SJung-uk Kim #define _COMPONENT          ACPI_TOOLS
561a39cfb0SJung-uk Kim         ACPI_MODULE_NAME    ("adwalk")
571a39cfb0SJung-uk Kim 
581a39cfb0SJung-uk Kim /*
591a39cfb0SJung-uk Kim  * aslmap - opcode mappings and reserved method names
601a39cfb0SJung-uk Kim  */
611a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE
621a39cfb0SJung-uk Kim AslMapNamedOpcodeToDataType (
631a39cfb0SJung-uk Kim     UINT16                  Opcode);
641a39cfb0SJung-uk Kim 
651a39cfb0SJung-uk Kim /* Local prototypes */
661a39cfb0SJung-uk Kim 
671a39cfb0SJung-uk Kim static ACPI_STATUS
681a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending (
691a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
701a39cfb0SJung-uk Kim     UINT32                  Level,
711a39cfb0SJung-uk Kim     void                    *Context);
721a39cfb0SJung-uk Kim 
731a39cfb0SJung-uk Kim static ACPI_STATUS
741a39cfb0SJung-uk Kim AcpiDmDumpDescending (
751a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
761a39cfb0SJung-uk Kim     UINT32                  Level,
771a39cfb0SJung-uk Kim     void                    *Context);
781a39cfb0SJung-uk Kim 
791a39cfb0SJung-uk Kim static ACPI_STATUS
801a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp (
811a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
821a39cfb0SJung-uk Kim     UINT32                  Level,
831a39cfb0SJung-uk Kim     void                    *Context);
841a39cfb0SJung-uk Kim 
851a39cfb0SJung-uk Kim static ACPI_STATUS
861a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp (
871a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
881a39cfb0SJung-uk Kim     UINT32                  Level,
891a39cfb0SJung-uk Kim     void                    *Context);
901a39cfb0SJung-uk Kim 
911a39cfb0SJung-uk Kim static ACPI_STATUS
921a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp (
931a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
941a39cfb0SJung-uk Kim     UINT32                  Level,
951a39cfb0SJung-uk Kim     void                    *Context);
961a39cfb0SJung-uk Kim 
971a39cfb0SJung-uk Kim static UINT32
981a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs (
991a39cfb0SJung-uk Kim     UINT32                  CurrentOpArgCount,
1001a39cfb0SJung-uk Kim     UINT32                  TargetCount,
1011a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
1021a39cfb0SJung-uk Kim 
1031a39cfb0SJung-uk Kim static ACPI_STATUS
1041a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp (
1051a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
1061a39cfb0SJung-uk Kim     UINT32                  Level,
1071a39cfb0SJung-uk Kim     void                    *Context);
1081a39cfb0SJung-uk Kim 
1091a39cfb0SJung-uk Kim 
1101a39cfb0SJung-uk Kim /*******************************************************************************
1111a39cfb0SJung-uk Kim  *
1121a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmDumpTree
1131a39cfb0SJung-uk Kim  *
1141a39cfb0SJung-uk Kim  * PARAMETERS:  Origin              - Starting object
1151a39cfb0SJung-uk Kim  *
1161a39cfb0SJung-uk Kim  * RETURN:      None
1171a39cfb0SJung-uk Kim  *
1181a39cfb0SJung-uk Kim  * DESCRIPTION: Parse tree walk to format and output the nodes
1191a39cfb0SJung-uk Kim  *
1201a39cfb0SJung-uk Kim  ******************************************************************************/
1211a39cfb0SJung-uk Kim 
1221a39cfb0SJung-uk Kim void
1231a39cfb0SJung-uk Kim AcpiDmDumpTree (
1241a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Origin)
1251a39cfb0SJung-uk Kim {
1261a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
1271a39cfb0SJung-uk Kim 
1281a39cfb0SJung-uk Kim 
1291a39cfb0SJung-uk Kim     if (!Origin)
1301a39cfb0SJung-uk Kim     {
1311a39cfb0SJung-uk Kim         return;
1321a39cfb0SJung-uk Kim     }
1331a39cfb0SJung-uk Kim 
1341a39cfb0SJung-uk Kim     AcpiOsPrintf ("/*\nAML Parse Tree\n\n");
1351a39cfb0SJung-uk Kim     Info.Flags = 0;
1361a39cfb0SJung-uk Kim     Info.Count = 0;
1371a39cfb0SJung-uk Kim     Info.Level = 0;
1381a39cfb0SJung-uk Kim     Info.WalkState = NULL;
1391a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info);
1401a39cfb0SJung-uk Kim     AcpiOsPrintf ("*/\n\n");
1411a39cfb0SJung-uk Kim }
1421a39cfb0SJung-uk Kim 
1431a39cfb0SJung-uk Kim 
1441a39cfb0SJung-uk Kim /*******************************************************************************
1451a39cfb0SJung-uk Kim  *
1461a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmFindOrphanMethods
1471a39cfb0SJung-uk Kim  *
1481a39cfb0SJung-uk Kim  * PARAMETERS:  Origin              - Starting object
1491a39cfb0SJung-uk Kim  *
1501a39cfb0SJung-uk Kim  * RETURN:      None
1511a39cfb0SJung-uk Kim  *
1521a39cfb0SJung-uk Kim  * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods
1531a39cfb0SJung-uk Kim  *              that are not resolved in the namespace
1541a39cfb0SJung-uk Kim  *
1551a39cfb0SJung-uk Kim  ******************************************************************************/
1561a39cfb0SJung-uk Kim 
1571a39cfb0SJung-uk Kim void
1581a39cfb0SJung-uk Kim AcpiDmFindOrphanMethods (
1591a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Origin)
1601a39cfb0SJung-uk Kim {
1611a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
1621a39cfb0SJung-uk Kim 
1631a39cfb0SJung-uk Kim 
1641a39cfb0SJung-uk Kim     if (!Origin)
1651a39cfb0SJung-uk Kim     {
1661a39cfb0SJung-uk Kim         return;
1671a39cfb0SJung-uk Kim     }
1681a39cfb0SJung-uk Kim 
1691a39cfb0SJung-uk Kim     Info.Flags = 0;
1701a39cfb0SJung-uk Kim     Info.Level = 0;
1711a39cfb0SJung-uk Kim     Info.WalkState = NULL;
1721a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info);
1731a39cfb0SJung-uk Kim }
1741a39cfb0SJung-uk Kim 
1751a39cfb0SJung-uk Kim 
1761a39cfb0SJung-uk Kim /*******************************************************************************
1771a39cfb0SJung-uk Kim  *
1781a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmFinishNamespaceLoad
1791a39cfb0SJung-uk Kim  *
1801a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
1811a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
182a9f12690SJung-uk Kim  *              OwnerId             - OwnerId of the table to be disassembled
1831a39cfb0SJung-uk Kim  *
1841a39cfb0SJung-uk Kim  * RETURN:      None
1851a39cfb0SJung-uk Kim  *
1861a39cfb0SJung-uk Kim  * DESCRIPTION: Load all namespace items that are created within control
1871a39cfb0SJung-uk Kim  *              methods. Used before namespace cross reference
1881a39cfb0SJung-uk Kim  *
1891a39cfb0SJung-uk Kim  ******************************************************************************/
1901a39cfb0SJung-uk Kim 
1911a39cfb0SJung-uk Kim void
1921a39cfb0SJung-uk Kim AcpiDmFinishNamespaceLoad (
1931a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
194a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot,
195a9f12690SJung-uk Kim     ACPI_OWNER_ID           OwnerId)
1961a39cfb0SJung-uk Kim {
1971a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
1981a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
1991a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
2001a39cfb0SJung-uk Kim 
2011a39cfb0SJung-uk Kim 
2021a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
2031a39cfb0SJung-uk Kim     {
2041a39cfb0SJung-uk Kim         return;
2051a39cfb0SJung-uk Kim     }
2061a39cfb0SJung-uk Kim 
2071a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
2081a39cfb0SJung-uk Kim 
209a9f12690SJung-uk Kim     WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
2101a39cfb0SJung-uk Kim     if (!WalkState)
2111a39cfb0SJung-uk Kim     {
2121a39cfb0SJung-uk Kim         return;
2131a39cfb0SJung-uk Kim     }
2141a39cfb0SJung-uk Kim 
2151a39cfb0SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
2161a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
2171a39cfb0SJung-uk Kim     {
2181a39cfb0SJung-uk Kim         return;
2191a39cfb0SJung-uk Kim     }
2201a39cfb0SJung-uk Kim 
2211a39cfb0SJung-uk Kim     Info.Flags = 0;
2221a39cfb0SJung-uk Kim     Info.Level = 0;
2231a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
2241a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp,
2251a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
2261a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
2271a39cfb0SJung-uk Kim }
2281a39cfb0SJung-uk Kim 
2291a39cfb0SJung-uk Kim 
2301a39cfb0SJung-uk Kim /*******************************************************************************
2311a39cfb0SJung-uk Kim  *
2321a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmCrossReferenceNamespace
2331a39cfb0SJung-uk Kim  *
2341a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
2351a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
236a9f12690SJung-uk Kim  *              OwnerId             - OwnerId of the table to be disassembled
2371a39cfb0SJung-uk Kim  *
2381a39cfb0SJung-uk Kim  * RETURN:      None
2391a39cfb0SJung-uk Kim  *
2401a39cfb0SJung-uk Kim  * DESCRIPTION: Cross reference the namespace to create externals
2411a39cfb0SJung-uk Kim  *
2421a39cfb0SJung-uk Kim  ******************************************************************************/
2431a39cfb0SJung-uk Kim 
2441a39cfb0SJung-uk Kim void
2451a39cfb0SJung-uk Kim AcpiDmCrossReferenceNamespace (
2461a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
247a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot,
248a9f12690SJung-uk Kim     ACPI_OWNER_ID           OwnerId)
2491a39cfb0SJung-uk Kim {
2501a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
2511a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
2521a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
2531a39cfb0SJung-uk Kim 
2541a39cfb0SJung-uk Kim 
2551a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
2561a39cfb0SJung-uk Kim     {
2571a39cfb0SJung-uk Kim         return;
2581a39cfb0SJung-uk Kim     }
2591a39cfb0SJung-uk Kim 
2601a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
2611a39cfb0SJung-uk Kim 
262a9f12690SJung-uk Kim     WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
2631a39cfb0SJung-uk Kim     if (!WalkState)
2641a39cfb0SJung-uk Kim     {
2651a39cfb0SJung-uk Kim         return;
2661a39cfb0SJung-uk Kim     }
2671a39cfb0SJung-uk Kim 
2681a39cfb0SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
2691a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
2701a39cfb0SJung-uk Kim     {
2711a39cfb0SJung-uk Kim         return;
2721a39cfb0SJung-uk Kim     }
2731a39cfb0SJung-uk Kim 
2741a39cfb0SJung-uk Kim     Info.Flags = 0;
2751a39cfb0SJung-uk Kim     Info.Level = 0;
2761a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
2771a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp,
2781a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
2791a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
2801a39cfb0SJung-uk Kim }
2811a39cfb0SJung-uk Kim 
2821a39cfb0SJung-uk Kim 
2831a39cfb0SJung-uk Kim /*******************************************************************************
2841a39cfb0SJung-uk Kim  *
2851a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmConvertResourceIndexes
2861a39cfb0SJung-uk Kim  *
2871a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
2881a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
2891a39cfb0SJung-uk Kim  *
2901a39cfb0SJung-uk Kim  * RETURN:      None
2911a39cfb0SJung-uk Kim  *
2921a39cfb0SJung-uk Kim  * DESCRIPTION: Convert fixed-offset references to resource descriptors to
2931a39cfb0SJung-uk Kim  *              symbolic references. Should only be called after namespace has
2941a39cfb0SJung-uk Kim  *              been cross referenced.
2951a39cfb0SJung-uk Kim  *
2961a39cfb0SJung-uk Kim  ******************************************************************************/
2971a39cfb0SJung-uk Kim 
2981a39cfb0SJung-uk Kim void
2991a39cfb0SJung-uk Kim AcpiDmConvertResourceIndexes (
3001a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
3011a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot)
3021a39cfb0SJung-uk Kim {
3031a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
3041a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
3051a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
3061a39cfb0SJung-uk Kim 
3071a39cfb0SJung-uk Kim 
3081a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
3091a39cfb0SJung-uk Kim     {
3101a39cfb0SJung-uk Kim         return;
3111a39cfb0SJung-uk Kim     }
3121a39cfb0SJung-uk Kim 
3131a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
3141a39cfb0SJung-uk Kim 
3151a39cfb0SJung-uk Kim     WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
3161a39cfb0SJung-uk Kim     if (!WalkState)
3171a39cfb0SJung-uk Kim     {
3181a39cfb0SJung-uk Kim         return;
3191a39cfb0SJung-uk Kim     }
3201a39cfb0SJung-uk Kim 
3211a39cfb0SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
3221a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
3231a39cfb0SJung-uk Kim     {
3241a39cfb0SJung-uk Kim         return;
3251a39cfb0SJung-uk Kim     }
3261a39cfb0SJung-uk Kim 
3271a39cfb0SJung-uk Kim     Info.Flags = 0;
3281a39cfb0SJung-uk Kim     Info.Level = 0;
3291a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
3301a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp,
3311a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
3321a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
3331a39cfb0SJung-uk Kim     return;
3341a39cfb0SJung-uk Kim }
3351a39cfb0SJung-uk Kim 
3361a39cfb0SJung-uk Kim 
3371a39cfb0SJung-uk Kim /*******************************************************************************
3381a39cfb0SJung-uk Kim  *
3391a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmDumpDescending
3401a39cfb0SJung-uk Kim  *
3411a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
3421a39cfb0SJung-uk Kim  *
3431a39cfb0SJung-uk Kim  * RETURN:      Status
3441a39cfb0SJung-uk Kim  *
3451a39cfb0SJung-uk Kim  * DESCRIPTION: Format and print contents of one parse Op.
3461a39cfb0SJung-uk Kim  *
3471a39cfb0SJung-uk Kim  ******************************************************************************/
3481a39cfb0SJung-uk Kim 
3491a39cfb0SJung-uk Kim static ACPI_STATUS
3501a39cfb0SJung-uk Kim AcpiDmDumpDescending (
3511a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
3521a39cfb0SJung-uk Kim     UINT32                  Level,
3531a39cfb0SJung-uk Kim     void                    *Context)
3541a39cfb0SJung-uk Kim {
3551a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
3561a39cfb0SJung-uk Kim     char                    *Path;
3571a39cfb0SJung-uk Kim 
3581a39cfb0SJung-uk Kim 
3591a39cfb0SJung-uk Kim     if (!Op)
3601a39cfb0SJung-uk Kim     {
3611a39cfb0SJung-uk Kim         return (AE_OK);
3621a39cfb0SJung-uk Kim     }
3631a39cfb0SJung-uk Kim 
3641a39cfb0SJung-uk Kim     /* Most of the information (count, level, name) here */
3651a39cfb0SJung-uk Kim 
366f556842eSJung-uk Kim     Info->Count++;
3671a39cfb0SJung-uk Kim     AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level);
3681a39cfb0SJung-uk Kim     AcpiDmIndent (Level);
3691a39cfb0SJung-uk Kim     AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
3701a39cfb0SJung-uk Kim 
3711a39cfb0SJung-uk Kim     /* Extra info is helpful */
3721a39cfb0SJung-uk Kim 
3731a39cfb0SJung-uk Kim     switch (Op->Common.AmlOpcode)
3741a39cfb0SJung-uk Kim     {
3751a39cfb0SJung-uk Kim     case AML_BYTE_OP:
376*79c6d946SJung-uk Kim 
377*79c6d946SJung-uk Kim         AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer);
378*79c6d946SJung-uk Kim         break;
379*79c6d946SJung-uk Kim 
3801a39cfb0SJung-uk Kim     case AML_WORD_OP:
381*79c6d946SJung-uk Kim 
382*79c6d946SJung-uk Kim         AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer);
383*79c6d946SJung-uk Kim         break;
384*79c6d946SJung-uk Kim 
3851a39cfb0SJung-uk Kim     case AML_DWORD_OP:
386a9d8d09cSJung-uk Kim 
387*79c6d946SJung-uk Kim         AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer);
3881a39cfb0SJung-uk Kim         break;
3891a39cfb0SJung-uk Kim 
3903f0275a0SJung-uk Kim     case AML_QWORD_OP:
391a9d8d09cSJung-uk Kim 
3923f0275a0SJung-uk Kim         AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
3933f0275a0SJung-uk Kim         break;
3943f0275a0SJung-uk Kim 
3951a39cfb0SJung-uk Kim     case AML_INT_NAMEPATH_OP:
396a9d8d09cSJung-uk Kim 
3971a39cfb0SJung-uk Kim         if (Op->Common.Value.String)
3981a39cfb0SJung-uk Kim         {
3991a39cfb0SJung-uk Kim             AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String,
4001a39cfb0SJung-uk Kim                             NULL, &Path);
4011a39cfb0SJung-uk Kim             AcpiOsPrintf ("%s %p", Path, Op->Common.Node);
4021a39cfb0SJung-uk Kim             ACPI_FREE (Path);
4031a39cfb0SJung-uk Kim         }
4041a39cfb0SJung-uk Kim         else
4051a39cfb0SJung-uk Kim         {
4061a39cfb0SJung-uk Kim             AcpiOsPrintf ("[NULL]");
4071a39cfb0SJung-uk Kim         }
4081a39cfb0SJung-uk Kim         break;
4091a39cfb0SJung-uk Kim 
4101a39cfb0SJung-uk Kim     case AML_NAME_OP:
4111a39cfb0SJung-uk Kim     case AML_METHOD_OP:
4121a39cfb0SJung-uk Kim     case AML_DEVICE_OP:
4131a39cfb0SJung-uk Kim     case AML_INT_NAMEDFIELD_OP:
414a9d8d09cSJung-uk Kim 
415f556842eSJung-uk Kim         AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name));
4161a39cfb0SJung-uk Kim         break;
417a9f12690SJung-uk Kim 
418a9f12690SJung-uk Kim     default:
419a9d8d09cSJung-uk Kim 
420a9f12690SJung-uk Kim         break;
4211a39cfb0SJung-uk Kim     }
4221a39cfb0SJung-uk Kim 
4231a39cfb0SJung-uk Kim     AcpiOsPrintf ("\n");
4241a39cfb0SJung-uk Kim     return (AE_OK);
4251a39cfb0SJung-uk Kim }
4261a39cfb0SJung-uk Kim 
4271a39cfb0SJung-uk Kim 
4281a39cfb0SJung-uk Kim /*******************************************************************************
4291a39cfb0SJung-uk Kim  *
4301a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmFindOrphanDescending
4311a39cfb0SJung-uk Kim  *
4321a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
4331a39cfb0SJung-uk Kim  *
4341a39cfb0SJung-uk Kim  * RETURN:      Status
4351a39cfb0SJung-uk Kim  *
4361a39cfb0SJung-uk Kim  * DESCRIPTION: Check namepath Ops for orphaned method invocations
4371a39cfb0SJung-uk Kim  *
4381a39cfb0SJung-uk Kim  * Note: Experimental.
4391a39cfb0SJung-uk Kim  *
4401a39cfb0SJung-uk Kim  ******************************************************************************/
4411a39cfb0SJung-uk Kim 
4421a39cfb0SJung-uk Kim static ACPI_STATUS
4431a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending (
4441a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
4451a39cfb0SJung-uk Kim     UINT32                  Level,
4461a39cfb0SJung-uk Kim     void                    *Context)
4471a39cfb0SJung-uk Kim {
4481a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
4491a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ChildOp;
4501a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
4511a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParentOp;
4521a39cfb0SJung-uk Kim     UINT32                  ArgCount;
4531a39cfb0SJung-uk Kim 
4541a39cfb0SJung-uk Kim 
4551a39cfb0SJung-uk Kim     if (!Op)
4561a39cfb0SJung-uk Kim     {
4571a39cfb0SJung-uk Kim         return (AE_OK);
4581a39cfb0SJung-uk Kim     }
4591a39cfb0SJung-uk Kim 
4601a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
4611a39cfb0SJung-uk Kim 
4621a39cfb0SJung-uk Kim     switch (Op->Common.AmlOpcode)
4631a39cfb0SJung-uk Kim     {
4641a39cfb0SJung-uk Kim #ifdef ACPI_UNDER_DEVELOPMENT
4651a39cfb0SJung-uk Kim     case AML_ADD_OP:
466a9d8d09cSJung-uk Kim 
4671a39cfb0SJung-uk Kim         ChildOp = Op->Common.Value.Arg;
4681a39cfb0SJung-uk Kim         if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
4691a39cfb0SJung-uk Kim             !ChildOp->Common.Node)
4701a39cfb0SJung-uk Kim         {
4711a39cfb0SJung-uk Kim             AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String,
4721a39cfb0SJung-uk Kim                             NULL, &Path);
4731a39cfb0SJung-uk Kim             AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s  */\n", Op->Common.AmlOpName, Path);
4741a39cfb0SJung-uk Kim             ACPI_FREE (Path);
4751a39cfb0SJung-uk Kim 
4761a39cfb0SJung-uk Kim             NextOp = Op->Common.Next;
4771a39cfb0SJung-uk Kim             if (!NextOp)
4781a39cfb0SJung-uk Kim             {
4791a39cfb0SJung-uk Kim                 /* This NamePath has no args, assume it is an integer */
4801a39cfb0SJung-uk Kim 
481f556842eSJung-uk Kim                 AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
4821a39cfb0SJung-uk Kim                 return (AE_OK);
4831a39cfb0SJung-uk Kim             }
4841a39cfb0SJung-uk Kim 
4851a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp);
486a88e22b7SJung-uk Kim             AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n", ArgCount, AcpiDmCountChildren (Op));
4871a39cfb0SJung-uk Kim 
4881a39cfb0SJung-uk Kim             if (ArgCount < 1)
4891a39cfb0SJung-uk Kim             {
4901a39cfb0SJung-uk Kim                 /* One Arg means this is just a Store(Name,Target) */
4911a39cfb0SJung-uk Kim 
492f556842eSJung-uk Kim                 AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
4931a39cfb0SJung-uk Kim                 return (AE_OK);
4941a39cfb0SJung-uk Kim             }
4951a39cfb0SJung-uk Kim 
496f556842eSJung-uk Kim             AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount);
4971a39cfb0SJung-uk Kim         }
4981a39cfb0SJung-uk Kim         break;
4991a39cfb0SJung-uk Kim #endif
5001a39cfb0SJung-uk Kim 
5011a39cfb0SJung-uk Kim     case AML_STORE_OP:
5021a39cfb0SJung-uk Kim 
5031a39cfb0SJung-uk Kim         ChildOp = Op->Common.Value.Arg;
5041a39cfb0SJung-uk Kim         if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
5051a39cfb0SJung-uk Kim             !ChildOp->Common.Node)
5061a39cfb0SJung-uk Kim         {
5071a39cfb0SJung-uk Kim             NextOp = Op->Common.Next;
5081a39cfb0SJung-uk Kim             if (!NextOp)
5091a39cfb0SJung-uk Kim             {
5101a39cfb0SJung-uk Kim                 /* This NamePath has no args, assume it is an integer */
5111a39cfb0SJung-uk Kim 
512f556842eSJung-uk Kim                 AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
5131a39cfb0SJung-uk Kim                 return (AE_OK);
5141a39cfb0SJung-uk Kim             }
5151a39cfb0SJung-uk Kim 
5161a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp);
5171a39cfb0SJung-uk Kim             if (ArgCount <= 1)
5181a39cfb0SJung-uk Kim             {
5191a39cfb0SJung-uk Kim                 /* One Arg means this is just a Store(Name,Target) */
5201a39cfb0SJung-uk Kim 
521f556842eSJung-uk Kim                 AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
5221a39cfb0SJung-uk Kim                 return (AE_OK);
5231a39cfb0SJung-uk Kim             }
5241a39cfb0SJung-uk Kim 
525f556842eSJung-uk Kim             AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount);
5261a39cfb0SJung-uk Kim         }
5271a39cfb0SJung-uk Kim         break;
5281a39cfb0SJung-uk Kim 
5291a39cfb0SJung-uk Kim     case AML_INT_NAMEPATH_OP:
5301a39cfb0SJung-uk Kim 
5311a39cfb0SJung-uk Kim         /* Must examine parent to see if this namepath is an argument */
5321a39cfb0SJung-uk Kim 
5331a39cfb0SJung-uk Kim         ParentOp = Op->Common.Parent;
5341a39cfb0SJung-uk Kim         OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
5351a39cfb0SJung-uk Kim 
5361a39cfb0SJung-uk Kim         if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
5371a39cfb0SJung-uk Kim             (OpInfo->Class != AML_CLASS_CREATE) &&
538a7a3b383SJung-uk Kim             (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
5391a39cfb0SJung-uk Kim             (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
5401a39cfb0SJung-uk Kim             !Op->Common.Node)
5411a39cfb0SJung-uk Kim         {
5421a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next);
5431a39cfb0SJung-uk Kim 
5441a39cfb0SJung-uk Kim             /*
5451a39cfb0SJung-uk Kim              * Check if namepath is a predicate for if/while or lone parameter to
5461a39cfb0SJung-uk Kim              * a return.
5471a39cfb0SJung-uk Kim              */
5481a39cfb0SJung-uk Kim             if (ArgCount == 0)
5491a39cfb0SJung-uk Kim             {
5501a39cfb0SJung-uk Kim                 if (((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
5511a39cfb0SJung-uk Kim                      (ParentOp->Common.AmlOpcode == AML_WHILE_OP) ||
5521a39cfb0SJung-uk Kim                      (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) &&
5531a39cfb0SJung-uk Kim 
5541a39cfb0SJung-uk Kim                      /* And namepath is the first argument */
5551a39cfb0SJung-uk Kim                      (ParentOp->Common.Value.Arg == Op))
5561a39cfb0SJung-uk Kim                 {
557f556842eSJung-uk Kim                     AcpiDmAddToExternalList (Op, Op->Common.Value.String, ACPI_TYPE_INTEGER, 0);
5581a39cfb0SJung-uk Kim                     break;
5591a39cfb0SJung-uk Kim                 }
5601a39cfb0SJung-uk Kim             }
5611a39cfb0SJung-uk Kim 
5621a39cfb0SJung-uk Kim             /*
5631a39cfb0SJung-uk Kim              * This is a standalone namestring (not a parameter to another
5641a39cfb0SJung-uk Kim              * operator) - it *must* be a method invocation, nothing else is
5651a39cfb0SJung-uk Kim              * grammatically possible.
5661a39cfb0SJung-uk Kim              */
567f556842eSJung-uk Kim             AcpiDmAddToExternalList (Op, Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount);
5681a39cfb0SJung-uk Kim 
5691a39cfb0SJung-uk Kim         }
5701a39cfb0SJung-uk Kim         break;
571a9f12690SJung-uk Kim 
572a9f12690SJung-uk Kim     default:
573a9d8d09cSJung-uk Kim 
574a9f12690SJung-uk Kim         break;
5751a39cfb0SJung-uk Kim     }
5761a39cfb0SJung-uk Kim 
5771a39cfb0SJung-uk Kim     return (AE_OK);
5781a39cfb0SJung-uk Kim }
5791a39cfb0SJung-uk Kim 
5801a39cfb0SJung-uk Kim 
5811a39cfb0SJung-uk Kim /*******************************************************************************
5821a39cfb0SJung-uk Kim  *
5831a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmLoadDescendingOp
5841a39cfb0SJung-uk Kim  *
5851a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
5861a39cfb0SJung-uk Kim  *
5871a39cfb0SJung-uk Kim  * RETURN:      Status
5881a39cfb0SJung-uk Kim  *
5891a39cfb0SJung-uk Kim  * DESCRIPTION: Descending handler for namespace control method object load
5901a39cfb0SJung-uk Kim  *
5911a39cfb0SJung-uk Kim  ******************************************************************************/
5921a39cfb0SJung-uk Kim 
5931a39cfb0SJung-uk Kim static ACPI_STATUS
5941a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp (
5951a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
5961a39cfb0SJung-uk Kim     UINT32                  Level,
5971a39cfb0SJung-uk Kim     void                    *Context)
5981a39cfb0SJung-uk Kim {
5991a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
6001a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
6011a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
6021a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
6031a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
6041a39cfb0SJung-uk Kim     char                    *Path = NULL;
6051a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
6061a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
607a9f12690SJung-uk Kim     char                    FieldPath[5];
608a9f12690SJung-uk Kim     BOOLEAN                 PreDefined = FALSE;
609a9f12690SJung-uk Kim     UINT8                   PreDefineIndex = 0;
6101a39cfb0SJung-uk Kim 
6111a39cfb0SJung-uk Kim 
6121a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
6131a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
6141a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
6151a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
6161a39cfb0SJung-uk Kim 
6171a39cfb0SJung-uk Kim     /* Only interested in operators that create new names */
6181a39cfb0SJung-uk Kim 
6191a39cfb0SJung-uk Kim     if (!(OpInfo->Flags & AML_NAMED) &&
6201a39cfb0SJung-uk Kim         !(OpInfo->Flags & AML_CREATE))
6211a39cfb0SJung-uk Kim     {
6221a39cfb0SJung-uk Kim         goto Exit;
6231a39cfb0SJung-uk Kim     }
6241a39cfb0SJung-uk Kim 
6251a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
6261a39cfb0SJung-uk Kim 
6271a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
6281a39cfb0SJung-uk Kim     {
6291a39cfb0SJung-uk Kim         /* For all named operators, get the new name */
6301a39cfb0SJung-uk Kim 
6311a39cfb0SJung-uk Kim         Path = (char *) Op->Named.Path;
632a9f12690SJung-uk Kim 
633a9f12690SJung-uk Kim         if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
634a9f12690SJung-uk Kim         {
635a9f12690SJung-uk Kim             *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name;
636a9f12690SJung-uk Kim             FieldPath[4] = 0;
637a9f12690SJung-uk Kim             Path = FieldPath;
638a9f12690SJung-uk Kim         }
6391a39cfb0SJung-uk Kim     }
6401a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
6411a39cfb0SJung-uk Kim     {
6421a39cfb0SJung-uk Kim         /* New name is the last child */
6431a39cfb0SJung-uk Kim 
6441a39cfb0SJung-uk Kim         NextOp = Op->Common.Value.Arg;
6451a39cfb0SJung-uk Kim 
6461a39cfb0SJung-uk Kim         while (NextOp->Common.Next)
6471a39cfb0SJung-uk Kim         {
6481a39cfb0SJung-uk Kim             NextOp = NextOp->Common.Next;
6491a39cfb0SJung-uk Kim         }
6501a39cfb0SJung-uk Kim         Path = NextOp->Common.Value.String;
6511a39cfb0SJung-uk Kim     }
6521a39cfb0SJung-uk Kim 
6531a39cfb0SJung-uk Kim     if (!Path)
6541a39cfb0SJung-uk Kim     {
6551a39cfb0SJung-uk Kim         goto Exit;
6561a39cfb0SJung-uk Kim     }
6571a39cfb0SJung-uk Kim 
6581a39cfb0SJung-uk Kim     /* Insert the name into the namespace */
6591a39cfb0SJung-uk Kim 
6601a39cfb0SJung-uk Kim     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
6611a39cfb0SJung-uk Kim                 ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE,
6621a39cfb0SJung-uk Kim                 WalkState, &Node);
6631a39cfb0SJung-uk Kim 
6641a39cfb0SJung-uk Kim     Op->Common.Node = Node;
6651a39cfb0SJung-uk Kim 
666a9f12690SJung-uk Kim     if (ACPI_SUCCESS (Status))
667a9f12690SJung-uk Kim     {
668a9f12690SJung-uk Kim         /* Check if it's a predefined node */
669a9f12690SJung-uk Kim 
670a9f12690SJung-uk Kim         while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name)
671a9f12690SJung-uk Kim         {
6728ef1a331SJung-uk Kim             if (ACPI_COMPARE_NAME (Node->Name.Ascii,
6738ef1a331SJung-uk Kim                 AcpiGbl_PreDefinedNames[PreDefineIndex].Name))
674a9f12690SJung-uk Kim             {
675a9f12690SJung-uk Kim                 PreDefined = TRUE;
676a9f12690SJung-uk Kim                 break;
677a9f12690SJung-uk Kim             }
678a9f12690SJung-uk Kim 
679a9f12690SJung-uk Kim             PreDefineIndex++;
680a9f12690SJung-uk Kim         }
681a9f12690SJung-uk Kim 
682a9f12690SJung-uk Kim         /*
683a9f12690SJung-uk Kim          * Set node owner id if it satisfies all the following conditions:
684a9f12690SJung-uk Kim          * 1) Not a predefined node, _SB_ etc
685a9f12690SJung-uk Kim          * 2) Not the root node
686a9f12690SJung-uk Kim          * 3) Not a node created by Scope
687a9f12690SJung-uk Kim          */
688a9f12690SJung-uk Kim 
689a9f12690SJung-uk Kim         if (!PreDefined && Node != AcpiGbl_RootNode &&
690a9f12690SJung-uk Kim             Op->Common.AmlOpcode != AML_SCOPE_OP)
691a9f12690SJung-uk Kim         {
692a9f12690SJung-uk Kim             Node->OwnerId = WalkState->OwnerId;
693a9f12690SJung-uk Kim         }
694a9f12690SJung-uk Kim     }
695a9f12690SJung-uk Kim 
6961a39cfb0SJung-uk Kim 
6971a39cfb0SJung-uk Kim Exit:
6981a39cfb0SJung-uk Kim 
6991a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
7001a39cfb0SJung-uk Kim     {
7011a39cfb0SJung-uk Kim         if (Op->Common.Node)
7021a39cfb0SJung-uk Kim         {
7031a39cfb0SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
7041a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
7051a39cfb0SJung-uk Kim             {
7061a39cfb0SJung-uk Kim                 return (Status);
7071a39cfb0SJung-uk Kim             }
7081a39cfb0SJung-uk Kim         }
7091a39cfb0SJung-uk Kim     }
7101a39cfb0SJung-uk Kim 
7111a39cfb0SJung-uk Kim     return (AE_OK);
7121a39cfb0SJung-uk Kim }
7131a39cfb0SJung-uk Kim 
7141a39cfb0SJung-uk Kim 
7151a39cfb0SJung-uk Kim /*******************************************************************************
7161a39cfb0SJung-uk Kim  *
7171a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmXrefDescendingOp
7181a39cfb0SJung-uk Kim  *
7191a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
7201a39cfb0SJung-uk Kim  *
7211a39cfb0SJung-uk Kim  * RETURN:      Status
7221a39cfb0SJung-uk Kim  *
7231a39cfb0SJung-uk Kim  * DESCRIPTION: Descending handler for namespace cross reference
7241a39cfb0SJung-uk Kim  *
7251a39cfb0SJung-uk Kim  ******************************************************************************/
7261a39cfb0SJung-uk Kim 
7271a39cfb0SJung-uk Kim static ACPI_STATUS
7281a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp (
7291a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
7301a39cfb0SJung-uk Kim     UINT32                  Level,
7311a39cfb0SJung-uk Kim     void                    *Context)
7321a39cfb0SJung-uk Kim {
7331a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
7341a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
7351a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
7361a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
737a9f12690SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType2;
7381a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
7391a39cfb0SJung-uk Kim     char                    *Path = NULL;
7401a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
7411a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
742a9f12690SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object;
74342fecd12SJung-uk Kim     UINT32                  ParamCount = 0;
7441a39cfb0SJung-uk Kim 
7451a39cfb0SJung-uk Kim 
7461a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
7471a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
7481a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
7491a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
7501a39cfb0SJung-uk Kim 
7511a39cfb0SJung-uk Kim     if ((!(OpInfo->Flags & AML_NAMED)) &&
7521a39cfb0SJung-uk Kim         (!(OpInfo->Flags & AML_CREATE)) &&
7531a39cfb0SJung-uk Kim         (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
7541a39cfb0SJung-uk Kim     {
7551a39cfb0SJung-uk Kim         goto Exit;
7561a39cfb0SJung-uk Kim     }
7571a39cfb0SJung-uk Kim 
7581a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
7591a39cfb0SJung-uk Kim 
7601a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
7611a39cfb0SJung-uk Kim     {
7621a39cfb0SJung-uk Kim         /*
763a7a3b383SJung-uk Kim          * Only these two operators (Alias, Scope) refer to an existing
764a7a3b383SJung-uk Kim          * name, it is the first argument
7651a39cfb0SJung-uk Kim          */
766a7a3b383SJung-uk Kim         if (Op->Common.AmlOpcode == AML_ALIAS_OP)
767a7a3b383SJung-uk Kim         {
768a7a3b383SJung-uk Kim             ObjectType = ACPI_TYPE_ANY;
769a7a3b383SJung-uk Kim 
770a7a3b383SJung-uk Kim             NextOp = Op->Common.Value.Arg;
771a7a3b383SJung-uk Kim             NextOp = NextOp->Common.Value.Arg;
772a7a3b383SJung-uk Kim             if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
773a7a3b383SJung-uk Kim             {
774a7a3b383SJung-uk Kim                 Path = NextOp->Common.Value.String;
775a7a3b383SJung-uk Kim             }
776a7a3b383SJung-uk Kim         }
777a7a3b383SJung-uk Kim         else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
778a7a3b383SJung-uk Kim         {
7791a39cfb0SJung-uk Kim             Path = (char *) Op->Named.Path;
7801a39cfb0SJung-uk Kim         }
7811a39cfb0SJung-uk Kim     }
7821a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
7831a39cfb0SJung-uk Kim     {
7841a39cfb0SJung-uk Kim         /* Referenced Buffer Name is the first child */
7851a39cfb0SJung-uk Kim 
786a7a3b383SJung-uk Kim         ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
787a7a3b383SJung-uk Kim 
7881a39cfb0SJung-uk Kim         NextOp = Op->Common.Value.Arg;
7891a39cfb0SJung-uk Kim         if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
7901a39cfb0SJung-uk Kim         {
7911a39cfb0SJung-uk Kim             Path = NextOp->Common.Value.String;
7921a39cfb0SJung-uk Kim         }
7931a39cfb0SJung-uk Kim     }
7941a39cfb0SJung-uk Kim     else
7951a39cfb0SJung-uk Kim     {
7961a39cfb0SJung-uk Kim         Path = Op->Common.Value.String;
7971a39cfb0SJung-uk Kim     }
7981a39cfb0SJung-uk Kim 
7991a39cfb0SJung-uk Kim     if (!Path)
8001a39cfb0SJung-uk Kim     {
8011a39cfb0SJung-uk Kim         goto Exit;
8021a39cfb0SJung-uk Kim     }
8031a39cfb0SJung-uk Kim 
8041a39cfb0SJung-uk Kim     /*
8051a39cfb0SJung-uk Kim      * Lookup the name in the namespace. Name must exist at this point, or it
8061a39cfb0SJung-uk Kim      * is an invalid reference.
8071a39cfb0SJung-uk Kim      *
8081a39cfb0SJung-uk Kim      * The namespace is also used as a lookup table for references to resource
8091a39cfb0SJung-uk Kim      * descriptors and the fields within them.
8101a39cfb0SJung-uk Kim      */
8111a39cfb0SJung-uk Kim     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
8121a39cfb0SJung-uk Kim                 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
8131a39cfb0SJung-uk Kim                 WalkState, &Node);
814a7a3b383SJung-uk Kim     if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
815a7a3b383SJung-uk Kim     {
816a7a3b383SJung-uk Kim         Status = AE_NOT_FOUND;
817a7a3b383SJung-uk Kim     }
818a7a3b383SJung-uk Kim 
8191a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
8201a39cfb0SJung-uk Kim     {
8211a39cfb0SJung-uk Kim         if (Status == AE_NOT_FOUND)
8221a39cfb0SJung-uk Kim         {
823f556842eSJung-uk Kim             AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0);
8241a39cfb0SJung-uk Kim 
8251a39cfb0SJung-uk Kim             /*
8261a39cfb0SJung-uk Kim              * We could install this into the namespace, but we catch duplicate
8271a39cfb0SJung-uk Kim              * externals when they are added to the list.
8281a39cfb0SJung-uk Kim              */
8291a39cfb0SJung-uk Kim #if 0
8301a39cfb0SJung-uk Kim             Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
8311a39cfb0SJung-uk Kim                        ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE,
8321a39cfb0SJung-uk Kim                        WalkState, &Node);
8331a39cfb0SJung-uk Kim #endif
8341a39cfb0SJung-uk Kim         }
8351a39cfb0SJung-uk Kim     }
836a9f12690SJung-uk Kim 
837a9f12690SJung-uk Kim     /*
838a9f12690SJung-uk Kim      * Found the node in external table, add it to external list
839a9f12690SJung-uk Kim      * Node->OwnerId == 0 indicates built-in ACPI Names, _OS_ etc
840a9f12690SJung-uk Kim      */
841a9f12690SJung-uk Kim     else if (Node->OwnerId && WalkState->OwnerId != Node->OwnerId)
842a9f12690SJung-uk Kim     {
843a9f12690SJung-uk Kim         ObjectType2 = ObjectType;
844a9f12690SJung-uk Kim 
845a9f12690SJung-uk Kim         Object = AcpiNsGetAttachedObject (Node);
846a9f12690SJung-uk Kim         if (Object)
847a9f12690SJung-uk Kim         {
848a9f12690SJung-uk Kim             ObjectType2 = Object->Common.Type;
849a9f12690SJung-uk Kim             if (ObjectType2 == ACPI_TYPE_METHOD)
850a9f12690SJung-uk Kim             {
85142fecd12SJung-uk Kim                 ParamCount = Object->Method.ParamCount;
852a9f12690SJung-uk Kim             }
853a9f12690SJung-uk Kim         }
854a9f12690SJung-uk Kim 
8559c48c75eSJung-uk Kim         AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType2, ParamCount | 0x80);
856a9f12690SJung-uk Kim         Op->Common.Node = Node;
857a9f12690SJung-uk Kim     }
8581a39cfb0SJung-uk Kim     else
8591a39cfb0SJung-uk Kim     {
8601a39cfb0SJung-uk Kim         Op->Common.Node = Node;
8611a39cfb0SJung-uk Kim     }
8621a39cfb0SJung-uk Kim 
8631a39cfb0SJung-uk Kim 
8641a39cfb0SJung-uk Kim Exit:
8651a39cfb0SJung-uk Kim     /* Open new scope if necessary */
8661a39cfb0SJung-uk Kim 
8671a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
8681a39cfb0SJung-uk Kim     {
8691a39cfb0SJung-uk Kim         if (Op->Common.Node)
8701a39cfb0SJung-uk Kim         {
8711a39cfb0SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
8721a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
8731a39cfb0SJung-uk Kim             {
8741a39cfb0SJung-uk Kim                 return (Status);
8751a39cfb0SJung-uk Kim             }
8761a39cfb0SJung-uk Kim         }
8771a39cfb0SJung-uk Kim     }
8781a39cfb0SJung-uk Kim 
8791a39cfb0SJung-uk Kim     return (AE_OK);
8801a39cfb0SJung-uk Kim }
8811a39cfb0SJung-uk Kim 
8821a39cfb0SJung-uk Kim 
8831a39cfb0SJung-uk Kim /*******************************************************************************
8841a39cfb0SJung-uk Kim  *
8851a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmResourceDescendingOp
8861a39cfb0SJung-uk Kim  *
8871a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
8881a39cfb0SJung-uk Kim  *
8891a39cfb0SJung-uk Kim  * RETURN:      None
8901a39cfb0SJung-uk Kim  *
8911a39cfb0SJung-uk Kim  * DESCRIPTION: Process one parse op during symbolic resource index conversion.
8921a39cfb0SJung-uk Kim  *
8931a39cfb0SJung-uk Kim  ******************************************************************************/
8941a39cfb0SJung-uk Kim 
8951a39cfb0SJung-uk Kim static ACPI_STATUS
8961a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp (
8971a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
8981a39cfb0SJung-uk Kim     UINT32                  Level,
8991a39cfb0SJung-uk Kim     void                    *Context)
9001a39cfb0SJung-uk Kim {
9011a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
9021a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
9031a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
9041a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
9051a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
9061a39cfb0SJung-uk Kim 
9071a39cfb0SJung-uk Kim 
9081a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
9091a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
9101a39cfb0SJung-uk Kim 
9111a39cfb0SJung-uk Kim     /* Open new scope if necessary */
9121a39cfb0SJung-uk Kim 
9131a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
9141a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
9151a39cfb0SJung-uk Kim     {
9161a39cfb0SJung-uk Kim         if (Op->Common.Node)
9171a39cfb0SJung-uk Kim         {
9181a39cfb0SJung-uk Kim 
9191a39cfb0SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
9201a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
9211a39cfb0SJung-uk Kim             {
9221a39cfb0SJung-uk Kim                 return (Status);
9231a39cfb0SJung-uk Kim             }
9241a39cfb0SJung-uk Kim         }
9251a39cfb0SJung-uk Kim     }
9261a39cfb0SJung-uk Kim 
9271a39cfb0SJung-uk Kim     /*
9281a39cfb0SJung-uk Kim      * Check if this operator contains a reference to a resource descriptor.
9291a39cfb0SJung-uk Kim      * If so, convert the reference into a symbolic reference.
9301a39cfb0SJung-uk Kim      */
9311a39cfb0SJung-uk Kim     AcpiDmCheckResourceReference (Op, WalkState);
9321a39cfb0SJung-uk Kim     return (AE_OK);
9331a39cfb0SJung-uk Kim }
9341a39cfb0SJung-uk Kim 
9351a39cfb0SJung-uk Kim 
9361a39cfb0SJung-uk Kim /*******************************************************************************
9371a39cfb0SJung-uk Kim  *
9381a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmCommonAscendingOp
9391a39cfb0SJung-uk Kim  *
9401a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
9411a39cfb0SJung-uk Kim  *
9421a39cfb0SJung-uk Kim  * RETURN:      None
9431a39cfb0SJung-uk Kim  *
9441a39cfb0SJung-uk Kim  * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes
9451a39cfb0SJung-uk Kim  *              scope if necessary.
9461a39cfb0SJung-uk Kim  *
9471a39cfb0SJung-uk Kim  ******************************************************************************/
9481a39cfb0SJung-uk Kim 
9491a39cfb0SJung-uk Kim static ACPI_STATUS
9501a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp (
9511a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
9521a39cfb0SJung-uk Kim     UINT32                  Level,
9531a39cfb0SJung-uk Kim     void                    *Context)
9541a39cfb0SJung-uk Kim {
9551a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
9561a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
9571a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
9581a39cfb0SJung-uk Kim 
9591a39cfb0SJung-uk Kim 
9601a39cfb0SJung-uk Kim     /* Close scope if necessary */
9611a39cfb0SJung-uk Kim 
9621a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
9631a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
9641a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
9651a39cfb0SJung-uk Kim 
9661a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
9671a39cfb0SJung-uk Kim     {
9681a39cfb0SJung-uk Kim         (void) AcpiDsScopeStackPop (Info->WalkState);
9691a39cfb0SJung-uk Kim     }
9701a39cfb0SJung-uk Kim 
9711a39cfb0SJung-uk Kim     return (AE_OK);
9721a39cfb0SJung-uk Kim }
9731a39cfb0SJung-uk Kim 
9741a39cfb0SJung-uk Kim 
9751a39cfb0SJung-uk Kim /*******************************************************************************
9761a39cfb0SJung-uk Kim  *
9771a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmInspectPossibleArgs
9781a39cfb0SJung-uk Kim  *
9791a39cfb0SJung-uk Kim  * PARAMETERS:  CurrentOpArgCount   - Which arg of the current op was the
9801a39cfb0SJung-uk Kim  *                                    possible method invocation found
9811a39cfb0SJung-uk Kim  *              TargetCount         - Number of targets (0,1,2) for this op
9821a39cfb0SJung-uk Kim  *              Op                  - Parse op
9831a39cfb0SJung-uk Kim  *
9841a39cfb0SJung-uk Kim  * RETURN:      Status
9851a39cfb0SJung-uk Kim  *
9861a39cfb0SJung-uk Kim  * DESCRIPTION: Examine following args and next ops for possible arguments
9871a39cfb0SJung-uk Kim  *              for an unrecognized method invocation.
9881a39cfb0SJung-uk Kim  *
9891a39cfb0SJung-uk Kim  ******************************************************************************/
9901a39cfb0SJung-uk Kim 
9911a39cfb0SJung-uk Kim static UINT32
9921a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs (
9931a39cfb0SJung-uk Kim     UINT32                  CurrentOpArgCount,
9941a39cfb0SJung-uk Kim     UINT32                  TargetCount,
9951a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
9961a39cfb0SJung-uk Kim {
9971a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
9981a39cfb0SJung-uk Kim     UINT32                  i;
9991a39cfb0SJung-uk Kim     UINT32                  Last = 0;
10001a39cfb0SJung-uk Kim     UINT32                  Lookahead;
10011a39cfb0SJung-uk Kim 
10021a39cfb0SJung-uk Kim 
10031a39cfb0SJung-uk Kim     Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount;
10041a39cfb0SJung-uk Kim 
10051a39cfb0SJung-uk Kim     /* Lookahead for the maximum number of possible arguments */
10061a39cfb0SJung-uk Kim 
10071a39cfb0SJung-uk Kim     for (i = 0; i < Lookahead; i++)
10081a39cfb0SJung-uk Kim     {
10091a39cfb0SJung-uk Kim         if (!Op)
10101a39cfb0SJung-uk Kim         {
10111a39cfb0SJung-uk Kim             break;
10121a39cfb0SJung-uk Kim         }
10131a39cfb0SJung-uk Kim 
10141a39cfb0SJung-uk Kim         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
10151a39cfb0SJung-uk Kim 
10161a39cfb0SJung-uk Kim         /*
10171a39cfb0SJung-uk Kim          * Any one of these operators is "very probably" not a method arg
10181a39cfb0SJung-uk Kim          */
10191a39cfb0SJung-uk Kim         if ((Op->Common.AmlOpcode == AML_STORE_OP) ||
10201a39cfb0SJung-uk Kim             (Op->Common.AmlOpcode == AML_NOTIFY_OP))
10211a39cfb0SJung-uk Kim         {
10221a39cfb0SJung-uk Kim             break;
10231a39cfb0SJung-uk Kim         }
10241a39cfb0SJung-uk Kim 
10251a39cfb0SJung-uk Kim         if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
10261a39cfb0SJung-uk Kim             (OpInfo->Class != AML_CLASS_CONTROL))
10271a39cfb0SJung-uk Kim         {
10281a39cfb0SJung-uk Kim             Last = i+1;
10291a39cfb0SJung-uk Kim         }
10301a39cfb0SJung-uk Kim 
10311a39cfb0SJung-uk Kim         Op = Op->Common.Next;
10321a39cfb0SJung-uk Kim     }
10331a39cfb0SJung-uk Kim 
10341a39cfb0SJung-uk Kim     return (Last);
10351a39cfb0SJung-uk Kim }
1036