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
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim *
90d84335fSJung-uk Kim * 1. Copyright Notice
100d84335fSJung-uk Kim *
11*58308fadSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
121a39cfb0SJung-uk Kim * All rights reserved.
131a39cfb0SJung-uk Kim *
140d84335fSJung-uk Kim * 2. License
150d84335fSJung-uk Kim *
160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim * property rights.
200d84335fSJung-uk Kim *
210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim *
280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim *
370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim * conditions are met:
390d84335fSJung-uk Kim *
400d84335fSJung-uk Kim * 3. Conditions
410d84335fSJung-uk Kim *
420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim *
540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim * make.
650d84335fSJung-uk Kim *
660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim * distribution.
710d84335fSJung-uk Kim *
720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim * Intel Code.
740d84335fSJung-uk Kim *
750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim * without prior written authorization from Intel.
790d84335fSJung-uk Kim *
800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim *
820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim *
900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim * LIMITED REMEDY.
980d84335fSJung-uk Kim *
990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim * such license, approval or letter.
1130d84335fSJung-uk Kim *
1140d84335fSJung-uk Kim *****************************************************************************
1150d84335fSJung-uk Kim *
1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim * following license:
1180d84335fSJung-uk Kim *
119d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without
120d244b227SJung-uk Kim * modification, are permitted provided that the following conditions
121d244b227SJung-uk Kim * are met:
122d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright
123d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer,
124d244b227SJung-uk Kim * without modification.
125d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below
127d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon
128d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further
129d244b227SJung-uk Kim * binary redistribution.
130d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names
131d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived
132d244b227SJung-uk Kim * from this software without specific prior written permission.
1331a39cfb0SJung-uk Kim *
1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim *
1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
147d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free
148d244b227SJung-uk Kim * Software Foundation.
1491a39cfb0SJung-uk Kim *
1500d84335fSJung-uk Kim *****************************************************************************/
1511a39cfb0SJung-uk Kim
152ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
153ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
154ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h>
155ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
156ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
157ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h>
158ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
159ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
1601a39cfb0SJung-uk Kim
1611a39cfb0SJung-uk Kim
1621a39cfb0SJung-uk Kim #define _COMPONENT ACPI_TOOLS
1631a39cfb0SJung-uk Kim ACPI_MODULE_NAME ("adwalk")
1641a39cfb0SJung-uk Kim
1651a39cfb0SJung-uk Kim /*
1661a39cfb0SJung-uk Kim * aslmap - opcode mappings and reserved method names
1671a39cfb0SJung-uk Kim */
1681a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE
1691a39cfb0SJung-uk Kim AslMapNamedOpcodeToDataType (
1701a39cfb0SJung-uk Kim UINT16 Opcode);
1711a39cfb0SJung-uk Kim
1721a39cfb0SJung-uk Kim /* Local prototypes */
1731a39cfb0SJung-uk Kim
1741a39cfb0SJung-uk Kim static ACPI_STATUS
1751a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending (
1761a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
1771a39cfb0SJung-uk Kim UINT32 Level,
1781a39cfb0SJung-uk Kim void *Context);
1791a39cfb0SJung-uk Kim
1801a39cfb0SJung-uk Kim static ACPI_STATUS
1811a39cfb0SJung-uk Kim AcpiDmDumpDescending (
1821a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
1831a39cfb0SJung-uk Kim UINT32 Level,
1841a39cfb0SJung-uk Kim void *Context);
1851a39cfb0SJung-uk Kim
1861a39cfb0SJung-uk Kim static ACPI_STATUS
1871a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp (
1881a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
1891a39cfb0SJung-uk Kim UINT32 Level,
1901a39cfb0SJung-uk Kim void *Context);
1911a39cfb0SJung-uk Kim
1921a39cfb0SJung-uk Kim static ACPI_STATUS
1931a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp (
1941a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
1951a39cfb0SJung-uk Kim UINT32 Level,
1961a39cfb0SJung-uk Kim void *Context);
1971a39cfb0SJung-uk Kim
1981a39cfb0SJung-uk Kim static ACPI_STATUS
1991a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp (
2001a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
2011a39cfb0SJung-uk Kim UINT32 Level,
2021a39cfb0SJung-uk Kim void *Context);
2031a39cfb0SJung-uk Kim
2041a39cfb0SJung-uk Kim static UINT32
2051a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs (
2061a39cfb0SJung-uk Kim UINT32 CurrentOpArgCount,
2071a39cfb0SJung-uk Kim UINT32 TargetCount,
2081a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op);
2091a39cfb0SJung-uk Kim
2101a39cfb0SJung-uk Kim static ACPI_STATUS
211af051161SJung-uk Kim AcpiDmCommonDescendingOp (
2121a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
2131a39cfb0SJung-uk Kim UINT32 Level,
2141a39cfb0SJung-uk Kim void *Context);
2151a39cfb0SJung-uk Kim
216af051161SJung-uk Kim static ACPI_STATUS
217af051161SJung-uk Kim AcpiDmProcessResourceDescriptors (
218af051161SJung-uk Kim ACPI_PARSE_OBJECT *Op,
219af051161SJung-uk Kim UINT32 Level,
220af051161SJung-uk Kim void *Context);
2211a39cfb0SJung-uk Kim
2221a39cfb0SJung-uk Kim /*******************************************************************************
2231a39cfb0SJung-uk Kim *
2241a39cfb0SJung-uk Kim * FUNCTION: AcpiDmDumpTree
2251a39cfb0SJung-uk Kim *
2261a39cfb0SJung-uk Kim * PARAMETERS: Origin - Starting object
2271a39cfb0SJung-uk Kim *
2281a39cfb0SJung-uk Kim * RETURN: None
2291a39cfb0SJung-uk Kim *
2301a39cfb0SJung-uk Kim * DESCRIPTION: Parse tree walk to format and output the nodes
2311a39cfb0SJung-uk Kim *
2321a39cfb0SJung-uk Kim ******************************************************************************/
2331a39cfb0SJung-uk Kim
2341a39cfb0SJung-uk Kim void
AcpiDmDumpTree(ACPI_PARSE_OBJECT * Origin)2351a39cfb0SJung-uk Kim AcpiDmDumpTree (
2361a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Origin)
2371a39cfb0SJung-uk Kim {
2381a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info;
2391a39cfb0SJung-uk Kim
2401a39cfb0SJung-uk Kim
2411a39cfb0SJung-uk Kim if (!Origin)
2421a39cfb0SJung-uk Kim {
2431a39cfb0SJung-uk Kim return;
2441a39cfb0SJung-uk Kim }
2451a39cfb0SJung-uk Kim
2461a39cfb0SJung-uk Kim AcpiOsPrintf ("/*\nAML Parse Tree\n\n");
2471a39cfb0SJung-uk Kim Info.Flags = 0;
2481a39cfb0SJung-uk Kim Info.Count = 0;
2491a39cfb0SJung-uk Kim Info.Level = 0;
2501a39cfb0SJung-uk Kim Info.WalkState = NULL;
251f8146b88SJung-uk Kim
2521a39cfb0SJung-uk Kim AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info);
2531a39cfb0SJung-uk Kim AcpiOsPrintf ("*/\n\n");
2541a39cfb0SJung-uk Kim }
2551a39cfb0SJung-uk Kim
2561a39cfb0SJung-uk Kim
2571a39cfb0SJung-uk Kim /*******************************************************************************
2581a39cfb0SJung-uk Kim *
2591a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFindOrphanMethods
2601a39cfb0SJung-uk Kim *
2611a39cfb0SJung-uk Kim * PARAMETERS: Origin - Starting object
2621a39cfb0SJung-uk Kim *
2631a39cfb0SJung-uk Kim * RETURN: None
2641a39cfb0SJung-uk Kim *
2651a39cfb0SJung-uk Kim * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods
2661a39cfb0SJung-uk Kim * that are not resolved in the namespace
2671a39cfb0SJung-uk Kim *
2681a39cfb0SJung-uk Kim ******************************************************************************/
2691a39cfb0SJung-uk Kim
2701a39cfb0SJung-uk Kim void
AcpiDmFindOrphanMethods(ACPI_PARSE_OBJECT * Origin)2711a39cfb0SJung-uk Kim AcpiDmFindOrphanMethods (
2721a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Origin)
2731a39cfb0SJung-uk Kim {
2741a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info;
2751a39cfb0SJung-uk Kim
2761a39cfb0SJung-uk Kim
2771a39cfb0SJung-uk Kim if (!Origin)
2781a39cfb0SJung-uk Kim {
2791a39cfb0SJung-uk Kim return;
2801a39cfb0SJung-uk Kim }
2811a39cfb0SJung-uk Kim
2821a39cfb0SJung-uk Kim Info.Flags = 0;
2831a39cfb0SJung-uk Kim Info.Level = 0;
2841a39cfb0SJung-uk Kim Info.WalkState = NULL;
285f8146b88SJung-uk Kim
2861a39cfb0SJung-uk Kim AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info);
2871a39cfb0SJung-uk Kim }
2881a39cfb0SJung-uk Kim
2891a39cfb0SJung-uk Kim
2901a39cfb0SJung-uk Kim /*******************************************************************************
2911a39cfb0SJung-uk Kim *
2921a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFinishNamespaceLoad
2931a39cfb0SJung-uk Kim *
2941a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree
2951a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace
296a9f12690SJung-uk Kim * OwnerId - OwnerId of the table to be disassembled
2971a39cfb0SJung-uk Kim *
2981a39cfb0SJung-uk Kim * RETURN: None
2991a39cfb0SJung-uk Kim *
3001a39cfb0SJung-uk Kim * DESCRIPTION: Load all namespace items that are created within control
3011a39cfb0SJung-uk Kim * methods. Used before namespace cross reference
3021a39cfb0SJung-uk Kim *
3031a39cfb0SJung-uk Kim ******************************************************************************/
3041a39cfb0SJung-uk Kim
3051a39cfb0SJung-uk Kim void
AcpiDmFinishNamespaceLoad(ACPI_PARSE_OBJECT * ParseTreeRoot,ACPI_NAMESPACE_NODE * NamespaceRoot,ACPI_OWNER_ID OwnerId)3061a39cfb0SJung-uk Kim AcpiDmFinishNamespaceLoad (
3071a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot,
308a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot,
309a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId)
3101a39cfb0SJung-uk Kim {
3111a39cfb0SJung-uk Kim ACPI_STATUS Status;
3121a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info;
3131a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState;
3141a39cfb0SJung-uk Kim
3151a39cfb0SJung-uk Kim
3161a39cfb0SJung-uk Kim if (!ParseTreeRoot)
3171a39cfb0SJung-uk Kim {
3181a39cfb0SJung-uk Kim return;
3191a39cfb0SJung-uk Kim }
3201a39cfb0SJung-uk Kim
3211a39cfb0SJung-uk Kim /* Create and initialize a new walk state */
3221a39cfb0SJung-uk Kim
323a9f12690SJung-uk Kim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
3241a39cfb0SJung-uk Kim if (!WalkState)
3251a39cfb0SJung-uk Kim {
3261a39cfb0SJung-uk Kim return;
3271a39cfb0SJung-uk Kim }
3281a39cfb0SJung-uk Kim
329f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type,
330f8146b88SJung-uk Kim WalkState);
3311a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status))
3321a39cfb0SJung-uk Kim {
3331a39cfb0SJung-uk Kim return;
3341a39cfb0SJung-uk Kim }
3351a39cfb0SJung-uk Kim
3361a39cfb0SJung-uk Kim Info.Flags = 0;
3371a39cfb0SJung-uk Kim Info.Level = 0;
3381a39cfb0SJung-uk Kim Info.WalkState = WalkState;
339f8146b88SJung-uk Kim
3401a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp,
3411a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info);
3421a39cfb0SJung-uk Kim ACPI_FREE (WalkState);
3431a39cfb0SJung-uk Kim }
3441a39cfb0SJung-uk Kim
3451a39cfb0SJung-uk Kim
3461a39cfb0SJung-uk Kim /*******************************************************************************
3471a39cfb0SJung-uk Kim *
3481a39cfb0SJung-uk Kim * FUNCTION: AcpiDmCrossReferenceNamespace
3491a39cfb0SJung-uk Kim *
3501a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree
3511a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace
352a9f12690SJung-uk Kim * OwnerId - OwnerId of the table to be disassembled
3531a39cfb0SJung-uk Kim *
3541a39cfb0SJung-uk Kim * RETURN: None
3551a39cfb0SJung-uk Kim *
3561a39cfb0SJung-uk Kim * DESCRIPTION: Cross reference the namespace to create externals
3571a39cfb0SJung-uk Kim *
3581a39cfb0SJung-uk Kim ******************************************************************************/
3591a39cfb0SJung-uk Kim
3601a39cfb0SJung-uk Kim void
AcpiDmCrossReferenceNamespace(ACPI_PARSE_OBJECT * ParseTreeRoot,ACPI_NAMESPACE_NODE * NamespaceRoot,ACPI_OWNER_ID OwnerId)3611a39cfb0SJung-uk Kim AcpiDmCrossReferenceNamespace (
3621a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot,
363a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot,
364a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId)
3651a39cfb0SJung-uk Kim {
3661a39cfb0SJung-uk Kim ACPI_STATUS Status;
3671a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info;
3681a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState;
3691a39cfb0SJung-uk Kim
3701a39cfb0SJung-uk Kim
3711a39cfb0SJung-uk Kim if (!ParseTreeRoot)
3721a39cfb0SJung-uk Kim {
3731a39cfb0SJung-uk Kim return;
3741a39cfb0SJung-uk Kim }
3751a39cfb0SJung-uk Kim
3761a39cfb0SJung-uk Kim /* Create and initialize a new walk state */
3771a39cfb0SJung-uk Kim
378a9f12690SJung-uk Kim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
3791a39cfb0SJung-uk Kim if (!WalkState)
3801a39cfb0SJung-uk Kim {
3811a39cfb0SJung-uk Kim return;
3821a39cfb0SJung-uk Kim }
3831a39cfb0SJung-uk Kim
384f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type,
385f8146b88SJung-uk Kim WalkState);
3861a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status))
3871a39cfb0SJung-uk Kim {
3881a39cfb0SJung-uk Kim return;
3891a39cfb0SJung-uk Kim }
3901a39cfb0SJung-uk Kim
3911a39cfb0SJung-uk Kim Info.Flags = 0;
3921a39cfb0SJung-uk Kim Info.Level = 0;
3931a39cfb0SJung-uk Kim Info.WalkState = WalkState;
394f8146b88SJung-uk Kim
3951a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp,
3961a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info);
3971a39cfb0SJung-uk Kim ACPI_FREE (WalkState);
3981a39cfb0SJung-uk Kim }
3991a39cfb0SJung-uk Kim
4001a39cfb0SJung-uk Kim
4011a39cfb0SJung-uk Kim /*******************************************************************************
4021a39cfb0SJung-uk Kim *
403af051161SJung-uk Kim * FUNCTION: AcpiDmConvertParseObjects
4041a39cfb0SJung-uk Kim *
4051a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree
4061a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace
4071a39cfb0SJung-uk Kim *
4081a39cfb0SJung-uk Kim * RETURN: None
4091a39cfb0SJung-uk Kim *
410af051161SJung-uk Kim * DESCRIPTION: Begin parse tree walk to perform conversions needed for
411af051161SJung-uk Kim * disassembly. These include resource descriptors and switch/case
412af051161SJung-uk Kim * operations.
4131a39cfb0SJung-uk Kim *
4141a39cfb0SJung-uk Kim ******************************************************************************/
4151a39cfb0SJung-uk Kim
4161a39cfb0SJung-uk Kim void
AcpiDmConvertParseObjects(ACPI_PARSE_OBJECT * ParseTreeRoot,ACPI_NAMESPACE_NODE * NamespaceRoot)417af051161SJung-uk Kim AcpiDmConvertParseObjects (
4181a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot,
4191a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot)
4201a39cfb0SJung-uk Kim {
4211a39cfb0SJung-uk Kim ACPI_STATUS Status;
4221a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info;
4231a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState;
4241a39cfb0SJung-uk Kim
4251a39cfb0SJung-uk Kim
4261a39cfb0SJung-uk Kim if (!ParseTreeRoot)
4271a39cfb0SJung-uk Kim {
4281a39cfb0SJung-uk Kim return;
4291a39cfb0SJung-uk Kim }
4301a39cfb0SJung-uk Kim
4311a39cfb0SJung-uk Kim /* Create and initialize a new walk state */
4321a39cfb0SJung-uk Kim
4331a39cfb0SJung-uk Kim WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
4341a39cfb0SJung-uk Kim if (!WalkState)
4351a39cfb0SJung-uk Kim {
4361a39cfb0SJung-uk Kim return;
4371a39cfb0SJung-uk Kim }
4381a39cfb0SJung-uk Kim
439f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type,
440f8146b88SJung-uk Kim WalkState);
4411a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status))
4421a39cfb0SJung-uk Kim {
443f8146b88SJung-uk Kim ACPI_FREE (WalkState);
4441a39cfb0SJung-uk Kim return;
4451a39cfb0SJung-uk Kim }
4461a39cfb0SJung-uk Kim
4471a39cfb0SJung-uk Kim Info.Flags = 0;
4481a39cfb0SJung-uk Kim Info.Level = 0;
4491a39cfb0SJung-uk Kim Info.WalkState = WalkState;
450f8146b88SJung-uk Kim
451af051161SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmCommonDescendingOp,
4521a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info);
4531a39cfb0SJung-uk Kim ACPI_FREE (WalkState);
454af051161SJung-uk Kim
455af051161SJung-uk Kim if (AcpiGbl_TempListHead) {
456af051161SJung-uk Kim AcpiDmClearTempList();
457af051161SJung-uk Kim }
458af051161SJung-uk Kim
4591a39cfb0SJung-uk Kim return;
4601a39cfb0SJung-uk Kim }
4611a39cfb0SJung-uk Kim
4621a39cfb0SJung-uk Kim
4631a39cfb0SJung-uk Kim /*******************************************************************************
4641a39cfb0SJung-uk Kim *
4651a39cfb0SJung-uk Kim * FUNCTION: AcpiDmDumpDescending
4661a39cfb0SJung-uk Kim *
4671a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK
4681a39cfb0SJung-uk Kim *
4691a39cfb0SJung-uk Kim * RETURN: Status
4701a39cfb0SJung-uk Kim *
4711a39cfb0SJung-uk Kim * DESCRIPTION: Format and print contents of one parse Op.
4721a39cfb0SJung-uk Kim *
4731a39cfb0SJung-uk Kim ******************************************************************************/
4741a39cfb0SJung-uk Kim
4751a39cfb0SJung-uk Kim static ACPI_STATUS
AcpiDmDumpDescending(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)4761a39cfb0SJung-uk Kim AcpiDmDumpDescending (
4771a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
4781a39cfb0SJung-uk Kim UINT32 Level,
4791a39cfb0SJung-uk Kim void *Context)
4801a39cfb0SJung-uk Kim {
4811a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context;
4821a39cfb0SJung-uk Kim char *Path;
483a009b7dcSJung-uk Kim ACPI_STATUS Status;
4841a39cfb0SJung-uk Kim
4851a39cfb0SJung-uk Kim
4861a39cfb0SJung-uk Kim if (!Op)
4871a39cfb0SJung-uk Kim {
4881a39cfb0SJung-uk Kim return (AE_OK);
4891a39cfb0SJung-uk Kim }
4901a39cfb0SJung-uk Kim
4911a39cfb0SJung-uk Kim /* Most of the information (count, level, name) here */
4921a39cfb0SJung-uk Kim
493f556842eSJung-uk Kim Info->Count++;
4941a39cfb0SJung-uk Kim AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level);
4951a39cfb0SJung-uk Kim AcpiDmIndent (Level);
4961a39cfb0SJung-uk Kim AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
4971a39cfb0SJung-uk Kim
4981a39cfb0SJung-uk Kim /* Extra info is helpful */
4991a39cfb0SJung-uk Kim
5001a39cfb0SJung-uk Kim switch (Op->Common.AmlOpcode)
5011a39cfb0SJung-uk Kim {
5021a39cfb0SJung-uk Kim case AML_BYTE_OP:
50379c6d946SJung-uk Kim
50479c6d946SJung-uk Kim AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer);
50579c6d946SJung-uk Kim break;
50679c6d946SJung-uk Kim
5071a39cfb0SJung-uk Kim case AML_WORD_OP:
50879c6d946SJung-uk Kim
50979c6d946SJung-uk Kim AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer);
51079c6d946SJung-uk Kim break;
51179c6d946SJung-uk Kim
5121a39cfb0SJung-uk Kim case AML_DWORD_OP:
513a9d8d09cSJung-uk Kim
51479c6d946SJung-uk Kim AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer);
5151a39cfb0SJung-uk Kim break;
5161a39cfb0SJung-uk Kim
5173f0275a0SJung-uk Kim case AML_QWORD_OP:
518a9d8d09cSJung-uk Kim
5193f0275a0SJung-uk Kim AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
5203f0275a0SJung-uk Kim break;
5213f0275a0SJung-uk Kim
5221a39cfb0SJung-uk Kim case AML_INT_NAMEPATH_OP:
523a9d8d09cSJung-uk Kim
5241a39cfb0SJung-uk Kim if (Op->Common.Value.String)
5251a39cfb0SJung-uk Kim {
526a009b7dcSJung-uk Kim Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String,
5271a39cfb0SJung-uk Kim NULL, &Path);
528a009b7dcSJung-uk Kim if (ACPI_SUCCESS (Status))
529a009b7dcSJung-uk Kim {
5301a39cfb0SJung-uk Kim AcpiOsPrintf ("%s %p", Path, Op->Common.Node);
5311a39cfb0SJung-uk Kim ACPI_FREE (Path);
5321a39cfb0SJung-uk Kim }
5331a39cfb0SJung-uk Kim else
5341a39cfb0SJung-uk Kim {
535a009b7dcSJung-uk Kim AcpiOsPrintf ("Could not externalize pathname for node [%4.4s]",
536a009b7dcSJung-uk Kim Op->Common.Node->Name.Ascii);
537a009b7dcSJung-uk Kim }
538a009b7dcSJung-uk Kim }
539a009b7dcSJung-uk Kim else
540a009b7dcSJung-uk Kim {
5411a39cfb0SJung-uk Kim AcpiOsPrintf ("[NULL]");
5421a39cfb0SJung-uk Kim }
5431a39cfb0SJung-uk Kim break;
5441a39cfb0SJung-uk Kim
5451a39cfb0SJung-uk Kim case AML_NAME_OP:
5461a39cfb0SJung-uk Kim case AML_METHOD_OP:
5471a39cfb0SJung-uk Kim case AML_DEVICE_OP:
5485f9b24faSJung-uk Kim
5495f9b24faSJung-uk Kim AcpiOsPrintf ("%4.4s",
5505f9b24faSJung-uk Kim ACPI_CAST_PTR (char, &Op->Named.Name));
5515f9b24faSJung-uk Kim break;
5525f9b24faSJung-uk Kim
5531a39cfb0SJung-uk Kim case AML_INT_NAMEDFIELD_OP:
554a9d8d09cSJung-uk Kim
5555f9b24faSJung-uk Kim AcpiOsPrintf ("%4.4s Length: (bits) %8.8X%8.8X (bytes) %8.8X%8.8X",
5565f9b24faSJung-uk Kim ACPI_CAST_PTR (char, &Op->Named.Name),
5575f9b24faSJung-uk Kim ACPI_FORMAT_UINT64 (Op->Common.Value.Integer),
5585f9b24faSJung-uk Kim ACPI_FORMAT_UINT64 (Op->Common.Value.Integer / 8));
5591a39cfb0SJung-uk Kim break;
560a9f12690SJung-uk Kim
5615f9b24faSJung-uk Kim
562a9f12690SJung-uk Kim default:
563a9d8d09cSJung-uk Kim
564a9f12690SJung-uk Kim break;
5651a39cfb0SJung-uk Kim }
5661a39cfb0SJung-uk Kim
5671a39cfb0SJung-uk Kim AcpiOsPrintf ("\n");
5681a39cfb0SJung-uk Kim return (AE_OK);
5691a39cfb0SJung-uk Kim }
5701a39cfb0SJung-uk Kim
5711a39cfb0SJung-uk Kim
5721a39cfb0SJung-uk Kim /*******************************************************************************
5731a39cfb0SJung-uk Kim *
5741a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFindOrphanDescending
5751a39cfb0SJung-uk Kim *
5761a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK
5771a39cfb0SJung-uk Kim *
5781a39cfb0SJung-uk Kim * RETURN: Status
5791a39cfb0SJung-uk Kim *
5801a39cfb0SJung-uk Kim * DESCRIPTION: Check namepath Ops for orphaned method invocations
5811a39cfb0SJung-uk Kim *
582f8146b88SJung-uk Kim * Note: Parts of this are experimental, under possible further development.
5831a39cfb0SJung-uk Kim *
5841a39cfb0SJung-uk Kim ******************************************************************************/
5851a39cfb0SJung-uk Kim
5861a39cfb0SJung-uk Kim static ACPI_STATUS
AcpiDmFindOrphanDescending(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)5871a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending (
5881a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
5891a39cfb0SJung-uk Kim UINT32 Level,
5901a39cfb0SJung-uk Kim void *Context)
5911a39cfb0SJung-uk Kim {
5921a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo;
5931a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ChildOp;
5941a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp;
5951a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp;
5961a39cfb0SJung-uk Kim UINT32 ArgCount;
5971a39cfb0SJung-uk Kim
5981a39cfb0SJung-uk Kim
5991a39cfb0SJung-uk Kim if (!Op)
6001a39cfb0SJung-uk Kim {
6011a39cfb0SJung-uk Kim return (AE_OK);
6021a39cfb0SJung-uk Kim }
6031a39cfb0SJung-uk Kim
604a009b7dcSJung-uk Kim #ifdef ACPI_UNDER_DEVELOPMENT
6051a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
606a009b7dcSJung-uk Kim #endif
6071a39cfb0SJung-uk Kim
6081a39cfb0SJung-uk Kim switch (Op->Common.AmlOpcode)
6091a39cfb0SJung-uk Kim {
6101a39cfb0SJung-uk Kim #ifdef ACPI_UNDER_DEVELOPMENT
6111a39cfb0SJung-uk Kim case AML_ADD_OP:
612a9d8d09cSJung-uk Kim
6131a39cfb0SJung-uk Kim ChildOp = Op->Common.Value.Arg;
6141a39cfb0SJung-uk Kim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
6151a39cfb0SJung-uk Kim !ChildOp->Common.Node)
6161a39cfb0SJung-uk Kim {
6171a39cfb0SJung-uk Kim AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String,
6181a39cfb0SJung-uk Kim NULL, &Path);
619313a0c13SJung-uk Kim AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s */\n",
620313a0c13SJung-uk Kim Op->Common.AmlOpName, Path);
6211a39cfb0SJung-uk Kim ACPI_FREE (Path);
6221a39cfb0SJung-uk Kim
6231a39cfb0SJung-uk Kim NextOp = Op->Common.Next;
6241a39cfb0SJung-uk Kim if (!NextOp)
6251a39cfb0SJung-uk Kim {
6261a39cfb0SJung-uk Kim /* This NamePath has no args, assume it is an integer */
6271a39cfb0SJung-uk Kim
628313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp,
629313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
6301a39cfb0SJung-uk Kim return (AE_OK);
6311a39cfb0SJung-uk Kim }
6321a39cfb0SJung-uk Kim
6331a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp);
634313a0c13SJung-uk Kim AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n",
635313a0c13SJung-uk Kim ArgCount, AcpiDmCountChildren (Op));
6361a39cfb0SJung-uk Kim
6371a39cfb0SJung-uk Kim if (ArgCount < 1)
6381a39cfb0SJung-uk Kim {
6391a39cfb0SJung-uk Kim /* One Arg means this is just a Store(Name,Target) */
6401a39cfb0SJung-uk Kim
641313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp,
642313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
6431a39cfb0SJung-uk Kim return (AE_OK);
6441a39cfb0SJung-uk Kim }
6451a39cfb0SJung-uk Kim
646313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp,
647313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
6481a39cfb0SJung-uk Kim }
6491a39cfb0SJung-uk Kim break;
650f8146b88SJung-uk Kim
6511a39cfb0SJung-uk Kim #endif
6521a39cfb0SJung-uk Kim
6531a39cfb0SJung-uk Kim case AML_STORE_OP:
6541a39cfb0SJung-uk Kim
6551a39cfb0SJung-uk Kim ChildOp = Op->Common.Value.Arg;
6561a39cfb0SJung-uk Kim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
6571a39cfb0SJung-uk Kim !ChildOp->Common.Node)
6581a39cfb0SJung-uk Kim {
6591a39cfb0SJung-uk Kim NextOp = Op->Common.Next;
6601a39cfb0SJung-uk Kim if (!NextOp)
6611a39cfb0SJung-uk Kim {
6621a39cfb0SJung-uk Kim /* This NamePath has no args, assume it is an integer */
6631a39cfb0SJung-uk Kim
664313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp,
665313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
6661a39cfb0SJung-uk Kim return (AE_OK);
6671a39cfb0SJung-uk Kim }
6681a39cfb0SJung-uk Kim
6691a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp);
6701a39cfb0SJung-uk Kim if (ArgCount <= 1)
6711a39cfb0SJung-uk Kim {
6721a39cfb0SJung-uk Kim /* One Arg means this is just a Store(Name,Target) */
6731a39cfb0SJung-uk Kim
674313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp,
675f8146b88SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, ArgCount, 0);
6761a39cfb0SJung-uk Kim return (AE_OK);
6771a39cfb0SJung-uk Kim }
6781a39cfb0SJung-uk Kim
679313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp,
680313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
6811a39cfb0SJung-uk Kim }
6821a39cfb0SJung-uk Kim break;
6831a39cfb0SJung-uk Kim
6841a39cfb0SJung-uk Kim case AML_INT_NAMEPATH_OP:
6851a39cfb0SJung-uk Kim
6861a39cfb0SJung-uk Kim /* Must examine parent to see if this namepath is an argument */
6871a39cfb0SJung-uk Kim
6881a39cfb0SJung-uk Kim ParentOp = Op->Common.Parent;
6891a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
6901a39cfb0SJung-uk Kim
6911a39cfb0SJung-uk Kim if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
6921a39cfb0SJung-uk Kim (OpInfo->Class != AML_CLASS_CREATE) &&
693a7a3b383SJung-uk Kim (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
6941a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
6951a39cfb0SJung-uk Kim !Op->Common.Node)
6961a39cfb0SJung-uk Kim {
697f8146b88SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op);
6981a39cfb0SJung-uk Kim
6991a39cfb0SJung-uk Kim /*
7001a39cfb0SJung-uk Kim * Check if namepath is a predicate for if/while or lone parameter to
7011a39cfb0SJung-uk Kim * a return.
7021a39cfb0SJung-uk Kim */
7031a39cfb0SJung-uk Kim if (ArgCount == 0)
7041a39cfb0SJung-uk Kim {
7051a39cfb0SJung-uk Kim if (((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
7061a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_WHILE_OP) ||
7071a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) &&
7081a39cfb0SJung-uk Kim
7091a39cfb0SJung-uk Kim /* And namepath is the first argument */
7101a39cfb0SJung-uk Kim (ParentOp->Common.Value.Arg == Op))
7111a39cfb0SJung-uk Kim {
712313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (Op,
713313a0c13SJung-uk Kim Op->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
7141a39cfb0SJung-uk Kim break;
7151a39cfb0SJung-uk Kim }
7161a39cfb0SJung-uk Kim }
7171a39cfb0SJung-uk Kim
7181a39cfb0SJung-uk Kim /*
7191a39cfb0SJung-uk Kim * This is a standalone namestring (not a parameter to another
7201a39cfb0SJung-uk Kim * operator) - it *must* be a method invocation, nothing else is
7211a39cfb0SJung-uk Kim * grammatically possible.
7221a39cfb0SJung-uk Kim */
723313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (Op,
724313a0c13SJung-uk Kim Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
7251a39cfb0SJung-uk Kim }
7261a39cfb0SJung-uk Kim break;
727a9f12690SJung-uk Kim
728a9f12690SJung-uk Kim default:
729a9d8d09cSJung-uk Kim
730a9f12690SJung-uk Kim break;
7311a39cfb0SJung-uk Kim }
7321a39cfb0SJung-uk Kim
7331a39cfb0SJung-uk Kim return (AE_OK);
7341a39cfb0SJung-uk Kim }
7351a39cfb0SJung-uk Kim
7361a39cfb0SJung-uk Kim
7371a39cfb0SJung-uk Kim /*******************************************************************************
7381a39cfb0SJung-uk Kim *
7391a39cfb0SJung-uk Kim * FUNCTION: AcpiDmLoadDescendingOp
7401a39cfb0SJung-uk Kim *
7411a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK
7421a39cfb0SJung-uk Kim *
7431a39cfb0SJung-uk Kim * RETURN: Status
7441a39cfb0SJung-uk Kim *
7451a39cfb0SJung-uk Kim * DESCRIPTION: Descending handler for namespace control method object load
7461a39cfb0SJung-uk Kim *
7471a39cfb0SJung-uk Kim ******************************************************************************/
7481a39cfb0SJung-uk Kim
7491a39cfb0SJung-uk Kim static ACPI_STATUS
AcpiDmLoadDescendingOp(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)7501a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp (
7511a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
7521a39cfb0SJung-uk Kim UINT32 Level,
7531a39cfb0SJung-uk Kim void *Context)
7541a39cfb0SJung-uk Kim {
7551a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context;
7561a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo;
7571a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState;
7581a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType;
7591a39cfb0SJung-uk Kim ACPI_STATUS Status;
7601a39cfb0SJung-uk Kim char *Path = NULL;
7611a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp;
7621a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node;
763a9f12690SJung-uk Kim char FieldPath[5];
764a9f12690SJung-uk Kim BOOLEAN PreDefined = FALSE;
765a9f12690SJung-uk Kim UINT8 PreDefineIndex = 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 = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
7711a39cfb0SJung-uk Kim
7721a39cfb0SJung-uk Kim /* Only interested in operators that create new names */
7731a39cfb0SJung-uk Kim
7741a39cfb0SJung-uk Kim if (!(OpInfo->Flags & AML_NAMED) &&
7751a39cfb0SJung-uk Kim !(OpInfo->Flags & AML_CREATE))
7761a39cfb0SJung-uk Kim {
7771a39cfb0SJung-uk Kim goto Exit;
7781a39cfb0SJung-uk Kim }
7791a39cfb0SJung-uk Kim
7801a39cfb0SJung-uk Kim /* Get the NamePath from the appropriate place */
7811a39cfb0SJung-uk Kim
7821a39cfb0SJung-uk Kim if (OpInfo->Flags & AML_NAMED)
7831a39cfb0SJung-uk Kim {
7841a39cfb0SJung-uk Kim /* For all named operators, get the new name */
7851a39cfb0SJung-uk Kim
786af051161SJung-uk Kim Path = Op->Named.Path;
787a9f12690SJung-uk Kim
788a9f12690SJung-uk Kim if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
789a9f12690SJung-uk Kim {
790a9f12690SJung-uk Kim *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name;
791a9f12690SJung-uk Kim FieldPath[4] = 0;
792a9f12690SJung-uk Kim Path = FieldPath;
793a9f12690SJung-uk Kim }
7941a39cfb0SJung-uk Kim }
7951a39cfb0SJung-uk Kim else if (OpInfo->Flags & AML_CREATE)
7961a39cfb0SJung-uk Kim {
7971a39cfb0SJung-uk Kim /* New name is the last child */
7981a39cfb0SJung-uk Kim
7991a39cfb0SJung-uk Kim NextOp = Op->Common.Value.Arg;
8001a39cfb0SJung-uk Kim
8011a39cfb0SJung-uk Kim while (NextOp->Common.Next)
8021a39cfb0SJung-uk Kim {
8031a39cfb0SJung-uk Kim NextOp = NextOp->Common.Next;
8041a39cfb0SJung-uk Kim }
805f8146b88SJung-uk Kim
8061a39cfb0SJung-uk Kim Path = NextOp->Common.Value.String;
8071a39cfb0SJung-uk Kim }
8081a39cfb0SJung-uk Kim
8091a39cfb0SJung-uk Kim if (!Path)
8101a39cfb0SJung-uk Kim {
8111a39cfb0SJung-uk Kim goto Exit;
8121a39cfb0SJung-uk Kim }
8131a39cfb0SJung-uk Kim
8141a39cfb0SJung-uk Kim /* Insert the name into the namespace */
8151a39cfb0SJung-uk Kim
8161a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
8171a39cfb0SJung-uk Kim ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE,
8181a39cfb0SJung-uk Kim WalkState, &Node);
8191a39cfb0SJung-uk Kim
8201a39cfb0SJung-uk Kim Op->Common.Node = Node;
8211a39cfb0SJung-uk Kim
822a9f12690SJung-uk Kim if (ACPI_SUCCESS (Status))
823a9f12690SJung-uk Kim {
824a9f12690SJung-uk Kim /* Check if it's a predefined node */
825a9f12690SJung-uk Kim
826a9f12690SJung-uk Kim while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name)
827a9f12690SJung-uk Kim {
828278f0de6SJung-uk Kim if (ACPI_COMPARE_NAMESEG (Node->Name.Ascii,
8298ef1a331SJung-uk Kim AcpiGbl_PreDefinedNames[PreDefineIndex].Name))
830a9f12690SJung-uk Kim {
831a9f12690SJung-uk Kim PreDefined = TRUE;
832a9f12690SJung-uk Kim break;
833a9f12690SJung-uk Kim }
834a9f12690SJung-uk Kim
835a9f12690SJung-uk Kim PreDefineIndex++;
836a9f12690SJung-uk Kim }
837a9f12690SJung-uk Kim
838a9f12690SJung-uk Kim /*
839a9f12690SJung-uk Kim * Set node owner id if it satisfies all the following conditions:
840a9f12690SJung-uk Kim * 1) Not a predefined node, _SB_ etc
841a9f12690SJung-uk Kim * 2) Not the root node
842a9f12690SJung-uk Kim * 3) Not a node created by Scope
843a9f12690SJung-uk Kim */
844a009b7dcSJung-uk Kim if (!PreDefined &&
845a009b7dcSJung-uk Kim (Node != AcpiGbl_RootNode) &&
846a009b7dcSJung-uk Kim (Op->Common.AmlOpcode != AML_SCOPE_OP))
847a9f12690SJung-uk Kim {
848a9f12690SJung-uk Kim Node->OwnerId = WalkState->OwnerId;
849a9f12690SJung-uk Kim }
850a9f12690SJung-uk Kim }
851a9f12690SJung-uk Kim
8521a39cfb0SJung-uk Kim
8531a39cfb0SJung-uk Kim Exit:
8541a39cfb0SJung-uk Kim
8551a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType))
8561a39cfb0SJung-uk Kim {
8571a39cfb0SJung-uk Kim if (Op->Common.Node)
8581a39cfb0SJung-uk Kim {
859f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType,
860f8146b88SJung-uk Kim WalkState);
8611a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status))
8621a39cfb0SJung-uk Kim {
8631a39cfb0SJung-uk Kim return (Status);
8641a39cfb0SJung-uk Kim }
8651a39cfb0SJung-uk Kim }
8661a39cfb0SJung-uk Kim }
8671a39cfb0SJung-uk Kim
8681a39cfb0SJung-uk Kim return (AE_OK);
8691a39cfb0SJung-uk Kim }
8701a39cfb0SJung-uk Kim
8711a39cfb0SJung-uk Kim
8721a39cfb0SJung-uk Kim /*******************************************************************************
8731a39cfb0SJung-uk Kim *
8741a39cfb0SJung-uk Kim * FUNCTION: AcpiDmXrefDescendingOp
8751a39cfb0SJung-uk Kim *
8761a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK
8771a39cfb0SJung-uk Kim *
8781a39cfb0SJung-uk Kim * RETURN: Status
8791a39cfb0SJung-uk Kim *
8801a39cfb0SJung-uk Kim * DESCRIPTION: Descending handler for namespace cross reference
8811a39cfb0SJung-uk Kim *
8821a39cfb0SJung-uk Kim ******************************************************************************/
8831a39cfb0SJung-uk Kim
8841a39cfb0SJung-uk Kim static ACPI_STATUS
AcpiDmXrefDescendingOp(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)8851a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp (
8861a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
8871a39cfb0SJung-uk Kim UINT32 Level,
8881a39cfb0SJung-uk Kim void *Context)
8891a39cfb0SJung-uk Kim {
8901a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context;
8911a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo;
8921a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState;
8931a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType;
894a9f12690SJung-uk Kim ACPI_OBJECT_TYPE ObjectType2;
8951a39cfb0SJung-uk Kim ACPI_STATUS Status;
8961a39cfb0SJung-uk Kim char *Path = NULL;
8971a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp;
8981a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node;
899a9f12690SJung-uk Kim ACPI_OPERAND_OBJECT *Object;
90042fecd12SJung-uk Kim UINT32 ParamCount = 0;
901313a0c13SJung-uk Kim char *Pathname;
902f8146b88SJung-uk Kim UINT16 Flags = 0;
9031a39cfb0SJung-uk Kim
9041a39cfb0SJung-uk Kim
9051a39cfb0SJung-uk Kim WalkState = Info->WalkState;
9061a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
9071a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
9081a39cfb0SJung-uk Kim
9091a39cfb0SJung-uk Kim if ((!(OpInfo->Flags & AML_NAMED)) &&
9101a39cfb0SJung-uk Kim (!(OpInfo->Flags & AML_CREATE)) &&
911313a0c13SJung-uk Kim (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP) &&
912313a0c13SJung-uk Kim (Op->Common.AmlOpcode != AML_NOTIFY_OP))
9131a39cfb0SJung-uk Kim {
9141a39cfb0SJung-uk Kim goto Exit;
9151a39cfb0SJung-uk Kim }
916313a0c13SJung-uk Kim
9171a39cfb0SJung-uk Kim /* Get the NamePath from the appropriate place */
9181a39cfb0SJung-uk Kim
9191a39cfb0SJung-uk Kim if (OpInfo->Flags & AML_NAMED)
9201a39cfb0SJung-uk Kim {
9211a39cfb0SJung-uk Kim /*
922a7a3b383SJung-uk Kim * Only these two operators (Alias, Scope) refer to an existing
923a7a3b383SJung-uk Kim * name, it is the first argument
9241a39cfb0SJung-uk Kim */
925a7a3b383SJung-uk Kim if (Op->Common.AmlOpcode == AML_ALIAS_OP)
926a7a3b383SJung-uk Kim {
927a7a3b383SJung-uk Kim ObjectType = ACPI_TYPE_ANY;
928a7a3b383SJung-uk Kim
929a7a3b383SJung-uk Kim NextOp = Op->Common.Value.Arg;
930a7a3b383SJung-uk Kim NextOp = NextOp->Common.Value.Arg;
931a7a3b383SJung-uk Kim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
932a7a3b383SJung-uk Kim {
933a7a3b383SJung-uk Kim Path = NextOp->Common.Value.String;
934a7a3b383SJung-uk Kim }
935a7a3b383SJung-uk Kim }
936af051161SJung-uk Kim else if (Op->Common.AmlOpcode == AML_SCOPE_OP ||
937af051161SJung-uk Kim Op->Common.AmlOpcode == AML_EXTERNAL_OP)
938a7a3b383SJung-uk Kim {
939af051161SJung-uk Kim Path = Op->Named.Path;
9401a39cfb0SJung-uk Kim }
9411a39cfb0SJung-uk Kim }
9421a39cfb0SJung-uk Kim else if (OpInfo->Flags & AML_CREATE)
9431a39cfb0SJung-uk Kim {
9441a39cfb0SJung-uk Kim /* Referenced Buffer Name is the first child */
9451a39cfb0SJung-uk Kim
946a7a3b383SJung-uk Kim ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
947a7a3b383SJung-uk Kim
9481a39cfb0SJung-uk Kim NextOp = Op->Common.Value.Arg;
9491a39cfb0SJung-uk Kim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
9501a39cfb0SJung-uk Kim {
9511a39cfb0SJung-uk Kim Path = NextOp->Common.Value.String;
9521a39cfb0SJung-uk Kim }
9531a39cfb0SJung-uk Kim }
954313a0c13SJung-uk Kim else if (Op->Common.AmlOpcode == AML_NOTIFY_OP)
955313a0c13SJung-uk Kim {
956313a0c13SJung-uk Kim Path = Op->Common.Value.Arg->Asl.Value.String;
957313a0c13SJung-uk Kim }
9581a39cfb0SJung-uk Kim else
9591a39cfb0SJung-uk Kim {
9601a39cfb0SJung-uk Kim Path = Op->Common.Value.String;
9611a39cfb0SJung-uk Kim }
9621a39cfb0SJung-uk Kim
9631a39cfb0SJung-uk Kim if (!Path)
9641a39cfb0SJung-uk Kim {
9651a39cfb0SJung-uk Kim goto Exit;
9661a39cfb0SJung-uk Kim }
9671a39cfb0SJung-uk Kim
9681a39cfb0SJung-uk Kim /*
9691a39cfb0SJung-uk Kim * Lookup the name in the namespace. Name must exist at this point, or it
9701a39cfb0SJung-uk Kim * is an invalid reference.
9711a39cfb0SJung-uk Kim *
9721a39cfb0SJung-uk Kim * The namespace is also used as a lookup table for references to resource
9731a39cfb0SJung-uk Kim * descriptors and the fields within them.
9741a39cfb0SJung-uk Kim */
975313a0c13SJung-uk Kim Node = NULL;
9761a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
9771a39cfb0SJung-uk Kim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
9781a39cfb0SJung-uk Kim WalkState, &Node);
979f8146b88SJung-uk Kim
980a7a3b383SJung-uk Kim if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
981a7a3b383SJung-uk Kim {
982313a0c13SJung-uk Kim /* Node was created by an External() statement */
983313a0c13SJung-uk Kim
984a7a3b383SJung-uk Kim Status = AE_NOT_FOUND;
985a7a3b383SJung-uk Kim }
986a7a3b383SJung-uk Kim
9871a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status))
9881a39cfb0SJung-uk Kim {
9891a39cfb0SJung-uk Kim if (Status == AE_NOT_FOUND)
9901a39cfb0SJung-uk Kim {
9911a39cfb0SJung-uk Kim /*
992313a0c13SJung-uk Kim * Add this symbol as an external declaration, except if the
993313a0c13SJung-uk Kim * parent is a CondRefOf operator. For this operator, we do not
994313a0c13SJung-uk Kim * need an external, nor do we want one, since this can cause
995313a0c13SJung-uk Kim * disassembly problems if the symbol is actually a control
996313a0c13SJung-uk Kim * method.
9971a39cfb0SJung-uk Kim */
998313a0c13SJung-uk Kim if (!(Op->Asl.Parent &&
9990d84335fSJung-uk Kim (Op->Asl.Parent->Asl.AmlOpcode == AML_CONDITIONAL_REF_OF_OP)))
1000313a0c13SJung-uk Kim {
1001313a0c13SJung-uk Kim if (Node)
1002313a0c13SJung-uk Kim {
1003313a0c13SJung-uk Kim AcpiDmAddNodeToExternalList (Node,
1004f8146b88SJung-uk Kim (UINT8) ObjectType, 7, Flags);
1005313a0c13SJung-uk Kim }
1006313a0c13SJung-uk Kim else
1007313a0c13SJung-uk Kim {
1008313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (Op, Path,
1009f8146b88SJung-uk Kim (UINT8) ObjectType, 7, Flags);
1010313a0c13SJung-uk Kim }
1011313a0c13SJung-uk Kim }
10121a39cfb0SJung-uk Kim }
10131a39cfb0SJung-uk Kim }
1014a9f12690SJung-uk Kim
1015a9f12690SJung-uk Kim /*
1016313a0c13SJung-uk Kim * Found the node, but check if it came from an external table.
1017313a0c13SJung-uk Kim * Add it to external list. Note: Node->OwnerId == 0 indicates
1018313a0c13SJung-uk Kim * one of the built-in ACPI Names (_OS_ etc.) which can safely
1019313a0c13SJung-uk Kim * be ignored.
1020a9f12690SJung-uk Kim */
1021313a0c13SJung-uk Kim else if (Node->OwnerId &&
1022313a0c13SJung-uk Kim (WalkState->OwnerId != Node->OwnerId))
1023a9f12690SJung-uk Kim {
1024a9f12690SJung-uk Kim ObjectType2 = ObjectType;
1025a9f12690SJung-uk Kim
1026a9f12690SJung-uk Kim Object = AcpiNsGetAttachedObject (Node);
1027a9f12690SJung-uk Kim if (Object)
1028a9f12690SJung-uk Kim {
1029a9f12690SJung-uk Kim ObjectType2 = Object->Common.Type;
1030a9f12690SJung-uk Kim if (ObjectType2 == ACPI_TYPE_METHOD)
1031a9f12690SJung-uk Kim {
103242fecd12SJung-uk Kim ParamCount = Object->Method.ParamCount;
1033a9f12690SJung-uk Kim }
1034a9f12690SJung-uk Kim }
1035a9f12690SJung-uk Kim
1036313a0c13SJung-uk Kim Pathname = AcpiNsGetExternalPathname (Node);
1037313a0c13SJung-uk Kim if (!Pathname)
1038313a0c13SJung-uk Kim {
1039313a0c13SJung-uk Kim return (AE_NO_MEMORY);
1040313a0c13SJung-uk Kim }
1041313a0c13SJung-uk Kim
1042313a0c13SJung-uk Kim AcpiDmAddNodeToExternalList (Node, (UINT8) ObjectType2,
1043313a0c13SJung-uk Kim ParamCount, ACPI_EXT_RESOLVED_REFERENCE);
1044313a0c13SJung-uk Kim
1045313a0c13SJung-uk Kim ACPI_FREE (Pathname);
1046a9f12690SJung-uk Kim Op->Common.Node = Node;
1047a9f12690SJung-uk Kim }
10481a39cfb0SJung-uk Kim else
10491a39cfb0SJung-uk Kim {
10501a39cfb0SJung-uk Kim Op->Common.Node = Node;
10511a39cfb0SJung-uk Kim }
10521a39cfb0SJung-uk Kim
10531a39cfb0SJung-uk Kim
10541a39cfb0SJung-uk Kim Exit:
10551a39cfb0SJung-uk Kim /* Open new scope if necessary */
10561a39cfb0SJung-uk Kim
10571a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType))
10581a39cfb0SJung-uk Kim {
10591a39cfb0SJung-uk Kim if (Op->Common.Node)
10601a39cfb0SJung-uk Kim {
1061f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType,
1062f8146b88SJung-uk Kim WalkState);
10631a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status))
10641a39cfb0SJung-uk Kim {
10651a39cfb0SJung-uk Kim return (Status);
10661a39cfb0SJung-uk Kim }
10671a39cfb0SJung-uk Kim }
10681a39cfb0SJung-uk Kim }
10691a39cfb0SJung-uk Kim
10701a39cfb0SJung-uk Kim return (AE_OK);
10711a39cfb0SJung-uk Kim }
10721a39cfb0SJung-uk Kim
10731a39cfb0SJung-uk Kim /*******************************************************************************
10741a39cfb0SJung-uk Kim *
1075af051161SJung-uk Kim * FUNCTION: AcpiDmCommonDescendingOp
10761a39cfb0SJung-uk Kim *
10771a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK
10781a39cfb0SJung-uk Kim *
1079af051161SJung-uk Kim * RETURN: ACPI_STATUS
10801a39cfb0SJung-uk Kim *
1081af051161SJung-uk Kim * DESCRIPTION: Perform parse tree preprocessing before main disassembly walk.
10821a39cfb0SJung-uk Kim *
10831a39cfb0SJung-uk Kim ******************************************************************************/
10841a39cfb0SJung-uk Kim
10851a39cfb0SJung-uk Kim static ACPI_STATUS
AcpiDmCommonDescendingOp(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)1086af051161SJung-uk Kim AcpiDmCommonDescendingOp (
1087af051161SJung-uk Kim ACPI_PARSE_OBJECT *Op,
1088af051161SJung-uk Kim UINT32 Level,
1089af051161SJung-uk Kim void *Context)
1090af051161SJung-uk Kim {
1091af051161SJung-uk Kim ACPI_STATUS Status;
1092af051161SJung-uk Kim
10935f9b24faSJung-uk Kim
1094af051161SJung-uk Kim /* Resource descriptor conversion */
1095af051161SJung-uk Kim
1096af051161SJung-uk Kim Status = AcpiDmProcessResourceDescriptors (Op, Level, Context);
1097af051161SJung-uk Kim if (ACPI_FAILURE (Status))
1098af051161SJung-uk Kim {
1099af051161SJung-uk Kim return (Status);
1100af051161SJung-uk Kim }
1101af051161SJung-uk Kim
1102af051161SJung-uk Kim /* Switch/Case conversion */
1103af051161SJung-uk Kim
1104af051161SJung-uk Kim Status = AcpiDmProcessSwitch (Op);
1105a009b7dcSJung-uk Kim return (Status);
1106af051161SJung-uk Kim }
1107af051161SJung-uk Kim
1108af051161SJung-uk Kim
1109af051161SJung-uk Kim /*******************************************************************************
1110af051161SJung-uk Kim *
1111af051161SJung-uk Kim * FUNCTION: AcpiDmProcessResourceDescriptors
1112af051161SJung-uk Kim *
1113af051161SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK
1114af051161SJung-uk Kim *
1115af051161SJung-uk Kim * RETURN: ACPI_STATUS
1116af051161SJung-uk Kim *
1117af051161SJung-uk Kim * DESCRIPTION: Convert fixed-offset references to resource descriptors to
1118af051161SJung-uk Kim * symbolic references. Should only be called after namespace has
1119af051161SJung-uk Kim * been cross referenced.
1120af051161SJung-uk Kim *
1121af051161SJung-uk Kim ******************************************************************************/
1122af051161SJung-uk Kim
1123af051161SJung-uk Kim static ACPI_STATUS
AcpiDmProcessResourceDescriptors(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)1124af051161SJung-uk Kim AcpiDmProcessResourceDescriptors (
11251a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
11261a39cfb0SJung-uk Kim UINT32 Level,
11271a39cfb0SJung-uk Kim void *Context)
11281a39cfb0SJung-uk Kim {
11291a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context;
11301a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo;
11311a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState;
11321a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType;
11331a39cfb0SJung-uk Kim ACPI_STATUS Status;
11341a39cfb0SJung-uk Kim
11355f9b24faSJung-uk Kim
11361a39cfb0SJung-uk Kim WalkState = Info->WalkState;
11371a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
11381a39cfb0SJung-uk Kim
11391a39cfb0SJung-uk Kim /* Open new scope if necessary */
11401a39cfb0SJung-uk Kim
11411a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType;
11421a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType))
11431a39cfb0SJung-uk Kim {
11441a39cfb0SJung-uk Kim if (Op->Common.Node)
11451a39cfb0SJung-uk Kim {
11461a39cfb0SJung-uk Kim
1147f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType,
1148f8146b88SJung-uk Kim WalkState);
11491a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status))
11501a39cfb0SJung-uk Kim {
11511a39cfb0SJung-uk Kim return (Status);
11521a39cfb0SJung-uk Kim }
11531a39cfb0SJung-uk Kim }
11541a39cfb0SJung-uk Kim }
11551a39cfb0SJung-uk Kim
11561a39cfb0SJung-uk Kim /*
11571a39cfb0SJung-uk Kim * Check if this operator contains a reference to a resource descriptor.
11581a39cfb0SJung-uk Kim * If so, convert the reference into a symbolic reference.
11591a39cfb0SJung-uk Kim */
11601a39cfb0SJung-uk Kim AcpiDmCheckResourceReference (Op, WalkState);
11611a39cfb0SJung-uk Kim return (AE_OK);
11621a39cfb0SJung-uk Kim }
11631a39cfb0SJung-uk Kim
11641a39cfb0SJung-uk Kim /*******************************************************************************
11651a39cfb0SJung-uk Kim *
11661a39cfb0SJung-uk Kim * FUNCTION: AcpiDmCommonAscendingOp
11671a39cfb0SJung-uk Kim *
11681a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK
11691a39cfb0SJung-uk Kim *
11701a39cfb0SJung-uk Kim * RETURN: None
11711a39cfb0SJung-uk Kim *
11721a39cfb0SJung-uk Kim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes
11731a39cfb0SJung-uk Kim * scope if necessary.
11741a39cfb0SJung-uk Kim *
11751a39cfb0SJung-uk Kim ******************************************************************************/
11761a39cfb0SJung-uk Kim
11771a39cfb0SJung-uk Kim static ACPI_STATUS
AcpiDmCommonAscendingOp(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)11781a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp (
11791a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op,
11801a39cfb0SJung-uk Kim UINT32 Level,
11811a39cfb0SJung-uk Kim void *Context)
11821a39cfb0SJung-uk Kim {
11831a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context;
11841a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType;
11851a39cfb0SJung-uk Kim
11861a39cfb0SJung-uk Kim
11871a39cfb0SJung-uk Kim /* Close scope if necessary */
11881a39cfb0SJung-uk Kim
11891a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
11901a39cfb0SJung-uk Kim
11911a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType))
11921a39cfb0SJung-uk Kim {
11931a39cfb0SJung-uk Kim (void) AcpiDsScopeStackPop (Info->WalkState);
11941a39cfb0SJung-uk Kim }
11951a39cfb0SJung-uk Kim
11961a39cfb0SJung-uk Kim return (AE_OK);
11971a39cfb0SJung-uk Kim }
11981a39cfb0SJung-uk Kim
11991a39cfb0SJung-uk Kim /*******************************************************************************
12001a39cfb0SJung-uk Kim *
12011a39cfb0SJung-uk Kim * FUNCTION: AcpiDmInspectPossibleArgs
12021a39cfb0SJung-uk Kim *
12031a39cfb0SJung-uk Kim * PARAMETERS: CurrentOpArgCount - Which arg of the current op was the
12041a39cfb0SJung-uk Kim * possible method invocation found
12051a39cfb0SJung-uk Kim * TargetCount - Number of targets (0,1,2) for this op
12061a39cfb0SJung-uk Kim * Op - Parse op
12071a39cfb0SJung-uk Kim *
12081a39cfb0SJung-uk Kim * RETURN: Status
12091a39cfb0SJung-uk Kim *
12101a39cfb0SJung-uk Kim * DESCRIPTION: Examine following args and next ops for possible arguments
12111a39cfb0SJung-uk Kim * for an unrecognized method invocation.
12121a39cfb0SJung-uk Kim *
12131a39cfb0SJung-uk Kim ******************************************************************************/
12141a39cfb0SJung-uk Kim
12151a39cfb0SJung-uk Kim static UINT32
AcpiDmInspectPossibleArgs(UINT32 CurrentOpArgCount,UINT32 TargetCount,ACPI_PARSE_OBJECT * Op)12161a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs (
12171a39cfb0SJung-uk Kim UINT32 CurrentOpArgCount,
12181a39cfb0SJung-uk Kim UINT32 TargetCount,
12191a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op)
12201a39cfb0SJung-uk Kim {
12211a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo;
12221a39cfb0SJung-uk Kim UINT32 i;
1223f8146b88SJung-uk Kim UINT32 ArgumentCount = 0;
1224f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *NextOp;
1225f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *ExecuteOp;
12261a39cfb0SJung-uk Kim
12271a39cfb0SJung-uk Kim
1228f8146b88SJung-uk Kim if (!Op)
1229f8146b88SJung-uk Kim {
1230f8146b88SJung-uk Kim return (0);
1231f8146b88SJung-uk Kim }
12321a39cfb0SJung-uk Kim
12331a39cfb0SJung-uk Kim /* Lookahead for the maximum number of possible arguments */
12341a39cfb0SJung-uk Kim
1235f8146b88SJung-uk Kim NextOp = Op->Common.Next;
1236f8146b88SJung-uk Kim
1237f8146b88SJung-uk Kim for (i = 0; (i < ACPI_METHOD_NUM_ARGS) && NextOp; i++)
12381a39cfb0SJung-uk Kim {
1239f8146b88SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (NextOp->Common.AmlOpcode);
1240f8146b88SJung-uk Kim
1241f8146b88SJung-uk Kim /* Any one of these operators is "very probably" not a method arg */
1242f8146b88SJung-uk Kim
1243f8146b88SJung-uk Kim if ((NextOp->Common.AmlOpcode == AML_STORE_OP) ||
1244f8146b88SJung-uk Kim (NextOp->Common.AmlOpcode == AML_NOTIFY_OP) ||
1245f8146b88SJung-uk Kim (OpInfo->Class == AML_CLASS_CONTROL) ||
1246f8146b88SJung-uk Kim (OpInfo->Class == AML_CLASS_CREATE) ||
1247f8146b88SJung-uk Kim (OpInfo->Class == AML_CLASS_NAMED_OBJECT))
12481a39cfb0SJung-uk Kim {
12491a39cfb0SJung-uk Kim break;
12501a39cfb0SJung-uk Kim }
12511a39cfb0SJung-uk Kim
1252f8146b88SJung-uk Kim if (OpInfo->Class == AML_CLASS_EXECUTE)
1253f8146b88SJung-uk Kim {
1254f8146b88SJung-uk Kim /* Probable that this is method arg if there is no target */
12551a39cfb0SJung-uk Kim
1256f8146b88SJung-uk Kim ExecuteOp = NextOp->Common.Value.Arg;
1257f8146b88SJung-uk Kim while (ExecuteOp)
1258f8146b88SJung-uk Kim {
1259f8146b88SJung-uk Kim if ((ExecuteOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
1260f8146b88SJung-uk Kim (ExecuteOp->Common.Value.Arg == NULL))
1261f8146b88SJung-uk Kim {
1262f8146b88SJung-uk Kim /* No target, could be a method arg */
1263f8146b88SJung-uk Kim
1264f8146b88SJung-uk Kim break;
1265f8146b88SJung-uk Kim }
1266f8146b88SJung-uk Kim
1267f8146b88SJung-uk Kim if (NextOp->Common.AmlOpcode == AML_REF_OF_OP)
12681a39cfb0SJung-uk Kim {
12691a39cfb0SJung-uk Kim break;
12701a39cfb0SJung-uk Kim }
12711a39cfb0SJung-uk Kim
1272f8146b88SJung-uk Kim ExecuteOp = ExecuteOp->Common.Next;
1273f8146b88SJung-uk Kim }
1274f8146b88SJung-uk Kim
1275f8146b88SJung-uk Kim if (!ExecuteOp)
12761a39cfb0SJung-uk Kim {
1277f8146b88SJung-uk Kim /* Has a target, not method arg */
1278f8146b88SJung-uk Kim
1279f8146b88SJung-uk Kim return (ArgumentCount);
1280f8146b88SJung-uk Kim }
12811a39cfb0SJung-uk Kim }
12821a39cfb0SJung-uk Kim
1283f8146b88SJung-uk Kim ArgumentCount++;
1284f8146b88SJung-uk Kim NextOp = NextOp->Common.Next;
12851a39cfb0SJung-uk Kim }
12861a39cfb0SJung-uk Kim
1287f8146b88SJung-uk Kim return (ArgumentCount);
12881a39cfb0SJung-uk Kim }
1289