xref: /freebsd/sys/contrib/dev/acpica/common/adwalk.c (revision f8146b882bc156c1d8ddf14bbea67253ebc064bb)
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 /*
8*f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, 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 
44ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h>
47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
48ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h>
50ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
51ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
521a39cfb0SJung-uk Kim 
531a39cfb0SJung-uk Kim 
541a39cfb0SJung-uk Kim #define _COMPONENT          ACPI_TOOLS
551a39cfb0SJung-uk Kim         ACPI_MODULE_NAME    ("adwalk")
561a39cfb0SJung-uk Kim 
571a39cfb0SJung-uk Kim /*
581a39cfb0SJung-uk Kim  * aslmap - opcode mappings and reserved method names
591a39cfb0SJung-uk Kim  */
601a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE
611a39cfb0SJung-uk Kim AslMapNamedOpcodeToDataType (
621a39cfb0SJung-uk Kim     UINT16                  Opcode);
631a39cfb0SJung-uk Kim 
641a39cfb0SJung-uk Kim /* Local prototypes */
651a39cfb0SJung-uk Kim 
661a39cfb0SJung-uk Kim static ACPI_STATUS
671a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending (
681a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
691a39cfb0SJung-uk Kim     UINT32                  Level,
701a39cfb0SJung-uk Kim     void                    *Context);
711a39cfb0SJung-uk Kim 
721a39cfb0SJung-uk Kim static ACPI_STATUS
731a39cfb0SJung-uk Kim AcpiDmDumpDescending (
741a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
751a39cfb0SJung-uk Kim     UINT32                  Level,
761a39cfb0SJung-uk Kim     void                    *Context);
771a39cfb0SJung-uk Kim 
781a39cfb0SJung-uk Kim static ACPI_STATUS
791a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp (
801a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
811a39cfb0SJung-uk Kim     UINT32                  Level,
821a39cfb0SJung-uk Kim     void                    *Context);
831a39cfb0SJung-uk Kim 
841a39cfb0SJung-uk Kim static ACPI_STATUS
851a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp (
861a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
871a39cfb0SJung-uk Kim     UINT32                  Level,
881a39cfb0SJung-uk Kim     void                    *Context);
891a39cfb0SJung-uk Kim 
901a39cfb0SJung-uk Kim static ACPI_STATUS
911a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp (
921a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
931a39cfb0SJung-uk Kim     UINT32                  Level,
941a39cfb0SJung-uk Kim     void                    *Context);
951a39cfb0SJung-uk Kim 
961a39cfb0SJung-uk Kim static UINT32
971a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs (
981a39cfb0SJung-uk Kim     UINT32                  CurrentOpArgCount,
991a39cfb0SJung-uk Kim     UINT32                  TargetCount,
1001a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
1011a39cfb0SJung-uk Kim 
1021a39cfb0SJung-uk Kim static ACPI_STATUS
1031a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp (
1041a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
1051a39cfb0SJung-uk Kim     UINT32                  Level,
1061a39cfb0SJung-uk Kim     void                    *Context);
1071a39cfb0SJung-uk Kim 
1081a39cfb0SJung-uk Kim 
1091a39cfb0SJung-uk Kim /*******************************************************************************
1101a39cfb0SJung-uk Kim  *
1111a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmDumpTree
1121a39cfb0SJung-uk Kim  *
1131a39cfb0SJung-uk Kim  * PARAMETERS:  Origin              - Starting object
1141a39cfb0SJung-uk Kim  *
1151a39cfb0SJung-uk Kim  * RETURN:      None
1161a39cfb0SJung-uk Kim  *
1171a39cfb0SJung-uk Kim  * DESCRIPTION: Parse tree walk to format and output the nodes
1181a39cfb0SJung-uk Kim  *
1191a39cfb0SJung-uk Kim  ******************************************************************************/
1201a39cfb0SJung-uk Kim 
1211a39cfb0SJung-uk Kim void
1221a39cfb0SJung-uk Kim AcpiDmDumpTree (
1231a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Origin)
1241a39cfb0SJung-uk Kim {
1251a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
1261a39cfb0SJung-uk Kim 
1271a39cfb0SJung-uk Kim 
1281a39cfb0SJung-uk Kim     if (!Origin)
1291a39cfb0SJung-uk Kim     {
1301a39cfb0SJung-uk Kim         return;
1311a39cfb0SJung-uk Kim     }
1321a39cfb0SJung-uk Kim 
1331a39cfb0SJung-uk Kim     AcpiOsPrintf ("/*\nAML Parse Tree\n\n");
1341a39cfb0SJung-uk Kim     Info.Flags = 0;
1351a39cfb0SJung-uk Kim     Info.Count = 0;
1361a39cfb0SJung-uk Kim     Info.Level = 0;
1371a39cfb0SJung-uk Kim     Info.WalkState = NULL;
138*f8146b88SJung-uk Kim 
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;
172*f8146b88SJung-uk Kim 
1731a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info);
1741a39cfb0SJung-uk Kim }
1751a39cfb0SJung-uk Kim 
1761a39cfb0SJung-uk Kim 
1771a39cfb0SJung-uk Kim /*******************************************************************************
1781a39cfb0SJung-uk Kim  *
1791a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmFinishNamespaceLoad
1801a39cfb0SJung-uk Kim  *
1811a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
1821a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
183a9f12690SJung-uk Kim  *              OwnerId             - OwnerId of the table to be disassembled
1841a39cfb0SJung-uk Kim  *
1851a39cfb0SJung-uk Kim  * RETURN:      None
1861a39cfb0SJung-uk Kim  *
1871a39cfb0SJung-uk Kim  * DESCRIPTION: Load all namespace items that are created within control
1881a39cfb0SJung-uk Kim  *              methods. Used before namespace cross reference
1891a39cfb0SJung-uk Kim  *
1901a39cfb0SJung-uk Kim  ******************************************************************************/
1911a39cfb0SJung-uk Kim 
1921a39cfb0SJung-uk Kim void
1931a39cfb0SJung-uk Kim AcpiDmFinishNamespaceLoad (
1941a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
195a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot,
196a9f12690SJung-uk Kim     ACPI_OWNER_ID           OwnerId)
1971a39cfb0SJung-uk Kim {
1981a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
1991a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
2001a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
2011a39cfb0SJung-uk Kim 
2021a39cfb0SJung-uk Kim 
2031a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
2041a39cfb0SJung-uk Kim     {
2051a39cfb0SJung-uk Kim         return;
2061a39cfb0SJung-uk Kim     }
2071a39cfb0SJung-uk Kim 
2081a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
2091a39cfb0SJung-uk Kim 
210a9f12690SJung-uk Kim     WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
2111a39cfb0SJung-uk Kim     if (!WalkState)
2121a39cfb0SJung-uk Kim     {
2131a39cfb0SJung-uk Kim         return;
2141a39cfb0SJung-uk Kim     }
2151a39cfb0SJung-uk Kim 
216*f8146b88SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type,
217*f8146b88SJung-uk Kim         WalkState);
2181a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
2191a39cfb0SJung-uk Kim     {
2201a39cfb0SJung-uk Kim         return;
2211a39cfb0SJung-uk Kim     }
2221a39cfb0SJung-uk Kim 
2231a39cfb0SJung-uk Kim     Info.Flags = 0;
2241a39cfb0SJung-uk Kim     Info.Level = 0;
2251a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
226*f8146b88SJung-uk Kim 
2271a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp,
2281a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
2291a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
2301a39cfb0SJung-uk Kim }
2311a39cfb0SJung-uk Kim 
2321a39cfb0SJung-uk Kim 
2331a39cfb0SJung-uk Kim /*******************************************************************************
2341a39cfb0SJung-uk Kim  *
2351a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmCrossReferenceNamespace
2361a39cfb0SJung-uk Kim  *
2371a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
2381a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
239a9f12690SJung-uk Kim  *              OwnerId             - OwnerId of the table to be disassembled
2401a39cfb0SJung-uk Kim  *
2411a39cfb0SJung-uk Kim  * RETURN:      None
2421a39cfb0SJung-uk Kim  *
2431a39cfb0SJung-uk Kim  * DESCRIPTION: Cross reference the namespace to create externals
2441a39cfb0SJung-uk Kim  *
2451a39cfb0SJung-uk Kim  ******************************************************************************/
2461a39cfb0SJung-uk Kim 
2471a39cfb0SJung-uk Kim void
2481a39cfb0SJung-uk Kim AcpiDmCrossReferenceNamespace (
2491a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
250a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot,
251a9f12690SJung-uk Kim     ACPI_OWNER_ID           OwnerId)
2521a39cfb0SJung-uk Kim {
2531a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
2541a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
2551a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
2561a39cfb0SJung-uk Kim 
2571a39cfb0SJung-uk Kim 
2581a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
2591a39cfb0SJung-uk Kim     {
2601a39cfb0SJung-uk Kim         return;
2611a39cfb0SJung-uk Kim     }
2621a39cfb0SJung-uk Kim 
2631a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
2641a39cfb0SJung-uk Kim 
265a9f12690SJung-uk Kim     WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
2661a39cfb0SJung-uk Kim     if (!WalkState)
2671a39cfb0SJung-uk Kim     {
2681a39cfb0SJung-uk Kim         return;
2691a39cfb0SJung-uk Kim     }
2701a39cfb0SJung-uk Kim 
271*f8146b88SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type,
272*f8146b88SJung-uk Kim         WalkState);
2731a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
2741a39cfb0SJung-uk Kim     {
2751a39cfb0SJung-uk Kim         return;
2761a39cfb0SJung-uk Kim     }
2771a39cfb0SJung-uk Kim 
2781a39cfb0SJung-uk Kim     Info.Flags = 0;
2791a39cfb0SJung-uk Kim     Info.Level = 0;
2801a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
281*f8146b88SJung-uk Kim 
2821a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp,
2831a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
2841a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
2851a39cfb0SJung-uk Kim }
2861a39cfb0SJung-uk Kim 
2871a39cfb0SJung-uk Kim 
2881a39cfb0SJung-uk Kim /*******************************************************************************
2891a39cfb0SJung-uk Kim  *
2901a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmConvertResourceIndexes
2911a39cfb0SJung-uk Kim  *
2921a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
2931a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
2941a39cfb0SJung-uk Kim  *
2951a39cfb0SJung-uk Kim  * RETURN:      None
2961a39cfb0SJung-uk Kim  *
2971a39cfb0SJung-uk Kim  * DESCRIPTION: Convert fixed-offset references to resource descriptors to
2981a39cfb0SJung-uk Kim  *              symbolic references. Should only be called after namespace has
2991a39cfb0SJung-uk Kim  *              been cross referenced.
3001a39cfb0SJung-uk Kim  *
3011a39cfb0SJung-uk Kim  ******************************************************************************/
3021a39cfb0SJung-uk Kim 
3031a39cfb0SJung-uk Kim void
3041a39cfb0SJung-uk Kim AcpiDmConvertResourceIndexes (
3051a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
3061a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot)
3071a39cfb0SJung-uk Kim {
3081a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
3091a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
3101a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
3111a39cfb0SJung-uk Kim 
3121a39cfb0SJung-uk Kim 
3131a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
3141a39cfb0SJung-uk Kim     {
3151a39cfb0SJung-uk Kim         return;
3161a39cfb0SJung-uk Kim     }
3171a39cfb0SJung-uk Kim 
3181a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
3191a39cfb0SJung-uk Kim 
3201a39cfb0SJung-uk Kim     WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
3211a39cfb0SJung-uk Kim     if (!WalkState)
3221a39cfb0SJung-uk Kim     {
3231a39cfb0SJung-uk Kim         return;
3241a39cfb0SJung-uk Kim     }
3251a39cfb0SJung-uk Kim 
326*f8146b88SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type,
327*f8146b88SJung-uk Kim         WalkState);
3281a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
3291a39cfb0SJung-uk Kim     {
330*f8146b88SJung-uk Kim         ACPI_FREE (WalkState);
3311a39cfb0SJung-uk Kim         return;
3321a39cfb0SJung-uk Kim     }
3331a39cfb0SJung-uk Kim 
3341a39cfb0SJung-uk Kim     Info.Flags = 0;
3351a39cfb0SJung-uk Kim     Info.Level = 0;
3361a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
337*f8146b88SJung-uk Kim 
3381a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp,
3391a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
3401a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
3411a39cfb0SJung-uk Kim     return;
3421a39cfb0SJung-uk Kim }
3431a39cfb0SJung-uk Kim 
3441a39cfb0SJung-uk Kim 
3451a39cfb0SJung-uk Kim /*******************************************************************************
3461a39cfb0SJung-uk Kim  *
3471a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmDumpDescending
3481a39cfb0SJung-uk Kim  *
3491a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
3501a39cfb0SJung-uk Kim  *
3511a39cfb0SJung-uk Kim  * RETURN:      Status
3521a39cfb0SJung-uk Kim  *
3531a39cfb0SJung-uk Kim  * DESCRIPTION: Format and print contents of one parse Op.
3541a39cfb0SJung-uk Kim  *
3551a39cfb0SJung-uk Kim  ******************************************************************************/
3561a39cfb0SJung-uk Kim 
3571a39cfb0SJung-uk Kim static ACPI_STATUS
3581a39cfb0SJung-uk Kim AcpiDmDumpDescending (
3591a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
3601a39cfb0SJung-uk Kim     UINT32                  Level,
3611a39cfb0SJung-uk Kim     void                    *Context)
3621a39cfb0SJung-uk Kim {
3631a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
3641a39cfb0SJung-uk Kim     char                    *Path;
3651a39cfb0SJung-uk Kim 
3661a39cfb0SJung-uk Kim 
3671a39cfb0SJung-uk Kim     if (!Op)
3681a39cfb0SJung-uk Kim     {
3691a39cfb0SJung-uk Kim         return (AE_OK);
3701a39cfb0SJung-uk Kim     }
3711a39cfb0SJung-uk Kim 
3721a39cfb0SJung-uk Kim     /* Most of the information (count, level, name) here */
3731a39cfb0SJung-uk Kim 
374f556842eSJung-uk Kim     Info->Count++;
3751a39cfb0SJung-uk Kim     AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level);
3761a39cfb0SJung-uk Kim     AcpiDmIndent (Level);
3771a39cfb0SJung-uk Kim     AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
3781a39cfb0SJung-uk Kim 
3791a39cfb0SJung-uk Kim     /* Extra info is helpful */
3801a39cfb0SJung-uk Kim 
3811a39cfb0SJung-uk Kim     switch (Op->Common.AmlOpcode)
3821a39cfb0SJung-uk Kim     {
3831a39cfb0SJung-uk Kim     case AML_BYTE_OP:
38479c6d946SJung-uk Kim 
38579c6d946SJung-uk Kim         AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer);
38679c6d946SJung-uk Kim         break;
38779c6d946SJung-uk Kim 
3881a39cfb0SJung-uk Kim     case AML_WORD_OP:
38979c6d946SJung-uk Kim 
39079c6d946SJung-uk Kim         AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer);
39179c6d946SJung-uk Kim         break;
39279c6d946SJung-uk Kim 
3931a39cfb0SJung-uk Kim     case AML_DWORD_OP:
394a9d8d09cSJung-uk Kim 
39579c6d946SJung-uk Kim         AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer);
3961a39cfb0SJung-uk Kim         break;
3971a39cfb0SJung-uk Kim 
3983f0275a0SJung-uk Kim     case AML_QWORD_OP:
399a9d8d09cSJung-uk Kim 
4003f0275a0SJung-uk Kim         AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
4013f0275a0SJung-uk Kim         break;
4023f0275a0SJung-uk Kim 
4031a39cfb0SJung-uk Kim     case AML_INT_NAMEPATH_OP:
404a9d8d09cSJung-uk Kim 
4051a39cfb0SJung-uk Kim         if (Op->Common.Value.String)
4061a39cfb0SJung-uk Kim         {
4071a39cfb0SJung-uk Kim             AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String,
4081a39cfb0SJung-uk Kim                 NULL, &Path);
4091a39cfb0SJung-uk Kim             AcpiOsPrintf ("%s %p", Path, Op->Common.Node);
4101a39cfb0SJung-uk Kim             ACPI_FREE (Path);
4111a39cfb0SJung-uk Kim         }
4121a39cfb0SJung-uk Kim         else
4131a39cfb0SJung-uk Kim         {
4141a39cfb0SJung-uk Kim             AcpiOsPrintf ("[NULL]");
4151a39cfb0SJung-uk Kim         }
4161a39cfb0SJung-uk Kim         break;
4171a39cfb0SJung-uk Kim 
4181a39cfb0SJung-uk Kim     case AML_NAME_OP:
4191a39cfb0SJung-uk Kim     case AML_METHOD_OP:
4201a39cfb0SJung-uk Kim     case AML_DEVICE_OP:
4211a39cfb0SJung-uk Kim     case AML_INT_NAMEDFIELD_OP:
422a9d8d09cSJung-uk Kim 
423f556842eSJung-uk Kim         AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name));
4241a39cfb0SJung-uk Kim         break;
425a9f12690SJung-uk Kim 
426a9f12690SJung-uk Kim     default:
427a9d8d09cSJung-uk Kim 
428a9f12690SJung-uk Kim         break;
4291a39cfb0SJung-uk Kim     }
4301a39cfb0SJung-uk Kim 
4311a39cfb0SJung-uk Kim     AcpiOsPrintf ("\n");
4321a39cfb0SJung-uk Kim     return (AE_OK);
4331a39cfb0SJung-uk Kim }
4341a39cfb0SJung-uk Kim 
4351a39cfb0SJung-uk Kim 
4361a39cfb0SJung-uk Kim /*******************************************************************************
4371a39cfb0SJung-uk Kim  *
4381a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmFindOrphanDescending
4391a39cfb0SJung-uk Kim  *
4401a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
4411a39cfb0SJung-uk Kim  *
4421a39cfb0SJung-uk Kim  * RETURN:      Status
4431a39cfb0SJung-uk Kim  *
4441a39cfb0SJung-uk Kim  * DESCRIPTION: Check namepath Ops for orphaned method invocations
4451a39cfb0SJung-uk Kim  *
446*f8146b88SJung-uk Kim  * Note: Parts of this are experimental, under possible further development.
4471a39cfb0SJung-uk Kim  *
4481a39cfb0SJung-uk Kim  ******************************************************************************/
4491a39cfb0SJung-uk Kim 
4501a39cfb0SJung-uk Kim static ACPI_STATUS
4511a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending (
4521a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
4531a39cfb0SJung-uk Kim     UINT32                  Level,
4541a39cfb0SJung-uk Kim     void                    *Context)
4551a39cfb0SJung-uk Kim {
4561a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
4571a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ChildOp;
4581a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
4591a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParentOp;
4601a39cfb0SJung-uk Kim     UINT32                  ArgCount;
4611a39cfb0SJung-uk Kim 
4621a39cfb0SJung-uk Kim 
4631a39cfb0SJung-uk Kim     if (!Op)
4641a39cfb0SJung-uk Kim     {
4651a39cfb0SJung-uk Kim         return (AE_OK);
4661a39cfb0SJung-uk Kim     }
4671a39cfb0SJung-uk Kim 
4681a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
4691a39cfb0SJung-uk Kim 
4701a39cfb0SJung-uk Kim     switch (Op->Common.AmlOpcode)
4711a39cfb0SJung-uk Kim     {
4721a39cfb0SJung-uk Kim #ifdef ACPI_UNDER_DEVELOPMENT
4731a39cfb0SJung-uk Kim     case AML_ADD_OP:
474a9d8d09cSJung-uk Kim 
4751a39cfb0SJung-uk Kim         ChildOp = Op->Common.Value.Arg;
4761a39cfb0SJung-uk Kim         if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
4771a39cfb0SJung-uk Kim             !ChildOp->Common.Node)
4781a39cfb0SJung-uk Kim         {
4791a39cfb0SJung-uk Kim             AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String,
4801a39cfb0SJung-uk Kim                 NULL, &Path);
481313a0c13SJung-uk Kim             AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s  */\n",
482313a0c13SJung-uk Kim                 Op->Common.AmlOpName, Path);
4831a39cfb0SJung-uk Kim             ACPI_FREE (Path);
4841a39cfb0SJung-uk Kim 
4851a39cfb0SJung-uk Kim             NextOp = Op->Common.Next;
4861a39cfb0SJung-uk Kim             if (!NextOp)
4871a39cfb0SJung-uk Kim             {
4881a39cfb0SJung-uk Kim                 /* This NamePath has no args, assume it is an integer */
4891a39cfb0SJung-uk Kim 
490313a0c13SJung-uk Kim                 AcpiDmAddOpToExternalList (ChildOp,
491313a0c13SJung-uk Kim                     ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
4921a39cfb0SJung-uk Kim                 return (AE_OK);
4931a39cfb0SJung-uk Kim             }
4941a39cfb0SJung-uk Kim 
4951a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp);
496313a0c13SJung-uk Kim             AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n",
497313a0c13SJung-uk Kim                 ArgCount, AcpiDmCountChildren (Op));
4981a39cfb0SJung-uk Kim 
4991a39cfb0SJung-uk Kim             if (ArgCount < 1)
5001a39cfb0SJung-uk Kim             {
5011a39cfb0SJung-uk Kim                 /* One Arg means this is just a Store(Name,Target) */
5021a39cfb0SJung-uk Kim 
503313a0c13SJung-uk Kim                 AcpiDmAddOpToExternalList (ChildOp,
504313a0c13SJung-uk Kim                     ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
5051a39cfb0SJung-uk Kim                 return (AE_OK);
5061a39cfb0SJung-uk Kim             }
5071a39cfb0SJung-uk Kim 
508313a0c13SJung-uk Kim             AcpiDmAddOpToExternalList (ChildOp,
509313a0c13SJung-uk Kim                 ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
5101a39cfb0SJung-uk Kim         }
5111a39cfb0SJung-uk Kim         break;
512*f8146b88SJung-uk Kim 
5131a39cfb0SJung-uk Kim #endif
5141a39cfb0SJung-uk Kim 
5151a39cfb0SJung-uk Kim     case AML_STORE_OP:
5161a39cfb0SJung-uk Kim 
5171a39cfb0SJung-uk Kim         ChildOp = Op->Common.Value.Arg;
5181a39cfb0SJung-uk Kim         if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
5191a39cfb0SJung-uk Kim             !ChildOp->Common.Node)
5201a39cfb0SJung-uk Kim         {
5211a39cfb0SJung-uk Kim             NextOp = Op->Common.Next;
5221a39cfb0SJung-uk Kim             if (!NextOp)
5231a39cfb0SJung-uk Kim             {
5241a39cfb0SJung-uk Kim                 /* This NamePath has no args, assume it is an integer */
5251a39cfb0SJung-uk Kim 
526313a0c13SJung-uk Kim                 AcpiDmAddOpToExternalList (ChildOp,
527313a0c13SJung-uk Kim                     ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
5281a39cfb0SJung-uk Kim                 return (AE_OK);
5291a39cfb0SJung-uk Kim             }
5301a39cfb0SJung-uk Kim 
5311a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp);
5321a39cfb0SJung-uk Kim             if (ArgCount <= 1)
5331a39cfb0SJung-uk Kim             {
5341a39cfb0SJung-uk Kim                 /* One Arg means this is just a Store(Name,Target) */
5351a39cfb0SJung-uk Kim 
536313a0c13SJung-uk Kim                 AcpiDmAddOpToExternalList (ChildOp,
537*f8146b88SJung-uk Kim                     ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, ArgCount, 0);
5381a39cfb0SJung-uk Kim                 return (AE_OK);
5391a39cfb0SJung-uk Kim             }
5401a39cfb0SJung-uk Kim 
541313a0c13SJung-uk Kim             AcpiDmAddOpToExternalList (ChildOp,
542313a0c13SJung-uk Kim                 ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
5431a39cfb0SJung-uk Kim         }
5441a39cfb0SJung-uk Kim         break;
5451a39cfb0SJung-uk Kim 
5461a39cfb0SJung-uk Kim     case AML_INT_NAMEPATH_OP:
5471a39cfb0SJung-uk Kim 
5481a39cfb0SJung-uk Kim         /* Must examine parent to see if this namepath is an argument */
5491a39cfb0SJung-uk Kim 
5501a39cfb0SJung-uk Kim         ParentOp = Op->Common.Parent;
5511a39cfb0SJung-uk Kim         OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
5521a39cfb0SJung-uk Kim 
5531a39cfb0SJung-uk Kim         if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
5541a39cfb0SJung-uk Kim             (OpInfo->Class != AML_CLASS_CREATE) &&
555a7a3b383SJung-uk Kim             (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
5561a39cfb0SJung-uk Kim             (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
5571a39cfb0SJung-uk Kim             !Op->Common.Node)
5581a39cfb0SJung-uk Kim         {
559*f8146b88SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op);
5601a39cfb0SJung-uk Kim 
5611a39cfb0SJung-uk Kim             /*
5621a39cfb0SJung-uk Kim              * Check if namepath is a predicate for if/while or lone parameter to
5631a39cfb0SJung-uk Kim              * a return.
5641a39cfb0SJung-uk Kim              */
5651a39cfb0SJung-uk Kim             if (ArgCount == 0)
5661a39cfb0SJung-uk Kim             {
5671a39cfb0SJung-uk Kim                 if (((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
5681a39cfb0SJung-uk Kim                      (ParentOp->Common.AmlOpcode == AML_WHILE_OP) ||
5691a39cfb0SJung-uk Kim                      (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) &&
5701a39cfb0SJung-uk Kim 
5711a39cfb0SJung-uk Kim                      /* And namepath is the first argument */
5721a39cfb0SJung-uk Kim                      (ParentOp->Common.Value.Arg == Op))
5731a39cfb0SJung-uk Kim                 {
574313a0c13SJung-uk Kim                     AcpiDmAddOpToExternalList (Op,
575313a0c13SJung-uk Kim                         Op->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
5761a39cfb0SJung-uk Kim                     break;
5771a39cfb0SJung-uk Kim                 }
5781a39cfb0SJung-uk Kim             }
5791a39cfb0SJung-uk Kim 
5801a39cfb0SJung-uk Kim             /*
5811a39cfb0SJung-uk Kim              * This is a standalone namestring (not a parameter to another
5821a39cfb0SJung-uk Kim              * operator) - it *must* be a method invocation, nothing else is
5831a39cfb0SJung-uk Kim              * grammatically possible.
5841a39cfb0SJung-uk Kim              */
585313a0c13SJung-uk Kim             AcpiDmAddOpToExternalList (Op,
586313a0c13SJung-uk Kim                 Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
5871a39cfb0SJung-uk Kim         }
5881a39cfb0SJung-uk Kim         break;
589a9f12690SJung-uk Kim 
590a9f12690SJung-uk Kim     default:
591a9d8d09cSJung-uk Kim 
592a9f12690SJung-uk Kim         break;
5931a39cfb0SJung-uk Kim     }
5941a39cfb0SJung-uk Kim 
5951a39cfb0SJung-uk Kim     return (AE_OK);
5961a39cfb0SJung-uk Kim }
5971a39cfb0SJung-uk Kim 
5981a39cfb0SJung-uk Kim 
5991a39cfb0SJung-uk Kim /*******************************************************************************
6001a39cfb0SJung-uk Kim  *
6011a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmLoadDescendingOp
6021a39cfb0SJung-uk Kim  *
6031a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
6041a39cfb0SJung-uk Kim  *
6051a39cfb0SJung-uk Kim  * RETURN:      Status
6061a39cfb0SJung-uk Kim  *
6071a39cfb0SJung-uk Kim  * DESCRIPTION: Descending handler for namespace control method object load
6081a39cfb0SJung-uk Kim  *
6091a39cfb0SJung-uk Kim  ******************************************************************************/
6101a39cfb0SJung-uk Kim 
6111a39cfb0SJung-uk Kim static ACPI_STATUS
6121a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp (
6131a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
6141a39cfb0SJung-uk Kim     UINT32                  Level,
6151a39cfb0SJung-uk Kim     void                    *Context)
6161a39cfb0SJung-uk Kim {
6171a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
6181a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
6191a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
6201a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
6211a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
6221a39cfb0SJung-uk Kim     char                    *Path = NULL;
6231a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
6241a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
625a9f12690SJung-uk Kim     char                    FieldPath[5];
626a9f12690SJung-uk Kim     BOOLEAN                 PreDefined = FALSE;
627a9f12690SJung-uk Kim     UINT8                   PreDefineIndex = 0;
6281a39cfb0SJung-uk Kim 
6291a39cfb0SJung-uk Kim 
6301a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
6311a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
6321a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
6331a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
6341a39cfb0SJung-uk Kim 
6351a39cfb0SJung-uk Kim     /* Only interested in operators that create new names */
6361a39cfb0SJung-uk Kim 
6371a39cfb0SJung-uk Kim     if (!(OpInfo->Flags & AML_NAMED) &&
6381a39cfb0SJung-uk Kim         !(OpInfo->Flags & AML_CREATE))
6391a39cfb0SJung-uk Kim     {
6401a39cfb0SJung-uk Kim         goto Exit;
6411a39cfb0SJung-uk Kim     }
6421a39cfb0SJung-uk Kim 
6431a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
6441a39cfb0SJung-uk Kim 
6451a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
6461a39cfb0SJung-uk Kim     {
6471a39cfb0SJung-uk Kim         /* For all named operators, get the new name */
6481a39cfb0SJung-uk Kim 
6491a39cfb0SJung-uk Kim         Path = (char *) Op->Named.Path;
650a9f12690SJung-uk Kim 
651a9f12690SJung-uk Kim         if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
652a9f12690SJung-uk Kim         {
653a9f12690SJung-uk Kim             *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name;
654a9f12690SJung-uk Kim             FieldPath[4] = 0;
655a9f12690SJung-uk Kim             Path = FieldPath;
656a9f12690SJung-uk Kim         }
6571a39cfb0SJung-uk Kim     }
6581a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
6591a39cfb0SJung-uk Kim     {
6601a39cfb0SJung-uk Kim         /* New name is the last child */
6611a39cfb0SJung-uk Kim 
6621a39cfb0SJung-uk Kim         NextOp = Op->Common.Value.Arg;
6631a39cfb0SJung-uk Kim 
6641a39cfb0SJung-uk Kim         while (NextOp->Common.Next)
6651a39cfb0SJung-uk Kim         {
6661a39cfb0SJung-uk Kim             NextOp = NextOp->Common.Next;
6671a39cfb0SJung-uk Kim         }
668*f8146b88SJung-uk Kim 
6691a39cfb0SJung-uk Kim         Path = NextOp->Common.Value.String;
6701a39cfb0SJung-uk Kim     }
6711a39cfb0SJung-uk Kim 
6721a39cfb0SJung-uk Kim     if (!Path)
6731a39cfb0SJung-uk Kim     {
6741a39cfb0SJung-uk Kim         goto Exit;
6751a39cfb0SJung-uk Kim     }
6761a39cfb0SJung-uk Kim 
6771a39cfb0SJung-uk Kim     /* Insert the name into the namespace */
6781a39cfb0SJung-uk Kim 
6791a39cfb0SJung-uk Kim     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
6801a39cfb0SJung-uk Kim         ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE,
6811a39cfb0SJung-uk Kim         WalkState, &Node);
6821a39cfb0SJung-uk Kim 
6831a39cfb0SJung-uk Kim     Op->Common.Node = Node;
6841a39cfb0SJung-uk Kim 
685a9f12690SJung-uk Kim     if (ACPI_SUCCESS (Status))
686a9f12690SJung-uk Kim     {
687a9f12690SJung-uk Kim         /* Check if it's a predefined node */
688a9f12690SJung-uk Kim 
689a9f12690SJung-uk Kim         while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name)
690a9f12690SJung-uk Kim         {
6918ef1a331SJung-uk Kim             if (ACPI_COMPARE_NAME (Node->Name.Ascii,
6928ef1a331SJung-uk Kim                 AcpiGbl_PreDefinedNames[PreDefineIndex].Name))
693a9f12690SJung-uk Kim             {
694a9f12690SJung-uk Kim                 PreDefined = TRUE;
695a9f12690SJung-uk Kim                 break;
696a9f12690SJung-uk Kim             }
697a9f12690SJung-uk Kim 
698a9f12690SJung-uk Kim             PreDefineIndex++;
699a9f12690SJung-uk Kim         }
700a9f12690SJung-uk Kim 
701a9f12690SJung-uk Kim         /*
702a9f12690SJung-uk Kim          * Set node owner id if it satisfies all the following conditions:
703a9f12690SJung-uk Kim          * 1) Not a predefined node, _SB_ etc
704a9f12690SJung-uk Kim          * 2) Not the root node
705a9f12690SJung-uk Kim          * 3) Not a node created by Scope
706a9f12690SJung-uk Kim          */
707a9f12690SJung-uk Kim 
708a9f12690SJung-uk Kim         if (!PreDefined && Node != AcpiGbl_RootNode &&
709a9f12690SJung-uk Kim             Op->Common.AmlOpcode != AML_SCOPE_OP)
710a9f12690SJung-uk Kim         {
711a9f12690SJung-uk Kim             Node->OwnerId = WalkState->OwnerId;
712a9f12690SJung-uk Kim         }
713a9f12690SJung-uk Kim     }
714a9f12690SJung-uk Kim 
7151a39cfb0SJung-uk Kim 
7161a39cfb0SJung-uk Kim Exit:
7171a39cfb0SJung-uk Kim 
7181a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
7191a39cfb0SJung-uk Kim     {
7201a39cfb0SJung-uk Kim         if (Op->Common.Node)
7211a39cfb0SJung-uk Kim         {
722*f8146b88SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType,
723*f8146b88SJung-uk Kim                 WalkState);
7241a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
7251a39cfb0SJung-uk Kim             {
7261a39cfb0SJung-uk Kim                 return (Status);
7271a39cfb0SJung-uk Kim             }
7281a39cfb0SJung-uk Kim         }
7291a39cfb0SJung-uk Kim     }
7301a39cfb0SJung-uk Kim 
7311a39cfb0SJung-uk Kim     return (AE_OK);
7321a39cfb0SJung-uk Kim }
7331a39cfb0SJung-uk Kim 
7341a39cfb0SJung-uk Kim 
7351a39cfb0SJung-uk Kim /*******************************************************************************
7361a39cfb0SJung-uk Kim  *
7371a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmXrefDescendingOp
7381a39cfb0SJung-uk Kim  *
7391a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
7401a39cfb0SJung-uk Kim  *
7411a39cfb0SJung-uk Kim  * RETURN:      Status
7421a39cfb0SJung-uk Kim  *
7431a39cfb0SJung-uk Kim  * DESCRIPTION: Descending handler for namespace cross reference
7441a39cfb0SJung-uk Kim  *
7451a39cfb0SJung-uk Kim  ******************************************************************************/
7461a39cfb0SJung-uk Kim 
7471a39cfb0SJung-uk Kim static ACPI_STATUS
7481a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp (
7491a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
7501a39cfb0SJung-uk Kim     UINT32                  Level,
7511a39cfb0SJung-uk Kim     void                    *Context)
7521a39cfb0SJung-uk Kim {
7531a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
7541a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
7551a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
7561a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
757a9f12690SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType2;
7581a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
7591a39cfb0SJung-uk Kim     char                    *Path = NULL;
7601a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
7611a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
762a9f12690SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object;
76342fecd12SJung-uk Kim     UINT32                  ParamCount = 0;
764313a0c13SJung-uk Kim     char                    *Pathname;
765*f8146b88SJung-uk Kim     UINT16                  Flags = 0;
7661a39cfb0SJung-uk Kim 
7671a39cfb0SJung-uk Kim 
7681a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
7691a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
7701a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
7711a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
7721a39cfb0SJung-uk Kim 
7731a39cfb0SJung-uk Kim     if ((!(OpInfo->Flags & AML_NAMED)) &&
7741a39cfb0SJung-uk Kim         (!(OpInfo->Flags & AML_CREATE)) &&
775313a0c13SJung-uk Kim         (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP) &&
776313a0c13SJung-uk Kim         (Op->Common.AmlOpcode != AML_NOTIFY_OP))
7771a39cfb0SJung-uk Kim     {
7781a39cfb0SJung-uk Kim         goto Exit;
7791a39cfb0SJung-uk Kim     }
780*f8146b88SJung-uk Kim     else if (Op->Common.Parent &&
781*f8146b88SJung-uk Kim              Op->Common.Parent->Common.AmlOpcode == AML_EXTERNAL_OP)
782*f8146b88SJung-uk Kim     {
783*f8146b88SJung-uk Kim         /* External() NamePath */
7841a39cfb0SJung-uk Kim 
785*f8146b88SJung-uk Kim         Path = Op->Common.Value.String;
786*f8146b88SJung-uk Kim         ObjectType = (ACPI_OBJECT_TYPE) Op->Common.Next->Common.Value.Integer;
787*f8146b88SJung-uk Kim         if (ObjectType == ACPI_TYPE_METHOD)
788*f8146b88SJung-uk Kim         {
789*f8146b88SJung-uk Kim             ParamCount = (UINT32)
790*f8146b88SJung-uk Kim                 Op->Common.Next->Common.Next->Common.Value.Integer;
791*f8146b88SJung-uk Kim         }
792*f8146b88SJung-uk Kim 
793*f8146b88SJung-uk Kim         Flags |= ACPI_EXT_RESOLVED_REFERENCE | ACPI_EXT_ORIGIN_FROM_OPCODE;
794*f8146b88SJung-uk Kim         AcpiDmAddOpToExternalList (Op, Path,
795*f8146b88SJung-uk Kim             (UINT8) ObjectType, ParamCount, Flags);
796*f8146b88SJung-uk Kim 
797*f8146b88SJung-uk Kim         goto Exit;
798*f8146b88SJung-uk Kim     }
799313a0c13SJung-uk Kim 
8001a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
8011a39cfb0SJung-uk Kim 
8021a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
8031a39cfb0SJung-uk Kim     {
8041a39cfb0SJung-uk Kim         /*
805a7a3b383SJung-uk Kim          * Only these two operators (Alias, Scope) refer to an existing
806a7a3b383SJung-uk Kim          * name, it is the first argument
8071a39cfb0SJung-uk Kim          */
808a7a3b383SJung-uk Kim         if (Op->Common.AmlOpcode == AML_ALIAS_OP)
809a7a3b383SJung-uk Kim         {
810a7a3b383SJung-uk Kim             ObjectType = ACPI_TYPE_ANY;
811a7a3b383SJung-uk Kim 
812a7a3b383SJung-uk Kim             NextOp = Op->Common.Value.Arg;
813a7a3b383SJung-uk Kim             NextOp = NextOp->Common.Value.Arg;
814a7a3b383SJung-uk Kim             if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
815a7a3b383SJung-uk Kim             {
816a7a3b383SJung-uk Kim                 Path = NextOp->Common.Value.String;
817a7a3b383SJung-uk Kim             }
818a7a3b383SJung-uk Kim         }
819a7a3b383SJung-uk Kim         else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
820a7a3b383SJung-uk Kim         {
8211a39cfb0SJung-uk Kim             Path = (char *) Op->Named.Path;
8221a39cfb0SJung-uk Kim         }
8231a39cfb0SJung-uk Kim     }
8241a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
8251a39cfb0SJung-uk Kim     {
8261a39cfb0SJung-uk Kim         /* Referenced Buffer Name is the first child */
8271a39cfb0SJung-uk Kim 
828a7a3b383SJung-uk Kim         ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
829a7a3b383SJung-uk Kim 
8301a39cfb0SJung-uk Kim         NextOp = Op->Common.Value.Arg;
8311a39cfb0SJung-uk Kim         if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
8321a39cfb0SJung-uk Kim         {
8331a39cfb0SJung-uk Kim             Path = NextOp->Common.Value.String;
8341a39cfb0SJung-uk Kim         }
8351a39cfb0SJung-uk Kim     }
836313a0c13SJung-uk Kim     else if (Op->Common.AmlOpcode == AML_NOTIFY_OP)
837313a0c13SJung-uk Kim     {
838313a0c13SJung-uk Kim         Path = Op->Common.Value.Arg->Asl.Value.String;
839313a0c13SJung-uk Kim     }
8401a39cfb0SJung-uk Kim     else
8411a39cfb0SJung-uk Kim     {
8421a39cfb0SJung-uk Kim         Path = Op->Common.Value.String;
8431a39cfb0SJung-uk Kim     }
8441a39cfb0SJung-uk Kim 
8451a39cfb0SJung-uk Kim     if (!Path)
8461a39cfb0SJung-uk Kim     {
8471a39cfb0SJung-uk Kim         goto Exit;
8481a39cfb0SJung-uk Kim     }
8491a39cfb0SJung-uk Kim 
8501a39cfb0SJung-uk Kim     /*
8511a39cfb0SJung-uk Kim      * Lookup the name in the namespace. Name must exist at this point, or it
8521a39cfb0SJung-uk Kim      * is an invalid reference.
8531a39cfb0SJung-uk Kim      *
8541a39cfb0SJung-uk Kim      * The namespace is also used as a lookup table for references to resource
8551a39cfb0SJung-uk Kim      * descriptors and the fields within them.
8561a39cfb0SJung-uk Kim      */
857313a0c13SJung-uk Kim     Node = NULL;
8581a39cfb0SJung-uk Kim     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
8591a39cfb0SJung-uk Kim         ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
8601a39cfb0SJung-uk Kim         WalkState, &Node);
861*f8146b88SJung-uk Kim 
862a7a3b383SJung-uk Kim     if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
863a7a3b383SJung-uk Kim     {
864313a0c13SJung-uk Kim         /* Node was created by an External() statement */
865313a0c13SJung-uk Kim 
866a7a3b383SJung-uk Kim         Status = AE_NOT_FOUND;
867a7a3b383SJung-uk Kim     }
868a7a3b383SJung-uk Kim 
8691a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
8701a39cfb0SJung-uk Kim     {
8711a39cfb0SJung-uk Kim         if (Status == AE_NOT_FOUND)
8721a39cfb0SJung-uk Kim         {
8731a39cfb0SJung-uk Kim             /*
874313a0c13SJung-uk Kim              * Add this symbol as an external declaration, except if the
875313a0c13SJung-uk Kim              * parent is a CondRefOf operator. For this operator, we do not
876313a0c13SJung-uk Kim              * need an external, nor do we want one, since this can cause
877313a0c13SJung-uk Kim              * disassembly problems if the symbol is actually a control
878313a0c13SJung-uk Kim              * method.
8791a39cfb0SJung-uk Kim              */
880313a0c13SJung-uk Kim             if (!(Op->Asl.Parent &&
881313a0c13SJung-uk Kim                 (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP)))
882313a0c13SJung-uk Kim             {
883313a0c13SJung-uk Kim                 if (Node)
884313a0c13SJung-uk Kim                 {
885313a0c13SJung-uk Kim                     AcpiDmAddNodeToExternalList (Node,
886*f8146b88SJung-uk Kim                         (UINT8) ObjectType, 7, Flags);
887313a0c13SJung-uk Kim                 }
888313a0c13SJung-uk Kim                 else
889313a0c13SJung-uk Kim                 {
890313a0c13SJung-uk Kim                     AcpiDmAddOpToExternalList (Op, Path,
891*f8146b88SJung-uk Kim                         (UINT8) ObjectType, 7, Flags);
892313a0c13SJung-uk Kim                 }
893313a0c13SJung-uk Kim             }
8941a39cfb0SJung-uk Kim         }
8951a39cfb0SJung-uk Kim     }
896a9f12690SJung-uk Kim 
897a9f12690SJung-uk Kim     /*
898313a0c13SJung-uk Kim      * Found the node, but check if it came from an external table.
899313a0c13SJung-uk Kim      * Add it to external list. Note: Node->OwnerId == 0 indicates
900313a0c13SJung-uk Kim      * one of the built-in ACPI Names (_OS_ etc.) which can safely
901313a0c13SJung-uk Kim      * be ignored.
902a9f12690SJung-uk Kim      */
903313a0c13SJung-uk Kim     else if (Node->OwnerId &&
904313a0c13SJung-uk Kim             (WalkState->OwnerId != Node->OwnerId))
905a9f12690SJung-uk Kim     {
906a9f12690SJung-uk Kim         ObjectType2 = ObjectType;
907a9f12690SJung-uk Kim 
908a9f12690SJung-uk Kim         Object = AcpiNsGetAttachedObject (Node);
909a9f12690SJung-uk Kim         if (Object)
910a9f12690SJung-uk Kim         {
911a9f12690SJung-uk Kim             ObjectType2 = Object->Common.Type;
912a9f12690SJung-uk Kim             if (ObjectType2 == ACPI_TYPE_METHOD)
913a9f12690SJung-uk Kim             {
91442fecd12SJung-uk Kim                 ParamCount = Object->Method.ParamCount;
915a9f12690SJung-uk Kim             }
916a9f12690SJung-uk Kim         }
917a9f12690SJung-uk Kim 
918313a0c13SJung-uk Kim         Pathname = AcpiNsGetExternalPathname (Node);
919313a0c13SJung-uk Kim         if (!Pathname)
920313a0c13SJung-uk Kim         {
921313a0c13SJung-uk Kim             return (AE_NO_MEMORY);
922313a0c13SJung-uk Kim         }
923313a0c13SJung-uk Kim 
924313a0c13SJung-uk Kim         AcpiDmAddNodeToExternalList (Node, (UINT8) ObjectType2,
925313a0c13SJung-uk Kim             ParamCount, ACPI_EXT_RESOLVED_REFERENCE);
926313a0c13SJung-uk Kim 
927313a0c13SJung-uk Kim         ACPI_FREE (Pathname);
928a9f12690SJung-uk Kim         Op->Common.Node = Node;
929a9f12690SJung-uk Kim     }
9301a39cfb0SJung-uk Kim     else
9311a39cfb0SJung-uk Kim     {
9321a39cfb0SJung-uk Kim         Op->Common.Node = Node;
9331a39cfb0SJung-uk Kim     }
9341a39cfb0SJung-uk Kim 
9351a39cfb0SJung-uk Kim 
9361a39cfb0SJung-uk Kim Exit:
9371a39cfb0SJung-uk Kim     /* Open new scope if necessary */
9381a39cfb0SJung-uk Kim 
9391a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
9401a39cfb0SJung-uk Kim     {
9411a39cfb0SJung-uk Kim         if (Op->Common.Node)
9421a39cfb0SJung-uk Kim         {
943*f8146b88SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType,
944*f8146b88SJung-uk Kim                 WalkState);
9451a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
9461a39cfb0SJung-uk Kim             {
9471a39cfb0SJung-uk Kim                 return (Status);
9481a39cfb0SJung-uk Kim             }
9491a39cfb0SJung-uk Kim         }
9501a39cfb0SJung-uk Kim     }
9511a39cfb0SJung-uk Kim 
9521a39cfb0SJung-uk Kim     return (AE_OK);
9531a39cfb0SJung-uk Kim }
9541a39cfb0SJung-uk Kim 
9551a39cfb0SJung-uk Kim 
9561a39cfb0SJung-uk Kim /*******************************************************************************
9571a39cfb0SJung-uk Kim  *
9581a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmResourceDescendingOp
9591a39cfb0SJung-uk Kim  *
9601a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
9611a39cfb0SJung-uk Kim  *
9621a39cfb0SJung-uk Kim  * RETURN:      None
9631a39cfb0SJung-uk Kim  *
9641a39cfb0SJung-uk Kim  * DESCRIPTION: Process one parse op during symbolic resource index conversion.
9651a39cfb0SJung-uk Kim  *
9661a39cfb0SJung-uk Kim  ******************************************************************************/
9671a39cfb0SJung-uk Kim 
9681a39cfb0SJung-uk Kim static ACPI_STATUS
9691a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp (
9701a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
9711a39cfb0SJung-uk Kim     UINT32                  Level,
9721a39cfb0SJung-uk Kim     void                    *Context)
9731a39cfb0SJung-uk Kim {
9741a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
9751a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
9761a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
9771a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
9781a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
9791a39cfb0SJung-uk Kim 
9801a39cfb0SJung-uk Kim 
9811a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
9821a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
9831a39cfb0SJung-uk Kim 
9841a39cfb0SJung-uk Kim     /* Open new scope if necessary */
9851a39cfb0SJung-uk Kim 
9861a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
9871a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
9881a39cfb0SJung-uk Kim     {
9891a39cfb0SJung-uk Kim         if (Op->Common.Node)
9901a39cfb0SJung-uk Kim         {
9911a39cfb0SJung-uk Kim 
992*f8146b88SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType,
993*f8146b88SJung-uk Kim                 WalkState);
9941a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
9951a39cfb0SJung-uk Kim             {
9961a39cfb0SJung-uk Kim                 return (Status);
9971a39cfb0SJung-uk Kim             }
9981a39cfb0SJung-uk Kim         }
9991a39cfb0SJung-uk Kim     }
10001a39cfb0SJung-uk Kim 
10011a39cfb0SJung-uk Kim     /*
10021a39cfb0SJung-uk Kim      * Check if this operator contains a reference to a resource descriptor.
10031a39cfb0SJung-uk Kim      * If so, convert the reference into a symbolic reference.
10041a39cfb0SJung-uk Kim      */
10051a39cfb0SJung-uk Kim     AcpiDmCheckResourceReference (Op, WalkState);
10061a39cfb0SJung-uk Kim     return (AE_OK);
10071a39cfb0SJung-uk Kim }
10081a39cfb0SJung-uk Kim 
10091a39cfb0SJung-uk Kim 
10101a39cfb0SJung-uk Kim /*******************************************************************************
10111a39cfb0SJung-uk Kim  *
10121a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmCommonAscendingOp
10131a39cfb0SJung-uk Kim  *
10141a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
10151a39cfb0SJung-uk Kim  *
10161a39cfb0SJung-uk Kim  * RETURN:      None
10171a39cfb0SJung-uk Kim  *
10181a39cfb0SJung-uk Kim  * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes
10191a39cfb0SJung-uk Kim  *              scope if necessary.
10201a39cfb0SJung-uk Kim  *
10211a39cfb0SJung-uk Kim  ******************************************************************************/
10221a39cfb0SJung-uk Kim 
10231a39cfb0SJung-uk Kim static ACPI_STATUS
10241a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp (
10251a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
10261a39cfb0SJung-uk Kim     UINT32                  Level,
10271a39cfb0SJung-uk Kim     void                    *Context)
10281a39cfb0SJung-uk Kim {
10291a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
10301a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
10311a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
10321a39cfb0SJung-uk Kim 
10331a39cfb0SJung-uk Kim 
10341a39cfb0SJung-uk Kim     /* Close scope if necessary */
10351a39cfb0SJung-uk Kim 
10361a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
10371a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
10381a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
10391a39cfb0SJung-uk Kim 
10401a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
10411a39cfb0SJung-uk Kim     {
10421a39cfb0SJung-uk Kim         (void) AcpiDsScopeStackPop (Info->WalkState);
10431a39cfb0SJung-uk Kim     }
10441a39cfb0SJung-uk Kim 
10451a39cfb0SJung-uk Kim     return (AE_OK);
10461a39cfb0SJung-uk Kim }
10471a39cfb0SJung-uk Kim 
10481a39cfb0SJung-uk Kim 
10491a39cfb0SJung-uk Kim /*******************************************************************************
10501a39cfb0SJung-uk Kim  *
10511a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmInspectPossibleArgs
10521a39cfb0SJung-uk Kim  *
10531a39cfb0SJung-uk Kim  * PARAMETERS:  CurrentOpArgCount   - Which arg of the current op was the
10541a39cfb0SJung-uk Kim  *                                    possible method invocation found
10551a39cfb0SJung-uk Kim  *              TargetCount         - Number of targets (0,1,2) for this op
10561a39cfb0SJung-uk Kim  *              Op                  - Parse op
10571a39cfb0SJung-uk Kim  *
10581a39cfb0SJung-uk Kim  * RETURN:      Status
10591a39cfb0SJung-uk Kim  *
10601a39cfb0SJung-uk Kim  * DESCRIPTION: Examine following args and next ops for possible arguments
10611a39cfb0SJung-uk Kim  *              for an unrecognized method invocation.
10621a39cfb0SJung-uk Kim  *
10631a39cfb0SJung-uk Kim  ******************************************************************************/
10641a39cfb0SJung-uk Kim 
10651a39cfb0SJung-uk Kim static UINT32
10661a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs (
10671a39cfb0SJung-uk Kim     UINT32                  CurrentOpArgCount,
10681a39cfb0SJung-uk Kim     UINT32                  TargetCount,
10691a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
10701a39cfb0SJung-uk Kim {
10711a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
10721a39cfb0SJung-uk Kim     UINT32                  i;
1073*f8146b88SJung-uk Kim     UINT32                  ArgumentCount = 0;
1074*f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
1075*f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *ExecuteOp;
10761a39cfb0SJung-uk Kim 
10771a39cfb0SJung-uk Kim 
1078*f8146b88SJung-uk Kim     if (!Op)
1079*f8146b88SJung-uk Kim     {
1080*f8146b88SJung-uk Kim         return (0);
1081*f8146b88SJung-uk Kim     }
10821a39cfb0SJung-uk Kim 
10831a39cfb0SJung-uk Kim     /* Lookahead for the maximum number of possible arguments */
10841a39cfb0SJung-uk Kim 
1085*f8146b88SJung-uk Kim     NextOp = Op->Common.Next;
1086*f8146b88SJung-uk Kim 
1087*f8146b88SJung-uk Kim     for (i = 0; (i < ACPI_METHOD_NUM_ARGS) && NextOp; i++)
10881a39cfb0SJung-uk Kim     {
1089*f8146b88SJung-uk Kim         OpInfo = AcpiPsGetOpcodeInfo (NextOp->Common.AmlOpcode);
1090*f8146b88SJung-uk Kim 
1091*f8146b88SJung-uk Kim         /* Any one of these operators is "very probably" not a method arg */
1092*f8146b88SJung-uk Kim 
1093*f8146b88SJung-uk Kim         if ((NextOp->Common.AmlOpcode == AML_STORE_OP) ||
1094*f8146b88SJung-uk Kim             (NextOp->Common.AmlOpcode == AML_NOTIFY_OP) ||
1095*f8146b88SJung-uk Kim             (OpInfo->Class == AML_CLASS_CONTROL) ||
1096*f8146b88SJung-uk Kim             (OpInfo->Class == AML_CLASS_CREATE) ||
1097*f8146b88SJung-uk Kim             (OpInfo->Class == AML_CLASS_NAMED_OBJECT))
10981a39cfb0SJung-uk Kim         {
10991a39cfb0SJung-uk Kim             break;
11001a39cfb0SJung-uk Kim         }
11011a39cfb0SJung-uk Kim 
1102*f8146b88SJung-uk Kim         if (OpInfo->Class == AML_CLASS_EXECUTE)
1103*f8146b88SJung-uk Kim         {
1104*f8146b88SJung-uk Kim             /* Probable that this is method arg if there is no target */
11051a39cfb0SJung-uk Kim 
1106*f8146b88SJung-uk Kim             ExecuteOp = NextOp->Common.Value.Arg;
1107*f8146b88SJung-uk Kim             while (ExecuteOp)
1108*f8146b88SJung-uk Kim             {
1109*f8146b88SJung-uk Kim                 if ((ExecuteOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
1110*f8146b88SJung-uk Kim                     (ExecuteOp->Common.Value.Arg == NULL))
1111*f8146b88SJung-uk Kim                 {
1112*f8146b88SJung-uk Kim                     /* No target, could be a method arg */
1113*f8146b88SJung-uk Kim 
1114*f8146b88SJung-uk Kim                     break;
1115*f8146b88SJung-uk Kim                 }
1116*f8146b88SJung-uk Kim 
1117*f8146b88SJung-uk Kim                 if (NextOp->Common.AmlOpcode == AML_REF_OF_OP)
11181a39cfb0SJung-uk Kim                 {
11191a39cfb0SJung-uk Kim                     break;
11201a39cfb0SJung-uk Kim                 }
11211a39cfb0SJung-uk Kim 
1122*f8146b88SJung-uk Kim                 ExecuteOp = ExecuteOp->Common.Next;
1123*f8146b88SJung-uk Kim             }
1124*f8146b88SJung-uk Kim 
1125*f8146b88SJung-uk Kim             if (!ExecuteOp)
11261a39cfb0SJung-uk Kim             {
1127*f8146b88SJung-uk Kim                 /* Has a target, not method arg */
1128*f8146b88SJung-uk Kim 
1129*f8146b88SJung-uk Kim                 return (ArgumentCount);
1130*f8146b88SJung-uk Kim             }
11311a39cfb0SJung-uk Kim         }
11321a39cfb0SJung-uk Kim 
1133*f8146b88SJung-uk Kim         ArgumentCount++;
1134*f8146b88SJung-uk Kim         NextOp = NextOp->Common.Next;
11351a39cfb0SJung-uk Kim     }
11361a39cfb0SJung-uk Kim 
1137*f8146b88SJung-uk Kim     return (ArgumentCount);
11381a39cfb0SJung-uk Kim }
1139