xref: /dflybsd-src/sys/contrib/dev/acpica/source/compiler/asltree.c (revision 383048aca08c2de51d27aa8638a36982a0d74550)
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