xref: /freebsd/sys/contrib/dev/acpica/common/adwalk.c (revision 313a0c13efa638cf248e35eed49f36ec0a1a7f26)
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*313a0c13SJung-uk Kim  * Copyright (C) 2000 - 2014, 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;
1381a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info);
1391a39cfb0SJung-uk Kim     AcpiOsPrintf ("*/\n\n");
1401a39cfb0SJung-uk Kim }
1411a39cfb0SJung-uk Kim 
1421a39cfb0SJung-uk Kim 
1431a39cfb0SJung-uk Kim /*******************************************************************************
1441a39cfb0SJung-uk Kim  *
1451a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmFindOrphanMethods
1461a39cfb0SJung-uk Kim  *
1471a39cfb0SJung-uk Kim  * PARAMETERS:  Origin              - Starting object
1481a39cfb0SJung-uk Kim  *
1491a39cfb0SJung-uk Kim  * RETURN:      None
1501a39cfb0SJung-uk Kim  *
1511a39cfb0SJung-uk Kim  * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods
1521a39cfb0SJung-uk Kim  *              that are not resolved in the namespace
1531a39cfb0SJung-uk Kim  *
1541a39cfb0SJung-uk Kim  ******************************************************************************/
1551a39cfb0SJung-uk Kim 
1561a39cfb0SJung-uk Kim void
1571a39cfb0SJung-uk Kim AcpiDmFindOrphanMethods (
1581a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Origin)
1591a39cfb0SJung-uk Kim {
1601a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
1611a39cfb0SJung-uk Kim 
1621a39cfb0SJung-uk Kim 
1631a39cfb0SJung-uk Kim     if (!Origin)
1641a39cfb0SJung-uk Kim     {
1651a39cfb0SJung-uk Kim         return;
1661a39cfb0SJung-uk Kim     }
1671a39cfb0SJung-uk Kim 
1681a39cfb0SJung-uk Kim     Info.Flags = 0;
1691a39cfb0SJung-uk Kim     Info.Level = 0;
1701a39cfb0SJung-uk Kim     Info.WalkState = NULL;
1711a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info);
1721a39cfb0SJung-uk Kim }
1731a39cfb0SJung-uk Kim 
1741a39cfb0SJung-uk Kim 
1751a39cfb0SJung-uk Kim /*******************************************************************************
1761a39cfb0SJung-uk Kim  *
1771a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmFinishNamespaceLoad
1781a39cfb0SJung-uk Kim  *
1791a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
1801a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
181a9f12690SJung-uk Kim  *              OwnerId             - OwnerId of the table to be disassembled
1821a39cfb0SJung-uk Kim  *
1831a39cfb0SJung-uk Kim  * RETURN:      None
1841a39cfb0SJung-uk Kim  *
1851a39cfb0SJung-uk Kim  * DESCRIPTION: Load all namespace items that are created within control
1861a39cfb0SJung-uk Kim  *              methods. Used before namespace cross reference
1871a39cfb0SJung-uk Kim  *
1881a39cfb0SJung-uk Kim  ******************************************************************************/
1891a39cfb0SJung-uk Kim 
1901a39cfb0SJung-uk Kim void
1911a39cfb0SJung-uk Kim AcpiDmFinishNamespaceLoad (
1921a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
193a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot,
194a9f12690SJung-uk Kim     ACPI_OWNER_ID           OwnerId)
1951a39cfb0SJung-uk Kim {
1961a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
1971a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
1981a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
1991a39cfb0SJung-uk Kim 
2001a39cfb0SJung-uk Kim 
2011a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
2021a39cfb0SJung-uk Kim     {
2031a39cfb0SJung-uk Kim         return;
2041a39cfb0SJung-uk Kim     }
2051a39cfb0SJung-uk Kim 
2061a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
2071a39cfb0SJung-uk Kim 
208a9f12690SJung-uk Kim     WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
2091a39cfb0SJung-uk Kim     if (!WalkState)
2101a39cfb0SJung-uk Kim     {
2111a39cfb0SJung-uk Kim         return;
2121a39cfb0SJung-uk Kim     }
2131a39cfb0SJung-uk Kim 
2141a39cfb0SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
2151a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
2161a39cfb0SJung-uk Kim     {
2171a39cfb0SJung-uk Kim         return;
2181a39cfb0SJung-uk Kim     }
2191a39cfb0SJung-uk Kim 
2201a39cfb0SJung-uk Kim     Info.Flags = 0;
2211a39cfb0SJung-uk Kim     Info.Level = 0;
2221a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
2231a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp,
2241a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
2251a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
2261a39cfb0SJung-uk Kim }
2271a39cfb0SJung-uk Kim 
2281a39cfb0SJung-uk Kim 
2291a39cfb0SJung-uk Kim /*******************************************************************************
2301a39cfb0SJung-uk Kim  *
2311a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmCrossReferenceNamespace
2321a39cfb0SJung-uk Kim  *
2331a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
2341a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
235a9f12690SJung-uk Kim  *              OwnerId             - OwnerId of the table to be disassembled
2361a39cfb0SJung-uk Kim  *
2371a39cfb0SJung-uk Kim  * RETURN:      None
2381a39cfb0SJung-uk Kim  *
2391a39cfb0SJung-uk Kim  * DESCRIPTION: Cross reference the namespace to create externals
2401a39cfb0SJung-uk Kim  *
2411a39cfb0SJung-uk Kim  ******************************************************************************/
2421a39cfb0SJung-uk Kim 
2431a39cfb0SJung-uk Kim void
2441a39cfb0SJung-uk Kim AcpiDmCrossReferenceNamespace (
2451a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
246a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot,
247a9f12690SJung-uk Kim     ACPI_OWNER_ID           OwnerId)
2481a39cfb0SJung-uk Kim {
2491a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
2501a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
2511a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
2521a39cfb0SJung-uk Kim 
2531a39cfb0SJung-uk Kim 
2541a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
2551a39cfb0SJung-uk Kim     {
2561a39cfb0SJung-uk Kim         return;
2571a39cfb0SJung-uk Kim     }
2581a39cfb0SJung-uk Kim 
2591a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
2601a39cfb0SJung-uk Kim 
261a9f12690SJung-uk Kim     WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
2621a39cfb0SJung-uk Kim     if (!WalkState)
2631a39cfb0SJung-uk Kim     {
2641a39cfb0SJung-uk Kim         return;
2651a39cfb0SJung-uk Kim     }
2661a39cfb0SJung-uk Kim 
2671a39cfb0SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
2681a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
2691a39cfb0SJung-uk Kim     {
2701a39cfb0SJung-uk Kim         return;
2711a39cfb0SJung-uk Kim     }
2721a39cfb0SJung-uk Kim 
2731a39cfb0SJung-uk Kim     Info.Flags = 0;
2741a39cfb0SJung-uk Kim     Info.Level = 0;
2751a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
2761a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp,
2771a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
2781a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
2791a39cfb0SJung-uk Kim }
2801a39cfb0SJung-uk Kim 
2811a39cfb0SJung-uk Kim 
2821a39cfb0SJung-uk Kim /*******************************************************************************
2831a39cfb0SJung-uk Kim  *
2841a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmConvertResourceIndexes
2851a39cfb0SJung-uk Kim  *
2861a39cfb0SJung-uk Kim  * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
2871a39cfb0SJung-uk Kim  *              NamespaceRoot       - Root of the internal namespace
2881a39cfb0SJung-uk Kim  *
2891a39cfb0SJung-uk Kim  * RETURN:      None
2901a39cfb0SJung-uk Kim  *
2911a39cfb0SJung-uk Kim  * DESCRIPTION: Convert fixed-offset references to resource descriptors to
2921a39cfb0SJung-uk Kim  *              symbolic references. Should only be called after namespace has
2931a39cfb0SJung-uk Kim  *              been cross referenced.
2941a39cfb0SJung-uk Kim  *
2951a39cfb0SJung-uk Kim  ******************************************************************************/
2961a39cfb0SJung-uk Kim 
2971a39cfb0SJung-uk Kim void
2981a39cfb0SJung-uk Kim AcpiDmConvertResourceIndexes (
2991a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParseTreeRoot,
3001a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *NamespaceRoot)
3011a39cfb0SJung-uk Kim {
3021a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
3031a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       Info;
3041a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
3051a39cfb0SJung-uk Kim 
3061a39cfb0SJung-uk Kim 
3071a39cfb0SJung-uk Kim     if (!ParseTreeRoot)
3081a39cfb0SJung-uk Kim     {
3091a39cfb0SJung-uk Kim         return;
3101a39cfb0SJung-uk Kim     }
3111a39cfb0SJung-uk Kim 
3121a39cfb0SJung-uk Kim     /* Create and initialize a new walk state */
3131a39cfb0SJung-uk Kim 
3141a39cfb0SJung-uk Kim     WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
3151a39cfb0SJung-uk Kim     if (!WalkState)
3161a39cfb0SJung-uk Kim     {
3171a39cfb0SJung-uk Kim         return;
3181a39cfb0SJung-uk Kim     }
3191a39cfb0SJung-uk Kim 
3201a39cfb0SJung-uk Kim     Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
3211a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
3221a39cfb0SJung-uk Kim     {
3231a39cfb0SJung-uk Kim         return;
3241a39cfb0SJung-uk Kim     }
3251a39cfb0SJung-uk Kim 
3261a39cfb0SJung-uk Kim     Info.Flags = 0;
3271a39cfb0SJung-uk Kim     Info.Level = 0;
3281a39cfb0SJung-uk Kim     Info.WalkState = WalkState;
3291a39cfb0SJung-uk Kim     AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp,
3301a39cfb0SJung-uk Kim         AcpiDmCommonAscendingOp, &Info);
3311a39cfb0SJung-uk Kim     ACPI_FREE (WalkState);
3321a39cfb0SJung-uk Kim     return;
3331a39cfb0SJung-uk Kim }
3341a39cfb0SJung-uk Kim 
3351a39cfb0SJung-uk Kim 
3361a39cfb0SJung-uk Kim /*******************************************************************************
3371a39cfb0SJung-uk Kim  *
3381a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmDumpDescending
3391a39cfb0SJung-uk Kim  *
3401a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
3411a39cfb0SJung-uk Kim  *
3421a39cfb0SJung-uk Kim  * RETURN:      Status
3431a39cfb0SJung-uk Kim  *
3441a39cfb0SJung-uk Kim  * DESCRIPTION: Format and print contents of one parse Op.
3451a39cfb0SJung-uk Kim  *
3461a39cfb0SJung-uk Kim  ******************************************************************************/
3471a39cfb0SJung-uk Kim 
3481a39cfb0SJung-uk Kim static ACPI_STATUS
3491a39cfb0SJung-uk Kim AcpiDmDumpDescending (
3501a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
3511a39cfb0SJung-uk Kim     UINT32                  Level,
3521a39cfb0SJung-uk Kim     void                    *Context)
3531a39cfb0SJung-uk Kim {
3541a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
3551a39cfb0SJung-uk Kim     char                    *Path;
3561a39cfb0SJung-uk Kim 
3571a39cfb0SJung-uk Kim 
3581a39cfb0SJung-uk Kim     if (!Op)
3591a39cfb0SJung-uk Kim     {
3601a39cfb0SJung-uk Kim         return (AE_OK);
3611a39cfb0SJung-uk Kim     }
3621a39cfb0SJung-uk Kim 
3631a39cfb0SJung-uk Kim     /* Most of the information (count, level, name) here */
3641a39cfb0SJung-uk Kim 
365f556842eSJung-uk Kim     Info->Count++;
3661a39cfb0SJung-uk Kim     AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level);
3671a39cfb0SJung-uk Kim     AcpiDmIndent (Level);
3681a39cfb0SJung-uk Kim     AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
3691a39cfb0SJung-uk Kim 
3701a39cfb0SJung-uk Kim     /* Extra info is helpful */
3711a39cfb0SJung-uk Kim 
3721a39cfb0SJung-uk Kim     switch (Op->Common.AmlOpcode)
3731a39cfb0SJung-uk Kim     {
3741a39cfb0SJung-uk Kim     case AML_BYTE_OP:
37579c6d946SJung-uk Kim 
37679c6d946SJung-uk Kim         AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer);
37779c6d946SJung-uk Kim         break;
37879c6d946SJung-uk Kim 
3791a39cfb0SJung-uk Kim     case AML_WORD_OP:
38079c6d946SJung-uk Kim 
38179c6d946SJung-uk Kim         AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer);
38279c6d946SJung-uk Kim         break;
38379c6d946SJung-uk Kim 
3841a39cfb0SJung-uk Kim     case AML_DWORD_OP:
385a9d8d09cSJung-uk Kim 
38679c6d946SJung-uk Kim         AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer);
3871a39cfb0SJung-uk Kim         break;
3881a39cfb0SJung-uk Kim 
3893f0275a0SJung-uk Kim     case AML_QWORD_OP:
390a9d8d09cSJung-uk Kim 
3913f0275a0SJung-uk Kim         AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
3923f0275a0SJung-uk Kim         break;
3933f0275a0SJung-uk Kim 
3941a39cfb0SJung-uk Kim     case AML_INT_NAMEPATH_OP:
395a9d8d09cSJung-uk Kim 
3961a39cfb0SJung-uk Kim         if (Op->Common.Value.String)
3971a39cfb0SJung-uk Kim         {
3981a39cfb0SJung-uk Kim             AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String,
3991a39cfb0SJung-uk Kim                             NULL, &Path);
4001a39cfb0SJung-uk Kim             AcpiOsPrintf ("%s %p", Path, Op->Common.Node);
4011a39cfb0SJung-uk Kim             ACPI_FREE (Path);
4021a39cfb0SJung-uk Kim         }
4031a39cfb0SJung-uk Kim         else
4041a39cfb0SJung-uk Kim         {
4051a39cfb0SJung-uk Kim             AcpiOsPrintf ("[NULL]");
4061a39cfb0SJung-uk Kim         }
4071a39cfb0SJung-uk Kim         break;
4081a39cfb0SJung-uk Kim 
4091a39cfb0SJung-uk Kim     case AML_NAME_OP:
4101a39cfb0SJung-uk Kim     case AML_METHOD_OP:
4111a39cfb0SJung-uk Kim     case AML_DEVICE_OP:
4121a39cfb0SJung-uk Kim     case AML_INT_NAMEDFIELD_OP:
413a9d8d09cSJung-uk Kim 
414f556842eSJung-uk Kim         AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name));
4151a39cfb0SJung-uk Kim         break;
416a9f12690SJung-uk Kim 
417a9f12690SJung-uk Kim     default:
418a9d8d09cSJung-uk Kim 
419a9f12690SJung-uk Kim         break;
4201a39cfb0SJung-uk Kim     }
4211a39cfb0SJung-uk Kim 
4221a39cfb0SJung-uk Kim     AcpiOsPrintf ("\n");
4231a39cfb0SJung-uk Kim     return (AE_OK);
4241a39cfb0SJung-uk Kim }
4251a39cfb0SJung-uk Kim 
4261a39cfb0SJung-uk Kim 
4271a39cfb0SJung-uk Kim /*******************************************************************************
4281a39cfb0SJung-uk Kim  *
4291a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmFindOrphanDescending
4301a39cfb0SJung-uk Kim  *
4311a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
4321a39cfb0SJung-uk Kim  *
4331a39cfb0SJung-uk Kim  * RETURN:      Status
4341a39cfb0SJung-uk Kim  *
4351a39cfb0SJung-uk Kim  * DESCRIPTION: Check namepath Ops for orphaned method invocations
4361a39cfb0SJung-uk Kim  *
4371a39cfb0SJung-uk Kim  * Note: Experimental.
4381a39cfb0SJung-uk Kim  *
4391a39cfb0SJung-uk Kim  ******************************************************************************/
4401a39cfb0SJung-uk Kim 
4411a39cfb0SJung-uk Kim static ACPI_STATUS
4421a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending (
4431a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
4441a39cfb0SJung-uk Kim     UINT32                  Level,
4451a39cfb0SJung-uk Kim     void                    *Context)
4461a39cfb0SJung-uk Kim {
4471a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
4481a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ChildOp;
4491a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
4501a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *ParentOp;
4511a39cfb0SJung-uk Kim     UINT32                  ArgCount;
4521a39cfb0SJung-uk Kim 
4531a39cfb0SJung-uk Kim 
4541a39cfb0SJung-uk Kim     if (!Op)
4551a39cfb0SJung-uk Kim     {
4561a39cfb0SJung-uk Kim         return (AE_OK);
4571a39cfb0SJung-uk Kim     }
4581a39cfb0SJung-uk Kim 
4591a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
4601a39cfb0SJung-uk Kim 
4611a39cfb0SJung-uk Kim     switch (Op->Common.AmlOpcode)
4621a39cfb0SJung-uk Kim     {
4631a39cfb0SJung-uk Kim #ifdef ACPI_UNDER_DEVELOPMENT
4641a39cfb0SJung-uk Kim     case AML_ADD_OP:
465a9d8d09cSJung-uk Kim 
4661a39cfb0SJung-uk Kim         ChildOp = Op->Common.Value.Arg;
4671a39cfb0SJung-uk Kim         if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
4681a39cfb0SJung-uk Kim             !ChildOp->Common.Node)
4691a39cfb0SJung-uk Kim         {
4701a39cfb0SJung-uk Kim             AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String,
4711a39cfb0SJung-uk Kim                 NULL, &Path);
472*313a0c13SJung-uk Kim             AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s  */\n",
473*313a0c13SJung-uk Kim                 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 
481*313a0c13SJung-uk Kim                 AcpiDmAddOpToExternalList (ChildOp,
482*313a0c13SJung-uk Kim                     ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
4831a39cfb0SJung-uk Kim                 return (AE_OK);
4841a39cfb0SJung-uk Kim             }
4851a39cfb0SJung-uk Kim 
4861a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp);
487*313a0c13SJung-uk Kim             AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n",
488*313a0c13SJung-uk Kim                 ArgCount, AcpiDmCountChildren (Op));
4891a39cfb0SJung-uk Kim 
4901a39cfb0SJung-uk Kim             if (ArgCount < 1)
4911a39cfb0SJung-uk Kim             {
4921a39cfb0SJung-uk Kim                 /* One Arg means this is just a Store(Name,Target) */
4931a39cfb0SJung-uk Kim 
494*313a0c13SJung-uk Kim                 AcpiDmAddOpToExternalList (ChildOp,
495*313a0c13SJung-uk Kim                     ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
4961a39cfb0SJung-uk Kim                 return (AE_OK);
4971a39cfb0SJung-uk Kim             }
4981a39cfb0SJung-uk Kim 
499*313a0c13SJung-uk Kim             AcpiDmAddOpToExternalList (ChildOp,
500*313a0c13SJung-uk Kim                 ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
5011a39cfb0SJung-uk Kim         }
5021a39cfb0SJung-uk Kim         break;
5031a39cfb0SJung-uk Kim #endif
5041a39cfb0SJung-uk Kim 
5051a39cfb0SJung-uk Kim     case AML_STORE_OP:
5061a39cfb0SJung-uk Kim 
5071a39cfb0SJung-uk Kim         ChildOp = Op->Common.Value.Arg;
5081a39cfb0SJung-uk Kim         if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
5091a39cfb0SJung-uk Kim             !ChildOp->Common.Node)
5101a39cfb0SJung-uk Kim         {
5111a39cfb0SJung-uk Kim             NextOp = Op->Common.Next;
5121a39cfb0SJung-uk Kim             if (!NextOp)
5131a39cfb0SJung-uk Kim             {
5141a39cfb0SJung-uk Kim                 /* This NamePath has no args, assume it is an integer */
5151a39cfb0SJung-uk Kim 
516*313a0c13SJung-uk Kim                 AcpiDmAddOpToExternalList (ChildOp,
517*313a0c13SJung-uk Kim                     ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
5181a39cfb0SJung-uk Kim                 return (AE_OK);
5191a39cfb0SJung-uk Kim             }
5201a39cfb0SJung-uk Kim 
5211a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp);
5221a39cfb0SJung-uk Kim             if (ArgCount <= 1)
5231a39cfb0SJung-uk Kim             {
5241a39cfb0SJung-uk Kim                 /* One Arg means this is just a Store(Name,Target) */
5251a39cfb0SJung-uk Kim 
526*313a0c13SJung-uk Kim                 AcpiDmAddOpToExternalList (ChildOp,
527*313a0c13SJung-uk Kim                     ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
5281a39cfb0SJung-uk Kim                 return (AE_OK);
5291a39cfb0SJung-uk Kim             }
5301a39cfb0SJung-uk Kim 
531*313a0c13SJung-uk Kim             AcpiDmAddOpToExternalList (ChildOp,
532*313a0c13SJung-uk Kim                 ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
5331a39cfb0SJung-uk Kim         }
5341a39cfb0SJung-uk Kim         break;
5351a39cfb0SJung-uk Kim 
5361a39cfb0SJung-uk Kim     case AML_INT_NAMEPATH_OP:
5371a39cfb0SJung-uk Kim 
5381a39cfb0SJung-uk Kim         /* Must examine parent to see if this namepath is an argument */
5391a39cfb0SJung-uk Kim 
5401a39cfb0SJung-uk Kim         ParentOp = Op->Common.Parent;
5411a39cfb0SJung-uk Kim         OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
5421a39cfb0SJung-uk Kim 
5431a39cfb0SJung-uk Kim         if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
5441a39cfb0SJung-uk Kim             (OpInfo->Class != AML_CLASS_CREATE) &&
545a7a3b383SJung-uk Kim             (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
5461a39cfb0SJung-uk Kim             (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
5471a39cfb0SJung-uk Kim             !Op->Common.Node)
5481a39cfb0SJung-uk Kim         {
5491a39cfb0SJung-uk Kim             ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next);
5501a39cfb0SJung-uk Kim 
5511a39cfb0SJung-uk Kim             /*
5521a39cfb0SJung-uk Kim              * Check if namepath is a predicate for if/while or lone parameter to
5531a39cfb0SJung-uk Kim              * a return.
5541a39cfb0SJung-uk Kim              */
5551a39cfb0SJung-uk Kim             if (ArgCount == 0)
5561a39cfb0SJung-uk Kim             {
5571a39cfb0SJung-uk Kim                 if (((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
5581a39cfb0SJung-uk Kim                      (ParentOp->Common.AmlOpcode == AML_WHILE_OP) ||
5591a39cfb0SJung-uk Kim                      (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) &&
5601a39cfb0SJung-uk Kim 
5611a39cfb0SJung-uk Kim                      /* And namepath is the first argument */
5621a39cfb0SJung-uk Kim                      (ParentOp->Common.Value.Arg == Op))
5631a39cfb0SJung-uk Kim                 {
564*313a0c13SJung-uk Kim                     AcpiDmAddOpToExternalList (Op,
565*313a0c13SJung-uk Kim                         Op->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
5661a39cfb0SJung-uk Kim                     break;
5671a39cfb0SJung-uk Kim                 }
5681a39cfb0SJung-uk Kim             }
5691a39cfb0SJung-uk Kim 
5701a39cfb0SJung-uk Kim             /*
5711a39cfb0SJung-uk Kim              * This is a standalone namestring (not a parameter to another
5721a39cfb0SJung-uk Kim              * operator) - it *must* be a method invocation, nothing else is
5731a39cfb0SJung-uk Kim              * grammatically possible.
5741a39cfb0SJung-uk Kim              */
575*313a0c13SJung-uk Kim             AcpiDmAddOpToExternalList (Op,
576*313a0c13SJung-uk Kim                 Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
5771a39cfb0SJung-uk Kim         }
5781a39cfb0SJung-uk Kim         break;
579a9f12690SJung-uk Kim 
580a9f12690SJung-uk Kim     default:
581a9d8d09cSJung-uk Kim 
582a9f12690SJung-uk Kim         break;
5831a39cfb0SJung-uk Kim     }
5841a39cfb0SJung-uk Kim 
5851a39cfb0SJung-uk Kim     return (AE_OK);
5861a39cfb0SJung-uk Kim }
5871a39cfb0SJung-uk Kim 
5881a39cfb0SJung-uk Kim 
5891a39cfb0SJung-uk Kim /*******************************************************************************
5901a39cfb0SJung-uk Kim  *
5911a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmLoadDescendingOp
5921a39cfb0SJung-uk Kim  *
5931a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
5941a39cfb0SJung-uk Kim  *
5951a39cfb0SJung-uk Kim  * RETURN:      Status
5961a39cfb0SJung-uk Kim  *
5971a39cfb0SJung-uk Kim  * DESCRIPTION: Descending handler for namespace control method object load
5981a39cfb0SJung-uk Kim  *
5991a39cfb0SJung-uk Kim  ******************************************************************************/
6001a39cfb0SJung-uk Kim 
6011a39cfb0SJung-uk Kim static ACPI_STATUS
6021a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp (
6031a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
6041a39cfb0SJung-uk Kim     UINT32                  Level,
6051a39cfb0SJung-uk Kim     void                    *Context)
6061a39cfb0SJung-uk Kim {
6071a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
6081a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
6091a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
6101a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
6111a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
6121a39cfb0SJung-uk Kim     char                    *Path = NULL;
6131a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
6141a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
615a9f12690SJung-uk Kim     char                    FieldPath[5];
616a9f12690SJung-uk Kim     BOOLEAN                 PreDefined = FALSE;
617a9f12690SJung-uk Kim     UINT8                   PreDefineIndex = 0;
6181a39cfb0SJung-uk Kim 
6191a39cfb0SJung-uk Kim 
6201a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
6211a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
6221a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
6231a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
6241a39cfb0SJung-uk Kim 
6251a39cfb0SJung-uk Kim     /* Only interested in operators that create new names */
6261a39cfb0SJung-uk Kim 
6271a39cfb0SJung-uk Kim     if (!(OpInfo->Flags & AML_NAMED) &&
6281a39cfb0SJung-uk Kim         !(OpInfo->Flags & AML_CREATE))
6291a39cfb0SJung-uk Kim     {
6301a39cfb0SJung-uk Kim         goto Exit;
6311a39cfb0SJung-uk Kim     }
6321a39cfb0SJung-uk Kim 
6331a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
6341a39cfb0SJung-uk Kim 
6351a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
6361a39cfb0SJung-uk Kim     {
6371a39cfb0SJung-uk Kim         /* For all named operators, get the new name */
6381a39cfb0SJung-uk Kim 
6391a39cfb0SJung-uk Kim         Path = (char *) Op->Named.Path;
640a9f12690SJung-uk Kim 
641a9f12690SJung-uk Kim         if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
642a9f12690SJung-uk Kim         {
643a9f12690SJung-uk Kim             *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name;
644a9f12690SJung-uk Kim             FieldPath[4] = 0;
645a9f12690SJung-uk Kim             Path = FieldPath;
646a9f12690SJung-uk Kim         }
6471a39cfb0SJung-uk Kim     }
6481a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
6491a39cfb0SJung-uk Kim     {
6501a39cfb0SJung-uk Kim         /* New name is the last child */
6511a39cfb0SJung-uk Kim 
6521a39cfb0SJung-uk Kim         NextOp = Op->Common.Value.Arg;
6531a39cfb0SJung-uk Kim 
6541a39cfb0SJung-uk Kim         while (NextOp->Common.Next)
6551a39cfb0SJung-uk Kim         {
6561a39cfb0SJung-uk Kim             NextOp = NextOp->Common.Next;
6571a39cfb0SJung-uk Kim         }
6581a39cfb0SJung-uk Kim         Path = NextOp->Common.Value.String;
6591a39cfb0SJung-uk Kim     }
6601a39cfb0SJung-uk Kim 
6611a39cfb0SJung-uk Kim     if (!Path)
6621a39cfb0SJung-uk Kim     {
6631a39cfb0SJung-uk Kim         goto Exit;
6641a39cfb0SJung-uk Kim     }
6651a39cfb0SJung-uk Kim 
6661a39cfb0SJung-uk Kim     /* Insert the name into the namespace */
6671a39cfb0SJung-uk Kim 
6681a39cfb0SJung-uk Kim     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
6691a39cfb0SJung-uk Kim                 ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE,
6701a39cfb0SJung-uk Kim                 WalkState, &Node);
6711a39cfb0SJung-uk Kim 
6721a39cfb0SJung-uk Kim     Op->Common.Node = Node;
6731a39cfb0SJung-uk Kim 
674a9f12690SJung-uk Kim     if (ACPI_SUCCESS (Status))
675a9f12690SJung-uk Kim     {
676a9f12690SJung-uk Kim         /* Check if it's a predefined node */
677a9f12690SJung-uk Kim 
678a9f12690SJung-uk Kim         while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name)
679a9f12690SJung-uk Kim         {
6808ef1a331SJung-uk Kim             if (ACPI_COMPARE_NAME (Node->Name.Ascii,
6818ef1a331SJung-uk Kim                 AcpiGbl_PreDefinedNames[PreDefineIndex].Name))
682a9f12690SJung-uk Kim             {
683a9f12690SJung-uk Kim                 PreDefined = TRUE;
684a9f12690SJung-uk Kim                 break;
685a9f12690SJung-uk Kim             }
686a9f12690SJung-uk Kim 
687a9f12690SJung-uk Kim             PreDefineIndex++;
688a9f12690SJung-uk Kim         }
689a9f12690SJung-uk Kim 
690a9f12690SJung-uk Kim         /*
691a9f12690SJung-uk Kim          * Set node owner id if it satisfies all the following conditions:
692a9f12690SJung-uk Kim          * 1) Not a predefined node, _SB_ etc
693a9f12690SJung-uk Kim          * 2) Not the root node
694a9f12690SJung-uk Kim          * 3) Not a node created by Scope
695a9f12690SJung-uk Kim          */
696a9f12690SJung-uk Kim 
697a9f12690SJung-uk Kim         if (!PreDefined && Node != AcpiGbl_RootNode &&
698a9f12690SJung-uk Kim             Op->Common.AmlOpcode != AML_SCOPE_OP)
699a9f12690SJung-uk Kim         {
700a9f12690SJung-uk Kim             Node->OwnerId = WalkState->OwnerId;
701a9f12690SJung-uk Kim         }
702a9f12690SJung-uk Kim     }
703a9f12690SJung-uk Kim 
7041a39cfb0SJung-uk Kim 
7051a39cfb0SJung-uk Kim Exit:
7061a39cfb0SJung-uk Kim 
7071a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
7081a39cfb0SJung-uk Kim     {
7091a39cfb0SJung-uk Kim         if (Op->Common.Node)
7101a39cfb0SJung-uk Kim         {
7111a39cfb0SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
7121a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
7131a39cfb0SJung-uk Kim             {
7141a39cfb0SJung-uk Kim                 return (Status);
7151a39cfb0SJung-uk Kim             }
7161a39cfb0SJung-uk Kim         }
7171a39cfb0SJung-uk Kim     }
7181a39cfb0SJung-uk Kim 
7191a39cfb0SJung-uk Kim     return (AE_OK);
7201a39cfb0SJung-uk Kim }
7211a39cfb0SJung-uk Kim 
7221a39cfb0SJung-uk Kim 
7231a39cfb0SJung-uk Kim /*******************************************************************************
7241a39cfb0SJung-uk Kim  *
7251a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmXrefDescendingOp
7261a39cfb0SJung-uk Kim  *
7271a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
7281a39cfb0SJung-uk Kim  *
7291a39cfb0SJung-uk Kim  * RETURN:      Status
7301a39cfb0SJung-uk Kim  *
7311a39cfb0SJung-uk Kim  * DESCRIPTION: Descending handler for namespace cross reference
7321a39cfb0SJung-uk Kim  *
7331a39cfb0SJung-uk Kim  ******************************************************************************/
7341a39cfb0SJung-uk Kim 
7351a39cfb0SJung-uk Kim static ACPI_STATUS
7361a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp (
7371a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
7381a39cfb0SJung-uk Kim     UINT32                  Level,
7391a39cfb0SJung-uk Kim     void                    *Context)
7401a39cfb0SJung-uk Kim {
7411a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
7421a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
7431a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
7441a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
745a9f12690SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType2;
7461a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
7471a39cfb0SJung-uk Kim     char                    *Path = NULL;
7481a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
7491a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
750a9f12690SJung-uk Kim     ACPI_OPERAND_OBJECT     *Object;
75142fecd12SJung-uk Kim     UINT32                  ParamCount = 0;
752*313a0c13SJung-uk Kim     char                    *Pathname;
7531a39cfb0SJung-uk Kim 
7541a39cfb0SJung-uk Kim 
7551a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
7561a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
7571a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
7581a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
7591a39cfb0SJung-uk Kim 
7601a39cfb0SJung-uk Kim     if ((!(OpInfo->Flags & AML_NAMED)) &&
7611a39cfb0SJung-uk Kim         (!(OpInfo->Flags & AML_CREATE)) &&
762*313a0c13SJung-uk Kim         (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP) &&
763*313a0c13SJung-uk Kim         (Op->Common.AmlOpcode != AML_NOTIFY_OP))
7641a39cfb0SJung-uk Kim     {
7651a39cfb0SJung-uk Kim         goto Exit;
7661a39cfb0SJung-uk Kim     }
7671a39cfb0SJung-uk Kim 
768*313a0c13SJung-uk Kim 
7691a39cfb0SJung-uk Kim     /* Get the NamePath from the appropriate place */
7701a39cfb0SJung-uk Kim 
7711a39cfb0SJung-uk Kim     if (OpInfo->Flags & AML_NAMED)
7721a39cfb0SJung-uk Kim     {
7731a39cfb0SJung-uk Kim         /*
774a7a3b383SJung-uk Kim          * Only these two operators (Alias, Scope) refer to an existing
775a7a3b383SJung-uk Kim          * name, it is the first argument
7761a39cfb0SJung-uk Kim          */
777a7a3b383SJung-uk Kim         if (Op->Common.AmlOpcode == AML_ALIAS_OP)
778a7a3b383SJung-uk Kim         {
779a7a3b383SJung-uk Kim             ObjectType = ACPI_TYPE_ANY;
780a7a3b383SJung-uk Kim 
781a7a3b383SJung-uk Kim             NextOp = Op->Common.Value.Arg;
782a7a3b383SJung-uk Kim             NextOp = NextOp->Common.Value.Arg;
783a7a3b383SJung-uk Kim             if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
784a7a3b383SJung-uk Kim             {
785a7a3b383SJung-uk Kim                 Path = NextOp->Common.Value.String;
786a7a3b383SJung-uk Kim             }
787a7a3b383SJung-uk Kim         }
788a7a3b383SJung-uk Kim         else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
789a7a3b383SJung-uk Kim         {
7901a39cfb0SJung-uk Kim             Path = (char *) Op->Named.Path;
7911a39cfb0SJung-uk Kim         }
7921a39cfb0SJung-uk Kim     }
7931a39cfb0SJung-uk Kim     else if (OpInfo->Flags & AML_CREATE)
7941a39cfb0SJung-uk Kim     {
7951a39cfb0SJung-uk Kim         /* Referenced Buffer Name is the first child */
7961a39cfb0SJung-uk Kim 
797a7a3b383SJung-uk Kim         ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
798a7a3b383SJung-uk Kim 
7991a39cfb0SJung-uk Kim         NextOp = Op->Common.Value.Arg;
8001a39cfb0SJung-uk Kim         if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
8011a39cfb0SJung-uk Kim         {
8021a39cfb0SJung-uk Kim             Path = NextOp->Common.Value.String;
8031a39cfb0SJung-uk Kim         }
8041a39cfb0SJung-uk Kim     }
805*313a0c13SJung-uk Kim     else if (Op->Common.AmlOpcode == AML_NOTIFY_OP)
806*313a0c13SJung-uk Kim     {
807*313a0c13SJung-uk Kim         Path = Op->Common.Value.Arg->Asl.Value.String;
808*313a0c13SJung-uk Kim     }
8091a39cfb0SJung-uk Kim     else
8101a39cfb0SJung-uk Kim     {
8111a39cfb0SJung-uk Kim         Path = Op->Common.Value.String;
8121a39cfb0SJung-uk Kim     }
8131a39cfb0SJung-uk Kim 
8141a39cfb0SJung-uk Kim     if (!Path)
8151a39cfb0SJung-uk Kim     {
8161a39cfb0SJung-uk Kim         goto Exit;
8171a39cfb0SJung-uk Kim     }
8181a39cfb0SJung-uk Kim 
8191a39cfb0SJung-uk Kim     /*
8201a39cfb0SJung-uk Kim      * Lookup the name in the namespace. Name must exist at this point, or it
8211a39cfb0SJung-uk Kim      * is an invalid reference.
8221a39cfb0SJung-uk Kim      *
8231a39cfb0SJung-uk Kim      * The namespace is also used as a lookup table for references to resource
8241a39cfb0SJung-uk Kim      * descriptors and the fields within them.
8251a39cfb0SJung-uk Kim      */
826*313a0c13SJung-uk Kim     Node = NULL;
8271a39cfb0SJung-uk Kim     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
8281a39cfb0SJung-uk Kim                 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
8291a39cfb0SJung-uk Kim                 WalkState, &Node);
830a7a3b383SJung-uk Kim     if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
831a7a3b383SJung-uk Kim     {
832*313a0c13SJung-uk Kim         /* Node was created by an External() statement */
833*313a0c13SJung-uk Kim 
834a7a3b383SJung-uk Kim         Status = AE_NOT_FOUND;
835a7a3b383SJung-uk Kim     }
836a7a3b383SJung-uk Kim 
8371a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
8381a39cfb0SJung-uk Kim     {
8391a39cfb0SJung-uk Kim         if (Status == AE_NOT_FOUND)
8401a39cfb0SJung-uk Kim         {
8411a39cfb0SJung-uk Kim             /*
842*313a0c13SJung-uk Kim              * Add this symbol as an external declaration, except if the
843*313a0c13SJung-uk Kim              * parent is a CondRefOf operator. For this operator, we do not
844*313a0c13SJung-uk Kim              * need an external, nor do we want one, since this can cause
845*313a0c13SJung-uk Kim              * disassembly problems if the symbol is actually a control
846*313a0c13SJung-uk Kim              * method.
8471a39cfb0SJung-uk Kim              */
848*313a0c13SJung-uk Kim             if (!(Op->Asl.Parent &&
849*313a0c13SJung-uk Kim                 (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP)))
850*313a0c13SJung-uk Kim             {
851*313a0c13SJung-uk Kim                 if (Node)
852*313a0c13SJung-uk Kim                 {
853*313a0c13SJung-uk Kim                     AcpiDmAddNodeToExternalList (Node,
854*313a0c13SJung-uk Kim                         (UINT8) ObjectType, 0, 0);
855*313a0c13SJung-uk Kim                 }
856*313a0c13SJung-uk Kim                 else
857*313a0c13SJung-uk Kim                 {
858*313a0c13SJung-uk Kim                     AcpiDmAddOpToExternalList (Op, Path,
859*313a0c13SJung-uk Kim                         (UINT8) ObjectType, 0, 0);
860*313a0c13SJung-uk Kim                 }
861*313a0c13SJung-uk Kim             }
8621a39cfb0SJung-uk Kim         }
8631a39cfb0SJung-uk Kim     }
864a9f12690SJung-uk Kim 
865a9f12690SJung-uk Kim     /*
866*313a0c13SJung-uk Kim      * Found the node, but check if it came from an external table.
867*313a0c13SJung-uk Kim      * Add it to external list. Note: Node->OwnerId == 0 indicates
868*313a0c13SJung-uk Kim      * one of the built-in ACPI Names (_OS_ etc.) which can safely
869*313a0c13SJung-uk Kim      * be ignored.
870a9f12690SJung-uk Kim      */
871*313a0c13SJung-uk Kim     else if (Node->OwnerId &&
872*313a0c13SJung-uk Kim             (WalkState->OwnerId != Node->OwnerId))
873a9f12690SJung-uk Kim     {
874a9f12690SJung-uk Kim         ObjectType2 = ObjectType;
875a9f12690SJung-uk Kim 
876a9f12690SJung-uk Kim         Object = AcpiNsGetAttachedObject (Node);
877a9f12690SJung-uk Kim         if (Object)
878a9f12690SJung-uk Kim         {
879a9f12690SJung-uk Kim             ObjectType2 = Object->Common.Type;
880a9f12690SJung-uk Kim             if (ObjectType2 == ACPI_TYPE_METHOD)
881a9f12690SJung-uk Kim             {
88242fecd12SJung-uk Kim                 ParamCount = Object->Method.ParamCount;
883a9f12690SJung-uk Kim             }
884a9f12690SJung-uk Kim         }
885a9f12690SJung-uk Kim 
886*313a0c13SJung-uk Kim         Pathname = AcpiNsGetExternalPathname (Node);
887*313a0c13SJung-uk Kim         if (!Pathname)
888*313a0c13SJung-uk Kim         {
889*313a0c13SJung-uk Kim             return (AE_NO_MEMORY);
890*313a0c13SJung-uk Kim         }
891*313a0c13SJung-uk Kim 
892*313a0c13SJung-uk Kim         AcpiDmAddNodeToExternalList (Node, (UINT8) ObjectType2,
893*313a0c13SJung-uk Kim             ParamCount, ACPI_EXT_RESOLVED_REFERENCE);
894*313a0c13SJung-uk Kim 
895*313a0c13SJung-uk Kim         ACPI_FREE (Pathname);
896a9f12690SJung-uk Kim         Op->Common.Node = Node;
897a9f12690SJung-uk Kim     }
8981a39cfb0SJung-uk Kim     else
8991a39cfb0SJung-uk Kim     {
9001a39cfb0SJung-uk Kim         Op->Common.Node = Node;
9011a39cfb0SJung-uk Kim     }
9021a39cfb0SJung-uk Kim 
9031a39cfb0SJung-uk Kim 
9041a39cfb0SJung-uk Kim Exit:
9051a39cfb0SJung-uk Kim     /* Open new scope if necessary */
9061a39cfb0SJung-uk Kim 
9071a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
9081a39cfb0SJung-uk Kim     {
9091a39cfb0SJung-uk Kim         if (Op->Common.Node)
9101a39cfb0SJung-uk Kim         {
9111a39cfb0SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
9121a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
9131a39cfb0SJung-uk Kim             {
9141a39cfb0SJung-uk Kim                 return (Status);
9151a39cfb0SJung-uk Kim             }
9161a39cfb0SJung-uk Kim         }
9171a39cfb0SJung-uk Kim     }
9181a39cfb0SJung-uk Kim 
9191a39cfb0SJung-uk Kim     return (AE_OK);
9201a39cfb0SJung-uk Kim }
9211a39cfb0SJung-uk Kim 
9221a39cfb0SJung-uk Kim 
9231a39cfb0SJung-uk Kim /*******************************************************************************
9241a39cfb0SJung-uk Kim  *
9251a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmResourceDescendingOp
9261a39cfb0SJung-uk Kim  *
9271a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
9281a39cfb0SJung-uk Kim  *
9291a39cfb0SJung-uk Kim  * RETURN:      None
9301a39cfb0SJung-uk Kim  *
9311a39cfb0SJung-uk Kim  * DESCRIPTION: Process one parse op during symbolic resource index conversion.
9321a39cfb0SJung-uk Kim  *
9331a39cfb0SJung-uk Kim  ******************************************************************************/
9341a39cfb0SJung-uk Kim 
9351a39cfb0SJung-uk Kim static ACPI_STATUS
9361a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp (
9371a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
9381a39cfb0SJung-uk Kim     UINT32                  Level,
9391a39cfb0SJung-uk Kim     void                    *Context)
9401a39cfb0SJung-uk Kim {
9411a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
9421a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
9431a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState;
9441a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
9451a39cfb0SJung-uk Kim     ACPI_STATUS             Status;
9461a39cfb0SJung-uk Kim 
9471a39cfb0SJung-uk Kim 
9481a39cfb0SJung-uk Kim     WalkState = Info->WalkState;
9491a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
9501a39cfb0SJung-uk Kim 
9511a39cfb0SJung-uk Kim     /* Open new scope if necessary */
9521a39cfb0SJung-uk Kim 
9531a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
9541a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
9551a39cfb0SJung-uk Kim     {
9561a39cfb0SJung-uk Kim         if (Op->Common.Node)
9571a39cfb0SJung-uk Kim         {
9581a39cfb0SJung-uk Kim 
9591a39cfb0SJung-uk Kim             Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
9601a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
9611a39cfb0SJung-uk Kim             {
9621a39cfb0SJung-uk Kim                 return (Status);
9631a39cfb0SJung-uk Kim             }
9641a39cfb0SJung-uk Kim         }
9651a39cfb0SJung-uk Kim     }
9661a39cfb0SJung-uk Kim 
9671a39cfb0SJung-uk Kim     /*
9681a39cfb0SJung-uk Kim      * Check if this operator contains a reference to a resource descriptor.
9691a39cfb0SJung-uk Kim      * If so, convert the reference into a symbolic reference.
9701a39cfb0SJung-uk Kim      */
9711a39cfb0SJung-uk Kim     AcpiDmCheckResourceReference (Op, WalkState);
9721a39cfb0SJung-uk Kim     return (AE_OK);
9731a39cfb0SJung-uk Kim }
9741a39cfb0SJung-uk Kim 
9751a39cfb0SJung-uk Kim 
9761a39cfb0SJung-uk Kim /*******************************************************************************
9771a39cfb0SJung-uk Kim  *
9781a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmCommonAscendingOp
9791a39cfb0SJung-uk Kim  *
9801a39cfb0SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
9811a39cfb0SJung-uk Kim  *
9821a39cfb0SJung-uk Kim  * RETURN:      None
9831a39cfb0SJung-uk Kim  *
9841a39cfb0SJung-uk Kim  * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes
9851a39cfb0SJung-uk Kim  *              scope if necessary.
9861a39cfb0SJung-uk Kim  *
9871a39cfb0SJung-uk Kim  ******************************************************************************/
9881a39cfb0SJung-uk Kim 
9891a39cfb0SJung-uk Kim static ACPI_STATUS
9901a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp (
9911a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
9921a39cfb0SJung-uk Kim     UINT32                  Level,
9931a39cfb0SJung-uk Kim     void                    *Context)
9941a39cfb0SJung-uk Kim {
9951a39cfb0SJung-uk Kim     ACPI_OP_WALK_INFO       *Info = Context;
9961a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
9971a39cfb0SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
9981a39cfb0SJung-uk Kim 
9991a39cfb0SJung-uk Kim 
10001a39cfb0SJung-uk Kim     /* Close scope if necessary */
10011a39cfb0SJung-uk Kim 
10021a39cfb0SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
10031a39cfb0SJung-uk Kim     ObjectType = OpInfo->ObjectType;
10041a39cfb0SJung-uk Kim     ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
10051a39cfb0SJung-uk Kim 
10061a39cfb0SJung-uk Kim     if (AcpiNsOpensScope (ObjectType))
10071a39cfb0SJung-uk Kim     {
10081a39cfb0SJung-uk Kim         (void) AcpiDsScopeStackPop (Info->WalkState);
10091a39cfb0SJung-uk Kim     }
10101a39cfb0SJung-uk Kim 
10111a39cfb0SJung-uk Kim     return (AE_OK);
10121a39cfb0SJung-uk Kim }
10131a39cfb0SJung-uk Kim 
10141a39cfb0SJung-uk Kim 
10151a39cfb0SJung-uk Kim /*******************************************************************************
10161a39cfb0SJung-uk Kim  *
10171a39cfb0SJung-uk Kim  * FUNCTION:    AcpiDmInspectPossibleArgs
10181a39cfb0SJung-uk Kim  *
10191a39cfb0SJung-uk Kim  * PARAMETERS:  CurrentOpArgCount   - Which arg of the current op was the
10201a39cfb0SJung-uk Kim  *                                    possible method invocation found
10211a39cfb0SJung-uk Kim  *              TargetCount         - Number of targets (0,1,2) for this op
10221a39cfb0SJung-uk Kim  *              Op                  - Parse op
10231a39cfb0SJung-uk Kim  *
10241a39cfb0SJung-uk Kim  * RETURN:      Status
10251a39cfb0SJung-uk Kim  *
10261a39cfb0SJung-uk Kim  * DESCRIPTION: Examine following args and next ops for possible arguments
10271a39cfb0SJung-uk Kim  *              for an unrecognized method invocation.
10281a39cfb0SJung-uk Kim  *
10291a39cfb0SJung-uk Kim  ******************************************************************************/
10301a39cfb0SJung-uk Kim 
10311a39cfb0SJung-uk Kim static UINT32
10321a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs (
10331a39cfb0SJung-uk Kim     UINT32                  CurrentOpArgCount,
10341a39cfb0SJung-uk Kim     UINT32                  TargetCount,
10351a39cfb0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
10361a39cfb0SJung-uk Kim {
10371a39cfb0SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
10381a39cfb0SJung-uk Kim     UINT32                  i;
10391a39cfb0SJung-uk Kim     UINT32                  Last = 0;
10401a39cfb0SJung-uk Kim     UINT32                  Lookahead;
10411a39cfb0SJung-uk Kim 
10421a39cfb0SJung-uk Kim 
10431a39cfb0SJung-uk Kim     Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount;
10441a39cfb0SJung-uk Kim 
10451a39cfb0SJung-uk Kim     /* Lookahead for the maximum number of possible arguments */
10461a39cfb0SJung-uk Kim 
10471a39cfb0SJung-uk Kim     for (i = 0; i < Lookahead; i++)
10481a39cfb0SJung-uk Kim     {
10491a39cfb0SJung-uk Kim         if (!Op)
10501a39cfb0SJung-uk Kim         {
10511a39cfb0SJung-uk Kim             break;
10521a39cfb0SJung-uk Kim         }
10531a39cfb0SJung-uk Kim 
10541a39cfb0SJung-uk Kim         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
10551a39cfb0SJung-uk Kim 
10561a39cfb0SJung-uk Kim         /*
10571a39cfb0SJung-uk Kim          * Any one of these operators is "very probably" not a method arg
10581a39cfb0SJung-uk Kim          */
10591a39cfb0SJung-uk Kim         if ((Op->Common.AmlOpcode == AML_STORE_OP) ||
10601a39cfb0SJung-uk Kim             (Op->Common.AmlOpcode == AML_NOTIFY_OP))
10611a39cfb0SJung-uk Kim         {
10621a39cfb0SJung-uk Kim             break;
10631a39cfb0SJung-uk Kim         }
10641a39cfb0SJung-uk Kim 
10651a39cfb0SJung-uk Kim         if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
10661a39cfb0SJung-uk Kim             (OpInfo->Class != AML_CLASS_CONTROL))
10671a39cfb0SJung-uk Kim         {
10681a39cfb0SJung-uk Kim             Last = i+1;
10691a39cfb0SJung-uk Kim         }
10701a39cfb0SJung-uk Kim 
10711a39cfb0SJung-uk Kim         Op = Op->Common.Next;
10721a39cfb0SJung-uk Kim     }
10731a39cfb0SJung-uk Kim 
10741a39cfb0SJung-uk Kim     return (Last);
10751a39cfb0SJung-uk Kim }
1076