153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson *
35f9b24faSJung-uk Kim * Module Name: asltree - Parse tree management
453289f6aSNate Lawson *
553289f6aSNate Lawson *****************************************************************************/
653289f6aSNate Lawson
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim *
90d84335fSJung-uk Kim * 1. Copyright Notice
100d84335fSJung-uk Kim *
11*58308fadSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
1253289f6aSNate Lawson * All rights reserved.
1353289f6aSNate Lawson *
140d84335fSJung-uk Kim * 2. License
150d84335fSJung-uk Kim *
160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim * property rights.
200d84335fSJung-uk Kim *
210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim *
280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim *
370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim * conditions are met:
390d84335fSJung-uk Kim *
400d84335fSJung-uk Kim * 3. Conditions
410d84335fSJung-uk Kim *
420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim *
540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim * make.
650d84335fSJung-uk Kim *
660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim * distribution.
710d84335fSJung-uk Kim *
720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim * Intel Code.
740d84335fSJung-uk Kim *
750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim * without prior written authorization from Intel.
790d84335fSJung-uk Kim *
800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim *
820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim *
900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim * LIMITED REMEDY.
980d84335fSJung-uk Kim *
990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim * such license, approval or letter.
1130d84335fSJung-uk Kim *
1140d84335fSJung-uk Kim *****************************************************************************
1150d84335fSJung-uk Kim *
1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim * following license:
1180d84335fSJung-uk Kim *
119d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without
120d244b227SJung-uk Kim * modification, are permitted provided that the following conditions
121d244b227SJung-uk Kim * are met:
122d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright
123d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer,
124d244b227SJung-uk Kim * without modification.
125d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below
127d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon
128d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further
129d244b227SJung-uk Kim * binary redistribution.
130d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names
131d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived
132d244b227SJung-uk Kim * from this software without specific prior written permission.
13353289f6aSNate Lawson *
1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim *
1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
147d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free
148d244b227SJung-uk Kim * Software Foundation.
14953289f6aSNate Lawson *
1500d84335fSJung-uk Kim *****************************************************************************/
15153289f6aSNate Lawson
152ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
15353289f6aSNate Lawson #include "aslcompiler.y.h"
1543f0275a0SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
15553289f6aSNate Lawson
15653289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER
15753289f6aSNate Lawson ACPI_MODULE_NAME ("asltree")
15853289f6aSNate Lawson
15953289f6aSNate Lawson
16053289f6aSNate Lawson /*******************************************************************************
16153289f6aSNate Lawson *
1625f9b24faSJung-uk Kim * FUNCTION: TrSetOpIntegerValue
163f8146b88SJung-uk Kim *
1645f9b24faSJung-uk Kim * PARAMETERS: ParseOpcode - New opcode to be assigned to the op
1655f9b24faSJung-uk Kim * Op - An existing parse op
166f8146b88SJung-uk Kim *
1675f9b24faSJung-uk Kim * RETURN: The updated op
168f8146b88SJung-uk Kim *
1695f9b24faSJung-uk Kim * DESCRIPTION: Used to set the integer value of a op,
1705f9b24faSJung-uk Kim * usually to a specific size (8, 16, 32, or 64 bits)
17153289f6aSNate Lawson *
17253289f6aSNate Lawson ******************************************************************************/
17353289f6aSNate Lawson
17453289f6aSNate Lawson ACPI_PARSE_OBJECT *
TrSetOpIntegerValue(UINT32 ParseOpcode,ACPI_PARSE_OBJECT * Op)1755f9b24faSJung-uk Kim TrSetOpIntegerValue (
17653289f6aSNate Lawson UINT32 ParseOpcode,
17753289f6aSNate Lawson ACPI_PARSE_OBJECT *Op)
17853289f6aSNate Lawson {
17953289f6aSNate Lawson
18053289f6aSNate Lawson if (!Op)
18153289f6aSNate Lawson {
1828ef1a331SJung-uk Kim return (NULL);
18353289f6aSNate Lawson }
18453289f6aSNate Lawson
18553289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT,
1865f9b24faSJung-uk Kim "\nUpdateOp: Old - %s, New - %s\n",
18753289f6aSNate Lawson UtGetOpName (Op->Asl.ParseOpcode),
18853289f6aSNate Lawson UtGetOpName (ParseOpcode));
18953289f6aSNate Lawson
19053289f6aSNate Lawson /* Assign new opcode and name */
19153289f6aSNate Lawson
19253289f6aSNate Lawson if (Op->Asl.ParseOpcode == PARSEOP_ONES)
19353289f6aSNate Lawson {
19453289f6aSNate Lawson switch (ParseOpcode)
19553289f6aSNate Lawson {
19653289f6aSNate Lawson case PARSEOP_BYTECONST:
197a9d8d09cSJung-uk Kim
1981df130f1SJung-uk Kim Op->Asl.Value.Integer = ACPI_UINT8_MAX;
19953289f6aSNate Lawson break;
20053289f6aSNate Lawson
20153289f6aSNate Lawson case PARSEOP_WORDCONST:
202a9d8d09cSJung-uk Kim
2031df130f1SJung-uk Kim Op->Asl.Value.Integer = ACPI_UINT16_MAX;
20453289f6aSNate Lawson break;
20553289f6aSNate Lawson
20653289f6aSNate Lawson case PARSEOP_DWORDCONST:
207a9d8d09cSJung-uk Kim
2081df130f1SJung-uk Kim Op->Asl.Value.Integer = ACPI_UINT32_MAX;
20953289f6aSNate Lawson break;
21053289f6aSNate Lawson
2111df130f1SJung-uk Kim /* Don't need to do the QWORD case */
2121df130f1SJung-uk Kim
21353289f6aSNate Lawson default:
214a9d8d09cSJung-uk Kim
2151df130f1SJung-uk Kim /* Don't care about others */
21653289f6aSNate Lawson break;
21753289f6aSNate Lawson }
21853289f6aSNate Lawson }
21953289f6aSNate Lawson
22053289f6aSNate Lawson Op->Asl.ParseOpcode = (UINT16) ParseOpcode;
22153289f6aSNate Lawson UtSetParseOpName (Op);
22253289f6aSNate Lawson
22353289f6aSNate Lawson /*
22453289f6aSNate Lawson * For the BYTE, WORD, and DWORD constants, make sure that the integer
22553289f6aSNate Lawson * that was passed in will actually fit into the data type
22653289f6aSNate Lawson */
22753289f6aSNate Lawson switch (ParseOpcode)
22853289f6aSNate Lawson {
22953289f6aSNate Lawson case PARSEOP_BYTECONST:
230a9d8d09cSJung-uk Kim
2311df130f1SJung-uk Kim UtCheckIntegerRange (Op, 0x00, ACPI_UINT8_MAX);
2321df130f1SJung-uk Kim Op->Asl.Value.Integer &= ACPI_UINT8_MAX;
23353289f6aSNate Lawson break;
23453289f6aSNate Lawson
23553289f6aSNate Lawson case PARSEOP_WORDCONST:
236a9d8d09cSJung-uk Kim
2371df130f1SJung-uk Kim UtCheckIntegerRange (Op, 0x00, ACPI_UINT16_MAX);
2381df130f1SJung-uk Kim Op->Asl.Value.Integer &= ACPI_UINT16_MAX;
23953289f6aSNate Lawson break;
24053289f6aSNate Lawson
24153289f6aSNate Lawson case PARSEOP_DWORDCONST:
242a9d8d09cSJung-uk Kim
2431df130f1SJung-uk Kim UtCheckIntegerRange (Op, 0x00, ACPI_UINT32_MAX);
2441df130f1SJung-uk Kim Op->Asl.Value.Integer &= ACPI_UINT32_MAX;
24553289f6aSNate Lawson break;
24653289f6aSNate Lawson
24753289f6aSNate Lawson default:
248a9d8d09cSJung-uk Kim
24953289f6aSNate Lawson /* Don't care about others, don't need to check QWORD */
250a9d8d09cSJung-uk Kim
25153289f6aSNate Lawson break;
25253289f6aSNate Lawson }
25353289f6aSNate Lawson
2545f9b24faSJung-uk Kim /* Converter: if this is a method invocation, turn off capture comments */
2555f9b24faSJung-uk Kim
256f1db5ef7SJung-uk Kim if (AcpiGbl_CaptureComments &&
2570d84335fSJung-uk Kim (ParseOpcode == PARSEOP_METHODCALL))
2580d84335fSJung-uk Kim {
2596f1f1a63SJung-uk Kim AslGbl_CommentState.CaptureComments = FALSE;
2600d84335fSJung-uk Kim }
2610d84335fSJung-uk Kim
2628ef1a331SJung-uk Kim return (Op);
26353289f6aSNate Lawson }
26453289f6aSNate Lawson
26553289f6aSNate Lawson
26653289f6aSNate Lawson /*******************************************************************************
26753289f6aSNate Lawson *
2685f9b24faSJung-uk Kim * FUNCTION: TrSetOpFlags
26953289f6aSNate Lawson *
2705f9b24faSJung-uk Kim * PARAMETERS: Op - An existing parse op
27153289f6aSNate Lawson * Flags - New flags word
27253289f6aSNate Lawson *
273fba7fc7eSJung-uk Kim * RETURN: The updated parser op
27453289f6aSNate Lawson *
2755f9b24faSJung-uk Kim * DESCRIPTION: Set bits in the op flags word. Will not clear bits, only set
27653289f6aSNate Lawson *
27753289f6aSNate Lawson ******************************************************************************/
27853289f6aSNate Lawson
27953289f6aSNate Lawson ACPI_PARSE_OBJECT *
TrSetOpFlags(ACPI_PARSE_OBJECT * Op,UINT32 Flags)2805f9b24faSJung-uk Kim TrSetOpFlags (
28153289f6aSNate Lawson ACPI_PARSE_OBJECT *Op,
28253289f6aSNate Lawson UINT32 Flags)
28353289f6aSNate Lawson {
28453289f6aSNate Lawson
28553289f6aSNate Lawson if (!Op)
28653289f6aSNate Lawson {
2878ef1a331SJung-uk Kim return (NULL);
28853289f6aSNate Lawson }
28953289f6aSNate Lawson
2907cf3e94aSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT,
2915f9b24faSJung-uk Kim "\nSetOpFlags: %s Op %p, %8.8X", Op->Asl.ParseOpName, Op, Flags);
2927cf3e94aSJung-uk Kim
2935f9b24faSJung-uk Kim TrPrintOpFlags (Flags, ASL_PARSE_OUTPUT);
2947cf3e94aSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
2957cf3e94aSJung-uk Kim
29653289f6aSNate Lawson Op->Asl.CompileFlags |= Flags;
2971df130f1SJung-uk Kim return (Op);
2981df130f1SJung-uk Kim }
29953289f6aSNate Lawson
3001df130f1SJung-uk Kim
3011df130f1SJung-uk Kim /*******************************************************************************
3021df130f1SJung-uk Kim *
3035f9b24faSJung-uk Kim * FUNCTION: TrSetOpAmlLength
3041df130f1SJung-uk Kim *
3055f9b24faSJung-uk Kim * PARAMETERS: Op - An existing parse op
3061df130f1SJung-uk Kim * Length - AML Length
3071df130f1SJung-uk Kim *
3081df130f1SJung-uk Kim * RETURN: The updated parser op
3091df130f1SJung-uk Kim *
3105f9b24faSJung-uk Kim * DESCRIPTION: Set the AML Length in a op. Used by the parser to indicate
3115f9b24faSJung-uk Kim * the presence of a op that must be reduced to a fixed length
3121df130f1SJung-uk Kim * constant.
3131df130f1SJung-uk Kim *
3141df130f1SJung-uk Kim ******************************************************************************/
3151df130f1SJung-uk Kim
3161df130f1SJung-uk Kim ACPI_PARSE_OBJECT *
TrSetOpAmlLength(ACPI_PARSE_OBJECT * Op,UINT32 Length)3175f9b24faSJung-uk Kim TrSetOpAmlLength (
3181df130f1SJung-uk Kim ACPI_PARSE_OBJECT *Op,
3191df130f1SJung-uk Kim UINT32 Length)
3201df130f1SJung-uk Kim {
3211df130f1SJung-uk Kim
3221df130f1SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT,
3235f9b24faSJung-uk Kim "\nSetOpAmlLength: Op %p, %8.8X\n", Op, Length);
3241df130f1SJung-uk Kim
3251df130f1SJung-uk Kim if (!Op)
3261df130f1SJung-uk Kim {
3278ef1a331SJung-uk Kim return (NULL);
3281df130f1SJung-uk Kim }
3291df130f1SJung-uk Kim
3301df130f1SJung-uk Kim Op->Asl.AmlLength = Length;
3311df130f1SJung-uk Kim return (Op);
33253289f6aSNate Lawson }
33353289f6aSNate Lawson
33453289f6aSNate Lawson
33553289f6aSNate Lawson /*******************************************************************************
33653289f6aSNate Lawson *
3375f9b24faSJung-uk Kim * FUNCTION: TrSetOpParent
33853289f6aSNate Lawson *
3395f9b24faSJung-uk Kim * PARAMETERS: Op - To be set to new parent
3405f9b24faSJung-uk Kim * ParentOp - The parent
34153289f6aSNate Lawson *
3425f9b24faSJung-uk Kim * RETURN: None, sets Op parent directly
34353289f6aSNate Lawson *
3445f9b24faSJung-uk Kim * DESCRIPTION: Change the parent of a parse op.
34553289f6aSNate Lawson *
34653289f6aSNate Lawson ******************************************************************************/
34753289f6aSNate Lawson
34853289f6aSNate Lawson void
TrSetOpParent(ACPI_PARSE_OBJECT * Op,ACPI_PARSE_OBJECT * ParentOp)3495f9b24faSJung-uk Kim TrSetOpParent (
3505f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op,
3515f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp)
3525f9b24faSJung-uk Kim {
3535f9b24faSJung-uk Kim
3545f9b24faSJung-uk Kim Op->Asl.Parent = ParentOp;
3555f9b24faSJung-uk Kim }
3565f9b24faSJung-uk Kim
3575f9b24faSJung-uk Kim
3585f9b24faSJung-uk Kim /*******************************************************************************
3595f9b24faSJung-uk Kim *
3605f9b24faSJung-uk Kim * FUNCTION: TrSetOpCurrentFilename
3615f9b24faSJung-uk Kim *
3625f9b24faSJung-uk Kim * PARAMETERS: Op - An existing parse op
3635f9b24faSJung-uk Kim *
3645f9b24faSJung-uk Kim * RETURN: None
3655f9b24faSJung-uk Kim *
3665f9b24faSJung-uk Kim * DESCRIPTION: Save the include file filename. Used for debug output only.
3675f9b24faSJung-uk Kim *
3685f9b24faSJung-uk Kim ******************************************************************************/
3695f9b24faSJung-uk Kim
3705f9b24faSJung-uk Kim void
TrSetOpCurrentFilename(ACPI_PARSE_OBJECT * Op)3715f9b24faSJung-uk Kim TrSetOpCurrentFilename (
3725f9b24faSJung-uk Kim ACPI_PARSE_OBJECT *Op)
3735f9b24faSJung-uk Kim {
3745f9b24faSJung-uk Kim
3756f1f1a63SJung-uk Kim Op->Asl.Filename = AslGbl_PreviousIncludeFilename;
3765f9b24faSJung-uk Kim }
3775f9b24faSJung-uk Kim
3785f9b24faSJung-uk Kim
3795f9b24faSJung-uk Kim /*******************************************************************************
3805f9b24faSJung-uk Kim *
3812f6a1a81SJung-uk Kim * FUNCTION: TrSetOpIntegerWidth
3822f6a1a81SJung-uk Kim *
3832f6a1a81SJung-uk Kim * PARAMETERS: Op - An existing parse op
3842f6a1a81SJung-uk Kim *
3852f6a1a81SJung-uk Kim * RETURN: None
3862f6a1a81SJung-uk Kim *
3872f6a1a81SJung-uk Kim * DESCRIPTION:
3882f6a1a81SJung-uk Kim *
3892f6a1a81SJung-uk Kim ******************************************************************************/
3902f6a1a81SJung-uk Kim
3912f6a1a81SJung-uk Kim void
TrSetOpIntegerWidth(ACPI_PARSE_OBJECT * TableSignatureOp,ACPI_PARSE_OBJECT * RevisionOp)3922f6a1a81SJung-uk Kim TrSetOpIntegerWidth (
3932f6a1a81SJung-uk Kim ACPI_PARSE_OBJECT *TableSignatureOp,
3942f6a1a81SJung-uk Kim ACPI_PARSE_OBJECT *RevisionOp)
3952f6a1a81SJung-uk Kim {
3962f6a1a81SJung-uk Kim
3972f6a1a81SJung-uk Kim /* TBD: Check table sig? (DSDT vs. SSDT) */
3982f6a1a81SJung-uk Kim
3992f6a1a81SJung-uk Kim /* Handle command-line version override */
4002f6a1a81SJung-uk Kim
4016f1f1a63SJung-uk Kim if (AslGbl_RevisionOverride)
4022f6a1a81SJung-uk Kim {
4036f1f1a63SJung-uk Kim AcpiUtSetIntegerWidth (AslGbl_RevisionOverride);
4042f6a1a81SJung-uk Kim }
4052f6a1a81SJung-uk Kim else
4062f6a1a81SJung-uk Kim {
4072f6a1a81SJung-uk Kim AcpiUtSetIntegerWidth ((UINT8) RevisionOp->Asl.Value.Integer);
4082f6a1a81SJung-uk Kim }
4092f6a1a81SJung-uk Kim }
4102f6a1a81SJung-uk Kim
4112f6a1a81SJung-uk Kim
4122f6a1a81SJung-uk Kim /*******************************************************************************
4132f6a1a81SJung-uk Kim *
4145f9b24faSJung-uk Kim * FUNCTION: TrSetOpEndLineNumber
4155f9b24faSJung-uk Kim *
4165f9b24faSJung-uk Kim * PARAMETERS: Op - An existing parse op
4175f9b24faSJung-uk Kim *
4185f9b24faSJung-uk Kim * RETURN: None.
4195f9b24faSJung-uk Kim *
4205f9b24faSJung-uk Kim * DESCRIPTION: Set the ending line numbers (file line and logical line) of a
4215f9b24faSJung-uk Kim * parse op to the current line numbers.
4225f9b24faSJung-uk Kim *
4235f9b24faSJung-uk Kim ******************************************************************************/
4245f9b24faSJung-uk Kim
4255f9b24faSJung-uk Kim void
TrSetOpEndLineNumber(ACPI_PARSE_OBJECT * Op)4265f9b24faSJung-uk Kim TrSetOpEndLineNumber (
42753289f6aSNate Lawson ACPI_PARSE_OBJECT *Op)
42853289f6aSNate Lawson {
42953289f6aSNate Lawson
43053289f6aSNate Lawson /* If the end line # is already set, just return */
43153289f6aSNate Lawson
43253289f6aSNate Lawson if (Op->Asl.EndLine)
43353289f6aSNate Lawson {
43453289f6aSNate Lawson return;
43553289f6aSNate Lawson }
43653289f6aSNate Lawson
4376f1f1a63SJung-uk Kim Op->Asl.EndLine = AslGbl_CurrentLineNumber;
4386f1f1a63SJung-uk Kim Op->Asl.EndLogicalLine = AslGbl_LogicalLineNumber;
43953289f6aSNate Lawson }
44053289f6aSNate Lawson
44153289f6aSNate Lawson
44253289f6aSNate Lawson /*******************************************************************************
44353289f6aSNate Lawson *
4445f9b24faSJung-uk Kim * FUNCTION: TrLinkOpChildren
4451c0e1b6dSJung-uk Kim *
4465f9b24faSJung-uk Kim * PARAMETERS: Op - An existing parse op
44753289f6aSNate Lawson * NumChildren - Number of children to follow
4485f9b24faSJung-uk Kim * ... - A list of child ops to link to the new
4495f9b24faSJung-uk Kim * op. NumChildren long.
45053289f6aSNate Lawson *
4515f9b24faSJung-uk Kim * RETURN: The updated (linked) op
45253289f6aSNate Lawson *
4535f9b24faSJung-uk Kim * DESCRIPTION: Link a group of ops to an existing parse op
45453289f6aSNate Lawson *
45553289f6aSNate Lawson ******************************************************************************/
45653289f6aSNate Lawson
45753289f6aSNate Lawson ACPI_PARSE_OBJECT *
TrLinkOpChildren(ACPI_PARSE_OBJECT * Op,UINT32 NumChildren,...)4585f9b24faSJung-uk Kim TrLinkOpChildren (
45953289f6aSNate Lawson ACPI_PARSE_OBJECT *Op,
46053289f6aSNate Lawson UINT32 NumChildren,
46153289f6aSNate Lawson ...)
46253289f6aSNate Lawson {
46353289f6aSNate Lawson ACPI_PARSE_OBJECT *Child;
46453289f6aSNate Lawson ACPI_PARSE_OBJECT *PrevChild;
46544b0f624SJung-uk Kim ACPI_PARSE_OBJECT *LastSibling;
46653289f6aSNate Lawson va_list ap;
46753289f6aSNate Lawson UINT32 i;
46853289f6aSNate Lawson BOOLEAN FirstChild;
46953289f6aSNate Lawson
470722b1667SJung-uk Kim ACPI_FUNCTION_NAME (TrLinkOpChildren);
47153289f6aSNate Lawson
47253289f6aSNate Lawson va_start (ap, NumChildren);
47353289f6aSNate Lawson
4745f9b24faSJung-uk Kim TrSetOpEndLineNumber (Op);
47553289f6aSNate Lawson
47653289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT,
477a88e22b7SJung-uk Kim "\nLinkChildren Line [%u to %u] NewParent %p Child %u Op %s ",
47853289f6aSNate Lawson Op->Asl.LineNumber, Op->Asl.EndLine,
47953289f6aSNate Lawson Op, NumChildren, UtGetOpName(Op->Asl.ParseOpcode));
48053289f6aSNate Lawson
48153289f6aSNate Lawson switch (Op->Asl.ParseOpcode)
48253289f6aSNate Lawson {
483f8146b88SJung-uk Kim case PARSEOP_ASL_CODE:
484a9d8d09cSJung-uk Kim
48544b0f624SJung-uk Kim if (!AslGbl_ParseTreeRoot)
48644b0f624SJung-uk Kim {
48744b0f624SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Creating first Definition Block\n");
4886f1f1a63SJung-uk Kim AslGbl_ParseTreeRoot = Op;
489f8146b88SJung-uk Kim Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
49044b0f624SJung-uk Kim }
49144b0f624SJung-uk Kim else
49244b0f624SJung-uk Kim {
49344b0f624SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Creating subsequent Definition Block\n");
49444b0f624SJung-uk Kim Op = AslGbl_ParseTreeRoot;
49544b0f624SJung-uk Kim }
49644b0f624SJung-uk Kim
497f8146b88SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "ASLCODE (Tree Completed)->");
498f8146b88SJung-uk Kim break;
499f8146b88SJung-uk Kim
500f8146b88SJung-uk Kim case PARSEOP_DEFINITION_BLOCK:
501f8146b88SJung-uk Kim
50253289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT, "DEFINITION_BLOCK (Tree Completed)->");
50353289f6aSNate Lawson break;
50453289f6aSNate Lawson
50553289f6aSNate Lawson case PARSEOP_OPERATIONREGION:
506a9d8d09cSJung-uk Kim
50753289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT, "OPREGION->");
50853289f6aSNate Lawson break;
50953289f6aSNate Lawson
51053289f6aSNate Lawson case PARSEOP_OR:
511a9d8d09cSJung-uk Kim
51253289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT, "OR->");
51353289f6aSNate Lawson break;
51453289f6aSNate Lawson
51553289f6aSNate Lawson default:
516a9d8d09cSJung-uk Kim
51753289f6aSNate Lawson /* Nothing to do for other opcodes */
518a9d8d09cSJung-uk Kim
51953289f6aSNate Lawson break;
52053289f6aSNate Lawson }
52153289f6aSNate Lawson
5220d84335fSJung-uk Kim /* The following is for capturing comments */
5230d84335fSJung-uk Kim
524f1db5ef7SJung-uk Kim if (AcpiGbl_CaptureComments)
5250d84335fSJung-uk Kim {
5260d84335fSJung-uk Kim /*
5270d84335fSJung-uk Kim * If there are "regular comments" detected at this point,
5280d84335fSJung-uk Kim * then is an endBlk comment. Categorize it as so and distribute
5295f9b24faSJung-uk Kim * all regular comments to this parse op.
5300d84335fSJung-uk Kim */
5316f1f1a63SJung-uk Kim if (AslGbl_CommentListHead)
5320d84335fSJung-uk Kim {
5336f1f1a63SJung-uk Kim Op->Asl.EndBlkComment = AslGbl_CommentListHead;
5340d84335fSJung-uk Kim CvDbgPrint ("EndBlk Comment for %s: %s",
5356f1f1a63SJung-uk Kim Op->Asl.ParseOpName, AslGbl_CommentListHead->Comment);
5366f1f1a63SJung-uk Kim AslGbl_CommentListHead = NULL;
5376f1f1a63SJung-uk Kim AslGbl_CommentListTail = NULL;
5380d84335fSJung-uk Kim }
5390d84335fSJung-uk Kim }
5400d84335fSJung-uk Kim
5415f9b24faSJung-uk Kim /* Link the new op to it's children */
54253289f6aSNate Lawson
54353289f6aSNate Lawson PrevChild = NULL;
54453289f6aSNate Lawson FirstChild = TRUE;
54553289f6aSNate Lawson for (i = 0; i < NumChildren; i++)
54653289f6aSNate Lawson {
54753289f6aSNate Lawson Child = va_arg (ap, ACPI_PARSE_OBJECT *);
54853289f6aSNate Lawson
54953289f6aSNate Lawson if ((Child == PrevChild) && (Child != NULL))
55053289f6aSNate Lawson {
551fba7fc7eSJung-uk Kim AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Child,
5525f9b24faSJung-uk Kim "Child op list invalid");
5538d744e47SJung-uk Kim va_end(ap);
5548ef1a331SJung-uk Kim return (Op);
55553289f6aSNate Lawson }
55653289f6aSNate Lawson
55753289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT, "%p, ", Child);
55853289f6aSNate Lawson
55953289f6aSNate Lawson /*
56053289f6aSNate Lawson * If child is NULL, this means that an optional argument
56153289f6aSNate Lawson * was omitted. We must create a placeholder with a special
56253289f6aSNate Lawson * opcode (DEFAULT_ARG) so that the code generator will know
56353289f6aSNate Lawson * that it must emit the correct default for this argument
56453289f6aSNate Lawson */
56553289f6aSNate Lawson if (!Child)
56653289f6aSNate Lawson {
5675f9b24faSJung-uk Kim Child = TrAllocateOp (PARSEOP_DEFAULT_ARG);
56853289f6aSNate Lawson }
56953289f6aSNate Lawson
57053289f6aSNate Lawson /* Link first child to parent */
57153289f6aSNate Lawson
57253289f6aSNate Lawson if (FirstChild)
57353289f6aSNate Lawson {
57453289f6aSNate Lawson FirstChild = FALSE;
57544b0f624SJung-uk Kim
57644b0f624SJung-uk Kim /*
57744b0f624SJung-uk Kim * In the case that multiple definition blocks are being compiled,
57844b0f624SJung-uk Kim * append the definition block to the end of the child list as the
57944b0f624SJung-uk Kim * last sibling. This is done to facilitate namespace cross-
58044b0f624SJung-uk Kim * reference between multiple definition blocks.
58144b0f624SJung-uk Kim */
58244b0f624SJung-uk Kim if (Op->Asl.Child &&
58344b0f624SJung-uk Kim (Op->Asl.Child->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK))
58444b0f624SJung-uk Kim {
58544b0f624SJung-uk Kim LastSibling = Op->Asl.Child;
58644b0f624SJung-uk Kim while (LastSibling->Asl.Next)
58744b0f624SJung-uk Kim {
58844b0f624SJung-uk Kim LastSibling = LastSibling->Asl.Next;
58944b0f624SJung-uk Kim }
59044b0f624SJung-uk Kim LastSibling->Asl.Next = Child;
59144b0f624SJung-uk Kim }
59244b0f624SJung-uk Kim else
59344b0f624SJung-uk Kim {
59453289f6aSNate Lawson Op->Asl.Child = Child;
59553289f6aSNate Lawson }
59644b0f624SJung-uk Kim }
59753289f6aSNate Lawson
59853289f6aSNate Lawson /* Point all children to parent */
59953289f6aSNate Lawson
60053289f6aSNate Lawson Child->Asl.Parent = Op;
60153289f6aSNate Lawson
60253289f6aSNate Lawson /* Link children in a peer list */
60353289f6aSNate Lawson
60453289f6aSNate Lawson if (PrevChild)
60553289f6aSNate Lawson {
60653289f6aSNate Lawson PrevChild->Asl.Next = Child;
6075f9b24faSJung-uk Kim }
60853289f6aSNate Lawson
60953289f6aSNate Lawson /*
6105f9b24faSJung-uk Kim * This child might be a list, point all ops in the list
61153289f6aSNate Lawson * to the same parent
61253289f6aSNate Lawson */
61353289f6aSNate Lawson while (Child->Asl.Next)
61453289f6aSNate Lawson {
61553289f6aSNate Lawson Child = Child->Asl.Next;
61653289f6aSNate Lawson Child->Asl.Parent = Op;
61753289f6aSNate Lawson }
618f8146b88SJung-uk Kim
61953289f6aSNate Lawson PrevChild = Child;
62053289f6aSNate Lawson }
62153289f6aSNate Lawson
6228d744e47SJung-uk Kim va_end(ap);
62353289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
6240d84335fSJung-uk Kim
625f1db5ef7SJung-uk Kim if (AcpiGbl_CaptureComments)
6260d84335fSJung-uk Kim {
6276f1f1a63SJung-uk Kim AslGbl_CommentState.LatestParseOp = Op;
628722b1667SJung-uk Kim CvDbgPrint ("%s=====Set latest parse op to this op.\n", ACPI_GET_FUNCTION_NAME);
6290d84335fSJung-uk Kim }
6305f9b24faSJung-uk Kim
6318ef1a331SJung-uk Kim return (Op);
63253289f6aSNate Lawson }
63353289f6aSNate Lawson
63453289f6aSNate Lawson
63553289f6aSNate Lawson /*******************************************************************************
63653289f6aSNate Lawson *
6375f9b24faSJung-uk Kim * FUNCTION: TrLinkPeerOp
63853289f6aSNate Lawson *
63953289f6aSNate Lawson * PARAMETERS: Op1 - First peer
64053289f6aSNate Lawson * Op2 - Second peer
64153289f6aSNate Lawson *
6425f9b24faSJung-uk Kim * RETURN: Op1 or the non-null op.
64353289f6aSNate Lawson *
6445f9b24faSJung-uk Kim * DESCRIPTION: Link two ops as peers. Handles cases where one peer is null.
64553289f6aSNate Lawson *
64653289f6aSNate Lawson ******************************************************************************/
64753289f6aSNate Lawson
64853289f6aSNate Lawson ACPI_PARSE_OBJECT *
TrLinkPeerOp(ACPI_PARSE_OBJECT * Op1,ACPI_PARSE_OBJECT * Op2)6495f9b24faSJung-uk Kim TrLinkPeerOp (
65053289f6aSNate Lawson ACPI_PARSE_OBJECT *Op1,
65153289f6aSNate Lawson ACPI_PARSE_OBJECT *Op2)
65253289f6aSNate Lawson {
65353289f6aSNate Lawson ACPI_PARSE_OBJECT *Next;
65453289f6aSNate Lawson
65553289f6aSNate Lawson
65653289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT,
6575f9b24faSJung-uk Kim "\nLinkPeerOp: 1=%p (%s), 2=%p (%s)\n",
65853289f6aSNate Lawson Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode) : NULL,
65953289f6aSNate Lawson Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode) : NULL);
66053289f6aSNate Lawson
66153289f6aSNate Lawson
66253289f6aSNate Lawson if ((!Op1) && (!Op2))
66353289f6aSNate Lawson {
6645f9b24faSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\nTwo Null ops!\n");
6658ef1a331SJung-uk Kim return (Op1);
66653289f6aSNate Lawson }
66753289f6aSNate Lawson
6685f9b24faSJung-uk Kim /* If one of the ops is null, just return the non-null op */
66953289f6aSNate Lawson
67053289f6aSNate Lawson if (!Op2)
67153289f6aSNate Lawson {
6728ef1a331SJung-uk Kim return (Op1);
67353289f6aSNate Lawson }
67453289f6aSNate Lawson
67553289f6aSNate Lawson if (!Op1)
67653289f6aSNate Lawson {
6778ef1a331SJung-uk Kim return (Op2);
67853289f6aSNate Lawson }
67953289f6aSNate Lawson
68053289f6aSNate Lawson if (Op1 == Op2)
68153289f6aSNate Lawson {
68253289f6aSNate Lawson DbgPrint (ASL_DEBUG_OUTPUT,
6835f9b24faSJung-uk Kim "\n************* Internal error, linking op to itself %p\n",
684fba7fc7eSJung-uk Kim Op1);
685fba7fc7eSJung-uk Kim AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op1,
6865f9b24faSJung-uk Kim "Linking op to itself");
6878ef1a331SJung-uk Kim return (Op1);
68853289f6aSNate Lawson }
68953289f6aSNate Lawson
69053289f6aSNate Lawson Op1->Asl.Parent = Op2->Asl.Parent;
69153289f6aSNate Lawson
69253289f6aSNate Lawson /*
69353289f6aSNate Lawson * Op 1 may already have a peer list (such as an IF/ELSE pair),
69453289f6aSNate Lawson * so we must walk to the end of the list and attach the new
69553289f6aSNate Lawson * peer at the end
69653289f6aSNate Lawson */
69753289f6aSNate Lawson Next = Op1;
69853289f6aSNate Lawson while (Next->Asl.Next)
69953289f6aSNate Lawson {
70053289f6aSNate Lawson Next = Next->Asl.Next;
70153289f6aSNate Lawson }
70253289f6aSNate Lawson
70353289f6aSNate Lawson Next->Asl.Next = Op2;
7048ef1a331SJung-uk Kim return (Op1);
70553289f6aSNate Lawson }
70653289f6aSNate Lawson
70753289f6aSNate Lawson
70853289f6aSNate Lawson /*******************************************************************************
70953289f6aSNate Lawson *
7105f9b24faSJung-uk Kim * FUNCTION: TrLinkPeerOps
71153289f6aSNate Lawson *
7125f9b24faSJung-uk Kim * PARAMETERS: NumPeers - The number of ops in the list to follow
7135f9b24faSJung-uk Kim * ... - A list of ops to link together as peers
71453289f6aSNate Lawson *
7155f9b24faSJung-uk Kim * RETURN: The first op in the list (head of the peer list)
71653289f6aSNate Lawson *
7175f9b24faSJung-uk Kim * DESCRIPTION: Link together an arbitrary number of peer ops.
71853289f6aSNate Lawson *
71953289f6aSNate Lawson ******************************************************************************/
72053289f6aSNate Lawson
72153289f6aSNate Lawson ACPI_PARSE_OBJECT *
TrLinkPeerOps(UINT32 NumPeers,...)7225f9b24faSJung-uk Kim TrLinkPeerOps (
72353289f6aSNate Lawson UINT32 NumPeers,
72453289f6aSNate Lawson ...)
72553289f6aSNate Lawson {
72653289f6aSNate Lawson ACPI_PARSE_OBJECT *This;
72753289f6aSNate Lawson ACPI_PARSE_OBJECT *Next;
72853289f6aSNate Lawson va_list ap;
72953289f6aSNate Lawson UINT32 i;
73053289f6aSNate Lawson ACPI_PARSE_OBJECT *Start;
73153289f6aSNate Lawson
73253289f6aSNate Lawson
73353289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT,
7345f9b24faSJung-uk Kim "\nLinkPeerOps: (%u) ", NumPeers);
73553289f6aSNate Lawson
73653289f6aSNate Lawson va_start (ap, NumPeers);
73753289f6aSNate Lawson This = va_arg (ap, ACPI_PARSE_OBJECT *);
73853289f6aSNate Lawson Start = This;
73953289f6aSNate Lawson
74053289f6aSNate Lawson /*
74153289f6aSNate Lawson * Link all peers
74253289f6aSNate Lawson */
74353289f6aSNate Lawson for (i = 0; i < (NumPeers -1); i++)
74453289f6aSNate Lawson {
745a88e22b7SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "%u=%p ", (i+1), This);
74653289f6aSNate Lawson
74753289f6aSNate Lawson while (This->Asl.Next)
74853289f6aSNate Lawson {
74953289f6aSNate Lawson This = This->Asl.Next;
75053289f6aSNate Lawson }
75153289f6aSNate Lawson
7525f9b24faSJung-uk Kim /* Get another peer op */
75353289f6aSNate Lawson
75453289f6aSNate Lawson Next = va_arg (ap, ACPI_PARSE_OBJECT *);
75553289f6aSNate Lawson if (!Next)
75653289f6aSNate Lawson {
7575f9b24faSJung-uk Kim Next = TrAllocateOp (PARSEOP_DEFAULT_ARG);
75853289f6aSNate Lawson }
75953289f6aSNate Lawson
7605f9b24faSJung-uk Kim /* link new op to the current op */
76153289f6aSNate Lawson
76253289f6aSNate Lawson This->Asl.Next = Next;
76353289f6aSNate Lawson This = Next;
76453289f6aSNate Lawson }
76553289f6aSNate Lawson
7665f9b24faSJung-uk Kim va_end (ap);
7677cf3e94aSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT,"\n");
76853289f6aSNate Lawson return (Start);
76953289f6aSNate Lawson }
77053289f6aSNate Lawson
77153289f6aSNate Lawson
77253289f6aSNate Lawson /*******************************************************************************
77353289f6aSNate Lawson *
7745f9b24faSJung-uk Kim * FUNCTION: TrLinkChildOp
77553289f6aSNate Lawson *
7765f9b24faSJung-uk Kim * PARAMETERS: Op1 - Parent op
77753289f6aSNate Lawson * Op2 - Op to become a child
77853289f6aSNate Lawson *
7795f9b24faSJung-uk Kim * RETURN: The parent op
78053289f6aSNate Lawson *
7815f9b24faSJung-uk Kim * DESCRIPTION: Link two ops together as a parent and child
78253289f6aSNate Lawson *
78353289f6aSNate Lawson ******************************************************************************/
78453289f6aSNate Lawson
78553289f6aSNate Lawson ACPI_PARSE_OBJECT *
TrLinkChildOp(ACPI_PARSE_OBJECT * Op1,ACPI_PARSE_OBJECT * Op2)7865f9b24faSJung-uk Kim TrLinkChildOp (
78753289f6aSNate Lawson ACPI_PARSE_OBJECT *Op1,
78853289f6aSNate Lawson ACPI_PARSE_OBJECT *Op2)
78953289f6aSNate Lawson {
79053289f6aSNate Lawson ACPI_PARSE_OBJECT *Next;
79153289f6aSNate Lawson
79253289f6aSNate Lawson
79353289f6aSNate Lawson DbgPrint (ASL_PARSE_OUTPUT,
7945f9b24faSJung-uk Kim "\nLinkChildOp: Parent=%p (%s), Child=%p (%s)\n",
79553289f6aSNate Lawson Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode): NULL,
79653289f6aSNate Lawson Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode): NULL);
79753289f6aSNate Lawson
7980d84335fSJung-uk Kim /*
7995f9b24faSJung-uk Kim * Converter: if TrLinkChildOp is called to link a method call,
8000d84335fSJung-uk Kim * turn on capture comments as it signifies that we are done parsing
8010d84335fSJung-uk Kim * a method call.
8020d84335fSJung-uk Kim */
803f1db5ef7SJung-uk Kim if (AcpiGbl_CaptureComments && Op1)
8040d84335fSJung-uk Kim {
8050d84335fSJung-uk Kim if (Op1->Asl.ParseOpcode == PARSEOP_METHODCALL)
8060d84335fSJung-uk Kim {
8076f1f1a63SJung-uk Kim AslGbl_CommentState.CaptureComments = TRUE;
8080d84335fSJung-uk Kim }
8096f1f1a63SJung-uk Kim AslGbl_CommentState.LatestParseOp = Op1;
8100d84335fSJung-uk Kim }
8115f9b24faSJung-uk Kim
81253289f6aSNate Lawson if (!Op1 || !Op2)
81353289f6aSNate Lawson {
8148ef1a331SJung-uk Kim return (Op1);
81553289f6aSNate Lawson }
81653289f6aSNate Lawson
81753289f6aSNate Lawson Op1->Asl.Child = Op2;
81853289f6aSNate Lawson
81953289f6aSNate Lawson /* Set the child and all peers of the child to point to the parent */
82053289f6aSNate Lawson
82153289f6aSNate Lawson Next = Op2;
82253289f6aSNate Lawson while (Next)
82353289f6aSNate Lawson {
82453289f6aSNate Lawson Next->Asl.Parent = Op1;
82553289f6aSNate Lawson Next = Next->Asl.Next;
82653289f6aSNate Lawson }
82753289f6aSNate Lawson
8288ef1a331SJung-uk Kim return (Op1);
82953289f6aSNate Lawson }
83053289f6aSNate Lawson
83153289f6aSNate Lawson
83253289f6aSNate Lawson /*******************************************************************************
83353289f6aSNate Lawson *
83453289f6aSNate Lawson * FUNCTION: TrWalkParseTree
83553289f6aSNate Lawson *
8365f9b24faSJung-uk Kim * PARAMETERS: Op - Walk starting point
8375f9b24faSJung-uk Kim * Visitation - Type of walk
83853289f6aSNate Lawson * DescendingCallback - Called during tree descent
83953289f6aSNate Lawson * AscendingCallback - Called during tree ascent
84053289f6aSNate Lawson * Context - To be passed to the callbacks
84153289f6aSNate Lawson *
84253289f6aSNate Lawson * RETURN: Status from callback(s)
84353289f6aSNate Lawson *
84453289f6aSNate Lawson * DESCRIPTION: Walk the entire parse tree.
84553289f6aSNate Lawson *
84653289f6aSNate Lawson ******************************************************************************/
84753289f6aSNate Lawson
84853289f6aSNate Lawson ACPI_STATUS
TrWalkParseTree(ACPI_PARSE_OBJECT * Op,UINT32 Visitation,ASL_WALK_CALLBACK DescendingCallback,ASL_WALK_CALLBACK AscendingCallback,void * Context)84953289f6aSNate Lawson TrWalkParseTree (
85053289f6aSNate Lawson ACPI_PARSE_OBJECT *Op,
85153289f6aSNate Lawson UINT32 Visitation,
85253289f6aSNate Lawson ASL_WALK_CALLBACK DescendingCallback,
85353289f6aSNate Lawson ASL_WALK_CALLBACK AscendingCallback,
85453289f6aSNate Lawson void *Context)
85553289f6aSNate Lawson {
85653289f6aSNate Lawson UINT32 Level;
8575f9b24faSJung-uk Kim BOOLEAN OpPreviouslyVisited;
85853289f6aSNate Lawson ACPI_PARSE_OBJECT *StartOp = Op;
85953289f6aSNate Lawson ACPI_STATUS Status;
86044b0f624SJung-uk Kim ACPI_PARSE_OBJECT *Restore = NULL;
86144b0f624SJung-uk Kim BOOLEAN WalkOneDefinitionBlock = Visitation & ASL_WALK_VISIT_DB_SEPARATELY;
86253289f6aSNate Lawson
86353289f6aSNate Lawson
8646f1f1a63SJung-uk Kim if (!AslGbl_ParseTreeRoot)
86553289f6aSNate Lawson {
86653289f6aSNate Lawson return (AE_OK);
86753289f6aSNate Lawson }
86853289f6aSNate Lawson
86953289f6aSNate Lawson Level = 0;
8705f9b24faSJung-uk Kim OpPreviouslyVisited = FALSE;
87153289f6aSNate Lawson
87244b0f624SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK &&
87344b0f624SJung-uk Kim WalkOneDefinitionBlock)
87444b0f624SJung-uk Kim {
87544b0f624SJung-uk Kim Restore = Op->Asl.Next;
87644b0f624SJung-uk Kim Op->Asl.Next = NULL;
87744b0f624SJung-uk Kim }
87844b0f624SJung-uk Kim switch (Visitation & ~ASL_WALK_VISIT_DB_SEPARATELY)
87953289f6aSNate Lawson {
88053289f6aSNate Lawson case ASL_WALK_VISIT_DOWNWARD:
88153289f6aSNate Lawson
88253289f6aSNate Lawson while (Op)
88353289f6aSNate Lawson {
8845f9b24faSJung-uk Kim if (!OpPreviouslyVisited)
88553289f6aSNate Lawson {
8865f9b24faSJung-uk Kim /* Let the callback process the op. */
887fba7fc7eSJung-uk Kim
88853289f6aSNate Lawson Status = DescendingCallback (Op, Level, Context);
88953289f6aSNate Lawson if (ACPI_SUCCESS (Status))
89053289f6aSNate Lawson {
89153289f6aSNate Lawson /* Visit children first, once */
89253289f6aSNate Lawson
89353289f6aSNate Lawson if (Op->Asl.Child)
89453289f6aSNate Lawson {
89553289f6aSNate Lawson Level++;
89653289f6aSNate Lawson Op = Op->Asl.Child;
89753289f6aSNate Lawson continue;
89853289f6aSNate Lawson }
89953289f6aSNate Lawson }
90053289f6aSNate Lawson else if (Status != AE_CTRL_DEPTH)
90153289f6aSNate Lawson {
90253289f6aSNate Lawson /* Exit immediately on any error */
90353289f6aSNate Lawson
90444b0f624SJung-uk Kim goto ErrorExit;
90553289f6aSNate Lawson }
90653289f6aSNate Lawson }
90753289f6aSNate Lawson
90853289f6aSNate Lawson /* Terminate walk at start op */
90953289f6aSNate Lawson
91053289f6aSNate Lawson if (Op == StartOp)
91153289f6aSNate Lawson {
91253289f6aSNate Lawson break;
91353289f6aSNate Lawson }
91453289f6aSNate Lawson
91553289f6aSNate Lawson /* No more children, visit peers */
91653289f6aSNate Lawson
91753289f6aSNate Lawson if (Op->Asl.Next)
91853289f6aSNate Lawson {
91953289f6aSNate Lawson Op = Op->Asl.Next;
9205f9b24faSJung-uk Kim OpPreviouslyVisited = FALSE;
92153289f6aSNate Lawson }
92253289f6aSNate Lawson else
92353289f6aSNate Lawson {
92453289f6aSNate Lawson /* No children or peers, re-visit parent */
92553289f6aSNate Lawson
92653289f6aSNate Lawson if (Level != 0 )
92753289f6aSNate Lawson {
92853289f6aSNate Lawson Level--;
92953289f6aSNate Lawson }
93053289f6aSNate Lawson Op = Op->Asl.Parent;
9315f9b24faSJung-uk Kim OpPreviouslyVisited = TRUE;
93253289f6aSNate Lawson }
93353289f6aSNate Lawson }
93453289f6aSNate Lawson break;
93553289f6aSNate Lawson
93653289f6aSNate Lawson case ASL_WALK_VISIT_UPWARD:
93753289f6aSNate Lawson
93853289f6aSNate Lawson while (Op)
93953289f6aSNate Lawson {
9405f9b24faSJung-uk Kim /* Visit leaf op (no children) or parent op on return trip */
94153289f6aSNate Lawson
94253289f6aSNate Lawson if ((!Op->Asl.Child) ||
9435f9b24faSJung-uk Kim (OpPreviouslyVisited))
94453289f6aSNate Lawson {
9455f9b24faSJung-uk Kim /* Let the callback process the op. */
946fba7fc7eSJung-uk Kim
94753289f6aSNate Lawson Status = AscendingCallback (Op, Level, Context);
94853289f6aSNate Lawson if (ACPI_FAILURE (Status))
94953289f6aSNate Lawson {
95044b0f624SJung-uk Kim goto ErrorExit;
95153289f6aSNate Lawson }
95253289f6aSNate Lawson }
95353289f6aSNate Lawson else
95453289f6aSNate Lawson {
95553289f6aSNate Lawson /* Visit children first, once */
95653289f6aSNate Lawson
95753289f6aSNate Lawson Level++;
95853289f6aSNate Lawson Op = Op->Asl.Child;
95953289f6aSNate Lawson continue;
96053289f6aSNate Lawson }
96153289f6aSNate Lawson
96253289f6aSNate Lawson /* Terminate walk at start op */
96353289f6aSNate Lawson
96453289f6aSNate Lawson if (Op == StartOp)
96553289f6aSNate Lawson {
96653289f6aSNate Lawson break;
96753289f6aSNate Lawson }
96853289f6aSNate Lawson
96953289f6aSNate Lawson /* No more children, visit peers */
97053289f6aSNate Lawson
97153289f6aSNate Lawson if (Op->Asl.Next)
97253289f6aSNate Lawson {
97353289f6aSNate Lawson Op = Op->Asl.Next;
9745f9b24faSJung-uk Kim OpPreviouslyVisited = FALSE;
97553289f6aSNate Lawson }
97653289f6aSNate Lawson else
97753289f6aSNate Lawson {
97853289f6aSNate Lawson /* No children or peers, re-visit parent */
97953289f6aSNate Lawson
98053289f6aSNate Lawson if (Level != 0 )
98153289f6aSNate Lawson {
98253289f6aSNate Lawson Level--;
98353289f6aSNate Lawson }
98453289f6aSNate Lawson Op = Op->Asl.Parent;
9855f9b24faSJung-uk Kim OpPreviouslyVisited = TRUE;
98653289f6aSNate Lawson }
98753289f6aSNate Lawson }
98853289f6aSNate Lawson break;
98953289f6aSNate Lawson
99053289f6aSNate Lawson case ASL_WALK_VISIT_TWICE:
99153289f6aSNate Lawson
99253289f6aSNate Lawson while (Op)
99353289f6aSNate Lawson {
9945f9b24faSJung-uk Kim if (OpPreviouslyVisited)
99553289f6aSNate Lawson {
99653289f6aSNate Lawson Status = AscendingCallback (Op, Level, Context);
99753289f6aSNate Lawson if (ACPI_FAILURE (Status))
99853289f6aSNate Lawson {
99944b0f624SJung-uk Kim goto ErrorExit;
100053289f6aSNate Lawson }
100153289f6aSNate Lawson }
100253289f6aSNate Lawson else
100353289f6aSNate Lawson {
10045f9b24faSJung-uk Kim /* Let the callback process the op. */
1005fba7fc7eSJung-uk Kim
100653289f6aSNate Lawson Status = DescendingCallback (Op, Level, Context);
100753289f6aSNate Lawson if (ACPI_SUCCESS (Status))
100853289f6aSNate Lawson {
100953289f6aSNate Lawson /* Visit children first, once */
101053289f6aSNate Lawson
101153289f6aSNate Lawson if (Op->Asl.Child)
101253289f6aSNate Lawson {
101353289f6aSNate Lawson Level++;
101453289f6aSNate Lawson Op = Op->Asl.Child;
101553289f6aSNate Lawson continue;
101653289f6aSNate Lawson }
101753289f6aSNate Lawson }
101853289f6aSNate Lawson else if (Status != AE_CTRL_DEPTH)
101953289f6aSNate Lawson {
102053289f6aSNate Lawson /* Exit immediately on any error */
102153289f6aSNate Lawson
102244b0f624SJung-uk Kim goto ErrorExit;
102353289f6aSNate Lawson }
102453289f6aSNate Lawson }
102553289f6aSNate Lawson
102653289f6aSNate Lawson /* Terminate walk at start op */
102753289f6aSNate Lawson
102853289f6aSNate Lawson if (Op == StartOp)
102953289f6aSNate Lawson {
103053289f6aSNate Lawson break;
103153289f6aSNate Lawson }
103253289f6aSNate Lawson
103353289f6aSNate Lawson /* No more children, visit peers */
103453289f6aSNate Lawson
103553289f6aSNate Lawson if (Op->Asl.Next)
103653289f6aSNate Lawson {
103753289f6aSNate Lawson Op = Op->Asl.Next;
10385f9b24faSJung-uk Kim OpPreviouslyVisited = FALSE;
103953289f6aSNate Lawson }
104053289f6aSNate Lawson else
104153289f6aSNate Lawson {
104253289f6aSNate Lawson /* No children or peers, re-visit parent */
104353289f6aSNate Lawson
104453289f6aSNate Lawson if (Level != 0 )
104553289f6aSNate Lawson {
104653289f6aSNate Lawson Level--;
104753289f6aSNate Lawson }
104853289f6aSNate Lawson Op = Op->Asl.Parent;
10495f9b24faSJung-uk Kim OpPreviouslyVisited = TRUE;
105053289f6aSNate Lawson }
105153289f6aSNate Lawson }
105253289f6aSNate Lawson break;
105353289f6aSNate Lawson
105453289f6aSNate Lawson default:
105553289f6aSNate Lawson /* No other types supported */
105653289f6aSNate Lawson break;
105753289f6aSNate Lawson }
105853289f6aSNate Lawson
105953289f6aSNate Lawson /* If we get here, the walk completed with no errors */
106053289f6aSNate Lawson
106144b0f624SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK &&
106244b0f624SJung-uk Kim WalkOneDefinitionBlock)
106344b0f624SJung-uk Kim {
106444b0f624SJung-uk Kim Op->Asl.Next = Restore;
106544b0f624SJung-uk Kim }
106644b0f624SJung-uk Kim
106753289f6aSNate Lawson return (AE_OK);
106844b0f624SJung-uk Kim
106944b0f624SJung-uk Kim ErrorExit:
107044b0f624SJung-uk Kim
107144b0f624SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK &&
107244b0f624SJung-uk Kim WalkOneDefinitionBlock)
107344b0f624SJung-uk Kim {
107444b0f624SJung-uk Kim Op->Asl.Next = Restore;
107544b0f624SJung-uk Kim }
107644b0f624SJung-uk Kim return (Status);
107753289f6aSNate Lawson }
1078