10d02842fSSascha Wildner /******************************************************************************
20d02842fSSascha Wildner *
31093ca81SSascha Wildner * Module Name: asltree - Parse tree management
40d02842fSSascha Wildner *
50d02842fSSascha Wildner *****************************************************************************/
60d02842fSSascha Wildner
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner *
9b4315fc7SSascha Wildner * 1. Copyright Notice
10b4315fc7SSascha Wildner *
11*383048acSSascha Wildner * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
120d02842fSSascha Wildner * All rights reserved.
130d02842fSSascha Wildner *
14b4315fc7SSascha Wildner * 2. License
15b4315fc7SSascha Wildner *
16b4315fc7SSascha Wildner * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner * property rights.
20b4315fc7SSascha Wildner *
21b4315fc7SSascha Wildner * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner *
28b4315fc7SSascha Wildner * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner *
37b4315fc7SSascha Wildner * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner * conditions are met:
39b4315fc7SSascha Wildner *
40b4315fc7SSascha Wildner * 3. Conditions
41b4315fc7SSascha Wildner *
42b4315fc7SSascha Wildner * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner *
54b4315fc7SSascha Wildner * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner * make.
65b4315fc7SSascha Wildner *
66b4315fc7SSascha Wildner * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner * distribution.
71b4315fc7SSascha Wildner *
72b4315fc7SSascha Wildner * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner * Intel Code.
74b4315fc7SSascha Wildner *
75b4315fc7SSascha Wildner * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner * without prior written authorization from Intel.
79b4315fc7SSascha Wildner *
80b4315fc7SSascha Wildner * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner *
82b4315fc7SSascha Wildner * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner *
90b4315fc7SSascha Wildner * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner * LIMITED REMEDY.
98b4315fc7SSascha Wildner *
99b4315fc7SSascha Wildner * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner * such license, approval or letter.
113b4315fc7SSascha Wildner *
114b4315fc7SSascha Wildner *****************************************************************************
115b4315fc7SSascha Wildner *
116b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner * following license:
118b4315fc7SSascha Wildner *
1190d02842fSSascha Wildner * Redistribution and use in source and binary forms, with or without
1200d02842fSSascha Wildner * modification, are permitted provided that the following conditions
1210d02842fSSascha Wildner * are met:
1220d02842fSSascha Wildner * 1. Redistributions of source code must retain the above copyright
1230d02842fSSascha Wildner * notice, this list of conditions, and the following disclaimer,
1240d02842fSSascha Wildner * without modification.
1250d02842fSSascha Wildner * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1260d02842fSSascha Wildner * substantially similar to the "NO WARRANTY" disclaimer below
1270d02842fSSascha Wildner * ("Disclaimer") and any redistribution must be conditioned upon
1280d02842fSSascha Wildner * including a substantially similar Disclaimer requirement for further
1290d02842fSSascha Wildner * binary redistribution.
1300d02842fSSascha Wildner * 3. Neither the names of the above-listed copyright holders nor the names
1310d02842fSSascha Wildner * of any contributors may be used to endorse or promote products derived
1320d02842fSSascha Wildner * from this software without specific prior written permission.
1330d02842fSSascha Wildner *
134b4315fc7SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner *
146b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the
1470d02842fSSascha Wildner * GNU General Public License ("GPL") version 2 as published by the Free
1480d02842fSSascha Wildner * Software Foundation.
1490d02842fSSascha Wildner *
150b4315fc7SSascha Wildner *****************************************************************************/
1510d02842fSSascha Wildner
1520d02842fSSascha Wildner #include "aslcompiler.h"
1530d02842fSSascha Wildner #include "aslcompiler.y.h"
1540d02842fSSascha Wildner #include "acapps.h"
1550d02842fSSascha Wildner
1560d02842fSSascha Wildner #define _COMPONENT ACPI_COMPILER
1570d02842fSSascha Wildner ACPI_MODULE_NAME ("asltree")
1580d02842fSSascha Wildner
1590d02842fSSascha Wildner
1600d02842fSSascha Wildner /*******************************************************************************
1610d02842fSSascha Wildner *
1621093ca81SSascha Wildner * FUNCTION: TrSetOpIntegerValue
1630d27ae55SSascha Wildner *
1641093ca81SSascha Wildner * PARAMETERS: ParseOpcode - New opcode to be assigned to the op
1651093ca81SSascha Wildner * Op - An existing parse op
1660d27ae55SSascha Wildner *
1671093ca81SSascha Wildner * RETURN: The updated op
1680d27ae55SSascha Wildner *
1691093ca81SSascha Wildner * DESCRIPTION: Used to set the integer value of a op,
1701093ca81SSascha Wildner * usually to a specific size (8, 16, 32, or 64 bits)
1710d02842fSSascha Wildner *
1720d02842fSSascha Wildner ******************************************************************************/
1730d02842fSSascha Wildner
1740d02842fSSascha Wildner ACPI_PARSE_OBJECT *
TrSetOpIntegerValue(UINT32 ParseOpcode,ACPI_PARSE_OBJECT * Op)1751093ca81SSascha Wildner TrSetOpIntegerValue (
1760d02842fSSascha Wildner UINT32 ParseOpcode,
1770d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op)
1780d02842fSSascha Wildner {
1790d02842fSSascha Wildner
1800d02842fSSascha Wildner if (!Op)
1810d02842fSSascha Wildner {
1820d02842fSSascha Wildner return (NULL);
1830d02842fSSascha Wildner }
1840d02842fSSascha Wildner
1850d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT,
1861093ca81SSascha Wildner "\nUpdateOp: Old - %s, New - %s\n",
1870d02842fSSascha Wildner UtGetOpName (Op->Asl.ParseOpcode),
1880d02842fSSascha Wildner UtGetOpName (ParseOpcode));
1890d02842fSSascha Wildner
1900d02842fSSascha Wildner /* Assign new opcode and name */
1910d02842fSSascha Wildner
1920d02842fSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_ONES)
1930d02842fSSascha Wildner {
1940d02842fSSascha Wildner switch (ParseOpcode)
1950d02842fSSascha Wildner {
1960d02842fSSascha Wildner case PARSEOP_BYTECONST:
1970d02842fSSascha Wildner
1980d02842fSSascha Wildner Op->Asl.Value.Integer = ACPI_UINT8_MAX;
1990d02842fSSascha Wildner break;
2000d02842fSSascha Wildner
2010d02842fSSascha Wildner case PARSEOP_WORDCONST:
2020d02842fSSascha Wildner
2030d02842fSSascha Wildner Op->Asl.Value.Integer = ACPI_UINT16_MAX;
2040d02842fSSascha Wildner break;
2050d02842fSSascha Wildner
2060d02842fSSascha Wildner case PARSEOP_DWORDCONST:
2070d02842fSSascha Wildner
2080d02842fSSascha Wildner Op->Asl.Value.Integer = ACPI_UINT32_MAX;
2090d02842fSSascha Wildner break;
2100d02842fSSascha Wildner
2110d02842fSSascha Wildner /* Don't need to do the QWORD case */
2120d02842fSSascha Wildner
2130d02842fSSascha Wildner default:
2140d02842fSSascha Wildner
2150d02842fSSascha Wildner /* Don't care about others */
2160d02842fSSascha Wildner break;
2170d02842fSSascha Wildner }
2180d02842fSSascha Wildner }
2190d02842fSSascha Wildner
2200d02842fSSascha Wildner Op->Asl.ParseOpcode = (UINT16) ParseOpcode;
2210d02842fSSascha Wildner UtSetParseOpName (Op);
2220d02842fSSascha Wildner
2230d02842fSSascha Wildner /*
2240d02842fSSascha Wildner * For the BYTE, WORD, and DWORD constants, make sure that the integer
2250d02842fSSascha Wildner * that was passed in will actually fit into the data type
2260d02842fSSascha Wildner */
2270d02842fSSascha Wildner switch (ParseOpcode)
2280d02842fSSascha Wildner {
2290d02842fSSascha Wildner case PARSEOP_BYTECONST:
2300d02842fSSascha Wildner
2310d02842fSSascha Wildner UtCheckIntegerRange (Op, 0x00, ACPI_UINT8_MAX);
2320d02842fSSascha Wildner Op->Asl.Value.Integer &= ACPI_UINT8_MAX;
2330d02842fSSascha Wildner break;
2340d02842fSSascha Wildner
2350d02842fSSascha Wildner case PARSEOP_WORDCONST:
2360d02842fSSascha Wildner
2370d02842fSSascha Wildner UtCheckIntegerRange (Op, 0x00, ACPI_UINT16_MAX);
2380d02842fSSascha Wildner Op->Asl.Value.Integer &= ACPI_UINT16_MAX;
2390d02842fSSascha Wildner break;
2400d02842fSSascha Wildner
2410d02842fSSascha Wildner case PARSEOP_DWORDCONST:
2420d02842fSSascha Wildner
2430d02842fSSascha Wildner UtCheckIntegerRange (Op, 0x00, ACPI_UINT32_MAX);
2440d02842fSSascha Wildner Op->Asl.Value.Integer &= ACPI_UINT32_MAX;
2450d02842fSSascha Wildner break;
2460d02842fSSascha Wildner
2470d02842fSSascha Wildner default:
2480d02842fSSascha Wildner
2490d02842fSSascha Wildner /* Don't care about others, don't need to check QWORD */
2500d02842fSSascha Wildner
2510d02842fSSascha Wildner break;
2520d02842fSSascha Wildner }
2530d02842fSSascha Wildner
2541093ca81SSascha Wildner /* Converter: if this is a method invocation, turn off capture comments */
2551093ca81SSascha Wildner
2567bcb6cafSSascha Wildner if (AcpiGbl_CaptureComments &&
257d638c6eeSSascha Wildner (ParseOpcode == PARSEOP_METHODCALL))
258d638c6eeSSascha Wildner {
259806343b9SSascha Wildner AslGbl_CommentState.CaptureComments = FALSE;
260d638c6eeSSascha Wildner }
261d638c6eeSSascha Wildner
2620d02842fSSascha Wildner return (Op);
2630d02842fSSascha Wildner }
2640d02842fSSascha Wildner
2650d02842fSSascha Wildner
2660d02842fSSascha Wildner /*******************************************************************************
2670d02842fSSascha Wildner *
2681093ca81SSascha Wildner * FUNCTION: TrSetOpFlags
2690d02842fSSascha Wildner *
2701093ca81SSascha Wildner * PARAMETERS: Op - An existing parse op
2710d02842fSSascha Wildner * Flags - New flags word
2720d02842fSSascha Wildner *
2730d02842fSSascha Wildner * RETURN: The updated parser op
2740d02842fSSascha Wildner *
2751093ca81SSascha Wildner * DESCRIPTION: Set bits in the op flags word. Will not clear bits, only set
2760d02842fSSascha Wildner *
2770d02842fSSascha Wildner ******************************************************************************/
2780d02842fSSascha Wildner
2790d02842fSSascha Wildner ACPI_PARSE_OBJECT *
TrSetOpFlags(ACPI_PARSE_OBJECT * Op,UINT32 Flags)2801093ca81SSascha Wildner TrSetOpFlags (
2810d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op,
2820d02842fSSascha Wildner UINT32 Flags)
2830d02842fSSascha Wildner {
2840d02842fSSascha Wildner
2850d02842fSSascha Wildner if (!Op)
2860d02842fSSascha Wildner {
2870d02842fSSascha Wildner return (NULL);
2880d02842fSSascha Wildner }
2890d02842fSSascha Wildner
2905943f66cSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT,
2911093ca81SSascha Wildner "\nSetOpFlags: %s Op %p, %8.8X", Op->Asl.ParseOpName, Op, Flags);
2925943f66cSSascha Wildner
2931093ca81SSascha Wildner TrPrintOpFlags (Flags, ASL_PARSE_OUTPUT);
2945943f66cSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
2955943f66cSSascha Wildner
2960d02842fSSascha Wildner Op->Asl.CompileFlags |= Flags;
2970d02842fSSascha Wildner return (Op);
2980d02842fSSascha Wildner }
2990d02842fSSascha Wildner
3000d02842fSSascha Wildner
3010d02842fSSascha Wildner /*******************************************************************************
3020d02842fSSascha Wildner *
3031093ca81SSascha Wildner * FUNCTION: TrSetOpAmlLength
3040d02842fSSascha Wildner *
3051093ca81SSascha Wildner * PARAMETERS: Op - An existing parse op
3060d02842fSSascha Wildner * Length - AML Length
3070d02842fSSascha Wildner *
3080d02842fSSascha Wildner * RETURN: The updated parser op
3090d02842fSSascha Wildner *
3101093ca81SSascha Wildner * DESCRIPTION: Set the AML Length in a op. Used by the parser to indicate
3111093ca81SSascha Wildner * the presence of a op that must be reduced to a fixed length
3120d02842fSSascha Wildner * constant.
3130d02842fSSascha Wildner *
3140d02842fSSascha Wildner ******************************************************************************/
3150d02842fSSascha Wildner
3160d02842fSSascha Wildner ACPI_PARSE_OBJECT *
TrSetOpAmlLength(ACPI_PARSE_OBJECT * Op,UINT32 Length)3171093ca81SSascha Wildner TrSetOpAmlLength (
3180d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op,
3190d02842fSSascha Wildner UINT32 Length)
3200d02842fSSascha Wildner {
3210d02842fSSascha Wildner
3220d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT,
3231093ca81SSascha Wildner "\nSetOpAmlLength: Op %p, %8.8X\n", Op, Length);
3240d02842fSSascha Wildner
3250d02842fSSascha Wildner if (!Op)
3260d02842fSSascha Wildner {
3270d02842fSSascha Wildner return (NULL);
3280d02842fSSascha Wildner }
3290d02842fSSascha Wildner
3300d02842fSSascha Wildner Op->Asl.AmlLength = Length;
3310d02842fSSascha Wildner return (Op);
3320d02842fSSascha Wildner }
3330d02842fSSascha Wildner
3340d02842fSSascha Wildner
3350d02842fSSascha Wildner /*******************************************************************************
3360d02842fSSascha Wildner *
3371093ca81SSascha Wildner * FUNCTION: TrSetOpParent
3380d02842fSSascha Wildner *
3391093ca81SSascha Wildner * PARAMETERS: Op - To be set to new parent
3401093ca81SSascha Wildner * ParentOp - The parent
3410d02842fSSascha Wildner *
3421093ca81SSascha Wildner * RETURN: None, sets Op parent directly
3430d02842fSSascha Wildner *
3441093ca81SSascha Wildner * DESCRIPTION: Change the parent of a parse op.
3450d02842fSSascha Wildner *
3460d02842fSSascha Wildner ******************************************************************************/
3470d02842fSSascha Wildner
3480d02842fSSascha Wildner void
TrSetOpParent(ACPI_PARSE_OBJECT * Op,ACPI_PARSE_OBJECT * ParentOp)3491093ca81SSascha Wildner TrSetOpParent (
3501093ca81SSascha Wildner ACPI_PARSE_OBJECT *Op,
3511093ca81SSascha Wildner ACPI_PARSE_OBJECT *ParentOp)
3521093ca81SSascha Wildner {
3531093ca81SSascha Wildner
3541093ca81SSascha Wildner Op->Asl.Parent = ParentOp;
3551093ca81SSascha Wildner }
3561093ca81SSascha Wildner
3571093ca81SSascha Wildner
3581093ca81SSascha Wildner /*******************************************************************************
3591093ca81SSascha Wildner *
3601093ca81SSascha Wildner * FUNCTION: TrSetOpCurrentFilename
3611093ca81SSascha Wildner *
3621093ca81SSascha Wildner * PARAMETERS: Op - An existing parse op
3631093ca81SSascha Wildner *
3641093ca81SSascha Wildner * RETURN: None
3651093ca81SSascha Wildner *
3661093ca81SSascha Wildner * DESCRIPTION: Save the include file filename. Used for debug output only.
3671093ca81SSascha Wildner *
3681093ca81SSascha Wildner ******************************************************************************/
3691093ca81SSascha Wildner
3701093ca81SSascha Wildner void
TrSetOpCurrentFilename(ACPI_PARSE_OBJECT * Op)3711093ca81SSascha Wildner TrSetOpCurrentFilename (
3721093ca81SSascha Wildner ACPI_PARSE_OBJECT *Op)
3731093ca81SSascha Wildner {
3741093ca81SSascha Wildner
375806343b9SSascha Wildner Op->Asl.Filename = AslGbl_PreviousIncludeFilename;
3761093ca81SSascha Wildner }
3771093ca81SSascha Wildner
3781093ca81SSascha Wildner
3791093ca81SSascha Wildner /*******************************************************************************
3801093ca81SSascha Wildner *
381cf6b3eb1SSascha Wildner * FUNCTION: TrSetOpIntegerWidth
382cf6b3eb1SSascha Wildner *
383cf6b3eb1SSascha Wildner * PARAMETERS: Op - An existing parse op
384cf6b3eb1SSascha Wildner *
385cf6b3eb1SSascha Wildner * RETURN: None
386cf6b3eb1SSascha Wildner *
387cf6b3eb1SSascha Wildner * DESCRIPTION:
388cf6b3eb1SSascha Wildner *
389cf6b3eb1SSascha Wildner ******************************************************************************/
390cf6b3eb1SSascha Wildner
391cf6b3eb1SSascha Wildner void
TrSetOpIntegerWidth(ACPI_PARSE_OBJECT * TableSignatureOp,ACPI_PARSE_OBJECT * RevisionOp)392cf6b3eb1SSascha Wildner TrSetOpIntegerWidth (
393cf6b3eb1SSascha Wildner ACPI_PARSE_OBJECT *TableSignatureOp,
394cf6b3eb1SSascha Wildner ACPI_PARSE_OBJECT *RevisionOp)
395cf6b3eb1SSascha Wildner {
396cf6b3eb1SSascha Wildner
397cf6b3eb1SSascha Wildner /* TBD: Check table sig? (DSDT vs. SSDT) */
398cf6b3eb1SSascha Wildner
399cf6b3eb1SSascha Wildner /* Handle command-line version override */
400cf6b3eb1SSascha Wildner
401806343b9SSascha Wildner if (AslGbl_RevisionOverride)
402cf6b3eb1SSascha Wildner {
403806343b9SSascha Wildner AcpiUtSetIntegerWidth (AslGbl_RevisionOverride);
404cf6b3eb1SSascha Wildner }
405cf6b3eb1SSascha Wildner else
406cf6b3eb1SSascha Wildner {
407cf6b3eb1SSascha Wildner AcpiUtSetIntegerWidth ((UINT8) RevisionOp->Asl.Value.Integer);
408cf6b3eb1SSascha Wildner }
409cf6b3eb1SSascha Wildner }
410cf6b3eb1SSascha Wildner
411cf6b3eb1SSascha Wildner
412cf6b3eb1SSascha Wildner /*******************************************************************************
413cf6b3eb1SSascha Wildner *
4141093ca81SSascha Wildner * FUNCTION: TrSetOpEndLineNumber
4151093ca81SSascha Wildner *
4161093ca81SSascha Wildner * PARAMETERS: Op - An existing parse op
4171093ca81SSascha Wildner *
4181093ca81SSascha Wildner * RETURN: None.
4191093ca81SSascha Wildner *
4201093ca81SSascha Wildner * DESCRIPTION: Set the ending line numbers (file line and logical line) of a
4211093ca81SSascha Wildner * parse op to the current line numbers.
4221093ca81SSascha Wildner *
4231093ca81SSascha Wildner ******************************************************************************/
4241093ca81SSascha Wildner
4251093ca81SSascha Wildner void
TrSetOpEndLineNumber(ACPI_PARSE_OBJECT * Op)4261093ca81SSascha Wildner TrSetOpEndLineNumber (
4270d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op)
4280d02842fSSascha Wildner {
4290d02842fSSascha Wildner
4300d02842fSSascha Wildner /* If the end line # is already set, just return */
4310d02842fSSascha Wildner
4320d02842fSSascha Wildner if (Op->Asl.EndLine)
4330d02842fSSascha Wildner {
4340d02842fSSascha Wildner return;
4350d02842fSSascha Wildner }
4360d02842fSSascha Wildner
437806343b9SSascha Wildner Op->Asl.EndLine = AslGbl_CurrentLineNumber;
438806343b9SSascha Wildner Op->Asl.EndLogicalLine = AslGbl_LogicalLineNumber;
4390d02842fSSascha Wildner }
4400d02842fSSascha Wildner
4410d02842fSSascha Wildner
4420d02842fSSascha Wildner /*******************************************************************************
4430d02842fSSascha Wildner *
4441093ca81SSascha Wildner * FUNCTION: TrLinkOpChildren
4452e2672b8SSascha Wildner *
4461093ca81SSascha Wildner * PARAMETERS: Op - An existing parse op
4470d02842fSSascha Wildner * NumChildren - Number of children to follow
4481093ca81SSascha Wildner * ... - A list of child ops to link to the new
4491093ca81SSascha Wildner * op. NumChildren long.
4500d02842fSSascha Wildner *
4511093ca81SSascha Wildner * RETURN: The updated (linked) op
4520d02842fSSascha Wildner *
4531093ca81SSascha Wildner * DESCRIPTION: Link a group of ops to an existing parse op
4540d02842fSSascha Wildner *
4550d02842fSSascha Wildner ******************************************************************************/
4560d02842fSSascha Wildner
4570d02842fSSascha Wildner ACPI_PARSE_OBJECT *
TrLinkOpChildren(ACPI_PARSE_OBJECT * Op,UINT32 NumChildren,...)4581093ca81SSascha Wildner TrLinkOpChildren (
4590d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op,
4600d02842fSSascha Wildner UINT32 NumChildren,
4610d02842fSSascha Wildner ...)
4620d02842fSSascha Wildner {
4630d02842fSSascha Wildner ACPI_PARSE_OBJECT *Child;
4640d02842fSSascha Wildner ACPI_PARSE_OBJECT *PrevChild;
465a4b9c0c9SSascha Wildner ACPI_PARSE_OBJECT *LastSibling;
4660d02842fSSascha Wildner va_list ap;
4670d02842fSSascha Wildner UINT32 i;
4680d02842fSSascha Wildner BOOLEAN FirstChild;
4690d02842fSSascha Wildner
4700d02842fSSascha Wildner
4710d02842fSSascha Wildner va_start (ap, NumChildren);
4720d02842fSSascha Wildner
4731093ca81SSascha Wildner TrSetOpEndLineNumber (Op);
4740d02842fSSascha Wildner
4750d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT,
4760d02842fSSascha Wildner "\nLinkChildren Line [%u to %u] NewParent %p Child %u Op %s ",
4770d02842fSSascha Wildner Op->Asl.LineNumber, Op->Asl.EndLine,
4780d02842fSSascha Wildner Op, NumChildren, UtGetOpName(Op->Asl.ParseOpcode));
4790d02842fSSascha Wildner
4800d02842fSSascha Wildner switch (Op->Asl.ParseOpcode)
4810d02842fSSascha Wildner {
482820c5b08SSascha Wildner case PARSEOP_ASL_CODE:
4830d02842fSSascha Wildner
484a4b9c0c9SSascha Wildner if (!AslGbl_ParseTreeRoot)
485a4b9c0c9SSascha Wildner {
486a4b9c0c9SSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "Creating first Definition Block\n");
487806343b9SSascha Wildner AslGbl_ParseTreeRoot = Op;
488820c5b08SSascha Wildner Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
489a4b9c0c9SSascha Wildner }
490a4b9c0c9SSascha Wildner else
491a4b9c0c9SSascha Wildner {
492a4b9c0c9SSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "Creating subsequent Definition Block\n");
493a4b9c0c9SSascha Wildner Op = AslGbl_ParseTreeRoot;
494a4b9c0c9SSascha Wildner }
495a4b9c0c9SSascha Wildner
496820c5b08SSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "ASLCODE (Tree Completed)->");
497820c5b08SSascha Wildner break;
498820c5b08SSascha Wildner
499820c5b08SSascha Wildner case PARSEOP_DEFINITION_BLOCK:
500820c5b08SSascha Wildner
5010d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "DEFINITION_BLOCK (Tree Completed)->");
5020d02842fSSascha Wildner break;
5030d02842fSSascha Wildner
5040d02842fSSascha Wildner case PARSEOP_OPERATIONREGION:
5050d02842fSSascha Wildner
5060d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "OPREGION->");
5070d02842fSSascha Wildner break;
5080d02842fSSascha Wildner
5090d02842fSSascha Wildner case PARSEOP_OR:
5100d02842fSSascha Wildner
5110d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "OR->");
5120d02842fSSascha Wildner break;
5130d02842fSSascha Wildner
5140d02842fSSascha Wildner default:
5150d02842fSSascha Wildner
5160d02842fSSascha Wildner /* Nothing to do for other opcodes */
5170d02842fSSascha Wildner
5180d02842fSSascha Wildner break;
5190d02842fSSascha Wildner }
5200d02842fSSascha Wildner
521d638c6eeSSascha Wildner /* The following is for capturing comments */
522d638c6eeSSascha Wildner
5237bcb6cafSSascha Wildner if (AcpiGbl_CaptureComments)
524d638c6eeSSascha Wildner {
525d638c6eeSSascha Wildner /*
526d638c6eeSSascha Wildner * If there are "regular comments" detected at this point,
527d638c6eeSSascha Wildner * then is an endBlk comment. Categorize it as so and distribute
5281093ca81SSascha Wildner * all regular comments to this parse op.
529d638c6eeSSascha Wildner */
530806343b9SSascha Wildner if (AslGbl_CommentListHead)
531d638c6eeSSascha Wildner {
532806343b9SSascha Wildner Op->Asl.EndBlkComment = AslGbl_CommentListHead;
533d638c6eeSSascha Wildner CvDbgPrint ("EndBlk Comment for %s: %s",
534806343b9SSascha Wildner Op->Asl.ParseOpName, AslGbl_CommentListHead->Comment);
535806343b9SSascha Wildner AslGbl_CommentListHead = NULL;
536806343b9SSascha Wildner AslGbl_CommentListTail = NULL;
537d638c6eeSSascha Wildner }
538d638c6eeSSascha Wildner }
539d638c6eeSSascha Wildner
5401093ca81SSascha Wildner /* Link the new op to it's children */
5410d02842fSSascha Wildner
5420d02842fSSascha Wildner PrevChild = NULL;
5430d02842fSSascha Wildner FirstChild = TRUE;
5440d02842fSSascha Wildner for (i = 0; i < NumChildren; i++)
5450d02842fSSascha Wildner {
5460d02842fSSascha Wildner Child = va_arg (ap, ACPI_PARSE_OBJECT *);
5470d02842fSSascha Wildner
5480d02842fSSascha Wildner if ((Child == PrevChild) && (Child != NULL))
5490d02842fSSascha Wildner {
5500d02842fSSascha Wildner AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Child,
5511093ca81SSascha Wildner "Child op list invalid");
5520d02842fSSascha Wildner va_end(ap);
5530d02842fSSascha Wildner return (Op);
5540d02842fSSascha Wildner }
5550d02842fSSascha Wildner
5560d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "%p, ", Child);
5570d02842fSSascha Wildner
5580d02842fSSascha Wildner /*
5590d02842fSSascha Wildner * If child is NULL, this means that an optional argument
5600d02842fSSascha Wildner * was omitted. We must create a placeholder with a special
5610d02842fSSascha Wildner * opcode (DEFAULT_ARG) so that the code generator will know
5620d02842fSSascha Wildner * that it must emit the correct default for this argument
5630d02842fSSascha Wildner */
5640d02842fSSascha Wildner if (!Child)
5650d02842fSSascha Wildner {
5661093ca81SSascha Wildner Child = TrAllocateOp (PARSEOP_DEFAULT_ARG);
5670d02842fSSascha Wildner }
5680d02842fSSascha Wildner
5690d02842fSSascha Wildner /* Link first child to parent */
5700d02842fSSascha Wildner
5710d02842fSSascha Wildner if (FirstChild)
5720d02842fSSascha Wildner {
5730d02842fSSascha Wildner FirstChild = FALSE;
574a4b9c0c9SSascha Wildner
575a4b9c0c9SSascha Wildner /*
576a4b9c0c9SSascha Wildner * In the case that multiple definition blocks are being compiled,
577a4b9c0c9SSascha Wildner * append the definition block to the end of the child list as the
578a4b9c0c9SSascha Wildner * last sibling. This is done to facilitate namespace cross-
579a4b9c0c9SSascha Wildner * reference between multiple definition blocks.
580a4b9c0c9SSascha Wildner */
581a4b9c0c9SSascha Wildner if (Op->Asl.Child &&
582a4b9c0c9SSascha Wildner (Op->Asl.Child->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK))
583a4b9c0c9SSascha Wildner {
584a4b9c0c9SSascha Wildner LastSibling = Op->Asl.Child;
585a4b9c0c9SSascha Wildner while (LastSibling->Asl.Next)
586a4b9c0c9SSascha Wildner {
587a4b9c0c9SSascha Wildner LastSibling = LastSibling->Asl.Next;
588a4b9c0c9SSascha Wildner }
589a4b9c0c9SSascha Wildner LastSibling->Asl.Next = Child;
590a4b9c0c9SSascha Wildner }
591a4b9c0c9SSascha Wildner else
592a4b9c0c9SSascha Wildner {
5930d02842fSSascha Wildner Op->Asl.Child = Child;
5940d02842fSSascha Wildner }
595a4b9c0c9SSascha Wildner }
5960d02842fSSascha Wildner
5970d02842fSSascha Wildner /* Point all children to parent */
5980d02842fSSascha Wildner
5990d02842fSSascha Wildner Child->Asl.Parent = Op;
6000d02842fSSascha Wildner
6010d02842fSSascha Wildner /* Link children in a peer list */
6020d02842fSSascha Wildner
6030d02842fSSascha Wildner if (PrevChild)
6040d02842fSSascha Wildner {
6050d02842fSSascha Wildner PrevChild->Asl.Next = Child;
6061093ca81SSascha Wildner }
6070d02842fSSascha Wildner
6080d02842fSSascha Wildner /*
6091093ca81SSascha Wildner * This child might be a list, point all ops in the list
6100d02842fSSascha Wildner * to the same parent
6110d02842fSSascha Wildner */
6120d02842fSSascha Wildner while (Child->Asl.Next)
6130d02842fSSascha Wildner {
6140d02842fSSascha Wildner Child = Child->Asl.Next;
6150d02842fSSascha Wildner Child->Asl.Parent = Op;
6160d02842fSSascha Wildner }
617820c5b08SSascha Wildner
6180d02842fSSascha Wildner PrevChild = Child;
6190d02842fSSascha Wildner }
6200d02842fSSascha Wildner
6210d02842fSSascha Wildner va_end(ap);
6220d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
623d638c6eeSSascha Wildner
6247bcb6cafSSascha Wildner if (AcpiGbl_CaptureComments)
625d638c6eeSSascha Wildner {
626806343b9SSascha Wildner AslGbl_CommentState.LatestParseOp = Op;
6271093ca81SSascha Wildner CvDbgPrint ("TrLinkOpChildren=====Set latest parse op to this op.\n");
628d638c6eeSSascha Wildner }
6291093ca81SSascha Wildner
6300d02842fSSascha Wildner return (Op);
6310d02842fSSascha Wildner }
6320d02842fSSascha Wildner
6330d02842fSSascha Wildner
6340d02842fSSascha Wildner /*******************************************************************************
6350d02842fSSascha Wildner *
6361093ca81SSascha Wildner * FUNCTION: TrLinkPeerOp
6370d02842fSSascha Wildner *
6380d02842fSSascha Wildner * PARAMETERS: Op1 - First peer
6390d02842fSSascha Wildner * Op2 - Second peer
6400d02842fSSascha Wildner *
6411093ca81SSascha Wildner * RETURN: Op1 or the non-null op.
6420d02842fSSascha Wildner *
6431093ca81SSascha Wildner * DESCRIPTION: Link two ops as peers. Handles cases where one peer is null.
6440d02842fSSascha Wildner *
6450d02842fSSascha Wildner ******************************************************************************/
6460d02842fSSascha Wildner
6470d02842fSSascha Wildner ACPI_PARSE_OBJECT *
TrLinkPeerOp(ACPI_PARSE_OBJECT * Op1,ACPI_PARSE_OBJECT * Op2)6481093ca81SSascha Wildner TrLinkPeerOp (
6490d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op1,
6500d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op2)
6510d02842fSSascha Wildner {
6520d02842fSSascha Wildner ACPI_PARSE_OBJECT *Next;
6530d02842fSSascha Wildner
6540d02842fSSascha Wildner
6550d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT,
6561093ca81SSascha Wildner "\nLinkPeerOp: 1=%p (%s), 2=%p (%s)\n",
6570d02842fSSascha Wildner Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode) : NULL,
6580d02842fSSascha Wildner Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode) : NULL);
6590d02842fSSascha Wildner
6600d02842fSSascha Wildner
6610d02842fSSascha Wildner if ((!Op1) && (!Op2))
6620d02842fSSascha Wildner {
6631093ca81SSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "\nTwo Null ops!\n");
6640d02842fSSascha Wildner return (Op1);
6650d02842fSSascha Wildner }
6660d02842fSSascha Wildner
6671093ca81SSascha Wildner /* If one of the ops is null, just return the non-null op */
6680d02842fSSascha Wildner
6690d02842fSSascha Wildner if (!Op2)
6700d02842fSSascha Wildner {
6710d02842fSSascha Wildner return (Op1);
6720d02842fSSascha Wildner }
6730d02842fSSascha Wildner
6740d02842fSSascha Wildner if (!Op1)
6750d02842fSSascha Wildner {
6760d02842fSSascha Wildner return (Op2);
6770d02842fSSascha Wildner }
6780d02842fSSascha Wildner
6790d02842fSSascha Wildner if (Op1 == Op2)
6800d02842fSSascha Wildner {
6810d02842fSSascha Wildner DbgPrint (ASL_DEBUG_OUTPUT,
6821093ca81SSascha Wildner "\n************* Internal error, linking op to itself %p\n",
6830d02842fSSascha Wildner Op1);
6840d02842fSSascha Wildner AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op1,
6851093ca81SSascha Wildner "Linking op to itself");
6860d02842fSSascha Wildner return (Op1);
6870d02842fSSascha Wildner }
6880d02842fSSascha Wildner
6890d02842fSSascha Wildner Op1->Asl.Parent = Op2->Asl.Parent;
6900d02842fSSascha Wildner
6910d02842fSSascha Wildner /*
6920d02842fSSascha Wildner * Op 1 may already have a peer list (such as an IF/ELSE pair),
6930d02842fSSascha Wildner * so we must walk to the end of the list and attach the new
6940d02842fSSascha Wildner * peer at the end
6950d02842fSSascha Wildner */
6960d02842fSSascha Wildner Next = Op1;
6970d02842fSSascha Wildner while (Next->Asl.Next)
6980d02842fSSascha Wildner {
6990d02842fSSascha Wildner Next = Next->Asl.Next;
7000d02842fSSascha Wildner }
7010d02842fSSascha Wildner
7020d02842fSSascha Wildner Next->Asl.Next = Op2;
7030d02842fSSascha Wildner return (Op1);
7040d02842fSSascha Wildner }
7050d02842fSSascha Wildner
7060d02842fSSascha Wildner
7070d02842fSSascha Wildner /*******************************************************************************
7080d02842fSSascha Wildner *
7091093ca81SSascha Wildner * FUNCTION: TrLinkPeerOps
7100d02842fSSascha Wildner *
7111093ca81SSascha Wildner * PARAMETERS: NumPeers - The number of ops in the list to follow
7121093ca81SSascha Wildner * ... - A list of ops to link together as peers
7130d02842fSSascha Wildner *
7141093ca81SSascha Wildner * RETURN: The first op in the list (head of the peer list)
7150d02842fSSascha Wildner *
7161093ca81SSascha Wildner * DESCRIPTION: Link together an arbitrary number of peer ops.
7170d02842fSSascha Wildner *
7180d02842fSSascha Wildner ******************************************************************************/
7190d02842fSSascha Wildner
7200d02842fSSascha Wildner ACPI_PARSE_OBJECT *
TrLinkPeerOps(UINT32 NumPeers,...)7211093ca81SSascha Wildner TrLinkPeerOps (
7220d02842fSSascha Wildner UINT32 NumPeers,
7230d02842fSSascha Wildner ...)
7240d02842fSSascha Wildner {
7250d02842fSSascha Wildner ACPI_PARSE_OBJECT *This;
7260d02842fSSascha Wildner ACPI_PARSE_OBJECT *Next;
7270d02842fSSascha Wildner va_list ap;
7280d02842fSSascha Wildner UINT32 i;
7290d02842fSSascha Wildner ACPI_PARSE_OBJECT *Start;
7300d02842fSSascha Wildner
7310d02842fSSascha Wildner
7320d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT,
7331093ca81SSascha Wildner "\nLinkPeerOps: (%u) ", NumPeers);
7340d02842fSSascha Wildner
7350d02842fSSascha Wildner va_start (ap, NumPeers);
7360d02842fSSascha Wildner This = va_arg (ap, ACPI_PARSE_OBJECT *);
7370d02842fSSascha Wildner Start = This;
7380d02842fSSascha Wildner
7390d02842fSSascha Wildner /*
7400d02842fSSascha Wildner * Link all peers
7410d02842fSSascha Wildner */
7420d02842fSSascha Wildner for (i = 0; i < (NumPeers -1); i++)
7430d02842fSSascha Wildner {
7440d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT, "%u=%p ", (i+1), This);
7450d02842fSSascha Wildner
7460d02842fSSascha Wildner while (This->Asl.Next)
7470d02842fSSascha Wildner {
7480d02842fSSascha Wildner This = This->Asl.Next;
7490d02842fSSascha Wildner }
7500d02842fSSascha Wildner
7511093ca81SSascha Wildner /* Get another peer op */
7520d02842fSSascha Wildner
7530d02842fSSascha Wildner Next = va_arg (ap, ACPI_PARSE_OBJECT *);
7540d02842fSSascha Wildner if (!Next)
7550d02842fSSascha Wildner {
7561093ca81SSascha Wildner Next = TrAllocateOp (PARSEOP_DEFAULT_ARG);
7570d02842fSSascha Wildner }
7580d02842fSSascha Wildner
7591093ca81SSascha Wildner /* link new op to the current op */
7600d02842fSSascha Wildner
7610d02842fSSascha Wildner This->Asl.Next = Next;
7620d02842fSSascha Wildner This = Next;
7630d02842fSSascha Wildner }
7640d02842fSSascha Wildner
7651093ca81SSascha Wildner va_end (ap);
7665943f66cSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT,"\n");
7670d02842fSSascha Wildner return (Start);
7680d02842fSSascha Wildner }
7690d02842fSSascha Wildner
7700d02842fSSascha Wildner
7710d02842fSSascha Wildner /*******************************************************************************
7720d02842fSSascha Wildner *
7731093ca81SSascha Wildner * FUNCTION: TrLinkChildOp
7740d02842fSSascha Wildner *
7751093ca81SSascha Wildner * PARAMETERS: Op1 - Parent op
7760d02842fSSascha Wildner * Op2 - Op to become a child
7770d02842fSSascha Wildner *
7781093ca81SSascha Wildner * RETURN: The parent op
7790d02842fSSascha Wildner *
7801093ca81SSascha Wildner * DESCRIPTION: Link two ops together as a parent and child
7810d02842fSSascha Wildner *
7820d02842fSSascha Wildner ******************************************************************************/
7830d02842fSSascha Wildner
7840d02842fSSascha Wildner ACPI_PARSE_OBJECT *
TrLinkChildOp(ACPI_PARSE_OBJECT * Op1,ACPI_PARSE_OBJECT * Op2)7851093ca81SSascha Wildner TrLinkChildOp (
7860d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op1,
7870d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op2)
7880d02842fSSascha Wildner {
7890d02842fSSascha Wildner ACPI_PARSE_OBJECT *Next;
7900d02842fSSascha Wildner
7910d02842fSSascha Wildner
7920d02842fSSascha Wildner DbgPrint (ASL_PARSE_OUTPUT,
7931093ca81SSascha Wildner "\nLinkChildOp: Parent=%p (%s), Child=%p (%s)\n",
7940d02842fSSascha Wildner Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode): NULL,
7950d02842fSSascha Wildner Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode): NULL);
7960d02842fSSascha Wildner
797d638c6eeSSascha Wildner /*
7981093ca81SSascha Wildner * Converter: if TrLinkChildOp is called to link a method call,
799d638c6eeSSascha Wildner * turn on capture comments as it signifies that we are done parsing
800d638c6eeSSascha Wildner * a method call.
801d638c6eeSSascha Wildner */
8027bcb6cafSSascha Wildner if (AcpiGbl_CaptureComments && Op1)
803d638c6eeSSascha Wildner {
804d638c6eeSSascha Wildner if (Op1->Asl.ParseOpcode == PARSEOP_METHODCALL)
805d638c6eeSSascha Wildner {
806806343b9SSascha Wildner AslGbl_CommentState.CaptureComments = TRUE;
807d638c6eeSSascha Wildner }
808806343b9SSascha Wildner AslGbl_CommentState.LatestParseOp = Op1;
809d638c6eeSSascha Wildner }
8101093ca81SSascha Wildner
8110d02842fSSascha Wildner if (!Op1 || !Op2)
8120d02842fSSascha Wildner {
8130d02842fSSascha Wildner return (Op1);
8140d02842fSSascha Wildner }
8150d02842fSSascha Wildner
8160d02842fSSascha Wildner Op1->Asl.Child = Op2;
8170d02842fSSascha Wildner
8180d02842fSSascha Wildner /* Set the child and all peers of the child to point to the parent */
8190d02842fSSascha Wildner
8200d02842fSSascha Wildner Next = Op2;
8210d02842fSSascha Wildner while (Next)
8220d02842fSSascha Wildner {
8230d02842fSSascha Wildner Next->Asl.Parent = Op1;
8240d02842fSSascha Wildner Next = Next->Asl.Next;
8250d02842fSSascha Wildner }
8260d02842fSSascha Wildner
8270d02842fSSascha Wildner return (Op1);
8280d02842fSSascha Wildner }
8290d02842fSSascha Wildner
8300d02842fSSascha Wildner
8310d02842fSSascha Wildner /*******************************************************************************
8320d02842fSSascha Wildner *
8330d02842fSSascha Wildner * FUNCTION: TrWalkParseTree
8340d02842fSSascha Wildner *
8351093ca81SSascha Wildner * PARAMETERS: Op - Walk starting point
8361093ca81SSascha Wildner * Visitation - Type of walk
8370d02842fSSascha Wildner * DescendingCallback - Called during tree descent
8380d02842fSSascha Wildner * AscendingCallback - Called during tree ascent
8390d02842fSSascha Wildner * Context - To be passed to the callbacks
8400d02842fSSascha Wildner *
8410d02842fSSascha Wildner * RETURN: Status from callback(s)
8420d02842fSSascha Wildner *
8430d02842fSSascha Wildner * DESCRIPTION: Walk the entire parse tree.
8440d02842fSSascha Wildner *
8450d02842fSSascha Wildner ******************************************************************************/
8460d02842fSSascha Wildner
8470d02842fSSascha Wildner ACPI_STATUS
TrWalkParseTree(ACPI_PARSE_OBJECT * Op,UINT32 Visitation,ASL_WALK_CALLBACK DescendingCallback,ASL_WALK_CALLBACK AscendingCallback,void * Context)8480d02842fSSascha Wildner TrWalkParseTree (
8490d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op,
8500d02842fSSascha Wildner UINT32 Visitation,
8510d02842fSSascha Wildner ASL_WALK_CALLBACK DescendingCallback,
8520d02842fSSascha Wildner ASL_WALK_CALLBACK AscendingCallback,
8530d02842fSSascha Wildner void *Context)
8540d02842fSSascha Wildner {
8550d02842fSSascha Wildner UINT32 Level;
8561093ca81SSascha Wildner BOOLEAN OpPreviouslyVisited;
8570d02842fSSascha Wildner ACPI_PARSE_OBJECT *StartOp = Op;
8580d02842fSSascha Wildner ACPI_STATUS Status;
859a4b9c0c9SSascha Wildner ACPI_PARSE_OBJECT *Restore = NULL;
860a4b9c0c9SSascha Wildner BOOLEAN WalkOneDefinitionBlock = Visitation & ASL_WALK_VISIT_DB_SEPARATELY;
8610d02842fSSascha Wildner
8620d02842fSSascha Wildner
863806343b9SSascha Wildner if (!AslGbl_ParseTreeRoot)
8640d02842fSSascha Wildner {
8650d02842fSSascha Wildner return (AE_OK);
8660d02842fSSascha Wildner }
8670d02842fSSascha Wildner
8680d02842fSSascha Wildner Level = 0;
8691093ca81SSascha Wildner OpPreviouslyVisited = FALSE;
8700d02842fSSascha Wildner
871a4b9c0c9SSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK &&
872a4b9c0c9SSascha Wildner WalkOneDefinitionBlock)
873a4b9c0c9SSascha Wildner {
874a4b9c0c9SSascha Wildner Restore = Op->Asl.Next;
875a4b9c0c9SSascha Wildner Op->Asl.Next = NULL;
876a4b9c0c9SSascha Wildner }
877a4b9c0c9SSascha Wildner switch (Visitation & ~ASL_WALK_VISIT_DB_SEPARATELY)
8780d02842fSSascha Wildner {
8790d02842fSSascha Wildner case ASL_WALK_VISIT_DOWNWARD:
8800d02842fSSascha Wildner
8810d02842fSSascha Wildner while (Op)
8820d02842fSSascha Wildner {
8831093ca81SSascha Wildner if (!OpPreviouslyVisited)
8840d02842fSSascha Wildner {
8851093ca81SSascha Wildner /* Let the callback process the op. */
8860d02842fSSascha Wildner
8870d02842fSSascha Wildner Status = DescendingCallback (Op, Level, Context);
8880d02842fSSascha Wildner if (ACPI_SUCCESS (Status))
8890d02842fSSascha Wildner {
8900d02842fSSascha Wildner /* Visit children first, once */
8910d02842fSSascha Wildner
8920d02842fSSascha Wildner if (Op->Asl.Child)
8930d02842fSSascha Wildner {
8940d02842fSSascha Wildner Level++;
8950d02842fSSascha Wildner Op = Op->Asl.Child;
8960d02842fSSascha Wildner continue;
8970d02842fSSascha Wildner }
8980d02842fSSascha Wildner }
8990d02842fSSascha Wildner else if (Status != AE_CTRL_DEPTH)
9000d02842fSSascha Wildner {
9010d02842fSSascha Wildner /* Exit immediately on any error */
9020d02842fSSascha Wildner
903a4b9c0c9SSascha Wildner goto ErrorExit;
9040d02842fSSascha Wildner }
9050d02842fSSascha Wildner }
9060d02842fSSascha Wildner
9070d02842fSSascha Wildner /* Terminate walk at start op */
9080d02842fSSascha Wildner
9090d02842fSSascha Wildner if (Op == StartOp)
9100d02842fSSascha Wildner {
9110d02842fSSascha Wildner break;
9120d02842fSSascha Wildner }
9130d02842fSSascha Wildner
9140d02842fSSascha Wildner /* No more children, visit peers */
9150d02842fSSascha Wildner
9160d02842fSSascha Wildner if (Op->Asl.Next)
9170d02842fSSascha Wildner {
9180d02842fSSascha Wildner Op = Op->Asl.Next;
9191093ca81SSascha Wildner OpPreviouslyVisited = FALSE;
9200d02842fSSascha Wildner }
9210d02842fSSascha Wildner else
9220d02842fSSascha Wildner {
9230d02842fSSascha Wildner /* No children or peers, re-visit parent */
9240d02842fSSascha Wildner
9250d02842fSSascha Wildner if (Level != 0 )
9260d02842fSSascha Wildner {
9270d02842fSSascha Wildner Level--;
9280d02842fSSascha Wildner }
9290d02842fSSascha Wildner Op = Op->Asl.Parent;
9301093ca81SSascha Wildner OpPreviouslyVisited = TRUE;
9310d02842fSSascha Wildner }
9320d02842fSSascha Wildner }
9330d02842fSSascha Wildner break;
9340d02842fSSascha Wildner
9350d02842fSSascha Wildner case ASL_WALK_VISIT_UPWARD:
9360d02842fSSascha Wildner
9370d02842fSSascha Wildner while (Op)
9380d02842fSSascha Wildner {
9391093ca81SSascha Wildner /* Visit leaf op (no children) or parent op on return trip */
9400d02842fSSascha Wildner
9410d02842fSSascha Wildner if ((!Op->Asl.Child) ||
9421093ca81SSascha Wildner (OpPreviouslyVisited))
9430d02842fSSascha Wildner {
9441093ca81SSascha Wildner /* Let the callback process the op. */
9450d02842fSSascha Wildner
9460d02842fSSascha Wildner Status = AscendingCallback (Op, Level, Context);
9470d02842fSSascha Wildner if (ACPI_FAILURE (Status))
9480d02842fSSascha Wildner {
949a4b9c0c9SSascha Wildner goto ErrorExit;
9500d02842fSSascha Wildner }
9510d02842fSSascha Wildner }
9520d02842fSSascha Wildner else
9530d02842fSSascha Wildner {
9540d02842fSSascha Wildner /* Visit children first, once */
9550d02842fSSascha Wildner
9560d02842fSSascha Wildner Level++;
9570d02842fSSascha Wildner Op = Op->Asl.Child;
9580d02842fSSascha Wildner continue;
9590d02842fSSascha Wildner }
9600d02842fSSascha Wildner
9610d02842fSSascha Wildner /* Terminate walk at start op */
9620d02842fSSascha Wildner
9630d02842fSSascha Wildner if (Op == StartOp)
9640d02842fSSascha Wildner {
9650d02842fSSascha Wildner break;
9660d02842fSSascha Wildner }
9670d02842fSSascha Wildner
9680d02842fSSascha Wildner /* No more children, visit peers */
9690d02842fSSascha Wildner
9700d02842fSSascha Wildner if (Op->Asl.Next)
9710d02842fSSascha Wildner {
9720d02842fSSascha Wildner Op = Op->Asl.Next;
9731093ca81SSascha Wildner OpPreviouslyVisited = FALSE;
9740d02842fSSascha Wildner }
9750d02842fSSascha Wildner else
9760d02842fSSascha Wildner {
9770d02842fSSascha Wildner /* No children or peers, re-visit parent */
9780d02842fSSascha Wildner
9790d02842fSSascha Wildner if (Level != 0 )
9800d02842fSSascha Wildner {
9810d02842fSSascha Wildner Level--;
9820d02842fSSascha Wildner }
9830d02842fSSascha Wildner Op = Op->Asl.Parent;
9841093ca81SSascha Wildner OpPreviouslyVisited = TRUE;
9850d02842fSSascha Wildner }
9860d02842fSSascha Wildner }
9870d02842fSSascha Wildner break;
9880d02842fSSascha Wildner
9890d02842fSSascha Wildner case ASL_WALK_VISIT_TWICE:
9900d02842fSSascha Wildner
9910d02842fSSascha Wildner while (Op)
9920d02842fSSascha Wildner {
9931093ca81SSascha Wildner if (OpPreviouslyVisited)
9940d02842fSSascha Wildner {
9950d02842fSSascha Wildner Status = AscendingCallback (Op, Level, Context);
9960d02842fSSascha Wildner if (ACPI_FAILURE (Status))
9970d02842fSSascha Wildner {
998a4b9c0c9SSascha Wildner goto ErrorExit;
9990d02842fSSascha Wildner }
10000d02842fSSascha Wildner }
10010d02842fSSascha Wildner else
10020d02842fSSascha Wildner {
10031093ca81SSascha Wildner /* Let the callback process the op. */
10040d02842fSSascha Wildner
10050d02842fSSascha Wildner Status = DescendingCallback (Op, Level, Context);
10060d02842fSSascha Wildner if (ACPI_SUCCESS (Status))
10070d02842fSSascha Wildner {
10080d02842fSSascha Wildner /* Visit children first, once */
10090d02842fSSascha Wildner
10100d02842fSSascha Wildner if (Op->Asl.Child)
10110d02842fSSascha Wildner {
10120d02842fSSascha Wildner Level++;
10130d02842fSSascha Wildner Op = Op->Asl.Child;
10140d02842fSSascha Wildner continue;
10150d02842fSSascha Wildner }
10160d02842fSSascha Wildner }
10170d02842fSSascha Wildner else if (Status != AE_CTRL_DEPTH)
10180d02842fSSascha Wildner {
10190d02842fSSascha Wildner /* Exit immediately on any error */
10200d02842fSSascha Wildner
1021a4b9c0c9SSascha Wildner goto ErrorExit;
10220d02842fSSascha Wildner }
10230d02842fSSascha Wildner }
10240d02842fSSascha Wildner
10250d02842fSSascha Wildner /* Terminate walk at start op */
10260d02842fSSascha Wildner
10270d02842fSSascha Wildner if (Op == StartOp)
10280d02842fSSascha Wildner {
10290d02842fSSascha Wildner break;
10300d02842fSSascha Wildner }
10310d02842fSSascha Wildner
10320d02842fSSascha Wildner /* No more children, visit peers */
10330d02842fSSascha Wildner
10340d02842fSSascha Wildner if (Op->Asl.Next)
10350d02842fSSascha Wildner {
10360d02842fSSascha Wildner Op = Op->Asl.Next;
10371093ca81SSascha Wildner OpPreviouslyVisited = FALSE;
10380d02842fSSascha Wildner }
10390d02842fSSascha Wildner else
10400d02842fSSascha Wildner {
10410d02842fSSascha Wildner /* No children or peers, re-visit parent */
10420d02842fSSascha Wildner
10430d02842fSSascha Wildner if (Level != 0 )
10440d02842fSSascha Wildner {
10450d02842fSSascha Wildner Level--;
10460d02842fSSascha Wildner }
10470d02842fSSascha Wildner Op = Op->Asl.Parent;
10481093ca81SSascha Wildner OpPreviouslyVisited = TRUE;
10490d02842fSSascha Wildner }
10500d02842fSSascha Wildner }
10510d02842fSSascha Wildner break;
10520d02842fSSascha Wildner
10530d02842fSSascha Wildner default:
10540d02842fSSascha Wildner /* No other types supported */
10550d02842fSSascha Wildner break;
10560d02842fSSascha Wildner }
10570d02842fSSascha Wildner
10580d02842fSSascha Wildner /* If we get here, the walk completed with no errors */
10590d02842fSSascha Wildner
1060a4b9c0c9SSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK &&
1061a4b9c0c9SSascha Wildner WalkOneDefinitionBlock)
1062a4b9c0c9SSascha Wildner {
1063a4b9c0c9SSascha Wildner Op->Asl.Next = Restore;
1064a4b9c0c9SSascha Wildner }
1065a4b9c0c9SSascha Wildner
10660d02842fSSascha Wildner return (AE_OK);
1067a4b9c0c9SSascha Wildner
1068a4b9c0c9SSascha Wildner ErrorExit:
1069a4b9c0c9SSascha Wildner
1070a4b9c0c9SSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK &&
1071a4b9c0c9SSascha Wildner WalkOneDefinitionBlock)
1072a4b9c0c9SSascha Wildner {
1073a4b9c0c9SSascha Wildner Op->Asl.Next = Restore;
1074a4b9c0c9SSascha Wildner }
1075a4b9c0c9SSascha Wildner return (Status);
10760d02842fSSascha Wildner }
1077