xref: /freebsd/sys/contrib/dev/acpica/compiler/asltree.c (revision 58308fadece25ae4c12bd2f4dce3d73d9c23be43)
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